Lines Matching refs:drive
27 void ide_tf_readback(ide_drive_t *drive, struct ide_cmd *cmd) in ide_tf_readback() argument
29 ide_hwif_t *hwif = drive->hwif; in ide_tf_readback()
35 tp_ops->tf_read(drive, &cmd->tf, cmd->valid.in.tf); in ide_tf_readback()
40 tp_ops->tf_read(drive, &cmd->hob, cmd->valid.in.hob); in ide_tf_readback()
57 int taskfile_lib_get_identify(ide_drive_t *drive, u8 *buf) in taskfile_lib_get_identify() argument
63 if (drive->media == ide_disk) in taskfile_lib_get_identify()
71 return ide_raw_taskfile(drive, &cmd, buf, 1); in taskfile_lib_get_identify()
78 ide_startstop_t do_rw_taskfile(ide_drive_t *drive, struct ide_cmd *orig_cmd) in do_rw_taskfile() argument
80 ide_hwif_t *hwif = drive->hwif; in do_rw_taskfile()
89 drive->mult_count == 0) { in do_rw_taskfile()
90 pr_err("%s: multimode not set!\n", drive->name); in do_rw_taskfile()
100 ide_tf_dump(drive->name, cmd); in do_rw_taskfile()
106 tp_ops->output_data(drive, cmd, data, 2); in do_rw_taskfile()
115 cmd->tf.device |= drive->select; in do_rw_taskfile()
118 tp_ops->tf_load(drive, &cmd->hob, cmd->valid.out.hob); in do_rw_taskfile()
119 tp_ops->tf_load(drive, &cmd->tf, cmd->valid.out.tf); in do_rw_taskfile()
127 return pre_task_out_intr(drive, cmd); in do_rw_taskfile()
134 ide_execute_command(drive, cmd, handler, WAIT_WORSTCASE); in do_rw_taskfile()
137 if (ide_dma_prepare(drive, cmd)) in do_rw_taskfile()
140 ide_execute_command(drive, cmd, ide_dma_intr, 2 * WAIT_CMD); in do_rw_taskfile()
141 dma_ops->dma_start(drive); in do_rw_taskfile()
148 static ide_startstop_t task_no_data_intr(ide_drive_t *drive) in task_no_data_intr() argument
150 ide_hwif_t *hwif = drive->hwif; in task_no_data_intr()
168 drive->mult_req = drive->mult_count = 0; in task_no_data_intr()
169 drive->special_flags |= IDE_SFLAG_RECALIBRATE; in task_no_data_intr()
170 (void)ide_dump_status(drive, __func__, stat); in task_no_data_intr()
174 ide_set_handler(drive, &task_no_data_intr, in task_no_data_intr()
179 return ide_error(drive, "task_no_data_intr", stat); in task_no_data_intr()
183 drive->mult_count = drive->mult_req; in task_no_data_intr()
190 ide_complete_pm_rq(drive, rq); in task_no_data_intr()
192 ide_finish_cmd(drive, cmd, stat); in task_no_data_intr()
198 static u8 wait_drive_not_busy(ide_drive_t *drive) in wait_drive_not_busy() argument
200 ide_hwif_t *hwif = drive->hwif; in wait_drive_not_busy()
218 pr_err("%s: drive still BUSY!\n", drive->name); in wait_drive_not_busy()
223 void ide_pio_bytes(ide_drive_t *drive, struct ide_cmd *cmd, in ide_pio_bytes() argument
226 ide_hwif_t *hwif = drive->hwif; in ide_pio_bytes()
267 hwif->tp_ops->output_data(drive, cmd, buf, nr_bytes); in ide_pio_bytes()
269 hwif->tp_ops->input_data(drive, cmd, buf, nr_bytes); in ide_pio_bytes()
281 static void ide_pio_datablock(ide_drive_t *drive, struct ide_cmd *cmd, in ide_pio_datablock() argument
286 u8 saved_io_32bit = drive->io_32bit; in ide_pio_datablock()
292 drive->io_32bit = 0; in ide_pio_datablock()
297 nr_bytes = min_t(unsigned, cmd->nleft, drive->mult_count << 9); in ide_pio_datablock()
301 ide_pio_bytes(drive, cmd, write, nr_bytes); in ide_pio_datablock()
303 drive->io_32bit = saved_io_32bit; in ide_pio_datablock()
306 static void ide_error_cmd(ide_drive_t *drive, struct ide_cmd *cmd) in ide_error_cmd() argument
314 nr_bytes -= drive->mult_count << 9; in ide_error_cmd()
320 ide_complete_rq(drive, 0, nr_bytes); in ide_error_cmd()
324 void ide_finish_cmd(ide_drive_t *drive, struct ide_cmd *cmd, u8 stat) in ide_finish_cmd() argument
326 struct request *rq = drive->hwif->rq; in ide_finish_cmd()
327 u8 err = ide_read_error(drive), nsect = cmd->tf.nsect; in ide_finish_cmd()
330 ide_complete_cmd(drive, cmd, stat, err); in ide_finish_cmd()
334 ide_set_xfer_rate(drive, nsect); in ide_finish_cmd()
335 ide_driveid_update(drive); in ide_finish_cmd()
338 ide_complete_rq(drive, err ? -EIO : 0, blk_rq_bytes(rq)); in ide_finish_cmd()
344 static ide_startstop_t task_pio_intr(ide_drive_t *drive) in task_pio_intr() argument
346 ide_hwif_t *hwif = drive->hwif; in task_pio_intr()
347 struct ide_cmd *cmd = &drive->hwif->cmd; in task_pio_intr()
366 if (!OK_STAT(stat, DRIVE_READY, drive->bad_wstat)) in task_pio_intr()
378 ide_pio_datablock(drive, cmd, write); in task_pio_intr()
382 stat = wait_drive_not_busy(drive); in task_pio_intr()
390 ide_set_handler(drive, &task_pio_intr, WAIT_WORSTCASE); in task_pio_intr()
394 ide_finish_cmd(drive, cmd, stat); in task_pio_intr()
396 ide_complete_rq(drive, 0, blk_rq_sectors(cmd->rq) << 9); in task_pio_intr()
399 ide_error_cmd(drive, cmd); in task_pio_intr()
400 return ide_error(drive, __func__, stat); in task_pio_intr()
403 static ide_startstop_t pre_task_out_intr(ide_drive_t *drive, in pre_task_out_intr() argument
408 if (ide_wait_stat(&startstop, drive, ATA_DRQ, in pre_task_out_intr()
409 drive->bad_wstat, WAIT_DRQ)) { in pre_task_out_intr()
410 pr_err("%s: no DRQ after issuing %sWRITE%s\n", drive->name, in pre_task_out_intr()
412 (drive->dev_flags & IDE_DFLAG_LBA48) ? "_EXT" : ""); in pre_task_out_intr()
416 if ((drive->dev_flags & IDE_DFLAG_UNMASK) == 0) in pre_task_out_intr()
419 ide_set_handler(drive, &task_pio_intr, WAIT_WORSTCASE); in pre_task_out_intr()
421 ide_pio_datablock(drive, cmd, 1); in pre_task_out_intr()
426 int ide_raw_taskfile(ide_drive_t *drive, struct ide_cmd *cmd, u8 *buf, in ide_raw_taskfile() argument
433 rq = blk_get_request(drive->queue, rw, __GFP_WAIT); in ide_raw_taskfile()
443 error = blk_rq_map_kern(drive->queue, rq, buf, in ide_raw_taskfile()
452 error = blk_execute_rq(drive->queue, NULL, rq, 0); in ide_raw_taskfile()
460 int ide_no_data_taskfile(ide_drive_t *drive, struct ide_cmd *cmd) in ide_no_data_taskfile() argument
464 return ide_raw_taskfile(drive, cmd, NULL, 0); in ide_no_data_taskfile()
469 int ide_taskfile_ioctl(ide_drive_t *drive, unsigned long arg) in ide_taskfile_ioctl() argument
530 if (drive->dev_flags & IDE_DFLAG_LBA48) { in ide_taskfile_ioctl()
580 if (!drive->mult_count) { in ide_taskfile_ioctl()
583 drive->name, __func__); in ide_taskfile_ioctl()
599 if (!drive->mult_count) { in ide_taskfile_ioctl()
602 drive->name, __func__); in ide_taskfile_ioctl()
631 drive->name); in ide_taskfile_ioctl()
637 err = ide_raw_taskfile(drive, &cmd, data_buf, nsect); in ide_taskfile_ioctl()
645 if (drive->dev_flags & IDE_DFLAG_LBA48) in ide_taskfile_ioctl()