<!doctype article public "-//OASIS//DTD DocBook V3.1//EN">

<article>
<artheader>
<title>Linux ATAPI-PD メモ</title>
<pubdate>1999/01/?</pubdate>
<author>
 <firstname>加藤貞彰</firstname>
 <surname></surname>
 <affiliation>
  <address>skato@venus.dti.ne.jp</address>
 </affiliation>
</author>
<!--
$Id: ATAPI-PD-memo.sgml,v 1.5 2001/03/22 06:42:38 mdk Exp $

                   Linux ATAPI-PD メモ

              加藤 貞顕 / skato@venus.dti.ne.jp
-->
<abstract><para>
この文書では、Linux で ATAPI-PD を使用する際の注意点をおおざっぱに
まとめてあります。
</para><para>
kernel の make 等については知ってるものとみなして書いていますので、
わからないかたは他の JF のドキュメントや書籍などをあたってください。
</para></abstract>
</artheader>

<sect1 id="intro">
<title>基本的なこと</title>
<para>
まず、kernel は 2.0.33 を使用するのがいちばん簡単です。以下の設定
で make してやるだけです。(2.0.35 や 36 を使いたいかたは第3章をご覧く
ださい)
</para>
<para>
ポイントは、make *configで
</para>
<para><screen>
  - Floppy,IDE,and other block devices
　  　　　　・SCSI emulation support  ＝　Y
　　  　　　・Include　IDE/ATAPI　CDROM　support　＝　N
  - SCSI　suppurt 
　  　　　　・SCSI　disk support　＝　Y
　　  　　　・SCSI　CDROM support　＝　Y　
　　　  　　・Probe all LUNs on each SCSI device　＝　Y
</screen>
</para>
<para>
とするということです。ATAPI CDROM support は N なのにご注意ください。
「俺は PD 以外に ATAPI-CDROM ドライブを持っているんだけどこれでいい
のかな？」と思ったかた、大丈夫です。ATAPI-CDROM ドライブも PD ドラ
イブも、両方とも SCSI emulation で認識されます。
</para><para>
最後の Probe all LUNs はなかなか問題のあるオプションでして、よくわ
からんけどとにかく認識させたいんだ！というかたは Y にしとくのが無
難です。Panasonic のものならなくてもいける場合もありますので、ま
ずは Y でやってみて、うまくいったらNにして試してみるというのもいい
でしょう。
</para><para>
また、Probe all LUNs を Y にすると起動時に全ての SCSI ID を検索します
ので、起動時のメッセージがたいへんうるさくなります。実害はないの
ですが、なんだか気持ち悪いというかたは、カーネルのパラメータに 
max_scsi_luns=? を与えてやりましょう。うちでは 2 にしてました。カー
ネルへのオション指定のやりかたがわからんというかたは、lilo や 
loadlin のドキュメントを読みましょう。
</para><para>
なお、NEC 製などの Probe all LUNs が Y でないと認識されない PD drive 
でも、N にできるようにする方法もあります。ただ、カーネルソースに
手を入れなくてはいけないので、上級編として最後に紹介ます。
</para><para>
いずれにしても、とりあえずは Y でためしてみることをおすすめします。
</para>
</sect1>

<sect1 id="use">
<title>実際の使用法</title>
<para>
私の環境では、PD の CD は /dev/scd2 にわりあてられました。
これは起動時に、
</para><para>
<screen>
  Detected scsi CD-ROM sr2 at scsi0, channel 0, id 1, lun 0
    Vendor: NEC       Model: PD-1 ODX654P      Rev: A113
    Type:   Optical Device                     ANSI SCSI revision: 02
</screen>
</para><para>
というメッセージがでることから確認しました。sr2 というのがポイン
トです。なぜ sr2 が scd2 になるのかは謎ですが、そういうもんのようで
す。
</para><para>
/dev/ を見ると、scd2 がなかったので新たに作ってやらなければなりま
せんでした。こういう時は、/dev/MAKEDEV コマンド(これがなければ
mknod)を使います。詳しくは、man MAKEDEV(mknod) をどうぞ。
PD として使うときは /dev/sda がわりあてられています。このへんは環境
によって異なると思うので、起動時のメッセージを見て適切に読みかえ
てください。
</para><para>
PD ドライブで PD と CD が問題なく mount、umount できることを確認した後、
/etc/fstab を書きかえましょう。例えば、私の /etc/fstab は以下のよう
になってます。
</para><para>
<screen>
  /dev/hda2       /       ext2        defaults   1   1
  /dev/hda1       /win    vfat        defaults   1   2
  /dev/hda3       swap    swap        defaults
  /dev/scd0       /cdrom  iso9660     user,ro,noauto
  /dev/scd2       /pcd    iso9660     user,ro,noauto
  /dev/sda        /pd     vfat        user,noauto
