ide-cd_ioctl.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. /*
  2. * cdrom.c IOCTLs handling for ide-cd driver.
  3. *
  4. * Copyright (C) 1994-1996 Scott Snyder <snyder@fnald0.fnal.gov>
  5. * Copyright (C) 1996-1998 Erik Andersen <andersee@debian.org>
  6. * Copyright (C) 1998-2000 Jens Axboe <axboe@suse.de>
  7. */
  8. #include <linux/kernel.h>
  9. #include <linux/cdrom.h>
  10. #include <linux/ide.h>
  11. #include "ide-cd.h"
  12. int ide_cdrom_lock_door(struct cdrom_device_info *cdi, int lock)
  13. {
  14. ide_drive_t *drive = cdi->handle;
  15. return ide_cd_lockdoor(drive, lock, NULL);
  16. }
  17. /*
  18. * ATAPI devices are free to select the speed you request or any slower
  19. * rate. :-( Requesting too fast a speed will _not_ produce an error.
  20. */
  21. int ide_cdrom_select_speed(struct cdrom_device_info *cdi, int speed)
  22. {
  23. ide_drive_t *drive = cdi->handle;
  24. struct cdrom_info *cd = drive->driver_data;
  25. struct request rq;
  26. struct request_sense sense;
  27. u8 buf[ATAPI_CAPABILITIES_PAGE_SIZE];
  28. int stat;
  29. ide_cd_init_rq(drive, &rq);
  30. rq.sense = &sense;
  31. if (speed == 0)
  32. speed = 0xffff; /* set to max */
  33. else
  34. speed *= 177; /* Nx to kbytes/s */
  35. rq.cmd[0] = GPCMD_SET_SPEED;
  36. /* Read Drive speed in kbytes/second MSB/LSB */
  37. rq.cmd[2] = (speed >> 8) & 0xff;
  38. rq.cmd[3] = speed & 0xff;
  39. if ((cdi->mask & (CDC_CD_R | CDC_CD_RW | CDC_DVD_R)) !=
  40. (CDC_CD_R | CDC_CD_RW | CDC_DVD_R)) {
  41. /* Write Drive speed in kbytes/second MSB/LSB */
  42. rq.cmd[4] = (speed >> 8) & 0xff;
  43. rq.cmd[5] = speed & 0xff;
  44. }
  45. stat = ide_cd_queue_pc(drive, &rq);
  46. if (!ide_cdrom_get_capabilities(drive, buf)) {
  47. ide_cdrom_update_speed(drive, buf);
  48. cdi->speed = cd->current_speed;
  49. }
  50. return 0;
  51. }
  52. int ide_cdrom_get_last_session(struct cdrom_device_info *cdi,
  53. struct cdrom_multisession *ms_info)
  54. {
  55. struct atapi_toc *toc;
  56. ide_drive_t *drive = cdi->handle;
  57. struct cdrom_info *info = drive->driver_data;
  58. struct request_sense sense;
  59. int ret;
  60. if ((info->cd_flags & IDE_CD_FLAG_TOC_VALID) == 0 || !info->toc) {
  61. ret = ide_cd_read_toc(drive, &sense);
  62. if (ret)
  63. return ret;
  64. }
  65. toc = info->toc;
  66. ms_info->addr.lba = toc->last_session_lba;
  67. ms_info->xa_flag = toc->xa_flag;
  68. return 0;
  69. }
  70. int ide_cdrom_get_mcn(struct cdrom_device_info *cdi,
  71. struct cdrom_mcn *mcn_info)
  72. {
  73. ide_drive_t *drive = cdi->handle;
  74. int stat, mcnlen;
  75. struct request rq;
  76. char buf[24];
  77. ide_cd_init_rq(drive, &rq);
  78. rq.data = buf;
  79. rq.data_len = sizeof(buf);
  80. rq.cmd[0] = GPCMD_READ_SUBCHANNEL;
  81. rq.cmd[1] = 2; /* MSF addressing */
  82. rq.cmd[2] = 0x40; /* request subQ data */
  83. rq.cmd[3] = 2; /* format */
  84. rq.cmd[8] = sizeof(buf);
  85. stat = ide_cd_queue_pc(drive, &rq);
  86. if (stat)
  87. return stat;
  88. mcnlen = sizeof(mcn_info->medium_catalog_number) - 1;
  89. memcpy(mcn_info->medium_catalog_number, buf + 9, mcnlen);
  90. mcn_info->medium_catalog_number[mcnlen] = '\0';
  91. return 0;
  92. }
  93. int ide_cdrom_reset(struct cdrom_device_info *cdi)
  94. {
  95. ide_drive_t *drive = cdi->handle;
  96. struct cdrom_info *cd = drive->driver_data;
  97. struct request_sense sense;
  98. struct request req;
  99. int ret;
  100. ide_cd_init_rq(drive, &req);
  101. req.cmd_type = REQ_TYPE_SPECIAL;
  102. req.cmd_flags = REQ_QUIET;
  103. ret = ide_do_drive_cmd(drive, &req, ide_wait);
  104. /*
  105. * A reset will unlock the door. If it was previously locked,
  106. * lock it again.
  107. */
  108. if (cd->cd_flags & IDE_CD_FLAG_DOOR_LOCKED)
  109. (void)ide_cd_lockdoor(drive, 1, &sense);
  110. return ret;
  111. }
  112. static int ide_cd_get_toc_entry(ide_drive_t *drive, int track,
  113. struct atapi_toc_entry **ent)
  114. {
  115. struct cdrom_info *info = drive->driver_data;
  116. struct atapi_toc *toc = info->toc;
  117. int ntracks;
  118. /*
  119. * don't serve cached data, if the toc isn't valid
  120. */
  121. if ((info->cd_flags & IDE_CD_FLAG_TOC_VALID) == 0)
  122. return -EINVAL;
  123. /* Check validity of requested track number. */
  124. ntracks = toc->hdr.last_track - toc->hdr.first_track + 1;
  125. if (toc->hdr.first_track == CDROM_LEADOUT)
  126. ntracks = 0;
  127. if (track == CDROM_LEADOUT)
  128. *ent = &toc->ent[ntracks];
  129. else if (track < toc->hdr.first_track || track > toc->hdr.last_track)
  130. return -EINVAL;
  131. else
  132. *ent = &toc->ent[track - toc->hdr.first_track];
  133. return 0;
  134. }
  135. static int ide_cd_fake_play_trkind(ide_drive_t *drive, void *arg)
  136. {
  137. struct cdrom_ti *ti = arg;
  138. struct atapi_toc_entry *first_toc, *last_toc;
  139. unsigned long lba_start, lba_end;
  140. int stat;
  141. struct request rq;
  142. struct request_sense sense;
  143. stat = ide_cd_get_toc_entry(drive, ti->cdti_trk0, &first_toc);
  144. if (stat)
  145. return stat;
  146. stat = ide_cd_get_toc_entry(drive, ti->cdti_trk1, &last_toc);
  147. if (stat)
  148. return stat;
  149. if (ti->cdti_trk1 != CDROM_LEADOUT)
  150. ++last_toc;
  151. lba_start = first_toc->addr.lba;
  152. lba_end = last_toc->addr.lba;
  153. if (lba_end <= lba_start)
  154. return -EINVAL;
  155. ide_cd_init_rq(drive, &rq);
  156. rq.sense = &sense;
  157. rq.cmd[0] = GPCMD_PLAY_AUDIO_MSF;
  158. lba_to_msf(lba_start, &rq.cmd[3], &rq.cmd[4], &rq.cmd[5]);
  159. lba_to_msf(lba_end - 1, &rq.cmd[6], &rq.cmd[7], &rq.cmd[8]);
  160. return ide_cd_queue_pc(drive, &rq);
  161. }
  162. static int ide_cd_read_tochdr(ide_drive_t *drive, void *arg)
  163. {
  164. struct cdrom_info *cd = drive->driver_data;
  165. struct cdrom_tochdr *tochdr = arg;
  166. struct atapi_toc *toc;
  167. int stat;
  168. /* Make sure our saved TOC is valid. */
  169. stat = ide_cd_read_toc(drive, NULL);
  170. if (stat)
  171. return stat;
  172. toc = cd->toc;
  173. tochdr->cdth_trk0 = toc->hdr.first_track;
  174. tochdr->cdth_trk1 = toc->hdr.last_track;
  175. return 0;
  176. }
  177. static int ide_cd_read_tocentry(ide_drive_t *drive, void *arg)
  178. {
  179. struct cdrom_tocentry *tocentry = arg;
  180. struct atapi_toc_entry *toce;
  181. int stat;
  182. stat = ide_cd_get_toc_entry(drive, tocentry->cdte_track, &toce);
  183. if (stat)
  184. return stat;
  185. tocentry->cdte_ctrl = toce->control;
  186. tocentry->cdte_adr = toce->adr;
  187. if (tocentry->cdte_format == CDROM_MSF) {
  188. lba_to_msf(toce->addr.lba,
  189. &tocentry->cdte_addr.msf.minute,
  190. &tocentry->cdte_addr.msf.second,
  191. &tocentry->cdte_addr.msf.frame);
  192. } else
  193. tocentry->cdte_addr.lba = toce->addr.lba;
  194. return 0;
  195. }
  196. int ide_cdrom_audio_ioctl(struct cdrom_device_info *cdi,
  197. unsigned int cmd, void *arg)
  198. {
  199. ide_drive_t *drive = cdi->handle;
  200. switch (cmd) {
  201. /*
  202. * emulate PLAY_AUDIO_TI command with PLAY_AUDIO_10, since
  203. * atapi doesn't support it
  204. */
  205. case CDROMPLAYTRKIND:
  206. return ide_cd_fake_play_trkind(drive, arg);
  207. case CDROMREADTOCHDR:
  208. return ide_cd_read_tochdr(drive, arg);
  209. case CDROMREADTOCENTRY:
  210. return ide_cd_read_tocentry(drive, arg);
  211. default:
  212. return -EINVAL;
  213. }
  214. }