Blame view

drivers/ide/ide-cd_ioctl.c 11.5 KB
17802998d   Bartlomiej Zolnierkiewicz   ide-cd: move code...
1
2
3
4
5
6
7
8
9
10
  /*
   * cdrom.c IOCTLs handling for ide-cd driver.
   *
   * Copyright (C) 1994-1996  Scott Snyder <snyder@fnald0.fnal.gov>
   * Copyright (C) 1996-1998  Erik Andersen <andersee@debian.org>
   * Copyright (C) 1998-2000  Jens Axboe <axboe@suse.de>
   */
  
  #include <linux/kernel.h>
  #include <linux/cdrom.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
11
  #include <linux/gfp.h>
17802998d   Bartlomiej Zolnierkiewicz   ide-cd: move code...
12
  #include <linux/ide.h>
f9afd18b5   Borislav Petkov   ide-cd: move the ...
13
  #include <scsi/scsi.h>
17802998d   Bartlomiej Zolnierkiewicz   ide-cd: move code...
14
15
  
  #include "ide-cd.h"
f9afd18b5   Borislav Petkov   ide-cd: move the ...
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  /****************************************************************************
   * Other driver requests (open, close, check media change).
   */
  int ide_cdrom_open_real(struct cdrom_device_info *cdi, int purpose)
  {
  	return 0;
  }
  
  /*
   * Close down the device.  Invalidate all cached blocks.
   */
  void ide_cdrom_release_real(struct cdrom_device_info *cdi)
  {
  	ide_drive_t *drive = cdi->handle;
f9afd18b5   Borislav Petkov   ide-cd: move the ...
30
31
  
  	if (!cdi->use_count)
570f89ea5   Borislav Petkov   ide-cd: convert t...
32
  		drive->atapi_flags &= ~IDE_AFLAG_TOC_VALID;
f9afd18b5   Borislav Petkov   ide-cd: move the ...
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
  }
  
  /*
   * add logic to try GET_EVENT command first to check for media and tray
   * status. this should be supported by newer cd-r/w and all DVD etc
   * drives
   */
  int ide_cdrom_drive_status(struct cdrom_device_info *cdi, int slot_nr)
  {
  	ide_drive_t *drive = cdi->handle;
  	struct media_event_desc med;
  	struct request_sense sense;
  	int stat;
  
  	if (slot_nr != CDSL_CURRENT)
  		return -EINVAL;
  
  	stat = cdrom_check_status(drive, &sense);
  	if (!stat || sense.sense_key == UNIT_ATTENTION)
  		return CDS_DISC_OK;
  
  	if (!cdrom_get_media_event(cdi, &med)) {
  		if (med.media_present)
  			return CDS_DISC_OK;
  		else if (med.door_open)
  			return CDS_TRAY_OPEN;
  		else
  			return CDS_NO_DISC;
  	}
  
  	if (sense.sense_key == NOT_READY && sense.asc == 0x04
  			&& sense.ascq == 0x04)
  		return CDS_DISC_OK;
  
  	/*
  	 * If not using Mt Fuji extended media tray reports,
  	 * just return TRAY_OPEN since ATAPI doesn't provide
  	 * any other way to detect this...
  	 */
  	if (sense.sense_key == NOT_READY) {
  		if (sense.asc == 0x3a && sense.ascq == 1)
  			return CDS_NO_DISC;
  		else
  			return CDS_TRAY_OPEN;
  	}
  	return CDS_DRIVE_NOT_READY;
  }
7eec77a18   Tejun Heo   ide: unexport DIS...
80
81
82
83
84
85
  /*
   * ide-cd always generates media changed event if media is missing, which
   * makes it impossible to use for proper event reporting, so disk->events
   * is cleared to 0 and the following function is used only to trigger
   * revalidation and never propagated to userland.
   */
5b03a1b14   Tejun Heo   ide: Convert to b...
86
87
  unsigned int ide_cdrom_check_events_real(struct cdrom_device_info *cdi,
  					 unsigned int clearing, int slot_nr)
