aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/aic7xxx
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/aic7xxx')
-rw-r--r--drivers/scsi/aic7xxx/aic79xx_osm.c51
-rw-r--r--drivers/scsi/aic7xxx/aic79xx_osm.h4
-rw-r--r--drivers/scsi/aic7xxx/aic7xxx_osm.c59
-rw-r--r--drivers/scsi/aic7xxx/aic7xxx_osm.h4
4 files changed, 27 insertions, 91 deletions
diff --git a/drivers/scsi/aic7xxx/aic79xx_osm.c b/drivers/scsi/aic7xxx/aic79xx_osm.c
index 6054881f21f1..286ab83116f9 100644
--- a/drivers/scsi/aic7xxx/aic79xx_osm.c
+++ b/drivers/scsi/aic7xxx/aic79xx_osm.c
@@ -376,21 +376,10 @@ static __inline void
376ahd_linux_unmap_scb(struct ahd_softc *ahd, struct scb *scb) 376ahd_linux_unmap_scb(struct ahd_softc *ahd, struct scb *scb)
377{ 377{
378 struct scsi_cmnd *cmd; 378 struct scsi_cmnd *cmd;
379 int direction;
380 379
381 cmd = scb->io_ctx; 380 cmd = scb->io_ctx;
382 direction = cmd->sc_data_direction;
383 ahd_sync_sglist(ahd, scb, BUS_DMASYNC_POSTWRITE); 381 ahd_sync_sglist(ahd, scb, BUS_DMASYNC_POSTWRITE);
384 if (cmd->use_sg != 0) { 382 scsi_dma_unmap(cmd);
385 struct scatterlist *sg;
386
387 sg = (struct scatterlist *)cmd->request_buffer;
388 pci_unmap_sg(ahd->dev_softc, sg, cmd->use_sg, direction);
389 } else if (cmd->request_bufflen != 0) {
390 pci_unmap_single(ahd->dev_softc,
391 scb->platform_data->buf_busaddr,
392 cmd->request_bufflen, direction);
393 }
394} 383}
395 384
396/******************************** Macros **************************************/ 385/******************************** Macros **************************************/
@@ -1422,6 +1411,7 @@ ahd_linux_run_command(struct ahd_softc *ahd, struct ahd_linux_device *dev,
1422 u_int col_idx; 1411 u_int col_idx;
1423 uint16_t mask; 1412 uint16_t mask;
1424 unsigned long flags; 1413 unsigned long flags;
1414 int nseg;
1425 1415
1426 ahd_lock(ahd, &flags); 1416 ahd_lock(ahd, &flags);
1427 1417
@@ -1494,18 +1484,17 @@ ahd_linux_run_command(struct ahd_softc *ahd, struct ahd_linux_device *dev,
1494 ahd_set_residual(scb, 0); 1484 ahd_set_residual(scb, 0);
1495 ahd_set_sense_residual(scb, 0); 1485 ahd_set_sense_residual(scb, 0);
1496 scb->sg_count = 0; 1486 scb->sg_count = 0;
1497 if (cmd->use_sg != 0) { 1487
1498 void *sg; 1488 nseg = scsi_dma_map(cmd);
1499 struct scatterlist *cur_seg; 1489 BUG_ON(nseg < 0);
1500 u_int nseg; 1490 if (nseg > 0) {
1501 int dir; 1491 void *sg = scb->sg_list;
1502 1492 struct scatterlist *cur_seg;
1503 cur_seg = (struct scatterlist *)cmd->request_buffer; 1493 int i;
1504 dir = cmd->sc_data_direction; 1494
1505 nseg = pci_map_sg(ahd->dev_softc, cur_seg,
1506 cmd->use_sg, dir);
1507 scb->platform_data->xfer_len = 0; 1495 scb->platform_data->xfer_len = 0;
1508 for (sg = scb->sg_list; nseg > 0; nseg--, cur_seg++) { 1496
1497 scsi_for_each_sg(cmd, cur_seg, nseg, i) {
1509 dma_addr_t addr; 1498 dma_addr_t addr;
1510 bus_size_t len; 1499 bus_size_t len;
1511 1500
@@ -1513,22 +1502,8 @@ ahd_linux_run_command(struct ahd_softc *ahd, struct ahd_linux_device *dev,
1513 len = sg_dma_len(cur_seg); 1502 len = sg_dma_len(cur_seg);
1514 scb->platform_data->xfer_len += len; 1503 scb->platform_data->xfer_len += len;
1515 sg = ahd_sg_setup(ahd, scb, sg, addr, len, 1504 sg = ahd_sg_setup(ahd, scb, sg, addr, len,
1516 /*last*/nseg == 1); 1505 i == (nseg - 1));
1517 } 1506 }
1518 } else if (cmd->request_bufflen != 0) {
1519 void *sg;
1520 dma_addr_t addr;
1521 int dir;
1522
1523 sg = scb->sg_list;
1524 dir = cmd->sc_data_direction;
1525 addr = pci_map_single(ahd->dev_softc,
1526 cmd->request_buffer,
1527 cmd->request_bufflen, dir);
1528 scb->platform_data->xfer_len = cmd->request_bufflen;
1529 scb->platform_data->buf_busaddr = addr;
1530 sg = ahd_sg_setup(ahd, scb, sg, addr,
1531 cmd->request_bufflen, /*last*/TRUE);
1532 } 1507 }
1533 1508
1534 LIST_INSERT_HEAD(&ahd->pending_scbs, scb, pending_links); 1509 LIST_INSERT_HEAD(&ahd->pending_scbs, scb, pending_links);
diff --git a/drivers/scsi/aic7xxx/aic79xx_osm.h b/drivers/scsi/aic7xxx/aic79xx_osm.h
index ad9761b237dc..853998be1474 100644
--- a/drivers/scsi/aic7xxx/aic79xx_osm.h
+++ b/drivers/scsi/aic7xxx/aic79xx_osm.h
@@ -781,7 +781,7 @@ int ahd_get_transfer_dir(struct scb *scb)
781static __inline 781static __inline
782void ahd_set_residual(struct scb *scb, u_long resid) 782void ahd_set_residual(struct scb *scb, u_long resid)
783{ 783{
784 scb->io_ctx->resid = resid; 784 scsi_set_resid(scb->io_ctx, resid);
785} 785}
786 786
787static __inline 787static __inline
@@ -793,7 +793,7 @@ void ahd_set_sense_residual(struct scb *scb, u_long resid)
793static __inline 793static __inline
794u_long ahd_get_residual(struct scb *scb) 794u_long ahd_get_residual(struct scb *scb)
795{ 795{
796 return (scb->io_ctx->resid); 796 return scsi_get_resid(scb->io_ctx);
797} 797}
798 798
799static __inline 799static __inline
diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm.c b/drivers/scsi/aic7xxx/aic7xxx_osm.c
index 660f26e23a38..1803ab6fc21c 100644
--- a/drivers/scsi/aic7xxx/aic7xxx_osm.c
+++ b/drivers/scsi/aic7xxx/aic7xxx_osm.c
@@ -402,18 +402,8 @@ ahc_linux_unmap_scb(struct ahc_softc *ahc, struct scb *scb)
402 402
403 cmd = scb->io_ctx; 403 cmd = scb->io_ctx;
404 ahc_sync_sglist(ahc, scb, BUS_DMASYNC_POSTWRITE); 404 ahc_sync_sglist(ahc, scb, BUS_DMASYNC_POSTWRITE);
405 if (cmd->use_sg != 0) { 405
406 struct scatterlist *sg; 406 scsi_dma_unmap(cmd);
407
408 sg = (struct scatterlist *)cmd->request_buffer;
409 pci_unmap_sg(ahc->dev_softc, sg, cmd->use_sg,
410 cmd->sc_data_direction);
411 } else if (cmd->request_bufflen != 0) {
412 pci_unmap_single(ahc->dev_softc,
413 scb->platform_data->buf_busaddr,
414 cmd->request_bufflen,
415 cmd->sc_data_direction);
416 }
417} 407}
418 408
419static __inline int 409static __inline int
@@ -1381,6 +1371,7 @@ ahc_linux_run_command(struct ahc_softc *ahc, struct ahc_linux_device *dev,
1381 struct ahc_tmode_tstate *tstate; 1371 struct ahc_tmode_tstate *tstate;
1382 uint16_t mask; 1372 uint16_t mask;
1383 struct scb_tailq *untagged_q = NULL; 1373 struct scb_tailq *untagged_q = NULL;
1374 int nseg;
1384 1375
1385 /* 1376 /*
1386 * Schedule us to run later. The only reason we are not 1377 * Schedule us to run later. The only reason we are not
@@ -1472,23 +1463,21 @@ ahc_linux_run_command(struct ahc_softc *ahc, struct ahc_linux_device *dev,
1472 ahc_set_residual(scb, 0); 1463 ahc_set_residual(scb, 0);
1473 ahc_set_sense_residual(scb, 0); 1464 ahc_set_sense_residual(scb, 0);
1474 scb->sg_count = 0; 1465 scb->sg_count = 0;
1475 if (cmd->use_sg != 0) { 1466
1467 nseg = scsi_dma_map(cmd);
1468 BUG_ON(nseg < 0);
1469 if (nseg > 0) {
1476 struct ahc_dma_seg *sg; 1470 struct ahc_dma_seg *sg;
1477 struct scatterlist *cur_seg; 1471 struct scatterlist *cur_seg;
1478 struct scatterlist *end_seg; 1472 int i;
1479 int nseg;
1480 1473
1481 cur_seg = (struct scatterlist *)cmd->request_buffer;
1482 nseg = pci_map_sg(ahc->dev_softc, cur_seg, cmd->use_sg,
1483 cmd->sc_data_direction);
1484 end_seg = cur_seg + nseg;
1485 /* Copy the segments into the SG list. */ 1474 /* Copy the segments into the SG list. */
1486 sg = scb->sg_list; 1475 sg = scb->sg_list;
1487 /* 1476 /*
1488 * The sg_count may be larger than nseg if 1477 * The sg_count may be larger than nseg if
1489 * a transfer crosses a 32bit page. 1478 * a transfer crosses a 32bit page.
1490 */ 1479 */
1491 while (cur_seg < end_seg) { 1480 scsi_for_each_sg(cmd, cur_seg, nseg, i) {
1492 dma_addr_t addr; 1481 dma_addr_t addr;
1493 bus_size_t len; 1482 bus_size_t len;
1494 int consumed; 1483 int consumed;
@@ -1499,7 +1488,6 @@ ahc_linux_run_command(struct ahc_softc *ahc, struct ahc_linux_device *dev,
1499 sg, addr, len); 1488 sg, addr, len);
1500 sg += consumed; 1489 sg += consumed;
1501 scb->sg_count += consumed; 1490 scb->sg_count += consumed;
1502 cur_seg++;
1503 } 1491 }
1504 sg--; 1492 sg--;
1505 sg->len |= ahc_htole32(AHC_DMA_LAST_SEG); 1493 sg->len |= ahc_htole32(AHC_DMA_LAST_SEG);
@@ -1516,33 +1504,6 @@ ahc_linux_run_command(struct ahc_softc *ahc, struct ahc_linux_device *dev,
1516 */ 1504 */
1517 scb->hscb->dataptr = scb->sg_list->addr; 1505 scb->hscb->dataptr = scb->sg_list->addr;
1518 scb->hscb->datacnt = scb->sg_list->len; 1506 scb->hscb->datacnt = scb->sg_list->len;
1519 } else if (cmd->request_bufflen != 0) {
1520 struct ahc_dma_seg *sg;
1521 dma_addr_t addr;
1522
1523 sg = scb->sg_list;
1524 addr = pci_map_single(ahc->dev_softc,
1525 cmd->request_buffer,
1526 cmd->request_bufflen,
1527 cmd->sc_data_direction);
1528 scb->platform_data->buf_busaddr = addr;
1529 scb->sg_count = ahc_linux_map_seg(ahc, scb,
1530 sg, addr,
1531 cmd->request_bufflen);
1532 sg->len |= ahc_htole32(AHC_DMA_LAST_SEG);
1533
1534 /*
1535 * Reset the sg list pointer.
1536 */
1537 scb->hscb->sgptr =
1538 ahc_htole32(scb->sg_list_phys | SG_FULL_RESID);
1539
1540 /*
1541 * Copy the first SG into the "current"
1542 * data pointer area.
1543 */
1544 scb->hscb->dataptr = sg->addr;
1545 scb->hscb->datacnt = sg->len;
1546 } else { 1507 } else {
1547 scb->hscb->sgptr = ahc_htole32(SG_LIST_NULL); 1508 scb->hscb->sgptr = ahc_htole32(SG_LIST_NULL);
1548 scb->hscb->dataptr = 0; 1509 scb->hscb->dataptr = 0;
diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm.h b/drivers/scsi/aic7xxx/aic7xxx_osm.h
index 8fee7edc6eb3..b48dab447bde 100644
--- a/drivers/scsi/aic7xxx/aic7xxx_osm.h
+++ b/drivers/scsi/aic7xxx/aic7xxx_osm.h
@@ -751,7 +751,7 @@ int ahc_get_transfer_dir(struct scb *scb)
751static __inline 751static __inline
752void ahc_set_residual(struct scb *scb, u_long resid) 752void ahc_set_residual(struct scb *scb, u_long resid)
753{ 753{
754 scb->io_ctx->resid = resid; 754 scsi_set_resid(scb->io_ctx, resid);
755} 755}
756 756
757static __inline 757static __inline
@@ -763,7 +763,7 @@ void ahc_set_sense_residual(struct scb *scb, u_long resid)
763static __inline 763static __inline
764u_long ahc_get_residual(struct scb *scb) 764u_long ahc_get_residual(struct scb *scb)
765{ 765{
766 return (scb->io_ctx->resid); 766 return scsi_get_resid(scb->io_ctx);
767} 767}
768 768
769static __inline 769static __inline