]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/nvme/host/core.c
Merge branch 'for-4.11/block' into for-4.11/linus-merge
[karo-tx-linux.git] / drivers / nvme / host / core.c
index 8a3c3e32a704b3e359a78ed06e95c6e977f322bc..138c6fa00cd52e77aac11b00a45ef7e8d89e700b 100644 (file)
@@ -784,6 +784,13 @@ static int nvme_ioctl(struct block_device *bdev, fmode_t mode,
                return nvme_sg_io(ns, (void __user *)arg);
 #endif
        default:
+#ifdef CONFIG_NVM
+               if (ns->ndev)
+                       return nvme_nvm_ioctl(ns, cmd, arg);
+#endif
+               if (is_sed_ioctl(cmd))
+                       return sed_ioctl(ns->ctrl->opal_dev, cmd,
+                                        (void __user *) arg);
                return -ENOTTY;
        }
 }
@@ -1051,6 +1058,28 @@ static const struct pr_ops nvme_pr_ops = {
        .pr_clear       = nvme_pr_clear,
 };
 
+#ifdef CONFIG_BLK_SED_OPAL
+int nvme_sec_submit(void *data, u16 spsp, u8 secp, void *buffer, size_t len,
+               bool send)
+{
+       struct nvme_ctrl *ctrl = data;
+       struct nvme_command cmd;
+
+       memset(&cmd, 0, sizeof(cmd));
+       if (send)
+               cmd.common.opcode = nvme_admin_security_send;
+       else
+               cmd.common.opcode = nvme_admin_security_recv;
+       cmd.common.nsid = 0;
+       cmd.common.cdw10[0] = cpu_to_le32(((u32)secp) << 24 | ((u32)spsp) << 8);
+       cmd.common.cdw10[1] = cpu_to_le32(len);
+
+       return __nvme_submit_sync_cmd(ctrl->admin_q, &cmd, NULL, buffer, len,
+                                     ADMIN_TIMEOUT, NVME_QID_ANY, 1, 0);
+}
+EXPORT_SYMBOL_GPL(nvme_sec_submit);
+#endif /* CONFIG_BLK_SED_OPAL */
+
 static const struct block_device_operations nvme_fops = {
        .owner          = THIS_MODULE,
        .ioctl          = nvme_ioctl,
@@ -1230,6 +1259,7 @@ int nvme_init_identify(struct nvme_ctrl *ctrl)
                return -EIO;
        }
 
+       ctrl->oacs = le16_to_cpu(id->oacs);
        ctrl->vid = le16_to_cpu(id->vid);
        ctrl->oncs = le16_to_cpup(&id->oncs);
        atomic_set(&ctrl->abort_limit, id->acl + 1);