sbpcd.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:164k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. drvcmd[3]=(block>>8)&0xFF;
  2. drvcmd[4]=block&0xFF;
  3. #endif /* TEST_UPC */ 
  4. response_count=0;
  5. flags_cmd_out=f_putcmd|f_lopsta|f_getsta|f_ResponseStatus|f_obey_p_check|f_bit1;
  6. }
  7. else if (fam2_drive)
  8. {
  9. return (-1);
  10. }
  11. else if (famT_drive)
  12. {
  13. return (-1);
  14. }
  15. i=cmd_out();
  16. if (i<0)
  17. {
  18. msg(DBG_000,"cc_ReadUPC cmd_out: err %dn", i);
  19. return (i);
  20. }
  21. if (fam0L_drive)
  22. {
  23. response_count=16;
  24. if (famL_drive) flags_cmd_out=f_putcmd;
  25. i=cc_ReadPacket();
  26. if (i<0)
  27. {
  28. msg(DBG_000,"cc_ReadUPC ReadPacket: err %dn", i);
  29. return (i);
  30. }
  31. }
  32. #if TEST_UPC
  33. checksum=0;
  34. #endif /* TEST_UPC */ 
  35. for (i=0;i<(fam1_drive?8:16);i++)
  36. {
  37. #if TEST_UPC
  38. checksum |= infobuf[i];
  39. #endif /* TEST_UPC */ 
  40. sprintf(&msgbuf[i*3], " %02X", infobuf[i]);
  41. }
  42. msgbuf[i*3]=0;
  43. msg(DBG_UPC,"UPC info:%sn", msgbuf);
  44. #if TEST_UPC
  45. if ((checksum&0x7F)!=0) break;
  46. }
  47. #endif /* TEST_UPC */ 
  48. D_S[d].UPC_ctl_adr=0;
  49. if (fam1_drive) i=0;
  50. else i=2;
  51. if ((infobuf[i]&0x80)!=0)
  52. {
  53. convert_UPC(&infobuf[i]);
  54. D_S[d].UPC_ctl_adr = (D_S[d].TocEnt_ctl_adr & 0xF0) | 0x02;
  55. }
  56. for (i=0;i<7;i++)
  57. sprintf(&msgbuf[i*3], " %02X", D_S[d].UPC_buf[i]);
  58. sprintf(&msgbuf[i*3], " (%02X)", D_S[d].UPC_ctl_adr);
  59. msgbuf[i*3+5]=0;
  60. msg(DBG_UPC,"UPC code:%sn", msgbuf);
  61. D_S[d].diskstate_flags |= upc_bit;
  62. return (0);
  63. }
  64. static int sbpcd_get_mcn(struct cdrom_device_info *cdi, struct cdrom_mcn *mcn)
  65. {
  66. int i;
  67. unsigned char *mcnp = mcn->medium_catalog_number;
  68. unsigned char *resp;
  69. D_S[d].diskstate_flags &= ~upc_bit;
  70. clr_cmdbuf();
  71. if (fam1_drive)
  72. {
  73. drvcmd[0]=CMD1_READ_UPC;
  74. response_count=8;
  75. flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
  76. }
  77. else if (fam0L_drive)
  78. {
  79. drvcmd[0]=CMD0_READ_UPC;
  80. response_count=0;
  81. flags_cmd_out=f_putcmd|f_lopsta|f_getsta|f_ResponseStatus|f_obey_p_check|f_bit1;
  82. }
  83. else if (fam2_drive)
  84. {
  85. return (-1);
  86. }
  87. else if (famT_drive)
  88. {
  89. return (-1);
  90. }
  91. i=cmd_out();
  92. if (i<0)
  93. {
  94. msg(DBG_000,"cc_ReadUPC cmd_out: err %dn", i);
  95. return (i);
  96. }
  97. if (fam0L_drive)
  98. {
  99. response_count=16;
  100. if (famL_drive) flags_cmd_out=f_putcmd;
  101. i=cc_ReadPacket();
  102. if (i<0)
  103. {
  104. msg(DBG_000,"cc_ReadUPC ReadPacket: err %dn", i);
  105. return (i);
  106. }
  107. }
  108. D_S[d].UPC_ctl_adr=0;
  109. if (fam1_drive) i=0;
  110. else i=2;
  111. resp = infobuf + i;
  112. if (*resp++ == 0x80) {
  113. /* packed bcd to single ASCII digits */
  114. *mcnp++ = (*resp >> 4)     + '0';
  115. *mcnp++ = (*resp++ & 0x0f) + '0';
  116. *mcnp++ = (*resp >> 4)     + '0';
  117. *mcnp++ = (*resp++ & 0x0f) + '0';
  118. *mcnp++ = (*resp >> 4)     + '0';
  119. *mcnp++ = (*resp++ & 0x0f) + '0';
  120. *mcnp++ = (*resp >> 4)     + '0';
  121. *mcnp++ = (*resp++ & 0x0f) + '0';
  122. *mcnp++ = (*resp >> 4)     + '0';
  123. *mcnp++ = (*resp++ & 0x0f) + '0';
  124. *mcnp++ = (*resp >> 4)     + '0';
  125. *mcnp++ = (*resp++ & 0x0f) + '0';
  126. *mcnp++ = (*resp >> 4)     + '0';
  127. }
  128. *mcnp = '';
  129. D_S[d].diskstate_flags |= upc_bit;
  130. return (0);
  131. }
  132. /*==========================================================================*/
  133. static int cc_CheckMultiSession(void)
  134. {
  135. int i;
  136. if (fam2_drive) return (0);
  137. D_S[d].f_multisession=0;
  138. D_S[d].lba_multi=0;
  139. if (fam0_drive) return (0);
  140. clr_cmdbuf();
  141. if (fam1_drive)
  142. {
  143. drvcmd[0]=CMD1_MULTISESS;
  144. response_count=6;
  145. flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
  146. i=cmd_out();
  147. if (i<0) return (i);
  148. if ((infobuf[0]&0x80)!=0)
  149. {
  150. D_S[d].f_multisession=1;
  151. D_S[d].lba_multi=msf2blk(make32(make16(0,infobuf[1]),
  152. make16(infobuf[2],infobuf[3])));
  153. }
  154. }
  155. else if (famLV_drive)
  156. {
  157. drvcmd[0]=CMDL_MULTISESS;
  158. drvcmd[1]=3;
  159. drvcmd[2]=1;
  160. response_count=8;
  161. flags_cmd_out=f_putcmd;
  162. i=cmd_out();
  163. if (i<0) return (i);
  164. D_S[d].lba_multi=msf2blk(make32(make16(0,infobuf[5]),
  165. make16(infobuf[6],infobuf[7])));
  166. }
  167. else if (famT_drive)
  168. {
  169. response_count=12;
  170. drvcmd[0]=CMDT_DISKINFO;
  171. drvcmd[1]=0x02;
  172. drvcmd[6]=0;
  173. drvcmd[8]=response_count;
  174. drvcmd[9]=0x40;
  175. i=cmd_out();
  176. if (i<0) return (i);
  177. if (i<response_count) return (-100-i);
  178. D_S[d].first_session=infobuf[2];
  179. D_S[d].last_session=infobuf[3];
  180. D_S[d].track_of_last_session=infobuf[6];
  181. if (D_S[d].first_session!=D_S[d].last_session)
  182. {
  183. D_S[d].f_multisession=1;
  184. D_S[d].lba_multi=msf2blk(make32(make16(0,infobuf[9]),make16(infobuf[10],infobuf[11])));
  185. }
  186. }
  187. for (i=0;i<response_count;i++)
  188. sprintf(&msgbuf[i*3], " %02X", infobuf[i]);
  189. msgbuf[i*3]=0;
  190. msg(DBG_MUL,"MultiSession Info:%s (%d)n", msgbuf, D_S[d].lba_multi);
  191. if (D_S[d].lba_multi>200)
  192. {
  193. D_S[d].f_multisession=1;
  194. msg(DBG_MUL,"MultiSession base: %06Xn", D_S[d].lba_multi);
  195. }
  196. return (0);
  197. }
  198. /*==========================================================================*/
  199. #if FUTURE
  200. static int cc_SubChanInfo(int frame, int count, u_char *buffer)
  201. /* "frame" is a RED BOOK (msf-bin) address */
  202. {
  203. int i;
  204. if (fam0LV_drive) return (-ENOSYS); /* drive firmware lacks it */
  205. if (famT_drive)
  206. {
  207. return (-1);
  208. }
  209. #if 0
  210. if (D_S[d].audio_state!=audio_playing) return (-ENODATA);
  211. #endif
  212. clr_cmdbuf();
  213. drvcmd[0]=CMD1_SUBCHANINF;
  214. drvcmd[1]=(frame>>16)&0xFF;
  215. drvcmd[2]=(frame>>8)&0xFF;
  216. drvcmd[3]=frame&0xFF;
  217. drvcmd[5]=(count>>8)&0xFF;
  218. drvcmd[6]=count&0xFF;
  219. flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check;
  220. cmd_type=READ_SC;
  221. D_S[d].frame_size=CD_FRAMESIZE_SUB;
  222. i=cmd_out(); /* which buffer to use? */
  223. return (i);
  224. }
  225. #endif /* FUTURE */ 
  226. /*==========================================================================*/
  227. static void __init check_datarate(void)
  228. {
  229. int i=0;
  230. msg(DBG_IOX,"check_datarate entered.n");
  231. datarate=0;
  232. #if TEST_STI
  233. for (i=0;i<=1000;i++) printk(".");
  234. #endif
  235. /* set a timer to make (timed_out_delay!=0) after 1.1 seconds */
  236. #if 1
  237. del_timer(&delay_timer);
  238. #endif
  239. delay_timer.expires=jiffies+11*HZ/10;
  240. timed_out_delay=0;
  241. add_timer(&delay_timer);
  242. #if 0
  243. msg(DBG_TIM,"delay timer started (11*HZ/10).n");
  244. #endif
  245. do
  246. {
  247. i=inb(CDi_status);
  248. datarate++;
  249. #if 1
  250. if (datarate>0x6FFFFFFF) break;
  251. #endif 
  252. }
  253. while (!timed_out_delay);
  254. del_timer(&delay_timer);
  255. #if 0
  256. msg(DBG_TIM,"datarate: %04Xn", datarate);
  257. #endif
  258. if (datarate<65536) datarate=65536;
  259. maxtim16=datarate*16;
  260. maxtim04=datarate*4;
  261. maxtim02=datarate*2;
  262. maxtim_8=datarate/32;
  263. #if LONG_TIMING
  264. maxtim_data=datarate/100;
  265. #else
  266. maxtim_data=datarate/300;
  267. #endif /* LONG_TIMING */ 
  268. #if 0
  269. msg(DBG_TIM,"maxtim_8 %d, maxtim_data %d.n", maxtim_8, maxtim_data);
  270. #endif
  271. }
  272. /*==========================================================================*/
  273. #if 0
  274. static int c2_ReadError(int fam)
  275. {
  276. int i;
  277. clr_cmdbuf();
  278. response_count=9;
  279. clr_respo_buf(9);
  280. if (fam==1)
  281. {
  282. drvcmd[0]=CMD0_READ_ERR; /* same as CMD1_ and CMDL_ */
  283. i=do_cmd(f_putcmd|f_lopsta|f_getsta|f_ResponseStatus);
  284. }
  285. else if (fam==2)
  286. {
  287. drvcmd[0]=CMD2_READ_ERR;
  288. i=do_cmd(f_putcmd);
  289. }
  290. else return (-1);
  291. return (i);
  292. }
  293. #endif
  294. /*==========================================================================*/
  295. static void __init ask_mail(void)
  296. {
  297. int i;
  298. msg(DBG_INF, "please mail the following lines to emoenke@gwdg.den");
  299. msg(DBG_INF, "(don't mail if you are not using the actual kernel):n");
  300. msg(DBG_INF, "%sn", VERSION);
  301. msg(DBG_INF, "address %03X, type %s, drive %s (ID %d)n",
  302.     CDo_command, type, D_S[d].drive_model, D_S[d].drv_id);
  303. for (i=0;i<12;i++)
  304. sprintf(&msgbuf[i*3], " %02X", infobuf[i]);
  305. msgbuf[i*3]=0;
  306. msg(DBG_INF,"infobuf =%sn", msgbuf);
  307. for (i=0;i<12;i++)
  308. sprintf(&msgbuf[i*3], " %c ", infobuf[i]);
  309. msgbuf[i*3]=0;
  310. msg(DBG_INF,"infobuf =%sn", msgbuf);
  311. }
  312. /*==========================================================================*/
  313. static int __init check_version(void)
  314. {
  315. int i, j, l;
  316. int teac_possible=0;
  317. msg(DBG_INI,"check_version: id=%d, d=%d.n", D_S[d].drv_id, d);
  318. D_S[d].drv_type=0;
  319. /* check for CR-52x, CR-56x, LCS-7260 and ECS-AT */
  320. /* clear any pending error state */
  321. clr_cmdbuf();
  322. drvcmd[0]=CMD0_READ_ERR; /* same as CMD1_ and CMDL_ */
  323. response_count=9;
  324. flags_cmd_out=f_putcmd;
  325. i=cmd_out();
  326. if (i<0) msg(DBG_INI,"CMD0_READ_ERR returns %d (ok anyway).n",i);
  327. /* read drive version */
  328. clr_cmdbuf();
  329. for (i=0;i<12;i++) infobuf[i]=0;
  330. drvcmd[0]=CMD0_READ_VER; /* same as CMD1_ and CMDL_ */
  331. response_count=12; /* fam1: only 11 */
  332. flags_cmd_out=f_putcmd;
  333. i=cmd_out();
  334. if (i<-1) msg(DBG_INI,"CMD0_READ_VER returns %dn",i);
  335. if (i==-11) teac_possible++;
  336. j=0;
  337. for (i=0;i<12;i++) j+=infobuf[i];
  338. if (j)
  339. {
  340. for (i=0;i<12;i++)
  341. sprintf(&msgbuf[i*3], " %02X", infobuf[i]);
  342. msgbuf[i*3]=0;
  343. msg(DBG_ECS,"infobuf =%sn", msgbuf);
  344. for (i=0;i<12;i++)
  345. sprintf(&msgbuf[i*3], " %c ", infobuf[i]);
  346. msgbuf[i*3]=0;
  347. msg(DBG_ECS,"infobuf =%sn", msgbuf);
  348. }
  349. for (i=0;i<4;i++) if (infobuf[i]!=family1[i]) break;
  350. if (i==4)
  351. {
  352. D_S[d].drive_model[0]='C';
  353. D_S[d].drive_model[1]='R';
  354. D_S[d].drive_model[2]='-';
  355. D_S[d].drive_model[3]='5';
  356. D_S[d].drive_model[4]=infobuf[i++];
  357. D_S[d].drive_model[5]=infobuf[i++];
  358. D_S[d].drive_model[6]=0;
  359. D_S[d].drv_type=drv_fam1;
  360. }
  361. if (!D_S[d].drv_type)
  362. {
  363. for (i=0;i<8;i++) if (infobuf[i]!=family0[i]) break;
  364. if (i==8)
  365. {
  366. D_S[d].drive_model[0]='C';
  367. D_S[d].drive_model[1]='R';
  368. D_S[d].drive_model[2]='-';
  369. D_S[d].drive_model[3]='5';
  370. D_S[d].drive_model[4]='2';
  371. D_S[d].drive_model[5]='x';
  372. D_S[d].drive_model[6]=0;
  373. D_S[d].drv_type=drv_fam0;
  374. }
  375. }
  376. if (!D_S[d].drv_type)
  377. {
  378. for (i=0;i<8;i++) if (infobuf[i]!=familyL[i]) break;
  379. if (i==8)
  380. {
  381. for (j=0;j<8;j++)
  382. D_S[d].drive_model[j]=infobuf[j];
  383. D_S[d].drive_model[8]=0;
  384. D_S[d].drv_type=drv_famL;
  385. }
  386. }
  387. if (!D_S[d].drv_type)
  388. {
  389. for (i=0;i<6;i++) if (infobuf[i]!=familyV[i]) break;
  390. if (i==6)
  391. {
  392. for (j=0;j<6;j++)
  393. D_S[d].drive_model[j]=infobuf[j];
  394. D_S[d].drive_model[6]=0;
  395. D_S[d].drv_type=drv_famV;
  396. i+=2; /* 2 blanks before version */
  397. }
  398. }
  399. if (!D_S[d].drv_type)
  400. {
  401. /* check for CD200 */
  402. clr_cmdbuf();
  403. drvcmd[0]=CMD2_READ_ERR;
  404. response_count=9;
  405. flags_cmd_out=f_putcmd;
  406. i=cmd_out();
  407. if (i<0) msg(DBG_INI,"CMD2_READERR returns %d (ok anyway).n",i);
  408. if (i<0) msg(DBG_000,"CMD2_READERR returns %d (ok anyway).n",i);
  409. /* read drive version */
  410. clr_cmdbuf();
  411. for (i=0;i<12;i++) infobuf[i]=0;
  412. if (sbpro_type==1) OUT(CDo_sel_i_d,0);
  413. #if 0
  414. OUT(CDo_reset,0);
  415. sbp_sleep(6*HZ);
  416. OUT(CDo_enable,D_S[d].drv_sel);
  417. #endif
  418. drvcmd[0]=CMD2_READ_VER;
  419. response_count=12;
  420. flags_cmd_out=f_putcmd;
  421. i=cmd_out();
  422. if (i<0) msg(DBG_INI,"CMD2_READ_VER returns %dn",i);
  423. if (i==-7) teac_possible++;
  424. j=0;
  425. for (i=0;i<12;i++) j+=infobuf[i];
  426. if (j)
  427. {
  428. for (i=0;i<12;i++)
  429. sprintf(&msgbuf[i*3], " %02X", infobuf[i]);
  430. msgbuf[i*3]=0;
  431. msg(DBG_IDX,"infobuf =%sn", msgbuf);
  432. for (i=0;i<12;i++)
  433. sprintf(&msgbuf[i*3], " %c ", infobuf[i]);
  434. msgbuf[i*3]=0;
  435. msg(DBG_IDX,"infobuf =%sn", msgbuf);
  436. }
  437. if (i>=0)
  438. {
  439. for (i=0;i<5;i++) if (infobuf[i]!=family2[i]) break;
  440. if (i==5)
  441. {
  442. D_S[d].drive_model[0]='C';
  443. D_S[d].drive_model[1]='D';
  444. D_S[d].drive_model[2]='2';
  445. D_S[d].drive_model[3]='0';
  446. D_S[d].drive_model[4]='0';
  447. D_S[d].drive_model[5]=infobuf[i++];
  448. D_S[d].drive_model[6]=infobuf[i++];
  449. D_S[d].drive_model[7]=0;
  450. D_S[d].drv_type=drv_fam2;
  451. }
  452. }
  453. }
  454. if (!D_S[d].drv_type)
  455. {
  456. /* check for TEAC CD-55A */
  457. msg(DBG_TEA,"teac_possible: %dn",teac_possible);
  458. for (j=1;j<=((D_S[d].drv_id==0)?3:1);j++)
  459. {
  460. for (l=1;l<=((D_S[d].drv_id==0)?10:1);l++)
  461. {
  462. msg(DBG_TEA,"TEAC reset #%d-%d.n", j, l);
  463. if (sbpro_type==1) OUT(CDo_reset,0);
  464. else
  465. {
  466. OUT(CDo_enable,D_S[d].drv_sel);
  467. OUT(CDo_sel_i_d,0);
  468. OUT(CDo_command,CMDT_RESET);
  469. for (i=0;i<9;i++) OUT(CDo_command,0);
  470. }
  471. sbp_sleep(5*HZ/10);
  472. OUT(CDo_enable,D_S[d].drv_sel);
  473. OUT(CDo_sel_i_d,0);
  474. i=inb(CDi_status);
  475. msg(DBG_TEA,"TEAC CDi_status: %02X.n",i);
  476. #if 0
  477. if (i&s_not_result_ready) continue; /* drive not present or ready */
  478. #endif
  479. i=inb(CDi_info);
  480. msg(DBG_TEA,"TEAC CDi_info: %02X.n",i);
  481. if (i==0x55) break; /* drive found */
  482. }
  483. if (i==0x55) break; /* drive found */
  484. }
  485. if (i==0x55) /* drive found */
  486. {
  487. msg(DBG_TEA,"TEAC drive found.n");
  488. clr_cmdbuf();
  489. flags_cmd_out=f_putcmd;
  490. response_count=12;
  491. drvcmd[0]=CMDT_READ_VER;
  492. drvcmd[4]=response_count;
  493. for (i=0;i<12;i++) infobuf[i]=0;
  494. i=cmd_out_T();
  495. if (i!=0) msg(DBG_TEA,"cmd_out_T(CMDT_READ_VER) returns %d.n",i);
  496. for (i=1;i<6;i++) if (infobuf[i]!=familyT[i-1]) break;
  497. if (i==6)
  498. {
  499. D_S[d].drive_model[0]='C';
  500. D_S[d].drive_model[1]='D';
  501. D_S[d].drive_model[2]='-';
  502. D_S[d].drive_model[3]='5';
  503. D_S[d].drive_model[4]='5';
  504. D_S[d].drive_model[5]=0;
  505. D_S[d].drv_type=drv_famT;
  506. }
  507. }
  508. }
  509. if (!D_S[d].drv_type)
  510. {
  511. msg(DBG_TEA,"no drive found at address %03X under ID %d.n",CDo_command,D_S[d].drv_id);
  512. return (-522);
  513. }
  514. for (j=0;j<4;j++) D_S[d].firmware_version[j]=infobuf[i+j];
  515. if (famL_drive)
  516. {
  517.   u_char lcs_firm_e1[]="A E1";
  518.   u_char lcs_firm_f4[]="A4F4";
  519.   for (j=0;j<4;j++)
  520.     if (D_S[d].firmware_version[j]!=lcs_firm_e1[j]) break;
  521.   if (j==4) D_S[d].drv_type=drv_e1;
  522.   
  523.   for (j=0;j<4;j++)
  524.     if (D_S[d].firmware_version[j]!=lcs_firm_f4[j]) break;
  525.   if (j==4) D_S[d].drv_type=drv_f4;
  526.   if (D_S[d].drv_type==drv_famL) ask_mail();
  527. }
  528. else if (famT_drive)
  529. {
  530. j=infobuf[4]; /* one-byte version??? - here: 0x15 */
  531. if (j=='5')
  532. {
  533. D_S[d].firmware_version[0]=infobuf[7];
  534. D_S[d].firmware_version[1]=infobuf[8];
  535. D_S[d].firmware_version[2]=infobuf[10];
  536. D_S[d].firmware_version[3]=infobuf[11];
  537. }
  538. else
  539. {
  540. if (j!=0x15) ask_mail();
  541. D_S[d].firmware_version[0]='0';
  542. D_S[d].firmware_version[1]='.';
  543. D_S[d].firmware_version[2]='0'+(j>>4);
  544. D_S[d].firmware_version[3]='0'+(j&0x0f);
  545. }
  546. }
  547. else /* CR-52x, CR-56x, CD200, ECS-AT */
  548. {
  549. j = (D_S[d].firmware_version[0] & 0x0F) * 100 +
  550. (D_S[d].firmware_version[2] & 0x0F) *10 +
  551. (D_S[d].firmware_version[3] & 0x0F);
  552. if (fam0_drive)
  553. {
  554. if (j<200) D_S[d].drv_type=drv_199;
  555. else if (j<201) D_S[d].drv_type=drv_200;
  556. else if (j<210) D_S[d].drv_type=drv_201;
  557. else if (j<211) D_S[d].drv_type=drv_210;
  558. else if (j<300) D_S[d].drv_type=drv_211;
  559. else if (j>=300) D_S[d].drv_type=drv_300;
  560. }
  561. else if (fam1_drive)
  562. {
  563. if (j<100) D_S[d].drv_type=drv_099;
  564. else
  565. {
  566. D_S[d].drv_type=drv_100;
  567. if ((j!=500)&&(j!=102)) ask_mail();
  568. }
  569. }
  570. else if (fam2_drive)
  571. {
  572. if (D_S[d].drive_model[5]=='F')
  573. {
  574. if ((j!=1)&&(j!=35)&&(j!=200)&&(j!=210))
  575.   ask_mail(); /* unknown version at time */
  576. }
  577. else
  578. {
  579. msg(DBG_INF,"this CD200 drive is not fully supported yet - only audio will work.n");
  580. if ((j!=101)&&(j!=35))
  581.   ask_mail(); /* unknown version at time */
  582. }
  583. }
  584. else if (famV_drive)
  585.   {
  586.     if ((j==100)||(j==150)) D_S[d].drv_type=drv_at;
  587.     ask_mail(); /* hopefully we get some feedback by this */
  588.   }
  589. }
  590. msg(DBG_LCS,"drive type %02Xn",D_S[d].drv_type);
  591. msg(DBG_INI,"check_version done.n");
  592. return (0);
  593. }
  594. /*==========================================================================*/
  595. static void switch_drive(int i)
  596. {
  597. d=i;
  598. OUT(CDo_enable,D_S[d].drv_sel);
  599. msg(DBG_DID,"drive %d (ID=%d) activated.n", i, D_S[d].drv_id);
  600. return;
  601. }
  602. /*==========================================================================*/
  603. #ifdef PATH_CHECK
  604. /*
  605.  * probe for the presence of an interface card
  606.  */
  607. static int __init check_card(int port)
  608. {
  609. #undef N_RESPO
  610. #define N_RESPO 20
  611. int i, j, k;
  612. u_char response[N_RESPO];
  613. u_char save_port0;
  614. u_char save_port3;
  615. msg(DBG_INI,"check_card entered.n");
  616. save_port0=inb(port+0);
  617. save_port3=inb(port+3);
  618. for (j=0;j<NR_SBPCD;j++)
  619. {
  620. OUT(port+3,j) ; /* enable drive #j */
  621. OUT(port+0,CMD0_PATH_CHECK);
  622. for (i=10;i>0;i--) OUT(port+0,0);
  623. for (k=0;k<N_RESPO;k++) response[k]=0;
  624. for (k=0;k<N_RESPO;k++)
  625. {
  626. for (i=10000;i>0;i--)
  627. {
  628. if (inb(port+1)&s_not_result_ready) continue;
  629. response[k]=inb(port+0);
  630. break;
  631. }
  632. }
  633. for (i=0;i<N_RESPO;i++)
  634. sprintf(&msgbuf[i*3], " %02X", response[i]);
  635. msgbuf[i*3]=0;
  636. msg(DBG_TEA,"path check 00 (%d): %sn", j, msgbuf);
  637. OUT(port+0,CMD0_PATH_CHECK);
  638. for (i=10;i>0;i--) OUT(port+0,0);
  639. for (k=0;k<N_RESPO;k++) response[k]=0xFF;
  640. for (k=0;k<N_RESPO;k++)
  641. {
  642. for (i=10000;i>0;i--)
  643. {
  644. if (inb(port+1)&s_not_result_ready) continue;
  645. response[k]=inb(port+0);
  646. break;
  647. }
  648. }
  649. for (i=0;i<N_RESPO;i++)
  650. sprintf(&msgbuf[i*3], " %02X", response[i]);
  651. msgbuf[i*3]=0;
  652. msg(DBG_TEA,"path check 00 (%d): %sn", j, msgbuf);
  653. if (response[0]==0xAA)
  654. if (response[1]==0x55)
  655. return (0);
  656. }
  657. for (j=0;j<NR_SBPCD;j++)
  658. {
  659. OUT(port+3,j) ; /* enable drive #j */
  660. OUT(port+0,CMD2_READ_VER);
  661. for (i=10;i>0;i--) OUT(port+0,0);
  662. for (k=0;k<N_RESPO;k++) response[k]=0;
  663. for (k=0;k<N_RESPO;k++)
  664. {
  665. for (i=1000000;i>0;i--)
  666. {
  667. if (inb(port+1)&s_not_result_ready) continue;
  668. response[k]=inb(port+0);
  669. break;
  670. }
  671. }
  672. for (i=0;i<N_RESPO;i++)
  673. sprintf(&msgbuf[i*3], " %02X", response[i]);
  674. msgbuf[i*3]=0;
  675. msg(DBG_TEA,"path check 12 (%d): %sn", j, msgbuf);
  676. OUT(port+0,CMD2_READ_VER);
  677. for (i=10;i>0;i--) OUT(port+0,0);
  678. for (k=0;k<N_RESPO;k++) response[k]=0xFF;
  679. for (k=0;k<N_RESPO;k++)
  680. {
  681. for (i=1000000;i>0;i--)
  682. {
  683. if (inb(port+1)&s_not_result_ready) continue;
  684. response[k]=inb(port+0);
  685. break;
  686. }
  687. }
  688. for (i=0;i<N_RESPO;i++)
  689. sprintf(&msgbuf[i*3], " %02X", response[i]);
  690. msgbuf[i*3]=0;
  691. msg(DBG_TEA,"path check 12 (%d): %sn", j, msgbuf);
  692. if (response[0]==0xAA)
  693. if (response[1]==0x55)
  694. return (0);
  695. }
  696. OUT(port+0,save_port0);
  697. OUT(port+3,save_port3);
  698. return (0); /* in any case - no real "function" at time */
  699. }
  700. #endif /* PATH_CHECK */ 
  701. /*==========================================================================*/
  702. /*==========================================================================*/
  703. /*
  704.  * probe for the presence of drives on the selected controller
  705.  */
  706. static int __init check_drives(void)
  707. {
  708. int i, j;
  709. msg(DBG_INI,"check_drives entered.n");
  710. ndrives=0;
  711. for (j=0;j<max_drives;j++)
  712. {
  713. D_S[ndrives].drv_id=j;
  714. if (sbpro_type==1) D_S[ndrives].drv_sel=(j&0x01)<<1|(j&0x02)>>1;
  715. else D_S[ndrives].drv_sel=j;
  716. switch_drive(ndrives);
  717. msg(DBG_INI,"check_drives: drive %d (ID=%d) activated.n",ndrives,j);
  718. msg(DBG_000,"check_drives: drive %d (ID=%d) activated.n",ndrives,j);
  719. i=check_version();
  720. if (i<0) msg(DBG_INI,"check_version returns %d.n",i);
  721. else
  722. {
  723. D_S[d].drv_options=drv_pattern[j];
  724. if (fam0L_drive) D_S[d].drv_options&=~(speed_auto|speed_300|speed_150);
  725. msg(DBG_INF, "Drive %d (ID=%d): %.9s (%.4s) at 0x%03X (type %d)n",
  726.     d,
  727.     D_S[d].drv_id,
  728.     D_S[d].drive_model,
  729.     D_S[d].firmware_version,
  730.     CDo_command,
  731.     sbpro_type);
  732. ndrives++;
  733. }
  734. }
  735. for (j=ndrives;j<NR_SBPCD;j++) D_S[j].drv_id=-1;
  736. if (ndrives==0) return (-1);
  737. return (0);
  738. }
  739. /*==========================================================================*/
  740. #if FUTURE
  741. /*
  742.  *  obtain if requested service disturbs current audio state
  743.  */            
  744. static int obey_audio_state(u_char audio_state, u_char func,u_char subfunc)
  745. {
  746. switch (audio_state)                   /* audio status from controller  */
  747. {
  748. case aud_11: /* "audio play in progress" */
  749. case audx11:
  750. switch (func)                      /* DOS command code */
  751. {
  752. case cmd_07: /* input flush  */
  753. case cmd_0d: /* open device  */
  754. case cmd_0e: /* close device */
  755. case cmd_0c: /* ioctl output */
  756. return (1);
  757. case cmd_03: /* ioctl input  */
  758. switch (subfunc)
  759. /* DOS ioctl input subfunction */
  760. {
  761. case cxi_00:
  762. case cxi_06:
  763. case cxi_09:
  764. return (1);
  765. default:
  766. return (ERROR15);
  767. }
  768. return (1);
  769. default:
  770. return (ERROR15);
  771. }
  772. return (1);
  773. case aud_12:                  /* "audio play paused"      */
  774. case audx12:
  775. return (1);
  776. default:
  777. return (2);
  778. }
  779. }
  780. /*==========================================================================*/
  781. /* allowed is only
  782.  * ioctl_o, flush_input, open_device, close_device, 
  783.  * tell_address, tell_volume, tell_capabiliti,
  784.  * tell_framesize, tell_CD_changed, tell_audio_posi
  785.  */
  786. static int check_allowed1(u_char func1, u_char func2)
  787. {
  788. #if 000
  789. if (func1==ioctl_o) return (0);
  790. if (func1==read_long) return (-1);
  791. if (func1==read_long_prefetch) return (-1);
  792. if (func1==seek) return (-1);
  793. if (func1==audio_play) return (-1);
  794. if (func1==audio_pause) return (-1);
  795. if (func1==audio_resume) return (-1);
  796. if (func1!=ioctl_i) return (0);
  797. if (func2==tell_SubQ_run_tot) return (-1);
  798. if (func2==tell_cdsize) return (-1);
  799. if (func2==tell_TocDescrip) return (-1);
  800. if (func2==tell_TocEntry) return (-1);
  801. if (func2==tell_subQ_info) return (-1);
  802. if (fam1_drive) if (func2==tell_SubChanInfo) return (-1);
  803. if (func2==tell_UPC) return (-1);
  804. #else
  805. return (0);
  806. #endif
  807. }
  808. /*==========================================================================*/
  809. static int check_allowed2(u_char func1, u_char func2)
  810. {
  811. #if 000
  812. if (func1==read_long) return (-1);
  813. if (func1==read_long_prefetch) return (-1);
  814. if (func1==seek) return (-1);
  815. if (func1==audio_play) return (-1);
  816.   if (func1!=ioctl_o) return (0);
  817. if (fam1_drive)
  818. {
  819. if (func2==EjectDisk) return (-1);
  820. if (func2==CloseTray) return (-1);
  821. }
  822. #else
  823. return (0);
  824. #endif
  825. }
  826. /*==========================================================================*/
  827. static int check_allowed3(u_char func1, u_char func2)
  828. {
  829. #if 000
  830. if (func1==ioctl_i)
  831. {
  832. if (func2==tell_address) return (0);
  833. if (func2==tell_capabiliti) return (0);
  834. if (func2==tell_CD_changed) return (0);
  835. if (fam0L_drive) if (func2==tell_SubChanInfo) return (0);
  836. return (-1);
  837. }
  838. if (func1==ioctl_o)
  839. {
  840. if (func2==DriveReset) return (0);
  841. if (fam0L_drive)
  842. {
  843. if (func2==EjectDisk) return (0);
  844. if (func2==LockDoor) return (0);
  845.   if (func2==CloseTray) return (0);
  846. }
  847. return (-1);
  848.     }
  849. if (func1==flush_input) return (-1);
  850. if (func1==read_long) return (-1);
  851. if (func1==read_long_prefetch) return (-1);
  852. if (func1==seek) return (-1);
  853. if (func1==audio_play) return (-1);
  854. if (func1==audio_pause) return (-1);
  855. if (func1==audio_resume) return (-1);
  856. #else
  857. return (0);
  858. #endif
  859. }
  860. /*==========================================================================*/
  861. static int seek_pos_audio_end(void)
  862. {
  863. int i;
  864. i=msf2blk(D_S[d].pos_audio_end)-1;
  865. if (i<0) return (-1);
  866. i=cc_Seek(i,0);
  867. return (i);
  868. }
  869. #endif /* FUTURE */ 
  870. /*==========================================================================*/
  871. static int ReadToC(void)
  872. {
  873. int i, j;
  874. D_S[d].diskstate_flags &= ~toc_bit;
  875. D_S[d].ored_ctl_adr=0;
  876. /* special handling of CD-I HE */
  877. if ((D_S[d].n_first_track == 2 && D_S[d].n_last_track == 2) ||
  878.              D_S[d].xa_byte == 0x10)
  879.         {
  880. D_S[d].TocBuffer[1].nixbyte=0;
  881. D_S[d].TocBuffer[1].ctl_adr=0x40;
  882. D_S[d].TocBuffer[1].number=1;
  883. D_S[d].TocBuffer[1].format=0;
  884. D_S[d].TocBuffer[1].address=blk2msf(0);
  885. D_S[d].ored_ctl_adr |= 0x40;
  886. D_S[d].n_first_track = 1;
  887. D_S[d].n_last_track = 1;
  888. D_S[d].xa_byte = 0x10;
  889.                 j = 2;
  890.         } else
  891. for (j=D_S[d].n_first_track;j<=D_S[d].n_last_track;j++)
  892. {
  893. i=cc_ReadTocEntry(j);
  894. if (i<0)
  895. {
  896. msg(DBG_INF,"cc_ReadTocEntry(%d) returns %d.n",j,i);
  897. return (i);
  898. }
  899. D_S[d].TocBuffer[j].nixbyte=D_S[d].TocEnt_nixbyte;
  900. D_S[d].TocBuffer[j].ctl_adr=D_S[d].TocEnt_ctl_adr;
  901. D_S[d].TocBuffer[j].number=D_S[d].TocEnt_number;
  902. D_S[d].TocBuffer[j].format=D_S[d].TocEnt_format;
  903. D_S[d].TocBuffer[j].address=D_S[d].TocEnt_address;
  904. D_S[d].ored_ctl_adr |= D_S[d].TocEnt_ctl_adr;
  905. }
  906. /* fake entry for LeadOut Track */
  907. D_S[d].TocBuffer[j].nixbyte=0;
  908. D_S[d].TocBuffer[j].ctl_adr=0;
  909. D_S[d].TocBuffer[j].number=CDROM_LEADOUT;
  910. D_S[d].TocBuffer[j].format=0;
  911. D_S[d].TocBuffer[j].address=D_S[d].size_msf;
  912. D_S[d].diskstate_flags |= toc_bit;
  913. return (0);
  914. }
  915. /*==========================================================================*/
  916. static int DiskInfo(void)
  917. {
  918. int i, j;
  919. D_S[d].mode=READ_M1;
  920. #undef LOOP_COUNT
  921. #define LOOP_COUNT 10 /* needed for some "old" drives */
  922. msg(DBG_000,"DiskInfo entered.n");
  923. for (j=1;j<LOOP_COUNT;j++)
  924. {
  925. #if 0
  926. i=SetSpeed();
  927. if (i<0)
  928. {
  929. msg(DBG_INF,"DiskInfo: SetSpeed returns %dn", i);
  930. continue;
  931. }
  932. i=cc_ModeSense();
  933. if (i<0)
  934. {
  935. msg(DBG_INF,"DiskInfo: cc_ModeSense returns %dn", i);
  936. continue;
  937. }
  938. #endif
  939. i=cc_ReadCapacity();
  940. if (i>=0) break;
  941. msg(DBG_INF,"DiskInfo: ReadCapacity #%d returns %dn", j, i);
  942. #if 0
  943. i=cc_DriveReset();
  944. #endif
  945. if (!fam0_drive && j == 2) break;
  946. }
  947. if (j==LOOP_COUNT) return (-33); /* give up */
  948. i=cc_ReadTocDescr();
  949. if (i<0)
  950. {
  951. msg(DBG_INF,"DiskInfo: ReadTocDescr returns %dn", i);
  952. return (i);
  953. }
  954. i=ReadToC();
  955. if (i<0)
  956. {
  957. msg(DBG_INF,"DiskInfo: ReadToC returns %dn", i);
  958. return (i);
  959. }
  960. i=cc_CheckMultiSession();
  961. if (i<0)
  962. {
  963. msg(DBG_INF,"DiskInfo: cc_CheckMultiSession returns %dn", i);
  964. return (i);
  965. }
  966. if (D_S[d].f_multisession) D_S[d].sbp_bufsiz=1;  /* possibly a weird PhotoCD */
  967. else D_S[d].sbp_bufsiz=buffers;
  968. i=cc_ReadTocEntry(D_S[d].n_first_track);
  969. if (i<0)
  970. {
  971. msg(DBG_INF,"DiskInfo: cc_ReadTocEntry(1) returns %dn", i);
  972. return (i);
  973. }
  974. i=cc_ReadUPC();
  975. if (i<0) msg(DBG_INF,"DiskInfo: cc_ReadUPC returns %dn", i);
  976. if ((fam0L_drive) && (D_S[d].xa_byte==0x20 || D_S[d].xa_byte == 0x10))
  977. {
  978. /* XA disk with old drive */
  979. cc_ModeSelect(CD_FRAMESIZE_RAW1);
  980. cc_ModeSense();
  981. }
  982. if (famT_drive) cc_prep_mode_T();
  983. msg(DBG_000,"DiskInfo done.n");
  984. return (0);
  985. }
  986. static int sbpcd_drive_status(struct cdrom_device_info *cdi, int slot_nr)
  987. {
  988. int st;
  989. if (CDSL_CURRENT != slot_nr) {
  990.  /* we have no changer support */
  991.  return -EINVAL;
  992. }
  993.         cc_ReadStatus();
  994. st=ResponseStatus();
  995. if (st<0)
  996. {
  997. msg(DBG_INF,"sbpcd_drive_status: timeout.n");
  998. return (0);
  999. }
  1000. msg(DBG_000,"Drive Status: door_locked =%d.n", st_door_locked);
  1001. msg(DBG_000,"Drive Status: door_closed =%d.n", st_door_closed);
  1002. msg(DBG_000,"Drive Status: caddy_in =%d.n", st_caddy_in);
  1003. msg(DBG_000,"Drive Status: disk_ok =%d.n", st_diskok);
  1004. msg(DBG_000,"Drive Status: spinning =%d.n", st_spinning);
  1005. msg(DBG_000,"Drive Status: busy =%d.n", st_busy);
  1006. #if 0
  1007.   if (!(D_S[MINOR(cdi->dev)].status_bits & p_door_closed)) return CDS_TRAY_OPEN;
  1008.   if (D_S[MINOR(cdi->dev)].status_bits & p_disk_ok) return CDS_DISC_OK;
  1009.   if (D_S[MINOR(cdi->dev)].status_bits & p_disk_in) return CDS_DRIVE_NOT_READY;
  1010.   return CDS_NO_DISC;
  1011. #else
  1012.   if (D_S[MINOR(cdi->dev)].status_bits & p_spinning) return CDS_DISC_OK;
  1013. /*  return CDS_TRAY_OPEN; */
  1014.   return CDS_NO_DISC;
  1015.   
  1016. #endif
  1017. }
  1018. /*==========================================================================*/
  1019. #if FUTURE
  1020. /*
  1021.  *  called always if driver gets entered
  1022.  *  returns 0 or ERROR2 or ERROR15
  1023.  */
  1024. static int prepare(u_char func, u_char subfunc)
  1025. {
  1026. int i;
  1027. if (fam0L_drive)
  1028. {
  1029. i=inb(CDi_status);
  1030. if (i&s_attention) GetStatus();
  1031. }
  1032. else if (fam1_drive) GetStatus();
  1033. else if (fam2_drive) GetStatus();
  1034. else if (famT_drive) GetStatus();
  1035. if (D_S[d].CD_changed==0xFF)
  1036. {
  1037. D_S[d].diskstate_flags=0;
  1038. D_S[d].audio_state=0;
  1039. if (!st_diskok)
  1040. {
  1041. i=check_allowed1(func,subfunc);
  1042. if (i<0) return (-2);
  1043. }
  1044. else 
  1045. {
  1046. i=check_allowed3(func,subfunc);
  1047. if (i<0)
  1048. {
  1049. D_S[d].CD_changed=1;
  1050. return (-15);
  1051. }
  1052. }
  1053. }
  1054. else
  1055. {
  1056. if (!st_diskok)
  1057. {
  1058. D_S[d].diskstate_flags=0;
  1059. D_S[d].audio_state=0;
  1060. i=check_allowed1(func,subfunc);
  1061. if (i<0) return (-2);
  1062. }
  1063. else
  1064. if (st_busy)
  1065. {
  1066. if (D_S[d].audio_state!=audio_pausing)
  1067. {
  1068. i=check_allowed2(func,subfunc);
  1069. if (i<0) return (-2);
  1070. }
  1071. }
  1072. else
  1073. {
  1074. if (D_S[d].audio_state==audio_playing) seek_pos_audio_end();
  1075. D_S[d].audio_state=0;
  1076. }
  1077. if (!frame_size_valid)
  1078. {
  1079. i=DiskInfo();
  1080. if (i<0)
  1081. {
  1082. D_S[d].diskstate_flags=0;
  1083. D_S[d].audio_state=0;
  1084. i=check_allowed1(func,subfunc);
  1085. if (i<0) return (-2);
  1086. }
  1087. }
  1088. }
  1089.     }
  1090. return (0);
  1091. }
  1092. #endif /* FUTURE */ 
  1093. /*==========================================================================*/
  1094. /*==========================================================================*/
  1095. /*
  1096.  * Check the results of the "get status" command.
  1097.  */
  1098. static int sbp_status(void)
  1099. {
  1100. int st;
  1101. st=ResponseStatus();
  1102. if (st<0)
  1103. {
  1104. msg(DBG_INF,"sbp_status: timeout.n");
  1105. return (0);
  1106. }
  1107. if (!st_spinning) msg(DBG_SPI,"motor got off - ignoring.n");
  1108. if (st_check) 
  1109. {
  1110. msg(DBG_INF,"st_check detected - retrying.n");
  1111. return (0);
  1112. }
  1113. if (!st_door_closed)
  1114. {
  1115. msg(DBG_INF,"door is open - retrying.n");
  1116. return (0);
  1117. }
  1118. if (!st_caddy_in)
  1119. {
  1120. msg(DBG_INF,"disk removed - retrying.n");
  1121. return (0);
  1122. }
  1123. if (!st_diskok) 
  1124. {
  1125. msg(DBG_INF,"!st_diskok detected - retrying.n");
  1126. return (0);
  1127. }
  1128. if (st_busy) 
  1129. {
  1130. msg(DBG_INF,"st_busy detected - retrying.n");
  1131. return (0);
  1132. }
  1133. return (1);
  1134. }
  1135. /*==========================================================================*/
  1136. static int sbpcd_get_last_session(struct cdrom_device_info *cdi, struct cdrom_multisession *ms_infp)
  1137. {
  1138. ms_infp->addr_format = CDROM_LBA;
  1139. ms_infp->addr.lba    = D_S[MINOR(cdi->dev)].lba_multi;
  1140. if (D_S[MINOR(cdi->dev)].f_multisession)
  1141. ms_infp->xa_flag=1; /* valid redirection address */
  1142. else
  1143. ms_infp->xa_flag=0; /* invalid redirection address */
  1144. return  0;
  1145. }
  1146. /*==========================================================================*/
  1147. /*==========================================================================*/
  1148. /*
  1149.  * ioctl support
  1150.  */
  1151. static int sbpcd_dev_ioctl(struct cdrom_device_info *cdi, u_int cmd,
  1152.       u_long arg)
  1153. {
  1154. int i;
  1155. msg(DBG_IO2,"ioctl(%d, 0x%08lX, 0x%08lX)n",
  1156.     MINOR(cdi->dev), cmd, arg);
  1157. i=MINOR(cdi->dev);
  1158. if ((i<0) || (i>=NR_SBPCD) || (D_S[i].drv_id==-1))
  1159. {
  1160. msg(DBG_INF, "ioctl: bad device: %04Xn", cdi->dev);
  1161. return (-ENXIO);             /* no such drive */
  1162. }
  1163. down(&ioctl_read_sem);
  1164. if (d!=i) switch_drive(i);
  1165. msg(DBG_IO2,"ioctl: device %d, request %04Xn",i,cmd);
  1166. switch (cmd)  /* Sun-compatible */
  1167. {
  1168. case DDIOCSDBG: /* DDI Debug */
  1169. if (!capable(CAP_SYS_ADMIN)) RETURN_UP(-EPERM);
  1170. i=sbpcd_dbg_ioctl(arg,1);
  1171. RETURN_UP(i);
  1172. case CDROMRESET:      /* hard reset the drive */
  1173. msg(DBG_IOC,"ioctl: CDROMRESET entered.n");
  1174. i=DriveReset();
  1175. D_S[d].audio_state=0;
  1176. RETURN_UP(i);
  1177. case CDROMREADMODE1:
  1178. msg(DBG_IOC,"ioctl: CDROMREADMODE1 requested.n");
  1179. #if SAFE_MIXED
  1180. if (D_S[d].has_data>1) RETURN_UP(-EBUSY);
  1181. #endif /* SAFE_MIXED */
  1182. cc_ModeSelect(CD_FRAMESIZE);
  1183. cc_ModeSense();
  1184. D_S[d].mode=READ_M1;
  1185. RETURN_UP(0);
  1186. case CDROMREADMODE2: /* not usable at the moment */
  1187. msg(DBG_IOC,"ioctl: CDROMREADMODE2 requested.n");
  1188. #if SAFE_MIXED
  1189. if (D_S[d].has_data>1) RETURN_UP(-EBUSY);
  1190. #endif /* SAFE_MIXED */
  1191. cc_ModeSelect(CD_FRAMESIZE_RAW1);
  1192. cc_ModeSense();
  1193. D_S[d].mode=READ_M2;
  1194. RETURN_UP(0);
  1195. case CDROMAUDIOBUFSIZ: /* configure the audio buffer size */
  1196. msg(DBG_IOC,"ioctl: CDROMAUDIOBUFSIZ entered.n");
  1197. if (D_S[d].sbp_audsiz>0) vfree(D_S[d].aud_buf);
  1198. D_S[d].aud_buf=NULL;
  1199. D_S[d].sbp_audsiz=arg;
  1200. if (D_S[d].sbp_audsiz>16)
  1201. {
  1202. D_S[d].sbp_audsiz = 0;
  1203. RETURN_UP(D_S[d].sbp_audsiz);
  1204. }
  1205. if (D_S[d].sbp_audsiz>0)
  1206. {
  1207. D_S[d].aud_buf=(u_char *) vmalloc(D_S[d].sbp_audsiz*CD_FRAMESIZE_RAW);
  1208. if (D_S[d].aud_buf==NULL)
  1209. {
  1210. msg(DBG_INF,"audio buffer (%d frames) not available.n",D_S[d].sbp_audsiz);
  1211. D_S[d].sbp_audsiz=0;
  1212. }
  1213. else msg(DBG_INF,"audio buffer size: %d frames.n",D_S[d].sbp_audsiz);
  1214. }
  1215. RETURN_UP(D_S[d].sbp_audsiz);
  1216. case CDROMREADAUDIO:
  1217. { /* start of CDROMREADAUDIO */
  1218. int i=0, j=0, frame, block=0;
  1219. u_int try=0;
  1220. u_long timeout;
  1221. u_char *p;
  1222. u_int data_tries = 0;
  1223. u_int data_waits = 0;
  1224. u_int data_retrying = 0;
  1225. int status_tries;
  1226. int error_flag;
  1227. msg(DBG_IOC,"ioctl: CDROMREADAUDIO entered.n");
  1228. if (fam0_drive) RETURN_UP(-EINVAL);
  1229. if (famL_drive) RETURN_UP(-EINVAL);
  1230. if (famV_drive) RETURN_UP(-EINVAL);
  1231. if (famT_drive) RETURN_UP(-EINVAL);
  1232. #if SAFE_MIXED
  1233. if (D_S[d].has_data>1) RETURN_UP(-EBUSY);
  1234. #endif /* SAFE_MIXED */ 
  1235. if (D_S[d].aud_buf==NULL) RETURN_UP(-EINVAL);
  1236. i=verify_area(VERIFY_READ, (void *) arg, sizeof(struct cdrom_read_audio));
  1237. if (i) RETURN_UP(i);
  1238. copy_from_user(&read_audio, (void *) arg, sizeof(struct cdrom_read_audio));
  1239. if (read_audio.nframes < 0 || read_audio.nframes>D_S[d].sbp_audsiz) RETURN_UP(-EINVAL);
  1240. i=verify_area(VERIFY_WRITE, read_audio.buf,
  1241.       read_audio.nframes*CD_FRAMESIZE_RAW);
  1242. if (i) RETURN_UP(i);
  1243. if (read_audio.addr_format==CDROM_MSF) /* MSF-bin specification of where to start */
  1244. block=msf2lba(&read_audio.addr.msf.minute);
  1245. else if (read_audio.addr_format==CDROM_LBA) /* lba specification of where to start */
  1246. block=read_audio.addr.lba;
  1247. else RETURN_UP(-EINVAL);
  1248. #if 000
  1249. i=cc_SetSpeed(speed_150,0,0);
  1250. if (i) msg(DBG_AUD,"read_audio: SetSpeed error %dn", i);
  1251. #endif
  1252. msg(DBG_AUD,"read_audio: lba: %d, msf: %06Xn",
  1253.     block, blk2msf(block));
  1254. msg(DBG_AUD,"read_audio: before cc_ReadStatus.n");
  1255. #if OLD_BUSY
  1256. while (busy_data) sbp_sleep(HZ/10); /* wait a bit */
  1257. busy_audio=1;
  1258. #endif /* OLD_BUSY */ 
  1259. error_flag=0;
  1260. for (data_tries=5; data_tries>0; data_tries--)
  1261. {
  1262. msg(DBG_AUD,"data_tries=%d ...n", data_tries);
  1263. D_S[d].mode=READ_AU;
  1264. cc_ModeSelect(CD_FRAMESIZE_RAW);
  1265. cc_ModeSense();
  1266. for (status_tries=3; status_tries > 0; status_tries--)
  1267. {
  1268. flags_cmd_out |= f_respo3;
  1269. cc_ReadStatus();
  1270. if (sbp_status() != 0) break;
  1271. if (st_check) cc_ReadError();
  1272. sbp_sleep(1);    /* wait a bit, try again */
  1273. }
  1274. if (status_tries == 0)
  1275. {
  1276. msg(DBG_AUD,"read_audio: sbp_status: failed after 3 tries in line %d.n", __LINE__);
  1277. continue;
  1278. }
  1279. msg(DBG_AUD,"read_audio: sbp_status: ok.n");
  1280. flags_cmd_out = f_putcmd | f_respo2 | f_ResponseStatus | f_obey_p_check;
  1281. if (fam0L_drive)
  1282. {
  1283. flags_cmd_out |= f_lopsta | f_getsta | f_bit1;
  1284. cmd_type=READ_M2;
  1285. drvcmd[0]=CMD0_READ_XA; /* "read XA frames", old drives */
  1286. drvcmd[1]=(block>>16)&0x000000ff;
  1287. drvcmd[2]=(block>>8)&0x000000ff;
  1288. drvcmd[3]=block&0x000000ff;
  1289. drvcmd[4]=0;
  1290. drvcmd[5]=read_audio.nframes; /* # of frames */
  1291. drvcmd[6]=0;
  1292. }
  1293. else if (fam1_drive)
  1294. {
  1295. drvcmd[0]=CMD1_READ; /* "read frames", new drives */
  1296. lba2msf(block,&drvcmd[1]); /* msf-bin format required */
  1297. drvcmd[4]=0;
  1298. drvcmd[5]=0;
  1299. drvcmd[6]=read_audio.nframes; /* # of frames */
  1300. }
  1301. else if (fam2_drive)
  1302. {
  1303. drvcmd[0]=CMD2_READ_XA2;
  1304. lba2msf(block,&drvcmd[1]); /* msf-bin format required */
  1305. drvcmd[4]=0;
  1306. drvcmd[5]=read_audio.nframes; /* # of frames */
  1307. drvcmd[6]=0x11; /* raw mode */
  1308. }
  1309. else if (famT_drive) /* CD-55A: not tested yet */
  1310. {
  1311. }
  1312. msg(DBG_AUD,"read_audio: before giving "read" command.n");
  1313. flags_cmd_out=f_putcmd;
  1314. response_count=0;
  1315. i=cmd_out();
  1316. if (i<0) msg(DBG_INF,"error giving READ AUDIO command: %0dn", i);
  1317. sbp_sleep(0);
  1318. msg(DBG_AUD,"read_audio: after giving "read" command.n");
  1319. for (frame=1;frame<2 && !error_flag; frame++)
  1320. {
  1321. try=maxtim_data;
  1322. for (timeout=jiffies+9*HZ; ; )
  1323. {
  1324. for ( ; try!=0;try--)
  1325. {
  1326. j=inb(CDi_status);
  1327. if (!(j&s_not_data_ready)) break;
  1328. if (!(j&s_not_result_ready)) break;
  1329. if (fam0L_drive) if (j&s_attention) break;
  1330. }
  1331. if (try != 0 || time_after_eq(jiffies, timeout)) break;
  1332. if (data_retrying == 0) data_waits++;
  1333. data_retrying = 1;
  1334. sbp_sleep(1);
  1335. try = 1;
  1336. }
  1337. if (try==0)
  1338. {
  1339. msg(DBG_INF,"read_audio: sbp_data: CDi_status timeout.n");
  1340. error_flag++;
  1341. break;
  1342. }
  1343. msg(DBG_AUD,"read_audio: sbp_data: CDi_status ok.n");
  1344. if (j&s_not_data_ready)
  1345. {
  1346. msg(DBG_INF, "read_audio: sbp_data: DATA_READY timeout.n");
  1347. error_flag++;
  1348. break;
  1349. }
  1350. msg(DBG_AUD,"read_audio: before reading data.n");
  1351. error_flag=0;
  1352. p = D_S[d].aud_buf;
  1353. if (sbpro_type==1) OUT(CDo_sel_i_d,1);
  1354. if (do_16bit)
  1355. {
  1356. u_short *p2 = (u_short *) p;
  1357. for (; (u_char *) p2 < D_S[d].aud_buf + read_audio.nframes*CD_FRAMESIZE_RAW;)
  1358.    {
  1359. if ((inb_p(CDi_status)&s_not_data_ready)) continue;
  1360. /* get one sample */
  1361. *p2++ = inw_p(CDi_data);
  1362. *p2++ = inw_p(CDi_data);
  1363. }
  1364. } else {
  1365. for (; p < D_S[d].aud_buf + read_audio.nframes*CD_FRAMESIZE_RAW;)
  1366.    {
  1367. if ((inb_p(CDi_status)&s_not_data_ready)) continue;
  1368. /* get one sample */
  1369. *p++ = inb_p(CDi_data);
  1370. *p++ = inb_p(CDi_data);
  1371. *p++ = inb_p(CDi_data);
  1372. *p++ = inb_p(CDi_data);
  1373. }
  1374. }
  1375. if (sbpro_type==1) OUT(CDo_sel_i_d,0);
  1376. data_retrying = 0;
  1377. }
  1378. msg(DBG_AUD,"read_audio: after reading data.n");
  1379. if (error_flag)    /* must have been spurious D_RDY or (ATTN&&!D_RDY) */
  1380. {
  1381. msg(DBG_AUD,"read_audio: read aborted by driven");
  1382. #if 0000
  1383. i=cc_DriveReset();                /* ugly fix to prevent a hang */
  1384. #else
  1385. i=cc_ReadError();
  1386. #endif
  1387. continue;
  1388. }
  1389. if (fam0L_drive)
  1390. {
  1391. i=maxtim_data;
  1392. for (timeout=jiffies+9*HZ; time_before(jiffies, timeout); timeout--)
  1393. {
  1394. for ( ;i!=0;i--)
  1395. {
  1396. j=inb(CDi_status);
  1397. if (!(j&s_not_data_ready)) break;
  1398. if (!(j&s_not_result_ready)) break;
  1399. if (j&s_attention) break;
  1400. }
  1401. if (i != 0 || time_after_eq(jiffies, timeout)) break;
  1402. sbp_sleep(0);
  1403. i = 1;
  1404. }
  1405. if (i==0) msg(DBG_AUD,"read_audio: STATUS TIMEOUT AFTER READ");
  1406. if (!(j&s_attention))
  1407. {
  1408. msg(DBG_AUD,"read_audio: sbp_data: timeout waiting DRV_ATTN - retryingn");
  1409. i=cc_DriveReset();  /* ugly fix to prevent a hang */
  1410. continue;
  1411. }
  1412. }
  1413. do
  1414. {
  1415. if (fam0L_drive) cc_ReadStatus();
  1416. i=ResponseStatus();  /* builds status_bits, returns orig. status (old) or faked p_success (new) */
  1417. if (i<0) { msg(DBG_AUD,
  1418.        "read_audio: cc_ReadStatus error after read: %02Xn",
  1419.        D_S[d].status_bits);
  1420.    continue; /* FIXME */
  1421.    }
  1422. }
  1423. while ((fam0L_drive)&&(!st_check)&&(!(i&p_success)));
  1424. if (st_check)
  1425. {
  1426. i=cc_ReadError();
  1427. msg(DBG_AUD,"read_audio: cc_ReadError was necessary after read: %02Xn",i);
  1428. continue;
  1429. }
  1430. copy_to_user((u_char *) read_audio.buf,
  1431.     (u_char *) D_S[d].aud_buf,
  1432.     read_audio.nframes*CD_FRAMESIZE_RAW);
  1433. msg(DBG_AUD,"read_audio: copy_to_user done.n");
  1434. break;
  1435. }
  1436. cc_ModeSelect(CD_FRAMESIZE);
  1437. cc_ModeSense();
  1438. D_S[d].mode=READ_M1;
  1439. #if OLD_BUSY
  1440. busy_audio=0;
  1441. #endif /* OLD_BUSY */ 
  1442. if (data_tries == 0)
  1443. {
  1444. msg(DBG_AUD,"read_audio: failed after 5 tries in line %d.n", __LINE__);
  1445. RETURN_UP(-EIO);
  1446. }
  1447. msg(DBG_AUD,"read_audio: successful return.n");
  1448. RETURN_UP(0);
  1449. } /* end of CDROMREADAUDIO */
  1450. case BLKRASET:
  1451. if(!capable(CAP_SYS_ADMIN)) RETURN_UP(-EACCES);
  1452. if(!(cdi->dev)) RETURN_UP(-EINVAL);
  1453. if(arg > 0xff) RETURN_UP(-EINVAL);
  1454. read_ahead[MAJOR(cdi->dev)] = arg;
  1455. RETURN_UP(0);
  1456. default:
  1457. msg(DBG_IOC,"ioctl: unknown function request %04Xn", cmd);
  1458. RETURN_UP(-EINVAL);
  1459. } /* end switch(cmd) */
  1460. }
  1461. static int sbpcd_audio_ioctl(struct cdrom_device_info *cdi, u_int cmd,
  1462.        void * arg)
  1463. {
  1464. int i, st, j;
  1465. msg(DBG_IO2,"ioctl(%d, 0x%08lX, 0x%08p)n",
  1466.     MINOR(cdi->dev), cmd, arg);
  1467. i=MINOR(cdi->dev);
  1468. if ((i<0) || (i>=NR_SBPCD) || (D_S[i].drv_id==-1))
  1469. {
  1470. msg(DBG_INF, "ioctl: bad device: %04Xn", cdi->dev);
  1471. return (-ENXIO);             /* no such drive */
  1472. }
  1473. down(&ioctl_read_sem);
  1474. if (d!=i) switch_drive(i);
  1475. msg(DBG_IO2,"ioctl: device %d, request %04Xn",i,cmd);
  1476. switch (cmd)  /* Sun-compatible */
  1477. {
  1478. case CDROMPAUSE:     /* Pause the drive */
  1479. msg(DBG_IOC,"ioctl: CDROMPAUSE entered.n");
  1480. /* pause the drive unit when it is currently in PLAY mode,         */
  1481. /* or reset the starting and ending locations when in PAUSED mode. */
  1482. /* If applicable, at the next stopping point it reaches            */
  1483. /* the drive will discontinue playing.                             */
  1484. switch (D_S[d].audio_state)
  1485. {
  1486. case audio_playing:
  1487. if (famL_drive) i=cc_ReadSubQ();
  1488. else i=cc_Pause_Resume(1);
  1489. if (i<0) RETURN_UP(-EIO);
  1490. if (famL_drive) i=cc_Pause_Resume(1);
  1491. else i=cc_ReadSubQ();
  1492. if (i<0) RETURN_UP(-EIO);
  1493. D_S[d].pos_audio_start=D_S[d].SubQ_run_tot;
  1494. D_S[d].audio_state=audio_pausing;
  1495. RETURN_UP(0);
  1496. case audio_pausing:
  1497. i=cc_Seek(D_S[d].pos_audio_start,1);
  1498. if (i<0) RETURN_UP(-EIO);
  1499. RETURN_UP(0);
  1500. default:
  1501. RETURN_UP(-EINVAL);
  1502. }
  1503. case CDROMRESUME: /* resume paused audio play */
  1504. msg(DBG_IOC,"ioctl: CDROMRESUME entered.n");
  1505. /* resume playing audio tracks when a previous PLAY AUDIO call has  */
  1506. /* been paused with a PAUSE command.                                */
  1507. /* It will resume playing from the location saved in SubQ_run_tot.  */
  1508. if (D_S[d].audio_state!=audio_pausing) RETURN_UP(-EINVAL);
  1509. if (famL_drive)
  1510. i=cc_PlayAudio(D_S[d].pos_audio_start,
  1511.        D_S[d].pos_audio_end);
  1512. else i=cc_Pause_Resume(3);
  1513. if (i<0) RETURN_UP(-EIO);
  1514. D_S[d].audio_state=audio_playing;
  1515. RETURN_UP(0);
  1516. case CDROMPLAYMSF:
  1517. msg(DBG_IOC,"ioctl: CDROMPLAYMSF entered.n");
  1518. #if SAFE_MIXED
  1519. if (D_S[d].has_data>1) RETURN_UP(-EBUSY);
  1520. #endif /* SAFE_MIXED */ 
  1521. if (D_S[d].audio_state==audio_playing)
  1522. {
  1523. i=cc_Pause_Resume(1);
  1524. if (i<0) RETURN_UP(-EIO);
  1525. i=cc_ReadSubQ();
  1526. if (i<0) RETURN_UP(-EIO);
  1527. D_S[d].pos_audio_start=D_S[d].SubQ_run_tot;
  1528. i=cc_Seek(D_S[d].pos_audio_start,1);
  1529. }
  1530. memcpy(&msf, (void *) arg, sizeof(struct cdrom_msf));
  1531. /* values come as msf-bin */
  1532. D_S[d].pos_audio_start = (msf.cdmsf_min0<<16) |
  1533.                         (msf.cdmsf_sec0<<8) |
  1534. msf.cdmsf_frame0;
  1535. D_S[d].pos_audio_end = (msf.cdmsf_min1<<16) |
  1536. (msf.cdmsf_sec1<<8) |
  1537. msf.cdmsf_frame1;
  1538. msg(DBG_IOX,"ioctl: CDROMPLAYMSF %08X %08Xn",
  1539.     D_S[d].pos_audio_start,D_S[d].pos_audio_end);
  1540. i=cc_PlayAudio(D_S[d].pos_audio_start,D_S[d].pos_audio_end);
  1541. if (i<0)
  1542. {
  1543. msg(DBG_INF,"ioctl: cc_PlayAudio returns %dn",i);
  1544. DriveReset();
  1545. D_S[d].audio_state=0;
  1546. RETURN_UP(-EIO);
  1547. }
  1548. D_S[d].audio_state=audio_playing;
  1549. RETURN_UP(0);
  1550. case CDROMPLAYTRKIND: /* Play a track.  This currently ignores index. */
  1551. msg(DBG_IOC,"ioctl: CDROMPLAYTRKIND entered.n");
  1552. #if SAFE_MIXED
  1553. if (D_S[d].has_data>1) RETURN_UP(-EBUSY);
  1554. #endif /* SAFE_MIXED */ 
  1555. if (D_S[d].audio_state==audio_playing)
  1556. {
  1557. msg(DBG_IOX,"CDROMPLAYTRKIND: already audio_playing.n");
  1558. #if 1
  1559. RETURN_UP(0); /* just let us play on */
  1560. #else
  1561. RETURN_UP(-EINVAL); /* play on, but say "error" */
  1562. #endif
  1563. }
  1564. memcpy(&ti,(void *) arg,sizeof(struct cdrom_ti));
  1565. msg(DBG_IOX,"ioctl: trk0: %d, ind0: %d, trk1:%d, ind1:%dn",
  1566.     ti.cdti_trk0,ti.cdti_ind0,ti.cdti_trk1,ti.cdti_ind1);
  1567. if (ti.cdti_trk0<D_S[d].n_first_track) RETURN_UP(-EINVAL);
  1568. if (ti.cdti_trk0>D_S[d].n_last_track) RETURN_UP(-EINVAL);
  1569. if (ti.cdti_trk1<ti.cdti_trk0) ti.cdti_trk1=ti.cdti_trk0;
  1570. if (ti.cdti_trk1>D_S[d].n_last_track) ti.cdti_trk1=D_S[d].n_last_track;
  1571. D_S[d].pos_audio_start=D_S[d].TocBuffer[ti.cdti_trk0].address;
  1572. D_S[d].pos_audio_end=D_S[d].TocBuffer[ti.cdti_trk1+1].address;
  1573. i=cc_PlayAudio(D_S[d].pos_audio_start,D_S[d].pos_audio_end);
  1574. if (i<0)
  1575. {
  1576. msg(DBG_INF,"ioctl: cc_PlayAudio returns %dn",i);
  1577. DriveReset();
  1578. D_S[d].audio_state=0;
  1579. RETURN_UP(-EIO);
  1580. }
  1581. D_S[d].audio_state=audio_playing;
  1582. RETURN_UP(0);
  1583. case CDROMREADTOCHDR:        /* Read the table of contents header */
  1584. msg(DBG_IOC,"ioctl: CDROMREADTOCHDR entered.n");
  1585. tochdr.cdth_trk0=D_S[d].n_first_track;
  1586. tochdr.cdth_trk1=D_S[d].n_last_track;
  1587. memcpy((void *) arg, &tochdr, sizeof(struct cdrom_tochdr));
  1588. RETURN_UP(0);
  1589. case CDROMREADTOCENTRY:      /* Read an entry in the table of contents */
  1590. msg(DBG_IOC,"ioctl: CDROMREADTOCENTRY entered.n");
  1591. memcpy(&tocentry, (void *) arg, sizeof(struct cdrom_tocentry));
  1592. i=tocentry.cdte_track;
  1593. if (i==CDROM_LEADOUT) i=D_S[d].n_last_track+1;
  1594. else if (i<D_S[d].n_first_track||i>D_S[d].n_last_track)
  1595.                   RETURN_UP(-EINVAL);
  1596. tocentry.cdte_adr=D_S[d].TocBuffer[i].ctl_adr&0x0F;
  1597. tocentry.cdte_ctrl=(D_S[d].TocBuffer[i].ctl_adr>>4)&0x0F;
  1598. tocentry.cdte_datamode=D_S[d].TocBuffer[i].format;
  1599. if (tocentry.cdte_format==CDROM_MSF) /* MSF-bin required */
  1600. {
  1601. tocentry.cdte_addr.msf.minute=(D_S[d].TocBuffer[i].address>>16)&0x00FF;
  1602. tocentry.cdte_addr.msf.second=(D_S[d].TocBuffer[i].address>>8)&0x00FF;
  1603. tocentry.cdte_addr.msf.frame=D_S[d].TocBuffer[i].address&0x00FF;
  1604. }
  1605. else if (tocentry.cdte_format==CDROM_LBA) /* blk required */
  1606. tocentry.cdte_addr.lba=msf2blk(D_S[d].TocBuffer[i].address);
  1607. else RETURN_UP(-EINVAL);
  1608. memcpy((void *) arg, &tocentry, sizeof(struct cdrom_tocentry));
  1609. RETURN_UP(0);
  1610. case CDROMSTOP:      /* Spin down the drive */
  1611. msg(DBG_IOC,"ioctl: CDROMSTOP entered.n");
  1612. #if SAFE_MIXED
  1613. if (D_S[d].has_data>1) RETURN_UP(-EBUSY);
  1614. #endif /* SAFE_MIXED */ 
  1615. i=cc_Pause_Resume(1);
  1616. D_S[d].audio_state=0;
  1617. #if 0
  1618. cc_DriveReset();
  1619. #endif
  1620. RETURN_UP(i);
  1621. case CDROMSTART:  /* Spin up the drive */
  1622. msg(DBG_IOC,"ioctl: CDROMSTART entered.n");
  1623. cc_SpinUp();
  1624. D_S[d].audio_state=0;
  1625. RETURN_UP(0);
  1626. case CDROMVOLCTRL:   /* Volume control */
  1627. msg(DBG_IOC,"ioctl: CDROMVOLCTRL entered.n");
  1628. memcpy(&volctrl,(char *) arg,sizeof(volctrl));
  1629. D_S[d].vol_chan0=0;
  1630. D_S[d].vol_ctrl0=volctrl.channel0;
  1631. D_S[d].vol_chan1=1;
  1632. D_S[d].vol_ctrl1=volctrl.channel1;
  1633. i=cc_SetVolume();
  1634. RETURN_UP(0);
  1635. case CDROMVOLREAD:   /* read Volume settings from drive */
  1636. msg(DBG_IOC,"ioctl: CDROMVOLREAD entered.n");
  1637. st=cc_GetVolume();
  1638. if (st<0) RETURN_UP(st);
  1639. volctrl.channel0=D_S[d].vol_ctrl0;
  1640. volctrl.channel1=D_S[d].vol_ctrl1;
  1641. volctrl.channel2=0;
  1642. volctrl.channel2=0;
  1643. memcpy((void *)arg,&volctrl,sizeof(volctrl));
  1644. RETURN_UP(0);
  1645. case CDROMSUBCHNL:   /* Get subchannel info */
  1646. msg(DBG_IOS,"ioctl: CDROMSUBCHNL entered.n");
  1647. /* Bogus, I can do better than this! --AJK
  1648. if ((st_spinning)||(!subq_valid)) {
  1649. i=cc_ReadSubQ();
  1650. if (i<0) RETURN_UP(-EIO);
  1651. }
  1652. */
  1653. i=cc_ReadSubQ();
  1654. if (i<0) {
  1655. j=cc_ReadError(); /* clear out error status from drive */
  1656. D_S[d].audio_state=CDROM_AUDIO_NO_STATUS;
  1657. /* get and set the disk state here, 
  1658. probably not the right place, but who cares!
  1659. It makes it work properly! --AJK */
  1660. if (D_S[d].CD_changed==0xFF) {
  1661. msg(DBG_000,"Disk changed detectn");
  1662. D_S[d].diskstate_flags &= ~cd_size_bit;
  1663. }
  1664. RETURN_UP(-EIO);
  1665. }
  1666. if (D_S[d].CD_changed==0xFF) {
  1667. /* reread the TOC because the disk has changed! --AJK */
  1668. msg(DBG_000,"Disk changed STILL detected, rereading TOC!n");
  1669. i=DiskInfo();
  1670. if(i==0) {
  1671. D_S[d].CD_changed=0x00; /* cd has changed, procede, */
  1672. RETURN_UP(-EIO); /* and get TOC, etc on next try! --AJK */
  1673. } else {
  1674. RETURN_UP(-EIO); /* we weren't ready yet! --AJK */
  1675. }
  1676. }
  1677. memcpy(&SC, (void *) arg, sizeof(struct cdrom_subchnl));
  1678. /* 
  1679. This virtual crap is very bogus! 
  1680. It doesn't detect when the cd is done playing audio!
  1681. Lets do this right with proper hardware register reading!
  1682. */
  1683. cc_ReadStatus();
  1684. i=ResponseStatus();
  1685. msg(DBG_000,"Drive Status: door_locked =%d.n", st_door_locked);
  1686. msg(DBG_000,"Drive Status: door_closed =%d.n", st_door_closed);
  1687. msg(DBG_000,"Drive Status: caddy_in =%d.n", st_caddy_in);
  1688. msg(DBG_000,"Drive Status: disk_ok =%d.n", st_diskok);
  1689. msg(DBG_000,"Drive Status: spinning =%d.n", st_spinning);
  1690. msg(DBG_000,"Drive Status: busy =%d.n", st_busy);
  1691. /* st_busy indicates if it's _ACTUALLY_ playing audio */
  1692. switch (D_S[d].audio_state)
  1693. {
  1694. case audio_playing:
  1695. if(st_busy==0) {
  1696. /* CD has stopped playing audio --AJK */
  1697. D_S[d].audio_state=audio_completed;
  1698. SC.cdsc_audiostatus=CDROM_AUDIO_COMPLETED;
  1699. } else {
  1700. SC.cdsc_audiostatus=CDROM_AUDIO_PLAY;
  1701. }
  1702. break;
  1703. case audio_pausing:
  1704. SC.cdsc_audiostatus=CDROM_AUDIO_PAUSED;
  1705. break;
  1706. case audio_completed:
  1707. SC.cdsc_audiostatus=CDROM_AUDIO_COMPLETED;
  1708. break;
  1709. default:
  1710. SC.cdsc_audiostatus=CDROM_AUDIO_NO_STATUS;
  1711. break;
  1712. }
  1713. SC.cdsc_adr=D_S[d].SubQ_ctl_adr;
  1714. SC.cdsc_ctrl=D_S[d].SubQ_ctl_adr>>4;
  1715. SC.cdsc_trk=bcd2bin(D_S[d].SubQ_trk);
  1716. SC.cdsc_ind=bcd2bin(D_S[d].SubQ_pnt_idx);
  1717. if (SC.cdsc_format==CDROM_LBA)
  1718. {
  1719. SC.cdsc_absaddr.lba=msf2blk(D_S[d].SubQ_run_tot);
  1720. SC.cdsc_reladdr.lba=msf2blk(D_S[d].SubQ_run_trk);
  1721. }
  1722. else /* not only if (SC.cdsc_format==CDROM_MSF) */
  1723. {
  1724. SC.cdsc_absaddr.msf.minute=(D_S[d].SubQ_run_tot>>16)&0x00FF;
  1725. SC.cdsc_absaddr.msf.second=(D_S[d].SubQ_run_tot>>8)&0x00FF;
  1726. SC.cdsc_absaddr.msf.frame=D_S[d].SubQ_run_tot&0x00FF;
  1727. SC.cdsc_reladdr.msf.minute=(D_S[d].SubQ_run_trk>>16)&0x00FF;
  1728. SC.cdsc_reladdr.msf.second=(D_S[d].SubQ_run_trk>>8)&0x00FF;
  1729. SC.cdsc_reladdr.msf.frame=D_S[d].SubQ_run_trk&0x00FF;
  1730. }
  1731. memcpy((void *) arg, &SC, sizeof(struct cdrom_subchnl));
  1732. msg(DBG_IOS,"CDROMSUBCHNL: %1X %02X %08X %08X %02X %02X %06X %06Xn",
  1733.     SC.cdsc_format,SC.cdsc_audiostatus,
  1734.     SC.cdsc_adr,SC.cdsc_ctrl,
  1735.     SC.cdsc_trk,SC.cdsc_ind,
  1736.     SC.cdsc_absaddr,SC.cdsc_reladdr);
  1737. RETURN_UP(0);
  1738. default:
  1739. msg(DBG_IOC,"ioctl: unknown function request %04Xn", cmd);
  1740. RETURN_UP(-EINVAL);
  1741. } /* end switch(cmd) */
  1742. }
  1743. /*==========================================================================*/
  1744. /*
  1745.  *  Take care of the different block sizes between cdrom and Linux.
  1746.  */
  1747. static void sbp_transfer(struct request *req)
  1748. {
  1749. long offs;
  1750. while ( (req->nr_sectors > 0) &&
  1751.        (req->sector/4 >= D_S[d].sbp_first_frame) &&
  1752.        (req->sector/4 <= D_S[d].sbp_last_frame) )
  1753. {
  1754. offs = (req->sector - D_S[d].sbp_first_frame * 4) * 512;
  1755. memcpy(req->buffer, D_S[d].sbp_buf + offs, 512);
  1756. req->nr_sectors--;
  1757. req->sector++;
  1758. req->buffer += 512;
  1759. }
  1760. }
  1761. /*==========================================================================*/
  1762. /*
  1763.  *  special end_request for sbpcd to solve CURRENT==NULL bug. (GTL)
  1764.  *  GTL = Gonzalo Tornaria <tornaria@cmat.edu.uy>
  1765.  *
  1766.  *  This is a kludge so we don't need to modify end_request.
  1767.  *  We put the req we take out after INIT_REQUEST in the requests list,
  1768.  *  so that end_request will discard it. 
  1769.  *
  1770.  *  The bug could be present in other block devices, perhaps we
  1771.  *  should modify INIT_REQUEST and end_request instead, and
  1772.  *  change every block device.. 
  1773.  *
  1774.  *  Could be a race here?? Could e.g. a timer interrupt schedule() us?
  1775.  *  If so, we should copy end_request here, and do it right.. (or
  1776.  *  modify end_request and the block devices).
  1777.  *
  1778.  *  In any case, the race here would be much small than it was, and
  1779.  *  I couldn't reproduce..
  1780.  *
  1781.  *  The race could be: suppose CURRENT==NULL. We put our req in the list,
  1782.  *  and we are scheduled. Other process takes over, and gets into
  1783.  *  do_sbpcd_request. It sees CURRENT!=NULL (it is == to our req), so
  1784.  *  proceeds. It ends, so CURRENT is now NULL.. Now we awake somewhere in
  1785.  *  end_request, but now CURRENT==NULL... oops!
  1786.  *
  1787.  */
  1788. #undef DEBUG_GTL
  1789. static inline void sbpcd_end_request(struct request *req, int uptodate) {
  1790. list_add(&req->queue, &req->q->queue_head);
  1791. end_request(uptodate);
  1792. }
  1793. /*==========================================================================*/
  1794. /*
  1795.  *  I/O request routine, called from Linux kernel.
  1796.  */
  1797. static void DO_SBPCD_REQUEST(request_queue_t * q)
  1798. {
  1799. u_int block;
  1800. u_int nsect;
  1801. int i, status_tries, data_tries;
  1802. struct request *req;
  1803. #ifdef DEBUG_GTL
  1804. static int xx_nr=0;
  1805. int xnr;
  1806. #endif
  1807.  request_loop:
  1808. #ifdef DEBUG_GTL
  1809. xnr=++xx_nr;
  1810. if(QUEUE_EMPTY)
  1811. {
  1812. printk( "do_sbpcd_request[%di](NULL), Pid:%d, Time:%lin",
  1813. xnr, current->pid, jiffies);
  1814. printk( "do_sbpcd_request[%do](NULL) end 0 (null), Time:%lin",
  1815. xnr, jiffies);
  1816. CLEAR_INTR;
  1817. return;
  1818. }
  1819. printk(" do_sbpcd_request[%di](%p:%ld+%ld), Pid:%d, Time:%lin",
  1820. xnr, CURRENT, CURRENT->sector, CURRENT->nr_sectors, current->pid, jiffies);
  1821. #endif
  1822. INIT_REQUEST;
  1823. req=CURRENT; /* take out our request so no other */
  1824. blkdev_dequeue_request(req); /* task can fuck it up         GTL  */
  1825. if (req->rq_status == RQ_INACTIVE)
  1826. sbpcd_end_request(req, 0);
  1827. if (req -> sector == -1)
  1828. sbpcd_end_request(req, 0);
  1829. spin_unlock_irq(&io_request_lock);
  1830. down(&ioctl_read_sem);
  1831. if (req->cmd != READ)
  1832. {
  1833. msg(DBG_INF, "bad cmd %dn", req->cmd);
  1834. goto err_done;
  1835. }
  1836. i = MINOR(req->rq_dev);
  1837. if ( (i<0) || (i>=NR_SBPCD) || (D_S[i].drv_id==-1))
  1838. {
  1839. msg(DBG_INF, "do_request: bad device: %sn",
  1840. kdevname(req->rq_dev));
  1841. goto err_done;
  1842. }
  1843. #if OLD_BUSY
  1844. while (busy_audio) sbp_sleep(HZ); /* wait a bit */
  1845. busy_data=1;
  1846. #endif /* OLD_BUSY */
  1847. if (D_S[i].audio_state==audio_playing) goto err_done;
  1848. if (d!=i) switch_drive(i);
  1849. block = req->sector; /* always numbered as 512-byte-pieces */
  1850. nsect = req->nr_sectors; /* always counted as 512-byte-pieces */
  1851. msg(DBG_BSZ,"read sector %d (%d sectors)n", block, nsect);
  1852. #if 0
  1853. msg(DBG_MUL,"read LBA %dn", block/4);
  1854. #endif
  1855. sbp_transfer(req);
  1856. /* if we satisfied the request from the buffer, we're done. */
  1857. if (req->nr_sectors == 0)
  1858. {
  1859. #ifdef DEBUG_GTL
  1860. printk(" do_sbpcd_request[%do](%p:%ld+%ld) end 2, Time:%lin",
  1861. xnr, req, req->sector, req->nr_sectors, jiffies);
  1862. #endif
  1863. up(&ioctl_read_sem);
  1864. spin_lock_irq(&io_request_lock);
  1865. sbpcd_end_request(req, 1);
  1866. goto request_loop;
  1867. }
  1868. #if FUTURE
  1869. i=prepare(0,0); /* at moment not really a hassle check, but ... */
  1870. if (i!=0)
  1871. msg(DBG_INF,""prepare" tells error %d -- ignoredn", i);
  1872. #endif /* FUTURE */ 
  1873. if (!st_spinning) cc_SpinUp();
  1874. for (data_tries=n_retries; data_tries > 0; data_tries--)
  1875. {
  1876. for (status_tries=3; status_tries > 0; status_tries--)
  1877. {
  1878. flags_cmd_out |= f_respo3;
  1879. cc_ReadStatus();
  1880. if (sbp_status() != 0) break;
  1881. if (st_check) cc_ReadError();
  1882. sbp_sleep(1);    /* wait a bit, try again */
  1883. }
  1884. if (status_tries == 0)
  1885. {
  1886. msg(DBG_INF,"sbp_status: failed after 3 tries in line %dn", __LINE__);
  1887. break;
  1888. }
  1889. sbp_read_cmd(req);
  1890. sbp_sleep(0);
  1891. if (sbp_data(req) != 0)
  1892. {
  1893. #if SAFE_MIXED
  1894. D_S[d].has_data=2; /* is really a data disk */
  1895. #endif /* SAFE_MIXED */ 
  1896. #ifdef DEBUG_GTL
  1897. printk(" do_sbpcd_request[%do](%p:%ld+%ld) end 3, Time:%lin",
  1898. xnr, req, req->sector, req->nr_sectors, jiffies);
  1899. #endif
  1900. up(&ioctl_read_sem);
  1901. spin_lock_irq(&io_request_lock);
  1902. sbpcd_end_request(req, 1);
  1903. goto request_loop;
  1904. }
  1905. }
  1906.  err_done:
  1907. #if OLD_BUSY
  1908. busy_data=0;
  1909. #endif /* OLD_BUSY */
  1910. #ifdef DEBUG_GTL
  1911. printk(" do_sbpcd_request[%do](%p:%ld+%ld) end 4 (error), Time:%lin",
  1912. xnr, req, req->sector, req->nr_sectors, jiffies);
  1913. #endif
  1914. up(&ioctl_read_sem);
  1915. sbp_sleep(0);    /* wait a bit, try again */
  1916. spin_lock_irq(&io_request_lock);
  1917. sbpcd_end_request(req, 0);
  1918. goto request_loop;
  1919. }
  1920. /*==========================================================================*/
  1921. /*
  1922.  *  build and send the READ command.
  1923.  */
  1924. static void sbp_read_cmd(struct request *req)
  1925. {
  1926. #undef OLD
  1927. int i;
  1928. int block;
  1929. D_S[d].sbp_first_frame=D_S[d].sbp_last_frame=-1;      /* purge buffer */
  1930. D_S[d].sbp_current = 0;
  1931. block=req->sector/4;
  1932. if (block+D_S[d].sbp_bufsiz <= D_S[d].CDsize_frm)
  1933. D_S[d].sbp_read_frames = D_S[d].sbp_bufsiz;
  1934. else
  1935. {
  1936. D_S[d].sbp_read_frames=D_S[d].CDsize_frm-block;
  1937. /* avoid reading past end of data */
  1938. if (D_S[d].sbp_read_frames < 1)
  1939. {
  1940. msg(DBG_INF,"requested frame %d, CD size %d ???n",
  1941.     block, D_S[d].CDsize_frm);
  1942. D_S[d].sbp_read_frames=1;
  1943. }
  1944. }
  1945. flags_cmd_out = f_putcmd | f_respo2 | f_ResponseStatus | f_obey_p_check;
  1946. clr_cmdbuf();
  1947. if (famV_drive)
  1948.   {
  1949.     drvcmd[0]=CMDV_READ;
  1950.     lba2msf(block,&drvcmd[1]); /* msf-bcd format required */
  1951.     bin2bcdx(&drvcmd[1]);
  1952.     bin2bcdx(&drvcmd[2]);
  1953.     bin2bcdx(&drvcmd[3]);
  1954.     drvcmd[4]=D_S[d].sbp_read_frames>>8;
  1955.     drvcmd[5]=D_S[d].sbp_read_frames&0xff;
  1956.     drvcmd[6]=0x02; /* flag "msf-bcd" */
  1957. }
  1958. else if (fam0L_drive)
  1959. {
  1960. flags_cmd_out |= f_lopsta | f_getsta | f_bit1;
  1961. if (D_S[d].xa_byte==0x20)
  1962. {
  1963. cmd_type=READ_M2;
  1964. drvcmd[0]=CMD0_READ_XA; /* "read XA frames", old drives */
  1965. drvcmd[1]=(block>>16)&0x0ff;
  1966. drvcmd[2]=(block>>8)&0x0ff;
  1967. drvcmd[3]=block&0x0ff;
  1968. drvcmd[4]=(D_S[d].sbp_read_frames>>8)&0x0ff;
  1969. drvcmd[5]=D_S[d].sbp_read_frames&0x0ff;
  1970. }
  1971. else
  1972. {
  1973. drvcmd[0]=CMD0_READ; /* "read frames", old drives */
  1974. if (D_S[d].drv_type>=drv_201)
  1975. {
  1976. lba2msf(block,&drvcmd[1]); /* msf-bcd format required */
  1977. bin2bcdx(&drvcmd[1]);
  1978. bin2bcdx(&drvcmd[2]);
  1979. bin2bcdx(&drvcmd[3]);
  1980. }
  1981. else
  1982. {
  1983. drvcmd[1]=(block>>16)&0x0ff;
  1984. drvcmd[2]=(block>>8)&0x0ff;
  1985. drvcmd[3]=block&0x0ff;
  1986. }
  1987. drvcmd[4]=(D_S[d].sbp_read_frames>>8)&0x0ff;
  1988. drvcmd[5]=D_S[d].sbp_read_frames&0x0ff;
  1989. drvcmd[6]=(D_S[d].drv_type<drv_201)?0:2; /* flag "lba or msf-bcd format" */
  1990. }
  1991. }
  1992. else if (fam1_drive)
  1993. {
  1994. drvcmd[0]=CMD1_READ;
  1995. lba2msf(block,&drvcmd[1]); /* msf-bin format required */
  1996. drvcmd[5]=(D_S[d].sbp_read_frames>>8)&0x0ff;
  1997. drvcmd[6]=D_S[d].sbp_read_frames&0x0ff;
  1998. }
  1999. else if (fam2_drive)
  2000. {
  2001. drvcmd[0]=CMD2_READ;
  2002. lba2msf(block,&drvcmd[1]); /* msf-bin format required */
  2003. drvcmd[4]=(D_S[d].sbp_read_frames>>8)&0x0ff;
  2004. drvcmd[5]=D_S[d].sbp_read_frames&0x0ff;
  2005. drvcmd[6]=0x02;
  2006. }
  2007. else if (famT_drive)
  2008. {
  2009. drvcmd[0]=CMDT_READ;
  2010. drvcmd[2]=(block>>24)&0x0ff;
  2011. drvcmd[3]=(block>>16)&0x0ff;
  2012. drvcmd[4]=(block>>8)&0x0ff;
  2013. drvcmd[5]=block&0x0ff;
  2014. drvcmd[7]=(D_S[d].sbp_read_frames>>8)&0x0ff;
  2015. drvcmd[8]=D_S[d].sbp_read_frames&0x0ff;
  2016. }
  2017. flags_cmd_out=f_putcmd;
  2018. response_count=0;
  2019. i=cmd_out();
  2020. if (i<0) msg(DBG_INF,"error giving READ command: %0dn", i);
  2021. return;
  2022. }
  2023. /*==========================================================================*/
  2024. /*
  2025.  *  Check the completion of the read-data command.  On success, read
  2026.  *  the D_S[d].sbp_bufsiz * 2048 bytes of data from the disk into buffer.
  2027.  */
  2028. static int sbp_data(struct request *req)
  2029. {
  2030. int i=0, j=0, l, frame;
  2031. u_int try=0;
  2032. u_long timeout;
  2033. u_char *p;
  2034. u_int data_tries = 0;
  2035. u_int data_waits = 0;
  2036. u_int data_retrying = 0;
  2037. int error_flag;
  2038. int xa_count;
  2039. int max_latency;
  2040. int success;
  2041. int wait;
  2042. int duration;
  2043. error_flag=0;
  2044. success=0;
  2045. #if LONG_TIMING
  2046. max_latency=9*HZ;
  2047. #else
  2048. if (D_S[d].f_multisession) max_latency=15*HZ;
  2049. else max_latency=5*HZ;
  2050. #endif
  2051. duration=jiffies;
  2052. for (frame=0;frame<D_S[d].sbp_read_frames&&!error_flag; frame++)
  2053. {
  2054. SBPCD_CLI;
  2055. del_timer(&data_timer);
  2056. data_timer.expires=jiffies+max_latency;
  2057. timed_out_data=0;
  2058. add_timer(&data_timer);
  2059. while (!timed_out_data) 
  2060. {
  2061. if (D_S[d].f_multisession) try=maxtim_data*4;
  2062. else try=maxtim_data;
  2063. msg(DBG_000,"sbp_data: CDi_status loop: try=%d.n",try);
  2064. for ( ; try!=0;try--)
  2065. {
  2066. j=inb(CDi_status);
  2067. if (!(j&s_not_data_ready)) break;;
  2068. if (!(j&s_not_result_ready)) break;
  2069. if (fam0LV_drive) if (j&s_attention) break;
  2070. }
  2071. if (!(j&s_not_data_ready)) goto data_ready;
  2072. if (try==0)
  2073. {
  2074. if (data_retrying == 0) data_waits++;
  2075. data_retrying = 1;
  2076. msg(DBG_000,"sbp_data: CDi_status loop: sleeping.n");
  2077. sbp_sleep(1);
  2078. try = 1;
  2079. }
  2080. }
  2081. msg(DBG_INF,"sbp_data: CDi_status loop expired.n");
  2082. data_ready:
  2083. del_timer(&data_timer);
  2084. if (timed_out_data)
  2085. {
  2086. msg(DBG_INF,"sbp_data: CDi_status timeout (timed_out_data) (%02X).n", j);
  2087. error_flag++;
  2088. }
  2089. if (try==0)
  2090. {
  2091. msg(DBG_INF,"sbp_data: CDi_status timeout (try=0) (%02X).n", j);
  2092. error_flag++;
  2093. }
  2094. if (!(j&s_not_result_ready))
  2095. {
  2096. msg(DBG_INF, "sbp_data: RESULT_READY where DATA_READY awaited (%02X).n", j);
  2097. response_count=20;
  2098. j=ResponseInfo();
  2099. j=inb(CDi_status);
  2100. }
  2101. if (j&s_not_data_ready)
  2102. {
  2103. if ((D_S[d].ored_ctl_adr&0x40)==0)
  2104. msg(DBG_INF, "CD contains no data tracks.n");
  2105. else msg(DBG_INF, "sbp_data: DATA_READY timeout (%02X).n", j);
  2106. error_flag++;
  2107. }
  2108. SBPCD_STI;
  2109. if (error_flag) break;
  2110. msg(DBG_000, "sbp_data: beginning to read.n");
  2111. p = D_S[d].sbp_buf + frame *  CD_FRAMESIZE;
  2112. if (sbpro_type==1) OUT(CDo_sel_i_d,1);
  2113. if (cmd_type==READ_M2) {
  2114.                         if (do_16bit) insw(CDi_data, xa_head_buf, CD_XA_HEAD>>1);
  2115.                         else insb(CDi_data, xa_head_buf, CD_XA_HEAD);
  2116. }
  2117. if (do_16bit) insw(CDi_data, p, CD_FRAMESIZE>>1);
  2118. else insb(CDi_data, p, CD_FRAMESIZE);
  2119. if (cmd_type==READ_M2) {
  2120.                         if (do_16bit) insw(CDi_data, xa_tail_buf, CD_XA_TAIL>>1);
  2121.                         else insb(CDi_data, xa_tail_buf, CD_XA_TAIL);
  2122. }
  2123. D_S[d].sbp_current++;
  2124. if (sbpro_type==1) OUT(CDo_sel_i_d,0);
  2125. if (cmd_type==READ_M2)
  2126. {
  2127. for (xa_count=0;xa_count<CD_XA_HEAD;xa_count++)
  2128. sprintf(&msgbuf[xa_count*3], " %02X", xa_head_buf[xa_count]);
  2129. msgbuf[xa_count*3]=0;
  2130. msg(DBG_XA1,"xa head:%sn", msgbuf);
  2131. }
  2132. data_retrying = 0;
  2133. data_tries++;
  2134. if (data_tries >= 1000)
  2135. {
  2136. msg(DBG_INF,"sbp_data() statistics: %d waits in %d frames.n", data_waits, data_tries);
  2137. data_waits = data_tries = 0;
  2138. }
  2139. }
  2140. duration=jiffies-duration;
  2141. msg(DBG_TEA,"time to read %d frames: %d jiffies .n",frame,duration);
  2142. if (famT_drive)
  2143. {
  2144. wait=8;
  2145. do
  2146. {
  2147. if (teac==2)
  2148.                           {
  2149.                             if ((i=CDi_stat_loop_T()) == -1) break;
  2150.                           }
  2151.                         else
  2152.                           {
  2153.                             sbp_sleep(1);
  2154.                             OUT(CDo_sel_i_d,0); 
  2155.                             i=inb(CDi_status);
  2156.                           } 
  2157. if (!(i&s_not_data_ready))
  2158. {
  2159. OUT(CDo_sel_i_d,1);
  2160. j=0;
  2161. do
  2162. {
  2163. if (do_16bit) i=inw(CDi_data);
  2164. else i=inb(CDi_data);
  2165. j++;
  2166. i=inb(CDi_status);
  2167. }
  2168. while (!(i&s_not_data_ready));
  2169. msg(DBG_TEA, "==========too much data (%d bytes/words)==============.n", j);
  2170. }
  2171. if (!(i&s_not_result_ready))
  2172. {
  2173. OUT(CDo_sel_i_d,0);
  2174. l=0;
  2175. do
  2176. {
  2177. infobuf[l++]=inb(CDi_info);
  2178. i=inb(CDi_status);
  2179. }
  2180. while (!(i&s_not_result_ready));
  2181. if (infobuf[0]==0x00) success=1;
  2182. #if 1
  2183. for (j=0;j<l;j++) sprintf(&msgbuf[j*3], " %02X", infobuf[j]);
  2184. msgbuf[j*3]=0;
  2185. msg(DBG_TEA,"sbp_data info response:%sn", msgbuf);
  2186. #endif
  2187. if (infobuf[0]==0x02)
  2188. {
  2189. error_flag++;
  2190. do
  2191. {
  2192. ++recursion;
  2193. if (recursion>1) msg(DBG_TEA,"cmd_out_T READ_ERR recursion (sbp_data): %d !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!n",recursion);
  2194. else msg(DBG_TEA,"sbp_data: CMDT_READ_ERR necessary.n");
  2195. clr_cmdbuf();
  2196. drvcmd[0]=CMDT_READ_ERR;
  2197. j=cmd_out_T(); /* !!! recursive here !!! */
  2198. --recursion;
  2199. sbp_sleep(1);
  2200. }
  2201. while (j<0);
  2202. D_S[d].error_state=infobuf[2];
  2203. D_S[d].b3=infobuf[3];
  2204. D_S[d].b4=infobuf[4];
  2205. }
  2206. break;
  2207. }
  2208. else
  2209. {
  2210. #if 0
  2211. msg(DBG_TEA, "============= waiting for result=================.n");
  2212. sbp_sleep(1);
  2213. #endif
  2214. }
  2215. }
  2216. while (wait--);
  2217. }
  2218. if (error_flag) /* must have been spurious D_RDY or (ATTN&&!D_RDY) */
  2219. {
  2220. msg(DBG_TEA, "================error flag: %d=================.n", error_flag);
  2221. msg(DBG_INF,"sbp_data: read aborted by drive.n");
  2222. #if 1
  2223. i=cc_DriveReset(); /* ugly fix to prevent a hang */
  2224. #else
  2225. i=cc_ReadError();
  2226. #endif
  2227. return (0);
  2228. }
  2229. if (fam0LV_drive)
  2230. {
  2231. SBPCD_CLI;
  2232. i=maxtim_data;
  2233. for (timeout=jiffies+HZ; time_before(jiffies, timeout); timeout--)
  2234. {
  2235. for ( ;i!=0;i--)
  2236. {
  2237. j=inb(CDi_status);
  2238. if (!(j&s_not_data_ready)) break;
  2239. if (!(j&s_not_result_ready)) break;
  2240. if (j&s_attention) break;
  2241. }
  2242. if (i != 0 || time_after_eq(jiffies, timeout)) break;
  2243. sbp_sleep(0);
  2244. i = 1;
  2245. }
  2246. if (i==0) msg(DBG_INF,"status timeout after READ.n");
  2247. if (!(j&s_attention))
  2248. {
  2249. msg(DBG_INF,"sbp_data: timeout waiting DRV_ATTN - retrying.n");
  2250. i=cc_DriveReset();  /* ugly fix to prevent a hang */
  2251. SBPCD_STI;
  2252. return (0);
  2253. }
  2254. SBPCD_STI;
  2255. }
  2256. #if 0
  2257. if (!success)
  2258. #endif
  2259. do
  2260. {
  2261. if (fam0LV_drive) cc_ReadStatus();
  2262. #if 1
  2263. if (famT_drive) msg(DBG_TEA, "================before ResponseStatus=================.n", i);
  2264. #endif
  2265. i=ResponseStatus();  /* builds status_bits, returns orig. status (old) or faked p_success (new) */
  2266. #if 1
  2267. if (famT_drive) msg(DBG_TEA, "================ResponseStatus: %d=================.n", i);
  2268. #endif
  2269. if (i<0)
  2270. {
  2271. msg(DBG_INF,"bad cc_ReadStatus after read: %02Xn", D_S[d].status_bits);
  2272. return (0);
  2273. }
  2274. }
  2275. while ((fam0LV_drive)&&(!st_check)&&(!(i&p_success)));
  2276. if (st_check)
  2277. {
  2278. i=cc_ReadError();
  2279. msg(DBG_INF,"cc_ReadError was necessary after read: %dn",i);
  2280. return (0);
  2281. }
  2282. if (fatal_err)
  2283. {
  2284. fatal_err=0;
  2285. D_S[d].sbp_first_frame=D_S[d].sbp_last_frame=-1;      /* purge buffer */
  2286. D_S[d].sbp_current = 0;
  2287. msg(DBG_INF,"sbp_data: fatal_err - retrying.n");
  2288. return (0);
  2289. }
  2290. D_S[d].sbp_first_frame = req -> sector / 4;
  2291. D_S[d].sbp_last_frame = D_S[d].sbp_first_frame + D_S[d].sbp_read_frames - 1;
  2292. sbp_transfer(req);
  2293. return (1);
  2294. }
  2295. /*==========================================================================*/
  2296. static struct block_device_operations sbpcd_bdops =
  2297. {
  2298. owner: THIS_MODULE,
  2299. open: cdrom_open,
  2300. release: cdrom_release,
  2301. ioctl: cdrom_ioctl,
  2302. check_media_change: cdrom_media_changed,
  2303. };
  2304. /*==========================================================================*/
  2305. /*
  2306.  *  Open the device special file.  Check that a disk is in. Read TOC.
  2307.  */
  2308. static int sbpcd_open(struct cdrom_device_info *cdi, int purpose)
  2309. {
  2310. int i;
  2311. i = MINOR(cdi->dev);
  2312. down(&ioctl_read_sem);
  2313. switch_drive(i);
  2314. /*
  2315.  * try to keep an "open" counter here and lock the door if 0->1.
  2316.  */
  2317. msg(DBG_LCK,"open_count: %d -> %dn",
  2318.     D_S[d].open_count,D_S[d].open_count+1);
  2319. if (++D_S[d].open_count<=1)
  2320. {
  2321. i=LockDoor();
  2322. D_S[d].open_count=1;
  2323. if (famT_drive) msg(DBG_TEA,"sbpcd_open: before i=DiskInfo();.n");
  2324. i=DiskInfo();
  2325. if (famT_drive) msg(DBG_TEA,"sbpcd_open: after i=DiskInfo();.n");
  2326. if ((D_S[d].ored_ctl_adr&0x40)==0)
  2327. {
  2328. msg(DBG_INF,"CD contains no data tracks.n");
  2329. #if SAFE_MIXED
  2330. D_S[d].has_data=0;
  2331. #endif /* SAFE_MIXED */
  2332. }
  2333. #if SAFE_MIXED
  2334. else if (D_S[d].has_data<1) D_S[d].has_data=1;
  2335. #endif /* SAFE_MIXED */ 
  2336. }
  2337. if (!st_spinning) cc_SpinUp();
  2338. RETURN_UP(0);
  2339. }
  2340. /*==========================================================================*/
  2341. /*
  2342.  *  On close, we flush all sbp blocks from the buffer cache.
  2343.  */
  2344. static void sbpcd_release(struct cdrom_device_info * cdi)
  2345. {
  2346. int i;
  2347. i = MINOR(cdi->dev);
  2348. if ((i<0) || (i>=NR_SBPCD) || (D_S[i].drv_id==-1))
  2349. {
  2350. msg(DBG_INF, "release: bad device: %04Xn", cdi->dev);
  2351. return ;
  2352. }
  2353. down(&ioctl_read_sem);
  2354. switch_drive(i);
  2355. /*
  2356.  * try to keep an "open" counter here and unlock the door if 1->0.
  2357.  */
  2358. msg(DBG_LCK,"open_count: %d -> %dn",
  2359.     D_S[d].open_count,D_S[d].open_count-1);
  2360. if (D_S[d].open_count>-2) /* CDROMEJECT may have been done */
  2361. {
  2362. if (--D_S[d].open_count<=0) 
  2363. {
  2364. D_S[d].sbp_first_frame=D_S[d].sbp_last_frame=-1;
  2365. invalidate_buffers(cdi->dev);
  2366. if (D_S[d].audio_state!=audio_playing)
  2367. if (D_S[d].f_eject) cc_SpinDown();
  2368. D_S[d].diskstate_flags &= ~cd_size_bit;
  2369. D_S[d].open_count=0; 
  2370. #if SAFE_MIXED
  2371. D_S[d].has_data=0;
  2372. #endif /* SAFE_MIXED */ 
  2373. }
  2374. }
  2375. up(&ioctl_read_sem);
  2376. return ;
  2377. }
  2378. /*==========================================================================*/
  2379. /*
  2380.  *
  2381.  */
  2382. static int sbpcd_media_changed( struct cdrom_device_info *cdi, int disc_nr);
  2383. static struct cdrom_device_ops sbpcd_dops = {
  2384. open: sbpcd_open,
  2385. release: sbpcd_release,
  2386. drive_status: sbpcd_drive_status,
  2387. media_changed: sbpcd_media_changed,
  2388. tray_move: sbpcd_tray_move,
  2389. lock_door: sbpcd_lock_door,
  2390. select_speed: sbpcd_select_speed,
  2391. get_last_session: sbpcd_get_last_session,
  2392. get_mcn: sbpcd_get_mcn,
  2393. reset: sbpcd_reset,
  2394. audio_ioctl: sbpcd_audio_ioctl,
  2395. dev_ioctl: sbpcd_dev_ioctl,
  2396. capability: CDC_CLOSE_TRAY | CDC_OPEN_TRAY | CDC_LOCK |
  2397. CDC_MULTI_SESSION | CDC_MEDIA_CHANGED |
  2398. CDC_MCN | CDC_PLAY_AUDIO | CDC_IOCTLS,
  2399. n_minors: 1,
  2400. };
  2401. static struct cdrom_device_info sbpcd_info = {
  2402. ops: &sbpcd_dops,
  2403. speed: 2,
  2404. capacity: 1,
  2405. name: "sbpcd",
  2406. };
  2407. /*==========================================================================*/
  2408. /*
  2409.  * accept "kernel command line" parameters 
  2410.  * (suggested by Peter MacDonald with SLS 1.03)
  2411.  *
  2412.  * This is only implemented for the first controller. Should be enough to
  2413.  * allow installing with a "strange" distribution kernel.
  2414.  *
  2415.  * use: tell LILO:
  2416.  *                 sbpcd=0x230,SoundBlaster
  2417.  *             or
  2418.  *                 sbpcd=0x300,LaserMate
  2419.  *             or
  2420.  *                 sbpcd=0x338,SoundScape
  2421.  *             or
  2422.  *                 sbpcd=0x2C0,Teac16bit
  2423.  *
  2424.  * (upper/lower case sensitive here - but all-lowercase is ok!!!).
  2425.  *
  2426.  * the address value has to be the CDROM PORT ADDRESS -
  2427.  * not the soundcard base address.
  2428.  * For the SPEA/SoundScape setup, DO NOT specify the "configuration port"
  2429.  * address, but the address which is really used for the CDROM (usually 8
  2430.  * bytes above).
  2431.  *
  2432.  */
  2433. #if (SBPCD_ISSUE-1)
  2434. static int sbpcd_setup(char *s)
  2435. #else
  2436. int sbpcd_setup(char *s)
  2437. #endif
  2438. {
  2439. #ifndef MODULE
  2440. int p[4];
  2441. (void)get_options(s, ARRAY_SIZE(p), p);
  2442. setup_done++;
  2443. msg(DBG_INI,"sbpcd_setup called with %04X,%sn",p[1], s);
  2444. sbpro_type=0; /* default: "LaserMate" */
  2445. if (p[0]>1) sbpro_type=p[2];
  2446. else if (!strcmp(s,str_sb)) sbpro_type=1;
  2447. else if (!strcmp(s,str_sb_l)) sbpro_type=1;
  2448. else if (!strcmp(s,str_sp)) sbpro_type=2;
  2449. else if (!strcmp(s,str_sp_l)) sbpro_type=2;
  2450. else if (!strcmp(s,str_ss)) sbpro_type=2;
  2451. else if (!strcmp(s,str_ss_l)) sbpro_type=2;
  2452. else if (!strcmp(s,str_t16)) sbpro_type=3;
  2453. else if (!strcmp(s,str_t16_l)) sbpro_type=3;
  2454. if (p[0]>0) sbpcd_ioaddr=p[1];
  2455. if (p[0]>2) max_drives=p[3];
  2456. #else
  2457. sbpcd_ioaddr = sbpcd[0];
  2458. sbpro_type = sbpcd[1];
  2459. #endif
  2460. CDo_command=sbpcd_ioaddr;
  2461. CDi_info=sbpcd_ioaddr;
  2462. CDi_status=sbpcd_ioaddr+1;
  2463. CDo_sel_i_d=sbpcd_ioaddr+1;
  2464. CDo_reset=sbpcd_ioaddr+2;
  2465. CDo_enable=sbpcd_ioaddr+3; 
  2466. f_16bit=0;
  2467. if ((sbpro_type==1)||(sbpro_type==3))
  2468. {
  2469. CDi_data=sbpcd_ioaddr;
  2470. if (sbpro_type==3)
  2471.                 {
  2472.                         f_16bit=1;
  2473.                         sbpro_type=1;
  2474.                 }
  2475. }
  2476. else CDi_data=sbpcd_ioaddr+2;
  2477. return 1;
  2478. }
  2479. __setup("sbpcd=", sbpcd_setup);
  2480. /*==========================================================================*/
  2481. /*
  2482.  * Sequoia S-1000 CD-ROM Interface Configuration
  2483.  * as used within SPEA Media FX, Ensonic SoundScape and some Reveal cards
  2484.  * The soundcard has to get jumpered for the interface type "Panasonic"
  2485.  * (not Sony or Mitsumi) and to get soft-configured for
  2486.  *     -> configuration port address
  2487.  *     -> CDROM port offset (num_ports): has to be 8 here. Possibly this
  2488.  *        offset value determines the interface type (none, Panasonic,
  2489.  *        Mitsumi, Sony).
  2490.  *        The interface uses a configuration port (0x320, 0x330, 0x340, 0x350)
  2491.  *        some bytes below the real CDROM address.
  2492.  *         
  2493.  *        For the Panasonic style (LaserMate) interface and the configuration
  2494.  *        port 0x330, we have to use an offset of 8; so, the real CDROM port
  2495.  *        address is 0x338.
  2496.  */
  2497. static int __init config_spea(void)
  2498. {
  2499. /*
  2500.          * base address offset between configuration port and CDROM port,
  2501.  * this probably defines the interface type
  2502.          *   2 (type=??): 0x00
  2503.          *   8 (type=LaserMate):0x10
  2504.          *  16 (type=??):0x20
  2505.          *  32 (type=??):0x30
  2506.          */
  2507. int n_ports=0x10;
  2508. int irq_number=0; /* off:0x00, 2/9:0x01, 7:0x03, 12:0x05, 15:0x07 */
  2509. int dma_channel=0; /* off: 0x00, 0:0x08, 1:0x18, 3:0x38, 5:0x58, 6:0x68 */
  2510. int dack_polarity=0; /* L:0x00, H:0x80 */
  2511. int drq_polarity=0x40; /* L:0x00, H:0x40 */
  2512. int i;
  2513. #define SPEA_REG_1 sbpcd_ioaddr-0x08+4
  2514. #define SPEA_REG_2 sbpcd_ioaddr-0x08+5
  2515. OUT(SPEA_REG_1,0xFF);
  2516. i=inb(SPEA_REG_1);
  2517. if (i!=0x0F)
  2518. {
  2519. msg(DBG_SEQ,"no SPEA interface at %04X present.n", sbpcd_ioaddr);
  2520. return (-1); /* no interface found */
  2521. }
  2522. OUT(SPEA_REG_1,0x04);
  2523. OUT(SPEA_REG_2,0xC0);
  2524. OUT(SPEA_REG_1,0x05);
  2525. OUT(SPEA_REG_2,0x10|drq_polarity|dack_polarity);
  2526. #if 1
  2527. #define SPEA_PATTERN 0x80
  2528. #else
  2529. #define SPEA_PATTERN 0x00
  2530. #endif
  2531. OUT(SPEA_REG_1,0x06);
  2532. OUT(SPEA_REG_2,dma_channel|irq_number|SPEA_PATTERN);
  2533. OUT(SPEA_REG_2,dma_channel|irq_number|SPEA_PATTERN);
  2534. OUT(SPEA_REG_1,0x09);
  2535. i=(inb(SPEA_REG_2)&0xCF)|n_ports;
  2536. OUT(SPEA_REG_2,i);
  2537. sbpro_type = 0; /* acts like a LaserMate interface now */
  2538. msg(DBG_SEQ,"found SoundScape interface at %04X.n", sbpcd_ioaddr);
  2539. return (0);
  2540. }
  2541. #ifdef DONT_MERGE_REQUESTS
  2542. static int dont_merge_requests_fn(request_queue_t *q, struct request *req,
  2543.                                 struct request *next, int max_segments)
  2544. {
  2545. return 0;
  2546. }
  2547. static int dont_bh_merge_fn(request_queue_t *q, struct request *req,
  2548.                             struct buffer_head *bh, int max_segments)
  2549. {
  2550. return 0;
  2551. }
  2552. #endif
  2553. /*==========================================================================*/
  2554. /*
  2555.  *  Test for presence of drive and initialize it.
  2556.  *  Called once at boot or load time.
  2557.  */
  2558. static devfs_handle_t devfs_handle;
  2559. #ifdef MODULE
  2560. int __init __SBPCD_INIT(void)
  2561. #else
  2562. int __init SBPCD_INIT(void)
  2563. #endif /* MODULE */ 
  2564. {
  2565. char nbuff[16];
  2566. int i=0, j=0;
  2567. int addr[2]={1, CDROM_PORT};
  2568. int port_index;
  2569. sti();
  2570. msg(DBG_INF,"sbpcd.c %sn", VERSION);
  2571. #ifndef MODULE
  2572. #if DISTRIBUTION
  2573. if (!setup_done)
  2574. {
  2575. msg(DBG_INF,"Looking for Matsushita/Panasonic, CreativeLabs, Longshine, TEAC CD-ROM drivesn");
  2576. msg(DBG_INF,"= = = = = = = = = = W A R N I N G = = = = = = = = = =n");
  2577. msg(DBG_INF,"Auto-Probing can cause a hang (f.e. touching an NE2000 card).n");
  2578. msg(DBG_INF,"If that happens, you have to reboot and use then");
  2579. msg(DBG_INF,"LILO (kernel) command line feature like:n");
  2580. msg(DBG_INF,"   LILO boot: ... sbpcd=0x230,SoundBlastern");
  2581. msg(DBG_INF,"or like:n");
  2582. msg(DBG_INF,"   LILO boot: ... sbpcd=0x300,LaserMaten");
  2583. msg(DBG_INF,"or like:n");
  2584. msg(DBG_INF,"   LILO boot: ... sbpcd=0x338,SoundScapen");
  2585. msg(DBG_INF,"with your REAL address.n");
  2586. msg(DBG_INF,"= = = = = = = = = = END of WARNING = = = = = == = = =n");
  2587. }
  2588. #endif /* DISTRIBUTION */
  2589. sbpcd[0]=sbpcd_ioaddr; /* possibly changed by kernel command line */
  2590. sbpcd[1]=sbpro_type; /* possibly changed by kernel command line */
  2591. #endif /* MODULE */
  2592. for (port_index=0;port_index<NUM_PROBE;port_index+=2)
  2593. {
  2594. addr[1]=sbpcd[port_index];
  2595. if (addr[1]==0) break;
  2596. if (check_region(addr[1],4))
  2597. {
  2598. msg(DBG_INF,"check_region: %03X is not free.n",addr[1]);
  2599. continue;
  2600. }
  2601. if (sbpcd[port_index+1]==2) type=str_sp;
  2602. else if (sbpcd[port_index+1]==1) type=str_sb;
  2603. else if (sbpcd[port_index+1]==3) type=str_t16;
  2604. else type=str_lm;
  2605. sbpcd_setup((char *)type);
  2606. #if DISTRIBUTION
  2607. msg(DBG_INF,"Scanning 0x%X (%s)...n", CDo_command, type);
  2608. #endif /* DISTRIBUTION */
  2609. if (sbpcd[port_index+1]==2)
  2610. {
  2611. i=config_spea();
  2612. if (i<0) continue;
  2613. }
  2614. #ifdef PATH_CHECK
  2615. if (check_card(addr[1])) continue;
  2616. #endif /* PATH_CHECK */ 
  2617. i=check_drives();
  2618. msg(DBG_INI,"check_drives done.n");
  2619. if (i>=0) break; /* drive found */
  2620. } /* end of cycling through the set of possible I/O port addresses */
  2621. if (ndrives==0)
  2622. {
  2623. msg(DBG_INF, "No drive found.n");
  2624. #ifdef MODULE
  2625. return -EIO;
  2626. #else
  2627. goto init_done;
  2628. #endif /* MODULE */
  2629. }
  2630. if (port_index>0)
  2631.           {
  2632.             msg(DBG_INF, "You should read linux/Documentation/cdrom/sbpcdn");
  2633.             msg(DBG_INF, "and then configure sbpcd.h for your hardware.n");
  2634.           }
  2635. check_datarate();
  2636. msg(DBG_INI,"check_datarate done.n");
  2637. for (j=0;j<NR_SBPCD;j++)
  2638. {
  2639. if (D_S[j].drv_id==-1) continue;
  2640. switch_drive(j);
  2641. #if 1
  2642. if (!famL_drive) cc_DriveReset();
  2643. #endif
  2644. if (!st_spinning) cc_SpinUp();
  2645. D_S[j].sbp_first_frame = -1;  /* First frame in buffer */
  2646. D_S[j].sbp_last_frame = -1;   /* Last frame in buffer  */
  2647. D_S[j].sbp_read_frames = 0;   /* Number of frames being read to buffer */
  2648. D_S[j].sbp_current = 0;       /* Frame being currently read */
  2649. D_S[j].CD_changed=1;
  2650. D_S[j].frame_size=CD_FRAMESIZE;
  2651. D_S[j].f_eject=0;
  2652. #if EJECT
  2653. if (!fam0_drive) D_S[j].f_eject=1;
  2654. #endif /* EJECT */ 
  2655. cc_ReadStatus();
  2656. i=ResponseStatus();  /* returns orig. status or p_busy_new */
  2657. if (famT_drive) i=ResponseStatus();  /* returns orig. status or p_busy_new */
  2658. if (i<0)
  2659. {
  2660. if (i!=-402)
  2661. msg(DBG_INF,"init: ResponseStatus returns %d.n",i);
  2662. }
  2663. else
  2664. {
  2665. if (st_check)
  2666. {
  2667. i=cc_ReadError();
  2668. msg(DBG_INI,"init: cc_ReadError returns %dn",i);
  2669. }
  2670. }
  2671. msg(DBG_INI,"init: first GetStatus: %dn",i);
  2672. msg(DBG_LCS,"init: first GetStatus: error_byte=%dn",
  2673.     D_S[j].error_byte);
  2674. if (D_S[j].error_byte==aud_12)
  2675. {
  2676. timeout=jiffies+2*HZ;
  2677. do
  2678. {
  2679. i=GetStatus();
  2680. msg(DBG_INI,"init: second GetStatus: %02Xn",i);
  2681. msg(DBG_LCS,
  2682.     "init: second GetStatus: error_byte=%dn",
  2683.     D_S[j].error_byte);
  2684. if (i<0) break;
  2685. if (!st_caddy_in) break;
  2686. }
  2687. while ((!st_diskok)||time_after(jiffies, timeout));
  2688. }
  2689. i=SetSpeed();
  2690. if (i>=0) D_S[j].CD_changed=1;
  2691. }
  2692. /*
  2693.  * Turn on the CD audio channels.
  2694.  * The addresses are obtained from SOUND_BASE (see sbpcd.h).
  2695.  */
  2696. #if SOUND_BASE
  2697. OUT(MIXER_addr,MIXER_CD_Volume); /* select SB Pro mixer register */
  2698. OUT(MIXER_data,0xCC); /* one nibble per channel, max. value: 0xFF */
  2699. #endif /* SOUND_BASE */ 
  2700. if (devfs_register_blkdev(MAJOR_NR, major_name, &sbpcd_bdops) != 0)
  2701. {
  2702. msg(DBG_INF, "Can't get MAJOR %d for Matsushita CDROMn", MAJOR_NR);
  2703. #ifdef MODULE
  2704. return -EIO;
  2705. #else
  2706. goto init_done;
  2707. #endif /* MODULE */
  2708. }
  2709. blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), DEVICE_REQUEST);
  2710. #ifdef DONT_MERGE_REQUESTS
  2711. (BLK_DEFAULT_QUEUE(MAJOR_NR))->back_merge_fn = dont_bh_merge_fn;
  2712. (BLK_DEFAULT_QUEUE(MAJOR_NR))->front_merge_fn = dont_bh_merge_fn;
  2713. (BLK_DEFAULT_QUEUE(MAJOR_NR))->merge_requests_fn = dont_merge_requests_fn;
  2714. #endif
  2715. blk_queue_headactive(BLK_DEFAULT_QUEUE(MAJOR_NR), 0);
  2716. read_ahead[MAJOR_NR] = buffers * (CD_FRAMESIZE / 512);
  2717. request_region(CDo_command,4,major_name);
  2718. devfs_handle = devfs_mk_dir (NULL, "sbp", NULL);
  2719. for (j=0;j<NR_SBPCD;j++)
  2720. {
  2721. struct cdrom_device_info * sbpcd_infop;
  2722. if (D_S[j].drv_id==-1) continue;
  2723. switch_drive(j);
  2724. #if SAFE_MIXED
  2725. D_S[j].has_data=0;
  2726. #endif /* SAFE_MIXED */ 
  2727. /*
  2728.  * allocate memory for the frame buffers
  2729.  */
  2730. D_S[j].aud_buf=NULL;
  2731. D_S[j].sbp_audsiz=0;
  2732. D_S[j].sbp_bufsiz=buffers;
  2733. if (D_S[j].drv_type&drv_fam1)
  2734. if (READ_AUDIO>0) D_S[j].sbp_audsiz=READ_AUDIO;
  2735. D_S[j].sbp_buf=(u_char *) vmalloc(D_S[j].sbp_bufsiz*CD_FRAMESIZE);
  2736. if (D_S[j].sbp_buf==NULL)
  2737. {
  2738. msg(DBG_INF,"data buffer (%d frames) not available.n",D_S[j].sbp_bufsiz);
  2739. if ((devfs_unregister_blkdev(MAJOR_NR, major_name) == -EINVAL))
  2740. {
  2741. printk("Can't unregister %sn", major_name);
  2742. }
  2743. release_region(CDo_command,4);
  2744. blk_cleanup_queue(BLK_DEFAULT_QUEUE(MAJOR_NR));
  2745. return -EIO;
  2746. }
  2747. #ifdef MODULE
  2748. msg(DBG_INF,"data buffer size: %d frames.n",buffers);
  2749. #endif /* MODULE */
  2750. if (D_S[j].sbp_audsiz>0)
  2751. {
  2752. D_S[j].aud_buf=(u_char *) vmalloc(D_S[j].sbp_audsiz*CD_FRAMESIZE_RAW);
  2753. if (D_S[j].aud_buf==NULL) msg(DBG_INF,"audio buffer (%d frames) not available.n",D_S[j].sbp_audsiz);
  2754. else msg(DBG_INF,"audio buffer size: %d frames.n",D_S[j].sbp_audsiz);
  2755. }
  2756.                 sbpcd_infop = vmalloc(sizeof (struct cdrom_device_info));
  2757. if (sbpcd_infop == NULL)
  2758. {
  2759.                         release_region(CDo_command,4);
  2760. blk_cleanup_queue(BLK_DEFAULT_QUEUE(MAJOR_NR));
  2761.                         return -ENOMEM;
  2762. }
  2763. D_S[j].sbpcd_infop = sbpcd_infop;
  2764. memcpy (sbpcd_infop, &sbpcd_info, sizeof(struct cdrom_device_info));
  2765. sbpcd_infop->dev = MKDEV(MAJOR_NR, j);
  2766. strncpy(sbpcd_infop->name,major_name, sizeof(sbpcd_infop->name)); 
  2767. sprintf (nbuff, "c%dt%d/cd", SBPCD_ISSUE - 1, D_S[j].drv_id);
  2768. sbpcd_infop->de =
  2769.     devfs_register (devfs_handle, nbuff, DEVFS_FL_DEFAULT,
  2770.     MAJOR_NR, j, S_IFBLK | S_IRUGO | S_IWUGO,
  2771.     &sbpcd_bdops, NULL);
  2772. if (register_cdrom(sbpcd_infop))
  2773. {
  2774.                  printk(" sbpcd: Unable to register with Uniform CD-ROm drivern");
  2775. }
  2776. /*
  2777.  * set the block size
  2778.  */
  2779. sbpcd_blocksizes[j]=CD_FRAMESIZE;
  2780. }
  2781. blksize_size[MAJOR_NR]=sbpcd_blocksizes;
  2782. #ifndef MODULE
  2783.  init_done:
  2784. #if !(SBPCD_ISSUE-1)
  2785. #ifdef CONFIG_SBPCD2
  2786. sbpcd2_init();
  2787. #endif /* CONFIG_SBPCD2 */
  2788. #ifdef CONFIG_SBPCD3
  2789. sbpcd3_init();
  2790. #endif /* CONFIG_SBPCD3 */ 
  2791. #ifdef CONFIG_SBPCD4
  2792. sbpcd4_init();
  2793. #endif /* CONFIG_SBPCD4 */ 
  2794. #endif /* !(SBPCD_ISSUE-1) */ 
  2795. #endif /* MODULE */
  2796. return 0;
  2797. }
  2798. /*==========================================================================*/
  2799. #ifdef MODULE
  2800. void sbpcd_exit(void)
  2801. {
  2802. int j;
  2803. if ((devfs_unregister_blkdev(MAJOR_NR, major_name) == -EINVAL))
  2804. {
  2805. msg(DBG_INF, "What's that: can't unregister %s.n", major_name);
  2806. return;
  2807. }
  2808. release_region(CDo_command,4);
  2809. blk_cleanup_queue(BLK_DEFAULT_QUEUE(MAJOR_NR));
  2810. devfs_unregister (devfs_handle);
  2811. for (j=0;j<NR_SBPCD;j++)
  2812. {
  2813. if (D_S[j].drv_id==-1) continue;
  2814. vfree(D_S[j].sbp_buf);
  2815. if (D_S[j].sbp_audsiz>0) vfree(D_S[j].aud_buf);
  2816. if ((unregister_cdrom(D_S[j].sbpcd_infop) == -EINVAL))
  2817. {
  2818. msg(DBG_INF, "What's that: can't unregister info %s.n", major_name);
  2819. return;
  2820. }
  2821. vfree(D_S[j].sbpcd_infop);
  2822. }
  2823. msg(DBG_INF, "%s module released.n", major_name);
  2824. }
  2825. #ifdef MODULE
  2826. module_init(__SBPCD_INIT) /*HACK!*/;
  2827. #endif
  2828. module_exit(sbpcd_exit);
  2829. #endif /* MODULE */ 
  2830. /*==========================================================================*/
  2831. /*
  2832.  * Check if the media has changed in the CD-ROM drive.
  2833.  * used externally (isofs/inode.c, fs/buffer.c)
  2834.  */
  2835. static int sbpcd_chk_disk_change(kdev_t full_dev)
  2836. {
  2837. int i;
  2838. msg(DBG_CHK,"media_check (%d) calledn", MINOR(full_dev));
  2839. i=MINOR(full_dev);
  2840. if (D_S[i].CD_changed==0xFF)
  2841.         {
  2842.                 D_S[i].CD_changed=0;
  2843.                 msg(DBG_CHK,"medium changed (drive %d)n", i);
  2844. /* BUG! Should invalidate buffers! --AJK */
  2845. invalidate_buffers(full_dev);
  2846. D_S[d].diskstate_flags &= ~toc_bit;
  2847. D_S[d].diskstate_flags &= ~cd_size_bit;
  2848. #if SAFE_MIXED
  2849. D_S[d].has_data=0;
  2850. #endif /* SAFE_MIXED */ 
  2851.                 return (1);
  2852.         }
  2853.         else
  2854.                 return (0);
  2855. }
  2856. static int sbpcd_media_changed( struct cdrom_device_info *cdi, int disc_nr)
  2857. {
  2858.    return sbpcd_chk_disk_change(cdi->dev);
  2859. }
  2860. MODULE_LICENSE("GPL");
  2861. /*==========================================================================*/
  2862. /*
  2863.  * Overrides for Emacs so that we follow Linus's tabbing style.
  2864.  * Emacs will notice this stuff at the end of the file and automatically
  2865.  * adjust the settings for this buffer only.  This must remain at the end
  2866.  * of the file. 
  2867.  * ---------------------------------------------------------------------------
  2868.  * Local variables:
  2869.  * c-indent-level: 8
  2870.  * c-brace-imaginary-offset: 0
  2871.  * c-brace-offset: -8
  2872.  * c-argdecl-indent: 8
  2873.  * c-label-offset: -8
  2874.  * c-continued-statement-offset: 8
  2875.  * c-continued-brace-offset: 0
  2876.  * End:
  2877.  */