aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/pdc_adma.c
diff options
context:
space:
mode:
authorJeff Garzik <jeff@garzik.org>2007-10-18 16:21:18 -0400
committerJeff Garzik <jeff@garzik.org>2007-10-18 16:21:18 -0400
commit3be6cbd73f74b4a3da82cc7d6e1688a4ae595fc7 (patch)
treea077cf70d1cd438db34f5def23dd8f72f42b5a8c /drivers/ata/pdc_adma.c
parent858c9c406688bc7244986b5836265071edfd1d3f (diff)
[libata] kill ata_sg_is_last()
Short term, this works around a bug introduced by early sg-chaining work. Long term, removing this function eliminates a branch from a hot path loop in each scatter/gather table build. Also, as this code demonstrates, we don't need to _track_ the end of the s/g list, as long as we mark it in some way. And doing so programatically is nice. So its a useful cleanup, regardless of its short term effects. Based conceptually on a quick patch by Jens Axboe. Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'drivers/ata/pdc_adma.c')
-rw-r--r--drivers/ata/pdc_adma.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/ata/pdc_adma.c b/drivers/ata/pdc_adma.c
index 8d1b03d5bcb1..199f7e150eb3 100644
--- a/drivers/ata/pdc_adma.c
+++ b/drivers/ata/pdc_adma.c
@@ -318,7 +318,7 @@ static int adma_fill_sg(struct ata_queued_cmd *qc)
318 struct scatterlist *sg; 318 struct scatterlist *sg;
319 struct ata_port *ap = qc->ap; 319 struct ata_port *ap = qc->ap;
320 struct adma_port_priv *pp = ap->private_data; 320 struct adma_port_priv *pp = ap->private_data;
321 u8 *buf = pp->pkt; 321 u8 *buf = pp->pkt, *last_buf = NULL;
322 int i = (2 + buf[3]) * 8; 322 int i = (2 + buf[3]) * 8;
323 u8 pFLAGS = pORD | ((qc->tf.flags & ATA_TFLAG_WRITE) ? pDIRO : 0); 323 u8 pFLAGS = pORD | ((qc->tf.flags & ATA_TFLAG_WRITE) ? pDIRO : 0);
324 324
@@ -334,8 +334,7 @@ static int adma_fill_sg(struct ata_queued_cmd *qc)
334 *(__le32 *)(buf + i) = cpu_to_le32(len); 334 *(__le32 *)(buf + i) = cpu_to_le32(len);
335 i += 4; 335 i += 4;
336 336
337 if (ata_sg_is_last(sg, qc)) 337 last_buf = &buf[i];
338 pFLAGS |= pEND;
339 buf[i++] = pFLAGS; 338 buf[i++] = pFLAGS;
340 buf[i++] = qc->dev->dma_mode & 0xf; 339 buf[i++] = qc->dev->dma_mode & 0xf;
341 buf[i++] = 0; /* pPKLW */ 340 buf[i++] = 0; /* pPKLW */
@@ -348,6 +347,10 @@ static int adma_fill_sg(struct ata_queued_cmd *qc)
348 VPRINTK("PRD[%u] = (0x%lX, 0x%X)\n", i/4, 347 VPRINTK("PRD[%u] = (0x%lX, 0x%X)\n", i/4,
349 (unsigned long)addr, len); 348 (unsigned long)addr, len);
350 } 349 }
350
351 if (likely(last_buf))
352 *last_buf |= pEND;
353
351 return i; 354 return i;
352} 355}
353 356