</screen>
</para><para>
見ればわかる通り、マウントポイントとして /pcd と /pd というディレク
トリをあらかじめ作っています。/cdrom は別につながっている
ATAPI-CDROM ドライブ用です。PD のオプションを vfat にしたのは、Win98
とのデータ交換も考えてのことですので、御使用なさる環境にあわせて
適切に設定してください。
</para><para>
なお、蛇足ですがこのように user オプションをつけると一般ユーザでも、
</para><para>
<screen>
  % mount /pcd	      PD の CD を mount
  % mount /pd         PD を mount
</screen>
</para><para>
などとできるようになって便利です。詳しくは man mount をどうぞ。
</para>
</sect1>

<sect1 id="precaution">
<title>kernel-2.0.35(or 36) で ATAPI-PD を使うには</title>
<para>
2.0.35(or 36) ではなぜか PD が常に read only で認識されるという問題が
あります。これを回避するためには、kernel source の
drivers/scsi/ide-scsi.c の 150-200 行目のあたりを 2.0.33 と同じにする
ことが必要なようです。この方法ではもしかしたらなにか問題があるの
かもしれませんが、少くともうちでは安定動作しています。
以下は、2.0.35 (or 36) で ATAPI-PD を使う patch です。fj.os.linux で高
垣さんというかたが、2.0.34 用の patch を公開されてた
<footnote><para>
<literallayout>
fj.os.linux
Message-ID: &lt;35D6E360.AF9D2BED@st.rim.or.jp&gt;
</literallayout>
</para></footnote>
のですが、
なぜかうまくあてられなかったので、それを参考にして作りました。
</para><para>
以下を切り取って、ide-scsi.c.diff とでも名付けて保存して、
drivers/scsi/ で、
</para><para>
<programlisting>
  $ patch &lt; ide-scsi.c.diff
