Lines Matching refs:cmd

29 void ide_tf_readback(ide_drive_t *drive, struct ide_cmd *cmd)
37 tp_ops->tf_read(drive, &cmd->tf, cmd->valid.in.tf);
39 if (cmd->tf_flags & IDE_TFLAG_LBA48) {
42 tp_ops->tf_read(drive, &cmd->hob, cmd->valid.in.hob);
46 void ide_tf_dump(const char *s, struct ide_cmd *cmd)
50 "lbam 0x%02x lbah 0x%02x dev 0x%02x cmd 0x%02x\n",
51 s, cmd->tf.feature, cmd->tf.nsect,
52 cmd->tf.lbal, cmd->tf.lbam, cmd->tf.lbah,
53 cmd->tf.device, cmd->tf.command);
55 s, cmd->hob.nsect, cmd->hob.lbal, cmd->hob.lbam, cmd->hob.lbah);
61 struct ide_cmd cmd;
63 memset(&cmd, 0, sizeof(cmd));
64 cmd.tf.nsect = 0x01;
66 cmd.tf.command = ATA_CMD_ID_ATA;
68 cmd.tf.command = ATA_CMD_ID_ATAPI;
69 cmd.valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE;
70 cmd.valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE;
71 cmd.protocol = ATA_PROT_PIO;
73 return ide_raw_taskfile(drive, &cmd, buf, 1);
83 struct ide_cmd *cmd = &hwif->cmd;
84 struct ide_taskfile *tf = &cmd->tf;
99 memcpy(cmd, orig_cmd, sizeof(*cmd));
101 if ((cmd->tf_flags & IDE_TFLAG_DMA_PIO_FALLBACK) == 0) {
102 ide_tf_dump(drive->name, cmd);
105 if (cmd->ftf_flags & IDE_FTFLAG_OUT_DATA) {
106 u8 data[2] = { cmd->tf.data, cmd->hob.data };
108 tp_ops->output_data(drive, cmd, data, 2);
111 if (cmd->valid.out.tf & IDE_VALID_DEVICE) {
112 u8 HIHI = (cmd->tf_flags & IDE_TFLAG_LBA48) ?
115 if (!(cmd->ftf_flags & IDE_FTFLAG_FLAGGED))
116 cmd->tf.device &= HIHI;
117 cmd->tf.device |= drive->select;
120 tp_ops->tf_load(drive, &cmd->hob, cmd->valid.out.hob);
121 tp_ops->tf_load(drive, &cmd->tf, cmd->valid.out.tf);
124 switch (cmd->protocol) {
126 if (cmd->tf_flags & IDE_TFLAG_WRITE) {
129 return pre_task_out_intr(drive, cmd);
136 ide_execute_command(drive, cmd, handler, WAIT_WORSTCASE);
139 if (ide_dma_prepare(drive, cmd))
142 ide_execute_command(drive, cmd, ide_dma_intr, 2 * WAIT_CMD);
154 struct ide_cmd *cmd = &hwif->cmd;
155 struct ide_taskfile *tf = &cmd->tf;
156 int custom = (cmd->tf_flags & IDE_TFLAG_CUSTOM_HANDLER) ? 1 : 0;
195 ide_finish_cmd(drive, cmd, stat);
226 void ide_pio_bytes(ide_drive_t *drive, struct ide_cmd *cmd,
231 struct scatterlist *cursg = cmd->cursg;
237 cursg = cmd->cursg = sg;
240 unsigned nr_bytes = min(len, cursg->length - cmd->cursg_ofs);
243 offset = cursg->offset + cmd->cursg_ofs;
253 cmd->nleft -= nr_bytes;
254 cmd->cursg_ofs += nr_bytes;
256 if (cmd->cursg_ofs == cursg->length) {
257 cursg = cmd->cursg = sg_next(cmd->cursg);
258 cmd->cursg_ofs = 0;
263 hwif->tp_ops->output_data(drive, cmd, buf, nr_bytes);
265 hwif->tp_ops->input_data(drive, cmd, buf, nr_bytes);
274 static void ide_pio_datablock(ide_drive_t *drive, struct ide_cmd *cmd,
281 if (cmd->tf_flags & IDE_TFLAG_FS)
282 scsi_req(cmd->rq)->result = 0;
284 if (cmd->tf_flags & IDE_TFLAG_IO_16BIT)
289 if (cmd->tf_flags & IDE_TFLAG_MULTI_PIO)
290 nr_bytes = min_t(unsigned, cmd->nleft, drive->mult_count << 9);
294 ide_pio_bytes(drive, cmd, write, nr_bytes);
299 static void ide_error_cmd(ide_drive_t *drive, struct ide_cmd *cmd)
301 if (cmd->tf_flags & IDE_TFLAG_FS) {
302 int nr_bytes = cmd->nbytes - cmd->nleft;
304 if (cmd->protocol == ATA_PROT_PIO &&
305 ((cmd->tf_flags & IDE_TFLAG_WRITE) || cmd->nleft == 0)) {
306 if (cmd->tf_flags & IDE_TFLAG_MULTI_PIO)
317 void ide_finish_cmd(ide_drive_t *drive, struct ide_cmd *cmd, u8 stat)
320 u8 err = ide_read_error(drive), nsect = cmd->tf.nsect;
321 u8 set_xfer = !!(cmd->tf_flags & IDE_TFLAG_SET_XFER);
323 ide_complete_cmd(drive, cmd, stat, err);
340 struct ide_cmd *cmd = &drive->hwif->cmd;
342 u8 write = !!(cmd->tf_flags & IDE_TFLAG_WRITE);
363 if (((stat & ATA_DRQ) == 0) ^ (cmd->nleft == 0))
367 if (write && cmd->nleft == 0)
371 ide_pio_datablock(drive, cmd, write);
374 if (write == 0 && cmd->nleft == 0) {
386 if ((cmd->tf_flags & IDE_TFLAG_FS) == 0)
387 ide_finish_cmd(drive, cmd, stat);
389 ide_complete_rq(drive, BLK_STS_OK, blk_rq_sectors(cmd->rq) << 9);
392 ide_error_cmd(drive, cmd);
397 struct ide_cmd *cmd)
404 (cmd->tf_flags & IDE_TFLAG_MULTI_PIO) ? "MULT" : "",
414 ide_pio_datablock(drive, cmd, 1);
419 int ide_raw_taskfile(ide_drive_t *drive, struct ide_cmd *cmd, u8 *buf,
426 (cmd->tf_flags & IDE_TFLAG_WRITE) ?
443 ide_req(rq)->special = cmd;
444 cmd->rq = rq;
454 int ide_no_data_taskfile(ide_drive_t *drive, struct ide_cmd *cmd)
456 cmd->protocol = ATA_PROT_NODATA;
458 return ide_raw_taskfile(drive, cmd, NULL, 0);
466 struct ide_cmd cmd;
515 memset(&cmd, 0, sizeof(cmd));
517 memcpy(&cmd.hob, req_task->hob_ports, HDIO_DRIVE_HOB_HDR_SIZE - 2);
518 memcpy(&cmd.tf, req_task->io_ports, HDIO_DRIVE_TASK_HDR_SIZE);
520 cmd.valid.out.tf = IDE_VALID_DEVICE;
521 cmd.valid.in.tf = IDE_VALID_DEVICE | IDE_VALID_IN_TF;
522 cmd.tf_flags = IDE_TFLAG_IO_16BIT;
525 cmd.tf_flags |= IDE_TFLAG_LBA48;
526 cmd.valid.in.hob = IDE_VALID_IN_HOB;
530 cmd.ftf_flags |= IDE_FTFLAG_FLAGGED;
533 cmd.ftf_flags |= IDE_FTFLAG_OUT_DATA;
536 cmd.valid.out.hob |= IDE_VALID_NSECT;
538 cmd.valid.out.hob |= IDE_VALID_LBAL;
540 cmd.valid.out.hob |= IDE_VALID_LBAM;
542 cmd.valid.out.hob |= IDE_VALID_LBAH;
545 cmd.valid.out.tf |= IDE_VALID_FEATURE;
547 cmd.valid.out.tf |= IDE_VALID_NSECT;
549 cmd.valid.out.tf |= IDE_VALID_LBAL;
551 cmd.valid.out.tf |= IDE_VALID_LBAM;
553 cmd.valid.out.tf |= IDE_VALID_LBAH;
555 cmd.valid.out.tf |= IDE_VALID_OUT_TF;
556 if (cmd.tf_flags & IDE_TFLAG_LBA48)
557 cmd.valid.out.hob |= IDE_VALID_OUT_HOB;
561 cmd.ftf_flags |= IDE_FTFLAG_IN_DATA;
567 cmd.tf_flags |= IDE_TFLAG_WRITE;
570 cmd.protocol = ATA_PROT_DMA;
581 cmd.tf_flags |= IDE_TFLAG_MULTI_PIO;
584 cmd.protocol = ATA_PROT_PIO;
588 cmd.tf_flags |= IDE_TFLAG_WRITE;
600 cmd.tf_flags |= IDE_TFLAG_MULTI_PIO;
603 cmd.protocol = ATA_PROT_PIO;
611 cmd.protocol = ATA_PROT_NODATA;
621 nsect = (cmd.hob.nsect << 8) | cmd.tf.nsect;
631 err = ide_raw_taskfile(drive, &cmd, data_buf, nsect);
633 memcpy(req_task->hob_ports, &cmd.hob, HDIO_DRIVE_HOB_HDR_SIZE - 2);
634 memcpy(req_task->io_ports, &cmd.tf, HDIO_DRIVE_TASK_HDR_SIZE);
636 if ((cmd.ftf_flags & IDE_FTFLAG_SET_IN_FLAGS) &&