f9afd18b5   Borislav Petkov   ide-cd: move the ...
88
89
  {
  	ide_drive_t *drive = cdi->handle;
f9afd18b5   Borislav Petkov   ide-cd: move the ...
90
91
92
93
  	int retval;
  
  	if (slot_nr == CDSL_CURRENT) {
  		(void) cdrom_check_status(drive, NULL);
fe11edfaa   Bartlomiej Zolnierkiewicz   ide: IDE_AFLAG_ME...
94
95
  		retval = (drive->dev_flags & IDE_DFLAG_MEDIA_CHANGED) ? 1 : 0;
  		drive->dev_flags &= ~IDE_DFLAG_MEDIA_CHANGED;
5b03a1b14   Tejun Heo   ide: Convert to b...
96
  		return retval ? DISK_EVENT_MEDIA_CHANGE : 0;
f9afd18b5   Borislav Petkov   ide-cd: move the ...
97
  	} else {
5b03a1b14   Tejun Heo   ide: Convert to b...
98
  		return 0;
f9afd18b5   Borislav Petkov   ide-cd: move the ...
99
100
101
102
103
104
105
106
107
108
109
  	}
  }
  
  /* Eject the disk if EJECTFLAG is 0.
     If EJECTFLAG is 1, try to reload the disk. */
  static
  int cdrom_eject(ide_drive_t *drive, int ejectflag,
  		struct request_sense *sense)
  {
  	struct cdrom_info *cd = drive->driver_data;
  	struct cdrom_device_info *cdi = &cd->devinfo;
f9afd18b5   Borislav Petkov   ide-cd: move the ...
110
  	char loej = 0x02;
5f828546e   FUJITA Tomonori   ide-cd: convert i...
111
  	unsigned char cmd[BLK_MAX_CDB];
f9afd18b5   Borislav Petkov   ide-cd: move the ...
112

570f89ea5   Borislav Petkov   ide-cd: convert t...
113
  	if ((drive->atapi_flags & IDE_AFLAG_NO_EJECT) && !ejectflag)
f9afd18b5   Borislav Petkov   ide-cd: move the ...
114
115
116
  		return -EDRIVE_CANT_DO_THIS;
  
  	/* reload fails on some drives, if the tray is locked */
570f89ea5   Borislav Petkov   ide-cd: convert t...
117
  	if ((drive->atapi_flags & IDE_AFLAG_DOOR_LOCKED) && ejectflag)
f9afd18b5   Borislav Petkov   ide-cd: move the ...
118
  		return 0;
f9afd18b5   Borislav Petkov   ide-cd: move the ...
119
120
121
  	/* only tell drive to close tray if open, if it can do that */
  	if (ejectflag && (cdi->mask & CDC_CLOSE_TRAY))
  		loej = 0;
5f828546e   FUJITA Tomonori   ide-cd: convert i...
122
123
124
125
  	memset(cmd, 0, BLK_MAX_CDB);
  
  	cmd[0] = GPCMD_START_STOP_UNIT;
  	cmd[4] = loej | (ejectflag != 0);
f9afd18b5   Borislav Petkov   ide-cd: move the ...
126

1a677aba5   Harvey Harrison   ide: ide-cd_ioctl...
127
  	return ide_cd_queue_pc(drive, cmd, 0, NULL, NULL, sense, 0, 0);
f9afd18b5   Borislav Petkov   ide-cd: move the ...
128
129
130
131
132
133
134
  }
  
  /* Lock the door if LOCKFLAG is nonzero; unlock it otherwise. */
  static
  int ide_cd_lockdoor(ide_drive_t *drive, int lockflag,
  		    struct request_sense *sense)
  {
f9afd18b5   Borislav Petkov   ide-cd: move the ...
135
  	struct request_sense my_sense;
f9afd18b5   Borislav Petkov   ide-cd: move the ...
136
137
138
139
140
141
  	int stat;
  
  	if (sense == NULL)
  		sense = &my_sense;
  
  	/* If the drive cannot lock the door, just pretend. */
42619d35c   Bartlomiej Zolnierkiewicz   ide: remove IDE_A...
142
  	if ((drive->dev_flags & IDE_DFLAG_DOORLOCKING) == 0) {
f9afd18b5   Borislav Petkov   ide-cd: move the ...
143
144
  		stat = 0;
  	} else {
5f828546e   FUJITA Tomonori   ide-cd: convert i...
145
146
147
148
149
150
  		unsigned char cmd[BLK_MAX_CDB];
  
  		memset(cmd, 0, BLK_MAX_CDB);
  
  		cmd[0] = GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL;
  		cmd[4] = lockflag ? 1 : 0;
1a677aba5   Harvey Harrison   ide: ide-cd_ioctl...
151
  		stat = ide_cd_queue_pc(drive, cmd, 0, NULL, NULL,
5f828546e   FUJITA Tomonori   ide-cd: convert i...
152
  				       sense, 0, 0);
f9afd18b5   Borislav Petkov   ide-cd: move the ...
153
154
155
156
157
158
159
160
161
162
  	}
  
  	/* If we got an illegal field error, the drive
  	   probably cannot lock the door. */
  	if (stat != 0 &&
  	    sense->sense_key == ILLEGAL_REQUEST &&
  	    (sense->asc == 0x24 || sense->asc == 0x20)) {
  		printk(KERN_ERR "%s: door locking not supported
  ",
  			drive->name);
42619d35c   Bartlomiej Zolnierkiewicz   ide: remove IDE_A...
163
  		drive->dev_flags &= ~IDE_DFLAG_DOORLOCKING;
f9afd18b5   Borislav Petkov   ide-cd: move the ...
164
165
166
167
168
169
170
171
172
  		stat = 0;
  	}
  
  	/* no medium, that's alright. */
  	if (stat != 0 && sense->sense_key == NOT_READY && sense->asc == 0x3a)
  		stat = 0;
  
  	if (stat == 0) {
  		if (lockflag)
570f89ea5   Borislav Petkov   ide-cd: convert t...
173
  			drive->atapi_flags |= IDE_AFLAG_DOOR_LOCKED;
f9afd18b5   Borislav Petkov   ide-cd: move the ...
174
  		else
570f89ea5   Borislav Petkov   ide-cd: convert t...
175
  			drive->atapi_flags &= ~IDE_AFLAG_DOOR_LOCKED;
f9afd18b5   Borislav Petkov   ide-cd: move the ...
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
  	}
  
  	return stat;
  }
  
  int ide_cdrom_tray_move(struct cdrom_device_info *cdi, int position)
  {
  	ide_drive_t *drive = cdi->handle;
  	struct request_sense sense;
  
  	if (position) {
  		int stat = ide_cd_lockdoor(drive, 0, &sense);
  
  		if (stat)
  			return stat;
  	}
  
  	return cdrom_eject(drive, !position, &sense);
  }
