aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/linux/libata.h42
1 files changed, 8 insertions, 34 deletions
diff --git a/include/linux/libata.h b/include/linux/libata.h
index acd90ad78417..162f8b5509ac 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -458,7 +458,7 @@ struct ata_queued_cmd {
458 unsigned int tag; 458 unsigned int tag;
459 unsigned int n_elem; 459 unsigned int n_elem;
460 unsigned int n_iter; 460 unsigned int n_iter;
461 unsigned int orig_n_elem; 461 unsigned int mapped_n_elem;
462 462
463 int dma_dir; 463 int dma_dir;
464 464
@@ -471,11 +471,12 @@ struct ata_queued_cmd {
471 struct scatterlist *cursg; 471 struct scatterlist *cursg;
472 unsigned int cursg_ofs; 472 unsigned int cursg_ofs;
473 473
474 struct scatterlist *last_sg;
475 struct scatterlist saved_last_sg;
474 struct scatterlist sgent; 476 struct scatterlist sgent;
475 struct scatterlist pad_sgent; 477 struct scatterlist extra_sg[2];
476 478
477 /* DO NOT iterate over __sg manually, use ata_for_each_sg() */ 479 struct scatterlist *sg;
478 struct scatterlist *__sg;
479 480
480 unsigned int err_mask; 481 unsigned int err_mask;
481 struct ata_taskfile result_tf; 482 struct ata_taskfile result_tf;
@@ -1123,35 +1124,6 @@ extern void ata_port_pbar_desc(struct ata_port *ap, int bar, ssize_t offset,
1123 const char *name); 1124 const char *name);
1124#endif 1125#endif
1125 1126
1126/*
1127 * qc helpers
1128 */
1129static inline struct scatterlist *
1130ata_qc_first_sg(struct ata_queued_cmd *qc)
1131{
1132 qc->n_iter = 0;
1133 if (qc->n_elem)
1134 return qc->__sg;
1135 if (qc->pad_len)
1136 return &qc->pad_sgent;
1137 return NULL;
1138}
1139
1140static inline struct scatterlist *
1141ata_qc_next_sg(struct scatterlist *sg, struct ata_queued_cmd *qc)
1142{
1143 if (sg == &qc->pad_sgent)
1144 return NULL;
1145 if (++qc->n_iter < qc->n_elem)
1146 return sg_next(sg);
1147 if (qc->pad_len)
1148 return &qc->pad_sgent;
1149 return NULL;
1150}
1151
1152#define ata_for_each_sg(sg, qc) \
1153 for (sg = ata_qc_first_sg(qc); sg; sg = ata_qc_next_sg(sg, qc))
1154
1155static inline unsigned int ata_tag_valid(unsigned int tag) 1127static inline unsigned int ata_tag_valid(unsigned int tag)
1156{ 1128{
1157 return (tag < ATA_MAX_QUEUE) ? 1 : 0; 1129 return (tag < ATA_MAX_QUEUE) ? 1 : 0;
@@ -1386,15 +1358,17 @@ static inline void ata_tf_init(struct ata_device *dev, struct ata_taskfile *tf)
1386static inline void ata_qc_reinit(struct ata_queued_cmd *qc) 1358static inline void ata_qc_reinit(struct ata_queued_cmd *qc)
1387{ 1359{
1388 qc->dma_dir = DMA_NONE; 1360 qc->dma_dir = DMA_NONE;
1389 qc->__sg = NULL; 1361 qc->sg = NULL;
1390 qc->flags = 0; 1362 qc->flags = 0;
1391 qc->cursg = NULL; 1363 qc->cursg = NULL;
1392 qc->cursg_ofs = 0; 1364 qc->cursg_ofs = 0;
1393 qc->nbytes = qc->curbytes = 0; 1365 qc->nbytes = qc->curbytes = 0;
1394 qc->n_elem = 0; 1366 qc->n_elem = 0;
1367 qc->mapped_n_elem = 0;
1395 qc->n_iter = 0; 1368 qc->n_iter = 0;
1396 qc->err_mask = 0; 1369 qc->err_mask = 0;
1397 qc->pad_len = 0; 1370 qc->pad_len = 0;
1371 qc->last_sg = NULL;
1398 qc->sect_size = ATA_SECT_SIZE; 1372 qc->sect_size = ATA_SECT_SIZE;
1399 1373
1400 ata_tf_init(qc->dev, &qc->tf); 1374 ata_tf_init(qc->dev, &qc->tf);