aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/ata/libata-core.c87
-rw-r--r--include/linux/libata.h2
2 files changed, 67 insertions, 22 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index 4af939a00e54..4753a1831dbc 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -64,6 +64,7 @@
64#include <linux/libata.h> 64#include <linux/libata.h>
65#include <asm/semaphore.h> 65#include <asm/semaphore.h>
66#include <asm/byteorder.h> 66#include <asm/byteorder.h>
67#include <linux/cdrom.h>
67 68
68#include "libata.h" 69#include "libata.h"
69 70
@@ -4652,6 +4653,43 @@ int ata_check_atapi_dma(struct ata_queued_cmd *qc)
4652} 4653}
4653 4654
4654/** 4655/**
4656 * atapi_qc_may_overflow - Check whether data transfer may overflow
4657 * @qc: ATA command in question
4658 *
4659 * ATAPI commands which transfer variable length data to host
4660 * might overflow due to application error or hardare bug. This
4661 * function checks whether overflow should be drained and ignored
4662 * for @qc.
4663 *
4664 * LOCKING:
4665 * None.
4666 *
4667 * RETURNS:
4668 * 1 if @qc may overflow; otherwise, 0.
4669 */
4670static int atapi_qc_may_overflow(struct ata_queued_cmd *qc)
4671{
4672 if (qc->tf.protocol != ATA_PROT_ATAPI &&
4673 qc->tf.protocol != ATA_PROT_ATAPI_DMA)
4674 return 0;
4675
4676 if (qc->tf.flags & ATA_TFLAG_WRITE)
4677 return 0;
4678
4679 switch (qc->cdb[0]) {
4680 case READ_10:
4681 case READ_12:
4682 case WRITE_10:
4683 case WRITE_12:
4684 case GPCMD_READ_CD:
4685 case GPCMD_READ_CD_MSF:
4686 return 0;
4687 }
4688
4689 return 1;
4690}
4691
4692/**
4655 * ata_std_qc_defer - Check whether a qc needs to be deferred 4693 * ata_std_qc_defer - Check whether a qc needs to be deferred
4656 * @qc: ATA command in question 4694 * @qc: ATA command in question
4657 * 4695 *
@@ -5139,23 +5177,19 @@ static void atapi_send_cdb(struct ata_port *ap, struct ata_queued_cmd *qc)
5139 * Inherited from caller. 5177 * Inherited from caller.
5140 * 5178 *
5141 */ 5179 */
5142 5180static int __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes)
5143static void __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes)
5144{ 5181{
5145 int do_write = (qc->tf.flags & ATA_TFLAG_WRITE); 5182 int do_write = (qc->tf.flags & ATA_TFLAG_WRITE);
5146 struct scatterlist *sg = qc->__sg;
5147 struct scatterlist *lsg = sg_last(qc->__sg, qc->n_elem);
5148 struct ata_port *ap = qc->ap; 5183 struct ata_port *ap = qc->ap;
5184 struct ata_eh_info *ehi = &qc->dev->link->eh_info;
5185 struct scatterlist *sg;
5149 struct page *page; 5186 struct page *page;
5150 unsigned char *buf; 5187 unsigned char *buf;
5151 unsigned int offset, count; 5188 unsigned int offset, count;
5152 int no_more_sg = 0;
5153
5154 if (qc->curbytes + bytes >= qc->nbytes)
5155 ap->hsm_task_state = HSM_ST_LAST;
5156 5189
5157next_sg: 5190next_sg:
5158 if (unlikely(no_more_sg)) { 5191 sg = qc->cursg;
5192 if (unlikely(!sg)) {
5159 /* 5193 /*
5160 * The end of qc->sg is reached and the device expects 5194 * The end of qc->sg is reached and the device expects
5161 * more data to transfer. In order not to overrun qc->sg 5195 * more data to transfer. In order not to overrun qc->sg
@@ -5164,21 +5198,28 @@ next_sg:
5164 * - for write case, padding zero data to the device 5198 * - for write case, padding zero data to the device
5165 */ 5199 */
5166 u16 pad_buf[1] = { 0 }; 5200 u16 pad_buf[1] = { 0 };
5167 unsigned int words = bytes >> 1;
5168 unsigned int i; 5201 unsigned int i;
5169 5202
5170 if (words) /* warning if bytes > 1 */ 5203 if (bytes > qc->curbytes - qc->nbytes + ATAPI_MAX_DRAIN) {
5171 ata_dev_printk(qc->dev, KERN_WARNING, 5204 ata_ehi_push_desc(ehi, "too much trailing data "
5172 "%u bytes trailing data\n", bytes); 5205 "buf=%u cur=%u bytes=%u",
5206 qc->nbytes, qc->curbytes, bytes);
5207 return -1;
5208 }
5209
5210 /* overflow is exptected for misc ATAPI commands */
5211 if (bytes && !atapi_qc_may_overflow(qc))
5212 ata_dev_printk(qc->dev, KERN_WARNING, "ATAPI %u bytes "
5213 "trailing data (cdb=%02x nbytes=%u)\n",
5214 bytes, qc->cdb[0], qc->nbytes);
5173 5215
5174 for (i = 0; i < words; i++) 5216 for (i = 0; i < (bytes + 1) / 2; i++)
5175 ap->ops->data_xfer(qc->dev, (unsigned char *)pad_buf, 2, do_write); 5217 ap->ops->data_xfer(qc->dev, (unsigned char *)pad_buf, 2, do_write);
5176 5218
5177 ap->hsm_task_state = HSM_ST_LAST; 5219 qc->curbytes += bytes;
5178 return;
5179 }
5180 5220
5181 sg = qc->cursg; 5221 return 0;
5222 }
5182 5223
5183 page = sg_page(sg); 5224 page = sg_page(sg);
5184 offset = sg->offset + qc->cursg_ofs; 5225 offset = sg->offset + qc->cursg_ofs;
@@ -5213,19 +5254,20 @@ next_sg:
5213 } 5254 }
5214 5255
5215 bytes -= count; 5256 bytes -= count;
5257 if ((count & 1) && bytes)
5258 bytes--;
5216 qc->curbytes += count; 5259 qc->curbytes += count;
5217 qc->cursg_ofs += count; 5260 qc->cursg_ofs += count;
5218 5261
5219 if (qc->cursg_ofs == sg->length) { 5262 if (qc->cursg_ofs == sg->length) {
5220 if (qc->cursg == lsg)
5221 no_more_sg = 1;
5222
5223 qc->cursg = sg_next(qc->cursg); 5263 qc->cursg = sg_next(qc->cursg);
5224 qc->cursg_ofs = 0; 5264 qc->cursg_ofs = 0;
5225 } 5265 }
5226 5266
5227 if (bytes) 5267 if (bytes)
5228 goto next_sg; 5268 goto next_sg;
5269
5270 return 0;
5229} 5271}
5230 5272
5231/** 5273/**
@@ -5268,7 +5310,8 @@ static void atapi_pio_bytes(struct ata_queued_cmd *qc)
5268 5310
5269 VPRINTK("ata%u: xfering %d bytes\n", ap->print_id, bytes); 5311 VPRINTK("ata%u: xfering %d bytes\n", ap->print_id, bytes);
5270 5312
5271 __atapi_pio_bytes(qc, bytes); 5313 if (__atapi_pio_bytes(qc, bytes))
5314 goto err_out;
5272 ata_altstatus(ap); /* flush */ 5315 ata_altstatus(ap); /* flush */
5273 5316
5274 return; 5317 return;
diff --git a/include/linux/libata.h b/include/linux/libata.h
index cb91280be9bd..124033cb5e9b 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -119,6 +119,8 @@ enum {
119 ATA_DEF_BUSY_WAIT = 10000, 119 ATA_DEF_BUSY_WAIT = 10000,
120 ATA_SHORT_PAUSE = (HZ >> 6) + 1, 120 ATA_SHORT_PAUSE = (HZ >> 6) + 1,
121 121
122 ATAPI_MAX_DRAIN = 16 << 10,
123
122 ATA_SHT_EMULATED = 1, 124 ATA_SHT_EMULATED = 1,
123 ATA_SHT_CMD_PER_LUN = 1, 125 ATA_SHT_CMD_PER_LUN = 1,
124 ATA_SHT_THIS_ID = -1, 126 ATA_SHT_THIS_ID = -1,