|
@@ -146,6 +146,14 @@ struct nvme_nvm_command {
|
|
|
};
|
|
|
};
|
|
|
|
|
|
+struct nvme_nvm_completion {
|
|
|
+ __le64 result; /* Used by LightNVM to return ppa completions */
|
|
|
+ __le16 sq_head; /* how much of this queue may be reclaimed */
|
|
|
+ __le16 sq_id; /* submission queue that generated this entry */
|
|
|
+ __u16 command_id; /* of the command which completed */
|
|
|
+ __le16 status; /* did the command fail, and if so, why? */
|
|
|
+};
|
|
|
+
|
|
|
#define NVME_NVM_LP_MLC_PAIRS 886
|
|
|
struct nvme_nvm_lp_mlc {
|
|
|
__u16 num_pairs;
|
|
@@ -507,6 +515,10 @@ static inline void nvme_nvm_rqtocmd(struct request *rq, struct nvm_rq *rqd,
|
|
|
static void nvme_nvm_end_io(struct request *rq, int error)
|
|
|
{
|
|
|
struct nvm_rq *rqd = rq->end_io_data;
|
|
|
+ struct nvme_nvm_completion *cqe = rq->special;
|
|
|
+
|
|
|
+ if (cqe)
|
|
|
+ rqd->ppa_status = le64_to_cpu(cqe->result);
|
|
|
|
|
|
nvm_end_io(rqd, error);
|
|
|
|
|
@@ -526,7 +538,8 @@ static int nvme_nvm_submit_io(struct nvm_dev *dev, struct nvm_rq *rqd)
|
|
|
if (IS_ERR(rq))
|
|
|
return -ENOMEM;
|
|
|
|
|
|
- cmd = kzalloc(sizeof(struct nvme_nvm_command), GFP_KERNEL);
|
|
|
+ cmd = kzalloc(sizeof(struct nvme_nvm_command) +
|
|
|
+ sizeof(struct nvme_nvm_completion), GFP_KERNEL);
|
|
|
if (!cmd) {
|
|
|
blk_mq_free_request(rq);
|
|
|
return -ENOMEM;
|
|
@@ -545,7 +558,7 @@ static int nvme_nvm_submit_io(struct nvm_dev *dev, struct nvm_rq *rqd)
|
|
|
|
|
|
rq->cmd = (unsigned char *)cmd;
|
|
|
rq->cmd_len = sizeof(struct nvme_nvm_command);
|
|
|
- rq->special = (void *)0;
|
|
|
+ rq->special = cmd + 1;
|
|
|
|
|
|
rq->end_io_data = rqd;
|
|
|
|