Lines Matching +full:no +full:- +full:pc +full:- +full:write
1 // SPDX-License-Identifier: GPL-2.0-only
16 #define DRV_NAME "ide-atapi"
30 return drive->media == ide_cdrom || drive->media == ide_optical; in dev_is_idecd()
39 u16 *id = drive->id; in ide_check_atapi_device()
52 if (drive->media == ide_floppy && device_type == 5 && in ide_check_atapi_device()
53 !strstr((char *)&id[ATA_ID_PROD], "CD-ROM") && in ide_check_atapi_device()
60 s, drive->name, protocol); in ide_check_atapi_device()
61 else if ((drive->media == ide_floppy && device_type != 0) || in ide_check_atapi_device()
62 (drive->media == ide_tape && device_type != 1)) in ide_check_atapi_device()
64 s, drive->name, device_type); in ide_check_atapi_device()
67 s, drive->name); in ide_check_atapi_device()
68 else if (drive->media == ide_floppy && drq_type == 3) in ide_check_atapi_device()
70 "supported\n", s, drive->name, drq_type); in ide_check_atapi_device()
73 "bytes\n", s, drive->name, packet_size); in ide_check_atapi_device()
80 void ide_init_pc(struct ide_atapi_pc *pc) in ide_init_pc() argument
82 memset(pc, 0, sizeof(*pc)); in ide_init_pc()
91 struct ide_atapi_pc *pc, void *buf, unsigned int bufflen) in ide_queue_pc_tail() argument
96 rq = blk_get_request(drive->queue, REQ_OP_DRV_IN, 0); in ide_queue_pc_tail()
97 ide_req(rq)->type = ATA_PRIV_MISC; in ide_queue_pc_tail()
98 ide_req(rq)->special = pc; in ide_queue_pc_tail()
101 error = blk_rq_map_kern(drive->queue, rq, buf, bufflen, in ide_queue_pc_tail()
107 memcpy(scsi_req(rq)->cmd, pc->c, 12); in ide_queue_pc_tail()
108 if (drive->media == ide_tape) in ide_queue_pc_tail()
109 scsi_req(rq)->cmd[13] = REQ_IDETAPE_PC1; in ide_queue_pc_tail()
110 blk_execute_rq(drive->queue, disk, rq, 0); in ide_queue_pc_tail()
111 error = scsi_req(rq)->result ? -EIO : 0; in ide_queue_pc_tail()
120 struct ide_atapi_pc pc; in ide_do_test_unit_ready() local
122 ide_init_pc(&pc); in ide_do_test_unit_ready()
123 pc.c[0] = TEST_UNIT_READY; in ide_do_test_unit_ready()
125 return ide_queue_pc_tail(drive, disk, &pc, NULL, 0); in ide_do_test_unit_ready()
131 struct ide_atapi_pc pc; in ide_do_start_stop() local
133 ide_init_pc(&pc); in ide_do_start_stop()
134 pc.c[0] = START_STOP; in ide_do_start_stop()
135 pc.c[4] = start; in ide_do_start_stop()
137 if (drive->media == ide_tape) in ide_do_start_stop()
138 pc.flags |= PC_FLAG_WAIT_FOR_DSC; in ide_do_start_stop()
140 return ide_queue_pc_tail(drive, disk, &pc, NULL, 0); in ide_do_start_stop()
146 struct ide_atapi_pc pc; in ide_set_media_lock() local
148 if ((drive->dev_flags & IDE_DFLAG_DOORLOCKING) == 0) in ide_set_media_lock()
151 ide_init_pc(&pc); in ide_set_media_lock()
152 pc.c[0] = ALLOW_MEDIUM_REMOVAL; in ide_set_media_lock()
153 pc.c[4] = on; in ide_set_media_lock()
155 return ide_queue_pc_tail(drive, disk, &pc, NULL, 0); in ide_set_media_lock()
159 void ide_create_request_sense_cmd(ide_drive_t *drive, struct ide_atapi_pc *pc) in ide_create_request_sense_cmd() argument
161 ide_init_pc(pc); in ide_create_request_sense_cmd()
162 pc->c[0] = REQUEST_SENSE; in ide_create_request_sense_cmd()
163 if (drive->media == ide_floppy) { in ide_create_request_sense_cmd()
164 pc->c[4] = 255; in ide_create_request_sense_cmd()
165 pc->req_xfer = 18; in ide_create_request_sense_cmd()
167 pc->c[4] = 20; in ide_create_request_sense_cmd()
168 pc->req_xfer = 20; in ide_create_request_sense_cmd()
175 struct request_sense *sense = &drive->sense_data; in ide_prep_sense()
181 switch (drive->media) { in ide_prep_sense()
197 if (ata_sense_request(rq) || drive->sense_rq_armed) in ide_prep_sense()
200 sense_rq = drive->sense_rq; in ide_prep_sense()
202 sense_rq = blk_mq_alloc_request(drive->queue, REQ_OP_DRV_IN, in ide_prep_sense()
204 drive->sense_rq = sense_rq; in ide_prep_sense()
212 err = blk_rq_map_kern(drive->queue, sense_rq, sense, sense_len, in ide_prep_sense()
217 "buffer\n", drive->name); in ide_prep_sense()
219 drive->sense_rq = NULL; in ide_prep_sense()
223 sense_rq->rq_disk = rq->rq_disk; in ide_prep_sense()
224 sense_rq->cmd_flags = REQ_OP_DRV_IN; in ide_prep_sense()
225 ide_req(sense_rq)->type = ATA_PRIV_SENSE; in ide_prep_sense()
226 sense_rq->rq_flags |= RQF_PREEMPT; in ide_prep_sense()
228 req->cmd[0] = GPCMD_REQUEST_SENSE; in ide_prep_sense()
229 req->cmd[4] = cmd_len; in ide_prep_sense()
230 if (drive->media == ide_tape) in ide_prep_sense()
231 req->cmd[13] = REQ_IDETAPE_PC1; in ide_prep_sense()
233 drive->sense_rq_armed = true; in ide_prep_sense()
239 ide_hwif_t *hwif = drive->hwif; in ide_queue_sense_rq()
243 spin_lock_irqsave(&hwif->lock, flags); in ide_queue_sense_rq()
246 if (!drive->sense_rq_armed) { in ide_queue_sense_rq()
248 drive->name); in ide_queue_sense_rq()
249 spin_unlock_irqrestore(&hwif->lock, flags); in ide_queue_sense_rq()
250 return -ENOMEM; in ide_queue_sense_rq()
253 sense_rq = drive->sense_rq; in ide_queue_sense_rq()
254 ide_req(sense_rq)->special = special; in ide_queue_sense_rq()
255 drive->sense_rq_armed = false; in ide_queue_sense_rq()
257 drive->hwif->rq = NULL; in ide_queue_sense_rq()
260 spin_unlock_irqrestore(&hwif->lock, flags); in ide_queue_sense_rq()
272 struct request *failed_rq = drive->hwif->rq; in ide_retry_pc()
273 struct request *sense_rq = drive->sense_rq; in ide_retry_pc()
274 struct ide_atapi_pc *pc = &drive->request_sense_pc; in ide_retry_pc() local
278 /* init pc from sense_rq */ in ide_retry_pc()
279 ide_init_pc(pc); in ide_retry_pc()
280 memcpy(pc->c, scsi_req(sense_rq)->cmd, 12); in ide_retry_pc()
282 if (drive->media == ide_tape) in ide_retry_pc()
283 drive->atapi_flags |= IDE_AFLAG_IGNORE_DSC; in ide_retry_pc()
290 drive->hwif->rq = NULL; in ide_retry_pc()
292 if (ide_queue_sense_rq(drive, pc)) in ide_retry_pc()
299 struct request *rq = drive->hwif->rq; in ide_cd_expiry()
302 debug_log("%s: scsi_req(rq)->cmd[0]: 0x%x\n", __func__, scsi_req(rq)->cmd[0]); in ide_cd_expiry()
310 switch (scsi_req(rq)->cmd[0]) { in ide_cd_expiry()
319 if (!(rq->rq_flags & RQF_QUIET)) in ide_cd_expiry()
321 scsi_req(rq)->cmd[0]); in ide_cd_expiry()
339 switch (ide_req(rq)->type) { in ide_cd_get_xferlen()
354 drive->hwif->tp_ops->tf_read(drive, &tf, IDE_VALID_NSECT | in ide_read_bcount_and_ireason()
367 * - 0 if everything's ok
368 * - 1 if the request has to be terminated.
373 ide_hwif_t *hwif = drive->hwif; in ide_check_ireason()
381 drive->name, __func__); in ide_check_ireason()
391 (void)hwif->tp_ops->read_status(hwif); in ide_check_ireason()
396 printk(KERN_ERR PFX "%s: CoD != 0 in %s\n", drive->name, in ide_check_ireason()
401 drive->name, __func__, ireason); in ide_check_ireason()
405 rq->rq_flags |= RQF_FAILED; in ide_check_ireason()
414 * and will re-point interrupt handler to us.
418 struct ide_atapi_pc *pc = drive->pc; in ide_pc_intr() local
419 ide_hwif_t *hwif = drive->hwif; in ide_pc_intr()
420 struct ide_cmd *cmd = &hwif->cmd; in ide_pc_intr()
421 struct request *rq = hwif->rq; in ide_pc_intr()
422 const struct ide_tp_ops *tp_ops = hwif->tp_ops; in ide_pc_intr()
426 u8 write = !!(pc->flags & PC_FLAG_WRITING); in ide_pc_intr() local
428 debug_log("Enter %s - interrupt handler\n", __func__); in ide_pc_intr()
430 timeout = (drive->media == ide_floppy) ? WAIT_FLOPPY_CMD in ide_pc_intr()
434 stat = tp_ops->read_status(hwif); in ide_pc_intr()
436 if (pc->flags & PC_FLAG_DMA_IN_PROGRESS) { in ide_pc_intr()
439 drive->waiting_for_dma = 0; in ide_pc_intr()
440 rc = hwif->dma_ops->dma_end(drive); in ide_pc_intr()
443 if (rc || (drive->media == ide_tape && (stat & ATA_ERR))) { in ide_pc_intr()
444 if (drive->media == ide_floppy) in ide_pc_intr()
446 drive->name, rq_data_dir(pc->rq) in ide_pc_intr()
447 ? "write" : "read"); in ide_pc_intr()
448 pc->flags |= PC_FLAG_DMA_ERROR; in ide_pc_intr()
450 scsi_req(rq)->resid_len = 0; in ide_pc_intr()
451 debug_log("%s: DMA finished\n", drive->name); in ide_pc_intr()
454 /* No more interrupts */ in ide_pc_intr()
462 pc->flags &= ~PC_FLAG_DMA_IN_PROGRESS; in ide_pc_intr()
466 if (drive->media == ide_tape && in ide_pc_intr()
467 (stat & ATA_ERR) && scsi_req(rq)->cmd[0] == REQUEST_SENSE) in ide_pc_intr()
470 if ((stat & ATA_ERR) || (pc->flags & PC_FLAG_DMA_ERROR)) { in ide_pc_intr()
472 debug_log("%s: I/O error\n", drive->name); in ide_pc_intr()
474 if (drive->media != ide_tape) in ide_pc_intr()
475 scsi_req(pc->rq)->result++; in ide_pc_intr()
477 if (scsi_req(rq)->cmd[0] == REQUEST_SENSE) { in ide_pc_intr()
479 "sense command\n", drive->name); in ide_pc_intr()
483 debug_log("[cmd %x]: check condition\n", scsi_req(rq)->cmd[0]); in ide_pc_intr()
491 pc->error = 0; in ide_pc_intr()
493 if ((pc->flags & PC_FLAG_WAIT_FOR_DSC) && (stat & ATA_DSC) == 0) in ide_pc_intr()
497 * ->pc_callback() might change rq->data_len for in ide_pc_intr()
502 /* Command finished - Call the callback function */ in ide_pc_intr()
503 uptodate = drive->pc_callback(drive, dsc); in ide_pc_intr()
506 drive->failed_pc = NULL; in ide_pc_intr()
509 scsi_req(rq)->result = 0; in ide_pc_intr()
514 if (scsi_req(rq)->result == 0) in ide_pc_intr()
515 scsi_req(rq)->result = -EIO; in ide_pc_intr()
525 if (pc->flags & PC_FLAG_DMA_IN_PROGRESS) { in ide_pc_intr()
526 pc->flags &= ~PC_FLAG_DMA_IN_PROGRESS; in ide_pc_intr()
528 "interrupts in DMA mode\n", drive->name); in ide_pc_intr()
536 if (ide_check_ireason(drive, rq, bcount, ireason, write)) in ide_pc_intr()
539 done = min_t(unsigned int, bcount, cmd->nleft); in ide_pc_intr()
540 ide_pio_bytes(drive, cmd, write, done); in ide_pc_intr()
543 scsi_req(rq)->resid_len -= done; in ide_pc_intr()
545 bcount -= done; in ide_pc_intr()
548 ide_pad_transfer(drive, write, bcount); in ide_pc_intr()
551 scsi_req(rq)->cmd[0], done, bcount, scsi_req(rq)->resid_len); in ide_pc_intr()
561 cmd->protocol = dma ? ATAPI_PROT_DMA : ATAPI_PROT_PIO; in ide_init_packet_cmd()
562 cmd->valid.out.tf = IDE_VALID_LBAH | IDE_VALID_LBAM | in ide_init_packet_cmd()
564 cmd->tf.command = ATA_CMD_PACKET; in ide_init_packet_cmd()
565 cmd->tf.feature = dma; /* Use PIO/DMA */ in ide_init_packet_cmd()
566 cmd->tf.lbam = bcount & 0xff; in ide_init_packet_cmd()
567 cmd->tf.lbah = (bcount >> 8) & 0xff; in ide_init_packet_cmd()
574 drive->hwif->tp_ops->tf_read(drive, &tf, IDE_VALID_NSECT); in ide_read_ireason()
583 while (retries-- && ((ireason & ATAPI_COD) == 0 || in ide_wait_ireason()
586 "a packet command, retrying\n", drive->name); in ide_wait_ireason()
592 drive->name); in ide_wait_ireason()
604 drive->hwif->tp_ops->output_data(drive, NULL, drive->pc->c, 12); in ide_delayed_transfer_pc()
612 struct ide_atapi_pc *pc; in ide_transfer_pc() local
613 ide_hwif_t *hwif = drive->hwif; in ide_transfer_pc()
614 struct request *rq = hwif->rq; in ide_transfer_pc()
623 "DRQ isn't asserted\n", drive->name); in ide_transfer_pc()
627 if (drive->atapi_flags & IDE_AFLAG_DRQ_INTERRUPT) { in ide_transfer_pc()
628 if (drive->dma) in ide_transfer_pc()
629 drive->waiting_for_dma = 1; in ide_transfer_pc()
634 cmd_len = COMMAND_SIZE(scsi_req(rq)->cmd[0]); in ide_transfer_pc()
638 timeout = rq->timeout; in ide_transfer_pc()
641 pc = drive->pc; in ide_transfer_pc()
650 if (drive->atapi_flags & IDE_AFLAG_ZIP_DRIVE) { in ide_transfer_pc()
651 timeout = drive->pc_delay; in ide_transfer_pc()
654 timeout = (drive->media == ide_floppy) ? WAIT_FLOPPY_CMD in ide_transfer_pc()
660 if (drive->media == ide_tape) in ide_transfer_pc()
665 "issuing a packet command\n", drive->name); in ide_transfer_pc()
671 hwif->expiry = expiry; in ide_transfer_pc()
675 (dev_is_idecd(drive) ? drive->irq_handler in ide_transfer_pc()
680 if ((drive->atapi_flags & IDE_AFLAG_ZIP_DRIVE) == 0) in ide_transfer_pc()
681 hwif->tp_ops->output_data(drive, NULL, scsi_req(rq)->cmd, cmd_len); in ide_transfer_pc()
685 if (drive->dma) in ide_transfer_pc()
686 hwif->dma_ops->dma_start(drive); in ide_transfer_pc()
688 if (pc->flags & PC_FLAG_DMA_OK) { in ide_transfer_pc()
689 pc->flags |= PC_FLAG_DMA_IN_PROGRESS; in ide_transfer_pc()
690 hwif->dma_ops->dma_start(drive); in ide_transfer_pc()
699 struct ide_atapi_pc *pc; in ide_issue_pc() local
700 ide_hwif_t *hwif = drive->hwif; in ide_issue_pc()
702 struct request *rq = hwif->rq; in ide_issue_pc()
706 u8 drq_int = !!(drive->atapi_flags & IDE_AFLAG_DRQ_INTERRUPT); in ide_issue_pc()
714 if (drive->dma) in ide_issue_pc()
715 drive->dma = !ide_dma_prepare(drive, cmd); in ide_issue_pc()
717 pc = drive->pc; in ide_issue_pc()
721 bcount = ((drive->media == ide_tape) ? bytes in ide_issue_pc()
726 scsi_req(rq)->resid_len = bcount; in ide_issue_pc()
728 if (pc->flags & PC_FLAG_DMA_ERROR) { in ide_issue_pc()
729 pc->flags &= ~PC_FLAG_DMA_ERROR; in ide_issue_pc()
733 if (pc->flags & PC_FLAG_DMA_OK) in ide_issue_pc()
734 drive->dma = !ide_dma_prepare(drive, cmd); in ide_issue_pc()
736 if (!drive->dma) in ide_issue_pc()
737 pc->flags &= ~PC_FLAG_DMA_OK; in ide_issue_pc()
739 timeout = (drive->media == ide_floppy) ? WAIT_FLOPPY_CMD in ide_issue_pc()
743 ide_init_packet_cmd(cmd, valid_tf, bcount, drive->dma); in ide_issue_pc()
748 if (drive->dma) in ide_issue_pc()
749 drive->waiting_for_dma = 0; in ide_issue_pc()
750 hwif->expiry = expiry; in ide_issue_pc()