Lines Matching refs:drive

57 int ide_end_rq(ide_drive_t *drive, struct request *rq, blk_status_t error,  in ide_end_rq()  argument
64 if ((drive->dev_flags & IDE_DFLAG_DMA_PIO_RETRY) && in ide_end_rq()
65 drive->retry_pio <= 3) { in ide_end_rq()
66 drive->dev_flags &= ~IDE_DFLAG_DMA_PIO_RETRY; in ide_end_rq()
67 ide_dma_on(drive); in ide_end_rq()
71 if (rq == drive->sense_rq) { in ide_end_rq()
72 drive->sense_rq = NULL; in ide_end_rq()
73 drive->sense_rq_active = false; in ide_end_rq()
84 void ide_complete_cmd(ide_drive_t *drive, struct ide_cmd *cmd, u8 stat, u8 err) in ide_complete_cmd() argument
86 const struct ide_tp_ops *tp_ops = drive->hwif->tp_ops; in ide_complete_cmd()
97 tp_ops->input_data(drive, cmd, data, 2); in ide_complete_cmd()
103 ide_tf_readback(drive, cmd); in ide_complete_cmd()
109 drive->name); in ide_complete_cmd()
110 ide_tf_dump(drive->name, cmd); in ide_complete_cmd()
112 drive->dev_flags |= IDE_DFLAG_PARKED; in ide_complete_cmd()
125 int ide_complete_rq(ide_drive_t *drive, blk_status_t error, unsigned int nr_bytes) in ide_complete_rq() argument
127 ide_hwif_t *hwif = drive->hwif; in ide_complete_rq()
138 rc = ide_end_rq(drive, rq, error, nr_bytes); in ide_complete_rq()
146 void ide_kill_rq(ide_drive_t *drive, struct request *rq) in ide_kill_rq() argument
149 u8 media = drive->media; in ide_kill_rq()
151 drive->failed_pc = NULL; in ide_kill_rq()
162 ide_complete_rq(drive, BLK_STS_IOERR, blk_rq_bytes(rq)); in ide_kill_rq()
165 static void ide_tf_set_specify_cmd(ide_drive_t *drive, struct ide_taskfile *tf) in ide_tf_set_specify_cmd() argument
167 tf->nsect = drive->sect; in ide_tf_set_specify_cmd()
168 tf->lbal = drive->sect; in ide_tf_set_specify_cmd()
169 tf->lbam = drive->cyl; in ide_tf_set_specify_cmd()
170 tf->lbah = drive->cyl >> 8; in ide_tf_set_specify_cmd()
171 tf->device = (drive->head - 1) | drive->select; in ide_tf_set_specify_cmd()
175 static void ide_tf_set_restore_cmd(ide_drive_t *drive, struct ide_taskfile *tf) in ide_tf_set_restore_cmd() argument
177 tf->nsect = drive->sect; in ide_tf_set_restore_cmd()
181 static void ide_tf_set_setmult_cmd(ide_drive_t *drive, struct ide_taskfile *tf) in ide_tf_set_setmult_cmd() argument
183 tf->nsect = drive->mult_req; in ide_tf_set_setmult_cmd()
195 static ide_startstop_t do_special(ide_drive_t *drive) in do_special() argument
200 printk(KERN_DEBUG "%s: %s: 0x%02x\n", drive->name, __func__, in do_special()
201 drive->special_flags); in do_special()
203 if (drive->media != ide_disk) { in do_special()
204 drive->special_flags = 0; in do_special()
205 drive->mult_req = 0; in do_special()
212 if (drive->special_flags & IDE_SFLAG_SET_GEOMETRY) { in do_special()
213 drive->special_flags &= ~IDE_SFLAG_SET_GEOMETRY; in do_special()
214 ide_tf_set_specify_cmd(drive, &cmd.tf); in do_special()
215 } else if (drive->special_flags & IDE_SFLAG_RECALIBRATE) { in do_special()
216 drive->special_flags &= ~IDE_SFLAG_RECALIBRATE; in do_special()
217 ide_tf_set_restore_cmd(drive, &cmd.tf); in do_special()
218 } else if (drive->special_flags & IDE_SFLAG_SET_MULTMODE) { in do_special()
219 drive->special_flags &= ~IDE_SFLAG_SET_MULTMODE; in do_special()
220 ide_tf_set_setmult_cmd(drive, &cmd.tf); in do_special()
228 do_rw_taskfile(drive, &cmd); in do_special()
233 void ide_map_sg(ide_drive_t *drive, struct ide_cmd *cmd) in ide_map_sg() argument
235 ide_hwif_t *hwif = drive->hwif; in ide_map_sg()
239 cmd->sg_nents = blk_rq_map_sg(drive->queue, rq, sg); in ide_map_sg()
263 static ide_startstop_t execute_drive_cmd (ide_drive_t *drive, in execute_drive_cmd() argument
271 ide_map_sg(drive, cmd); in execute_drive_cmd()
274 return do_rw_taskfile(drive, cmd); in execute_drive_cmd()
282 printk("%s: DRIVE_CMD (null)\n", drive->name); in execute_drive_cmd()
285 ide_complete_rq(drive, BLK_STS_OK, blk_rq_bytes(rq)); in execute_drive_cmd()
290 static ide_startstop_t ide_special_rq(ide_drive_t *drive, struct request *rq) in ide_special_rq() argument
297 return ide_do_park_unpark(drive, rq); in ide_special_rq()
299 return ide_do_devset(drive, rq); in ide_special_rq()
301 return ide_do_reset(drive); in ide_special_rq()
316 static ide_startstop_t start_request (ide_drive_t *drive, struct request *rq) in start_request() argument
322 drive->hwif->name, (unsigned long) rq); in start_request()
326 if (drive->max_failures && (drive->failures > drive->max_failures)) { in start_request()
331 if (drive->prep_rq && !drive->prep_rq(drive, rq)) in start_request()
335 ide_check_pm_state(drive, rq); in start_request()
337 drive->hwif->tp_ops->dev_select(drive); in start_request()
338 if (ide_wait_stat(&startstop, drive, drive->ready_stat, in start_request()
340 printk(KERN_ERR "%s: drive not ready for command\n", drive->name); in start_request()
344 if (drive->special_flags == 0) { in start_request()
351 if (drive->current_speed == 0xff) in start_request()
352 ide_config_drive_speed(drive, drive->desired_speed); in start_request()
355 return execute_drive_cmd(drive, rq); in start_request()
360 drive->name, pm->pm_step); in start_request()
362 startstop = ide_start_power_step(drive, rq); in start_request()
365 ide_complete_pm_rq(drive, rq); in start_request()
376 return ide_special_rq(drive, rq); in start_request()
380 return drv->do_request(drive, rq, blk_rq_pos(rq)); in start_request()
382 return do_special(drive); in start_request()
384 ide_kill_rq(drive, rq); in start_request()
397 void ide_stall_queue (ide_drive_t *drive, unsigned long timeout) in ide_stall_queue() argument
401 drive->sleep = timeout + jiffies; in ide_stall_queue()
402 drive->dev_flags |= IDE_DFLAG_SLEEPING; in ide_stall_queue()
444 void ide_requeue_and_plug(ide_drive_t *drive, struct request *rq) in ide_requeue_and_plug() argument
446 struct request_queue *q = drive->queue; in ide_requeue_and_plug()
456 blk_status_t ide_issue_rq(ide_drive_t *drive, struct request *rq, in ide_issue_rq() argument
459 ide_hwif_t *hwif = drive->hwif; in ide_issue_rq()
482 if (drive->dev_flags & IDE_DFLAG_SLEEPING && in ide_issue_rq()
483 time_after(drive->sleep, jiffies)) { in ide_issue_rq()
505 hwif->cur_dev = drive; in ide_issue_rq()
506 drive->dev_flags &= ~(IDE_DFLAG_SLEEPING | IDE_DFLAG_PARKED); in ide_issue_rq()
521 if ((drive->dev_flags & IDE_DFLAG_BLOCKED) && in ide_issue_rq()
533 startstop = start_request(drive, rq); in ide_issue_rq()
547 list_add(&rq->queuelist, &drive->rq_list); in ide_issue_rq()
551 ide_requeue_and_plug(drive, rq); in ide_issue_rq()
568 ide_drive_t *drive = hctx->queue->queuedata; in ide_queue_rq() local
569 ide_hwif_t *hwif = drive->hwif; in ide_queue_rq()
572 if (drive->sense_rq_active) { in ide_queue_rq()
579 return ide_issue_rq(drive, bd->rq, false); in ide_queue_rq()
582 static int drive_is_ready(ide_drive_t *drive) in drive_is_ready() argument
584 ide_hwif_t *hwif = drive->hwif; in drive_is_ready()
587 if (drive->waiting_for_dma) in drive_is_ready()
588 return hwif->dma_ops->dma_test_irq(drive); in drive_is_ready()
622 ide_drive_t *uninitialized_var(drive); in ide_timer_expiry()
644 drive = hwif->cur_dev; in ide_timer_expiry()
647 wait = expiry(drive); in ide_timer_expiry()
669 startstop = handler(drive); in ide_timer_expiry()
670 } else if (drive_is_ready(drive)) { in ide_timer_expiry()
671 if (drive->waiting_for_dma) in ide_timer_expiry()
672 hwif->dma_ops->dma_lost_irq(drive); in ide_timer_expiry()
674 hwif->port_ops->clear_irq(drive); in ide_timer_expiry()
677 drive->name); in ide_timer_expiry()
678 startstop = handler(drive); in ide_timer_expiry()
680 if (drive->waiting_for_dma) in ide_timer_expiry()
681 startstop = ide_dma_timeout_retry(drive, wait); in ide_timer_expiry()
683 startstop = ide_error(drive, "irq timeout", in ide_timer_expiry()
700 ide_requeue_and_plug(drive, rq_in_flight); in ide_timer_expiry()
780 ide_drive_t *uninitialized_var(drive); in ide_intr()
830 drive = hwif->cur_dev; in ide_intr()
832 if (!drive_is_ready(drive)) in ide_intr()
849 hwif->port_ops->clear_irq(drive); in ide_intr()
851 if (drive->dev_flags & IDE_DFLAG_UNMASK) in ide_intr()
855 startstop = handler(drive); in ide_intr()
878 ide_requeue_and_plug(drive, rq_in_flight); in ide_intr()
885 void ide_pad_transfer(ide_drive_t *drive, int write, int len) in ide_pad_transfer() argument
887 ide_hwif_t *hwif = drive->hwif; in ide_pad_transfer()
892 hwif->tp_ops->output_data(drive, NULL, buf, min(4, len)); in ide_pad_transfer()
894 hwif->tp_ops->input_data(drive, NULL, buf, min(4, len)); in ide_pad_transfer()
900 void ide_insert_request_head(ide_drive_t *drive, struct request *rq) in ide_insert_request_head() argument
902 drive->sense_rq_active = true; in ide_insert_request_head()
903 list_add_tail(&rq->queuelist, &drive->rq_list); in ide_insert_request_head()
904 kblockd_schedule_work(&drive->rq_work); in ide_insert_request_head()