diff options
author | Tejun Heo <htejun@gmail.com> | 2006-05-15 07:59:29 -0400 |
---|---|---|
committer | Tejun Heo <htejun@gmail.com> | 2006-05-15 07:59:29 -0400 |
commit | c17ea20d9a689d7335e97e09354865cdd9f873e1 (patch) | |
tree | 74b04b022513b66b5a84977b15296c1d8df97674 | |
parent | 12436c30f4808e00fa008c6787c609bc6ae216ba (diff) |
[PATCH] libata: fix irq-pio merge
* kill ata_poll_qc_complete() and implement/use ata_hsm_qc_complete()
which completes qcs in new EH compliant manner from HSM
* don't print error message from ata_hsm_move(). it's responsibility
of EH.
* kill ATA_FLAG_NOINTR usage in bmdma EH
Signed-off-by: Tejun Heo <htejun@gmail.com>
-rw-r--r-- | drivers/scsi/libata-bmdma.c | 1 | ||||
-rw-r--r-- | drivers/scsi/libata-core.c | 98 |
2 files changed, 52 insertions, 47 deletions
diff --git a/drivers/scsi/libata-bmdma.c b/drivers/scsi/libata-bmdma.c index 49eff18a67e3..6d30d2c52960 100644 --- a/drivers/scsi/libata-bmdma.c +++ b/drivers/scsi/libata-bmdma.c | |||
@@ -726,7 +726,6 @@ void ata_bmdma_drive_eh(struct ata_port *ap, ata_reset_fn_t softreset, | |||
726 | /* reset PIO HSM and stop DMA engine */ | 726 | /* reset PIO HSM and stop DMA engine */ |
727 | spin_lock_irqsave(&host_set->lock, flags); | 727 | spin_lock_irqsave(&host_set->lock, flags); |
728 | 728 | ||
729 | ap->flags &= ~ATA_FLAG_NOINTR; | ||
730 | ap->hsm_task_state = HSM_ST_IDLE; | 729 | ap->hsm_task_state = HSM_ST_IDLE; |
731 | 730 | ||
732 | if (qc && (qc->tf.protocol == ATA_PROT_DMA || | 731 | if (qc && (qc->tf.protocol == ATA_PROT_DMA || |
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c index c859b96b891a..487b8f22981f 100644 --- a/drivers/scsi/libata-core.c +++ b/drivers/scsi/libata-core.c | |||
@@ -3462,40 +3462,6 @@ skip_map: | |||
3462 | } | 3462 | } |
3463 | 3463 | ||
3464 | /** | 3464 | /** |
3465 | * ata_poll_qc_complete - turn irq back on and finish qc | ||
3466 | * @qc: Command to complete | ||
3467 | * @err_mask: ATA status register content | ||
3468 | * | ||
3469 | * LOCKING: | ||
3470 | * None. (grabs host lock) | ||
3471 | */ | ||
3472 | void ata_poll_qc_complete(struct ata_queued_cmd *qc) | ||
3473 | { | ||
3474 | struct ata_port *ap = qc->ap; | ||
3475 | unsigned long flags; | ||
3476 | |||
3477 | spin_lock_irqsave(&ap->host_set->lock, flags); | ||
3478 | |||
3479 | if (ap->ops->error_handler) { | ||
3480 | /* EH might have kicked in while host_set lock is released */ | ||
3481 | qc = ata_qc_from_tag(ap, qc->tag); | ||
3482 | if (qc) { | ||
3483 | if (!(qc->err_mask & AC_ERR_HSM)) { | ||
3484 | ata_irq_on(ap); | ||
3485 | ata_qc_complete(qc); | ||
3486 | } else | ||
3487 | ata_port_freeze(ap); | ||
3488 | } | ||
3489 | } else { | ||
3490 | /* old EH */ | ||
3491 | ata_irq_on(ap); | ||
3492 | ata_qc_complete(qc); | ||
3493 | } | ||
3494 | |||
3495 | spin_unlock_irqrestore(&ap->host_set->lock, flags); | ||
3496 | } | ||
3497 | |||
3498 | /** | ||
3499 | * swap_buf_le16 - swap halves of 16-bit words in place | 3465 | * swap_buf_le16 - swap halves of 16-bit words in place |
3500 | * @buf: Buffer to swap | 3466 | * @buf: Buffer to swap |
3501 | * @buf_words: Number of 16-bit words in buffer. | 3467 | * @buf_words: Number of 16-bit words in buffer. |
@@ -3918,6 +3884,56 @@ static inline int ata_hsm_ok_in_wq(struct ata_port *ap, struct ata_queued_cmd *q | |||
3918 | } | 3884 | } |
3919 | 3885 | ||
3920 | /** | 3886 | /** |
3887 | * ata_hsm_qc_complete - finish a qc running on standard HSM | ||
3888 | * @qc: Command to complete | ||
3889 | * @in_wq: 1 if called from workqueue, 0 otherwise | ||
3890 | * | ||
3891 | * Finish @qc which is running on standard HSM. | ||
3892 | * | ||
3893 | * LOCKING: | ||
3894 | * If @in_wq is zero, spin_lock_irqsave(host_set lock). | ||
3895 | * Otherwise, none on entry and grabs host lock. | ||
3896 | */ | ||
3897 | static void ata_hsm_qc_complete(struct ata_queued_cmd *qc, int in_wq) | ||
3898 | { | ||
3899 | struct ata_port *ap = qc->ap; | ||
3900 | unsigned long flags; | ||
3901 | |||
3902 | if (ap->ops->error_handler) { | ||
3903 | if (in_wq) { | ||
3904 | spin_lock_irqsave(&ap->host_set->lock, flags); | ||
3905 | |||
3906 | /* EH might have kicked in while host_set lock | ||
3907 | * is released. | ||
3908 | */ | ||
3909 | qc = ata_qc_from_tag(ap, qc->tag); | ||
3910 | if (qc) { | ||
3911 | if (likely(!(qc->err_mask & AC_ERR_HSM))) { | ||
3912 | ata_irq_on(ap); | ||
3913 | ata_qc_complete(qc); | ||
3914 | } else | ||
3915 | ata_port_freeze(ap); | ||
3916 | } | ||
3917 | |||
3918 | spin_unlock_irqrestore(&ap->host_set->lock, flags); | ||
3919 | } else { | ||
3920 | if (likely(!(qc->err_mask & AC_ERR_HSM))) | ||
3921 | ata_qc_complete(qc); | ||
3922 | else | ||
3923 | ata_port_freeze(ap); | ||
3924 | } | ||
3925 | } else { | ||
3926 | if (in_wq) { | ||
3927 | spin_lock_irqsave(&ap->host_set->lock, flags); | ||
3928 | ata_irq_on(ap); | ||
3929 | ata_qc_complete(qc); | ||
3930 | spin_unlock_irqrestore(&ap->host_set->lock, flags); | ||
3931 | } else | ||
3932 | ata_qc_complete(qc); | ||
3933 | } | ||
3934 | } | ||
3935 | |||
3936 | /** | ||
3921 | * ata_hsm_move - move the HSM to the next state. | 3937 | * ata_hsm_move - move the HSM to the next state. |
3922 | * @ap: the target ata_port | 3938 | * @ap: the target ata_port |
3923 | * @qc: qc on going | 3939 | * @qc: qc on going |
@@ -4108,19 +4124,12 @@ fsm_start: | |||
4108 | ap->hsm_task_state = HSM_ST_IDLE; | 4124 | ap->hsm_task_state = HSM_ST_IDLE; |
4109 | 4125 | ||
4110 | /* complete taskfile transaction */ | 4126 | /* complete taskfile transaction */ |
4111 | if (in_wq) | 4127 | ata_hsm_qc_complete(qc, in_wq); |
4112 | ata_poll_qc_complete(qc); | ||
4113 | else | ||
4114 | ata_qc_complete(qc); | ||
4115 | 4128 | ||
4116 | poll_next = 0; | 4129 | poll_next = 0; |
4117 | break; | 4130 | break; |
4118 | 4131 | ||
4119 | case HSM_ST_ERR: | 4132 | case HSM_ST_ERR: |
4120 | if (qc->tf.command != ATA_CMD_PACKET) | ||
4121 | printk(KERN_ERR "ata%u: dev %u command error, drv_stat 0x%x\n", | ||
4122 | ap->id, qc->dev->devno, status); | ||
4123 | |||
4124 | /* make sure qc->err_mask is available to | 4133 | /* make sure qc->err_mask is available to |
4125 | * know what's wrong and recover | 4134 | * know what's wrong and recover |
4126 | */ | 4135 | */ |
@@ -4129,10 +4138,7 @@ fsm_start: | |||
4129 | ap->hsm_task_state = HSM_ST_IDLE; | 4138 | ap->hsm_task_state = HSM_ST_IDLE; |
4130 | 4139 | ||
4131 | /* complete taskfile transaction */ | 4140 | /* complete taskfile transaction */ |
4132 | if (in_wq) | 4141 | ata_hsm_qc_complete(qc, in_wq); |
4133 | ata_poll_qc_complete(qc); | ||
4134 | else | ||
4135 | ata_qc_complete(qc); | ||
4136 | 4142 | ||
4137 | poll_next = 0; | 4143 | poll_next = 0; |
4138 | break; | 4144 | break; |