Lines Matching refs:cmd
29 void ide_tf_readback(ide_drive_t *drive, struct ide_cmd *cmd) in ide_tf_readback() argument
37 tp_ops->tf_read(drive, &cmd->tf, cmd->valid.in.tf); in ide_tf_readback()
39 if (cmd->tf_flags & IDE_TFLAG_LBA48) { in ide_tf_readback()
42 tp_ops->tf_read(drive, &cmd->hob, cmd->valid.in.hob); in ide_tf_readback()
46 void ide_tf_dump(const char *s, struct ide_cmd *cmd) in ide_tf_dump() argument
51 s, cmd->tf.feature, cmd->tf.nsect, in ide_tf_dump()
52 cmd->tf.lbal, cmd->tf.lbam, cmd->tf.lbah, in ide_tf_dump()
53 cmd->tf.device, cmd->tf.command); in ide_tf_dump()
55 s, cmd->hob.nsect, cmd->hob.lbal, cmd->hob.lbam, cmd->hob.lbah); in ide_tf_dump()
61 struct ide_cmd cmd; in taskfile_lib_get_identify() local
63 memset(&cmd, 0, sizeof(cmd)); in taskfile_lib_get_identify()
64 cmd.tf.nsect = 0x01; in taskfile_lib_get_identify()
66 cmd.tf.command = ATA_CMD_ID_ATA; in taskfile_lib_get_identify()
68 cmd.tf.command = ATA_CMD_ID_ATAPI; in taskfile_lib_get_identify()
69 cmd.valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE; in taskfile_lib_get_identify()
70 cmd.valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE; in taskfile_lib_get_identify()
71 cmd.protocol = ATA_PROT_PIO; in taskfile_lib_get_identify()
73 return ide_raw_taskfile(drive, &cmd, buf, 1); in taskfile_lib_get_identify()
83 struct ide_cmd *cmd = &hwif->cmd; in do_rw_taskfile() local
84 struct ide_taskfile *tf = &cmd->tf; in do_rw_taskfile()
99 memcpy(cmd, orig_cmd, sizeof(*cmd)); in do_rw_taskfile()
101 if ((cmd->tf_flags & IDE_TFLAG_DMA_PIO_FALLBACK) == 0) { in do_rw_taskfile()
102 ide_tf_dump(drive->name, cmd); in do_rw_taskfile()
105 if (cmd->ftf_flags & IDE_FTFLAG_OUT_DATA) { in do_rw_taskfile()
106 u8 data[2] = { cmd->tf.data, cmd->hob.data }; in do_rw_taskfile()
108 tp_ops->output_data(drive, cmd, data, 2); in do_rw_taskfile()
111 if (cmd->valid.out.tf & IDE_VALID_DEVICE) { in do_rw_taskfile()
112 u8 HIHI = (cmd->tf_flags & IDE_TFLAG_LBA48) ? in do_rw_taskfile()
115 if (!(cmd->ftf_flags & IDE_FTFLAG_FLAGGED)) in do_rw_taskfile()
116 cmd->tf.device &= HIHI; in do_rw_taskfile()
117 cmd->tf.device |= drive->select; in do_rw_taskfile()
120 tp_ops->tf_load(drive, &cmd->hob, cmd->valid.out.hob); in do_rw_taskfile()
121 tp_ops->tf_load(drive, &cmd->tf, cmd->valid.out.tf); in do_rw_taskfile()
124 switch (cmd->protocol) { in do_rw_taskfile()
126 if (cmd->tf_flags & IDE_TFLAG_WRITE) { in do_rw_taskfile()
129 return pre_task_out_intr(drive, cmd); in do_rw_taskfile()
136 ide_execute_command(drive, cmd, handler, WAIT_WORSTCASE); in do_rw_taskfile()
139 if (ide_dma_prepare(drive, cmd)) in do_rw_taskfile()
142 ide_execute_command(drive, cmd, ide_dma_intr, 2 * WAIT_CMD); in do_rw_taskfile()
154 struct ide_cmd *cmd = &hwif->cmd; in task_no_data_intr() local
155 struct ide_taskfile *tf = &cmd->tf; in task_no_data_intr()
156 int custom = (cmd->tf_flags & IDE_TFLAG_CUSTOM_HANDLER) ? 1 : 0; in task_no_data_intr()
195 ide_finish_cmd(drive, cmd, stat); in task_no_data_intr()
226 void ide_pio_bytes(ide_drive_t *drive, struct ide_cmd *cmd, in ide_pio_bytes() argument
231 struct scatterlist *cursg = cmd->cursg; in ide_pio_bytes()
238 cursg = cmd->cursg = sg; in ide_pio_bytes()
241 unsigned nr_bytes = min(len, cursg->length - cmd->cursg_ofs); in ide_pio_bytes()
244 offset = cursg->offset + cmd->cursg_ofs; in ide_pio_bytes()
254 cmd->nleft -= nr_bytes; in ide_pio_bytes()
255 cmd->cursg_ofs += nr_bytes; in ide_pio_bytes()
257 if (cmd->cursg_ofs == cursg->length) { in ide_pio_bytes()
258 cursg = cmd->cursg = sg_next(cmd->cursg); in ide_pio_bytes()
259 cmd->cursg_ofs = 0; in ide_pio_bytes()
264 hwif->tp_ops->output_data(drive, cmd, buf, nr_bytes); in ide_pio_bytes()
266 hwif->tp_ops->input_data(drive, cmd, buf, nr_bytes); in ide_pio_bytes()
275 static void ide_pio_datablock(ide_drive_t *drive, struct ide_cmd *cmd, in ide_pio_datablock() argument
282 if (cmd->tf_flags & IDE_TFLAG_FS) in ide_pio_datablock()
283 scsi_req(cmd->rq)->result = 0; in ide_pio_datablock()
285 if (cmd->tf_flags & IDE_TFLAG_IO_16BIT) in ide_pio_datablock()
290 if (cmd->tf_flags & IDE_TFLAG_MULTI_PIO) in ide_pio_datablock()
291 nr_bytes = min_t(unsigned, cmd->nleft, drive->mult_count << 9); in ide_pio_datablock()
295 ide_pio_bytes(drive, cmd, write, nr_bytes); in ide_pio_datablock()
300 static void ide_error_cmd(ide_drive_t *drive, struct ide_cmd *cmd) in ide_error_cmd() argument
302 if (cmd->tf_flags & IDE_TFLAG_FS) { in ide_error_cmd()
303 int nr_bytes = cmd->nbytes - cmd->nleft; in ide_error_cmd()
305 if (cmd->protocol == ATA_PROT_PIO && in ide_error_cmd()
306 ((cmd->tf_flags & IDE_TFLAG_WRITE) || cmd->nleft == 0)) { in ide_error_cmd()
307 if (cmd->tf_flags & IDE_TFLAG_MULTI_PIO) in ide_error_cmd()
318 void ide_finish_cmd(ide_drive_t *drive, struct ide_cmd *cmd, u8 stat) in ide_finish_cmd() argument
321 u8 err = ide_read_error(drive), nsect = cmd->tf.nsect; in ide_finish_cmd()
322 u8 set_xfer = !!(cmd->tf_flags & IDE_TFLAG_SET_XFER); in ide_finish_cmd()
324 ide_complete_cmd(drive, cmd, stat, err); in ide_finish_cmd()
341 struct ide_cmd *cmd = &drive->hwif->cmd; in task_pio_intr() local
343 u8 write = !!(cmd->tf_flags & IDE_TFLAG_WRITE); in task_pio_intr()
364 if (((stat & ATA_DRQ) == 0) ^ (cmd->nleft == 0)) in task_pio_intr()
368 if (write && cmd->nleft == 0) in task_pio_intr()
372 ide_pio_datablock(drive, cmd, write); in task_pio_intr()
375 if (write == 0 && cmd->nleft == 0) { in task_pio_intr()
387 if ((cmd->tf_flags & IDE_TFLAG_FS) == 0) in task_pio_intr()
388 ide_finish_cmd(drive, cmd, stat); in task_pio_intr()
390 ide_complete_rq(drive, BLK_STS_OK, blk_rq_sectors(cmd->rq) << 9); in task_pio_intr()
393 ide_error_cmd(drive, cmd); in task_pio_intr()
398 struct ide_cmd *cmd) in pre_task_out_intr() argument
405 (cmd->tf_flags & IDE_TFLAG_MULTI_PIO) ? "MULT" : "", in pre_task_out_intr()
415 ide_pio_datablock(drive, cmd, 1); in pre_task_out_intr()
420 int ide_raw_taskfile(ide_drive_t *drive, struct ide_cmd *cmd, u8 *buf, in ide_raw_taskfile() argument
427 (cmd->tf_flags & IDE_TFLAG_WRITE) ? in ide_raw_taskfile()
444 ide_req(rq)->special = cmd; in ide_raw_taskfile()
445 cmd->rq = rq; in ide_raw_taskfile()
455 int ide_no_data_taskfile(ide_drive_t *drive, struct ide_cmd *cmd) in ide_no_data_taskfile() argument
457 cmd->protocol = ATA_PROT_NODATA; in ide_no_data_taskfile()
459 return ide_raw_taskfile(drive, cmd, NULL, 0); in ide_no_data_taskfile()
467 struct ide_cmd cmd; in ide_taskfile_ioctl() local
516 memset(&cmd, 0, sizeof(cmd)); in ide_taskfile_ioctl()
518 memcpy(&cmd.hob, req_task->hob_ports, HDIO_DRIVE_HOB_HDR_SIZE - 2); in ide_taskfile_ioctl()
519 memcpy(&cmd.tf, req_task->io_ports, HDIO_DRIVE_TASK_HDR_SIZE); in ide_taskfile_ioctl()
521 cmd.valid.out.tf = IDE_VALID_DEVICE; in ide_taskfile_ioctl()
522 cmd.valid.in.tf = IDE_VALID_DEVICE | IDE_VALID_IN_TF; in ide_taskfile_ioctl()
523 cmd.tf_flags = IDE_TFLAG_IO_16BIT; in ide_taskfile_ioctl()
526 cmd.tf_flags |= IDE_TFLAG_LBA48; in ide_taskfile_ioctl()
527 cmd.valid.in.hob = IDE_VALID_IN_HOB; in ide_taskfile_ioctl()
531 cmd.ftf_flags |= IDE_FTFLAG_FLAGGED; in ide_taskfile_ioctl()
534 cmd.ftf_flags |= IDE_FTFLAG_OUT_DATA; in ide_taskfile_ioctl()
537 cmd.valid.out.hob |= IDE_VALID_NSECT; in ide_taskfile_ioctl()
539 cmd.valid.out.hob |= IDE_VALID_LBAL; in ide_taskfile_ioctl()
541 cmd.valid.out.hob |= IDE_VALID_LBAM; in ide_taskfile_ioctl()
543 cmd.valid.out.hob |= IDE_VALID_LBAH; in ide_taskfile_ioctl()
546 cmd.valid.out.tf |= IDE_VALID_FEATURE; in ide_taskfile_ioctl()
548 cmd.valid.out.tf |= IDE_VALID_NSECT; in ide_taskfile_ioctl()
550 cmd.valid.out.tf |= IDE_VALID_LBAL; in ide_taskfile_ioctl()
552 cmd.valid.out.tf |= IDE_VALID_LBAM; in ide_taskfile_ioctl()
554 cmd.valid.out.tf |= IDE_VALID_LBAH; in ide_taskfile_ioctl()
556 cmd.valid.out.tf |= IDE_VALID_OUT_TF; in ide_taskfile_ioctl()
557 if (cmd.tf_flags & IDE_TFLAG_LBA48) in ide_taskfile_ioctl()
558 cmd.valid.out.hob |= IDE_VALID_OUT_HOB; in ide_taskfile_ioctl()
562 cmd.ftf_flags |= IDE_FTFLAG_IN_DATA; in ide_taskfile_ioctl()
568 cmd.tf_flags |= IDE_TFLAG_WRITE; in ide_taskfile_ioctl()
571 cmd.protocol = ATA_PROT_DMA; in ide_taskfile_ioctl()
582 cmd.tf_flags |= IDE_TFLAG_MULTI_PIO; in ide_taskfile_ioctl()
585 cmd.protocol = ATA_PROT_PIO; in ide_taskfile_ioctl()
589 cmd.tf_flags |= IDE_TFLAG_WRITE; in ide_taskfile_ioctl()
601 cmd.tf_flags |= IDE_TFLAG_MULTI_PIO; in ide_taskfile_ioctl()
604 cmd.protocol = ATA_PROT_PIO; in ide_taskfile_ioctl()
612 cmd.protocol = ATA_PROT_NODATA; in ide_taskfile_ioctl()
622 nsect = (cmd.hob.nsect << 8) | cmd.tf.nsect; in ide_taskfile_ioctl()
632 err = ide_raw_taskfile(drive, &cmd, data_buf, nsect); in ide_taskfile_ioctl()
634 memcpy(req_task->hob_ports, &cmd.hob, HDIO_DRIVE_HOB_HDR_SIZE - 2); in ide_taskfile_ioctl()
635 memcpy(req_task->io_ports, &cmd.tf, HDIO_DRIVE_TASK_HDR_SIZE); in ide_taskfile_ioctl()
637 if ((cmd.ftf_flags & IDE_FTFLAG_SET_IN_FLAGS) && in ide_taskfile_ioctl()