aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2010-05-10 15:41:42 -0400
committerJeff Garzik <jgarzik@redhat.com>2010-05-19 13:38:55 -0400
commit360ff7833098e944e5003618b03894251e937802 (patch)
treeaaa8c8f771cf35b2a0dab58ea6bad35d88f4ac8a
parentf60d70113fa04e32aee2dedbf304a48469c9c45c (diff)
libata-sff: separate out BMDMA qc_issue
Separate out ata_bmdma_qc_issue() from ata_sff_qc_issue() such that ata_sff_qc_issue() only deals with non-BMDMA SFF protocols (PIO and nodata) while ata_bmdma_qc_issue() deals with the BMDMA protocols and uses ata_sff_qc_issue() for non-DMA commands. All the users are updated accordingly. Signed-off-by: Tejun Heo <tj@kernel.org> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
-rw-r--r--drivers/ata/libata-sff.c112
-rw-r--r--drivers/ata/pata_acpi.c4
-rw-r--r--drivers/ata/pata_cs5530.c2
-rw-r--r--drivers/ata/pata_hpt3x2n.c2
-rw-r--r--drivers/ata/pata_it821x.c4
-rw-r--r--drivers/ata/pata_oldpiix.c2
-rw-r--r--drivers/ata/pata_radisys.c2
-rw-r--r--drivers/ata/pata_sc1200.c2
-rw-r--r--drivers/ata/sata_mv.c2
-rw-r--r--drivers/ata/sata_nv.c4
-rw-r--r--include/linux/libata.h1
11 files changed, 80 insertions, 57 deletions
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
index 6f52b598b8d2..19ddf924944f 100644
--- a/drivers/ata/libata-sff.c
+++ b/drivers/ata/libata-sff.c
@@ -1379,15 +1379,11 @@ fsm_start:
1379} 1379}
1380 1380
1381/** 1381/**
1382 * ata_sff_qc_issue - issue taskfile to device in proto-dependent manner 1382 * ata_sff_qc_issue - issue taskfile to a SFF controller
1383 * @qc: command to issue to device 1383 * @qc: command to issue to device
1384 * 1384 *
1385 * Using various libata functions and hooks, this function 1385 * This function issues a PIO or NODATA command to a SFF
1386 * starts an ATA command. ATA commands are grouped into 1386 * controller.
1387 * classes called "protocols", and issuing each type of protocol
1388 * is slightly different.
1389 *
1390 * May be used as the qc_issue() entry in ata_port_operations.
1391 * 1387 *
1392 * LOCKING: 1388 * LOCKING:
1393 * spin_lock_irqsave(host lock) 1389 * spin_lock_irqsave(host lock)
@@ -1402,23 +1398,8 @@ unsigned int ata_sff_qc_issue(struct ata_queued_cmd *qc)
1402 /* Use polling pio if the LLD doesn't handle 1398 /* Use polling pio if the LLD doesn't handle
1403 * interrupt driven pio and atapi CDB interrupt. 1399 * interrupt driven pio and atapi CDB interrupt.
1404 */ 1400 */
1405 if (ap->flags & ATA_FLAG_PIO_POLLING) { 1401 if (ap->flags & ATA_FLAG_PIO_POLLING)
1406 switch (qc->tf.protocol) { 1402 qc->tf.flags |= ATA_TFLAG_POLLING;
1407 case ATA_PROT_PIO:
1408 case ATA_PROT_NODATA:
1409 case ATAPI_PROT_PIO:
1410 case ATAPI_PROT_NODATA:
1411 qc->tf.flags |= ATA_TFLAG_POLLING;
1412 break;
1413 case ATAPI_PROT_DMA:
1414 if (qc->dev->flags & ATA_DFLAG_CDB_INTR)
1415 /* see ata_dma_blacklisted() */
1416 BUG();
1417 break;
1418 default:
1419 break;
1420 }
1421 }
1422 1403
1423 /* select the device */ 1404 /* select the device */
1424 ata_dev_select(ap, qc->dev->devno, 1, 0); 1405 ata_dev_select(ap, qc->dev->devno, 1, 0);
@@ -1437,15 +1418,6 @@ unsigned int ata_sff_qc_issue(struct ata_queued_cmd *qc)
1437 1418
1438 break; 1419 break;
1439 1420
1440 case ATA_PROT_DMA:
1441 WARN_ON_ONCE(qc->tf.flags & ATA_TFLAG_POLLING);
1442
1443 ap->ops->sff_tf_load(ap, &qc->tf); /* load tf registers */
1444 ap->ops->bmdma_setup(qc); /* set up bmdma */
1445 ap->ops->bmdma_start(qc); /* initiate bmdma */
1446 ap->hsm_task_state = HSM_ST_LAST;
1447 break;
1448
1449 case ATA_PROT_PIO: 1421 case ATA_PROT_PIO:
1450 if (qc->tf.flags & ATA_TFLAG_POLLING) 1422 if (qc->tf.flags & ATA_TFLAG_POLLING)
1451 ata_qc_set_polling(qc); 1423 ata_qc_set_polling(qc);
@@ -1490,18 +1462,6 @@ unsigned int ata_sff_qc_issue(struct ata_queued_cmd *qc)
1490 ata_sff_queue_pio_task(ap, 0); 1462 ata_sff_queue_pio_task(ap, 0);
1491 break; 1463 break;
1492 1464
1493 case ATAPI_PROT_DMA:
1494 WARN_ON_ONCE(qc->tf.flags & ATA_TFLAG_POLLING);
1495
1496 ap->ops->sff_tf_load(ap, &qc->tf); /* load tf registers */
1497 ap->ops->bmdma_setup(qc); /* set up bmdma */
1498 ap->hsm_task_state = HSM_ST_FIRST;
1499
1500 /* send cdb by polling if no cdb interrupt */
1501 if (!(qc->dev->flags & ATA_DFLAG_CDB_INTR))
1502 ata_sff_queue_pio_task(ap, 0);
1503 break;
1504
1505 default: 1465 default:
1506 WARN_ON_ONCE(1); 1466 WARN_ON_ONCE(1);
1507 return AC_ERR_SYSTEM; 1467 return AC_ERR_SYSTEM;
@@ -2618,6 +2578,7 @@ const struct ata_port_operations ata_bmdma_port_ops = {
2618 .post_internal_cmd = ata_bmdma_post_internal_cmd, 2578 .post_internal_cmd = ata_bmdma_post_internal_cmd,
2619 2579
2620 .qc_prep = ata_bmdma_qc_prep, 2580 .qc_prep = ata_bmdma_qc_prep,
2581 .qc_issue = ata_bmdma_qc_issue,
2621 2582
2622 .bmdma_setup = ata_bmdma_setup, 2583 .bmdma_setup = ata_bmdma_setup,
2623 .bmdma_start = ata_bmdma_start, 2584 .bmdma_start = ata_bmdma_start,
@@ -2782,6 +2743,67 @@ void ata_bmdma_dumb_qc_prep(struct ata_queued_cmd *qc)
2782EXPORT_SYMBOL_GPL(ata_bmdma_dumb_qc_prep); 2743EXPORT_SYMBOL_GPL(ata_bmdma_dumb_qc_prep);
2783 2744
2784/** 2745/**
2746 * ata_bmdma_qc_issue - issue taskfile to a BMDMA controller
2747 * @qc: command to issue to device
2748 *
2749 * This function issues a PIO, NODATA or DMA command to a
2750 * SFF/BMDMA controller. PIO and NODATA are handled by
2751 * ata_sff_qc_issue().
2752 *
2753 * LOCKING:
2754 * spin_lock_irqsave(host lock)
2755 *
2756 * RETURNS:
2757 * Zero on success, AC_ERR_* mask on failure
2758 */
2759unsigned int ata_bmdma_qc_issue(struct ata_queued_cmd *qc)
2760{
2761 struct ata_port *ap = qc->ap;
2762
2763 /* see ata_dma_blacklisted() */
2764 BUG_ON((ap->flags & ATA_FLAG_PIO_POLLING) &&
2765 qc->tf.protocol == ATAPI_PROT_DMA);
2766
2767 /* defer PIO handling to sff_qc_issue */
2768 if (!ata_is_dma(qc->tf.protocol))
2769 return ata_sff_qc_issue(qc);
2770
2771 /* select the device */
2772 ata_dev_select(ap, qc->dev->devno, 1, 0);
2773
2774 /* start the command */
2775 switch (qc->tf.protocol) {
2776 case ATA_PROT_DMA:
2777 WARN_ON_ONCE(qc->tf.flags & ATA_TFLAG_POLLING);
2778
2779 ap->ops->sff_tf_load(ap, &qc->tf); /* load tf registers */
2780 ap->ops->bmdma_setup(qc); /* set up bmdma */
2781 ap->ops->bmdma_start(qc); /* initiate bmdma */
2782 ap->hsm_task_state = HSM_ST_LAST;
2783 break;
2784
2785 case ATAPI_PROT_DMA:
2786 WARN_ON_ONCE(qc->tf.flags & ATA_TFLAG_POLLING);
2787
2788 ap->ops->sff_tf_load(ap, &qc->tf); /* load tf registers */
2789 ap->ops->bmdma_setup(qc); /* set up bmdma */
2790 ap->hsm_task_state = HSM_ST_FIRST;
2791
2792 /* send cdb by polling if no cdb interrupt */
2793 if (!(qc->dev->flags & ATA_DFLAG_CDB_INTR))
2794 ata_sff_queue_pio_task(ap, 0);
2795 break;
2796
2797 default:
2798 WARN_ON(1);
2799 return AC_ERR_SYSTEM;
2800 }
2801
2802 return 0;
2803}
2804EXPORT_SYMBOL_GPL(ata_bmdma_qc_issue);
2805
2806/**
2785 * ata_bmdma_error_handler - Stock error handler for BMDMA controller 2807 * ata_bmdma_error_handler - Stock error handler for BMDMA controller
2786 * @ap: port to handle error for 2808 * @ap: port to handle error for
2787 * 2809 *
diff --git a/drivers/ata/pata_acpi.c b/drivers/ata/pata_acpi.c
index 1a5a309abccd..066b9f301ed5 100644
--- a/drivers/ata/pata_acpi.c
+++ b/drivers/ata/pata_acpi.c
@@ -172,7 +172,7 @@ static unsigned int pacpi_qc_issue(struct ata_queued_cmd *qc)
172 struct pata_acpi *acpi = ap->private_data; 172 struct pata_acpi *acpi = ap->private_data;
173 173
174 if (acpi->gtm.flags & 0x10) 174 if (acpi->gtm.flags & 0x10)
175 return ata_sff_qc_issue(qc); 175 return ata_bmdma_qc_issue(qc);
176 176
177 if (adev != acpi->last) { 177 if (adev != acpi->last) {
178 pacpi_set_piomode(ap, adev); 178 pacpi_set_piomode(ap, adev);
@@ -180,7 +180,7 @@ static unsigned int pacpi_qc_issue(struct ata_queued_cmd *qc)
180 pacpi_set_dmamode(ap, adev); 180 pacpi_set_dmamode(ap, adev);
181 acpi->last = adev; 181 acpi->last = adev;
182 } 182 }
183 return ata_sff_qc_issue(qc); 183 return ata_bmdma_qc_issue(qc);
184} 184}
185 185
186/** 186/**
diff --git a/drivers/ata/pata_cs5530.c b/drivers/ata/pata_cs5530.c
index 4b9a66f18de6..e809a4233a81 100644
--- a/drivers/ata/pata_cs5530.c
+++ b/drivers/ata/pata_cs5530.c
@@ -156,7 +156,7 @@ static unsigned int cs5530_qc_issue(struct ata_queued_cmd *qc)
156 cs5530_set_dmamode(ap, adev); 156 cs5530_set_dmamode(ap, adev);
157 } 157 }
158 158
159 return ata_sff_qc_issue(qc); 159 return ata_bmdma_qc_issue(qc);
160} 160}
161 161
162static struct scsi_host_template cs5530_sht = { 162static struct scsi_host_template cs5530_sht = {
diff --git a/drivers/ata/pata_hpt3x2n.c b/drivers/ata/pata_hpt3x2n.c
index 01457b266f3d..8b95aeba0e74 100644
--- a/drivers/ata/pata_hpt3x2n.c
+++ b/drivers/ata/pata_hpt3x2n.c
@@ -320,7 +320,7 @@ static unsigned int hpt3x2n_qc_issue(struct ata_queued_cmd *qc)
320 320
321 hpt3x2n_set_clock(ap, dpll ? 0x21 : 0x23); 321 hpt3x2n_set_clock(ap, dpll ? 0x21 : 0x23);
322 } 322 }
323 return ata_sff_qc_issue(qc); 323 return ata_bmdma_qc_issue(qc);
324} 324}
325 325
326static struct scsi_host_template hpt3x2n_sht = { 326static struct scsi_host_template hpt3x2n_sht = {
diff --git a/drivers/ata/pata_it821x.c b/drivers/ata/pata_it821x.c
index 8d73438f292c..2bd2b002d14a 100644
--- a/drivers/ata/pata_it821x.c
+++ b/drivers/ata/pata_it821x.c
@@ -430,7 +430,7 @@ static unsigned int it821x_smart_qc_issue(struct ata_queued_cmd *qc)
430 case 0xFC: /* Internal 'report rebuild state' */ 430 case 0xFC: /* Internal 'report rebuild state' */
431 /* Arguably should just no-op this one */ 431 /* Arguably should just no-op this one */
432 case ATA_CMD_SET_FEATURES: 432 case ATA_CMD_SET_FEATURES:
433 return ata_sff_qc_issue(qc); 433 return ata_bmdma_qc_issue(qc);
434 } 434 }
435 printk(KERN_DEBUG "it821x: can't process command 0x%02X\n", qc->tf.command); 435 printk(KERN_DEBUG "it821x: can't process command 0x%02X\n", qc->tf.command);
436 return AC_ERR_DEV; 436 return AC_ERR_DEV;
@@ -448,7 +448,7 @@ static unsigned int it821x_smart_qc_issue(struct ata_queued_cmd *qc)
448static unsigned int it821x_passthru_qc_issue(struct ata_queued_cmd *qc) 448static unsigned int it821x_passthru_qc_issue(struct ata_queued_cmd *qc)
449{ 449{
450 it821x_passthru_dev_select(qc->ap, qc->dev->devno); 450 it821x_passthru_dev_select(qc->ap, qc->dev->devno);
451 return ata_sff_qc_issue(qc); 451 return ata_bmdma_qc_issue(qc);
452} 452}
453 453
454/** 454/**
diff --git a/drivers/ata/pata_oldpiix.c b/drivers/ata/pata_oldpiix.c
index 5f6aba7eb0dd..988ef2627be3 100644
--- a/drivers/ata/pata_oldpiix.c
+++ b/drivers/ata/pata_oldpiix.c
@@ -200,7 +200,7 @@ static unsigned int oldpiix_qc_issue(struct ata_queued_cmd *qc)
200 if (ata_dma_enabled(adev)) 200 if (ata_dma_enabled(adev))
201 oldpiix_set_dmamode(ap, adev); 201 oldpiix_set_dmamode(ap, adev);
202 } 202 }
203 return ata_sff_qc_issue(qc); 203 return ata_bmdma_qc_issue(qc);
204} 204}
205 205
206 206
diff --git a/drivers/ata/pata_radisys.c b/drivers/ata/pata_radisys.c
index fc9602229acb..a5fa388e5398 100644
--- a/drivers/ata/pata_radisys.c
+++ b/drivers/ata/pata_radisys.c
@@ -179,7 +179,7 @@ static unsigned int radisys_qc_issue(struct ata_queued_cmd *qc)
179 radisys_set_piomode(ap, adev); 179 radisys_set_piomode(ap, adev);
180 } 180 }
181 } 181 }
182 return ata_sff_qc_issue(qc); 182 return ata_bmdma_qc_issue(qc);
183} 183}
184 184
185 185
diff --git a/drivers/ata/pata_sc1200.c b/drivers/ata/pata_sc1200.c
index 599e648a722f..6b5b63a2fd8e 100644
--- a/drivers/ata/pata_sc1200.c
+++ b/drivers/ata/pata_sc1200.c
@@ -174,7 +174,7 @@ static unsigned int sc1200_qc_issue(struct ata_queued_cmd *qc)
174 sc1200_set_dmamode(ap, adev); 174 sc1200_set_dmamode(ap, adev);
175 } 175 }
176 176
177 return ata_sff_qc_issue(qc); 177 return ata_bmdma_qc_issue(qc);
178} 178}
179 179
180/** 180/**
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c
index fb0d2c1d8417..f3471bc949d3 100644
--- a/drivers/ata/sata_mv.c
+++ b/drivers/ata/sata_mv.c
@@ -2358,7 +2358,7 @@ static unsigned int mv_qc_issue(struct ata_queued_cmd *qc)
2358 if (IS_GEN_II(hpriv)) 2358 if (IS_GEN_II(hpriv))
2359 return mv_qc_issue_fis(qc); 2359 return mv_qc_issue_fis(qc);
2360 } 2360 }
2361 return ata_sff_qc_issue(qc); 2361 return ata_bmdma_qc_issue(qc);
2362} 2362}
2363 2363
2364static struct ata_queued_cmd *mv_get_active_qc(struct ata_port *ap) 2364static struct ata_queued_cmd *mv_get_active_qc(struct ata_port *ap)
diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c
index 4863a62c3d8c..baa8f0d2c86f 100644
--- a/drivers/ata/sata_nv.c
+++ b/drivers/ata/sata_nv.c
@@ -1468,7 +1468,7 @@ static unsigned int nv_adma_qc_issue(struct ata_queued_cmd *qc)
1468 BUG_ON(!(pp->flags & NV_ADMA_ATAPI_SETUP_COMPLETE) && 1468 BUG_ON(!(pp->flags & NV_ADMA_ATAPI_SETUP_COMPLETE) &&
1469 (qc->flags & ATA_QCFLAG_DMAMAP)); 1469 (qc->flags & ATA_QCFLAG_DMAMAP));
1470 nv_adma_register_mode(qc->ap); 1470 nv_adma_register_mode(qc->ap);
1471 return ata_sff_qc_issue(qc); 1471 return ata_bmdma_qc_issue(qc);
1472 } else 1472 } else
1473 nv_adma_mode(qc->ap); 1473 nv_adma_mode(qc->ap);
1474 1474
@@ -2088,7 +2088,7 @@ static unsigned int nv_swncq_qc_issue(struct ata_queued_cmd *qc)
2088 struct nv_swncq_port_priv *pp = ap->private_data; 2088 struct nv_swncq_port_priv *pp = ap->private_data;
2089 2089
2090 if (qc->tf.protocol != ATA_PROT_NCQ) 2090 if (qc->tf.protocol != ATA_PROT_NCQ)
2091 return ata_sff_qc_issue(qc); 2091 return ata_bmdma_qc_issue(qc);
2092 2092
2093 DPRINTK("Enter\n"); 2093 DPRINTK("Enter\n");
2094 2094
diff --git a/include/linux/libata.h b/include/linux/libata.h
index d973972f0db2..ee84e7e12039 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -1626,6 +1626,7 @@ extern int ata_pci_sff_init_one(struct pci_dev *pdev,
1626#endif /* CONFIG_PCI */ 1626#endif /* CONFIG_PCI */
1627 1627
1628extern void ata_bmdma_qc_prep(struct ata_queued_cmd *qc); 1628extern void ata_bmdma_qc_prep(struct ata_queued_cmd *qc);
1629extern unsigned int ata_bmdma_qc_issue(struct ata_queued_cmd *qc);
1629extern void ata_bmdma_dumb_qc_prep(struct ata_queued_cmd *qc); 1630extern void ata_bmdma_dumb_qc_prep(struct ata_queued_cmd *qc);
1630extern void ata_bmdma_error_handler(struct ata_port *ap); 1631extern void ata_bmdma_error_handler(struct ata_port *ap);
1631extern void ata_bmdma_post_internal_cmd(struct ata_queued_cmd *qc); 1632extern void ata_bmdma_post_internal_cmd(struct ata_queued_cmd *qc);