17802998d   Bartlomiej Zolnierkiewicz   ide-cd: move code...
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
  int ide_cdrom_lock_door(struct cdrom_device_info *cdi, int lock)
  {
  	ide_drive_t *drive = cdi->handle;
  
  	return ide_cd_lockdoor(drive, lock, NULL);
  }
  
  /*
   * ATAPI devices are free to select the speed you request or any slower
   * rate. :-(  Requesting too fast a speed will _not_ produce an error.
   */
  int ide_cdrom_select_speed(struct cdrom_device_info *cdi, int speed)
  {
  	ide_drive_t *drive = cdi->handle;
  	struct cdrom_info *cd = drive->driver_data;
17802998d   Bartlomiej Zolnierkiewicz   ide-cd: move code...
210
211
212
  	struct request_sense sense;
  	u8 buf[ATAPI_CAPABILITIES_PAGE_SIZE];
  	int stat;
5f828546e   FUJITA Tomonori   ide-cd: convert i...
213
  	unsigned char cmd[BLK_MAX_CDB];
17802998d   Bartlomiej Zolnierkiewicz   ide-cd: move code...
214
215
216
217
218
  
  	if (speed == 0)
  		speed = 0xffff; /* set to max */
  	else
  		speed *= 177;   /* Nx to kbytes/s */
5f828546e   FUJITA Tomonori   ide-cd: convert i...
219
220
221
  	memset(cmd, 0, BLK_MAX_CDB);
  
  	cmd[0] = GPCMD_SET_SPEED;
17802998d   Bartlomiej Zolnierkiewicz   ide-cd: move code...
222
  	/* Read Drive speed in kbytes/second MSB/LSB */
5f828546e   FUJITA Tomonori   ide-cd: convert i...
223
224
  	cmd[2] = (speed >> 8) & 0xff;
  	cmd[3] = speed & 0xff;
17802998d   Bartlomiej Zolnierkiewicz   ide-cd: move code...
225
226
227
  	if ((cdi->mask & (CDC_CD_R | CDC_CD_RW | CDC_DVD_R)) !=
  	    (CDC_CD_R | CDC_CD_RW | CDC_DVD_R)) {
  		/* Write Drive speed in kbytes/second MSB/LSB */
5f828546e   FUJITA Tomonori   ide-cd: convert i...
228
229
  		cmd[4] = (speed >> 8) & 0xff;
  		cmd[5] = speed & 0xff;
17802998d   Bartlomiej Zolnierkiewicz   ide-cd: move code...
230
  	}
1a677aba5   Harvey Harrison   ide: ide-cd_ioctl...
231
  	stat = ide_cd_queue_pc(drive, cmd, 0, NULL, NULL, &sense, 0, 0);
17802998d   Bartlomiej Zolnierkiewicz   ide-cd: move code...
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
  
  	if (!ide_cdrom_get_capabilities(drive, buf)) {
  		ide_cdrom_update_speed(drive, buf);
  		cdi->speed = cd->current_speed;
  	}
  
  	return 0;
  }
  
  int ide_cdrom_get_last_session(struct cdrom_device_info *cdi,
  			       struct cdrom_multisession *ms_info)
  {
  	struct atapi_toc *toc;
  	ide_drive_t *drive = cdi->handle;
  	struct cdrom_info *info = drive->driver_data;
  	struct request_sense sense;
  	int ret;
570f89ea5   Borislav Petkov   ide-cd: convert t...
249
  	if ((drive->atapi_flags & IDE_AFLAG_TOC_VALID) == 0 || !info->toc) {
17802998d   Bartlomiej Zolnierkiewicz   ide-cd: move code...
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
  		ret = ide_cd_read_toc(drive, &sense);
  		if (ret)
  			return ret;
  	}
  
  	toc = info->toc;
  	ms_info->addr.lba = toc->last_session_lba;
  	ms_info->xa_flag = toc->xa_flag;
  
  	return 0;
  }
  
  int ide_cdrom_get_mcn(struct cdrom_device_info *cdi,
  		      struct cdrom_mcn *mcn_info)
  {
  	ide_drive_t *drive = cdi->handle;
  	int stat, mcnlen;
17802998d   Bartlomiej Zolnierkiewicz   ide-cd: move code...
267
  	char buf[24];
5f828546e   FUJITA Tomonori   ide-cd: convert i...
268
269
  	unsigned char cmd[BLK_MAX_CDB];
  	unsigned len = sizeof(buf);
17802998d   Bartlomiej Zolnierkiewicz   ide-cd: move code...
270

5f828546e   FUJITA Tomonori   ide-cd: convert i...
271
  	memset(cmd, 0, BLK_MAX_CDB);
17802998d   Bartlomiej Zolnierkiewicz   ide-cd: move code...
272

5f828546e   FUJITA Tomonori   ide-cd: convert i...
273
274
275
276
277
  	cmd[0] = GPCMD_READ_SUBCHANNEL;
  	cmd[1] = 2;		/* MSF addressing */
  	cmd[2] = 0x40;	/* request subQ data */
  	cmd[3] = 2;		/* format */
  	cmd[8] = len;
17802998d   Bartlomiej Zolnierkiewicz   ide-cd: move code...
278

5f828546e   FUJITA Tomonori   ide-cd: convert i...
279
  	stat = ide_cd_queue_pc(drive, cmd, 0, buf, &len, NULL, 0, 0);
17802998d   Bartlomiej Zolnierkiewicz   ide-cd: move code...
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
  	if (stat)
  		return stat;
  
  	mcnlen = sizeof(mcn_info->medium_catalog_number) - 1;
  	memcpy(mcn_info->medium_catalog_number, buf + 9, mcnlen);
  	mcn_info->medium_catalog_number[mcnlen] = '\0';
  
  	return 0;
  }
  
  int ide_cdrom_reset(struct cdrom_device_info *cdi)
  {
  	ide_drive_t *drive = cdi->handle;
  	struct cdrom_info *cd = drive->driver_data;
  	struct request_sense sense;
0ef4c4db7   FUJITA Tomonori   ide-cd: convert i...
295
  	struct request *rq;
17802998d   Bartlomiej Zolnierkiewicz   ide-cd: move code...
296
  	int ret;
71baba4b9   Mel Gorman   mm, page_alloc: r...
297
  	rq = blk_get_request(drive->queue, READ, __GFP_RECLAIM);
4f8c9510b   Christoph Hellwig   block: rename REQ...
298
  	rq->cmd_type = REQ_TYPE_DRV_PRIV;
0ef4c4db7   FUJITA Tomonori   ide-cd: convert i...
299
300
301
  	rq->cmd_flags = REQ_QUIET;
  	ret = blk_execute_rq(drive->queue, cd->disk, rq, 0);
  	blk_put_request(rq);
17802998d   Bartlomiej Zolnierkiewicz   ide-cd: move code...
302
303
304
305
  	/*
  	 * A reset will unlock the door. If it was previously locked,
  	 * lock it again.
  	 */
570f89ea5   Borislav Petkov   ide-cd: convert t...
306
  	if (drive->atapi_flags & IDE_AFLAG_DOOR_LOCKED)
17802998d   Bartlomiej Zolnierkiewicz   ide-cd: move code...
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
  		(void)ide_cd_lockdoor(drive, 1, &sense);
  
  	return ret;
  }
  
  static int ide_cd_get_toc_entry(ide_drive_t *drive, int track,
  				struct atapi_toc_entry **ent)
  {
  	struct cdrom_info *info = drive->driver_data;
  	struct atapi_toc *toc = info->toc;
  	int ntracks;
  
  	/*
  	 * don't serve cached data, if the toc isn't valid
  	 */
570f89ea5   Borislav Petkov   ide-cd: convert t...
322
  	if ((drive->atapi_flags & IDE_AFLAG_TOC_VALID) == 0)
17802998d   Bartlomiej Zolnierkiewicz   ide-cd: move code...
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
  		return -EINVAL;
  
  	/* Check validity of requested track number. */
  	ntracks = toc->hdr.last_track - toc->hdr.first_track + 1;
  
  	if (toc->hdr.first_track == CDROM_LEADOUT)
  		ntracks = 0;
  
  	if (track == CDROM_LEADOUT)
  		*ent = &toc->ent[ntracks];
  	else if (track < toc->hdr.first_track || track > toc->hdr.last_track)
  		return -EINVAL;
  	else
  		*ent = &toc->ent[track - toc->hdr.first_track];
  
  	return 0;
  }
  
  static int ide_cd_fake_play_trkind(ide_drive_t *drive, void *arg)
  {
  	struct cdrom_ti *ti = arg;
  	struct atapi_toc_entry *first_toc, *last_toc;
  	unsigned long lba_start, lba_end;
  	int stat;
17802998d   Bartlomiej Zolnierkiewicz   ide-cd: move code...
347
  	struct request_sense sense;
5f828546e   FUJITA Tomonori   ide-cd: convert i...
348
  	unsigned char cmd[BLK_MAX_CDB];
17802998d   Bartlomiej Zolnierkiewicz   ide-cd: move code...
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
  
  	stat = ide_cd_get_toc_entry(drive, ti->cdti_trk0, &first_toc);
  	if (stat)
  		return stat;
  
  	stat = ide_cd_get_toc_entry(drive, ti->cdti_trk1, &last_toc);
  	if (stat)
  		return stat;
  
  	if (ti->cdti_trk1 != CDROM_LEADOUT)
  		++last_toc;
  	lba_start = first_toc->addr.lba;
  	lba_end   = last_toc->addr.lba;
  
  	if (lba_end <= lba_start)
  		return -EINVAL;
5f828546e   FUJITA Tomonori   ide-cd: convert i...
365
  	memset(cmd, 0, BLK_MAX_CDB);
17802998d   Bartlomiej Zolnierkiewicz   ide-cd: move code...
366

5f828546e   FUJITA Tomonori   ide-cd: convert i...
367
368
369
  	cmd[0] = GPCMD_PLAY_AUDIO_MSF;
  	lba_to_msf(lba_start,   &cmd[3], &cmd[4], &cmd[5]);
  	lba_to_msf(lba_end - 1, &cmd[6], &cmd[7], &cmd[8]);
17802998d   Bartlomiej Zolnierkiewicz   ide-cd: move code...
370

1a677aba5   Harvey Harrison   ide: ide-cd_ioctl...
371
  	return ide_cd_queue_pc(drive, cmd, 0, NULL, NULL, &sense, 0, 0);
17802998d   Bartlomiej Zolnierkiewicz   ide-cd: move code...
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
  }
  
  static int ide_cd_read_tochdr(ide_drive_t *drive, void *arg)
  {
  	struct cdrom_info *cd = drive->driver_data;
  	struct cdrom_tochdr *tochdr = arg;
  	struct atapi_toc *toc;
  	int stat;
  
  	/* Make sure our saved TOC is valid. */
  	stat = ide_cd_read_toc(drive, NULL);
  	if (stat)
  		return stat;
  
  	toc = cd->toc;
  	tochdr->cdth_trk0 = toc->hdr.first_track;
  	tochdr->cdth_trk1 = toc->hdr.last_track;
  
  	return 0;
  }
  
  static int ide_cd_read_tocentry(ide_drive_t *drive, void *arg)
  {
  	struct cdrom_tocentry *tocentry = arg;
  	struct atapi_toc_entry *toce;
  	int stat;
  
  	stat = ide_cd_get_toc_entry(drive, tocentry->cdte_track, &toce);
  	if (stat)
  		return stat;
  
  	tocentry->cdte_ctrl = toce->control;
  	tocentry->cdte_adr  = toce->adr;
  	if (tocentry->cdte_format == CDROM_MSF) {
  		lba_to_msf(toce->addr.lba,
  			   &tocentry->cdte_addr.msf.minute,
  			   &tocentry->cdte_addr.msf.second,
  			   &tocentry->cdte_addr.msf.frame);
  	} else
  		tocentry->cdte_addr.lba = toce->addr.lba;
  
  	return 0;
  }
  
  int ide_cdrom_audio_ioctl(struct cdrom_device_info *cdi,
  			  unsigned int cmd, void *arg)
  {
  	ide_drive_t *drive = cdi->handle;
  
  	switch (cmd) {
  	/*
  	 * emulate PLAY_AUDIO_TI command with PLAY_AUDIO_10, since
  	 * atapi doesn't support it
  	 */
  	case CDROMPLAYTRKIND:
  		return ide_cd_fake_play_trkind(drive, arg);
  	case CDROMREADTOCHDR:
  		return ide_cd_read_tochdr(drive, arg);
  	case CDROMREADTOCENTRY:
  		return ide_cd_read_tocentry(drive, arg);
  	default:
  		return -EINVAL;
  	}
  }
