dvd-2.2.13-5.diff
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:291k
源码类别:

DVD

开发平台:

Unix_Linux

  1. + /* See   if there is a padding record at the end that needs to be removed */
  2. + if (good_sectors > SCpnt->request.nr_sectors)
  3. + good_sectors -= 2;
  4.   };
  5. -     };
  6. -     scsi_free(SCpnt->buffer, SCpnt->sglist_len);  /* Free list of scatter-gather pointers */
  7. -     if(SCpnt->request.sector % 4) good_sectors -= 2;
  8. -     /* See   if there is a padding record at the end that needs to be removed */
  9. -     if(good_sectors > SCpnt->request.nr_sectors)
  10. - good_sectors -= 2;
  11. - };
  12.  
  13.  #ifdef DEBUG
  14. - printk("(%x %x %x) ",SCpnt->request.bh, SCpnt->request.nr_sectors,
  15. + printk("(%x %x %x) ", SCpnt->request.bh, SCpnt->request.nr_sectors,
  16.          good_sectors);
  17.  #endif
  18. - if (SCpnt->request.nr_sectors > this_count)
  19. - {
  20. + if (SCpnt->request.nr_sectors > this_count) {
  21.   SCpnt->request.errors = 0;
  22.   if (!SCpnt->request.bh)
  23. -     panic("sr.c: linked page request (%lx %x)",
  24. -       SCpnt->request.sector, this_count);
  25. - }
  26. -
  27. - SCpnt = end_scsi_request(SCpnt, 1, good_sectors);  /* All done */
  28. - if (result == 0)
  29. -   {
  30. -     requeue_sr_request(SCpnt);
  31. -     return;
  32. -   }
  33. -    }
  34. -
  35. -    if (good_sectors == 0) {
  36. - /* We only come through here if no sectors were read successfully. */
  37. -
  38. -    /* Free up any indirection buffers we allocated for DMA purposes. */
  39. - if (SCpnt->use_sg) {
  40. - struct scatterlist * sgpnt;
  41. - int i;
  42. - sgpnt = (struct scatterlist *) SCpnt->buffer;
  43. - for(i=0; i<SCpnt->use_sg; i++) {
  44. -     if (sgpnt[i].alt_address) {
  45. - scsi_free(sgpnt[i].address, sgpnt[i].length);
  46. -     }
  47. - }
  48. - scsi_free(SCpnt->buffer, SCpnt->sglist_len);  /* Free list of scatter-gather pointers */
  49. - } else {
  50. - if (SCpnt->buffer != SCpnt->request.buffer)
  51. -     scsi_free(SCpnt->buffer, SCpnt->bufflen);
  52. + panic("sr.c: linked page request (%lx %x)",
  53. +       SCpnt->request.sector, this_count);
  54. + }
  55. + SCpnt = end_scsi_request(SCpnt, 1, good_sectors); /* All done */
  56. + if (result == 0) {
  57. + requeue_sr_request(SCpnt);
  58. + return;
  59. + }
  60.   }
  61. + if (good_sectors == 0) {
  62. + /* We only come through here if no sectors were read successfully. */
  63.  
  64. -    }
  65. + /* Free up any indirection buffers we allocated for DMA purposes. */
  66. + if (SCpnt->use_sg) {
  67. + struct scatterlist *sgpnt;
  68. + int i;
  69. + sgpnt = (struct scatterlist *) SCpnt->buffer;
  70. + for (i = 0; i < SCpnt->use_sg; i++) {
  71. + if (sgpnt[i].alt_address) {
  72. + scsi_free(sgpnt[i].address, sgpnt[i].length);
  73. + }
  74. + }
  75. + scsi_free(SCpnt->buffer, SCpnt->sglist_len); /* Free list of scatter-gather pointers */
  76. + } else {
  77. + if (SCpnt->buffer != SCpnt->request.buffer)
  78. + scsi_free(SCpnt->buffer, SCpnt->bufflen);
  79. + }
  80.  
  81. + }
  82.   if (driver_byte(result) != 0) {
  83.   if ((SCpnt->sense_buffer[0] & 0x7f) == 0x70) {
  84.   if ((SCpnt->sense_buffer[2] & 0xf) == UNIT_ATTENTION) {
  85.   /* detected disc change.  set a bit and quietly refuse
  86. -  * further access. */
  87. +  * further access.    */
  88.  
  89.   scsi_CDs[DEVICE_NR(SCpnt->request.rq_dev)].device->changed = 1;
  90.   SCpnt = end_scsi_request(SCpnt, 0, this_count);
  91. @@ -309,10 +314,9 @@
  92.   return;
  93.   }
  94.   }
  95. -
  96.   if (SCpnt->sense_buffer[2] == ILLEGAL_REQUEST) {
  97.   printk("sr%d: CD-ROM error: ",
  98. -                               DEVICE_NR(SCpnt->request.rq_dev));
  99. +        DEVICE_NR(SCpnt->request.rq_dev));
  100.   print_sense("sr", SCpnt);
  101.   printk("command was: ");
  102.   print_command(SCpnt->cmnd);
  103. @@ -323,95 +327,87 @@
  104.   return;
  105.   } else {
  106.   SCpnt = end_scsi_request(SCpnt, 0, this_count);
  107. - requeue_sr_request(SCpnt); /* Do next request */
  108. + requeue_sr_request(SCpnt); /* Do next request */
  109.   return;
  110.   }
  111.  
  112.   }
  113. -
  114.   if (SCpnt->sense_buffer[2] == NOT_READY) {
  115.   printk(KERN_INFO "sr%d: CD-ROM not ready.  Make sure you have a disc in the drive.n",
  116. -                               DEVICE_NR(SCpnt->request.rq_dev));
  117. +        DEVICE_NR(SCpnt->request.rq_dev));
  118.   SCpnt = end_scsi_request(SCpnt, 0, this_count);
  119. - requeue_sr_request(SCpnt); /* Do next request */
  120. + requeue_sr_request(SCpnt); /* Do next request */
  121.   return;
  122.   }
  123. -
  124.   if (SCpnt->sense_buffer[2] == MEDIUM_ERROR) {
  125. -     printk("scsi%d: MEDIUM ERROR on "
  126. -    "channel %d, id %d, lun %d, CDB: ",
  127. -    SCpnt->host->host_no, (int) SCpnt->channel,
  128. -    (int) SCpnt->target, (int) SCpnt->lun);
  129. -     print_command(SCpnt->cmnd);
  130. -     print_sense("sr", SCpnt);
  131. -     SCpnt = end_scsi_request(SCpnt, 0, block_sectors);
  132. -     requeue_sr_request(SCpnt);
  133. -     return;
  134. + printk("scsi%d: MEDIUM ERROR on "
  135. +        "channel %d, id %d, lun %d, CDB: ",
  136. +        SCpnt->host->host_no, (int) SCpnt->channel,
  137. +        (int) SCpnt->target, (int) SCpnt->lun);
  138. + print_command(SCpnt->cmnd);
  139. + print_sense("sr", SCpnt);
  140. + SCpnt = end_scsi_request(SCpnt, 0, block_sectors);
  141. + requeue_sr_request(SCpnt);
  142. + return;
  143.   }
  144. -
  145.   if (SCpnt->sense_buffer[2] == VOLUME_OVERFLOW) {
  146. -     printk("scsi%d: VOLUME OVERFLOW on "
  147. -    "channel %d, id %d, lun %d, CDB: ",
  148. -    SCpnt->host->host_no, (int) SCpnt->channel,
  149. -    (int) SCpnt->target, (int) SCpnt->lun);
  150. -     print_command(SCpnt->cmnd);
  151. -     print_sense("sr", SCpnt);
  152. -     SCpnt = end_scsi_request(SCpnt, 0, block_sectors);
  153. -     requeue_sr_request(SCpnt);
  154. -     return;
  155. + printk("scsi%d: VOLUME OVERFLOW on "
  156. +        "channel %d, id %d, lun %d, CDB: ",
  157. +        SCpnt->host->host_no, (int) SCpnt->channel,
  158. +        (int) SCpnt->target, (int) SCpnt->lun);
  159. + print_command(SCpnt->cmnd);
  160. + print_sense("sr", SCpnt);
  161. + SCpnt = end_scsi_request(SCpnt, 0, block_sectors);
  162. + requeue_sr_request(SCpnt);
  163. + return;
  164.   }
  165. -        }
  166. -
  167. + }
  168.   /* We only get this far if we have an error we have not recognized */
  169. - if(result) {
  170. - printk("SCSI CD error : host %d id %d lun %d return code = %03xn",
  171. -        scsi_CDs[DEVICE_NR(SCpnt->request.rq_dev)].device->host->host_no,
  172. -        scsi_CDs[DEVICE_NR(SCpnt->request.rq_dev)].device->id,
  173. -        scsi_CDs[DEVICE_NR(SCpnt->request.rq_dev)].device->lun,
  174. -        result);
  175. -
  176. - if (status_byte(result) == CHECK_CONDITION)
  177. -     print_sense("sr", SCpnt);
  178. -
  179. - SCpnt = end_scsi_request(SCpnt, 0, SCpnt->request.current_nr_sectors);
  180. - requeue_sr_request(SCpnt);
  181. -    }
  182. + if (result) {
  183. + printk("SCSI CD error : host %d id %d lun %d return code = %03xn",
  184. +        scsi_CDs[DEVICE_NR(SCpnt->request.rq_dev)].device->host->host_no,
  185. +    scsi_CDs[DEVICE_NR(SCpnt->request.rq_dev)].device->id,
  186. +   scsi_CDs[DEVICE_NR(SCpnt->request.rq_dev)].device->lun,
  187. +        result);
  188. +
  189. + if (status_byte(result) == CHECK_CONDITION)
  190. + print_sense("sr", SCpnt);
  191. +
  192. + SCpnt = end_scsi_request(SCpnt, 0, SCpnt->request.current_nr_sectors);
  193. + requeue_sr_request(SCpnt);
  194. + }
  195.  }
  196.  
  197.  static int sr_open(struct cdrom_device_info *cdi, int purpose)
  198.  {
  199. -    check_disk_change(cdi->dev);
  200. + check_disk_change(cdi->dev);
  201.  
  202. -    if(   MINOR(cdi->dev) >= sr_template.dev_max 
  203. -       || !scsi_CDs[MINOR(cdi->dev)].device)
  204. -      {
  205. - return -ENXIO;   /* No such device */
  206. -      }
  207. -
  208. -    /*
  209. -     * If the device is in error recovery, wait until it is done.
  210. -     * If the device is offline, then disallow any access to it.
  211. -     */
  212. -    if( !scsi_block_when_processing_errors(scsi_CDs[MINOR(cdi->dev)].device) )
  213. -      {
  214. -        return -ENXIO;
  215. -      }
  216. -
  217. -    scsi_CDs[MINOR(cdi->dev)].device->access_count++;
  218. -    if (scsi_CDs[MINOR(cdi->dev)].device->host->hostt->module)
  219. - __MOD_INC_USE_COUNT(scsi_CDs[MINOR(cdi->dev)].device->host->hostt->module);
  220. -    if(sr_template.module)
  221. -        __MOD_INC_USE_COUNT(sr_template.module);
  222. -
  223. -    /* If this device did not have media in the drive at boot time, then
  224. -     * we would have been unable to get the sector size.  Check to see if
  225. -     * this is the case, and try again.
  226. -     */
  227. + if (MINOR(cdi->dev) >= sr_template.dev_max
  228. +     || !scsi_CDs[MINOR(cdi->dev)].device) {
  229. + return -ENXIO; /* No such device */
  230. + }
  231. + /*
  232. +  * If the device is in error recovery, wait until it is done.
  233. +  * If the device is offline, then disallow any access to it.
  234. +  */
  235. + if (!scsi_block_when_processing_errors(scsi_CDs[MINOR(cdi->dev)].device)) {
  236. + return -ENXIO;
  237. + }
  238. + scsi_CDs[MINOR(cdi->dev)].device->access_count++;
  239. + if (scsi_CDs[MINOR(cdi->dev)].device->host->hostt->module)
  240. + __MOD_INC_USE_COUNT(scsi_CDs[MINOR(cdi->dev)].device->host->hostt->module);
  241. + if (sr_template.module)
  242. + __MOD_INC_USE_COUNT(sr_template.module);
  243. +
  244. + /* If this device did not have media in the drive at boot time, then
  245. +  * we would have been unable to get the sector size.  Check to see if
  246. +  * this is the case, and try again.
  247. +  */
  248.  
  249. -    if(scsi_CDs[MINOR(cdi->dev)].needs_sector_size)
  250. - get_sectorsize(MINOR(cdi->dev));
  251. + if (scsi_CDs[MINOR(cdi->dev)].needs_sector_size)
  252. + get_sectorsize(MINOR(cdi->dev));
  253.  
  254. -    return 0;
  255. + return 0;
  256.  }
  257.  
  258.  /*
  259. @@ -420,111 +416,106 @@
  260.   * translate them to SCSI commands.
  261.   */
  262.  
  263. -static void do_sr_request (void)
  264. +static void do_sr_request(void)
  265.  {
  266. -    Scsi_Cmnd * SCpnt = NULL;
  267. -    struct request * req = NULL;
  268. -    Scsi_Device * SDev;
  269. -    int flag = 0;
  270. -
  271. -    while (1==1){
  272. - if (CURRENT != NULL && CURRENT->rq_status == RQ_INACTIVE) {
  273. -     return;
  274. - };
  275. + Scsi_Cmnd *SCpnt = NULL;
  276. + struct request *req = NULL;
  277. + Scsi_Device *SDev;
  278. + int flag = 0;
  279.  
  280. - INIT_SCSI_REQUEST;
  281. + while (1 == 1) {
  282. + if (CURRENT != NULL && CURRENT->rq_status == RQ_INACTIVE) {
  283. + return;
  284. + };
  285.  
  286. - SDev = scsi_CDs[DEVICE_NR(CURRENT->rq_dev)].device;
  287. + INIT_SCSI_REQUEST;
  288.  
  289. -        /*
  290. -         * If the host for this device is in error recovery mode, don't
  291. -         * do anything at all here.  When the host leaves error recovery
  292. -         * mode, it will automatically restart things and start queueing
  293. -         * commands again.
  294. -         */
  295. -        if( SDev->host->in_recovery )
  296. -          {
  297. -            return;
  298. -          }
  299. + SDev = scsi_CDs[DEVICE_NR(CURRENT->rq_dev)].device;
  300.  
  301. - /*
  302. -  * I am not sure where the best place to do this is.  We need
  303. -  * to hook in a place where we are likely to come if in user
  304. -  * space.
  305. -  */
  306. - if( SDev->was_reset )
  307. - {
  308. -      /*
  309. -       * We need to relock the door, but we might
  310. -       * be in an interrupt handler.  Only do this
  311. -       * from user space, since we do not want to
  312. -       * sleep from an interrupt.
  313. -       */
  314. -      if( SDev->removable && !in_interrupt() )
  315. -      {
  316. - spin_unlock_irq(&io_request_lock); /* FIXME!!!! */
  317. - scsi_ioctl(SDev, SCSI_IOCTL_DOORLOCK, 0);
  318. - spin_lock_irq(&io_request_lock); /* FIXME!!!! */
  319. - /* scsi_ioctl may allow CURRENT to change, so start over. */
  320. - SDev->was_reset = 0;
  321. - continue;
  322. -      }
  323. -      SDev->was_reset = 0;
  324. - }
  325. -
  326. - /* we do lazy blocksize switching (when reading XA sectors,
  327. -  * see CDROMREADMODE2 ioctl) */
  328. - if (scsi_CDs[DEVICE_NR(CURRENT->rq_dev)].sector_size > 2048) {
  329. -     if (!in_interrupt())
  330. - sr_set_blocklength(DEVICE_NR(CURRENT->rq_dev),2048);
  331. + /*
  332. +  * If the host for this device is in error recovery mode, don't
  333. +  * do anything at all here.  When the host leaves error recovery
  334. +  * mode, it will automatically restart things and start queueing
  335. +  * commands again.
  336. +  */
  337. + if (SDev->host->in_recovery) {
  338. + return;
  339. + }
  340. + /*
  341. +  * I am not sure where the best place to do this is.  We need
  342. +  * to hook in a place where we are likely to come if in user
  343. +  * space.
  344. +  */
  345. + if (SDev->was_reset) {
  346. + /*
  347. +  * We need to relock the door, but we might
  348. +  * be in an interrupt handler.  Only do this
  349. +  * from user space, since we do not want to
  350. +  * sleep from an interrupt.
  351. +  */
  352. + if (SDev->removable && !in_interrupt()) {
  353. + spin_unlock_irq(&io_request_lock); /* FIXME!!!! */
  354. + scsi_ioctl(SDev, SCSI_IOCTL_DOORLOCK, 0);
  355. + spin_lock_irq(&io_request_lock); /* FIXME!!!! */
  356. + /* scsi_ioctl may allow CURRENT to change, so start over. */
  357. + SDev->was_reset = 0;
  358. + continue;
  359. + }
  360. + SDev->was_reset = 0;
  361. + }
  362. + /* we do lazy blocksize switching (when reading XA sectors,
  363. +  * see CDROMREADMODE2 ioctl) */
  364. + if (scsi_CDs[DEVICE_NR(CURRENT->rq_dev)].sector_size > 2048) {
  365. + if (!in_interrupt())
  366. + sr_set_blocklength(DEVICE_NR(CURRENT->rq_dev), 2048);
  367.  #if 1
  368. -            else
  369. -                printk("sr: can't switch blocksize: in interruptn");
  370. + else
  371. + printk("sr: can't switch blocksize: in interruptn");
  372.  #endif
  373. - }
  374. -
  375. - if (flag++ == 0)
  376. -     SCpnt = scsi_allocate_device(&CURRENT,
  377. -     scsi_CDs[DEVICE_NR(CURRENT->rq_dev)].device, 0);
  378. - else SCpnt = NULL;
  379. -
  380. - /* This is a performance enhancement.  We dig down into the request list and
  381. -  * try to find a queueable request (i.e. device not busy, and host able to
  382. -  * accept another command.  If we find one, then we queue it. This can
  383. -  * make a big difference on systems with more than one disk drive.  We want
  384. -  * to have the interrupts off when monkeying with the request list, because
  385. -  * otherwise the kernel might try to slip in a request in between somewhere. */
  386. -
  387. - if (!SCpnt && sr_template.nr_dev > 1){
  388. -     struct request *req1;
  389. -     req1 = NULL;
  390. -     req = CURRENT;
  391. -     while(req){
  392. - SCpnt = scsi_request_queueable(req,
  393. -   scsi_CDs[DEVICE_NR(req->rq_dev)].device);
  394. - if(SCpnt) break;
  395. - req1 = req;
  396. - req = req->next;
  397. -     }
  398. -     if (SCpnt && req->rq_status == RQ_INACTIVE) {
  399. - if (req == CURRENT)
  400. -     CURRENT = CURRENT->next;
  401. + }
  402. + if (flag++ == 0)
  403. + SCpnt = scsi_allocate_device(&CURRENT,
  404. +  scsi_CDs[DEVICE_NR(CURRENT->rq_dev)].device, 0);
  405.   else
  406. -     req1->next = req->next;
  407. -     }
  408. - }
  409. + SCpnt = NULL;
  410.  
  411. - if (!SCpnt)
  412. -     return; /* Could not find anything to do */
  413. + /* This is a performance enhancement.  We dig down into the request list and
  414. +  * try to find a queueable request (i.e. device not busy, and host able to
  415. +  * accept another command.  If we find one, then we queue it. This can
  416. +  * make a big difference on systems with more than one disk drive.  We want
  417. +  * to have the interrupts off when monkeying with the request list, because
  418. +  * otherwise the kernel might try to slip in a request in between somewhere. */
  419. +
  420. + if (!SCpnt && sr_template.nr_dev > 1) {
  421. + struct request *req1;
  422. + req1 = NULL;
  423. + req = CURRENT;
  424. + while (req) {
  425. + SCpnt = scsi_request_queueable(req,
  426. + scsi_CDs[DEVICE_NR(req->rq_dev)].device);
  427. + if (SCpnt)
  428. + break;
  429. + req1 = req;
  430. + req = req->next;
  431. + }
  432. + if (SCpnt && req->rq_status == RQ_INACTIVE) {
  433. + if (req == CURRENT)
  434. + CURRENT = CURRENT->next;
  435. + else
  436. + req1->next = req->next;
  437. + }
  438. + }
  439. + if (!SCpnt)
  440. + return; /* Could not find anything to do */
  441.  
  442. - wake_up(&wait_for_request);
  443. + wake_up(&wait_for_request);
  444.  
  445. - /* Queue command */
  446. - requeue_sr_request(SCpnt);
  447. -    }  /* While */
  448. + /* Queue command */
  449. + requeue_sr_request(SCpnt);
  450. + } /* While */
  451.  }
  452.  
  453. -void requeue_sr_request (Scsi_Cmnd * SCpnt)
  454. +void requeue_sr_request(Scsi_Cmnd * SCpnt)
  455.  {
  456.   unsigned int dev, block, realcount;
  457.   unsigned char cmd[10], *buffer, tries;
  458. @@ -532,244 +523,234 @@
  459.  
  460.   tries = 2;
  461.  
  462. - repeat:
  463. - if(!SCpnt || SCpnt->request.rq_status == RQ_INACTIVE) {
  464. +repeat:
  465. + if (!SCpnt || SCpnt->request.rq_status == RQ_INACTIVE) {
  466.   do_sr_request();
  467.   return;
  468.   }
  469. -
  470. - dev =  MINOR(SCpnt->request.rq_dev);
  471. + dev = MINOR(SCpnt->request.rq_dev);
  472.   block = SCpnt->request.sector;
  473.   buffer = NULL;
  474.   this_count = 0;
  475.  
  476.   if (dev >= sr_template.nr_dev) {
  477. - /* printk("CD-ROM request error: invalid device.n"); */
  478. + /* printk("CD-ROM request error: invalid device.n");                   */
  479.   SCpnt = end_scsi_request(SCpnt, 0, SCpnt->request.nr_sectors);
  480.   tries = 2;
  481.   goto repeat;
  482.   }
  483. -
  484.   if (!scsi_CDs[dev].use) {
  485. - /* printk("CD-ROM request error: device marked not in use.n"); */
  486. + /* printk("CD-ROM request error: device marked not in use.n");         */
  487. + SCpnt = end_scsi_request(SCpnt, 0, SCpnt->request.nr_sectors);
  488. + tries = 2;
  489. + goto repeat;
  490. + }
  491. + if (!scsi_CDs[dev].device->online) {
  492.   SCpnt = end_scsi_request(SCpnt, 0, SCpnt->request.nr_sectors);
  493.   tries = 2;
  494.   goto repeat;
  495.   }
  496. -
  497. - if( !scsi_CDs[dev].device->online )
  498. -          {
  499. -            SCpnt = end_scsi_request(SCpnt, 0, SCpnt->request.nr_sectors);
  500. -            tries = 2;
  501. -            goto repeat;
  502. -          }
  503. -
  504.   if (scsi_CDs[dev].device->changed) {
  505. - /*
  506. -  * quietly refuse to do anything to a changed disc
  507. -  * until the changed bit has been reset
  508. -  */
  509. - /* printk("CD-ROM has been changed.  Prohibiting further I/O.n"); */
  510. + /*
  511. +  * quietly refuse to do anything to a changed disc
  512. +  * until the changed bit has been reset
  513. +  */
  514. + /* printk("CD-ROM has been changed.  Prohibiting further I/O.n");      */
  515.   SCpnt = end_scsi_request(SCpnt, 0, SCpnt->request.nr_sectors);
  516.   tries = 2;
  517.   goto repeat;
  518.   }
  519. -
  520. - switch (SCpnt->request.cmd)
  521. -    {
  522. -    case WRITE:
  523. - SCpnt = end_scsi_request(SCpnt, 0, SCpnt->request.nr_sectors);
  524. - goto repeat;
  525. - break;
  526. -    case READ :
  527. - cmd[0] = READ_6;
  528. - break;
  529. -    default :
  530. - panic ("Unknown sr command %dn", SCpnt->request.cmd);
  531. -    }
  532. + switch (SCpnt->request.cmd) {
  533. + case WRITE:
  534. + SCpnt = end_scsi_request(SCpnt, 0, SCpnt->request.nr_sectors);
  535. + goto repeat;
  536. + break;
  537. + case READ:
  538. + cmd[0] = READ_6;
  539. + break;
  540. + default:
  541. + panic("Unknown sr command %dn", SCpnt->request.cmd);
  542. + }
  543.  
  544.   cmd[1] = (SCpnt->lun << 5) & 0xe0;
  545.  
  546. -    /*
  547. -     * Now do the grungy work of figuring out which sectors we need, and
  548. -     * where in memory we are going to put them.
  549. -     *
  550. -     * The variables we need are:
  551. -     *
  552. -     * this_count= number of 512 byte sectors being read
  553. -     * block     = starting cdrom sector to read.
  554. -     * realcount = # of cdrom sectors to read
  555. -     *
  556. -     * The major difference between a scsi disk and a scsi cdrom
  557. -     * is that we will always use scatter-gather if we can, because we can
  558. -     * work around the fact that the buffer cache has a block size of 1024,
  559. -     * and we have 2048 byte sectors.  This code should work for buffers that
  560. -     * are any multiple of 512 bytes long.
  561. -     */
  562. + /*
  563. +  * Now do the grungy work of figuring out which sectors we need, and
  564. +  * where in memory we are going to put them.
  565. +  *
  566. +  * The variables we need are:
  567. +  *
  568. +  * this_count= number of 512 byte sectors being read
  569. +  * block     = starting cdrom sector to read.
  570. +  * realcount = # of cdrom sectors to read
  571. +  *
  572. +  * The major difference between a scsi disk and a scsi cdrom
  573. +  * is that we will always use scatter-gather if we can, because we can
  574. +  * work around the fact that the buffer cache has a block size of 1024,
  575. +  * and we have 2048 byte sectors.  This code should work for buffers that
  576. +  * are any multiple of 512 bytes long.
  577. +  */
  578.  
  579.   SCpnt->use_sg = 0;
  580.  
  581.   if (SCpnt->host->sg_tablesize > 0 &&
  582.       (!scsi_need_isa_buffer ||
  583. -  scsi_dma_free_sectors >= 10)) {
  584. - struct buffer_head * bh;
  585. - struct scatterlist * sgpnt;
  586. - int count, this_count_max;
  587. - bh = SCpnt->request.bh;
  588. - this_count = 0;
  589. - count = 0;
  590. - this_count_max = (scsi_CDs[dev].ten ? 0xffff : 0xff) << 4;
  591. - /* Calculate how many links we can use.  First see if we need
  592. -  * a padding record at the start */
  593. - this_count = SCpnt->request.sector % 4;
  594. - if(this_count) count++;
  595. - while(bh && count < SCpnt->host->sg_tablesize) {
  596. -     if ((this_count + (bh->b_size >> 9)) > this_count_max) break;
  597. -     this_count += (bh->b_size >> 9);
  598. -     count++;
  599. -     bh = bh->b_reqnext;
  600. - };
  601. - /* Fix up in case of an odd record at the end */
  602. - end_rec = 0;
  603. - if(this_count % 4) {
  604. -     if (count < SCpnt->host->sg_tablesize) {
  605. - count++;
  606. - end_rec = (4 - (this_count % 4)) << 9;
  607. - this_count += 4 - (this_count % 4);
  608. -     } else {
  609. - count--;
  610. - this_count -= (this_count % 4);
  611. -     };
  612. - };
  613. - SCpnt->use_sg = count;  /* Number of chains */
  614. - /* scsi_malloc can only allocate in chunks of 512 bytes */
  615. - count  = (SCpnt->use_sg * sizeof(struct scatterlist) + 511) & ~511;
  616. -
  617. - SCpnt->sglist_len = count;
  618. - sgpnt = (struct scatterlist * ) scsi_malloc(count);
  619. - if (!sgpnt) {
  620. -     printk("Warning - running *really* short on DMA buffersn");
  621. -     SCpnt->use_sg = 0;  /* No memory left - bail out */
  622. - } else {
  623. -     buffer = (unsigned char *) sgpnt;
  624. -     count = 0;
  625. -     bh = SCpnt->request.bh;
  626. -     if(SCpnt->request.sector % 4) {
  627. - sgpnt[count].length = (SCpnt->request.sector % 4) << 9;
  628. - sgpnt[count].address = (char *) scsi_malloc(sgpnt[count].length);
  629. - if(!sgpnt[count].address) panic("SCSI DMA pool exhausted.");
  630. - sgpnt[count].alt_address = sgpnt[count].address; /* Flag to delete
  631. -     if needed */
  632. - count++;
  633. -     };
  634. -     for(bh = SCpnt->request.bh; count < SCpnt->use_sg;
  635. - count++, bh = bh->b_reqnext) {
  636. - if (bh) { /* Need a placeholder at the end of the record? */
  637. -     sgpnt[count].address = bh->b_data;
  638. -     sgpnt[count].length = bh->b_size;
  639. -     sgpnt[count].alt_address = NULL;
  640. - } else {
  641. -     sgpnt[count].address = (char *) scsi_malloc(end_rec);
  642. -     if(!sgpnt[count].address) panic("SCSI DMA pool exhausted.");
  643. -     sgpnt[count].length = end_rec;
  644. -     sgpnt[count].alt_address = sgpnt[count].address;
  645. -     if (count+1 != SCpnt->use_sg) panic("Bad sr request list");
  646. -     break;
  647. +      scsi_dma_free_sectors >= 10)) {
  648. + struct buffer_head *bh;
  649. + struct scatterlist *sgpnt;
  650. + int count, this_count_max;
  651. + bh = SCpnt->request.bh;
  652. + this_count = 0;
  653. + count = 0;
  654. + this_count_max = (scsi_CDs[dev].ten ? 0xffff : 0xff) << 4;
  655. + /* Calculate how many links we can use.  First see if we need
  656. +  * a padding record at the start */
  657. + this_count = SCpnt->request.sector % 4;
  658. + if (this_count)
  659. + count++;
  660. + while (bh && count < SCpnt->host->sg_tablesize) {
  661. + if ((this_count + (bh->b_size >> 9)) > this_count_max)
  662. + break;
  663. + this_count += (bh->b_size >> 9);
  664. + count++;
  665. + bh = bh->b_reqnext;
  666.   };
  667. - if (virt_to_phys(sgpnt[count].address) + sgpnt[count].length - 1 >
  668. -     ISA_DMA_THRESHOLD && SCpnt->host->unchecked_isa_dma) {
  669. -     sgpnt[count].alt_address = sgpnt[count].address;
  670. -     /* We try to avoid exhausting the DMA pool, since it is easier
  671. -      * to control usage here.  In other places we might have a more
  672. -      * pressing need, and we would be screwed if we ran out */
  673. -     if(scsi_dma_free_sectors < (sgpnt[count].length >> 9) + 5) {
  674. - sgpnt[count].address = NULL;
  675. -     } else {
  676. - sgpnt[count].address = (char *) scsi_malloc(sgpnt[count].length);
  677. -     };
  678. -     /* If we start running low on DMA buffers, we abort the scatter-gather
  679. -      * operation, and free all of the memory we have allocated.  We want to
  680. -      * ensure that all scsi operations are able to do at least a non-scatter/gather
  681. -      * operation */
  682. -     if(sgpnt[count].address == NULL){ /* Out of dma memory */
  683. - printk("Warning: Running low on SCSI DMA buffersn");
  684. - /* Try switching back to a non scatter-gather operation. */
  685. - while(--count >= 0){
  686. -     if(sgpnt[count].alt_address)
  687. - scsi_free(sgpnt[count].address, sgpnt[count].length);
  688. + /* Fix up in case of an odd record at the end */
  689. + end_rec = 0;
  690. + if (this_count % 4) {
  691. + if (count < SCpnt->host->sg_tablesize) {
  692. + count++;
  693. + end_rec = (4 - (this_count % 4)) << 9;
  694. + this_count += 4 - (this_count % 4);
  695. + } else {
  696. + count--;
  697. + this_count -= (this_count % 4);
  698.   };
  699. - SCpnt->use_sg = 0;
  700. - scsi_free(buffer, SCpnt->sglist_len);
  701. - break;
  702. -     }; /* if address == NULL */
  703. - };  /* if need DMA fixup */
  704. -     };  /* for loop to fill list */
  705. + };
  706. + SCpnt->use_sg = count; /* Number of chains */
  707. + /* scsi_malloc can only allocate in chunks of 512 bytes */
  708. + count = (SCpnt->use_sg * sizeof(struct scatterlist) + 511) & ~511;
  709. +
  710. + SCpnt->sglist_len = count;
  711. + sgpnt = (struct scatterlist *) scsi_malloc(count);
  712. + if (!sgpnt) {
  713. + printk("Warning - running *really* short on DMA buffersn");
  714. + SCpnt->use_sg = 0; /* No memory left - bail out */
  715. + } else {
  716. + buffer = (unsigned char *) sgpnt;
  717. + count = 0;
  718. + bh = SCpnt->request.bh;
  719. + if (SCpnt->request.sector % 4) {
  720. + sgpnt[count].length = (SCpnt->request.sector % 4) << 9;
  721. + sgpnt[count].address = (char *) scsi_malloc(sgpnt[count].length);
  722. + if (!sgpnt[count].address)
  723. + panic("SCSI DMA pool exhausted.");
  724. + sgpnt[count].alt_address = sgpnt[count].address; /* Flag to delete
  725. +    if needed */
  726. + count++;
  727. + };
  728. + for (bh = SCpnt->request.bh; count < SCpnt->use_sg;
  729. +      count++, bh = bh->b_reqnext) {
  730. + if (bh) { /* Need a placeholder at the end of the record? */
  731. + sgpnt[count].address = bh->b_data;
  732. + sgpnt[count].length = bh->b_size;
  733. + sgpnt[count].alt_address = NULL;
  734. + } else {
  735. + sgpnt[count].address = (char *) scsi_malloc(end_rec);
  736. + if (!sgpnt[count].address)
  737. + panic("SCSI DMA pool exhausted.");
  738. + sgpnt[count].length = end_rec;
  739. + sgpnt[count].alt_address = sgpnt[count].address;
  740. + if (count + 1 != SCpnt->use_sg)
  741. + panic("Bad sr request list");
  742. + break;
  743. + };
  744. + if (virt_to_phys(sgpnt[count].address) + sgpnt[count].length - 1 >
  745. +     ISA_DMA_THRESHOLD && SCpnt->host->unchecked_isa_dma) {
  746. + sgpnt[count].alt_address = sgpnt[count].address;
  747. + /* We try to avoid exhausting the DMA pool, since it is easier
  748. +  * to control usage here.  In other places we might have a more
  749. +  * pressing need, and we would be screwed if we ran out */
  750. + if (scsi_dma_free_sectors < (sgpnt[count].length >> 9) + 5) {
  751. + sgpnt[count].address = NULL;
  752. + } else {
  753. + sgpnt[count].address = (char *) scsi_malloc(sgpnt[count].length);
  754. + };
  755. + /* If we start running low on DMA buffers, we abort the scatter-gather
  756. +  * operation, and free all of the memory we have allocated.  We want to
  757. +  * ensure that all scsi operations are able to do at least a non-scatter/gather
  758. +  * operation */
  759. + if (sgpnt[count].address == NULL) { /* Out of dma memory */
  760. + printk("Warning: Running low on SCSI DMA buffersn");
  761. + /* Try switching back to a non scatter-gather operation. */
  762. + while (--count >= 0) {
  763. + if (sgpnt[count].alt_address)
  764. + scsi_free(sgpnt[count].address, sgpnt[count].length);
  765. + };
  766. + SCpnt->use_sg = 0;
  767. + scsi_free(buffer, SCpnt->sglist_len);
  768. + break;
  769. + }; /* if address == NULL */
  770. + }; /* if need DMA fixup */
  771. + }; /* for loop to fill list */
  772.  #ifdef DEBUG
  773. -     printk("SR: %d %d %d %d %d *** ",SCpnt->use_sg, SCpnt->request.sector,
  774. -    this_count,
  775. -    SCpnt->request.current_nr_sectors,
  776. -    SCpnt->request.nr_sectors);
  777. -     for(count=0; count<SCpnt->use_sg; count++)
  778. - printk("SGlist: %d %x %x %xn", count,
  779. -        sgpnt[count].address,
  780. -        sgpnt[count].alt_address,
  781. -        sgpnt[count].length);
  782. + printk("SR: %d %d %d %d %d *** ", SCpnt->use_sg, SCpnt->request.sector,
  783. +        this_count,
  784. +        SCpnt->request.current_nr_sectors,
  785. +        SCpnt->request.nr_sectors);
  786. + for (count = 0; count < SCpnt->use_sg; count++)
  787. + printk("SGlist: %d %x %x %xn", count,
  788. +        sgpnt[count].address,
  789. +        sgpnt[count].alt_address,
  790. +        sgpnt[count].length);
  791.  #endif
  792. - };  /* Able to allocate scatter-gather list */
  793. + }; /* Able to allocate scatter-gather list */
  794.   };
  795.  
  796. - if (SCpnt->use_sg == 0){
  797. - /* We cannot use scatter-gather.  Do this the old fashion way */
  798. - if (!SCpnt->request.bh)
  799. -     this_count = SCpnt->request.nr_sectors;
  800. - else
  801. -     this_count = (SCpnt->request.bh->b_size >> 9);
  802. + if (SCpnt->use_sg == 0) {
  803. + /* We cannot use scatter-gather.  Do this the old fashion way */
  804. + if (!SCpnt->request.bh)
  805. + this_count = SCpnt->request.nr_sectors;
  806. + else
  807. + this_count = (SCpnt->request.bh->b_size >> 9);
  808.  
  809. - start = block % 4;
  810. - if (start)
  811. -     {
  812. -     this_count = ((this_count > 4 - start) ?
  813. -   (4 - start) : (this_count));
  814. -     buffer = (unsigned char *) scsi_malloc(2048);
  815. -     }
  816. - else if (this_count < 4)
  817. -     {
  818. -     buffer = (unsigned char *) scsi_malloc(2048);
  819. -     }
  820. - else
  821. -     {
  822. -     this_count -= this_count % 4;
  823. -     buffer = (unsigned char *) SCpnt->request.buffer;
  824. -     if (virt_to_phys(buffer) + (this_count << 9) > ISA_DMA_THRESHOLD &&
  825. - SCpnt->host->unchecked_isa_dma)
  826. - buffer = (unsigned char *) scsi_malloc(this_count << 9);
  827. -     }
  828. + start = block % 4;
  829. + if (start) {
  830. + this_count = ((this_count > 4 - start) ?
  831. +       (4 - start) : (this_count));
  832. + buffer = (unsigned char *) scsi_malloc(2048);
  833. + } else if (this_count < 4) {
  834. + buffer = (unsigned char *) scsi_malloc(2048);
  835. + } else {
  836. + this_count -= this_count % 4;
  837. + buffer = (unsigned char *) SCpnt->request.buffer;
  838. + if (virt_to_phys(buffer) + (this_count << 9) > ISA_DMA_THRESHOLD &&
  839. +     SCpnt->host->unchecked_isa_dma)
  840. + buffer = (unsigned char *) scsi_malloc(this_count << 9);
  841. + }
  842.   };
  843.  
  844.   if (scsi_CDs[dev].sector_size == 2048)
  845. - block = block >> 2; /* These are the sectors that the cdrom uses */
  846. + block = block >> 2; /* These are the sectors that the cdrom uses */
  847.   else
  848. - block = block & 0xfffffffc;
  849. + block = block & 0xfffffffc;
  850.  
  851.   realcount = (this_count + 3) / 4;
  852.  
  853. - if (scsi_CDs[dev].sector_size == 512) realcount = realcount << 2;
  854. + if (scsi_CDs[dev].sector_size == 512)
  855. + realcount = realcount << 2;
  856.  
  857. -        /*
  858. -         * Note: The scsi standard says that READ_6 is *optional*, while
  859. -         * READ_10 is mandatory.   Thus there is no point in using
  860. -         * READ_6.
  861. -         */
  862. - if (scsi_CDs[dev].ten)
  863. -          
  864. -    {
  865. - if (realcount > 0xffff)
  866. - {
  867. + /*
  868. +  * Note: The scsi standard says that READ_6 is *optional*, while
  869. +  * READ_10 is mandatory.   Thus there is no point in using
  870. +  * READ_6.
  871. +  */
  872. + if (scsi_CDs[dev].ten) {
  873. + if (realcount > 0xffff) {
  874.   realcount = 0xffff;
  875.   this_count = realcount * (scsi_CDs[dev].sector_size >> 9);
  876. - }
  877. -
  878. - cmd[0] += READ_10 - READ_6 ;
  879. + }
  880. + cmd[0] += READ_10 - READ_6;
  881.   cmd[2] = (unsigned char) (block >> 24) & 0xff;
  882.   cmd[3] = (unsigned char) (block >> 16) & 0xff;
  883.   cmd[4] = (unsigned char) (block >> 8) & 0xff;
  884. @@ -777,164 +758,174 @@
  885.   cmd[6] = cmd[9] = 0;
  886.   cmd[7] = (unsigned char) (realcount >> 8) & 0xff;
  887.   cmd[8] = (unsigned char) realcount & 0xff;
  888. -    }
  889. - else
  890. -    {
  891. - if (realcount > 0xff)
  892. - {
  893. -     realcount = 0xff;
  894. -     this_count = realcount * (scsi_CDs[dev].sector_size >> 9);
  895. + } else {
  896. + if (realcount > 0xff) {
  897. + realcount = 0xff;
  898. + this_count = realcount * (scsi_CDs[dev].sector_size >> 9);
  899. + }
  900. + cmd[1] |= (unsigned char) ((block >> 16) & 0x1f);
  901. + cmd[2] = (unsigned char) ((block >> 8) & 0xff);
  902. + cmd[3] = (unsigned char) block & 0xff;
  903. + cmd[4] = (unsigned char) realcount;
  904. + cmd[5] = 0;
  905.   }
  906.  
  907. - cmd[1] |= (unsigned char) ((block >> 16) & 0x1f);
  908. - cmd[2] = (unsigned char) ((block >> 8) & 0xff);
  909. - cmd[3] = (unsigned char) block & 0xff;
  910. - cmd[4] = (unsigned char) realcount;
  911. - cmd[5] = 0;
  912. -    }
  913. -
  914.  #ifdef DEBUG
  915. -    {
  916. - int i;
  917. - printk("ReadCD: %d %d %d %dn",block, realcount, buffer, this_count);
  918. - printk("Use sg: %dn", SCpnt->use_sg);
  919. - printk("Dumping command: ");
  920. - for(i=0; i<12; i++) printk("%2.2x ", cmd[i]);
  921. - printk("n");
  922. -    };
  923. + {
  924. + int i;
  925. + printk("ReadCD: %d %d %d %dn", block, realcount, buffer, this_count);
  926. + printk("Use sg: %dn", SCpnt->use_sg);
  927. + printk("Dumping command: ");
  928. + for (i = 0; i < 12; i++)
  929. + printk("%2.2x ", cmd[i]);
  930. + printk("n");
  931. + };
  932.  #endif
  933.  
  934. -    /* Some dumb host adapters can speed transfers by knowing the
  935. -     * minimum transfersize in advance.
  936. -     *
  937. -     * We shouldn't disconnect in the middle of a sector, but the cdrom
  938. -     * sector size can be larger than the size of a buffer and the
  939. -     * transfer may be split to the size of a buffer.  So it's safe to
  940. -     * assume that we can at least transfer the minimum of the buffer
  941. -     * size (1024) and the sector size between each connect / disconnect.
  942. -     */
  943. + /* Some dumb host adapters can speed transfers by knowing the
  944. +  * minimum transfersize in advance.
  945. +  *
  946. +  * We shouldn't disconnect in the middle of a sector, but the cdrom
  947. +  * sector size can be larger than the size of a buffer and the
  948. +  * transfer may be split to the size of a buffer.  So it's safe to
  949. +  * assume that we can at least transfer the minimum of the buffer
  950. +  * size (1024) and the sector size between each connect / disconnect.
  951. +  */
  952.  
  953. -    SCpnt->transfersize = (scsi_CDs[dev].sector_size > 1024) ?
  954. - 1024 : scsi_CDs[dev].sector_size;
  955. + SCpnt->transfersize = (scsi_CDs[dev].sector_size > 1024) ?
  956. +     1024 : scsi_CDs[dev].sector_size;
  957.  
  958.   SCpnt->this_count = this_count;
  959. - scsi_do_cmd (SCpnt, (void *) cmd, buffer,
  960. -  realcount * scsi_CDs[dev].sector_size,
  961. -  rw_intr, SR_TIMEOUT, MAX_RETRIES);
  962. + scsi_do_cmd(SCpnt, (void *) cmd, buffer,
  963. +     realcount * scsi_CDs[dev].sector_size,
  964. +     rw_intr, SR_TIMEOUT, MAX_RETRIES);
  965.  }
  966.  
  967. -static int sr_detect(Scsi_Device * SDp){
  968. +static int sr_detect(Scsi_Device * SDp)
  969. +{
  970.  
  971. -    if(SDp->type != TYPE_ROM && SDp->type != TYPE_WORM) return 0;
  972. + if (SDp->type != TYPE_ROM && SDp->type != TYPE_WORM)
  973. + return 0;
  974.  
  975. -    printk("Detected scsi CD-ROM sr%d at scsi%d, channel %d, id %d, lun %dn",
  976. -    sr_template.dev_noticed++,
  977. -    SDp->host->host_no, SDp->channel, SDp->id, SDp->lun);
  978. + printk("Detected scsi CD-ROM sr%d at scsi%d, channel %d, id %d, lun %dn",
  979. +        sr_template.dev_noticed++,
  980. +        SDp->host->host_no, SDp->channel, SDp->id, SDp->lun);
  981.  
  982. -    return 1;
  983. + return 1;
  984.  }
  985.  
  986. -static int sr_attach(Scsi_Device * SDp){
  987. -    Scsi_CD * cpnt;
  988. -    int i;
  989. -
  990. -    if(SDp->type != TYPE_ROM && SDp->type != TYPE_WORM) return 1;
  991. -
  992. -    if (sr_template.nr_dev >= sr_template.dev_max)
  993. -    {
  994. - SDp->attached--;
  995. - return 1;
  996. -    }
  997. +static int sr_attach(Scsi_Device * SDp)
  998. +{
  999. + Scsi_CD *cpnt;
  1000. + int i;
  1001.  
  1002. -    for(cpnt = scsi_CDs, i=0; i<sr_template.dev_max; i++, cpnt++)
  1003. - if(!cpnt->device) break;
  1004. + if (SDp->type != TYPE_ROM && SDp->type != TYPE_WORM)
  1005. + return 1;
  1006.  
  1007. -    if(i >= sr_template.dev_max) panic ("scsi_devices corrupt (sr)");
  1008. + if (sr_template.nr_dev >= sr_template.dev_max) {
  1009. + SDp->attached--;
  1010. + return 1;
  1011. + }
  1012. + for (cpnt = scsi_CDs, i = 0; i < sr_template.dev_max; i++, cpnt++)
  1013. + if (!cpnt->device)
  1014. + break;
  1015. +
  1016. + if (i >= sr_template.dev_max)
  1017. + panic("scsi_devices corrupt (sr)");
  1018.  
  1019. -    SDp->scsi_request_fn = do_sr_request;
  1020. -    scsi_CDs[i].device = SDp;
  1021. + SDp->scsi_request_fn = do_sr_request;
  1022. + scsi_CDs[i].device = SDp;
  1023.  
  1024. -    sr_template.nr_dev++;
  1025. -    if(sr_template.nr_dev > sr_template.dev_max)
  1026. - panic ("scsi_devices corrupt (sr)");
  1027. -    return 0;
  1028. + sr_template.nr_dev++;
  1029. + if (sr_template.nr_dev > sr_template.dev_max)
  1030. + panic("scsi_devices corrupt (sr)");
  1031. + return 0;
  1032.  }
  1033.  
  1034.  
  1035. -static void sr_init_done (Scsi_Cmnd * SCpnt)
  1036. +static void sr_init_done(Scsi_Cmnd * SCpnt)
  1037.  {
  1038. -    struct request * req;
  1039. + struct request *req;
  1040.  
  1041. -    req = &SCpnt->request;
  1042. -    req->rq_status = RQ_SCSI_DONE; /* Busy, but indicate request done */
  1043. + req = &SCpnt->request;
  1044. + req->rq_status = RQ_SCSI_DONE; /* Busy, but indicate request done */
  1045.  
  1046. -    if (req->sem != NULL) {
  1047. - up(req->sem);
  1048. -    }
  1049. + if (req->sem != NULL) {
  1050. + up(req->sem);
  1051. + }
  1052.  }
  1053.  
  1054. -void get_sectorsize(int i){
  1055. -    unsigned char cmd[10];
  1056. -    unsigned char *buffer;
  1057. -    int the_result, retries;
  1058. -    Scsi_Cmnd * SCpnt;
  1059. -    unsigned long flags;
  1060. -
  1061. -    buffer = (unsigned char *) scsi_malloc(512);
  1062. -    SCpnt = scsi_allocate_device(NULL, scsi_CDs[i].device, 1);
  1063. -
  1064. -    retries = 3;
  1065. -    do {
  1066. - cmd[0] = READ_CAPACITY;
  1067. - cmd[1] = (scsi_CDs[i].device->lun << 5) & 0xe0;
  1068. - memset ((void *) &cmd[2], 0, 8);
  1069. - SCpnt->request.rq_status = RQ_SCSI_BUSY;  /* Mark as really busy */
  1070. - SCpnt->cmd_len = 0;
  1071. +void get_sectorsize(int i)
  1072. +{
  1073. + unsigned char cmd[10];
  1074. + unsigned char *buffer;
  1075. + int the_result, retries;
  1076. + Scsi_Cmnd *SCpnt;
  1077. + unsigned long flags;
  1078. +
  1079. + spin_lock_irq(&io_request_lock);
  1080. + buffer = (unsigned char *) scsi_malloc(512);
  1081. + SCpnt = scsi_allocate_device(NULL, scsi_CDs[i].device, 1);
  1082. + spin_unlock_irq(&io_request_lock);
  1083. +
  1084. + retries = 3;
  1085. + do {
  1086. + cmd[0] = READ_CAPACITY;
  1087. + cmd[1] = (scsi_CDs[i].device->lun << 5) & 0xe0;
  1088. + memset((void *) &cmd[2], 0, 8);
  1089. + SCpnt->request.rq_status = RQ_SCSI_BUSY; /* Mark as really busy */
  1090. + SCpnt->cmd_len = 0;
  1091. +
  1092. + memset(buffer, 0, 8);
  1093. +
  1094. + /* Do the command and wait.. */
  1095. + {
  1096. +    struct semaphore sem = MUTEX_LOCKED;
  1097. +     SCpnt->request.sem = &sem;
  1098. +     spin_lock_irqsave(&io_request_lock, flags);
  1099. +     scsi_do_cmd (SCpnt,
  1100. +  (void *) cmd, (void *) buffer,
  1101. +  512, sr_init_done,  SR_TIMEOUT,
  1102. +  MAX_RETRIES);
  1103. +     spin_unlock_irqrestore(&io_request_lock, flags);
  1104. +     down(&sem);
  1105. + }
  1106.  
  1107. - memset(buffer, 0, 8);
  1108. + the_result = SCpnt->result;
  1109. + retries--;
  1110.  
  1111. - /* Do the command and wait.. */
  1112. - {
  1113. -     struct semaphore sem = MUTEX_LOCKED;
  1114. -     SCpnt->request.sem = &sem;
  1115. -     spin_lock_irqsave(&io_request_lock, flags);
  1116. -     scsi_do_cmd (SCpnt,
  1117. -  (void *) cmd, (void *) buffer,
  1118. -  512, sr_init_done,  SR_TIMEOUT,
  1119. -  MAX_RETRIES);
  1120. -     spin_unlock_irqrestore(&io_request_lock, flags);
  1121. -     down(&sem);
  1122. - }
  1123. -
  1124. - the_result = SCpnt->result;
  1125. - retries--;
  1126. -
  1127. -    } while(the_result && retries);
  1128. -
  1129. -
  1130. -    wake_up(&SCpnt->device->device_wait);
  1131. -    scsi_release_command(SCpnt);
  1132. -    SCpnt = NULL;
  1133. -
  1134. -    if (the_result) {
  1135. - scsi_CDs[i].capacity = 0x1fffff;
  1136. - scsi_CDs[i].sector_size = 2048;  /* A guess, just in case */
  1137. - scsi_CDs[i].needs_sector_size = 1;
  1138. -    } else {
  1139. - scsi_CDs[i].capacity = 1 + ((buffer[0] << 24) |
  1140. -     (buffer[1] << 16) |
  1141. -     (buffer[2] << 8) |
  1142. -     buffer[3]);
  1143. - scsi_CDs[i].sector_size = (buffer[4] << 24) |
  1144. -     (buffer[5] << 16) | (buffer[6] << 8) | buffer[7];
  1145. - switch (scsi_CDs[i].sector_size) {
  1146. - /*
  1147. -  * HP 4020i CD-Recorder reports 2340 byte sectors
  1148. -  * Philips CD-Writers report 2352 byte sectors
  1149. -  *
  1150. -  * Use 2k sectors for them..
  1151. -  */
  1152. - case 0: case 2340: case 2352:
  1153. + } while (the_result && retries);
  1154. +
  1155. +
  1156. + wake_up(&SCpnt->device->device_wait);
  1157. + scsi_release_command(SCpnt);
  1158. + SCpnt = NULL;
  1159. +
  1160. + if (the_result) {
  1161. + scsi_CDs[i].capacity = 0x1fffff;
  1162. + scsi_CDs[i].sector_size = 2048; /* A guess, just in case */
  1163. + scsi_CDs[i].needs_sector_size = 1;
  1164. + } else {
  1165. +#if 0
  1166. + if (cdrom_get_last_written(MKDEV(MAJOR_NR, i),
  1167. +  (long *) &scsi_CDs[i].capacity))
  1168. +#endif
  1169. + scsi_CDs[i].capacity = 1 + ((buffer[0] << 24) |
  1170. +     (buffer[1] << 16) |
  1171. +     (buffer[2] << 8) |
  1172. +     buffer[3]);
  1173. + scsi_CDs[i].sector_size = (buffer[4] << 24) |
  1174. +     (buffer[5] << 16) | (buffer[6] << 8) | buffer[7];
  1175. + switch (scsi_CDs[i].sector_size) {
  1176. + /*
  1177. +  * HP 4020i CD-Recorder reports 2340 byte sectors
  1178. +  * Philips CD-Writers report 2352 byte sectors
  1179. +  *
  1180. +  * Use 2k sectors for them..
  1181. +  */
  1182. + case 0:
  1183. + case 2340:
  1184. + case 2352:
  1185.   scsi_CDs[i].sector_size = 2048;
  1186.   /* fall through */
  1187.   case 2048:
  1188. @@ -943,229 +934,334 @@
  1189.   case 512:
  1190.   break;
  1191.   default:
  1192. - printk ("sr%d: unsupported sector size %d.n",
  1193. - i, scsi_CDs[i].sector_size);
  1194. + printk("sr%d: unsupported sector size %d.n",
  1195. +        i, scsi_CDs[i].sector_size);
  1196.   scsi_CDs[i].capacity = 0;
  1197.   scsi_CDs[i].needs_sector_size = 1;
  1198. - }
  1199. + }
  1200.  
  1201. -        /*
  1202. -         * Add this so that we have the ability to correctly gauge
  1203. -         * what the device is capable of.
  1204. -         */
  1205. - scsi_CDs[i].needs_sector_size = 0;
  1206. - sr_sizes[i] = scsi_CDs[i].capacity >> (BLOCK_SIZE_BITS - 9);
  1207. -    };
  1208. -    scsi_free(buffer, 512);
  1209. + /*
  1210. +  * Add this so that we have the ability to correctly gauge
  1211. +  * what the device is capable of.
  1212. +  */
  1213. + scsi_CDs[i].needs_sector_size = 0;
  1214. + sr_sizes[i] = scsi_CDs[i].capacity >> (BLOCK_SIZE_BITS - 9);
  1215. + };
  1216. + scsi_free(buffer, 512);
  1217.  }
  1218.  
  1219. -void get_capabilities(int i){
  1220. -    unsigned char cmd[6];
  1221. -    unsigned char *buffer;
  1222. -    int           rc,n;
  1223. -
  1224. -    static char *loadmech[] = {
  1225. -        "caddy",
  1226. -        "tray",
  1227. -        "pop-up",
  1228. -        "",
  1229. -        "changer",
  1230. -        "changer",
  1231. -        "",
  1232. -        ""
  1233. -    };          
  1234. -
  1235. -    buffer = (unsigned char *) scsi_malloc(512);
  1236. -    cmd[0] = MODE_SENSE;
  1237. -    cmd[1] = (scsi_CDs[i].device->lun << 5) & 0xe0;
  1238. -    cmd[2] = 0x2a;
  1239. -    cmd[4] = 128;
  1240. -    cmd[3] = cmd[5] = 0;
  1241. -    rc = sr_do_ioctl(i, cmd, buffer, 128, 1);
  1242. -    
  1243. -    if (-EINVAL == rc) {
  1244. -        /* failed, drive has'nt this mode page */
  1245. -        scsi_CDs[i].cdi.speed      = 1;
  1246. -        /* disable speed select, drive probably can't do this either */
  1247. -        scsi_CDs[i].cdi.mask      |= CDC_SELECT_SPEED;
  1248. -    } else {
  1249. -        n = buffer[3]+4;
  1250. -        scsi_CDs[i].cdi.speed    = ((buffer[n+8] << 8) + buffer[n+9])/176;
  1251. -       scsi_CDs[i].readcd_known = 1;
  1252. -        scsi_CDs[i].readcd_cdda  = buffer[n+5] & 0x01;
  1253. -        /* print some capability bits */
  1254. -        printk("sr%i: scsi3-mmc drive: %dx/%dx %s%s%s%s%sn",i,
  1255. -               ((buffer[n+14] << 8) + buffer[n+15])/176,
  1256. -               scsi_CDs[i].cdi.speed,
  1257. -               buffer[n+3]&0x01 ? "writer " : "",   /* CD Writer */
  1258. -               buffer[n+2]&0x02 ? "cd/rw " : "",    /* can read rewriteable */
  1259. -               buffer[n+4]&0x20 ? "xa/form2 " : "", /* can read xa/from2 */
  1260. -               buffer[n+5]&0x01 ? "cdda " : "",     /* can read audio data */
  1261. -               loadmech[buffer[n+6]>>5]);
  1262. - if ((buffer[n+6] >> 5) == 0)
  1263. +void get_capabilities(int i)
  1264. +{
  1265. + unsigned char cmd[6];
  1266. + unsigned char *buffer;
  1267. + int rc, n;
  1268. +
  1269. + static char *loadmech[] =
  1270. + {
  1271. + "caddy",
  1272. + "tray",
  1273. + "pop-up",
  1274. + "",
  1275. + "changer",
  1276. + "cartridge changer",
  1277. + "",
  1278. + ""
  1279. + };
  1280. +
  1281. + spin_lock_irq(&io_request_lock);
  1282. + buffer = (unsigned char *) scsi_malloc(512);
  1283. + spin_unlock_irq(&io_request_lock);
  1284. + cmd[0] = MODE_SENSE;
  1285. + cmd[1] = (scsi_CDs[i].device->lun << 5) & 0xe0;
  1286. + cmd[2] = 0x2a;
  1287. + cmd[4] = 128;
  1288. + cmd[3] = cmd[5] = 0;
  1289. + rc = sr_do_ioctl(i, cmd, buffer, 128, 1);
  1290. +
  1291. + if (-EINVAL == rc) {
  1292. + /* failed, drive has'nt this mode page */
  1293. + scsi_CDs[i].cdi.speed = 1;
  1294. + /* disable speed select, drive probably can't do this either */
  1295. + scsi_CDs[i].cdi.mask |= CDC_SELECT_SPEED;
  1296. + scsi_free(buffer, 512);
  1297. + return;
  1298. + }
  1299. + n = buffer[3] + 4;
  1300. + scsi_CDs[i].cdi.speed = ((buffer[n + 8] << 8) + buffer[n + 9]) / 176;
  1301. + scsi_CDs[i].readcd_known = 1;
  1302. + scsi_CDs[i].readcd_cdda = buffer[n + 5] & 0x01;
  1303. + /* print some capability bits */
  1304. + printk("sr%i: scsi3-mmc drive: %dx/%dx %s%s%s%s%sn", i,
  1305. +        ((buffer[n + 14] << 8) + buffer[n + 15]) / 176,
  1306. +        scsi_CDs[i].cdi.speed,
  1307. +        buffer[n + 3] & 0x01 ? "writer " : "", /* CD Writer */
  1308. +        buffer[n + 2] & 0x02 ? "cd/rw " : "", /* can read rewriteable */
  1309. +        buffer[n + 4] & 0x20 ? "xa/form2 " : "", /* can read xa/from2 */
  1310. +        buffer[n + 5] & 0x01 ? "cdda " : "", /* can read audio data */
  1311. +        loadmech[buffer[n + 6] >> 5]);
  1312. + if ((buffer[n + 6] >> 5) == 0)
  1313.   /* caddy drives can't close tray... */
  1314. -         scsi_CDs[i].cdi.mask |= CDC_CLOSE_TRAY;
  1315. -    }
  1316. -    scsi_free(buffer, 512);
  1317. + scsi_CDs[i].cdi.mask |= CDC_CLOSE_TRAY;
  1318. + if ((buffer[n + 2] & 0x8) == 0)
  1319. + /* not a DVD drive */
  1320. + scsi_CDs[i].cdi.mask |= CDC_DVD;
  1321. + if ((buffer[n + 3] & 0x20) == 0)
  1322. + /* can't write DVD-RAM media */
  1323. + scsi_CDs[i].cdi.mask |= CDC_DVD_RAM;
  1324. + if ((buffer[n + 3] & 0x10) == 0)
  1325. + /* can't write DVD-R media */
  1326. + scsi_CDs[i].cdi.mask |= CDC_DVD_R;
  1327. + if ((buffer[n + 3] & 0x2) == 0)
  1328. + /* can't write CD-RW media */
  1329. + scsi_CDs[i].cdi.mask |= CDC_CD_RW;
  1330. + if ((buffer[n + 3] & 0x1) == 0)
  1331. + /* can't write CD-R media */
  1332. + scsi_CDs[i].cdi.mask |= CDC_CD_R;
  1333. + if ((buffer[n+6] & 0x8) == 0)
  1334. + /* can't eject */
  1335. + scsi_CDs[i].cdi.mask |= CDC_OPEN_TRAY;
  1336. +
  1337. + if ((buffer[n+6] >> 5) == mechtype_individual_changer ||
  1338. +     (buffer[n+6] >> 5) == mechtype_cartridge_changer)
  1339. + scsi_CDs[i].cdi.capacity = 
  1340. + cdrom_number_of_slots(&(scsi_CDs[i].cdi));
  1341. + if (scsi_CDs[i].cdi.capacity <= 1)
  1342. +                /* not a changer */
  1343. + scsi_CDs[i].cdi.mask |= CDC_SELECT_DISC;
  1344. + /*else    I don't think it can close its tray
  1345. + scsi_CDs[i].cdi.mask |= CDC_CLOSE_TRAY; */
  1346. +
  1347. +
  1348. + scsi_free(buffer, 512);
  1349. +}
  1350. +
  1351. +/*
  1352. + * sr_packet() is the entry point for the generic commands generated
  1353. + * by the Uniform CD-ROM layer. 
  1354. + */
  1355. +static int sr_packet(struct cdrom_device_info *cdi, struct cdrom_generic_command *cgc)
  1356. +{
  1357. + Scsi_Cmnd *SCpnt;
  1358. + Scsi_Device *device = scsi_CDs[MINOR(cdi->dev)].device;
  1359. + unsigned char *buffer = cgc->buffer;
  1360. + unsigned long flags;
  1361. + int buflen;
  1362. + int stat;
  1363. +
  1364. + /* get the device */
  1365. + SCpnt = scsi_allocate_device(NULL, device, 1);
  1366. + if (SCpnt == NULL)
  1367. + return -ENODEV; /* this just doesn't seem right /axboe */
  1368. +
  1369. + /* use buffer for ISA DMA */
  1370. + buflen = (cgc->buflen + 511) & ~511;
  1371. + if (cgc->buffer && SCpnt->host->unchecked_isa_dma &&
  1372. +        (virt_to_phys(cgc->buffer) + cgc->buflen - 1 > ISA_DMA_THRESHOLD)) {
  1373. + spin_lock_irq(&io_request_lock);
  1374. + buffer = scsi_malloc(buflen);
  1375. + spin_unlock_irq(&io_request_lock);
  1376. + if (buffer == NULL) {
  1377. + printk("sr: SCSI DMA pool exhausted.");
  1378. + return -ENOMEM;
  1379. + }
  1380. + memcpy(buffer, cgc->buffer, cgc->buflen);
  1381. + }
  1382. +
  1383. + /* set the LUN */
  1384. + cgc->cmd[1] |= device->lun << 5;
  1385. +
  1386. + /* do the locking and issue the command */
  1387. + SCpnt->request.rq_dev = cdi->dev;
  1388. + /* scsi_do_cmd sets the command length */
  1389. + SCpnt->cmd_len = 0;
  1390. +
  1391. + {
  1392. + struct semaphore sem = MUTEX_LOCKED;
  1393. + SCpnt->request.sem = &sem;
  1394. + spin_lock_irqsave(&io_request_lock, flags);
  1395. + scsi_do_cmd(SCpnt, (void *)cgc->cmd, (void *) buffer,
  1396. +  cgc->buflen, sr_init_done,  SR_TIMEOUT,
  1397. +  MAX_RETRIES);
  1398. + spin_unlock_irqrestore(&io_request_lock, flags);
  1399. + down(&sem);
  1400. + }
  1401. +
  1402. + stat = SCpnt->result;
  1403. +
  1404. + /* release */
  1405. + SCpnt->request.rq_dev = MKDEV(0, 0);
  1406. + scsi_release_command(SCpnt);
  1407. + SCpnt = NULL;
  1408. +
  1409. + /* write DMA buffer back if used */
  1410. + if (buffer && (buffer != cgc->buffer)) {
  1411. + memcpy(cgc->buffer, buffer, cgc->buflen);
  1412. + scsi_free(buffer, buflen);
  1413. + }
  1414. +
  1415. + return stat;
  1416.  }
  1417.  
  1418.  static int sr_registered = 0;
  1419.  
  1420.  static int sr_init()
  1421.  {
  1422. -    int i;
  1423. + int i;
  1424.  
  1425. -    if(sr_template.dev_noticed == 0) return 0;
  1426. + if (sr_template.dev_noticed == 0)
  1427. + return 0;
  1428.  
  1429. -    if(!sr_registered) {
  1430. - if (register_blkdev(MAJOR_NR,"sr",&cdrom_fops)) {
  1431. -     printk("Unable to get major %d for SCSI-CDn",MAJOR_NR);
  1432. -     return 1;
  1433. + if (!sr_registered) {
  1434. + if (register_blkdev(MAJOR_NR, "sr", &cdrom_fops)) {
  1435. + printk("Unable to get major %d for SCSI-CDn", MAJOR_NR);
  1436. + return 1;
  1437. + }
  1438. + sr_registered++;
  1439.   }
  1440. - sr_registered++;
  1441. -    }
  1442. + if (scsi_CDs)
  1443. + return 0;
  1444. + sr_template.dev_max =
  1445. +     sr_template.dev_noticed + SR_EXTRA_DEVS;
  1446. + scsi_CDs = (Scsi_CD *) scsi_init_malloc(sr_template.dev_max * sizeof(Scsi_CD), GFP_ATOMIC);
  1447. + memset(scsi_CDs, 0, sr_template.dev_max * sizeof(Scsi_CD));
  1448.  
  1449. + sr_sizes = (int *) scsi_init_malloc(sr_template.dev_max * sizeof(int), GFP_ATOMIC);
  1450. + memset(sr_sizes, 0, sr_template.dev_max * sizeof(int));
  1451.  
  1452. -    if (scsi_CDs) return 0;
  1453. -    sr_template.dev_max =
  1454. -            sr_template.dev_noticed + SR_EXTRA_DEVS;
  1455. -    scsi_CDs = (Scsi_CD *) scsi_init_malloc(sr_template.dev_max * sizeof(Scsi_CD), GFP_ATOMIC);
  1456. -    memset(scsi_CDs, 0, sr_template.dev_max * sizeof(Scsi_CD));
  1457. + sr_blocksizes = (int *) scsi_init_malloc(sr_template.dev_max *
  1458. +  sizeof(int), GFP_ATOMIC);
  1459.  
  1460. -    sr_sizes = (int *) scsi_init_malloc(sr_template.dev_max * sizeof(int), GFP_ATOMIC);
  1461. -    memset(sr_sizes, 0, sr_template.dev_max * sizeof(int));
  1462. -
  1463. -    sr_blocksizes = (int *) scsi_init_malloc(sr_template.dev_max *
  1464. -  sizeof(int), GFP_ATOMIC);
  1465. -
  1466. -    /*
  1467. -     * These are good guesses for the time being.
  1468. -     */
  1469. -    for(i=0;i<sr_template.dev_max;i++) sr_blocksizes[i] = 2048;
  1470. -    blksize_size[MAJOR_NR] = sr_blocksizes;
  1471. -    return 0;
  1472. + /*
  1473. +  * These are good guesses for the time being.
  1474. +  */
  1475. + for (i = 0; i < sr_template.dev_max; i++)
  1476. + sr_blocksizes[i] = 2048;
  1477. + blksize_size[MAJOR_NR] = sr_blocksizes;
  1478. + return 0;
  1479.  }
  1480.  
  1481.  void sr_finish()
  1482.  {
  1483. -    int i;
  1484. -    char name[6];
  1485. + int i;
  1486. + char name[6];
  1487.  
  1488. -    blk_dev[MAJOR_NR].request_fn = DEVICE_REQUEST;
  1489. -    blk_size[MAJOR_NR] = sr_sizes;
  1490. + blk_dev[MAJOR_NR].request_fn = DEVICE_REQUEST;
  1491. + blk_size[MAJOR_NR] = sr_sizes;
  1492.  
  1493. -    for (i = 0; i < sr_template.nr_dev; ++i)
  1494. -    {
  1495. - /* If we have already seen this, then skip it.  Comes up
  1496. -  * with loadable modules. */
  1497. - if (scsi_CDs[i].capacity) continue;
  1498. - scsi_CDs[i].capacity = 0x1fffff;
  1499. - scsi_CDs[i].sector_size = 2048;  /* A guess, just in case */
  1500. - scsi_CDs[i].needs_sector_size = 1;
  1501. - scsi_CDs[i].device->changed = 1; /* force recheck CD type */
  1502. + for (i = 0; i < sr_template.nr_dev; ++i) {
  1503. + /* If we have already seen this, then skip it.  Comes up
  1504. +  * with loadable modules. */
  1505. + if (scsi_CDs[i].capacity)
  1506. + continue;
  1507. + scsi_CDs[i].capacity = 0x1fffff;
  1508. + scsi_CDs[i].sector_size = 2048; /* A guess, just in case */
  1509. + scsi_CDs[i].needs_sector_size = 1;
  1510. + scsi_CDs[i].device->changed = 1; /* force recheck CD type */
  1511.  #if 0
  1512. - /* seems better to leave this for later */
  1513. - get_sectorsize(i);
  1514. - printk("Scd sectorsize = %d bytes.n", scsi_CDs[i].sector_size);
  1515. + /* seems better to leave this for later */
  1516. + get_sectorsize(i);
  1517. + printk("Scd sectorsize = %d bytes.n", scsi_CDs[i].sector_size);
  1518.  #endif
  1519. - scsi_CDs[i].use = 1;
  1520. - scsi_CDs[i].ten = 1;
  1521. - scsi_CDs[i].remap = 1;
  1522. -       scsi_CDs[i].readcd_known = 0;
  1523. -       scsi_CDs[i].readcd_cdda  = 0;
  1524. - sr_sizes[i] = scsi_CDs[i].capacity >> (BLOCK_SIZE_BITS - 9);
  1525. -
  1526. - scsi_CDs[i].cdi.ops        = &sr_dops;
  1527. - scsi_CDs[i].cdi.handle     = &scsi_CDs[i];
  1528. - scsi_CDs[i].cdi.dev        = MKDEV(MAJOR_NR,i);
  1529. - scsi_CDs[i].cdi.mask       = 0;
  1530. -        scsi_CDs[i].cdi.capacity   = 1;
  1531. - get_capabilities(i);
  1532. - sr_vendor_init(i);
  1533. -
  1534. - sprintf(name, "sr%d", i);
  1535. - strcpy(scsi_CDs[i].cdi.name, name);
  1536. - register_cdrom(&scsi_CDs[i].cdi);
  1537. -    }
  1538. -
  1539. -
  1540. -    /* If our host adapter is capable of scatter-gather, then we increase
  1541. -     * the read-ahead to 16 blocks (32 sectors).  If not, we use
  1542. -     * a two block (4 sector) read ahead. */
  1543. -    if(scsi_CDs[0].device && scsi_CDs[0].device->host->sg_tablesize)
  1544. - read_ahead[MAJOR_NR] = 32;  /* 32 sector read-ahead.  Always removable. */
  1545. -    else
  1546. - read_ahead[MAJOR_NR] = 4;  /* 4 sector read-ahead */
  1547. + scsi_CDs[i].use = 1;
  1548. + scsi_CDs[i].ten = 1;
  1549. + scsi_CDs[i].remap = 1;
  1550. + scsi_CDs[i].readcd_known = 0;
  1551. + scsi_CDs[i].readcd_cdda = 0;
  1552. + sr_sizes[i] = scsi_CDs[i].capacity >> (BLOCK_SIZE_BITS - 9);
  1553. +
  1554. + scsi_CDs[i].cdi.ops = &sr_dops;
  1555. + scsi_CDs[i].cdi.handle = &scsi_CDs[i];
  1556. + scsi_CDs[i].cdi.dev = MKDEV(MAJOR_NR, i);
  1557. + scsi_CDs[i].cdi.mask = 0;
  1558. + scsi_CDs[i].cdi.capacity = 1;
  1559. + get_capabilities(i);
  1560. + sr_vendor_init(i);
  1561. +
  1562. + sprintf(name, "sr%d", i);
  1563. + strcpy(scsi_CDs[i].cdi.name, name);
  1564. + register_cdrom(&scsi_CDs[i].cdi);
  1565. + }
  1566.  
  1567. -    return;
  1568. +
  1569. + /* If our host adapter is capable of scatter-gather, then we increase
  1570. +  * the read-ahead to 16 blocks (32 sectors).  If not, we use
  1571. +  * a two block (4 sector) read ahead. */
  1572. + if (scsi_CDs[0].device && scsi_CDs[0].device->host->sg_tablesize)
  1573. + read_ahead[MAJOR_NR] = 32; /* 32 sector read-ahead.  Always removable. */
  1574. + else
  1575. + read_ahead[MAJOR_NR] = 4; /* 4 sector read-ahead */
  1576. +
  1577. + return;
  1578.  }
  1579.  
  1580.  static void sr_detach(Scsi_Device * SDp)
  1581.  {
  1582. -    Scsi_CD * cpnt;
  1583. -    int i;
  1584. + Scsi_CD *cpnt;
  1585. + int i;
  1586.  
  1587. -    for(cpnt = scsi_CDs, i=0; i<sr_template.dev_max; i++, cpnt++)
  1588. - if(cpnt->device == SDp) {
  1589. -     kdev_t devi = MKDEV(MAJOR_NR, i);
  1590. -     struct super_block * sb = get_super(devi);
  1591. -
  1592. -     /*
  1593. -      * Since the cdrom is read-only, no need to sync the device.
  1594. -      * We should be kind to our buffer cache, however.
  1595. -      */
  1596. -     if (sb) invalidate_inodes(sb);
  1597. -     invalidate_buffers(devi);
  1598. -
  1599. -     /*
  1600. -      * Reset things back to a sane state so that one can re-load a new
  1601. -      * driver (perhaps the same one).
  1602. -      */
  1603. -            unregister_cdrom(&(cpnt->cdi));
  1604. -     cpnt->device = NULL;
  1605. -     cpnt->capacity = 0;
  1606. -     SDp->attached--;
  1607. -     sr_template.nr_dev--;
  1608. -     sr_template.dev_noticed--;
  1609. -     sr_sizes[i] = 0;
  1610. -     return;
  1611. - }
  1612. -    return;
  1613. + for (cpnt = scsi_CDs, i = 0; i < sr_template.dev_max; i++, cpnt++)
  1614. + if (cpnt->device == SDp) {
  1615. + kdev_t devi = MKDEV(MAJOR_NR, i);
  1616. + struct super_block *sb = get_super(devi);
  1617. +
  1618. + /*
  1619. +  * Since the cdrom is read-only, no need to sync the device.
  1620. +  * We should be kind to our buffer cache, however.
  1621. +  */
  1622. + if (sb)
  1623. + invalidate_inodes(sb);
  1624. + invalidate_buffers(devi);
  1625. +
  1626. + /*
  1627. +  * Reset things back to a sane state so that one can re-load a new
  1628. +  * driver (perhaps the same one).
  1629. +  */
  1630. + unregister_cdrom(&(cpnt->cdi));
  1631. + cpnt->device = NULL;
  1632. + cpnt->capacity = 0;
  1633. + SDp->attached--;
  1634. + sr_template.nr_dev--;
  1635. + sr_template.dev_noticed--;
  1636. + sr_sizes[i] = 0;
  1637. + return;
  1638. + }
  1639. + return;
  1640.  }
  1641.  
  1642.  
  1643.  #ifdef MODULE
  1644.  
  1645. -int init_module(void) {
  1646. -        sr_template.module = &__this_module;
  1647. -        return scsi_register_module(MODULE_SCSI_DEV, &sr_template);
  1648. +int init_module(void)
  1649. +{
  1650. + sr_template.module = &__this_module;
  1651. + return scsi_register_module(MODULE_SCSI_DEV, &sr_template);
  1652.  }
  1653.  
  1654. -void cleanup_module( void)
  1655. +void cleanup_module(void)
  1656.  {
  1657. -    scsi_unregister_module(MODULE_SCSI_DEV, &sr_template);
  1658. -    unregister_blkdev(MAJOR_NR, "sr");
  1659. -    sr_registered--;
  1660. -    if(scsi_CDs != NULL) {
  1661. - scsi_init_free((char *) scsi_CDs,
  1662. -        (sr_template.dev_noticed + SR_EXTRA_DEVS)
  1663. -        * sizeof(Scsi_CD));
  1664. -
  1665. - scsi_init_free((char *) sr_sizes, sr_template.dev_max * sizeof(int));
  1666. -        sr_sizes = NULL;
  1667. -
  1668. - scsi_init_free((char *) sr_blocksizes, sr_template.dev_max * sizeof(int));
  1669. -        sr_blocksizes = NULL;
  1670. -    }
  1671. -
  1672. -    blksize_size[MAJOR_NR] = NULL;
  1673. -    blk_dev[MAJOR_NR].request_fn = NULL;
  1674. -    blk_size[MAJOR_NR] = NULL;
  1675. -    read_ahead[MAJOR_NR] = 0;
  1676. + scsi_unregister_module(MODULE_SCSI_DEV, &sr_template);
  1677. + unregister_blkdev(MAJOR_NR, "sr");
  1678. + sr_registered--;
  1679. + if (scsi_CDs != NULL) {
  1680. + scsi_init_free((char *) scsi_CDs,
  1681. +        (sr_template.dev_noticed + SR_EXTRA_DEVS)
  1682. +        * sizeof(Scsi_CD));
  1683. +
  1684. + scsi_init_free((char *) sr_sizes, sr_template.dev_max * sizeof(int));
  1685. + sr_sizes = NULL;
  1686.  
  1687. -    sr_template.dev_max = 0;
  1688. + scsi_init_free((char *) sr_blocksizes, sr_template.dev_max * sizeof(int));
  1689. + sr_blocksizes = NULL;
  1690. + }
  1691. + blksize_size[MAJOR_NR] = NULL;
  1692. + blk_dev[MAJOR_NR].request_fn = NULL;
  1693. + blk_size[MAJOR_NR] = NULL;
  1694. + read_ahead[MAJOR_NR] = 0;
  1695. +
  1696. + sr_template.dev_max = 0;
  1697.  }
  1698. -#endif /* MODULE */
  1699. +
  1700. +#endif /* MODULE */
  1701.  
  1702.  /*
  1703.   * Overrides for Emacs so that we follow Linus's tabbing style.
  1704. diff -ur --exclude-from /home/axboe/cdrom/exclude-from linux-2.2.13/drivers/scsi/sr_ioctl.c linux/drivers/scsi/sr_ioctl.c
  1705. --- linux-2.2.13/drivers/scsi/sr_ioctl.c Thu Sep  9 12:27:30 1999
  1706. +++ linux/drivers/scsi/sr_ioctl.c Sun Oct 31 13:40:08 1999
  1707. @@ -18,9 +18,6 @@
  1708.  # define DEBUG
  1709.  #endif
  1710.  
  1711. -/* for now we borrow the "operation not supported" from the network folks */
  1712. -#define EDRIVE_CANT_DO_THIS  EOPNOTSUPP
  1713. -
  1714.  /* The sr_is_xa() seems to trigger firmware bugs with some drives :-(
  1715.   * It is off by default and can be turned on with this module parameter */
  1716.  static int xa_test = 0;
  1717. @@ -38,6 +35,12 @@
  1718.      
  1719.      req = &SCpnt->request;
  1720.      req->rq_status = RQ_SCSI_DONE; /* Busy, but indicate request done */
  1721. +
  1722. +    if (SCpnt->buffer && req->buffer && SCpnt->buffer != req->buffer) {
  1723. + memcpy(req->buffer, SCpnt->buffer, SCpnt->bufflen);
  1724. + scsi_free(SCpnt->buffer, (SCpnt->bufflen + 511) & ~511);
  1725. + SCpnt->buffer = req->buffer;
  1726. +    } 
  1727.      
  1728.      if (req->sem != NULL) {
  1729.   up(req->sem);
  1730. @@ -54,12 +57,26 @@
  1731.      Scsi_Device * SDev;
  1732.      int result, err = 0, retries = 0;
  1733.      unsigned long flags;
  1734. +    char * bounce_buffer;
  1735.  
  1736.      spin_lock_irqsave(&io_request_lock, flags);
  1737.      SDev  = scsi_CDs[target].device;
  1738.      SCpnt = scsi_allocate_device(NULL, scsi_CDs[target].device, 1);
  1739.      spin_unlock_irqrestore(&io_request_lock, flags);
  1740.  
  1741. +    /* use ISA DMA buffer if necessary */
  1742. +    SCpnt->request.buffer=buffer;
  1743. +    if (buffer && SCpnt->host->unchecked_isa_dma &&
  1744. +       (virt_to_phys(buffer) + buflength - 1 > ISA_DMA_THRESHOLD)) {
  1745. + bounce_buffer = (char *)scsi_malloc((buflength + 511) & ~511);
  1746. + if (bounce_buffer == NULL) {
  1747. + printk("SCSI DMA pool exhausted.");
  1748. + return -ENOMEM;
  1749. + }
  1750. + memcpy(bounce_buffer, (char *)buffer, buflength);
  1751. + buffer = bounce_buffer;
  1752. +    }
  1753. +
  1754.  retry:
  1755.      if( !scsi_block_when_processing_errors(SDev) )
  1756.          return -ENODEV;
  1757. @@ -74,7 +91,7 @@
  1758.   down(&sem);
  1759.          SCpnt->request.sem = NULL;
  1760.      }
  1761. -    
  1762. +
  1763.      result = SCpnt->result;
  1764.      
  1765.      /* Minimal error checking.  Ignore cases we know about, and report the rest. */
  1766. @@ -159,7 +176,7 @@
  1767.  {
  1768.   u_char  sr_cmd[10];
  1769.  
  1770. -        sr_cmd[0] = TEST_UNIT_READY;
  1771. +        sr_cmd[0] = GPCMD_TEST_UNIT_READY;
  1772.          sr_cmd[1] = ((scsi_CDs[minor].device -> lun) << 5);
  1773.          sr_cmd[2] = sr_cmd[3] = sr_cmd[4] = sr_cmd[5] = 0;
  1774.          return sr_do_ioctl(minor, sr_cmd, NULL, 255, 1);
  1775. @@ -169,7 +186,7 @@
  1776.  {
  1777.          u_char  sr_cmd[10];
  1778.  
  1779. -        sr_cmd[0] = START_STOP;
  1780. +        sr_cmd[0] = GPCMD_START_STOP_UNIT;
  1781.          sr_cmd[1] = ((scsi_CDs[MINOR(cdi->dev)].device -> lun) << 5);
  1782.          sr_cmd[2] = sr_cmd[3] = sr_cmd[5] = 0;
  1783.          sr_cmd[4] = (pos == 0) ? 0x03 /* close */ : 0x02 /* eject */;
  1784. @@ -239,11 +256,10 @@
  1785.  int sr_get_mcn(struct cdrom_device_info *cdi,struct cdrom_mcn *mcn)
  1786.  {
  1787.          u_char  sr_cmd[10];
  1788. - char * buffer;
  1789. + char buffer[32];
  1790.          int result;
  1791. -        unsigned long flags;
  1792.          
  1793. - sr_cmd[0] = SCMD_READ_SUBCHANNEL;
  1794. + sr_cmd[0] = GPCMD_READ_SUBCHANNEL;
  1795.   sr_cmd[1] = ((scsi_CDs[MINOR(cdi->dev)].device->lun) << 5);
  1796.   sr_cmd[2] = 0x40;    /* I do want the subchannel info */
  1797.   sr_cmd[3] = 0x02;    /* Give me medium catalog number info */
  1798. @@ -253,20 +269,11 @@
  1799.   sr_cmd[8] = 24;
  1800.   sr_cmd[9] = 0;
  1801.  
  1802. -        spin_lock_irqsave(&io_request_lock, flags);
  1803. - buffer = (unsigned char*) scsi_malloc(512);
  1804. -        spin_unlock_irqrestore(&io_request_lock, flags);
  1805. - if(!buffer) return -ENOMEM;
  1806. -
  1807.   result = sr_do_ioctl(MINOR(cdi->dev), sr_cmd, buffer, 24, 0);
  1808.  
  1809.   memcpy (mcn->medium_catalog_number, buffer + 9, 13);
  1810.          mcn->medium_catalog_number[13] = 0;
  1811.  
  1812. -        spin_lock_irqsave(&io_request_lock, flags);
  1813. - scsi_free(buffer, 512);
  1814. -        spin_unlock_irqrestore(&io_request_lock, flags);
  1815. -
  1816.   return result;
  1817.  }
  1818.  
  1819. @@ -286,7 +293,7 @@
  1820.              speed *= 177;   /* Nx to kbyte/s */
  1821.          
  1822.   memset(sr_cmd,0,12);
  1823. - sr_cmd[0] = 0xbb; /* SET CD SPEED */
  1824. + sr_cmd[0] = GPCMD_SET_SPEED; /* SET CD SPEED */
  1825.   sr_cmd[1] = (scsi_CDs[MINOR(cdi->dev)].device->lun) << 5;
  1826.   sr_cmd[2] = (speed >> 8) & 0xff; /* MSB for speed (in kbytes/sec) */
  1827.   sr_cmd[3] =  speed       & 0xff; /* LSB */
  1828. @@ -299,105 +306,22 @@
  1829.  /* ----------------------------------------------------------------------- */
  1830.  /* this is called by the generic cdrom driver. arg is a _kernel_ pointer,  */
  1831.  /* becauce the generic cdrom driver does the user access stuff for us.     */
  1832. +/* only cdromreadtochdr and cdromreadtocentry are left - for use with the  */
  1833. +/* sr_disk_status interface for the generic cdrom driver.                  */
  1834.  
  1835.  int sr_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, void* arg)
  1836.  {
  1837.      u_char  sr_cmd[10];    
  1838. -    int result, target;
  1839. -    
  1840. -    target = MINOR(cdi->dev);
  1841. +    int result, target  = MINOR(cdi->dev);
  1842. +    unsigned char buffer[32];
  1843.      
  1844.      switch (cmd) 
  1845.      {
  1846. - /* Sun-compatible */
  1847. -    case CDROMPAUSE:
  1848. -
  1849. - sr_cmd[0] = SCMD_PAUSE_RESUME;
  1850. - sr_cmd[1] = scsi_CDs[target].device->lun << 5;
  1851. - sr_cmd[2] = sr_cmd[3] = sr_cmd[4] = 0;
  1852. - sr_cmd[5] = sr_cmd[6] = sr_cmd[7] = 0;
  1853. - sr_cmd[8] = 0;
  1854. - sr_cmd[9] = 0;
  1855. -
  1856. - result = sr_do_ioctl(target, sr_cmd, NULL, 255, 0);
  1857. -        break;
  1858. -
  1859. -    case CDROMRESUME:
  1860. -
  1861. - sr_cmd[0] = SCMD_PAUSE_RESUME;
  1862. - sr_cmd[1] = scsi_CDs[target].device->lun << 5;
  1863. - sr_cmd[2] = sr_cmd[3] = sr_cmd[4] = 0;
  1864. - sr_cmd[5] = sr_cmd[6] = sr_cmd[7] = 0;
  1865. - sr_cmd[8] = 1;
  1866. - sr_cmd[9] = 0;
  1867. -
  1868. - result = sr_do_ioctl(target, sr_cmd, NULL, 255, 0);
  1869. -        break;
  1870. -
  1871. -    case CDROMPLAYMSF:
  1872. -    {
  1873. - struct cdrom_msf* msf = (struct cdrom_msf*)arg;
  1874. -
  1875. - sr_cmd[0] = SCMD_PLAYAUDIO_MSF;
  1876. - sr_cmd[1] = scsi_CDs[target].device->lun << 5;
  1877. - sr_cmd[2] = 0;
  1878. - sr_cmd[3] = msf->cdmsf_min0;
  1879. - sr_cmd[4] = msf->cdmsf_sec0;
  1880. - sr_cmd[5] = msf->cdmsf_frame0;
  1881. - sr_cmd[6] = msf->cdmsf_min1;
  1882. - sr_cmd[7] = msf->cdmsf_sec1;
  1883. - sr_cmd[8] = msf->cdmsf_frame1;
  1884. - sr_cmd[9] = 0;
  1885. -
  1886. - result = sr_do_ioctl(target, sr_cmd, NULL, 255, 0);
  1887. -        break;
  1888. -    }
  1889. -
  1890. -    case CDROMPLAYBLK:
  1891. -    {
  1892. - struct cdrom_blk* blk = (struct cdrom_blk*)arg;
  1893. -
  1894. - sr_cmd[0] = SCMD_PLAYAUDIO10;
  1895. - sr_cmd[1] = scsi_CDs[target].device->lun << 5;
  1896. - sr_cmd[2] = blk->from >> 24;
  1897. - sr_cmd[3] = blk->from >> 16;
  1898. - sr_cmd[4] = blk->from >> 8;
  1899. - sr_cmd[5] = blk->from;
  1900. - sr_cmd[6] = 0;
  1901. - sr_cmd[7] = blk->len >> 8;
  1902. - sr_cmd[8] = blk->len;
  1903. - sr_cmd[9] = 0;
  1904. -
  1905. - result = sr_do_ioctl(target, sr_cmd, NULL, 255, 0);
  1906. -        break;
  1907. -    }
  1908. -
  1909. -    case CDROMPLAYTRKIND:
  1910. -    {
  1911. - struct cdrom_ti* ti = (struct cdrom_ti*)arg;
  1912. -
  1913. - sr_cmd[0] = SCMD_PLAYAUDIO_TI;
  1914. - sr_cmd[1] = scsi_CDs[target].device->lun << 5;
  1915. - sr_cmd[2] = 0;
  1916. - sr_cmd[3] = 0;
  1917. - sr_cmd[4] = ti->cdti_trk0;
  1918. - sr_cmd[5] = ti->cdti_ind0;
  1919. - sr_cmd[6] = 0;
  1920. - sr_cmd[7] = ti->cdti_trk1;
  1921. - sr_cmd[8] = ti->cdti_ind1;
  1922. - sr_cmd[9] = 0;
  1923. -
  1924. - result = sr_do_ioctl(target, sr_cmd, NULL, 255, 0);
  1925. -        break;
  1926. -    }
  1927. -
  1928.      case CDROMREADTOCHDR:
  1929.      {
  1930.   struct cdrom_tochdr* tochdr = (struct cdrom_tochdr*)arg;
  1931. - char * buffer;
  1932. -        unsigned long flags;
  1933.  
  1934. - sr_cmd[0] = SCMD_READ_TOC;
  1935. + sr_cmd[0] = GPCMD_READ_TOC_PMA_ATIP;
  1936.   sr_cmd[1] = ((scsi_CDs[target].device->lun) << 5);
  1937.   sr_cmd[2] = sr_cmd[3] = sr_cmd[4] = sr_cmd[5] = 0;
  1938.   sr_cmd[6] = 0;
  1939. @@ -405,29 +329,19 @@
  1940.   sr_cmd[8] = 12;             /* LSB of length */
  1941.   sr_cmd[9] = 0;
  1942.  
  1943. -        spin_lock_irqsave(&io_request_lock, flags);
  1944. - buffer = (unsigned char *) scsi_malloc(512);
  1945. -        spin_unlock_irqrestore(&io_request_lock, flags);
  1946. - if(!buffer) return -ENOMEM;
  1947. -
  1948.   result = sr_do_ioctl(target, sr_cmd, buffer, 12, 1);
  1949.  
  1950.   tochdr->cdth_trk0 = buffer[2];
  1951.   tochdr->cdth_trk1 = buffer[3];
  1952.  
  1953. -        spin_lock_irqsave(&io_request_lock, flags);
  1954. - scsi_free(buffer, 512);
  1955. -        spin_unlock_irqrestore(&io_request_lock, flags);
  1956.          break;
  1957.      }
  1958.  
  1959.      case CDROMREADTOCENTRY:
  1960.      {
  1961.   struct cdrom_tocentry* tocentry = (struct cdrom_tocentry*)arg;
  1962. - unsigned char * buffer;
  1963. -        unsigned long flags;
  1964.  
  1965. - sr_cmd[0] = SCMD_READ_TOC;
  1966. + sr_cmd[0] = GPCMD_READ_TOC_PMA_ATIP;
  1967.   sr_cmd[1] = ((scsi_CDs[target].device->lun) << 5) |
  1968.            (tocentry->cdte_format == CDROM_MSF ? 0x02 : 0);
  1969.   sr_cmd[2] = sr_cmd[3] = sr_cmd[4] = sr_cmd[5] = 0;
  1970. @@ -436,11 +350,6 @@
  1971.   sr_cmd[8] = 12;            /* LSB of length */
  1972.   sr_cmd[9] = 0;
  1973.  
  1974. -        spin_lock_irqsave(&io_request_lock, flags);
  1975. - buffer = (unsigned char *) scsi_malloc(512);
  1976. -        spin_unlock_irqrestore(&io_request_lock, flags);
  1977. - if(!buffer) return -ENOMEM;
  1978. -
  1979.   result = sr_do_ioctl (target, sr_cmd, buffer, 12, 0);
  1980.  
  1981.          tocentry->cdte_ctrl = buffer[5] & 0xf;
  1982. @@ -454,187 +363,9 @@
  1983.       tocentry->cdte_addr.lba = (((((buffer[8] << 8) + buffer[9]) << 8)
  1984.                                         + buffer[10]) << 8) + buffer[11];
  1985.  
  1986. -        spin_lock_irqsave(&io_request_lock, flags);
  1987. - scsi_free(buffer, 512);
  1988. -        spin_unlock_irqrestore(&io_request_lock, flags);
  1989.          break;
  1990.      }
  1991. -
  1992. -    case CDROMSTOP:
  1993. - sr_cmd[0] = START_STOP;
  1994. - sr_cmd[1] = ((scsi_CDs[target].device->lun) << 5) | 1;
  1995. - sr_cmd[2] = sr_cmd[3] = sr_cmd[5] = 0;
  1996. - sr_cmd[4] = 0;
  1997. -
  1998. - result = sr_do_ioctl(target, sr_cmd, NULL, 255, 0);
  1999. -        break;
  2000. -
  2001. -    case CDROMSTART:
  2002. - sr_cmd[0] = START_STOP;
  2003. - sr_cmd[1] = ((scsi_CDs[target].device->lun) << 5) | 1;
  2004. - sr_cmd[2] = sr_cmd[3] = sr_cmd[5] = 0;
  2005. - sr_cmd[4] = 1;
  2006. -
  2007. - result = sr_do_ioctl(target, sr_cmd, NULL, 255, 0);
  2008. -        break;
  2009. -
  2010. -    case CDROMVOLCTRL:
  2011. -    {
  2012. - char * buffer, * mask;
  2013. - struct cdrom_volctrl* volctrl = (struct cdrom_volctrl*)arg;
  2014. -        unsigned long flags;
  2015. -
  2016. - /* First we get the current params so we can just twiddle the volume */
  2017. -
  2018. - sr_cmd[0] = MODE_SENSE;
  2019. - sr_cmd[1] = (scsi_CDs[target].device -> lun) << 5;
  2020. - sr_cmd[2] = 0xe;    /* Want mode page 0xe, CDROM audio params */
  2021. - sr_cmd[3] = 0;
  2022. - sr_cmd[4] = 28;
  2023. - sr_cmd[5] = 0;
  2024. -
  2025. -        spin_lock_irqsave(&io_request_lock, flags);
  2026. - buffer = (unsigned char *) scsi_malloc(512);
  2027. -        spin_unlock_irqrestore(&io_request_lock, flags);
  2028. - if(!buffer) return -ENOMEM;
  2029. -
  2030. - if ((result = sr_do_ioctl (target, sr_cmd, buffer, 28, 0))) {
  2031. -     printk ("Hosed while obtaining audio mode pagen");
  2032. -            spin_lock_irqsave(&io_request_lock, flags);
  2033. -     scsi_free(buffer, 512);
  2034. -            spin_unlock_irqrestore(&io_request_lock, flags);
  2035. -            break;
  2036. - }
  2037. -
  2038. - sr_cmd[0] = MODE_SENSE;
  2039. - sr_cmd[1] = (scsi_CDs[target].device -> lun) << 5;
  2040. - sr_cmd[2] = 0x4e;   /* Want the mask for mode page 0xe */
  2041. - sr_cmd[3] = 0;
  2042. - sr_cmd[4] = 28;
  2043. - sr_cmd[5] = 0;
  2044. -
  2045. -        spin_lock_irqsave(&io_request_lock, flags);
  2046. - mask = (unsigned char *) scsi_malloc(512);
  2047. -        spin_unlock_irqrestore(&io_request_lock, flags);
  2048. - if(!mask) {
  2049. -            spin_lock_irqsave(&io_request_lock, flags);
  2050. -     scsi_free(buffer, 512);
  2051. -            spin_unlock_irqrestore(&io_request_lock, flags);
  2052. -     result = -ENOMEM;
  2053. -            break;
  2054. - };
  2055. -
  2056. - if ((result = sr_do_ioctl (target, sr_cmd, mask, 28, 0))) {
  2057. -     printk ("Hosed while obtaining mask for audio mode pagen");
  2058. -            spin_lock_irqsave(&io_request_lock, flags);
  2059. -     scsi_free(buffer, 512);
  2060. -     scsi_free(mask, 512);
  2061. -            spin_unlock_irqrestore(&io_request_lock, flags);
  2062. -     break;
  2063. - }
  2064. -
  2065. - /* Now mask and substitute our own volume and reuse the rest */
  2066. - buffer[0] = 0;  /* Clear reserved field */
  2067. -
  2068. - buffer[21] = volctrl->channel0 & mask[21];
  2069. - buffer[23] = volctrl->channel1 & mask[23];
  2070. - buffer[25] = volctrl->channel2 & mask[25];
  2071. - buffer[27] = volctrl->channel3 & mask[27];
  2072. -
  2073. - sr_cmd[0] = MODE_SELECT;
  2074. - sr_cmd[1] = ((scsi_CDs[target].device -> lun) << 5) | 0x10;    /* Params are SCSI-2 */
  2075. - sr_cmd[2] = sr_cmd[3] = 0;
  2076. - sr_cmd[4] = 28;
  2077. - sr_cmd[5] = 0;
  2078. -
  2079. - result = sr_do_ioctl (target, sr_cmd, buffer, 28, 0);
  2080. -        spin_lock_irqsave(&io_request_lock, flags);
  2081. - scsi_free(buffer, 512);
  2082. - scsi_free(mask, 512);
  2083. -        spin_unlock_irqrestore(&io_request_lock, flags);
  2084. -        break;
  2085. -    }
  2086. -
  2087. -    case CDROMVOLREAD:
  2088. -    {
  2089. - char * buffer;
  2090. - struct cdrom_volctrl* volctrl = (struct cdrom_volctrl*)arg;
  2091. -        unsigned long flags;
  2092. -
  2093. - /* Get the current params */
  2094. -
  2095. - sr_cmd[0] = MODE_SENSE;
  2096. - sr_cmd[1] = (scsi_CDs[target].device -> lun) << 5;
  2097. - sr_cmd[2] = 0xe;    /* Want mode page 0xe, CDROM audio params */
  2098. - sr_cmd[3] = 0;
  2099. - sr_cmd[4] = 28;
  2100. - sr_cmd[5] = 0;
  2101. -
  2102. -        spin_lock_irqsave(&io_request_lock, flags);
  2103. - buffer = (unsigned char *) scsi_malloc(512);
  2104. -        spin_unlock_irqrestore(&io_request_lock, flags);
  2105. - if(!buffer) return -ENOMEM;
  2106. -
  2107. - if ((result = sr_do_ioctl (target, sr_cmd, buffer, 28, 0))) {
  2108. -     printk ("(CDROMVOLREAD) Hosed while obtaining audio mode pagen");
  2109. -            spin_lock_irqsave(&io_request_lock, flags);
  2110. -     scsi_free(buffer, 512);
  2111. -            spin_unlock_irqrestore(&io_request_lock, flags);
  2112. -            break;
  2113. - }
  2114.  
  2115. - volctrl->channel0 = buffer[21];
  2116. - volctrl->channel1 = buffer[23];
  2117. - volctrl->channel2 = buffer[25];
  2118. - volctrl->channel3 = buffer[27];
  2119. -
  2120. -        spin_lock_irqsave(&io_request_lock, flags);
  2121. - scsi_free(buffer, 512);
  2122. -        spin_unlock_irqrestore(&io_request_lock, flags);
  2123. -        break;
  2124. -    }
  2125. -
  2126. -    case CDROMSUBCHNL:
  2127. -    {
  2128. - struct cdrom_subchnl* subchnl = (struct cdrom_subchnl*)arg;
  2129. - char * buffer;
  2130. -        unsigned long flags;
  2131. -
  2132. - sr_cmd[0] = SCMD_READ_SUBCHANNEL;
  2133. - sr_cmd[1] = ((scsi_CDs[target].device->lun) << 5) | 0x02;    /* MSF format */
  2134. - sr_cmd[2] = 0x40;    /* I do want the subchannel info */
  2135. - sr_cmd[3] = 0x01;    /* Give me current position info */
  2136. - sr_cmd[4] = sr_cmd[5] = 0;
  2137. - sr_cmd[6] = 0;
  2138. - sr_cmd[7] = 0;
  2139. - sr_cmd[8] = 16;
  2140. - sr_cmd[9] = 0;
  2141. -
  2142. -        spin_lock_irqsave(&io_request_lock, flags);
  2143. - buffer = (unsigned char *) scsi_malloc(512);
  2144. -        spin_unlock_irqrestore(&io_request_lock, flags);
  2145. - if(!buffer) return -ENOMEM;
  2146. -
  2147. - result = sr_do_ioctl(target, sr_cmd, buffer, 16, 0);
  2148. -
  2149. - subchnl->cdsc_audiostatus = buffer[1];
  2150. - subchnl->cdsc_format = CDROM_MSF;
  2151. - subchnl->cdsc_ctrl = buffer[5] & 0xf;
  2152. - subchnl->cdsc_trk = buffer[6];
  2153. - subchnl->cdsc_ind = buffer[7];
  2154. -
  2155. - subchnl->cdsc_reladdr.msf.minute = buffer[13];
  2156. - subchnl->cdsc_reladdr.msf.second = buffer[14];
  2157. - subchnl->cdsc_reladdr.msf.frame = buffer[15];
  2158. - subchnl->cdsc_absaddr.msf.minute = buffer[9];
  2159. - subchnl->cdsc_absaddr.msf.second = buffer[10];
  2160. - subchnl->cdsc_absaddr.msf.frame = buffer[11];
  2161. -
  2162. -        spin_lock_irqsave(&io_request_lock, flags);
  2163. - scsi_free(buffer, 512);
  2164. -        spin_unlock_irqrestore(&io_request_lock, flags);
  2165. -        break;
  2166. -    }
  2167.      default:
  2168.          return -EINVAL;
  2169.      }
  2170. @@ -672,7 +403,7 @@
  2171.  #endif
  2172.  
  2173.      memset(cmd,0,12);
  2174. -    cmd[0] = 0xbe /* READ_CD */;
  2175. +    cmd[0] = GPCMD_READ_CD; /* READ_CD */
  2176.      cmd[1] = (scsi_CDs[minor].device->lun << 5) | ((format & 7) << 2);
  2177.      cmd[2] = (unsigned char)(lba >> 24) & 0xff;
  2178.      cmd[3] = (unsigned char)(lba >> 16) & 0xff;
  2179. @@ -718,7 +449,7 @@
  2180.  #endif
  2181.      
  2182.      memset(cmd,0,12);
  2183. -    cmd[0] = READ_10;
  2184. +    cmd[0] = GPCMD_READ_10;
  2185.      cmd[1] = (scsi_CDs[minor].device->lun << 5);
  2186.      cmd[2] = (unsigned char)(lba >> 24) & 0xff;
  2187.      cmd[3] = (unsigned char)(lba >> 16) & 0xff;
  2188. @@ -768,131 +499,7 @@
  2189.  int sr_dev_ioctl(struct cdrom_device_info *cdi,
  2190.                   unsigned int cmd, unsigned long arg)
  2191.  {
  2192. -    int target, err;
  2193. -    
  2194. -    target = MINOR(cdi->dev);
  2195. -    
  2196. -    switch (cmd) {
  2197. -    case CDROMREADMODE1:
  2198. -    case CDROMREADMODE2:
  2199. -    case CDROMREADRAW:
  2200. -    {
  2201. - unsigned char      *raw;
  2202. -        struct cdrom_msf   msf;
  2203. -        int                lba, rc;
  2204. - int                blocksize = 2048;
  2205. -        unsigned long flags;
  2206. -
  2207. -        switch (cmd) {
  2208. -        case CDROMREADMODE2: blocksize = CD_FRAMESIZE_RAW0; break; /* 2336 */
  2209. -        case CDROMREADRAW:   blocksize = CD_FRAMESIZE_RAW;  break; /* 2352 */
  2210. -        }
  2211. -
  2212. - if (copy_from_user(&msf,(void*)arg,sizeof(msf)))
  2213. - return -EFAULT;
  2214. -        spin_lock_irqsave(&io_request_lock, flags);
  2215. -        raw = scsi_malloc(2048+512);
  2216. -        spin_unlock_irqrestore(&io_request_lock, flags);
  2217. - if (!(raw))
  2218. -                return -ENOMEM;
  2219. -
  2220. - lba = (((msf.cdmsf_min0 * CD_SECS) + msf.cdmsf_sec0)
  2221. - * CD_FRAMES + msf.cdmsf_frame0) - CD_MSF_OFFSET;
  2222. -        if (lba < 0 || lba >= scsi_CDs[target].capacity)
  2223. -            return -EINVAL;
  2224. -
  2225. -        rc = sr_read_sector(target, lba, blocksize, raw);
  2226. - if (!rc)
  2227. - if (copy_to_user((void*)arg, raw, blocksize))
  2228. - rc = -EFAULT;
  2229. -
  2230. -        spin_lock_irqsave(&io_request_lock, flags);
  2231. - scsi_free(raw,2048+512);
  2232. -        spin_unlock_irqrestore(&io_request_lock, flags);
  2233. - return rc;
  2234. -    }
  2235. -    case CDROMREADAUDIO:
  2236. -    {
  2237. - unsigned char      *raw;
  2238. -        int                lba, rc=0;
  2239. -        struct cdrom_read_audio ra;
  2240. -        unsigned long flags;
  2241. -
  2242. -        if (!scsi_CDs[target].readcd_known || !scsi_CDs[target].readcd_cdda)
  2243. -            return -EINVAL;  /* -EDRIVE_DOES_NOT_SUPPORT_THIS ? */
  2244. -        
  2245. - if (copy_from_user(&ra,(void*)arg,sizeof(ra)))
  2246. -            return -EFAULT;
  2247. -        
  2248. -        if (ra.addr_format == CDROM_LBA)
  2249. -            lba = ra.addr.lba;
  2250. -        else
  2251. -            lba = (((ra.addr.msf.minute * CD_SECS) + ra.addr.msf.second)
  2252. -                   * CD_FRAMES + ra.addr.msf.frame) - CD_MSF_OFFSET;
  2253. -
  2254. -        if (lba < 0 || lba >= scsi_CDs[target].capacity)
  2255. -            return -EINVAL;
  2256. -        spin_lock_irqsave(&io_request_lock, flags);
  2257. -        raw = scsi_malloc(2048+512);
  2258. -        spin_unlock_irqrestore(&io_request_lock, flags);
  2259. - if (!(raw))
  2260. -            return -ENOMEM;
  2261. -
  2262. -        while (ra.nframes > 0) {
  2263. -            rc = sr_read_cd(target, raw, lba, 1, CD_FRAMESIZE_RAW);
  2264. -            if (!rc)
  2265. - if (copy_to_user(ra.buf, raw, CD_FRAMESIZE_RAW))
  2266. -                    rc = -EFAULT;
  2267. -            if (rc)
  2268. -                break;
  2269. -
  2270. -            ra.buf     += CD_FRAMESIZE_RAW;
  2271. -            ra.nframes -= 1;
  2272. -            lba++;
  2273. -        }
  2274. -        spin_lock_irqsave(&io_request_lock, flags);
  2275. - scsi_free(raw,2048+512);
  2276. -        spin_unlock_irqrestore(&io_request_lock, flags);
  2277. -        return rc;
  2278. -    }
  2279. -    case BLKRAGET:
  2280. - if (!arg)
  2281. - return -EINVAL;
  2282. - err = verify_area(VERIFY_WRITE, (long *) arg, sizeof(long));
  2283. - if (err)
  2284. - return err;
  2285. - put_user(read_ahead[MAJOR(cdi->dev)], (long *) arg);
  2286. - return 0;
  2287. -
  2288. -    case BLKRASET:
  2289. - if(!capable(CAP_SYS_ADMIN))
  2290. -         return -EACCES;
  2291. - if(!(cdi->dev))
  2292. -         return -EINVAL;
  2293. - if(arg > 0xff)
  2294. -         return -EINVAL;
  2295. - read_ahead[MAJOR(cdi->dev)] = arg;
  2296. - return 0;
  2297. -
  2298. -    case BLKSSZGET:
  2299. - /* Block size of media */
  2300. - return put_user(blksize_size[MAJOR(cdi->dev)][MINOR(cdi->dev)],
  2301. - (int *)arg);
  2302. -
  2303. -    RO_IOCTLS(cdi->dev,arg);
  2304. -
  2305. -    case BLKFLSBUF:
  2306. - if(!capable(CAP_SYS_ADMIN))
  2307. - return -EACCES;
  2308. - if(!(cdi->dev))
  2309. - return -EINVAL;
  2310. - fsync_dev(cdi->dev);
  2311. - invalidate_buffers(cdi->dev);
  2312. - return 0;
  2313. -
  2314. -    default:
  2315. - return scsi_ioctl(scsi_CDs[target].device,cmd,(void *) arg);
  2316. -    }
  2317. +    return scsi_ioctl(scsi_CDs[MINOR(cdi->dev)].device,cmd,(void *) arg);
  2318.  }
  2319.  
  2320.  /*
  2321. diff -ur --exclude-from /home/axboe/cdrom/exclude-from linux-2.2.13/drivers/scsi/sr_vendor.c linux/drivers/scsi/sr_vendor.c
  2322. --- linux-2.2.13/drivers/scsi/sr_vendor.c Wed May 12 13:57:12 1999
  2323. +++ linux/drivers/scsi/sr_vendor.c Sun Oct 31 13:28:08 1999
  2324. @@ -60,8 +60,7 @@
  2325.  
  2326.  #define VENDOR_ID (scsi_CDs[minor].vendor)
  2327.  
  2328. -void
  2329. -sr_vendor_init(int minor)
  2330. +void sr_vendor_init(int minor)
  2331.  {
  2332.  #ifndef CONFIG_BLK_DEV_SR_VENDOR
  2333.   VENDOR_ID = VENDOR_SCSI3;
  2334. @@ -104,8 +103,7 @@
  2335.  /* small handy function for switching block length using MODE SELECT,
  2336.   * used by sr_read_sector() */
  2337.  
  2338. -int
  2339. -sr_set_blocklength(int minor, int blocklength)
  2340. +int sr_set_blocklength(int minor, int blocklength)
  2341.  {
  2342.   unsigned char           *buffer;    /* the buffer for the ioctl */
  2343.   unsigned char cmd[12];    /* the scsi-command */
  2344. @@ -160,7 +158,9 @@
  2345.   if (scsi_CDs[minor].cdi.mask & CDC_MULTI_SESSION)
  2346.   return 0;
  2347.  
  2348. + spin_lock_irq(&io_request_lock);
  2349.   buffer = (unsigned char *) scsi_malloc(512);
  2350. + spin_unlock_irq(&io_request_lock);
  2351.   if(!buffer) return -ENOMEM;
  2352.  
  2353.   sector   = 0;         /* the multisession sector offset goes here  */
  2354. diff -ur --exclude-from /home/axboe/cdrom/exclude-from linux-2.2.13/fs/isofs/inode.c linux/fs/isofs/inode.c
  2355. --- linux-2.2.13/fs/isofs/inode.c Fri Nov  5 15:15:40 1999
  2356. +++ linux/fs/isofs/inode.c Sun Oct 31 13:23:55 1999
  2357. @@ -411,7 +411,7 @@
  2358.    struct inode inode_fake;
  2359.    struct file_operations *fops;
  2360.    extern struct file_operations * get_blkfops(unsigned int);
  2361. -  int i;
  2362. +  int i, session = 0;
  2363.  
  2364.    vol_desc_start=0;
  2365.    fops = get_blkfops(MAJOR(dev));
  2366. @@ -424,6 +424,27 @@
  2367.        mm_segment_t old_fs=get_fs();
  2368.        inode_fake.i_rdev=dev;
  2369.        ms_info.addr_format=CDROM_LBA;
  2370. +      /* If a minor device was explicitly opened, set session to the
  2371. +       * minor number. For instance, if /dev/hdc1 is mounted, session
  2372. +       * 1 on the CD-ROM is selected. CD_PART_MAX gives access to
  2373. +       * a max of 64 sessions on IDE. SCSI drives must still use
  2374. +       * the session option to mount.
  2375. +       */
  2376. +      if ((MINOR(dev) % CD_PART_MAX) && (MAJOR(dev) != SCSI_CDROM_MAJOR))
  2377. + session = MINOR(dev) % CD_PART_MAX;
  2378. +      if (session > 0 && session <= CD_PART_MAX) {
  2379. + struct cdrom_tocentry entry;
  2380. + entry.cdte_track=session;
  2381. + entry.cdte_format=CDROM_LBA;
  2382. + set_fs(KERNEL_DS);
  2383. + i=get_blkfops(MAJOR(dev))->ioctl(&inode_fake,
  2384. +       NULL, CDROMREADTOCENTRY, (unsigned long) &entry);
  2385. + set_fs(old_fs);
  2386. + if(!i) printk(KERN_ERR"Session %d start %d type %dn",session,entry.cdte_addr.lba,entry.cdte_ctrl&CDROM_DATA_TRACK);
  2387. + if(i || (entry.cdte_ctrl & CDROM_DATA_TRACK) != 4)
  2388. + printk(KERN_ERR"Invalid session number or type of trackn");
  2389. + else return entry.cdte_addr.lba;
  2390. +      }
  2391.        set_fs(KERNEL_DS);
  2392.        i=get_blkfops(MAJOR(dev))->ioctl(&inode_fake,
  2393.          NULL,
  2394. diff -ur --exclude-from /home/axboe/cdrom/exclude-from linux-2.2.13/include/linux/cdrom.h linux/include/linux/cdrom.h
  2395. --- linux-2.2.13/include/linux/cdrom.h Mon Mar 22 03:37:56 1999
  2396. +++ linux/include/linux/cdrom.h Sun Oct 31 16:05:05 1999
  2397. @@ -11,6 +11,8 @@
  2398.  #ifndef _LINUX_CDROM_H
  2399.  #define _LINUX_CDROM_H
  2400.  
  2401. +#include <linux/types.h>
  2402. +
  2403.  /*******************************************************
  2404.   * As of Linux 2.1.x, all Linux CD-ROM application programs will use this 
  2405.   * (and only this) include file.  It is my hope to provide Linux with
  2406. @@ -94,16 +96,26 @@
  2407.  #define CDROMPLAYBLK 0x5317 /* (struct cdrom_blk) */
  2408.  
  2409.  /* 
  2410. - * These ioctls are used only used in optcd.c
  2411. + * These ioctls are only used in optcd.c
  2412.   */
  2413.  #define CDROMREADALL 0x5318 /* read all 2646 bytes */
  2414. -#define CDROMCLOSETRAY 0x5319 /* pendant of CDROMEJECT */
  2415. +
  2416. +/* 
  2417. + * These ioctls are (now) only in ide-cd.c for controlling 
  2418. + * drive spindown time.  They should be implemented in the
  2419. + * Uniform driver, via generic packet commands, GPCMD_MODE_SELECT_10,
  2420. + * GPCMD_MODE_SENSE_10 and the GPMODE_POWER_PAGE...
  2421. + *  -Erik
  2422. + */
  2423. +#define CDROMGETSPINDOWN        0x531d
  2424. +#define CDROMSETSPINDOWN        0x531e
  2425.  
  2426.  /* 
  2427.   * These ioctls are implemented through the uniform CD-ROM driver
  2428.   * They _will_ be adopted by all CD-ROM drivers, when all the CD-ROM
  2429.   * drivers are eventually ported to the uniform CD-ROM driver interface.
  2430.   */
  2431. +#define CDROMCLOSETRAY 0x5319 /* pendant of CDROMEJECT */
  2432.  #define CDROM_SET_OPTIONS 0x5320  /* Set behavior options */
  2433.  #define CDROM_CLEAR_OPTIONS 0x5321  /* Clear behavior options */
  2434.  #define CDROM_SELECT_SPEED 0x5322  /* Set the CD-ROM speed */
  2435. @@ -119,6 +131,15 @@
  2436.  /* This ioctl is only used by sbpcd at the moment */
  2437.  #define CDROMAUDIOBUFSIZ        0x5382 /* set the audio buffer size */
  2438.  
  2439. +/* DVD-ROM Specific ioctls */
  2440. +#define DVD_READ_STRUCT 0x5390  /* Read structure */
  2441. +#define DVD_WRITE_STRUCT 0x5391  /* Write structure */
  2442. +#define DVD_AUTH 0x5392  /* Authentication */
  2443. +
  2444. +#define CDROM_SEND_PACKET 0x5393 /* send a packet to the drive */
  2445. +#define CDROM_NEXT_WRITABLE 0x5394 /* get next writable block */
  2446. +#define CDROM_LAST_WRITTEN 0x5395 /* get last block written on disc */
  2447. +
  2448.  /*******************************************************
  2449.   * CDROM IOCTL structures
  2450.   *******************************************************/
  2451. @@ -126,9 +147,9 @@
  2452.  /* Address in MSF format */
  2453.  struct cdrom_msf0
  2454.  {
  2455. - u_char minute;
  2456. - u_char second;
  2457. - u_char frame;
  2458. + __u8 minute;
  2459. + __u8 second;
  2460. + __u8 frame;
  2461.  };
  2462.  
  2463.  /* Address in either MSF or logical format */
  2464. @@ -141,48 +162,48 @@
  2465.  /* This struct is used by the CDROMPLAYMSF ioctl */ 
  2466.  struct cdrom_msf 
  2467.  {
  2468. - u_char cdmsf_min0; /* start minute */
  2469. - u_char cdmsf_sec0; /* start second */
  2470. - u_char cdmsf_frame0; /* start frame */
  2471. - u_char cdmsf_min1; /* end minute */
  2472. - u_char cdmsf_sec1; /* end second */
  2473. - u_char cdmsf_frame1; /* end frame */
  2474. + __u8 cdmsf_min0; /* start minute */
  2475. + __u8 cdmsf_sec0; /* start second */
  2476. + __u8 cdmsf_frame0; /* start frame */
  2477. + __u8 cdmsf_min1; /* end minute */
  2478. + __u8 cdmsf_sec1; /* end second */
  2479. + __u8 cdmsf_frame1; /* end frame */
  2480.  };
  2481.  
  2482.  /* This struct is used by the CDROMPLAYTRKIND ioctl */
  2483.  struct cdrom_ti 
  2484.  {
  2485. - u_char cdti_trk0; /* start track */
  2486. - u_char cdti_ind0; /* start index */
  2487. - u_char cdti_trk1; /* end track */
  2488. - u_char cdti_ind1; /* end index */
  2489. + __u8 cdti_trk0; /* start track */
  2490. + __u8 cdti_ind0; /* start index */
  2491. + __u8 cdti_trk1; /* end track */
  2492. + __u8 cdti_ind1; /* end index */
  2493.  };
  2494.  
  2495.  /* This struct is used by the CDROMREADTOCHDR ioctl */
  2496.  struct cdrom_tochdr 
  2497.  {
  2498. - u_char cdth_trk0; /* start track */
  2499. - u_char cdth_trk1; /* end track */
  2500. + __u8 cdth_trk0; /* start track */
  2501. + __u8 cdth_trk1; /* end track */
  2502.  };
  2503.  
  2504.  /* This struct is used by the CDROMVOLCTRL and CDROMVOLREAD ioctls */
  2505.  struct cdrom_volctrl
  2506.  {
  2507. - u_char channel0;
  2508. - u_char channel1;
  2509. - u_char channel2;
  2510. - u_char channel3;
  2511. + __u8 channel0;
  2512. + __u8 channel1;
  2513. + __u8 channel2;
  2514. + __u8 channel3;
  2515.  };
  2516.  
  2517.  /* This struct is used by the CDROMSUBCHNL ioctl */
  2518.  struct cdrom_subchnl 
  2519.  {
  2520. - u_char cdsc_format;
  2521. - u_char cdsc_audiostatus;
  2522. - u_char cdsc_adr: 4;
  2523. - u_char cdsc_ctrl: 4;
  2524. - u_char cdsc_trk;
  2525. - u_char cdsc_ind;
  2526. + __u8 cdsc_format;
  2527. + __u8 cdsc_audiostatus;
  2528. + __u8 cdsc_adr: 4;
  2529. + __u8 cdsc_ctrl: 4;
  2530. + __u8 cdsc_trk;
  2531. + __u8 cdsc_ind;
  2532.   union cdrom_addr cdsc_absaddr;
  2533.   union cdrom_addr cdsc_reladdr;
  2534.  };
  2535. @@ -191,12 +212,12 @@
  2536.  /* This struct is used by the CDROMREADTOCENTRY ioctl */
  2537.  struct cdrom_tocentry 
  2538.  {
  2539. - u_char cdte_track;
  2540. - u_char cdte_adr :4;
  2541. - u_char cdte_ctrl :4;
  2542. - u_char cdte_format;
  2543. + __u8 cdte_track;
  2544. + __u8 cdte_adr :4;
  2545. + __u8 cdte_ctrl :4;
  2546. + __u8 cdte_format;
  2547.   union cdrom_addr cdte_addr;
  2548. - u_char cdte_datamode;
  2549. + __u8 cdte_datamode;
  2550.  };
  2551.  
  2552.  /* This struct is used by the CDROMREADMODE1, and CDROMREADMODE2 ioctls */
  2553. @@ -211,9 +232,9 @@
  2554.  struct cdrom_read_audio
  2555.  {
  2556.   union cdrom_addr addr; /* frame address */
  2557. - u_char addr_format;    /* CDROM_LBA or CDROM_MSF */
  2558. + __u8 addr_format;    /* CDROM_LBA or CDROM_MSF */
  2559.   int nframes;           /* number of 2352-byte-frames to read at once */
  2560. - u_char *buf;           /* frame buffer (size: nframes*2352 bytes) */
  2561. + __u8 *buf;           /* frame buffer (size: nframes*2352 bytes) */
  2562.  };
  2563.  
  2564.  /* This struct is used with the CDROMMULTISESSION ioctl */
  2565. @@ -222,8 +243,8 @@
  2566.   union cdrom_addr addr; /* frame address: start-of-last-session 
  2567.                              (not the new "frame 16"!).  Only valid
  2568.                              if the "xa_flag" is true. */
  2569. - u_char xa_flag;        /* 1: "is XA disk" */
  2570. - u_char addr_format;    /* CDROM_LBA or CDROM_MSF */
  2571. + __u8 xa_flag;        /* 1: "is XA disk" */
  2572. + __u8 addr_format;    /* CDROM_LBA or CDROM_MSF */
  2573.  };
  2574.  
  2575.  /* This struct is used with the CDROM_GET_MCN ioctl.  
  2576. @@ -233,7 +254,7 @@
  2577.   */  
  2578.  struct cdrom_mcn 
  2579.  {
  2580. -  u_char medium_catalog_number[14]; /* 13 ASCII digits, null-terminated */
  2581. +  __u8 medium_catalog_number[14]; /* 13 ASCII digits, null-terminated */
  2582.  };
  2583.  
  2584.  /* This is used by the CDROMPLAYBLK ioctl */
  2585. @@ -243,6 +264,18 @@
  2586.   unsigned short len;
  2587.  };
  2588.  
  2589. +#define CDROM_PACKET_SIZE 12
  2590. +
  2591. +/* for CDROM_PACKET_COMMAND ioctl */
  2592. +struct cdrom_generic_command
  2593. +{
  2594. + unsigned char  cmd[CDROM_PACKET_SIZE];
  2595. + unsigned char  *buffer;
  2596. + unsigned int  buflen;
  2597. + int stat;
  2598. + void *reserved[4];
  2599. +};
  2600. +
  2601.  
  2602.  /*
  2603.   * A CD-ROM physical sector size is 2048, 2052, 2056, 2324, 2332, 2336, 
  2604. @@ -321,14 +354,6 @@
  2605.  #define CDROM_AUDIO_ERROR 0x14 /* audio play stopped due to error */
  2606.  #define CDROM_AUDIO_NO_STATUS 0x15 /* no current audio status to return */
  2607.  
  2608. -/* CD-ROM-specific SCSI command opcodes */
  2609. -#define SCMD_READ_TOC 0x43 /* read table of contents */
  2610. -#define SCMD_PLAYAUDIO_MSF 0x47 /* play data at time offset */
  2611. -#define SCMD_PLAYAUDIO_TI 0x48 /* play data at track/index */
  2612. -#define SCMD_PAUSE_RESUME 0x4B /* pause/resume audio */
  2613. -#define SCMD_READ_SUBCHANNEL 0x42 /* read SC info on playing disc */
  2614. -#define SCMD_PLAYAUDIO10 0x45 /* play data at logical block */
  2615. -
  2616.  /* capability flags used with the uniform CD-ROM driver */ 
  2617.  #define CDC_CLOSE_TRAY 0x1     /* caddy systems _can't_ close */
  2618.  #define CDC_OPEN_TRAY 0x2     /* but _can_ eject.  */
  2619. @@ -342,6 +367,12 @@
  2620.  #define CDC_RESET               0x200   /* hard reset device */
  2621.  #define CDC_IOCTLS              0x400   /* driver has non-standard ioctls */
  2622.  #define CDC_DRIVE_STATUS        0x800   /* driver implements drive status */
  2623. +#define CDC_GENERIC_PACKET 0x1000 /* driver implements generic packets */
  2624. +#define CDC_CD_R 0x2000 /* drive is a CD-R */
  2625. +#define CDC_CD_RW 0x4000 /* drive is a CD-RW */
  2626. +#define CDC_DVD 0x8000 /* drive is a DVD */
  2627. +#define CDC_DVD_R 0x10000 /* drive can write DVD-R */
  2628. +#define CDC_DVD_RAM 0x20000 /* drive can write DVD-RAM */
  2629.  
  2630.  /* drive status possibilities returned by CDROM_DRIVE_STATUS ioctl */
  2631.  #define CDS_NO_INFO 0 /* if not implemented */
  2632. @@ -370,7 +401,269 @@
  2633.  #define CDSL_NONE        ((int) (~0U>>1)-1)
  2634.  #define CDSL_CURRENT     ((int) (~0U>>1))
  2635.  
  2636. +/* For partition based multisession access. IDE can handle 64 partitions
  2637. + * per drive - SCSI CD-ROM's use minors to differentiate between the
  2638. + * various drives, so we can't do multisessions the same way there.
  2639. + * Use the -o session=x option to mount on them.
  2640. + */
  2641. +#define CD_PART_MAX 64
  2642. +#define CD_PART_MASK (CD_PART_MAX - 1)
  2643. +
  2644. +/*********************************************************************
  2645. + * Generic Packet commands, MMC commands, and such
  2646. + *********************************************************************/
  2647. +
  2648. + /* The generic packet command opcodes for CD/DVD Logical Units,
  2649. + * From Table 57 of the SFF8090 Ver. 3 (Mt. Fuji) draft standard. */
  2650. +#define GPCMD_BLANK     0xa1
  2651. +#define GPCMD_CLOSE_TRACK     0x5b
  2652. +#define GPCMD_FLUSH_CACHE     0x35
  2653. +#define GPCMD_FORMAT_UNIT     0x04
  2654. +#define GPCMD_GET_CONFIGURATION     0x46
  2655. +#define GPCMD_GET_EVENT_STATUS_NOTIFICATION 0x4a
  2656. +#define GPCMD_GET_PERFORMANCE     0xac
  2657. +#define GPCMD_INQUIRY     0x12
  2658. +#define GPCMD_LOAD_UNLOAD     0xa6
  2659. +#define GPCMD_MECHANISM_STATUS     0xbd
  2660. +#define GPCMD_MODE_SELECT_10     0x55
  2661. +#define GPCMD_MODE_SENSE_10     0x5a
  2662. +#define GPCMD_PAUSE_RESUME     0x4b
  2663. +#define GPCMD_PLAY_AUDIO_10     0x45
  2664. +#define GPCMD_PLAY_AUDIO_MSF     0x47
  2665. +#define GPCMD_PLAY_CD     0xbc
  2666. +#define GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL  0x1e
  2667. +#define GPCMD_READ_10     0x28
  2668. +#define GPCMD_READ_12     0xa8
  2669. +#define GPCMD_READ_CDVD_CAPACITY     0x25
  2670. +#define GPCMD_READ_CD     0xbe
  2671. +#define GPCMD_READ_CD_MSF     0xb9
  2672. +#define GPCMD_READ_DISC_INFO     0x51
  2673. +#define GPCMD_READ_DVD_STRUCTURE     0xad
  2674. +#define GPCMD_READ_FORMAT_CAPACITIES     0x23
  2675. +#define GPCMD_READ_HEADER     0x44
  2676. +#define GPCMD_READ_TRACK_RZONE_INFO     0x52
  2677. +#define GPCMD_READ_SUBCHANNEL     0x42
  2678. +#define GPCMD_READ_TOC_PMA_ATIP     0x43
  2679. +#define GPCMD_REPAIR_RZONE_TRACK     0x58
  2680. +#define GPCMD_REPORT_KEY     0xa4
  2681. +#define GPCMD_REQUEST_SENSE     0x03
  2682. +#define GPCMD_RESERVE_RZONE_TRACK     0x53
  2683. +#define GPCMD_SCAN     0xba
  2684. +#define GPCMD_SEEK     0x2b
  2685. +#define GPCMD_SEND_DVD_STRUCTURE     0xad
  2686. +#define GPCMD_SEND_EVENT     0xa2
  2687. +#define GPCMD_SEND_KEY     0xa3
  2688. +#define GPCMD_SEND_OPC     0x54
  2689. +#define GPCMD_SET_READ_AHEAD     0xa7
  2690. +#define GPCMD_SET_STREAMING     0xb6
  2691. +#define GPCMD_START_STOP_UNIT     0x1b
  2692. +#define GPCMD_STOP_PLAY_SCAN     0x4e
  2693. +#define GPCMD_TEST_UNIT_READY     0x00
  2694. +#define GPCMD_VERIFY_10     0x2f
  2695. +#define GPCMD_WRITE_10     0x2a
  2696. +#define GPCMD_WRITE_AND_VERIFY_10     0x2e
  2697. +/* This is listed as optional in ATAPI 2.6, but is (curiously) 
  2698. + * missing from Mt. Fuji, Table 57.  It _is_ mentioned in Mt. Fuji
  2699. + * Table 377 as an MMC command for SCSi devices though...  Most ATAPI
  2700. + * drives support it. */
  2701. +#define GPCMD_SET_SPEED     0xbb
  2702. +/* This seems to be a SCSI specific CD-ROM opcode 
  2703. + * to play data at track/index */
  2704. +#define GPCMD_PLAYAUDIO_TI     0x48
  2705. +
  2706. +/* Is this really used by anything?  I couldn't find these...*/
  2707. +#if 0
  2708. +/* MMC2/MTFuji Opcodes */
  2709. +#define ERASE 0x2c
  2710. +#define READ_BUFFER 0x3c
  2711. +#endif
  2712. +
  2713. +
  2714. +
  2715. +
  2716. +/* Mode page codes for mode sense/set */
  2717. +#define GPMODE_R_W_ERROR_PAGE 0x01
  2718. +#define GPMODE_WRITE_PARMS_PAGE 0x05
  2719. +#define GPMODE_AUDIO_CTL_PAGE 0x0e
  2720. +#define GPMODE_POWER_PAGE 0x1a
  2721. +#define GPMODE_FAULT_FAIL_PAGE 0x1c
  2722. +#define GPMODE_TO_PROTECT_PAGE 0x1d
  2723. +#define GPMODE_CAPABILITIES_PAGE 0x2a
  2724. +#define GPMODE_ALL_PAGES 0x3f
  2725. +/* Not in Mt. Fuji, but in ATAPI 2.6 -- depricated now in favor
  2726. + * of MODE_SENSE_POWER_PAGE */
  2727. +#define GPMODE_CDROM_PAGE 0x0d
  2728. +
  2729. +
  2730. +
  2731. +/* DVD struct types */
  2732. +#define DVD_STRUCT_PHYSICAL 0x00
  2733. +#define DVD_STRUCT_COPYRIGHT 0x01
  2734. +#define DVD_STRUCT_DISCKEY 0x02
  2735. +#define DVD_STRUCT_BCA 0x03
  2736. +#define DVD_STRUCT_MANUFACT 0x04
  2737. +
  2738. +struct dvd_layer {
  2739. + __u8 book_version : 4;
  2740. + __u8 book_type : 4;
  2741. + __u8 min_rate : 4;
  2742. + __u8 disc_size : 4;
  2743. + __u8 layer_type : 4;
  2744. + __u8 track_path : 1;
  2745. + __u8 nlayers : 2;
  2746. + __u8 track_density : 4;
  2747. + __u8 linear_density : 4;
  2748. + __u8 bca : 1;
  2749. + __u32 start_sector;
  2750. + __u32 end_sector;
  2751. + __u32 end_sector_l0;
  2752. +};
  2753. +
  2754. +struct dvd_physical {
  2755. + __u8 type;
  2756. + __u8 layer_num;
  2757. + struct dvd_layer layer[4];
  2758. +};
  2759. +
  2760. +struct dvd_copyright {
  2761. + __u8 type;
  2762. +
  2763. + __u8 layer_num;
  2764. + __u8 cpst;
  2765. + __u8 rmi;
  2766. +};
  2767. +
  2768. +struct dvd_disckey {
  2769. + __u8 type;
  2770. +
  2771. + unsigned agid : 2;
  2772. + __u8 value[2048];
  2773. +};
  2774. +
  2775. +struct dvd_bca {
  2776. + __u8 type;
  2777. +
  2778. + int len;
  2779. + __u8 value[188];
  2780. +};
  2781. +
  2782. +struct dvd_manufact {
  2783. + __u8 type;
  2784. +
  2785. + __u8 layer_num;
  2786. + int len;
  2787. + __u8 value[2048];
  2788. +};
  2789. +
  2790. +typedef union {
  2791. + __u8 type;
  2792. +
  2793. + struct dvd_physical physical;
  2794. + struct dvd_copyright copyright;
  2795. + struct dvd_disckey disckey;
  2796. + struct dvd_bca bca;
  2797. + struct dvd_manufact manufact;
  2798. +} dvd_struct;
  2799. +
  2800. +/*
  2801. + * DVD authentication ioctl
  2802. + */
  2803. +
  2804. +/* Authentication states */
  2805. +#define DVD_LU_SEND_AGID 0
  2806. +#define DVD_HOST_SEND_CHALLENGE 1
  2807. +#define DVD_LU_SEND_KEY1 2
  2808. +#define DVD_LU_SEND_CHALLENGE 3
  2809. +#define DVD_HOST_SEND_KEY2 4
  2810. +
  2811. +/* Termination states */
  2812. +#define DVD_AUTH_ESTABLISHED 5
  2813. +#define DVD_AUTH_FAILURE 6
  2814. +
  2815. +/* Other functions */
  2816. +#define DVD_LU_SEND_TITLE_KEY 7
  2817. +#define DVD_LU_SEND_ASF 8
  2818. +#define DVD_INVALIDATE_AGID 9
  2819. +
  2820. +/* State data */
  2821. +typedef __u8 dvd_key[5]; /* 40-bit value, MSB is first elem. */
  2822. +typedef __u8 dvd_challenge[10]; /* 80-bit value, MSB is first elem. */
  2823. +
  2824. +struct dvd_lu_send_agid {
  2825. + __u8 type;
  2826. + unsigned agid : 2;
  2827. +};
  2828. +
  2829. +struct dvd_host_send_challenge {
  2830. + __u8 type;
  2831. + unsigned agid : 2;
  2832. +
  2833. + dvd_challenge chal;
  2834. +};
  2835. +
  2836. +struct dvd_send_key {
  2837. + __u8 type;
  2838. + unsigned agid : 2;
  2839. +
  2840. + dvd_key key;
  2841. +};
  2842. +
  2843. +struct dvd_lu_send_challenge {
  2844. + __u8 type;
  2845. + unsigned agid : 2;
  2846. +
  2847. + dvd_challenge chal;
  2848. +};
  2849. +
  2850. +#define DVD_CPM_NO_COPYRIGHT 0
  2851. +#define DVD_CPM_COPYRIGHTED 1
  2852. +
  2853. +#define DVD_CP_SEC_NONE 0
  2854. +#define DVD_CP_SEC_EXIST 1
  2855. +
  2856. +#define DVD_CGMS_UNRESTRICTED 0
  2857. +#define DVD_CGMS_SINGLE 2
  2858. +#define DVD_CGMS_RESTRICTED 3
  2859. +
  2860. +struct dvd_lu_send_title_key {
  2861. + __u8 type;
  2862. + unsigned agid : 2;
  2863. +
  2864. + dvd_key title_key;
  2865. + int lba;
  2866. + unsigned cpm : 1;
  2867. + unsigned cp_sec : 1;
  2868. + unsigned cgms : 2;
  2869. +};
  2870. +
  2871. +struct dvd_lu_send_asf {
  2872. + __u8 type;
  2873. + unsigned agid : 2;
  2874. +
  2875. + unsigned asf : 1;
  2876. +};
  2877. +
  2878. +typedef union {
  2879. + __u8 type;
  2880. +
  2881. + struct dvd_lu_send_agid lsa;
  2882. + struct dvd_host_send_challenge hsc;
  2883. + struct dvd_send_key lsk;
  2884. + struct dvd_lu_send_challenge lsc;
  2885. + struct dvd_send_key hsk;
  2886. + struct dvd_lu_send_title_key lstk;
  2887. + struct dvd_lu_send_asf lsasf;
  2888. +} dvd_authinfo;
  2889. +
  2890.  #ifdef __KERNEL__
  2891. +
  2892. +struct cdrom_write_settings {
  2893. + unsigned char fpacket; /* fixed/variable packets */
  2894. + unsigned long packet_size; /* write out this number of packets */
  2895. + unsigned long nwa; /* next writeable address */
  2896. + unsigned char writeable; /* cdrom is writeable */
  2897. +};
  2898. +
  2899.  /* Uniform cdrom data structures for cdrom.c */
  2900.  struct cdrom_device_info {
  2901.   struct cdrom_device_ops  *ops;  /* link to device_ops */
  2902. @@ -382,11 +675,14 @@
  2903.   int speed; /* maximum speed for reading data */
  2904.   int capacity; /* number of discs in jukebox */
  2905.  /* device-related storage */
  2906. - int options : 30;               /* options flags */
  2907. - unsigned mc_flags : 2;          /* media change buffer flags */
  2908. + int options : 30; /* options flags */
  2909. + unsigned mc_flags : 2; /* media change buffer flags */
  2910.       int use_count;                  /* number of times device opened */
  2911.       char name[20];                  /* name of the device type */
  2912. -
  2913. +/* per-device flags */
  2914. +        __u8 sanyo_slot : 2; /* Sanyo 3 CD changer support */
  2915. +        __u8 reserved : 6; /* not used yet */
  2916. + struct cdrom_write_settings write;
  2917.  };
  2918.  
  2919.  struct cdrom_device_ops {
  2920. @@ -413,6 +709,9 @@
  2921.  /* driver specifications */
  2922.   const int capability;   /* capability flags */
  2923.   int n_minors;           /* number of active minor devices */
  2924. + /* handle uniform packets for scsi type devices (scsi,atapi) */
  2925. + int (*generic_packet) (struct cdrom_device_info *,
  2926. +        struct cdrom_generic_command *);
  2927.  };
  2928.  
  2929.  /* the general file operations structure: */
  2930. @@ -420,6 +719,7 @@
  2931.  
  2932.  extern int register_cdrom(struct cdrom_device_info *cdi);
  2933.  extern int unregister_cdrom(struct cdrom_device_info *cdi);
  2934. +
  2935.  typedef struct {
  2936.      int data;
  2937.      int audio;
  2938. @@ -427,7 +727,217 @@
  2939.      int xa;
  2940.      long error;
  2941.  } tracktype;
  2942. +
  2943.  extern void cdrom_count_tracks(struct cdrom_device_info *cdi,tracktype* tracks);
  2944. +extern int cdrom_get_next_writable(kdev_t dev, long *next_writable);
  2945. +extern int cdrom_get_last_written(kdev_t dev, long *last_written);
  2946. +extern int cdrom_number_of_slots(struct cdrom_device_info *cdi);
  2947. +extern int cdrom_select_disc(struct cdrom_device_info *cdi, int slot);
  2948. +extern int cdrom_mode_select(struct cdrom_device_info *cdi,
  2949. +      struct cdrom_generic_command *cgc);
  2950. +extern int cdrom_mode_sense(struct cdrom_device_info *cdi,
  2951. +     struct cdrom_generic_command *cgc,
  2952. +     int page_code, int page_control);
  2953. +extern void init_cdrom_command(struct cdrom_generic_command *cgc,
  2954. +        void *buffer, int len);
  2955. +
  2956. +typedef struct {
  2957. + __u16 disc_information_length;
  2958. +#if defined(__BIG_ENDIAN_BITFIELD)
  2959. + __u8 reserved1 : 3;
  2960. +        __u8 erasable : 1;
  2961. +        __u8 border_status : 2;
  2962. +        __u8 disc_border : 2;
  2963. +#elif defined(__LITTLE_ENDIAN_BITFIELD)
  2964. +        __u8 disc_border : 2;
  2965. +        __u8 border_status : 2;
  2966. +        __u8 erasable : 1;
  2967. + __u8 reserved1 : 3;
  2968. +#else
  2969. +#error "Please fix <asm/byteorder.h>"
  2970. +#endif
  2971. + __u8 n_first_track;
  2972. + __u8 n_sessions_lsb;
  2973. + __u8 first_track_lsb;
  2974. + __u8 last_track_lsb;
  2975. +#if defined(__BIG_ENDIAN_BITFIELD)
  2976. + __u8 did_v : 1;
  2977. +        __u8 dbc_v : 1;
  2978. +        __u8 uru : 1;
  2979. +        __u8 reserved2 : 5;
  2980. +#elif defined(__LITTLE_ENDIAN_BITFIELD)
  2981. +        __u8 reserved2 : 5;
  2982. +        __u8 uru : 1;
  2983. +        __u8 dbc_v : 1;
  2984. + __u8 did_v : 1;
  2985. +#endif
  2986. + __u8 disc_type;
  2987. + __u8 n_sessions_msb;
  2988. + __u8 first_track_msb;
  2989. + __u8 last_track_msb;
  2990. + __u32 disc_id;
  2991. + __u32 lead_in;
  2992. + __u32 lead_out;
  2993. + __u8 disc_bar_code[8];
  2994. + __u8 reserved3;
  2995. + __u8 n_opc;
  2996. +} disc_information;
  2997. +
  2998. +typedef struct {
  2999. + __u16 track_information_length;
  3000. + __u8 track_lsb;
  3001. + __u8 session_lsb;
  3002. + __u8 reserved1;
  3003. +#if defined(__BIG_ENDIAN_BITFIELD)
  3004. + __u8 reserved2 : 2;
  3005. +        __u8 damage : 1;
  3006. +        __u8 copy : 1;
  3007. +        __u8 track_mode : 4;
  3008. + __u8 rt : 1;
  3009. + __u8 blank : 1;
  3010. + __u8 packet : 1;
  3011. + __u8 fp : 1;
  3012. + __u8 data_mode : 4;
  3013. + __u8 reserved3 : 6;
  3014. + __u8 lra_v : 1;
  3015. + __u8 nwa_v : 1;
  3016. +#elif defined(__LITTLE_ENDIAN_BITFIELD)
  3017. +        __u8 track_mode : 4;
  3018. +        __u8 copy : 1;
  3019. +        __u8 damage : 1;
  3020. + __u8 reserved2 : 2;
  3021. + __u8 data_mode : 4;
  3022. + __u8 fp : 1;
  3023. + __u8 packet : 1;
  3024. + __u8 blank : 1;
  3025. + __u8 rt : 1;
  3026. + __u8 nwa_v : 1;
  3027. + __u8 lra_v : 1;
  3028. + __u8 reserved3 : 6;
  3029. +#endif
  3030. + __u32 track_start;
  3031. + __u32 next_writable;
  3032. + __u32 free_blocks;
  3033. + __u32 fixed_packet_size;
  3034. + __u32 track_size;
  3035. + __u32 last_rec_address;
  3036. +} track_information;
  3037. +
  3038. +/* The SCSI spec says there could be 256 slots. */
  3039. +#define CDROM_MAX_SLOTS 256
  3040. +
  3041. +struct cdrom_mechstat_header {
  3042. +#if defined(__BIG_ENDIAN_BITFIELD)
  3043. + __u8 fault         : 1;
  3044. + __u8 changer_state : 2;
  3045. + __u8 curslot       : 5;
  3046. + __u8 mech_state    : 3;
  3047. + __u8 door_open     : 1;
  3048. + __u8 reserved1     : 4;
  3049. +#elif defined(__LITTLE_ENDIAN_BITFIELD)
  3050. + __u8 curslot       : 5;
  3051. + __u8 changer_state : 2;
  3052. + __u8 fault         : 1;
  3053. + __u8 reserved1     : 4;
  3054. + __u8 door_open     : 1;
  3055. + __u8 mech_state    : 3;
  3056. +#endif
  3057. + __u8     curlba[3];
  3058. + __u8     nslots;
  3059. + __u8 short slot_tablelen;
  3060. +};
  3061. +
  3062. +struct cdrom_slot {
  3063. +#if defined(__BIG_ENDIAN_BITFIELD)
  3064. + __u8 disc_present : 1;
  3065. + __u8 reserved1    : 6;
  3066. + __u8 change       : 1;
  3067. +#elif defined(__LITTLE_ENDIAN_BITFIELD)
  3068. + __u8 change       : 1;
  3069. + __u8 reserved1    : 6;
  3070. + __u8 disc_present : 1;
  3071. +#endif
  3072. + __u8 reserved2[3];
  3073. +};
  3074. +
  3075. +struct cdrom_changer_info {
  3076. + struct cdrom_mechstat_header hdr;
  3077. + struct cdrom_slot slots[CDROM_MAX_SLOTS];
  3078. +};
  3079. +
  3080. +typedef enum {
  3081. + mechtype_caddy = 0,
  3082. + mechtype_tray  = 1,
  3083. + mechtype_popup = 2,
  3084. + mechtype_individual_changer = 4,
  3085. + mechtype_cartridge_changer  = 5
  3086. +} mechtype_t;
  3087. +
  3088. +struct mode_page_header {
  3089. + __u16 mode_data_length;
  3090. + __u8 medium_type;
  3091. + __u8 reserved1;
  3092. + __u8 reserved2;
  3093. + __u8 reserved3;
  3094. + __u16 desc_length;
  3095. +};
  3096. +
  3097. +typedef struct {
  3098. + struct mode_page_header header;
  3099. +#if defined(__BIG_ENDIAN_BITFIELD)
  3100. + __u8 ps : 1;
  3101. + __u8 reserved1 : 1;
  3102. + __u8 page_code : 6;
  3103. +        __u8 page_length;
  3104. + __u8 reserved2 : 1;
  3105. + __u8 bufe : 1;
  3106. + __u8 ls_v : 1;
  3107. + __u8 test_write : 1;
  3108. +        __u8 write_type : 4;
  3109. + __u8 multi_session : 2; /* or border, DVD */
  3110. + __u8 fp : 1;
  3111. + __u8 copy : 1;
  3112. + __u8 track_mode : 4;
  3113. + __u8 reserved3 : 4;
  3114. + __u8 data_block_type : 4;
  3115. +#elif defined(__LITTLE_ENDIAN_BITFIELD)
  3116. + __u8 page_code : 6;
  3117. + __u8 reserved1 : 1;
  3118. + __u8 ps : 1;
  3119. +        __u8 page_length;
  3120. +        __u8 write_type : 4;
  3121. + __u8 test_write : 1;
  3122. + __u8 ls_v : 1;
  3123. + __u8 bufe : 1;
  3124. + __u8 reserved2 : 1;
  3125. + __u8 track_mode : 4;
  3126. + __u8 copy : 1;
  3127. + __u8 fp : 1;
  3128. + __u8 multi_session : 2; /* or border, DVD */
  3129. + __u8 data_block_type : 4;
  3130. + __u8 reserved3 : 4;
  3131. +#endif
  3132. + __u8 link_size;
  3133. + __u8 reserved4;
  3134. +#if defined(__BIG_ENDIAN_BITFIELD)
  3135. + __u8 reserved5 : 2;
  3136. + __u8 app_code : 6;
  3137. +#elif defined(__LITTLE_ENDIAN_BITFIELD)
  3138. + __u8 app_code : 6;
  3139. + __u8 reserved5 : 2;
  3140. +#endif
  3141. + __u8 session_format;
  3142. + __u8 reserved6;
  3143. + __u32 packet_size;
  3144. + __u16 audio_pause;
  3145. + __u8 mcn[16];
  3146. + __u8 isrc[16];
  3147. + __u8 subhdr0;
  3148. + __u8 subhdr1;
  3149. + __u8 subhdr2;
  3150. + __u8 subhdr3;
  3151. +} write_param_page __attribute__((packed));
  3152. +
  3153.  #endif  /* End of kernel only stuff */ 
  3154.  
  3155.  #endif  /* _LINUX_CDROM_H */
  3156. diff -ur --exclude-from /home/axboe/cdrom/exclude-from linux-2.2.13/include/linux/sysctl.h linux/include/linux/sysctl.h
  3157. --- linux-2.2.13/include/linux/sysctl.h Fri Nov  5 15:15:40 1999
  3158. +++ linux/include/linux/sysctl.h Sun Oct 31 13:23:55 1999
  3159. @@ -432,7 +432,12 @@
  3160.  
  3161.  /* /proc/sys/dev/cdrom */
  3162.  enum {
  3163. - DEV_CDROM_INFO=1
  3164. + DEV_CDROM_INFO=1,
  3165. + DEV_CDROM_AUTOCLOSE=2,
  3166. + DEV_CDROM_AUTOEJECT=3,
  3167. + DEV_CDROM_DEBUG=4,
  3168. + DEV_CDROM_LOCK=5,
  3169. + DEV_CDROM_CHECK_MEDIA=6
  3170.  };
  3171.  
  3172.  #ifdef __KERNEL__