1 /*
2  * ATAPI support.
3  */
4 
5 #include <linux/kernel.h>
6 #include <linux/cdrom.h>
7 #include <linux/delay.h>
8 #include <linux/export.h>
9 #include <linux/ide.h>
10 #include <linux/scatterlist.h>
11 #include <linux/gfp.h>
12 
13 #include <scsi/scsi.h>
14 
15 #define DRV_NAME "ide-atapi"
16 #define PFX DRV_NAME ": "
17 
18 #ifdef DEBUG
19 #define debug_log(fmt, args...) \
20 	printk(KERN_INFO "ide: " fmt, ## args)
21 #else
22 #define debug_log(fmt, args...) do {} while (0)
23 #endif
24 
25 #define ATAPI_MIN_CDB_BYTES	12
26 
dev_is_idecd(ide_drive_t * drive)27 static inline int dev_is_idecd(ide_drive_t *drive)
28 {
29 	return drive->media == ide_cdrom || drive->media == ide_optical;
30 }
31 
32 /*
33  * Check whether we can support a device,
34  * based on the ATAPI IDENTIFY command results.
35  */
ide_check_atapi_device(ide_drive_t * drive,const char * s)36 int ide_check_atapi_device(ide_drive_t *drive, const char *s)
37 {
38 	u16 *id = drive->id;
39 	u8 gcw[2], protocol, device_type, removable, drq_type, packet_size;
40 
41 	*((u16 *)&gcw) = id[ATA_ID_CONFIG];
42 
43 	protocol    = (gcw[1] & 0xC0) >> 6;
44 	device_type =  gcw[1] & 0x1F;
45 	removable   = (gcw[0] & 0x80) >> 7;
46 	drq_type    = (gcw[0] & 0x60) >> 5;
47 	packet_size =  gcw[0] & 0x03;
48 
49 #ifdef CONFIG_PPC
50 	/* kludge for Apple PowerBook internal zip */
51 	if (drive->media == ide_floppy && device_type == 5 &&
52 	    !strstr((char *)&id[ATA_ID_PROD], "CD-ROM") &&
53 	    strstr((char *)&id[ATA_ID_PROD], "ZIP"))
54 		device_type = 0;
55 #endif
56 
57 	if (protocol != 2)
58 		printk(KERN_ERR "%s: %s: protocol (0x%02x) is not ATAPI\n",
59 			s, drive->name, protocol);
60 	else if ((drive->media == ide_floppy && device_type != 0) ||
61 		 (drive->media == ide_tape && device_type != 1))
62 		printk(KERN_ERR "%s: %s: invalid device type (0x%02x)\n",
63 			s, drive->name, device_type);
64 	else if (removable == 0)
65 		printk(KERN_ERR "%s: %s: the removable flag is not set\n",
66 			s, drive->name);
67 	else if (drive->media == ide_floppy && drq_type == 3)
68 		printk(KERN_ERR "%s: %s: sorry, DRQ type (0x%02x) not "
69 			"supported\n", s, drive->name, drq_type);
70 	else if (packet_size != 0)
71 		printk(KERN_ERR "%s: %s: packet size (0x%02x) is not 12 "
72 			"bytes\n", s, drive->name, packet_size);
73 	else
74 		return 1;
75 	return 0;
76 }
77 EXPORT_SYMBOL_GPL(ide_check_atapi_device);
78 
ide_init_pc(struct ide_atapi_pc * pc)79 void ide_init_pc(struct ide_atapi_pc *pc)
80 {
81 	memset(pc, 0, sizeof(*pc));
82 }
83 EXPORT_SYMBOL_GPL(ide_init_pc);
84 
85 /*
86  * Add a special packet command request to the tail of the request queue,
87  * and wait for it to be serviced.
88  */
ide_queue_pc_tail(ide_drive_t * drive,struct gendisk * disk,struct ide_atapi_pc * pc,void * buf,unsigned int bufflen)89 int ide_queue_pc_tail(ide_drive_t *drive, struct gendisk *disk,
90 		      struct ide_atapi_pc *pc, void *buf, unsigned int bufflen)
91 {
92 	struct request *rq;
93 	int error;
94 
95 	rq = blk_get_request(drive->queue, REQ_OP_DRV_IN, 0);
96 	ide_req(rq)->type = ATA_PRIV_MISC;
97 	rq->special = (char *)pc;
98 
99 	if (buf && bufflen) {
100 		error = blk_rq_map_kern(drive->queue, rq, buf, bufflen,
101 					GFP_NOIO);
102 		if (error)
103 			goto put_req;
104 	}
105 
106 	memcpy(scsi_req(rq)->cmd, pc->c, 12);
107 	if (drive->media == ide_tape)
108 		scsi_req(rq)->cmd[13] = REQ_IDETAPE_PC1;
109 	blk_execute_rq(drive->queue, disk, rq, 0);
110 	error = scsi_req(rq)->result ? -EIO : 0;
111 put_req:
112 	blk_put_request(rq);
113 	return error;
114 }
115 EXPORT_SYMBOL_GPL(ide_queue_pc_tail);
116 
ide_do_test_unit_ready(ide_drive_t * drive,struct gendisk * disk)117 int ide_do_test_unit_ready(ide_drive_t *drive, struct gendisk *disk)
118 {
119 	struct ide_atapi_pc pc;
120 
121 	ide_init_pc(&pc);
122 	pc.c[0] = TEST_UNIT_READY;
123 
124 	return ide_queue_pc_tail(drive, disk, &pc, NULL, 0);
125 }
126 EXPORT_SYMBOL_GPL(ide_do_test_unit_ready);
127 
ide_do_start_stop(ide_drive_t * drive,struct gendisk * disk,int start)128 int ide_do_start_stop(ide_drive_t *drive, struct gendisk *disk, int start)
129 {
130 	struct ide_atapi_pc pc;
131 
132 	ide_init_pc(&pc);
133 	pc.c[0] = START_STOP;
134 	pc.c[4] = start;
135 
136 	if (drive->media == ide_tape)
137 		pc.flags |= PC_FLAG_WAIT_FOR_DSC;
138 
139 	return ide_queue_pc_tail(drive, disk, &pc, NULL, 0);
140 }
141 EXPORT_SYMBOL_GPL(ide_do_start_stop);
142 
ide_set_media_lock(ide_drive_t * drive,struct gendisk * disk,int on)143 int ide_set_media_lock(ide_drive_t *drive, struct gendisk *disk, int on)
144 {
145 	struct ide_atapi_pc pc;
146 
147 	if ((drive->dev_flags & IDE_DFLAG_DOORLOCKING) == 0)
148 		return 0;
149 
150 	ide_init_pc(&pc);
151 	pc.c[0] = ALLOW_MEDIUM_REMOVAL;
152 	pc.c[4] = on;
153 
154 	return ide_queue_pc_tail(drive, disk, &pc, NULL, 0);
155 }
156 EXPORT_SYMBOL_GPL(ide_set_media_lock);
157 
ide_create_request_sense_cmd(ide_drive_t * drive,struct ide_atapi_pc * pc)158 void ide_create_request_sense_cmd(ide_drive_t *drive, struct ide_atapi_pc *pc)
159 {
160 	ide_init_pc(pc);
161 	pc->c[0] = REQUEST_SENSE;
162 	if (drive->media == ide_floppy) {
163 		pc->c[4] = 255;
164 		pc->req_xfer = 18;
165 	} else {
166 		pc->c[4] = 20;
167 		pc->req_xfer = 20;
168 	}
169 }
170 EXPORT_SYMBOL_GPL(ide_create_request_sense_cmd);
171 
ide_prep_sense(ide_drive_t * drive,struct request * rq)172 void ide_prep_sense(ide_drive_t *drive, struct request *rq)
173 {
174 	struct request_sense *sense = &drive->sense_data;
175 	struct request *sense_rq = drive->sense_rq;
176 	struct scsi_request *req = scsi_req(sense_rq);
177 	unsigned int cmd_len, sense_len;
178 	int err;
179 
180 	switch (drive->media) {
181 	case ide_floppy:
182 		cmd_len = 255;
183 		sense_len = 18;
184 		break;
185 	case ide_tape:
186 		cmd_len = 20;
187 		sense_len = 20;
188 		break;
189 	default:
190 		cmd_len = 18;
191 		sense_len = 18;
192 	}
193 
194 	BUG_ON(sense_len > sizeof(*sense));
195 
196 	if (ata_sense_request(rq) || drive->sense_rq_armed)
197 		return;
198 
199 	memset(sense, 0, sizeof(*sense));
200 
201 	blk_rq_init(rq->q, sense_rq);
202 	scsi_req_init(req);
203 
204 	err = blk_rq_map_kern(drive->queue, sense_rq, sense, sense_len,
205 			      GFP_NOIO);
206 	if (unlikely(err)) {
207 		if (printk_ratelimit())
208 			printk(KERN_WARNING PFX "%s: failed to map sense "
209 					    "buffer\n", drive->name);
210 		return;
211 	}
212 
213 	sense_rq->rq_disk = rq->rq_disk;
214 	sense_rq->cmd_flags = REQ_OP_DRV_IN;
215 	ide_req(sense_rq)->type = ATA_PRIV_SENSE;
216 	sense_rq->rq_flags |= RQF_PREEMPT;
217 
218 	req->cmd[0] = GPCMD_REQUEST_SENSE;
219 	req->cmd[4] = cmd_len;
220 	if (drive->media == ide_tape)
221 		req->cmd[13] = REQ_IDETAPE_PC1;
222 
223 	drive->sense_rq_armed = true;
224 }
225 EXPORT_SYMBOL_GPL(ide_prep_sense);
226 
ide_queue_sense_rq(ide_drive_t * drive,void * special)227 int ide_queue_sense_rq(ide_drive_t *drive, void *special)
228 {
229 	/* deferred failure from ide_prep_sense() */
230 	if (!drive->sense_rq_armed) {
231 		printk(KERN_WARNING PFX "%s: error queuing a sense request\n",
232 		       drive->name);
233 		return -ENOMEM;
234 	}
235 
236 	drive->sense_rq->special = special;
237 	drive->sense_rq_armed = false;
238 
239 	drive->hwif->rq = NULL;
240 
241 	elv_add_request(drive->queue, drive->sense_rq, ELEVATOR_INSERT_FRONT);
242 	return 0;
243 }
244 EXPORT_SYMBOL_GPL(ide_queue_sense_rq);
245 
246 /*
247  * Called when an error was detected during the last packet command.
248  * We queue a request sense packet command at the head of the request
249  * queue.
250  */
ide_retry_pc(ide_drive_t * drive)251 void ide_retry_pc(ide_drive_t *drive)
252 {
253 	struct request *failed_rq = drive->hwif->rq;
254 	struct request *sense_rq = drive->sense_rq;
255 	struct ide_atapi_pc *pc = &drive->request_sense_pc;
256 
257 	(void)ide_read_error(drive);
258 
259 	/* init pc from sense_rq */
260 	ide_init_pc(pc);
261 	memcpy(pc->c, scsi_req(sense_rq)->cmd, 12);
262 
263 	if (drive->media == ide_tape)
264 		drive->atapi_flags |= IDE_AFLAG_IGNORE_DSC;
265 
266 	/*
267 	 * Push back the failed request and put request sense on top
268 	 * of it.  The failed command will be retried after sense data
269 	 * is acquired.
270 	 */
271 	drive->hwif->rq = NULL;
272 	ide_requeue_and_plug(drive, failed_rq);
273 	if (ide_queue_sense_rq(drive, pc)) {
274 		blk_start_request(failed_rq);
275 		ide_complete_rq(drive, BLK_STS_IOERR, blk_rq_bytes(failed_rq));
276 	}
277 }
278 EXPORT_SYMBOL_GPL(ide_retry_pc);
279 
ide_cd_expiry(ide_drive_t * drive)280 int ide_cd_expiry(ide_drive_t *drive)
281 {
282 	struct request *rq = drive->hwif->rq;
283 	unsigned long wait = 0;
284 
285 	debug_log("%s: scsi_req(rq)->cmd[0]: 0x%x\n", __func__, scsi_req(rq)->cmd[0]);
286 
287 	/*
288 	 * Some commands are *slow* and normally take a long time to complete.
289 	 * Usually we can use the ATAPI "disconnect" to bypass this, but not all
290 	 * commands/drives support that. Let ide_timer_expiry keep polling us
291 	 * for these.
292 	 */
293 	switch (scsi_req(rq)->cmd[0]) {
294 	case GPCMD_BLANK:
295 	case GPCMD_FORMAT_UNIT:
296 	case GPCMD_RESERVE_RZONE_TRACK:
297 	case GPCMD_CLOSE_TRACK:
298 	case GPCMD_FLUSH_CACHE:
299 		wait = ATAPI_WAIT_PC;
300 		break;
301 	default:
302 		if (!(rq->rq_flags & RQF_QUIET))
303 			printk(KERN_INFO PFX "cmd 0x%x timed out\n",
304 					 scsi_req(rq)->cmd[0]);
305 		wait = 0;
306 		break;
307 	}
308 	return wait;
309 }
310 EXPORT_SYMBOL_GPL(ide_cd_expiry);
311 
ide_cd_get_xferlen(struct request * rq)312 int ide_cd_get_xferlen(struct request *rq)
313 {
314 	switch (req_op(rq)) {
315 	default:
316 		return 32768;
317 	case REQ_OP_SCSI_IN:
318 	case REQ_OP_SCSI_OUT:
319 		return blk_rq_bytes(rq);
320 	case REQ_OP_DRV_IN:
321 	case REQ_OP_DRV_OUT:
322 		switch (ide_req(rq)->type) {
323 		case ATA_PRIV_PC:
324 		case ATA_PRIV_SENSE:
325 			return blk_rq_bytes(rq);
326 		default:
327 			return 0;
328 		}
329 	}
330 }
331 EXPORT_SYMBOL_GPL(ide_cd_get_xferlen);
332 
ide_read_bcount_and_ireason(ide_drive_t * drive,u16 * bcount,u8 * ireason)333 void ide_read_bcount_and_ireason(ide_drive_t *drive, u16 *bcount, u8 *ireason)
334 {
335 	struct ide_taskfile tf;
336 
337 	drive->hwif->tp_ops->tf_read(drive, &tf, IDE_VALID_NSECT |
338 				     IDE_VALID_LBAM | IDE_VALID_LBAH);
339 
340 	*bcount = (tf.lbah << 8) | tf.lbam;
341 	*ireason = tf.nsect & 3;
342 }
343 EXPORT_SYMBOL_GPL(ide_read_bcount_and_ireason);
344 
345 /*
346  * Check the contents of the interrupt reason register and attempt to recover if
347  * there are problems.
348  *
349  * Returns:
350  * - 0 if everything's ok
351  * - 1 if the request has to be terminated.
352  */
ide_check_ireason(ide_drive_t * drive,struct request * rq,int len,int ireason,int rw)353 int ide_check_ireason(ide_drive_t *drive, struct request *rq, int len,
354 		      int ireason, int rw)
355 {
356 	ide_hwif_t *hwif = drive->hwif;
357 
358 	debug_log("ireason: 0x%x, rw: 0x%x\n", ireason, rw);
359 
360 	if (ireason == (!rw << 1))
361 		return 0;
362 	else if (ireason == (rw << 1)) {
363 		printk(KERN_ERR PFX "%s: %s: wrong transfer direction!\n",
364 				drive->name, __func__);
365 
366 		if (dev_is_idecd(drive))
367 			ide_pad_transfer(drive, rw, len);
368 	} else if (!rw && ireason == ATAPI_COD) {
369 		if (dev_is_idecd(drive)) {
370 			/*
371 			 * Some drives (ASUS) seem to tell us that status info
372 			 * is available.  Just get it and ignore.
373 			 */
374 			(void)hwif->tp_ops->read_status(hwif);
375 			return 0;
376 		}
377 	} else {
378 		if (ireason & ATAPI_COD)
379 			printk(KERN_ERR PFX "%s: CoD != 0 in %s\n", drive->name,
380 					__func__);
381 
382 		/* drive wants a command packet, or invalid ireason... */
383 		printk(KERN_ERR PFX "%s: %s: bad interrupt reason 0x%02x\n",
384 				drive->name, __func__, ireason);
385 	}
386 
387 	if (dev_is_idecd(drive) && ata_pc_request(rq))
388 		rq->rq_flags |= RQF_FAILED;
389 
390 	return 1;
391 }
392 EXPORT_SYMBOL_GPL(ide_check_ireason);
393 
394 /*
395  * This is the usual interrupt handler which will be called during a packet
396  * command.  We will transfer some of the data (as requested by the drive)
397  * and will re-point interrupt handler to us.
398  */
ide_pc_intr(ide_drive_t * drive)399 static ide_startstop_t ide_pc_intr(ide_drive_t *drive)
400 {
401 	struct ide_atapi_pc *pc = drive->pc;
402 	ide_hwif_t *hwif = drive->hwif;
403 	struct ide_cmd *cmd = &hwif->cmd;
404 	struct request *rq = hwif->rq;
405 	const struct ide_tp_ops *tp_ops = hwif->tp_ops;
406 	unsigned int timeout, done;
407 	u16 bcount;
408 	u8 stat, ireason, dsc = 0;
409 	u8 write = !!(pc->flags & PC_FLAG_WRITING);
410 
411 	debug_log("Enter %s - interrupt handler\n", __func__);
412 
413 	timeout = (drive->media == ide_floppy) ? WAIT_FLOPPY_CMD
414 					       : WAIT_TAPE_CMD;
415 
416 	/* Clear the interrupt */
417 	stat = tp_ops->read_status(hwif);
418 
419 	if (pc->flags & PC_FLAG_DMA_IN_PROGRESS) {
420 		int rc;
421 
422 		drive->waiting_for_dma = 0;
423 		rc = hwif->dma_ops->dma_end(drive);
424 		ide_dma_unmap_sg(drive, cmd);
425 
426 		if (rc || (drive->media == ide_tape && (stat & ATA_ERR))) {
427 			if (drive->media == ide_floppy)
428 				printk(KERN_ERR PFX "%s: DMA %s error\n",
429 					drive->name, rq_data_dir(pc->rq)
430 						     ? "write" : "read");
431 			pc->flags |= PC_FLAG_DMA_ERROR;
432 		} else
433 			scsi_req(rq)->resid_len = 0;
434 		debug_log("%s: DMA finished\n", drive->name);
435 	}
436 
437 	/* No more interrupts */
438 	if ((stat & ATA_DRQ) == 0) {
439 		int uptodate;
440 		blk_status_t error;
441 
442 		debug_log("Packet command completed, %d bytes transferred\n",
443 			  blk_rq_bytes(rq));
444 
445 		pc->flags &= ~PC_FLAG_DMA_IN_PROGRESS;
446 
447 		local_irq_enable_in_hardirq();
448 
449 		if (drive->media == ide_tape &&
450 		    (stat & ATA_ERR) && scsi_req(rq)->cmd[0] == REQUEST_SENSE)
451 			stat &= ~ATA_ERR;
452 
453 		if ((stat & ATA_ERR) || (pc->flags & PC_FLAG_DMA_ERROR)) {
454 			/* Error detected */
455 			debug_log("%s: I/O error\n", drive->name);
456 
457 			if (drive->media != ide_tape)
458 				scsi_req(pc->rq)->result++;
459 
460 			if (scsi_req(rq)->cmd[0] == REQUEST_SENSE) {
461 				printk(KERN_ERR PFX "%s: I/O error in request "
462 						"sense command\n", drive->name);
463 				return ide_do_reset(drive);
464 			}
465 
466 			debug_log("[cmd %x]: check condition\n", scsi_req(rq)->cmd[0]);
467 
468 			/* Retry operation */
469 			ide_retry_pc(drive);
470 
471 			/* queued, but not started */
472 			return ide_stopped;
473 		}
474 		pc->error = 0;
475 
476 		if ((pc->flags & PC_FLAG_WAIT_FOR_DSC) && (stat & ATA_DSC) == 0)
477 			dsc = 1;
478 
479 		/*
480 		 * ->pc_callback() might change rq->data_len for
481 		 * residual count, cache total length.
482 		 */
483 		done = blk_rq_bytes(rq);
484 
485 		/* Command finished - Call the callback function */
486 		uptodate = drive->pc_callback(drive, dsc);
487 
488 		if (uptodate == 0)
489 			drive->failed_pc = NULL;
490 
491 		if (ata_misc_request(rq)) {
492 			scsi_req(rq)->result = 0;
493 			error = BLK_STS_OK;
494 		} else {
495 
496 			if (blk_rq_is_passthrough(rq) && uptodate <= 0) {
497 				if (scsi_req(rq)->result == 0)
498 					scsi_req(rq)->result = -EIO;
499 			}
500 
501 			error = uptodate ? BLK_STS_OK : BLK_STS_IOERR;
502 		}
503 
504 		ide_complete_rq(drive, error, blk_rq_bytes(rq));
505 		return ide_stopped;
506 	}
507 
508 	if (pc->flags & PC_FLAG_DMA_IN_PROGRESS) {
509 		pc->flags &= ~PC_FLAG_DMA_IN_PROGRESS;
510 		printk(KERN_ERR PFX "%s: The device wants to issue more "
511 				"interrupts in DMA mode\n", drive->name);
512 		ide_dma_off(drive);
513 		return ide_do_reset(drive);
514 	}
515 
516 	/* Get the number of bytes to transfer on this interrupt. */
517 	ide_read_bcount_and_ireason(drive, &bcount, &ireason);
518 
519 	if (ide_check_ireason(drive, rq, bcount, ireason, write))
520 		return ide_do_reset(drive);
521 
522 	done = min_t(unsigned int, bcount, cmd->nleft);
523 	ide_pio_bytes(drive, cmd, write, done);
524 
525 	/* Update transferred byte count */
526 	scsi_req(rq)->resid_len -= done;
527 
528 	bcount -= done;
529 
530 	if (bcount)
531 		ide_pad_transfer(drive, write, bcount);
532 
533 	debug_log("[cmd %x] transferred %d bytes, padded %d bytes, resid: %u\n",
534 		  scsi_req(rq)->cmd[0], done, bcount, scsi_req(rq)->resid_len);
535 
536 	/* And set the interrupt handler again */
537 	ide_set_handler(drive, ide_pc_intr, timeout);
538 	return ide_started;
539 }
540 
ide_init_packet_cmd(struct ide_cmd * cmd,u8 valid_tf,u16 bcount,u8 dma)541 static void ide_init_packet_cmd(struct ide_cmd *cmd, u8 valid_tf,
542 				u16 bcount, u8 dma)
543 {
544 	cmd->protocol = dma ? ATAPI_PROT_DMA : ATAPI_PROT_PIO;
545 	cmd->valid.out.tf = IDE_VALID_LBAH | IDE_VALID_LBAM |
546 			    IDE_VALID_FEATURE | valid_tf;
547 	cmd->tf.command = ATA_CMD_PACKET;
548 	cmd->tf.feature = dma;		/* Use PIO/DMA */
549 	cmd->tf.lbam    = bcount & 0xff;
550 	cmd->tf.lbah    = (bcount >> 8) & 0xff;
551 }
552 
ide_read_ireason(ide_drive_t * drive)553 static u8 ide_read_ireason(ide_drive_t *drive)
554 {
555 	struct ide_taskfile tf;
556 
557 	drive->hwif->tp_ops->tf_read(drive, &tf, IDE_VALID_NSECT);
558 
559 	return tf.nsect & 3;
560 }
561 
ide_wait_ireason(ide_drive_t * drive,u8 ireason)562 static u8 ide_wait_ireason(ide_drive_t *drive, u8 ireason)
563 {
564 	int retries = 100;
565 
566 	while (retries-- && ((ireason & ATAPI_COD) == 0 ||
567 		(ireason & ATAPI_IO))) {
568 		printk(KERN_ERR PFX "%s: (IO,CoD != (0,1) while issuing "
569 				"a packet command, retrying\n", drive->name);
570 		udelay(100);
571 		ireason = ide_read_ireason(drive);
572 		if (retries == 0) {
573 			printk(KERN_ERR PFX "%s: (IO,CoD != (0,1) while issuing"
574 					" a packet command, ignoring\n",
575 					drive->name);
576 			ireason |= ATAPI_COD;
577 			ireason &= ~ATAPI_IO;
578 		}
579 	}
580 
581 	return ireason;
582 }
583 
ide_delayed_transfer_pc(ide_drive_t * drive)584 static int ide_delayed_transfer_pc(ide_drive_t *drive)
585 {
586 	/* Send the actual packet */
587 	drive->hwif->tp_ops->output_data(drive, NULL, drive->pc->c, 12);
588 
589 	/* Timeout for the packet command */
590 	return WAIT_FLOPPY_CMD;
591 }
592 
ide_transfer_pc(ide_drive_t * drive)593 static ide_startstop_t ide_transfer_pc(ide_drive_t *drive)
594 {
595 	struct ide_atapi_pc *uninitialized_var(pc);
596 	ide_hwif_t *hwif = drive->hwif;
597 	struct request *rq = hwif->rq;
598 	ide_expiry_t *expiry;
599 	unsigned int timeout;
600 	int cmd_len;
601 	ide_startstop_t startstop;
602 	u8 ireason;
603 
604 	if (ide_wait_stat(&startstop, drive, ATA_DRQ, ATA_BUSY, WAIT_READY)) {
605 		printk(KERN_ERR PFX "%s: Strange, packet command initiated yet "
606 				"DRQ isn't asserted\n", drive->name);
607 		return startstop;
608 	}
609 
610 	if (drive->atapi_flags & IDE_AFLAG_DRQ_INTERRUPT) {
611 		if (drive->dma)
612 			drive->waiting_for_dma = 1;
613 	}
614 
615 	if (dev_is_idecd(drive)) {
616 		/* ATAPI commands get padded out to 12 bytes minimum */
617 		cmd_len = COMMAND_SIZE(scsi_req(rq)->cmd[0]);
618 		if (cmd_len < ATAPI_MIN_CDB_BYTES)
619 			cmd_len = ATAPI_MIN_CDB_BYTES;
620 
621 		timeout = rq->timeout;
622 		expiry  = ide_cd_expiry;
623 	} else {
624 		pc = drive->pc;
625 
626 		cmd_len = ATAPI_MIN_CDB_BYTES;
627 
628 		/*
629 		 * If necessary schedule the packet transfer to occur 'timeout'
630 		 * milliseconds later in ide_delayed_transfer_pc() after the
631 		 * device says it's ready for a packet.
632 		 */
633 		if (drive->atapi_flags & IDE_AFLAG_ZIP_DRIVE) {
634 			timeout = drive->pc_delay;
635 			expiry = &ide_delayed_transfer_pc;
636 		} else {
637 			timeout = (drive->media == ide_floppy) ? WAIT_FLOPPY_CMD
638 							       : WAIT_TAPE_CMD;
639 			expiry = NULL;
640 		}
641 
642 		ireason = ide_read_ireason(drive);
643 		if (drive->media == ide_tape)
644 			ireason = ide_wait_ireason(drive, ireason);
645 
646 		if ((ireason & ATAPI_COD) == 0 || (ireason & ATAPI_IO)) {
647 			printk(KERN_ERR PFX "%s: (IO,CoD) != (0,1) while "
648 				"issuing a packet command\n", drive->name);
649 
650 			return ide_do_reset(drive);
651 		}
652 	}
653 
654 	hwif->expiry = expiry;
655 
656 	/* Set the interrupt routine */
657 	ide_set_handler(drive,
658 			(dev_is_idecd(drive) ? drive->irq_handler
659 					     : ide_pc_intr),
660 			timeout);
661 
662 	/* Send the actual packet */
663 	if ((drive->atapi_flags & IDE_AFLAG_ZIP_DRIVE) == 0)
664 		hwif->tp_ops->output_data(drive, NULL, scsi_req(rq)->cmd, cmd_len);
665 
666 	/* Begin DMA, if necessary */
667 	if (dev_is_idecd(drive)) {
668 		if (drive->dma)
669 			hwif->dma_ops->dma_start(drive);
670 	} else {
671 		if (pc->flags & PC_FLAG_DMA_OK) {
672 			pc->flags |= PC_FLAG_DMA_IN_PROGRESS;
673 			hwif->dma_ops->dma_start(drive);
674 		}
675 	}
676 
677 	return ide_started;
678 }
679 
ide_issue_pc(ide_drive_t * drive,struct ide_cmd * cmd)680 ide_startstop_t ide_issue_pc(ide_drive_t *drive, struct ide_cmd *cmd)
681 {
682 	struct ide_atapi_pc *pc;
683 	ide_hwif_t *hwif = drive->hwif;
684 	ide_expiry_t *expiry = NULL;
685 	struct request *rq = hwif->rq;
686 	unsigned int timeout, bytes;
687 	u16 bcount;
688 	u8 valid_tf;
689 	u8 drq_int = !!(drive->atapi_flags & IDE_AFLAG_DRQ_INTERRUPT);
690 
691 	if (dev_is_idecd(drive)) {
692 		valid_tf = IDE_VALID_NSECT | IDE_VALID_LBAL;
693 		bcount = ide_cd_get_xferlen(rq);
694 		expiry = ide_cd_expiry;
695 		timeout = ATAPI_WAIT_PC;
696 
697 		if (drive->dma)
698 			drive->dma = !ide_dma_prepare(drive, cmd);
699 	} else {
700 		pc = drive->pc;
701 
702 		valid_tf = IDE_VALID_DEVICE;
703 		bytes = blk_rq_bytes(rq);
704 		bcount = ((drive->media == ide_tape) ? bytes
705 						     : min_t(unsigned int,
706 							     bytes, 63 * 1024));
707 
708 		/* We haven't transferred any data yet */
709 		scsi_req(rq)->resid_len = bcount;
710 
711 		if (pc->flags & PC_FLAG_DMA_ERROR) {
712 			pc->flags &= ~PC_FLAG_DMA_ERROR;
713 			ide_dma_off(drive);
714 		}
715 
716 		if (pc->flags & PC_FLAG_DMA_OK)
717 			drive->dma = !ide_dma_prepare(drive, cmd);
718 
719 		if (!drive->dma)
720 			pc->flags &= ~PC_FLAG_DMA_OK;
721 
722 		timeout = (drive->media == ide_floppy) ? WAIT_FLOPPY_CMD
723 						       : WAIT_TAPE_CMD;
724 	}
725 
726 	ide_init_packet_cmd(cmd, valid_tf, bcount, drive->dma);
727 
728 	(void)do_rw_taskfile(drive, cmd);
729 
730 	if (drq_int) {
731 		if (drive->dma)
732 			drive->waiting_for_dma = 0;
733 		hwif->expiry = expiry;
734 	}
735 
736 	ide_execute_command(drive, cmd, ide_transfer_pc, timeout);
737 
738 	return drq_int ? ide_started : ide_transfer_pc(drive);
739 }
740 EXPORT_SYMBOL_GPL(ide_issue_pc);
741