• Home
  • Raw
  • Download

Lines Matching full:drive

27 static inline int dev_is_idecd(ide_drive_t *drive)  in dev_is_idecd()  argument
29 return drive->media == ide_cdrom || drive->media == ide_optical; in dev_is_idecd()
36 int ide_check_atapi_device(ide_drive_t *drive, const char *s) in ide_check_atapi_device() argument
38 u16 *id = drive->id; in ide_check_atapi_device()
51 if (drive->media == ide_floppy && device_type == 5 && in ide_check_atapi_device()
59 s, drive->name, protocol); in ide_check_atapi_device()
60 else if ((drive->media == ide_floppy && device_type != 0) || in ide_check_atapi_device()
61 (drive->media == ide_tape && device_type != 1)) in ide_check_atapi_device()
63 s, drive->name, device_type); in ide_check_atapi_device()
66 s, drive->name); in ide_check_atapi_device()
67 else if (drive->media == ide_floppy && drq_type == 3) in ide_check_atapi_device()
69 "supported\n", s, drive->name, drq_type); in ide_check_atapi_device()
72 "bytes\n", s, drive->name, packet_size); in ide_check_atapi_device()
89 int ide_queue_pc_tail(ide_drive_t *drive, struct gendisk *disk, in ide_queue_pc_tail() argument
95 rq = blk_get_request(drive->queue, REQ_OP_DRV_IN, 0); in ide_queue_pc_tail()
100 error = blk_rq_map_kern(drive->queue, rq, buf, bufflen, in ide_queue_pc_tail()
107 if (drive->media == ide_tape) in ide_queue_pc_tail()
109 blk_execute_rq(drive->queue, disk, rq, 0); in ide_queue_pc_tail()
117 int ide_do_test_unit_ready(ide_drive_t *drive, struct gendisk *disk) in ide_do_test_unit_ready() argument
124 return ide_queue_pc_tail(drive, disk, &pc, NULL, 0); in ide_do_test_unit_ready()
128 int ide_do_start_stop(ide_drive_t *drive, struct gendisk *disk, int start) in ide_do_start_stop() argument
136 if (drive->media == ide_tape) in ide_do_start_stop()
139 return ide_queue_pc_tail(drive, disk, &pc, NULL, 0); in ide_do_start_stop()
143 int ide_set_media_lock(ide_drive_t *drive, struct gendisk *disk, int on) in ide_set_media_lock() argument
147 if ((drive->dev_flags & IDE_DFLAG_DOORLOCKING) == 0) in ide_set_media_lock()
154 return ide_queue_pc_tail(drive, disk, &pc, NULL, 0); in ide_set_media_lock()
158 void ide_create_request_sense_cmd(ide_drive_t *drive, struct ide_atapi_pc *pc) in ide_create_request_sense_cmd() argument
162 if (drive->media == ide_floppy) { in ide_create_request_sense_cmd()
172 void ide_prep_sense(ide_drive_t *drive, struct request *rq) in ide_prep_sense() argument
174 struct request_sense *sense = &drive->sense_data; in ide_prep_sense()
175 struct request *sense_rq = drive->sense_rq; in ide_prep_sense()
180 switch (drive->media) { in ide_prep_sense()
196 if (ata_sense_request(rq) || drive->sense_rq_armed) in ide_prep_sense()
204 err = blk_rq_map_kern(drive->queue, sense_rq, sense, sense_len, in ide_prep_sense()
209 "buffer\n", drive->name); in ide_prep_sense()
220 if (drive->media == ide_tape) in ide_prep_sense()
223 drive->sense_rq_armed = true; in ide_prep_sense()
227 int ide_queue_sense_rq(ide_drive_t *drive, void *special) in ide_queue_sense_rq() argument
230 if (!drive->sense_rq_armed) { in ide_queue_sense_rq()
232 drive->name); in ide_queue_sense_rq()
236 drive->sense_rq->special = special; in ide_queue_sense_rq()
237 drive->sense_rq_armed = false; in ide_queue_sense_rq()
239 drive->hwif->rq = NULL; in ide_queue_sense_rq()
241 elv_add_request(drive->queue, drive->sense_rq, ELEVATOR_INSERT_FRONT); in ide_queue_sense_rq()
251 void ide_retry_pc(ide_drive_t *drive) in ide_retry_pc() argument
253 struct request *failed_rq = drive->hwif->rq; in ide_retry_pc()
254 struct request *sense_rq = drive->sense_rq; in ide_retry_pc()
255 struct ide_atapi_pc *pc = &drive->request_sense_pc; in ide_retry_pc()
257 (void)ide_read_error(drive); in ide_retry_pc()
263 if (drive->media == ide_tape) in ide_retry_pc()
264 drive->atapi_flags |= IDE_AFLAG_IGNORE_DSC; in ide_retry_pc()
271 drive->hwif->rq = NULL; in ide_retry_pc()
272 ide_requeue_and_plug(drive, failed_rq); in ide_retry_pc()
273 if (ide_queue_sense_rq(drive, pc)) { in ide_retry_pc()
275 ide_complete_rq(drive, BLK_STS_IOERR, blk_rq_bytes(failed_rq)); in ide_retry_pc()
280 int ide_cd_expiry(ide_drive_t *drive) in ide_cd_expiry() argument
282 struct request *rq = drive->hwif->rq; in ide_cd_expiry()
333 void ide_read_bcount_and_ireason(ide_drive_t *drive, u16 *bcount, u8 *ireason) in ide_read_bcount_and_ireason() argument
337 drive->hwif->tp_ops->tf_read(drive, &tf, IDE_VALID_NSECT | in ide_read_bcount_and_ireason()
353 int ide_check_ireason(ide_drive_t *drive, struct request *rq, int len, in ide_check_ireason() argument
356 ide_hwif_t *hwif = drive->hwif; in ide_check_ireason()
364 drive->name, __func__); in ide_check_ireason()
366 if (dev_is_idecd(drive)) in ide_check_ireason()
367 ide_pad_transfer(drive, rw, len); in ide_check_ireason()
369 if (dev_is_idecd(drive)) { in ide_check_ireason()
379 printk(KERN_ERR PFX "%s: CoD != 0 in %s\n", drive->name, in ide_check_ireason()
382 /* drive wants a command packet, or invalid ireason... */ in ide_check_ireason()
384 drive->name, __func__, ireason); in ide_check_ireason()
387 if (dev_is_idecd(drive) && ata_pc_request(rq)) in ide_check_ireason()
396 * command. We will transfer some of the data (as requested by the drive)
399 static ide_startstop_t ide_pc_intr(ide_drive_t *drive) in ide_pc_intr() argument
401 struct ide_atapi_pc *pc = drive->pc; in ide_pc_intr()
402 ide_hwif_t *hwif = drive->hwif; in ide_pc_intr()
413 timeout = (drive->media == ide_floppy) ? WAIT_FLOPPY_CMD in ide_pc_intr()
422 drive->waiting_for_dma = 0; in ide_pc_intr()
423 rc = hwif->dma_ops->dma_end(drive); in ide_pc_intr()
424 ide_dma_unmap_sg(drive, cmd); in ide_pc_intr()
426 if (rc || (drive->media == ide_tape && (stat & ATA_ERR))) { in ide_pc_intr()
427 if (drive->media == ide_floppy) in ide_pc_intr()
429 drive->name, rq_data_dir(pc->rq) in ide_pc_intr()
434 debug_log("%s: DMA finished\n", drive->name); in ide_pc_intr()
449 if (drive->media == ide_tape && in ide_pc_intr()
455 debug_log("%s: I/O error\n", drive->name); in ide_pc_intr()
457 if (drive->media != ide_tape) in ide_pc_intr()
462 "sense command\n", drive->name); in ide_pc_intr()
463 return ide_do_reset(drive); in ide_pc_intr()
469 ide_retry_pc(drive); in ide_pc_intr()
486 uptodate = drive->pc_callback(drive, dsc); in ide_pc_intr()
489 drive->failed_pc = NULL; in ide_pc_intr()
504 ide_complete_rq(drive, error, blk_rq_bytes(rq)); in ide_pc_intr()
511 "interrupts in DMA mode\n", drive->name); in ide_pc_intr()
512 ide_dma_off(drive); in ide_pc_intr()
513 return ide_do_reset(drive); in ide_pc_intr()
517 ide_read_bcount_and_ireason(drive, &bcount, &ireason); in ide_pc_intr()
519 if (ide_check_ireason(drive, rq, bcount, ireason, write)) in ide_pc_intr()
520 return ide_do_reset(drive); in ide_pc_intr()
523 ide_pio_bytes(drive, cmd, write, done); in ide_pc_intr()
531 ide_pad_transfer(drive, write, bcount); in ide_pc_intr()
537 ide_set_handler(drive, ide_pc_intr, timeout); in ide_pc_intr()
553 static u8 ide_read_ireason(ide_drive_t *drive) in ide_read_ireason() argument
557 drive->hwif->tp_ops->tf_read(drive, &tf, IDE_VALID_NSECT); in ide_read_ireason()
562 static u8 ide_wait_ireason(ide_drive_t *drive, u8 ireason) in ide_wait_ireason() argument
569 "a packet command, retrying\n", drive->name); in ide_wait_ireason()
571 ireason = ide_read_ireason(drive); in ide_wait_ireason()
575 drive->name); in ide_wait_ireason()
584 static int ide_delayed_transfer_pc(ide_drive_t *drive) in ide_delayed_transfer_pc() argument
587 drive->hwif->tp_ops->output_data(drive, NULL, drive->pc->c, 12); in ide_delayed_transfer_pc()
593 static ide_startstop_t ide_transfer_pc(ide_drive_t *drive) in ide_transfer_pc() argument
596 ide_hwif_t *hwif = drive->hwif; in ide_transfer_pc()
604 if (ide_wait_stat(&startstop, drive, ATA_DRQ, ATA_BUSY, WAIT_READY)) { in ide_transfer_pc()
606 "DRQ isn't asserted\n", drive->name); in ide_transfer_pc()
610 if (drive->atapi_flags & IDE_AFLAG_DRQ_INTERRUPT) { in ide_transfer_pc()
611 if (drive->dma) in ide_transfer_pc()
612 drive->waiting_for_dma = 1; in ide_transfer_pc()
615 if (dev_is_idecd(drive)) { in ide_transfer_pc()
624 pc = drive->pc; in ide_transfer_pc()
633 if (drive->atapi_flags & IDE_AFLAG_ZIP_DRIVE) { in ide_transfer_pc()
634 timeout = drive->pc_delay; in ide_transfer_pc()
637 timeout = (drive->media == ide_floppy) ? WAIT_FLOPPY_CMD in ide_transfer_pc()
642 ireason = ide_read_ireason(drive); in ide_transfer_pc()
643 if (drive->media == ide_tape) in ide_transfer_pc()
644 ireason = ide_wait_ireason(drive, ireason); in ide_transfer_pc()
648 "issuing a packet command\n", drive->name); in ide_transfer_pc()
650 return ide_do_reset(drive); in ide_transfer_pc()
657 ide_set_handler(drive, in ide_transfer_pc()
658 (dev_is_idecd(drive) ? drive->irq_handler in ide_transfer_pc()
663 if ((drive->atapi_flags & IDE_AFLAG_ZIP_DRIVE) == 0) in ide_transfer_pc()
664 hwif->tp_ops->output_data(drive, NULL, scsi_req(rq)->cmd, cmd_len); in ide_transfer_pc()
667 if (dev_is_idecd(drive)) { in ide_transfer_pc()
668 if (drive->dma) in ide_transfer_pc()
669 hwif->dma_ops->dma_start(drive); in ide_transfer_pc()
673 hwif->dma_ops->dma_start(drive); in ide_transfer_pc()
680 ide_startstop_t ide_issue_pc(ide_drive_t *drive, struct ide_cmd *cmd) in ide_issue_pc() argument
683 ide_hwif_t *hwif = drive->hwif; in ide_issue_pc()
689 u8 drq_int = !!(drive->atapi_flags & IDE_AFLAG_DRQ_INTERRUPT); in ide_issue_pc()
691 if (dev_is_idecd(drive)) { in ide_issue_pc()
697 if (drive->dma) in ide_issue_pc()
698 drive->dma = !ide_dma_prepare(drive, cmd); in ide_issue_pc()
700 pc = drive->pc; in ide_issue_pc()
704 bcount = ((drive->media == ide_tape) ? bytes in ide_issue_pc()
713 ide_dma_off(drive); in ide_issue_pc()
717 drive->dma = !ide_dma_prepare(drive, cmd); in ide_issue_pc()
719 if (!drive->dma) in ide_issue_pc()
722 timeout = (drive->media == ide_floppy) ? WAIT_FLOPPY_CMD in ide_issue_pc()
726 ide_init_packet_cmd(cmd, valid_tf, bcount, drive->dma); in ide_issue_pc()
728 (void)do_rw_taskfile(drive, cmd); in ide_issue_pc()
731 if (drive->dma) in ide_issue_pc()
732 drive->waiting_for_dma = 0; in ide_issue_pc()
736 ide_execute_command(drive, cmd, ide_transfer_pc, timeout); in ide_issue_pc()
738 return drq_int ? ide_started : ide_transfer_pc(drive); in ide_issue_pc()