diff options
| author | Tejun Heo <htejun@gmail.com> | 2006-04-02 05:51:53 -0400 |
|---|---|---|
| committer | Jeff Garzik <jeff@garzik.org> | 2006-04-02 10:09:20 -0400 |
| commit | c91af2c87e4048cdefcfc9f16fed8d728243c92d (patch) | |
| tree | 346a50bed1b05bd144d755ba4281186877a432db | |
| parent | 2719736779da2c7fbb17d3de16c817b429bfeb9c (diff) | |
[PATCH] libata: pass qc around intead of ap during PIO
The current code passes pointer to ap around and repeatedly performs
ata_qc_from_tag() to access the ongoing qc. This is unnatural and
makes EH synchronization cumbersome. Make PIO codes deal with qc
instead of ap.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
| -rw-r--r-- | drivers/scsi/libata-core.c | 71 |
1 files changed, 26 insertions, 45 deletions
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c index 007d18888045..e9002a4174d0 100644 --- a/drivers/scsi/libata-core.c +++ b/drivers/scsi/libata-core.c | |||
| @@ -3416,7 +3416,7 @@ void ata_poll_qc_complete(struct ata_queued_cmd *qc) | |||
| 3416 | 3416 | ||
| 3417 | /** | 3417 | /** |
| 3418 | * ata_pio_poll - poll using PIO, depending on current state | 3418 | * ata_pio_poll - poll using PIO, depending on current state |
| 3419 | * @ap: the target ata_port | 3419 | * @qc: qc in progress |
| 3420 | * | 3420 | * |
| 3421 | * LOCKING: | 3421 | * LOCKING: |
| 3422 | * None. (executing in kernel thread context) | 3422 | * None. (executing in kernel thread context) |
| @@ -3424,17 +3424,13 @@ void ata_poll_qc_complete(struct ata_queued_cmd *qc) | |||
| 3424 | * RETURNS: | 3424 | * RETURNS: |
| 3425 | * timeout value to use | 3425 | * timeout value to use |
| 3426 | */ | 3426 | */ |
| 3427 | 3427 | static unsigned long ata_pio_poll(struct ata_queued_cmd *qc) | |
| 3428 | static unsigned long ata_pio_poll(struct ata_port *ap) | ||
| 3429 | { | 3428 | { |
| 3430 | struct ata_queued_cmd *qc; | 3429 | struct ata_port *ap = qc->ap; |
| 3431 | u8 status; | 3430 | u8 status; |
| 3432 | unsigned int poll_state = HSM_ST_UNKNOWN; | 3431 | unsigned int poll_state = HSM_ST_UNKNOWN; |
| 3433 | unsigned int reg_state = HSM_ST_UNKNOWN; | 3432 | unsigned int reg_state = HSM_ST_UNKNOWN; |
| 3434 | 3433 | ||
| 3435 | qc = ata_qc_from_tag(ap, ap->active_tag); | ||
| 3436 | WARN_ON(qc == NULL); | ||
| 3437 | |||
| 3438 | switch (ap->hsm_task_state) { | 3434 | switch (ap->hsm_task_state) { |
| 3439 | case HSM_ST: | 3435 | case HSM_ST: |
| 3440 | case HSM_ST_POLL: | 3436 | case HSM_ST_POLL: |
| @@ -3468,7 +3464,7 @@ static unsigned long ata_pio_poll(struct ata_port *ap) | |||
| 3468 | 3464 | ||
| 3469 | /** | 3465 | /** |
| 3470 | * ata_pio_complete - check if drive is busy or idle | 3466 | * ata_pio_complete - check if drive is busy or idle |
| 3471 | * @ap: the target ata_port | 3467 | * @qc: qc to complete |
| 3472 | * | 3468 | * |
| 3473 | * LOCKING: | 3469 | * LOCKING: |
| 3474 | * None. (executing in kernel thread context) | 3470 | * None. (executing in kernel thread context) |
| @@ -3476,10 +3472,9 @@ static unsigned long ata_pio_poll(struct ata_port *ap) | |||
| 3476 | * RETURNS: | 3472 | * RETURNS: |
| 3477 | * Non-zero if qc completed, zero otherwise. | 3473 | * Non-zero if qc completed, zero otherwise. |
| 3478 | */ | 3474 | */ |
| 3479 | 3475 | static int ata_pio_complete(struct ata_queued_cmd *qc) | |
| 3480 | static int ata_pio_complete (struct ata_port *ap) | ||
| 3481 | { | 3476 | { |
| 3482 | struct ata_queued_cmd *qc; | 3477 | struct ata_port *ap = qc->ap; |
| 3483 | u8 drv_stat; | 3478 | u8 drv_stat; |
| 3484 | 3479 | ||
| 3485 | /* | 3480 | /* |
| @@ -3500,9 +3495,6 @@ static int ata_pio_complete (struct ata_port *ap) | |||
| 3500 | } | 3495 | } |
| 3501 | } | 3496 | } |
| 3502 | 3497 | ||
| 3503 | qc = ata_qc_from_tag(ap, ap->active_tag); | ||
| 3504 | WARN_ON(qc == NULL); | ||
| 3505 | |||
| 3506 | drv_stat = ata_wait_idle(ap); | 3498 | drv_stat = ata_wait_idle(ap); |
| 3507 | if (!ata_ok(drv_stat)) { | 3499 | if (!ata_ok(drv_stat)) { |
| 3508 | qc->err_mask |= __ac_err_mask(drv_stat); | 3500 | qc->err_mask |= __ac_err_mask(drv_stat); |
| @@ -3838,15 +3830,14 @@ err_out: | |||
| 3838 | 3830 | ||
| 3839 | /** | 3831 | /** |
| 3840 | * ata_pio_block - start PIO on a block | 3832 | * ata_pio_block - start PIO on a block |
| 3841 | * @ap: the target ata_port | 3833 | * @qc: qc to transfer block for |
| 3842 | * | 3834 | * |
| 3843 | * LOCKING: | 3835 | * LOCKING: |
| 3844 | * None. (executing in kernel thread context) | 3836 | * None. (executing in kernel thread context) |
| 3845 | */ | 3837 | */ |
| 3846 | 3838 | static void ata_pio_block(struct ata_queued_cmd *qc) | |
| 3847 | static void ata_pio_block(struct ata_port *ap) | ||
| 3848 | { | 3839 | { |
| 3849 | struct ata_queued_cmd *qc; | 3840 | struct ata_port *ap = qc->ap; |
| 3850 | u8 status; | 3841 | u8 status; |
| 3851 | 3842 | ||
| 3852 | /* | 3843 | /* |
| @@ -3868,9 +3859,6 @@ static void ata_pio_block(struct ata_port *ap) | |||
| 3868 | } | 3859 | } |
| 3869 | } | 3860 | } |
| 3870 | 3861 | ||
| 3871 | qc = ata_qc_from_tag(ap, ap->active_tag); | ||
| 3872 | WARN_ON(qc == NULL); | ||
| 3873 | |||
| 3874 | /* check error */ | 3862 | /* check error */ |
| 3875 | if (status & (ATA_ERR | ATA_DF)) { | 3863 | if (status & (ATA_ERR | ATA_DF)) { |
| 3876 | qc->err_mask |= AC_ERR_DEV; | 3864 | qc->err_mask |= AC_ERR_DEV; |
| @@ -3899,12 +3887,9 @@ static void ata_pio_block(struct ata_port *ap) | |||
| 3899 | } | 3887 | } |
| 3900 | } | 3888 | } |
| 3901 | 3889 | ||
| 3902 | static void ata_pio_error(struct ata_port *ap) | 3890 | static void ata_pio_error(struct ata_queued_cmd *qc) |
| 3903 | { | 3891 | { |
| 3904 | struct ata_queued_cmd *qc; | 3892 | struct ata_port *ap = qc->ap; |
| 3905 | |||
| 3906 | qc = ata_qc_from_tag(ap, ap->active_tag); | ||
| 3907 | WARN_ON(qc == NULL); | ||
| 3908 | 3893 | ||
| 3909 | if (qc->tf.command != ATA_CMD_PACKET) | 3894 | if (qc->tf.command != ATA_CMD_PACKET) |
| 3910 | printk(KERN_WARNING "ata%u: dev %u PIO error\n", | 3895 | printk(KERN_WARNING "ata%u: dev %u PIO error\n", |
| @@ -3922,7 +3907,8 @@ static void ata_pio_error(struct ata_port *ap) | |||
| 3922 | 3907 | ||
| 3923 | static void ata_pio_task(void *_data) | 3908 | static void ata_pio_task(void *_data) |
| 3924 | { | 3909 | { |
| 3925 | struct ata_port *ap = _data; | 3910 | struct ata_queued_cmd *qc = _data; |
| 3911 | struct ata_port *ap = qc->ap; | ||
| 3926 | unsigned long timeout; | 3912 | unsigned long timeout; |
| 3927 | int qc_completed; | 3913 | int qc_completed; |
| 3928 | 3914 | ||
| @@ -3935,33 +3921,33 @@ fsm_start: | |||
| 3935 | return; | 3921 | return; |
| 3936 | 3922 | ||
| 3937 | case HSM_ST: | 3923 | case HSM_ST: |
| 3938 | ata_pio_block(ap); | 3924 | ata_pio_block(qc); |
| 3939 | break; | 3925 | break; |
| 3940 | 3926 | ||
| 3941 | case HSM_ST_LAST: | 3927 | case HSM_ST_LAST: |
| 3942 | qc_completed = ata_pio_complete(ap); | 3928 | qc_completed = ata_pio_complete(qc); |
| 3943 | break; | 3929 | break; |
| 3944 | 3930 | ||
| 3945 | case HSM_ST_POLL: | 3931 | case HSM_ST_POLL: |
| 3946 | case HSM_ST_LAST_POLL: | 3932 | case HSM_ST_LAST_POLL: |
| 3947 | timeout = ata_pio_poll(ap); | 3933 | timeout = ata_pio_poll(qc); |
| 3948 | break; | 3934 | break; |
| 3949 | 3935 | ||
| 3950 | case HSM_ST_TMOUT: | 3936 | case HSM_ST_TMOUT: |
| 3951 | case HSM_ST_ERR: | 3937 | case HSM_ST_ERR: |
| 3952 | ata_pio_error(ap); | 3938 | ata_pio_error(qc); |
| 3953 | return; | 3939 | return; |
| 3954 | } | 3940 | } |
| 3955 | 3941 | ||
| 3956 | if (timeout) | 3942 | if (timeout) |
| 3957 | ata_port_queue_task(ap, ata_pio_task, ap, timeout); | 3943 | ata_port_queue_task(ap, ata_pio_task, qc, timeout); |
| 3958 | else if (!qc_completed) | 3944 | else if (!qc_completed) |
| 3959 | goto fsm_start; | 3945 | goto fsm_start; |
| 3960 | } | 3946 | } |
| 3961 | 3947 | ||
| 3962 | /** | 3948 | /** |
| 3963 | * atapi_packet_task - Write CDB bytes to hardware | 3949 | * atapi_packet_task - Write CDB bytes to hardware |
| 3964 | * @_data: Port to which ATAPI device is attached. | 3950 | * @_data: qc in progress |
| 3965 | * | 3951 | * |
| 3966 | * When device has indicated its readiness to accept | 3952 | * When device has indicated its readiness to accept |
| 3967 | * a CDB, this function is called. Send the CDB. | 3953 | * a CDB, this function is called. Send the CDB. |
| @@ -3972,17 +3958,12 @@ fsm_start: | |||
| 3972 | * LOCKING: | 3958 | * LOCKING: |
| 3973 | * Kernel thread context (may sleep) | 3959 | * Kernel thread context (may sleep) |
| 3974 | */ | 3960 | */ |
| 3975 | |||
| 3976 | static void atapi_packet_task(void *_data) | 3961 | static void atapi_packet_task(void *_data) |
| 3977 | { | 3962 | { |
| 3978 | struct ata_port *ap = _data; | 3963 | struct ata_queued_cmd *qc = _data; |
| 3979 | struct ata_queued_cmd *qc; | 3964 | struct ata_port *ap = qc->ap; |
| 3980 | u8 status; | 3965 | u8 status; |
| 3981 | 3966 | ||
| 3982 | qc = ata_qc_from_tag(ap, ap->active_tag); | ||
| 3983 | WARN_ON(qc == NULL); | ||
| 3984 | WARN_ON(!(qc->flags & ATA_QCFLAG_ACTIVE)); | ||
| 3985 | |||
| 3986 | /* sleep-wait for BSY to clear */ | 3967 | /* sleep-wait for BSY to clear */ |
| 3987 | DPRINTK("busy wait\n"); | 3968 | DPRINTK("busy wait\n"); |
| 3988 | if (ata_busy_sleep(ap, ATA_TMOUT_CDB_QUICK, ATA_TMOUT_CDB)) { | 3969 | if (ata_busy_sleep(ap, ATA_TMOUT_CDB_QUICK, ATA_TMOUT_CDB)) { |
| @@ -4022,7 +4003,7 @@ static void atapi_packet_task(void *_data) | |||
| 4022 | 4003 | ||
| 4023 | /* PIO commands are handled by polling */ | 4004 | /* PIO commands are handled by polling */ |
| 4024 | ap->hsm_task_state = HSM_ST; | 4005 | ap->hsm_task_state = HSM_ST; |
| 4025 | ata_port_queue_task(ap, ata_pio_task, ap, 0); | 4006 | ata_port_queue_task(ap, ata_pio_task, qc, 0); |
| 4026 | } | 4007 | } |
| 4027 | 4008 | ||
| 4028 | return; | 4009 | return; |
| @@ -4328,26 +4309,26 @@ unsigned int ata_qc_issue_prot(struct ata_queued_cmd *qc) | |||
| 4328 | ata_qc_set_polling(qc); | 4309 | ata_qc_set_polling(qc); |
| 4329 | ata_tf_to_host(ap, &qc->tf); | 4310 | ata_tf_to_host(ap, &qc->tf); |
| 4330 | ap->hsm_task_state = HSM_ST; | 4311 | ap->hsm_task_state = HSM_ST; |
| 4331 | ata_port_queue_task(ap, ata_pio_task, ap, 0); | 4312 | ata_port_queue_task(ap, ata_pio_task, qc, 0); |
| 4332 | break; | 4313 | break; |
| 4333 | 4314 | ||
| 4334 | case ATA_PROT_ATAPI: | 4315 | case ATA_PROT_ATAPI: |
| 4335 | ata_qc_set_polling(qc); | 4316 | ata_qc_set_polling(qc); |
| 4336 | ata_tf_to_host(ap, &qc->tf); | 4317 | ata_tf_to_host(ap, &qc->tf); |
| 4337 | ata_port_queue_task(ap, atapi_packet_task, ap, 0); | 4318 | ata_port_queue_task(ap, atapi_packet_task, qc, 0); |
| 4338 | break; | 4319 | break; |
| 4339 | 4320 | ||
| 4340 | case ATA_PROT_ATAPI_NODATA: | 4321 | case ATA_PROT_ATAPI_NODATA: |
| 4341 | ap->flags |= ATA_FLAG_NOINTR; | 4322 | ap->flags |= ATA_FLAG_NOINTR; |
| 4342 | ata_tf_to_host(ap, &qc->tf); | 4323 | ata_tf_to_host(ap, &qc->tf); |
| 4343 | ata_port_queue_task(ap, atapi_packet_task, ap, 0); | 4324 | ata_port_queue_task(ap, atapi_packet_task, qc, 0); |
| 4344 | break; | 4325 | break; |
| 4345 | 4326 | ||
| 4346 | case ATA_PROT_ATAPI_DMA: | 4327 | case ATA_PROT_ATAPI_DMA: |
| 4347 | ap->flags |= ATA_FLAG_NOINTR; | 4328 | ap->flags |= ATA_FLAG_NOINTR; |
| 4348 | ap->ops->tf_load(ap, &qc->tf); /* load tf registers */ | 4329 | ap->ops->tf_load(ap, &qc->tf); /* load tf registers */ |
| 4349 | ap->ops->bmdma_setup(qc); /* set up bmdma */ | 4330 | ap->ops->bmdma_setup(qc); /* set up bmdma */ |
| 4350 | ata_port_queue_task(ap, atapi_packet_task, ap, 0); | 4331 | ata_port_queue_task(ap, atapi_packet_task, qc, 0); |
| 4351 | break; | 4332 | break; |
| 4352 | 4333 | ||
| 4353 | default: | 4334 | default: |