f9afd18b5   Borislav Petkov   ide-cd: move the ...
436
437
438
439
440
  
  /* the generic packet interface to cdrom.c */
  int ide_cdrom_packet(struct cdrom_device_info *cdi,
  			    struct packet_command *cgc)
  {
f9afd18b5   Borislav Petkov   ide-cd: move the ...
441
  	ide_drive_t *drive = cdi->handle;
5f828546e   FUJITA Tomonori   ide-cd: convert i...
442
443
  	unsigned int flags = 0;
  	unsigned len = cgc->buflen;
f9afd18b5   Borislav Petkov   ide-cd: move the ...
444
445
446
447
448
449
450
  
  	if (cgc->timeout <= 0)
  		cgc->timeout = ATAPI_WAIT_PC;
  
  	/* here we queue the commands from the uniform CD-ROM
  	   layer. the packet must be complete, as we do not
  	   touch it at all. */
b348487f0   Bartlomiej Zolnierkiewicz   ide-cd: mark REQ_...
451

f9afd18b5   Borislav Petkov   ide-cd: move the ...
452
453
  	if (cgc->sense)
  		memset(cgc->sense, 0, sizeof(struct request_sense));
f9afd18b5   Borislav Petkov   ide-cd: move the ...
454
455
  
  	if (cgc->quiet)
5f828546e   FUJITA Tomonori   ide-cd: convert i...
456
  		flags |= REQ_QUIET;
f9afd18b5   Borislav Petkov   ide-cd: move the ...
457

5f828546e   FUJITA Tomonori   ide-cd: convert i...
458
459
460
461
  	cgc->stat = ide_cd_queue_pc(drive, cgc->cmd,
  				    cgc->data_direction == CGC_DATA_WRITE,
  				    cgc->buffer, &len,
  				    cgc->sense, cgc->timeout, flags);
f9afd18b5   Borislav Petkov   ide-cd: move the ...
462
  	if (!cgc->stat)
5f828546e   FUJITA Tomonori   ide-cd: convert i...
463
  		cgc->buflen -= len;
f9afd18b5   Borislav Petkov   ide-cd: move the ...
464
465
  	return cgc->stat;
  }