• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * ATAPI support.
3  */
4 
5 #include <linux/kernel.h>
6 #include <linux/cdrom.h>
7 #include <linux/delay.h>
8 #include <linux/ide.h>
9 #include <scsi/scsi.h>
10 
11 #ifdef DEBUG
12 #define debug_log(fmt, args...) \
13 	printk(KERN_INFO "ide: " fmt, ## args)
14 #else
15 #define debug_log(fmt, args...) do {} while (0)
16 #endif
17 
18 #define ATAPI_MIN_CDB_BYTES	12
19 
dev_is_idecd(ide_drive_t * drive)20 static inline int dev_is_idecd(ide_drive_t *drive)
21 {
22 	return drive->media == ide_cdrom || drive->media == ide_optical;
23 }
24 
25 /*
26  * Check whether we can support a device,
27  * based on the ATAPI IDENTIFY command results.
28  */
ide_check_atapi_device(ide_drive_t * drive,const char * s)29 int ide_check_atapi_device(ide_drive_t *drive, const char *s)
30 {
31 	u16 *id = drive->id;
32 	u8 gcw[2], protocol, device_type, removable, drq_type, packet_size;
33 
34 	*((u16 *)&gcw) = id[ATA_ID_CONFIG];
35 
36 	protocol    = (gcw[1] & 0xC0) >> 6;
37 	device_type =  gcw[1] & 0x1F;
38 	removable   = (gcw[0] & 0x80) >> 7;
39 	drq_type    = (gcw[0] & 0x60) >> 5;
40 	packet_size =  gcw[0] & 0x03;
41 
42 #ifdef CONFIG_PPC
43 	/* kludge for Apple PowerBook internal zip */
44 	if (drive->media == ide_floppy && device_type == 5 &&
45 	    !strstr((char *)&id[ATA_ID_PROD], "CD-ROM") &&
46 	    strstr((char *)&id[ATA_ID_PROD], "ZIP"))
47 		device_type = 0;
48 #endif
49 
50 	if (protocol != 2)
51 		printk(KERN_ERR "%s: %s: protocol (0x%02x) is not ATAPI\n",
52 			s, drive->name, protocol);
53 	else if ((drive->media == ide_floppy && device_type != 0) ||
54 		 (drive->media == ide_tape && device_type != 1))
55 		printk(KERN_ERR "%s: %s: invalid device type (0x%02x)\n",
56 			s, drive->name, device_type);
57 	else if (removable == 0)
58 		printk(KERN_ERR "%s: %s: the removable flag is not set\n",
59 			s, drive->name);
60 	else if (drive->media == ide_floppy && drq_type == 3)
61 		printk(KERN_ERR "%s: %s: sorry, DRQ type (0x%02x) not "
62 			"supported\n", s, drive->name, drq_type);
63 	else if (packet_size != 0)
64 		printk(KERN_ERR "%s: %s: packet size (0x%02x) is not 12 "
65 			"bytes\n", s, drive->name, packet_size);
66 	else
67 		return 1;
68 	return 0;
69 }
70 EXPORT_SYMBOL_GPL(ide_check_atapi_device);
71 
72 /* PIO data transfer routine using the scatter gather table. */
ide_io_buffers(ide_drive_t * drive,struct ide_atapi_pc * pc,unsigned int bcount,int write)73 int ide_io_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc,
74 		    unsigned int bcount, int write)
75 {
76 	ide_hwif_t *hwif = drive->hwif;
77 	const struct ide_tp_ops *tp_ops = hwif->tp_ops;
78 	xfer_func_t *xf = write ? tp_ops->output_data : tp_ops->input_data;
79 	struct scatterlist *sg = pc->sg;
80 	char *buf;
81 	int count, done = 0;
82 
83 	while (bcount) {
84 		count = min(sg->length - pc->b_count, bcount);
85 
86 		if (PageHighMem(sg_page(sg))) {
87 			unsigned long flags;
88 
89 			local_irq_save(flags);
90 			buf = kmap_atomic(sg_page(sg), KM_IRQ0) + sg->offset;
91 			xf(drive, NULL, buf + pc->b_count, count);
92 			kunmap_atomic(buf - sg->offset, KM_IRQ0);
93 			local_irq_restore(flags);
94 		} else {
95 			buf = sg_virt(sg);
96 			xf(drive, NULL, buf + pc->b_count, count);
97 		}
98 
99 		bcount -= count;
100 		pc->b_count += count;
101 		done += count;
102 
103 		if (pc->b_count == sg->length) {
104 			if (!--pc->sg_cnt)
105 				break;
106 			pc->sg = sg = sg_next(sg);
107 			pc->b_count = 0;
108 		}
109 	}
110 
111 	if (bcount) {
112 		printk(KERN_ERR "%s: %d leftover bytes, %s\n", drive->name,
113 			bcount, write ? "padding with zeros"
114 				      : "discarding data");
115 		ide_pad_transfer(drive, write, bcount);
116 	}
117 
118 	return done;
119 }
120 EXPORT_SYMBOL_GPL(ide_io_buffers);
121 
ide_init_pc(struct ide_atapi_pc * pc)122 void ide_init_pc(struct ide_atapi_pc *pc)
123 {
124 	memset(pc, 0, sizeof(*pc));
125 	pc->buf = pc->pc_buf;
126 	pc->buf_size = IDE_PC_BUFFER_SIZE;
127 }
128 EXPORT_SYMBOL_GPL(ide_init_pc);
129 
130 /*
131  * Generate a new packet command request in front of the request queue, before
132  * the current request, so that it will be processed immediately, on the next
133  * pass through the driver.
134  */
ide_queue_pc_head(ide_drive_t * drive,struct gendisk * disk,struct ide_atapi_pc * pc,struct request * rq)135 static void ide_queue_pc_head(ide_drive_t *drive, struct gendisk *disk,
136 			      struct ide_atapi_pc *pc, struct request *rq)
137 {
138 	blk_rq_init(NULL, rq);
139 	rq->cmd_type = REQ_TYPE_SPECIAL;
140 	rq->cmd_flags |= REQ_PREEMPT;
141 	rq->buffer = (char *)pc;
142 	rq->rq_disk = disk;
143 
144 	if (pc->req_xfer) {
145 		rq->data = pc->buf;
146 		rq->data_len = pc->req_xfer;
147 	}
148 
149 	memcpy(rq->cmd, pc->c, 12);
150 	if (drive->media == ide_tape)
151 		rq->cmd[13] = REQ_IDETAPE_PC1;
152 	ide_do_drive_cmd(drive, rq);
153 }
154 
155 /*
156  * Add a special packet command request to the tail of the request queue,
157  * and wait for it to be serviced.
158  */
ide_queue_pc_tail(ide_drive_t * drive,struct gendisk * disk,struct ide_atapi_pc * pc)159 int ide_queue_pc_tail(ide_drive_t *drive, struct gendisk *disk,
160 		      struct ide_atapi_pc *pc)
161 {
162 	struct request *rq;
163 	int error;
164 
165 	rq = blk_get_request(drive->queue, READ, __GFP_WAIT);
166 	rq->cmd_type = REQ_TYPE_SPECIAL;
167 	rq->buffer = (char *)pc;
168 
169 	if (pc->req_xfer) {
170 		rq->data = pc->buf;
171 		rq->data_len = pc->req_xfer;
172 	}
173 
174 	memcpy(rq->cmd, pc->c, 12);
175 	if (drive->media == ide_tape)
176 		rq->cmd[13] = REQ_IDETAPE_PC1;
177 	error = blk_execute_rq(drive->queue, disk, rq, 0);
178 	blk_put_request(rq);
179 
180 	return error;
181 }
182 EXPORT_SYMBOL_GPL(ide_queue_pc_tail);
183 
ide_do_test_unit_ready(ide_drive_t * drive,struct gendisk * disk)184 int ide_do_test_unit_ready(ide_drive_t *drive, struct gendisk *disk)
185 {
186 	struct ide_atapi_pc pc;
187 
188 	ide_init_pc(&pc);
189 	pc.c[0] = TEST_UNIT_READY;
190 
191 	return ide_queue_pc_tail(drive, disk, &pc);
192 }
193 EXPORT_SYMBOL_GPL(ide_do_test_unit_ready);
194 
ide_do_start_stop(ide_drive_t * drive,struct gendisk * disk,int start)195 int ide_do_start_stop(ide_drive_t *drive, struct gendisk *disk, int start)
196 {
197 	struct ide_atapi_pc pc;
198 
199 	ide_init_pc(&pc);
200 	pc.c[0] = START_STOP;
201 	pc.c[4] = start;
202 
203 	if (drive->media == ide_tape)
204 		pc.flags |= PC_FLAG_WAIT_FOR_DSC;
205 
206 	return ide_queue_pc_tail(drive, disk, &pc);
207 }
208 EXPORT_SYMBOL_GPL(ide_do_start_stop);
209 
ide_set_media_lock(ide_drive_t * drive,struct gendisk * disk,int on)210 int ide_set_media_lock(ide_drive_t *drive, struct gendisk *disk, int on)
211 {
212 	struct ide_atapi_pc pc;
213 
214 	if ((drive->dev_flags & IDE_DFLAG_DOORLOCKING) == 0)
215 		return 0;
216 
217 	ide_init_pc(&pc);
218 	pc.c[0] = ALLOW_MEDIUM_REMOVAL;
219 	pc.c[4] = on;
220 
221 	return ide_queue_pc_tail(drive, disk, &pc);
222 }
223 EXPORT_SYMBOL_GPL(ide_set_media_lock);
224 
ide_create_request_sense_cmd(ide_drive_t * drive,struct ide_atapi_pc * pc)225 void ide_create_request_sense_cmd(ide_drive_t *drive, struct ide_atapi_pc *pc)
226 {
227 	ide_init_pc(pc);
228 	pc->c[0] = REQUEST_SENSE;
229 	if (drive->media == ide_floppy) {
230 		pc->c[4] = 255;
231 		pc->req_xfer = 18;
232 	} else {
233 		pc->c[4] = 20;
234 		pc->req_xfer = 20;
235 	}
236 }
237 EXPORT_SYMBOL_GPL(ide_create_request_sense_cmd);
238 
239 /*
240  * Called when an error was detected during the last packet command.
241  * We queue a request sense packet command in the head of the request list.
242  */
ide_retry_pc(ide_drive_t * drive,struct gendisk * disk)243 void ide_retry_pc(ide_drive_t *drive, struct gendisk *disk)
244 {
245 	struct request *rq = &drive->request_sense_rq;
246 	struct ide_atapi_pc *pc = &drive->request_sense_pc;
247 
248 	(void)ide_read_error(drive);
249 	ide_create_request_sense_cmd(drive, pc);
250 	if (drive->media == ide_tape)
251 		set_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags);
252 	ide_queue_pc_head(drive, disk, pc, rq);
253 }
254 EXPORT_SYMBOL_GPL(ide_retry_pc);
255 
ide_cd_expiry(ide_drive_t * drive)256 int ide_cd_expiry(ide_drive_t *drive)
257 {
258 	struct request *rq = drive->hwif->rq;
259 	unsigned long wait = 0;
260 
261 	debug_log("%s: rq->cmd[0]: 0x%x\n", __func__, rq->cmd[0]);
262 
263 	/*
264 	 * Some commands are *slow* and normally take a long time to complete.
265 	 * Usually we can use the ATAPI "disconnect" to bypass this, but not all
266 	 * commands/drives support that. Let ide_timer_expiry keep polling us
267 	 * for these.
268 	 */
269 	switch (rq->cmd[0]) {
270 	case GPCMD_BLANK:
271 	case GPCMD_FORMAT_UNIT:
272 	case GPCMD_RESERVE_RZONE_TRACK:
273 	case GPCMD_CLOSE_TRACK:
274 	case GPCMD_FLUSH_CACHE:
275 		wait = ATAPI_WAIT_PC;
276 		break;
277 	default:
278 		if (!(rq->cmd_flags & REQ_QUIET))
279 			printk(KERN_INFO "cmd 0x%x timed out\n",
280 					 rq->cmd[0]);
281 		wait = 0;
282 		break;
283 	}
284 	return wait;
285 }
286 EXPORT_SYMBOL_GPL(ide_cd_expiry);
287 
ide_cd_get_xferlen(struct request * rq)288 int ide_cd_get_xferlen(struct request *rq)
289 {
290 	if (blk_fs_request(rq))
291 		return 32768;
292 	else if (blk_sense_request(rq) || blk_pc_request(rq) ||
293 			 rq->cmd_type == REQ_TYPE_ATA_PC)
294 		return rq->data_len;
295 	else
296 		return 0;
297 }
298 EXPORT_SYMBOL_GPL(ide_cd_get_xferlen);
299 
300 /*
301  * This is the usual interrupt handler which will be called during a packet
302  * command.  We will transfer some of the data (as requested by the drive)
303  * and will re-point interrupt handler to us.
304  */
ide_pc_intr(ide_drive_t * drive)305 static ide_startstop_t ide_pc_intr(ide_drive_t *drive)
306 {
307 	struct ide_atapi_pc *pc = drive->pc;
308 	ide_hwif_t *hwif = drive->hwif;
309 	struct request *rq = hwif->rq;
310 	const struct ide_tp_ops *tp_ops = hwif->tp_ops;
311 	xfer_func_t *xferfunc;
312 	unsigned int timeout, temp;
313 	u16 bcount;
314 	u8 stat, ireason, dsc = 0;
315 
316 	debug_log("Enter %s - interrupt handler\n", __func__);
317 
318 	timeout = (drive->media == ide_floppy) ? WAIT_FLOPPY_CMD
319 					       : WAIT_TAPE_CMD;
320 
321 	if (pc->flags & PC_FLAG_TIMEDOUT) {
322 		drive->pc_callback(drive, 0);
323 		return ide_stopped;
324 	}
325 
326 	/* Clear the interrupt */
327 	stat = tp_ops->read_status(hwif);
328 
329 	if (pc->flags & PC_FLAG_DMA_IN_PROGRESS) {
330 		if (hwif->dma_ops->dma_end(drive) ||
331 		    (drive->media == ide_tape && (stat & ATA_ERR))) {
332 			if (drive->media == ide_floppy)
333 				printk(KERN_ERR "%s: DMA %s error\n",
334 					drive->name, rq_data_dir(pc->rq)
335 						     ? "write" : "read");
336 			pc->flags |= PC_FLAG_DMA_ERROR;
337 		} else {
338 			pc->xferred = pc->req_xfer;
339 			if (drive->pc_update_buffers)
340 				drive->pc_update_buffers(drive, pc);
341 		}
342 		debug_log("%s: DMA finished\n", drive->name);
343 	}
344 
345 	/* No more interrupts */
346 	if ((stat & ATA_DRQ) == 0) {
347 		debug_log("Packet command completed, %d bytes transferred\n",
348 			  pc->xferred);
349 
350 		pc->flags &= ~PC_FLAG_DMA_IN_PROGRESS;
351 
352 		local_irq_enable_in_hardirq();
353 
354 		if (drive->media == ide_tape &&
355 		    (stat & ATA_ERR) && rq->cmd[0] == REQUEST_SENSE)
356 			stat &= ~ATA_ERR;
357 
358 		if ((stat & ATA_ERR) || (pc->flags & PC_FLAG_DMA_ERROR)) {
359 			/* Error detected */
360 			debug_log("%s: I/O error\n", drive->name);
361 
362 			if (drive->media != ide_tape)
363 				pc->rq->errors++;
364 
365 			if (rq->cmd[0] == REQUEST_SENSE) {
366 				printk(KERN_ERR "%s: I/O error in request sense"
367 						" command\n", drive->name);
368 				return ide_do_reset(drive);
369 			}
370 
371 			debug_log("[cmd %x]: check condition\n", rq->cmd[0]);
372 
373 			/* Retry operation */
374 			ide_retry_pc(drive, rq->rq_disk);
375 
376 			/* queued, but not started */
377 			return ide_stopped;
378 		}
379 		pc->error = 0;
380 
381 		if ((pc->flags & PC_FLAG_WAIT_FOR_DSC) && (stat & ATA_DSC) == 0)
382 			dsc = 1;
383 
384 		/* Command finished - Call the callback function */
385 		drive->pc_callback(drive, dsc);
386 
387 		return ide_stopped;
388 	}
389 
390 	if (pc->flags & PC_FLAG_DMA_IN_PROGRESS) {
391 		pc->flags &= ~PC_FLAG_DMA_IN_PROGRESS;
392 		printk(KERN_ERR "%s: The device wants to issue more interrupts "
393 				"in DMA mode\n", drive->name);
394 		ide_dma_off(drive);
395 		return ide_do_reset(drive);
396 	}
397 
398 	/* Get the number of bytes to transfer on this interrupt. */
399 	ide_read_bcount_and_ireason(drive, &bcount, &ireason);
400 
401 	if (ireason & ATAPI_COD) {
402 		printk(KERN_ERR "%s: CoD != 0 in %s\n", drive->name, __func__);
403 		return ide_do_reset(drive);
404 	}
405 
406 	if (((ireason & ATAPI_IO) == ATAPI_IO) ==
407 		!!(pc->flags & PC_FLAG_WRITING)) {
408 		/* Hopefully, we will never get here */
409 		printk(KERN_ERR "%s: We wanted to %s, but the device wants us "
410 				"to %s!\n", drive->name,
411 				(ireason & ATAPI_IO) ? "Write" : "Read",
412 				(ireason & ATAPI_IO) ? "Read" : "Write");
413 		return ide_do_reset(drive);
414 	}
415 
416 	if (!(pc->flags & PC_FLAG_WRITING)) {
417 		/* Reading - Check that we have enough space */
418 		temp = pc->xferred + bcount;
419 		if (temp > pc->req_xfer) {
420 			if (temp > pc->buf_size) {
421 				printk(KERN_ERR "%s: The device wants to send "
422 						"us more data than expected - "
423 						"discarding data\n",
424 						drive->name);
425 
426 				ide_pad_transfer(drive, 0, bcount);
427 				goto next_irq;
428 			}
429 			debug_log("The device wants to send us more data than "
430 				  "expected - allowing transfer\n");
431 		}
432 		xferfunc = tp_ops->input_data;
433 	} else
434 		xferfunc = tp_ops->output_data;
435 
436 	if ((drive->media == ide_floppy && !pc->buf) ||
437 	    (drive->media == ide_tape && pc->bh)) {
438 		int done = drive->pc_io_buffers(drive, pc, bcount,
439 				  !!(pc->flags & PC_FLAG_WRITING));
440 
441 		/* FIXME: don't do partial completions */
442 		if (drive->media == ide_floppy)
443 			ide_end_request(drive, 1, done >> 9);
444 	} else
445 		xferfunc(drive, NULL, pc->cur_pos, bcount);
446 
447 	/* Update the current position */
448 	pc->xferred += bcount;
449 	pc->cur_pos += bcount;
450 
451 	debug_log("[cmd %x] transferred %d bytes on that intr.\n",
452 		  rq->cmd[0], bcount);
453 next_irq:
454 	/* And set the interrupt handler again */
455 	ide_set_handler(drive, ide_pc_intr, timeout, NULL);
456 	return ide_started;
457 }
458 
ide_read_ireason(ide_drive_t * drive)459 static u8 ide_read_ireason(ide_drive_t *drive)
460 {
461 	ide_task_t task;
462 
463 	memset(&task, 0, sizeof(task));
464 	task.tf_flags = IDE_TFLAG_IN_NSECT;
465 
466 	drive->hwif->tp_ops->tf_read(drive, &task);
467 
468 	return task.tf.nsect & 3;
469 }
470 
ide_wait_ireason(ide_drive_t * drive,u8 ireason)471 static u8 ide_wait_ireason(ide_drive_t *drive, u8 ireason)
472 {
473 	int retries = 100;
474 
475 	while (retries-- && ((ireason & ATAPI_COD) == 0 ||
476 		(ireason & ATAPI_IO))) {
477 		printk(KERN_ERR "%s: (IO,CoD != (0,1) while issuing "
478 				"a packet command, retrying\n", drive->name);
479 		udelay(100);
480 		ireason = ide_read_ireason(drive);
481 		if (retries == 0) {
482 			printk(KERN_ERR "%s: (IO,CoD != (0,1) while issuing "
483 					"a packet command, ignoring\n",
484 					drive->name);
485 			ireason |= ATAPI_COD;
486 			ireason &= ~ATAPI_IO;
487 		}
488 	}
489 
490 	return ireason;
491 }
492 
ide_delayed_transfer_pc(ide_drive_t * drive)493 static int ide_delayed_transfer_pc(ide_drive_t *drive)
494 {
495 	/* Send the actual packet */
496 	drive->hwif->tp_ops->output_data(drive, NULL, drive->pc->c, 12);
497 
498 	/* Timeout for the packet command */
499 	return WAIT_FLOPPY_CMD;
500 }
501 
ide_transfer_pc(ide_drive_t * drive)502 static ide_startstop_t ide_transfer_pc(ide_drive_t *drive)
503 {
504 	struct ide_atapi_pc *uninitialized_var(pc);
505 	ide_hwif_t *hwif = drive->hwif;
506 	struct request *rq = hwif->rq;
507 	ide_expiry_t *expiry;
508 	unsigned int timeout;
509 	int cmd_len;
510 	ide_startstop_t startstop;
511 	u8 ireason;
512 
513 	if (ide_wait_stat(&startstop, drive, ATA_DRQ, ATA_BUSY, WAIT_READY)) {
514 		printk(KERN_ERR "%s: Strange, packet command initiated yet "
515 				"DRQ isn't asserted\n", drive->name);
516 		return startstop;
517 	}
518 
519 	if (drive->atapi_flags & IDE_AFLAG_DRQ_INTERRUPT) {
520 		if (drive->dma)
521 			drive->waiting_for_dma = 1;
522 	}
523 
524 	if (dev_is_idecd(drive)) {
525 		/* ATAPI commands get padded out to 12 bytes minimum */
526 		cmd_len = COMMAND_SIZE(rq->cmd[0]);
527 		if (cmd_len < ATAPI_MIN_CDB_BYTES)
528 			cmd_len = ATAPI_MIN_CDB_BYTES;
529 
530 		timeout = rq->timeout;
531 		expiry  = ide_cd_expiry;
532 	} else {
533 		pc = drive->pc;
534 
535 		cmd_len = ATAPI_MIN_CDB_BYTES;
536 
537 		/*
538 		 * If necessary schedule the packet transfer to occur 'timeout'
539 		 * miliseconds later in ide_delayed_transfer_pc() after the
540 		 * device says it's ready for a packet.
541 		 */
542 		if (drive->atapi_flags & IDE_AFLAG_ZIP_DRIVE) {
543 			timeout = drive->pc_delay;
544 			expiry = &ide_delayed_transfer_pc;
545 		} else {
546 			timeout = (drive->media == ide_floppy) ? WAIT_FLOPPY_CMD
547 							       : WAIT_TAPE_CMD;
548 			expiry = NULL;
549 		}
550 
551 		ireason = ide_read_ireason(drive);
552 		if (drive->media == ide_tape)
553 			ireason = ide_wait_ireason(drive, ireason);
554 
555 		if ((ireason & ATAPI_COD) == 0 || (ireason & ATAPI_IO)) {
556 			printk(KERN_ERR "%s: (IO,CoD) != (0,1) while issuing "
557 					"a packet command\n", drive->name);
558 
559 			return ide_do_reset(drive);
560 		}
561 	}
562 
563 	/* Set the interrupt routine */
564 	ide_set_handler(drive,
565 			(dev_is_idecd(drive) ? drive->irq_handler
566 					     : ide_pc_intr),
567 			timeout, expiry);
568 
569 	/* Begin DMA, if necessary */
570 	if (dev_is_idecd(drive)) {
571 		if (drive->dma)
572 			hwif->dma_ops->dma_start(drive);
573 	} else {
574 		if (pc->flags & PC_FLAG_DMA_OK) {
575 			pc->flags |= PC_FLAG_DMA_IN_PROGRESS;
576 			hwif->dma_ops->dma_start(drive);
577 		}
578 	}
579 
580 	/* Send the actual packet */
581 	if ((drive->atapi_flags & IDE_AFLAG_ZIP_DRIVE) == 0)
582 		hwif->tp_ops->output_data(drive, NULL, rq->cmd, cmd_len);
583 
584 	return ide_started;
585 }
586 
ide_issue_pc(ide_drive_t * drive)587 ide_startstop_t ide_issue_pc(ide_drive_t *drive)
588 {
589 	struct ide_atapi_pc *pc;
590 	ide_hwif_t *hwif = drive->hwif;
591 	ide_expiry_t *expiry = NULL;
592 	unsigned int timeout;
593 	u32 tf_flags;
594 	u16 bcount;
595 
596 	if (dev_is_idecd(drive)) {
597 		tf_flags = IDE_TFLAG_OUT_NSECT | IDE_TFLAG_OUT_LBAL;
598 		bcount = ide_cd_get_xferlen(hwif->rq);
599 		expiry = ide_cd_expiry;
600 		timeout = ATAPI_WAIT_PC;
601 
602 		if (drive->dma)
603 			drive->dma = !hwif->dma_ops->dma_setup(drive);
604 	} else {
605 		pc = drive->pc;
606 
607 		/* We haven't transferred any data yet */
608 		pc->xferred = 0;
609 		pc->cur_pos = pc->buf;
610 
611 		tf_flags = IDE_TFLAG_OUT_DEVICE;
612 		bcount = ((drive->media == ide_tape) ?
613 				pc->req_xfer :
614 				min(pc->req_xfer, 63 * 1024));
615 
616 		if (pc->flags & PC_FLAG_DMA_ERROR) {
617 			pc->flags &= ~PC_FLAG_DMA_ERROR;
618 			ide_dma_off(drive);
619 		}
620 
621 		if ((pc->flags & PC_FLAG_DMA_OK) &&
622 		     (drive->dev_flags & IDE_DFLAG_USING_DMA))
623 			drive->dma = !hwif->dma_ops->dma_setup(drive);
624 
625 		if (!drive->dma)
626 			pc->flags &= ~PC_FLAG_DMA_OK;
627 
628 		timeout = (drive->media == ide_floppy) ? WAIT_FLOPPY_CMD
629 						       : WAIT_TAPE_CMD;
630 	}
631 
632 	ide_pktcmd_tf_load(drive, tf_flags, bcount, drive->dma);
633 
634 	/* Issue the packet command */
635 	if (drive->atapi_flags & IDE_AFLAG_DRQ_INTERRUPT) {
636 		if (drive->dma)
637 			drive->waiting_for_dma = 0;
638 		ide_execute_command(drive, ATA_CMD_PACKET, ide_transfer_pc,
639 				    timeout, expiry);
640 		return ide_started;
641 	} else {
642 		ide_execute_pkt_cmd(drive);
643 		return ide_transfer_pc(drive);
644 	}
645 }
646 EXPORT_SYMBOL_GPL(ide_issue_pc);
647