</programlisting>
</para><para>
などとしてあててください。あとは 1 章に従って make するだけです。
</para><para>
<programlisting>
--------- ここから -----------
*** linux/drivers/scsi/ide-scsi.c.35.org	Mon Nov 16 21:45:00 1998
--- linux/drivers/scsi/ide-scsi.c	Tue Nov 17 05:07:21 1998
***************
*** 156,162 ****
  static inline void idescsi_transform_pc1 (ide_drive_t *drive, idescsi_pc_t *pc)
  {
  	idescsi_scsi_t *scsi = drive-&gt;scsi;
! 	u8 *c = pc-&gt;c;
  
  	if (scsi-&gt;media == TYPE_ROM) {
  		if (c&lsqb;0&rsqb; == READ_6 || c&lsqb;0&rsqb; == WRITE_6) {
--- 156,163 ----
  static inline void idescsi_transform_pc1 (ide_drive_t *drive, idescsi_pc_t *pc)
  {
  	idescsi_scsi_t *scsi = drive-&gt;scsi;
! 	u8 *c = pc-&gt;c, *buf = pc-&gt;buffer, *sc = pc-&gt;scsi_cmd-&gt;cmnd;
! 	int i;
  
  	if (scsi-&gt;media == TYPE_ROM) {
  		if (c&lsqb;0&rsqb; == READ_6 || c&lsqb;0&rsqb; == WRITE_6) {
***************
*** 164,169 ****
--- 165,178 ----
  			c&lsqb;3&rsqb; = c&lsqb;1&rsqb; &amp; 0x1f;	c&lsqb;2&rsqb; = 0;		c&lsqb;1&rsqb; &amp;= 0xe0;
  			c&lsqb;0&rsqb; += (READ_10 - READ_6);
  		}
+ 		if (c&lsqb;0&rsqb; == MODE_SENSE || (c&lsqb;0&rsqb; == MODE_SELECT &amp;&amp; buf&lsqb;3&rsqb; == 8)) {
+ 		        pc-&gt;request_transfer -= 4;
+ 		        memset (c, 0, 12);
+ 		        c&lsqb;0&rsqb; = sc&lsqb;0&rsqb; | 0x40;c&lsqb;2&rsqb; = sc&lsqb;2&rsqb;;c&lsqb;8&rsqb; = sc&lsqb;4&rsqb; - 4;
+ 		        if (c&lsqb;0&rsqb; == MODE_SENSE_10) return;
+ 		        for (i = 0; i &lt;= 7; i++) buf&lsqb;i&rsqb; = 0;
+ 		        for (i = 8; i &lt; pc-&gt;buffer_size - 4; i++) buf&lsqb;i&rsqb; = buf&lsqb;i + 4&rsqb;;
+ 		}
  	}
  }
  
***************
*** 171,181 ****
  {
  	idescsi_scsi_t *scsi = drive-&gt;scsi;
  	u8 *buf = pc-&gt;buffer;
  
  	if (scsi-&gt;media == TYPE_ROM) {
! 		if (pc-&gt;c&lsqb;0&rsqb; == INQUIRY)
! 			buf&lsqb;2&rsqb; |= 2;
! 	}
  }
  
  static inline void idescsi_free_bh (struct buffer_head *bh)
--- 180,198 ----
  {
  	idescsi_scsi_t *scsi = drive-&gt;scsi;
  	u8 *buf = pc-&gt;buffer;
+ 	int i;
  
  	if (scsi-&gt;media == TYPE_ROM) {
! 	        if (pc-&gt;c&lsqb;0&rsqb; == MODE_SENSE_10 &amp;&amp; pc-&gt;scsi_cmd-&gt;cmnd&lsqb;0&rsqb; == MODE_SENSE) {
! 	                buf&lsqb;0&rsqb; = buf&lsqb;1&rsqb;;buf&lsqb;1&rsqb; = buf&lsqb;2&rsqb;;
! 			buf&lsqb;2&rsqb; = 0;buf&lsqb;3&rsqb; = 8;
! 			for (i = pc-&gt;buffer_size - 1; i &gt;= 12; i--)
! 			buf&lsqb;i&rsqb; = buf&lsqb;i - 4&rsqb;;
! 			for (i = 11; i &gt;= 4; i--) buf&lsqb;i&rsqb; = 0;
! 		}
! 	        if (pc-&gt;c&lsqb;0&rsqb; == INQUIRY)
! 	                buf&lsqb;2&rsqb; |= 2;
!         }
  }
  
  static inline void idescsi_free_bh (struct buffer_head *bh)
--------- ここまで -----------
</programlisting>
</para>
</sect1>

<sect1 id="advanced">
<title>上級編</title>
<para>
起動時に出力されるPDドライブの Vender と Model を drivers/scsi/scsi.c
のブラックリストに登録すれば、通常は Probe all LUNs が必要な機種で
も OFF にしてもよくなることがわかりました。
</para><para>
うちの機械の場合は、
</para><para>
<programlisting>
*** scsi.c.bak	Fri Jan 29 08:28:58 1999
--- scsi.c	Fri Jan 29 08:28:58 1999
***************
*** 280,285 ****
--- 280,286 ----
  {"IOMEGA","Io20S         *F","*", BLIST_KEY},
  {"INSITE","Floptical   F*8I","*", BLIST_KEY},
  {"INSITE","I325VM","*", BLIST_KEY},
+ {"NEC","PD-1 ODX654P","*", BLIST_FORCELUN | BLIST_SINGLELUN},
  {"NRC","MBR-7","*", BLIST_FORCELUN | BLIST_SINGLELUN},
  {"NRC","MBR-7.4","*", BLIST_FORCELUN | BLIST_SINGLELUN},
  {"REGAL","CDC-4X","*", BLIST_MAX5LUN | BLIST_SINGLELUN},
</programlisting>
</para><para>
と、してます。たった 1 行の追加でいいとは楽ですね。ただしこの結果、
PD の CD が /dev/scd1 にわりふられるようになってしまった(こっちのほう
がまともな動作ですが)ので、fstab の変更が必要でした。なお、この情
報は kernel-ML のアーカイブで得ました。
</para><para>
もしあなたが他のメーカーのものをお使いでも、dmesg して
</para><para>
<screen>
  hdc: NEC PD-1 ODX654P, ATAPI CDROM drive - enabling SCSI emulation
</screen>
</para><para>
などとなってるところを見て、Vender と Model を置き換えてやるだけで
おんなじようにうまくいくんではないかと思います(この手でうまくいっ
たかたは教えてください)。
</para><para>
しかし Probe All LUNs しなくてよくなるといっても、実際は別にいいこ
とはなにもないのですが、なにしろこのほうが気持ちいいですね。
</para><para>
ちなみに 2.2.<sgmltag>[</sgmltag>01<sgmltag>]</sgmltag> では ide-scsi.c が
とても buggy なので、ATAPI-PD 
を使う限りは乗り換えをしばらく控えたほうが無難です。SCSI-emulattion
を on にして Probe All LUNs を on にすると、PD を認識しようとするあたり
でコケます。かといって、Probe All LUNs を OFF にして、scsi.c に上記
の一行を追加するとこれまたコケますので処置なしです。もしうまくい
ってるかたがいらっしゃいましたら御一報ください。
</para>
</sect1>

<sect1 id="misc">
<title>その他</title>
<para>
この文書及び添付された patch は無保証です。トラブルが起こっても私
は責任がとれませんので、ご自分の責任で使用してください。
間違いの指摘、感想などは大歓迎です。
</para><para>
Minori TAKAGAKI &lt;takagaki@aurora.dti.ne.jp&gt; 様からは有益なコメン
トをいただきました。ありがとうございました。
</para><para>
再配布については GPL に従います。
</para>
<para>

<simplelist>
<member>
(LinuxDoc 変換：2000/05/12 中野武雄)
</member><member>
(DocBook 変換：2001/03/03 千旦裕司)
</member>
</simplelist>
</para>
</sect1>

</article>
