Lines Matching refs:cmd

27 void ide_tf_readback(ide_drive_t *drive, struct ide_cmd *cmd)
35 tp_ops->tf_read(drive, &cmd->tf, cmd->valid.in.tf);
37 if (cmd->tf_flags & IDE_TFLAG_LBA48) {
40 tp_ops->tf_read(drive, &cmd->hob, cmd->valid.in.hob);
44 void ide_tf_dump(const char *s, struct ide_cmd *cmd)
48 "lbam 0x%02x lbah 0x%02x dev 0x%02x cmd 0x%02x\n",
49 s, cmd->tf.feature, cmd->tf.nsect,
50 cmd->tf.lbal, cmd->tf.lbam, cmd->tf.lbah,
51 cmd->tf.device, cmd->tf.command);
53 s, cmd->hob.nsect, cmd->hob.lbal, cmd->hob.lbam, cmd->hob.lbah);
59 struct ide_cmd cmd;
61 memset(&cmd, 0, sizeof(cmd));
62 cmd.tf.nsect = 0x01;
64 cmd.tf.command = ATA_CMD_ID_ATA;
66 cmd.tf.command = ATA_CMD_ID_ATAPI;
67 cmd.valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE;
68 cmd.valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE;
69 cmd.protocol = ATA_PROT_PIO;
71 return ide_raw_taskfile(drive, &cmd, buf, 1);
81 struct ide_cmd *cmd = &hwif->cmd;
82 struct ide_taskfile *tf = &cmd->tf;
97 memcpy(cmd, orig_cmd, sizeof(*cmd));
99 if ((cmd->tf_flags & IDE_TFLAG_DMA_PIO_FALLBACK) == 0) {
100 ide_tf_dump(drive->name, cmd);
103 if (cmd->ftf_flags & IDE_FTFLAG_OUT_DATA) {
104 u8 data[2] = { cmd->tf.data, cmd->hob.data };
106 tp_ops->output_data(drive, cmd, data, 2);
109 if (cmd->valid.out.tf & IDE_VALID_DEVICE) {
110 u8 HIHI = (cmd->tf_flags & IDE_TFLAG_LBA48) ?
113 if (!(cmd->ftf_flags & IDE_FTFLAG_FLAGGED))
114 cmd->tf.device &= HIHI;
115 cmd->tf.device |= drive->select;
118 tp_ops->tf_load(drive, &cmd->hob, cmd->valid.out.hob);
119 tp_ops->tf_load(drive, &cmd->tf, cmd->valid.out.tf);
122 switch (cmd->protocol) {
124 if (cmd->tf_flags & IDE_TFLAG_WRITE) {
127 return pre_task_out_intr(drive, cmd);
134 ide_execute_command(drive, cmd, handler, WAIT_WORSTCASE);
137 if (ide_dma_prepare(drive, cmd))
140 ide_execute_command(drive, cmd, ide_dma_intr, 2 * WAIT_CMD);
151 struct ide_cmd *cmd = &hwif->cmd;
152 struct ide_taskfile *tf = &cmd->tf;
153 int custom = (cmd->tf_flags & IDE_TFLAG_CUSTOM_HANDLER) ? 1 : 0;
192 ide_finish_cmd(drive, cmd, stat);
223 void ide_pio_bytes(ide_drive_t *drive, struct ide_cmd *cmd,
228 struct scatterlist *cursg = cmd->cursg;
234 cursg = cmd->cursg;
236 cursg = cmd->cursg = sg;
239 unsigned nr_bytes = min(len, cursg->length - cmd->cursg_ofs);
243 offset = cursg->offset + cmd->cursg_ofs;
257 cmd->nleft -= nr_bytes;
258 cmd->cursg_ofs += nr_bytes;
260 if (cmd->cursg_ofs == cursg->length) {
261 cursg = cmd->cursg = sg_next(cmd->cursg);
262 cmd->cursg_ofs = 0;
267 hwif->tp_ops->output_data(drive, cmd, buf, nr_bytes);
269 hwif->tp_ops->input_data(drive, cmd, buf, nr_bytes);
281 static void ide_pio_datablock(ide_drive_t *drive, struct ide_cmd *cmd,
288 if (cmd->tf_flags & IDE_TFLAG_FS)
289 cmd->rq->errors = 0;
291 if (cmd->tf_flags & IDE_TFLAG_IO_16BIT)
296 if (cmd->tf_flags & IDE_TFLAG_MULTI_PIO)
297 nr_bytes = min_t(unsigned, cmd->nleft, drive->mult_count << 9);
301 ide_pio_bytes(drive, cmd, write, nr_bytes);
306 static void ide_error_cmd(ide_drive_t *drive, struct ide_cmd *cmd)
308 if (cmd->tf_flags & IDE_TFLAG_FS) {
309 int nr_bytes = cmd->nbytes - cmd->nleft;
311 if (cmd->protocol == ATA_PROT_PIO &&
312 ((cmd->tf_flags & IDE_TFLAG_WRITE) || cmd->nleft == 0)) {
313 if (cmd->tf_flags & IDE_TFLAG_MULTI_PIO)
324 void ide_finish_cmd(ide_drive_t *drive, struct ide_cmd *cmd, u8 stat)
327 u8 err = ide_read_error(drive), nsect = cmd->tf.nsect;
328 u8 set_xfer = !!(cmd->tf_flags & IDE_TFLAG_SET_XFER);
330 ide_complete_cmd(drive, cmd, stat, err);
347 struct ide_cmd *cmd = &drive->hwif->cmd;
349 u8 write = !!(cmd->tf_flags & IDE_TFLAG_WRITE);
370 if (((stat & ATA_DRQ) == 0) ^ (cmd->nleft == 0))
374 if (write && cmd->nleft == 0)
378 ide_pio_datablock(drive, cmd, write);
381 if (write == 0 && cmd->nleft == 0) {
393 if ((cmd->tf_flags & IDE_TFLAG_FS) == 0)
394 ide_finish_cmd(drive, cmd, stat);
396 ide_complete_rq(drive, 0, blk_rq_sectors(cmd->rq) << 9);
399 ide_error_cmd(drive, cmd);
404 struct ide_cmd *cmd)
411 (cmd->tf_flags & IDE_TFLAG_MULTI_PIO) ? "MULT" : "",
421 ide_pio_datablock(drive, cmd, 1);
426 int ide_raw_taskfile(ide_drive_t *drive, struct ide_cmd *cmd, u8 *buf,
431 int rw = !(cmd->tf_flags & IDE_TFLAG_WRITE) ? READ : WRITE;
449 rq->special = cmd;
450 cmd->rq = rq;
460 int ide_no_data_taskfile(ide_drive_t *drive, struct ide_cmd *cmd)
462 cmd->protocol = ATA_PROT_NODATA;
464 return ide_raw_taskfile(drive, cmd, NULL, 0);
472 struct ide_cmd cmd;
521 memset(&cmd, 0, sizeof(cmd));
523 memcpy(&cmd.hob, req_task->hob_ports, HDIO_DRIVE_HOB_HDR_SIZE - 2);
524 memcpy(&cmd.tf, req_task->io_ports, HDIO_DRIVE_TASK_HDR_SIZE);
526 cmd.valid.out.tf = IDE_VALID_DEVICE;
527 cmd.valid.in.tf = IDE_VALID_DEVICE | IDE_VALID_IN_TF;
528 cmd.tf_flags = IDE_TFLAG_IO_16BIT;
531 cmd.tf_flags |= IDE_TFLAG_LBA48;
532 cmd.valid.in.hob = IDE_VALID_IN_HOB;
536 cmd.ftf_flags |= IDE_FTFLAG_FLAGGED;
539 cmd.ftf_flags |= IDE_FTFLAG_OUT_DATA;
542 cmd.valid.out.hob |= IDE_VALID_NSECT;
544 cmd.valid.out.hob |= IDE_VALID_LBAL;
546 cmd.valid.out.hob |= IDE_VALID_LBAM;
548 cmd.valid.out.hob |= IDE_VALID_LBAH;
551 cmd.valid.out.tf |= IDE_VALID_FEATURE;
553 cmd.valid.out.tf |= IDE_VALID_NSECT;
555 cmd.valid.out.tf |= IDE_VALID_LBAL;
557 cmd.valid.out.tf |= IDE_VALID_LBAM;
559 cmd.valid.out.tf |= IDE_VALID_LBAH;
561 cmd.valid.out.tf |= IDE_VALID_OUT_TF;
562 if (cmd.tf_flags & IDE_TFLAG_LBA48)
563 cmd.valid.out.hob |= IDE_VALID_OUT_HOB;
567 cmd.ftf_flags |= IDE_FTFLAG_IN_DATA;
573 cmd.tf_flags |= IDE_TFLAG_WRITE;
576 cmd.protocol = ATA_PROT_DMA;
587 cmd.tf_flags |= IDE_TFLAG_MULTI_PIO;
590 cmd.protocol = ATA_PROT_PIO;
594 cmd.tf_flags |= IDE_TFLAG_WRITE;
606 cmd.tf_flags |= IDE_TFLAG_MULTI_PIO;
609 cmd.protocol = ATA_PROT_PIO;
617 cmd.protocol = ATA_PROT_NODATA;
627 nsect = (cmd.hob.nsect << 8) | cmd.tf.nsect;
637 err = ide_raw_taskfile(drive, &cmd, data_buf, nsect);
639 memcpy(req_task->hob_ports, &cmd.hob, HDIO_DRIVE_HOB_HDR_SIZE - 2);
640 memcpy(req_task->io_ports, &cmd.tf, HDIO_DRIVE_TASK_HDR_SIZE);
642 if ((cmd.ftf_flags & IDE_FTFLAG_SET_IN_FLAGS) &&