diff options
Diffstat (limited to 'drivers/ata')
-rw-r--r-- | drivers/ata/sata_nv.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c index 367027bc4cd7..067352da2c2d 100644 --- a/drivers/ata/sata_nv.c +++ b/drivers/ata/sata_nv.c | |||
@@ -1164,11 +1164,7 @@ static void nv_adma_fill_aprd(struct ata_queued_cmd *qc, | |||
1164 | int idx, | 1164 | int idx, |
1165 | struct nv_adma_prd *aprd) | 1165 | struct nv_adma_prd *aprd) |
1166 | { | 1166 | { |
1167 | u8 flags; | 1167 | u8 flags = 0; |
1168 | |||
1169 | memset(aprd, 0, sizeof(struct nv_adma_prd)); | ||
1170 | |||
1171 | flags = 0; | ||
1172 | if (qc->tf.flags & ATA_TFLAG_WRITE) | 1168 | if (qc->tf.flags & ATA_TFLAG_WRITE) |
1173 | flags |= NV_APRD_WRITE; | 1169 | flags |= NV_APRD_WRITE; |
1174 | if (idx == qc->n_elem - 1) | 1170 | if (idx == qc->n_elem - 1) |
@@ -1179,6 +1175,7 @@ static void nv_adma_fill_aprd(struct ata_queued_cmd *qc, | |||
1179 | aprd->addr = cpu_to_le64(((u64)sg_dma_address(sg))); | 1175 | aprd->addr = cpu_to_le64(((u64)sg_dma_address(sg))); |
1180 | aprd->len = cpu_to_le32(((u32)sg_dma_len(sg))); /* len in bytes */ | 1176 | aprd->len = cpu_to_le32(((u32)sg_dma_len(sg))); /* len in bytes */ |
1181 | aprd->flags = flags; | 1177 | aprd->flags = flags; |
1178 | aprd->packet_len = 0; | ||
1182 | } | 1179 | } |
1183 | 1180 | ||
1184 | static void nv_adma_fill_sg(struct ata_queued_cmd *qc, struct nv_adma_cpb *cpb) | 1181 | static void nv_adma_fill_sg(struct ata_queued_cmd *qc, struct nv_adma_cpb *cpb) |
@@ -1199,6 +1196,8 @@ static void nv_adma_fill_sg(struct ata_queued_cmd *qc, struct nv_adma_cpb *cpb) | |||
1199 | } | 1196 | } |
1200 | if (idx > 5) | 1197 | if (idx > 5) |
1201 | cpb->next_aprd = cpu_to_le64(((u64)(pp->aprd_dma + NV_ADMA_SGTBL_SZ * qc->tag))); | 1198 | cpb->next_aprd = cpu_to_le64(((u64)(pp->aprd_dma + NV_ADMA_SGTBL_SZ * qc->tag))); |
1199 | else | ||
1200 | cpb->next_aprd = cpu_to_le64(0); | ||
1202 | } | 1201 | } |
1203 | 1202 | ||
1204 | static int nv_adma_use_reg_mode(struct ata_queued_cmd *qc) | 1203 | static int nv_adma_use_reg_mode(struct ata_queued_cmd *qc) |
@@ -1231,7 +1230,10 @@ static void nv_adma_qc_prep(struct ata_queued_cmd *qc) | |||
1231 | return; | 1230 | return; |
1232 | } | 1231 | } |
1233 | 1232 | ||
1234 | memset(cpb, 0, sizeof(struct nv_adma_cpb)); | 1233 | cpb->resp_flags = NV_CPB_RESP_DONE; |
1234 | wmb(); | ||
1235 | cpb->ctl_flags = 0; | ||
1236 | wmb(); | ||
1235 | 1237 | ||
1236 | cpb->len = 3; | 1238 | cpb->len = 3; |
1237 | cpb->tag = qc->tag; | 1239 | cpb->tag = qc->tag; |
@@ -1255,6 +1257,8 @@ static void nv_adma_qc_prep(struct ata_queued_cmd *qc) | |||
1255 | finished filling in all of the contents */ | 1257 | finished filling in all of the contents */ |
1256 | wmb(); | 1258 | wmb(); |
1257 | cpb->ctl_flags = ctl_flags; | 1259 | cpb->ctl_flags = ctl_flags; |
1260 | wmb(); | ||
1261 | cpb->resp_flags = 0; | ||
1258 | } | 1262 | } |
1259 | 1263 | ||
1260 | static unsigned int nv_adma_qc_issue(struct ata_queued_cmd *qc) | 1264 | static unsigned int nv_adma_qc_issue(struct ata_queued_cmd *qc) |