<!doctype linuxdoctr system>

<article>

<title>Linux SCSI HOWTO
<author>Drew Eckhardt, <htmlurl url="mailto:drew@PoohSticks.ORG"
name="&lt;drew@PoohSticks.ORG&gt;"><newline>
(linuxdoc-sgml への変換は Dieter Faulbaum <htmlurl
url="mailto:faulbaum@bii.bessy.de"
name="&lt;faulbaum@bii.bessy.de&gt;">)
<date>v2.30, 30 August 1996
<trans>日本語への翻訳、および SGML タグの打ち直し<newline>
水原 文 <htmlurl url="mailto:mizuhara@acm.org"
name="&lt;mizuhara@acm.org&gt;"> (1〜4章、6〜7章、10章〜11章担当)
<newline>
中野 武雄 <htmlurl url="mailto:nakano@apm.seikei.ac.jp"
name="&lt;nakano@apm.seikei.ac.jp&gt;"> (5章・8章〜9章担当)
<newline>
1997年4月7日

<p>
<bf>注意: この文書はかなり以前に書かれたものなので、
いまどきの Linux 環境にはあてはまらない箇所があります。
(JF Project)</bf>
</p>

<!-- Table of contents -->
<toc>

<!-- Begin of document -->

<sect> はじめに
<p>

この文書はフリーです。再配布、変更は Free Software Foundation 
発行の GNU General Public License (バージョン2またはそれ以降)に
したがって行うことができます。

この文書は有用であることを目指して配布されていますが、何の保証もありません。
商用性、あるいは特定の目的への適合性は暗黙にも保証されていません。
詳細については、GNU General Public Licence を参照してください。

GNU General Public Licence は、この文書に付随して配布されているはずです。
もし付随していなかった場合には、 Free Software Foundation, Inc., 
675 Mass Ave, Cambridge, MA 02139, USA. まで連絡してください。

もしこの文書を出版する場合には、最新のバージョンに関して筆者 <htmlurl
url="mailto:drew@PoohSticks.ORG"
name="&lt;drew@PoohSticks.ORG&gt;"> に問い合わせてくださるよう
お願いします。
もし古いバージョンが出版されてしまうと、私は新しいバージョンに答えが
載っている質問をユーザーから受けることになりますし、それは出版する側
にもうれしくないことだろうと思うのです。
また、フリー配布を行っているサイトや、競合するパッケージや製品に関する
記述を改変しないようにお願いします。

<descrip>
<tag/重要:/
<bf><ref id="BugReport" name="バグレポート"> セクションに記述された手順に
従わないバグレポートや問い合わせは無視されます。</bf>
</descrip>

この文書は、Linux カーネル 1.2.10 およびそれ以降のアルファコードに
実装された Linux の SCSI サブシステムについて説明しています。
これ以前のリビジョンの SCSI コードは<bf/サポートされていません/し、
実装されているドライバや性能、利用できるオプションなどに関して大きく
異なっていることがあります。

linux-scsi メーリングリストに参加すれば、より詳しい情報を得ることが
できます。
参加するには、本文に以下のように書いて、<htmlurl
url="mailto:majordomo@vger.rutgers.edu"
name="majordomo@vger.rutgers.edu"> に
メールを送ってください。

<tscreen><verb>
subscribe linux-scsi
</verb></tscreen>

メーリングリストから脱退するには、本文に以下のように書いて、同じアドレスへ
メールを送ってください。
	
<tscreen><verb>
unsubscribe linux-scsi 
</verb></tscreen>

メーリングリストに参加すると、以下のアドレスにメールが送れるようになります。

<tscreen><verb>
linux-scsi@vger.rutgers.edu
</verb></tscreen>

この文書はあまりユーザーフレンドリーではありませんし、不正確な
記述や、書き落としていることもあるでしょう。
これらの問題を解決するために何か建設的なコメントがあれば、
私にメールしてください。


<sect> よくある問題
<p>
このセクションでは、よくある問題について説明します。
ここに質問の答えが見つからなかったら、お使いのホストアダプタや
デバイスのセクションも調べて見てください。

<sect1> 不安定なシステム <label id="Flakiness">
<p>
再現性のないエラーが発生する場合、ケーブルや終端に問題がある
ことが多いのです。

最近の NCR チップを採用した製品などには、ディジタルフィルタリングや
アクティブシグナルネゲーションなどの機能を持っているものがあり、
これらはケーブルにはそれほど敏感ではありません。

例えば Adaptec の 154xC や 154xCF、それに 274x など、それ以外の
製品はケーブルに<bf/非常に/敏感で、他のシステムでは問題なく動作する
ケーブルでも動かないことがあります。

もう一度繰り返します。一部のホストアダプタはケーブルやターミネーターの
問題に<bf/非常に/敏感なので、問題が起こった時にはまずケーブルや
ターミネーターを調べてみてください。

問題を最小限にするため、以下のようなケーブルを使うべきです。
<enum>
<item> SCSI-II 準拠をうたっていること。
<item> 特性インピーダンスが 132 オームであること。
<item> インピーダンスの不整合を避けるために、すべてのケーブルを
同じメーカーのもので揃えること。
<item> アンフェノールなどの有名メーカーの製品であること。
</enum>
<quote>
訳注: SCSI-2 規格では、同期転送を行なう場合のケーブルのインピーダンスは
90オームから132オームと規定されています。
SCSI-2 規格は <url
url="ftp://ftp.symbios.com/pub/standards/io/x3t10/drafts/scsi2/"> に
あります。
</quote>

ターミネータが接続されるケーブルの両端に十分な電力を供給するため、
ターミネータパワーは SCSI バス上の<bf/すべての/デバイスから
電流の逆流を防止するダイオードを通して供給されなくてはなりません。
バスが短絡された場合の損傷を防ぐため、TERMPWR はヒューズなどの
電流制限デバイスを通して供給されなければなりません。
<quote>
訳注: SCSI-2 規格では、すべてのイニシエータデバイスは
ターミネーターパワーを供給しなければならないと規定されていますが、
ターゲットデバイスは供給しなくてもよいことになっています。
</quote>

複数のデバイスや外部ケーブル、あるいは FAST SCSI 2 を使用する場合には、
SCSI バスの両端にアクティブターミネータを使う必要があります。

アクティブターミネータについての詳しい情報は、
Comp.Periphs.Scsi の FAQ (<url
url="ftp://tsx-11.mit.edu" name="tsx-11">  の pub/linux/ALPHA/scsi に
あります) を参照してください。

<sect1> カーネルコマンドライン
<p>
この文書の中で「カーネルコマンドライン」について言及することがあります。

カーネルコマンドラインとは、<tt/LILO :/ プロンプトに対してイメージ名の後に、
あるいは LILO 設定ファイルの <tt/append/ フィールドに指定するオプション群の
ことです。
LILO 設定ファイルは LILO .14 以降では <tt>/etc/lilo.conf</tt>、
それ以前のバージョンでは <tt>/etc/lilo/config</tt> にあります。

プロンプトを表示させるには、LILO でブートし、起動中に
Alt か Ctrl、または Shift キーのいずれかを押して下さい。
以下のプロンプトが表示されます。

<tscreen><verb>
:
</verb></tscreen>

ここで、ブートするカーネルイメージを選択します。また次のように ? を
入力すると、カーネルイメージのリストが表示されます。

<tscreen><verb>
:?

ramdisk floppy harddisk
</verb></tscreen>

選択したコマンドラインオプションでカーネルをブートするには、
カーネル名の後にオプションのリストをスペースで区切って入力し、
最後にリターンキーを押せば良いのです。

オプションは以下の形式で指定します。

<tscreen><verb>
variable=valuelist
</verb></tscreen>

<tt/valuelist/ は単一の値、あるいはスペースを含まない値のリストを
コンマで区切ったものです。ルートデバイスは例外ですが、それ以外の
値は10進または16進で指定する数値です。

例えば、ブート時に認識されない Adaptec 1520 のクローンを持った
システムで Linux をブートするには次のようにします。

<tscreen><verb>
:floppy aha152x=0x340,11,7,1
</verb></tscreen>

ブート時にこれらの値を入力するのが面倒ならば、次の例のように、
LILO 設定ファイルの <tt/append/ オプションに指定することも
可能です (LILO .13 以降が必要です)。

<tscreen><verb>
append="aha152x=0x340,11,7,1"
</verb></tscreen>

<sect1> SCSI デバイスがすべての ID に反応する
<p>
この現象は、そのデバイスがコントローラと同じ ID を持っていることが
原因です。(コントローラの ID は普通は 7 ですが、ボードによっては
違う ID を使っている場合があります。
例えば Future Domain のボードには 6 を使っているものがあります。)

ジャンパーの設定を変更してください。

<sect1> SCSI デバイスがすべての LUN に反応する
<p>
そのデバイスのファームウェアがバグっています。

暫定的な解決方法として、以下のカーネルコマンドラインオプションを
試してみてください。

<tscreen><verb>
max_scsi_luns=1
</verb></tscreen>

これでうまくいったら、カーネルソースの <tt>drivers/scsi/scsi.c</tt> の
<tt/blacklist/ 変数にある、バグありデバイスのリストに
そのデバイスを追加し、その情報を Linus Torvalds
<htmlurl url="mailto:Linus.Torvalds@cs.Helsinki.FI"
name="&lt;Linus.Torvalds@cs.Helsinki.FI&gt;"> に
メールして下さい。

<sect1> エラーフリーのはずのデバイスにセンスエラーが起こる
<p>
この問題は、質の悪いケーブルや不適当なターミネータによって引き起こされる
ことがあります。

<ref id="Flakiness" name="不安定なシステム"> を参照してください。

<sect1> ネットワーク機能を組み込んだカーネルが動かない
<p>
多くのネットワークドライバの自動検出ルーチンはレジスタへの書き込みを
行なうため、SCSI ドライバの動作と干渉することがあります。

<sect1> デバイスは検出されるが、アクセスできない
<p>
カーネルによって SCSI デバイスは検出されるが、アクセスすることが
できない。
<tt>mkfs /dev/sdc</tt> とか <tt>tar xvf /dev/rst2</tt> などの
コマンドが失敗する。

そのデバイスに対するスペシャルファイルが <tt>/dev</tt> にないのでしょう。

Unix のデバイスにはブロックデバイスとキャラクタデバイスの区別があり、
それぞれのデバイスはメジャーデバイス番号とマイナーデバイス番号で区別
されます。
ブロックデバイスはバッファキャッシュを通してアクセスされますが、
キャラクタデバイスはバッファキャッシュを通さずにアクセスされます。
メジャーデバイス番号は、使用されるドライバを表します。
例えばメジャー番号 8 のブロックデバイスは SCSI ディスクを表します。
マイナーデバイス番号は、そのドライバを通してどのユニットがアクセス
されるかを表します。例えばメジャー番号 4、マイナー番号 0 の
キャラクタデバイスは最初の仮想コンソールを表し、マイナー番号 1 は次の
仮想コンソールを表す、といった具合です。
しかし、この方法でデバイスをアクセスすることは、「すべてはファイルと
して表現される」という Unix/Linux のメタファにそぐわないため、
キャラクタデバイスとブロックデバイスのスペシャルファイル
が <tt>/dev</tt> の下に作成されており、例えば3番目の SCSI ディスク
は <tt>/dev/sdc</tt>、最初のシリアルポートは <tt>/dev/ttyS0</tt> として
アクセスできるようになっています。

スペシャルファイルを作成するには、<tt/MAKEDEV/ スクリプトを使うのが
普通です。<tt>/dev</tt> に <tt/cd/ し、作成したいデバイスを指定して
次のように <tt/MAKEDEV/ を実行して下さい (root で)。

<tscreen><verb>
 ./MAKEDEV sdc
</verb></tscreen>

<quote>
訳注: パッケージによっては <tt/MAKEDEV/ はスクリプトではなく、バイナリ
コードになっている場合もあります。
</quote>

ワイルドカードも使える「はず」です。

<tscreen><verb>
 ./MAKEDEV sd\*
</verb></tscreen>

これによってすべての SCSI ディスクデバイスが作成される「はず」
(<tt>/dev/sda</tt> から <tt>/dev/sdp</tt> までと、それぞれに対して
15個のパーティションが作成されるはず) です。

<tscreen><verb>
 ./MAKEDEV sdc\*
</verb></tscreen>

これによって <tt>/dev/sdc</tt> 自身と <tt>/dev/sdc</tt> 上の15個の
パーティションすべてが作成される「はず」です。

カギカッコつきで「はず」といったのは、これが標準的な Unix の振舞い
だからです。インストールされている <tt/MAKEDEV/ スクリプトがこのように
振舞うとは限りませんし、作成するデバイスの数が制限されているかもしれません。

<tt/MAKEDEV/ では望む結果が得られない場合、<tt/mknod/ コマンドを使って
手動でデバイスファイルを作成する必要があります。

各種 SCSI デバイスのデバイス種別 (ブロックデバイスかキャラクタデバイスか)、
メジャーデバイス番号、マイナーデバイス番号は <ref id="DevFiles"
name="デバイスファイル"> に示してあります。

<tt/mknod/ コマンドの書式は次の通りです。
root で実行して下さい。

<tscreen><verb>
mknod /dev/device b|c major minor
</verb></tscreen>

以下は実行例です。

<tscreen><verb>
mknod /dev/sdc b 8 32
mknod /dev/rst0 c 9 0
</verb></tscreen>

<sect1> SCSI システムがロックアップする <label id="SCSISysLockups">
<p>
ここに書かれている情報はごく限られたものです。
使用しているホストアダプタの項も参照してください。
ここに書かれている以外の解決法が書かれているかもしれません。

複数のデバイスが同時にアクセスされる時にロックアップすると思われる
場合には、デバイスのメーカーに連絡して、ファームウェアをバージョン
アップすることで問題が解決できないか聞いてみるのがいいでしょう。
可能な場合には、SCSI ケーブルを換えてみたり、別のシステムで試して
みてください。
また、ディスクのバッドブロックや、マザーボードの DMA 処理 (DMA を
行なうホストアダプタの場合) が原因となっていることも考えられます。
この種の問題には、他にも多くの原因が考えられます。

同一バス上の複数のデバイスが同時にアクセスされる時にロックアップする
と思われる場合もあります。
同時に複数のコマンド処理を行なえるホストアダプタを使用している場合、
この値を 1 に減らして様子を見てください。バス上に低速のテープドライブ
や CDROM がある場合、これは現実的な解決とはならないでしょう。

<sect1> カーネルの設定と再構築 <label id="KernelConfig">
<p>
カーネルメモリはページングされないので、
使用しない SCSI ドライバは貴重なメモリを消費してしまい、
小さなシステムではメモリ不足の悪化にもつながります。

したがって、使用するシステム向けにチューンアップしたカーネルを
構築し、必要なドライバだけがインストールされるようにします。

<tscreen><verb>
cd /usr/src/linux
</verb></tscreen>

現在とは違うルートデバイス、あるいは 80x25 VGA 以外の
ディスプレイを使いたい場合で、ブートフロッピーに書き込みを
行なう場合には、<tt/makefile/ を編集して

<tscreen><verb>
ROOT_DEV =
</verb></tscreen>

および

<tscreen><verb>
SVGA_MODE =
</verb></tscreen>

以上の行にルートデバイスあるいはディスプレイの指定を行ないます。

パッチを当てた場合、すべてのファイルが再構築されるようにしたい場合が
あります。そのためには以下のように入力します。

<tscreen><verb>
make mrproper
</verb></tscreen>

<tt/mrproper/ の結果がどうであれ、

<tscreen><verb>
make config
</verb></tscreen>

として、コンフィギュレーションに関する質問に答えて下さい。それから

<tscreen><verb>
make depend
</verb></tscreen>

を実行し、最後に

<tscreen><verb>
make
</verb></tscreen>

を実行します。終了したら、<tt/lilo/ を設定し直すか、以下のようにして
ブートフロッピーの作成を行ないます。

<tscreen><verb>
make zdisk
</verb></tscreen>

<sect1> 0 以外の LUN が使えない <label id="LunsNot0">
<p>
SCSI デバイスにはまともに LUN をサポートしていないものが多く、
0 以外の LUN にアクセスしようとしたとき SCSI バスを
ロックさせるなどの悪さをします。

そのため、最近の Linux カーネルはデフォルトでは 0 以外の LUN を
見に行かないようになっています。0 以外の LUN を使うためには、
<tt/max_scsi_luns command/ コマンドラインオプションを使うか、
<tt/CONFIG_SCSI_MULTI_LUN/ オプションを指定してカーネルを再
コンパイルする必要があります。

普通は LILO コマンドラインに以下のように指定すればいいはずです。

<tscreen><verb>
max_scsi_luns=8
</verb></tscreen>

この変更を行なっても、マルチ LUN デバイスが正しく検出されないことが
あります (SCSI から MFM、RLL、ESDI、SMD などへのブリッジボードに多く
みられます)。
これは <tt>drivers/scsi/scsi.c</tt> 中の <tt/scan_scsis()/ にある、
以下のコードのせいです。

<tscreen><verb>
/* Some scsi-1 peripherals do not handle lun != 0.                
   I am assuming that scsi-2 peripherals do better */
if((scsi_result[2] & 0x07) == 1 &&                    
   (scsi_result[3] & 0x0f) == 0) break;                    
</verb></tscreen>

このコードを削除すれば、うまく行くはずです。

<sect> バグレポート <label id="BugReport">
<p>
Linux の SCSI 開発者たちは、古いコードを取っておいているとは限りません。
したがって、リリースされた最新の Linux カーネル以外では (MCC、SLS、
Yggdrasil などのパッケージは最新カーネルから1つから12個も古い場合が
あります) 問題解決が不可能な場合があります。
ですから、バグレポートを送る前に、リリースされた最新のカーネルでも
その問題が起こるかどうか確かめて下さい。

カーネルをバージョンアップした後でも、またこの文書をよく読んだ後でも、
まだバグが存在すると信じられる場合には、Linux メーリング
リストの SCSI チャネルにバグレポートを送ってください。
ここには Linux SCSI ドライバの作成に協力している多くの人々が参加しています。

バグレポートには、
ハードウェア構成、ブート時に Linux が表示する正確なメッセージ、
エラーが発生する場合、それにエラーが存在するソースコードの位置
など、なるべく多くの情報を書いてください。
<ref id="CaptureMessages" name="メッセージの取得">
や
<ref id="PanicSource" name="<tt>panic()</tt> の位置を特定する">
に記述されている手続きに従ってください。

最大限の情報が提供されないと、開発者が問題を誤って診断したり、
他の問題を修正することがより重要だと判断することになってしまうかも
しれません。

要するに、我々がバグを再現させることができない場合、
どこがおかしいのかを具体的に指摘してくれなければ、
バグを修正することはできないということです。

<sect1> メッセージの取得 <label id="CaptureMessages">
<p>

カーネルメッセージロギングシステムを実行していない場合:

<tt>/proc</tt> ファイルシステムがマウントされていることを確かめて
ください。

<tscreen><verb>
grep proc /etc/mtab
</verb></tscreen>

<tt>/proc</tt> ファイルシステムがマウントされていなければ、マウント
してください。

<tscreen><verb>
mkdir /proc
chmod 755 /proc
mount -t proc /proc /proc
</verb></tscreen>

カーネルのバージョンとメッセージをログファイルにコピーします。

<tscreen><verb>
cat /proc/version > /tmp/log
cat /proc/kmsg >> /tmp/log
</verb></tscreen>

1秒から2秒後に CNTRL-C を打ってください。

ロギングシステムを実行している場合、適当なログファイル (ログファイルの
情報は <tt>/etc/syslog.conf</tt> にあります) を覗くか、
<tt/dmesg/ コマンドを使用してください。

Linux が起動していない場合、DOS 上でフロッピーディスクをフォーマット
してください。RAM ドライブではなく、ルートディスケットを直接マウント
するパッケージを使っている場合には、ルートとしてマウントされるドライブ
以外で読み書き可能なディスケットを用意するか、
<tt/ramdisk/ ブートオプションの使用が必要であることに
注意して下さい。

Linux をパッケージのブートフロッピーからブートします。できればシングル
ユーザモードで RAM ドライブをルートとしてマウントしてください。そして、

<tscreen><verb>
mkdir /tmp/dos
</verb></tscreen>

とし、さっきフォーマットしたディスケットを挿入し、マウントしてください。

<tscreen><verb>
mount -t msdos /dev/fd0 /tmp/dos
</verb></tscreen>

あるいは

<tscreen><verb>
mount -t msdos /dev/fd1 /tmp/dos
</verb></tscreen>

とします。

ログファイルをフロッピーにコピーします。
    	
<tscreen><verb>
cp /tmp/log /tmp/dos/log
</verb></tscreen>

DOS フロッピーをアンマウントします。

<tscreen><verb>
umount /tmp/dos
</verb></tscreen>

そして Linux をシャットダウンします。

<tscreen><verb>
shutdown now
</verb></tscreen>
<!-- ここ、原文では shutdown だけになっていたんですが、間違いですよね。-->

リブートして DOS を起動し、好みの通信ソフトを使ってログファイルを
メールしてください。

<sect1> <tt/panic()/ の位置を特定する <label id="PanicSource">
<p>
他の Unix と同じように、Linux は致命的なエラーが生じるとカーネルの
<tt/panic()/ 関数を呼び出します。他の Unix とは違って、Linux は
コアをスワップあるいはダンプデバイスにダンプして自動的にリブート
することはありません。その代わり、ユーザが手で書き写すことができる
ように有用なステート情報のサマリが表示されます。

<tscreen><verb>
Unable to handle kernel NULL pointer dereference at virtual address c0000004
current->tss,cr3 = 00101000, %cr3 = 00101000
*pde = 00102027
*pte = 00000027
Oops: 0000
EIP:    0010:0019c905
EFLAGS: 00010002
eax: 0000000a   ebx: 001cd0e8   ecx: 00000006   edx: 000003d5
esi: 001cd0a8   edi: 00000000   ebp: 00000000   esp: 001a18c0
ds: 0018   es: 0018   fs: 002b   gs: 002b   ss: 0018
Process swapper (pid: 0, process nr: 0, stackpage=001a09c8)
Stack: 0019c5c6 00000000 0019c5b2 00000000 0019c5a5 001cd0a8 00000002 00000000
       001cd0e8 001cd0a8 00000000 001cdb38 001cdb00 00000000 001ce284 0019d001
       001cd004 0000e800 fbfff000 0019d051 001cd0a8 00000000 001a29f4 00800000
Call Trace: 0019c5c6 0019c5b2 0018c5a5 0019d001 0019d051 00111508 00111502
	    0011e800 0011154d 00110f63 0010e2b3 0010ef55 0010ddb7
Code: 8b 57 04 52 68 d2 c5 19 00 e8 cd a0 f7 ff 83 c4 20 8b 4f 04
Aiee, killing interrupt handler
kfree of non-kmalloced memory: 001a29c0, next= 00000000, order=0
task[0] (swapper) killed: unable to recover
Kernel panic: Trying to free up swapper memory space
In swapper task - not syncing
</verb></tscreen>

EIP: 行の16進数 (この場合 19c905) を書き留め、
<tt>/usr/src/linux/zSystem.map</tt> を探してこのアドレス以下で最も大きな
数字を見つけてください。

<tscreen><verb>
0019a000 T _fix_pointers
0019c700 t _intr_scsi
0019d000 t _NCR53c7x0_intr
</verb></tscreen>

これによってどの関数を実行中に <tt/panic()/ が呼ばれたかが分かります。
この関数を含むソースファイルをデバッグオプションつきでコンパイルし直すか、
<tt>/usr/src/linux/Makefile</tt> を編集して <tt/-g/ オプションを
<tt/CFLAGS/ の定義に追加してカーネル全体をコンパイルし直してください。

<tscreen><verb>
#
# standard CFLAGS
#
</verb></tscreen>

つまり、次の行を

<tscreen><verb>
CFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe
</verb></tscreen>

このように変更します。

<tscreen><verb>
CFLAGS = -g -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe
</verb></tscreen>

カーネルを再構築します。

<tscreen><verb>
make clean
make
</verb></tscreen>

<tt>/etc/lilo.conf</tt> にエントリを作成してカーネルをブートできるように
します。

<tscreen><verb>
image = /usr/src/linux/zImage
label = experimental
</verb></tscreen>

そして root で LILO を再実行するか、ブートフロッピーを作成します。

<tscreen><verb>
make zImage 
</verb></tscreen>

リブートし、エラー発生時の EIP を記録します。

<tt/script/ がインストールされている場合、これを起動して
以下のデバッグの記録をタイプスクリプトファイルに記録して
おくのが良いでしょう。

次のように <tt/gdb/ を実行します。

<tscreen><verb>
gdb /usr/src/linux/tools/zSystem
</verb></tscreen>

そして次のように入力します。

<tscreen><verb>
info line *<your EIP>
</verb></tscreen>

例えば以下のように。

<tscreen><verb>
info line *0x19c905
</verb></tscreen>

これに対して <tt/gdb/ は次のような情報を出力します。

<tscreen><verb>
(gdb) info line *0x19c905
Line 2855 of "53c7,8xx.c" starts at address 0x19c905 <intr_scsi+641&>
   and ends at 0x19c913 <intr_scsi+655>.
</verb></tscreen>

この情報を記録して下さい。それから以下のように入力します。

<tscreen><verb>
list <line number>
</verb></tscreen>

次のような出力が得られるでしょう。

<tscreen><verb>
(gdb) list 2855
2850    /*      printk("scsi&percnt;d : target &percnt;d lun &percnt;d unexpected disconnect\n",
2851                host->host_no, cmd->cmd->target, cmd->cmd->lun); */
2852            printk("host : 0x&percnt;x\n", (unsigned) host);
2853            printk("host->host_no : %d\n", host->host_no);
2854            printk("cmd : 0x%x\n", (unsigned) cmd);
2855            printk("cmd->cmd : 0x%x\n", (unsigned) cmd->cmd);
2856            printk("cmd->cmd->target : %d\n", cmd->cmd->target);
2857            if (cmd) {;
2858                abnormal_finished(cmd, DID_ERROR << 16);
2859            }
2860            hostdata->dsp = hostdata->script + hostdata->E_schedule / 
2861                sizeof(long);
2862            hostdata->dsp_changed = 1;
2863        /* SCSI PARITY error */
2864        } 
2865
2866        if (sstat0_sist0 & SSTAT0_PAR) {
2867            fatal = 1;
2868            if (cmd && cmd->cmd) {
2869                printk("scsi%d : target %d lun %d parity error.\n",
</verb></tscreen>

<tt/quit/ と入力して <tt/gdb/ から抜けます。

上の情報も記録してください。開発者のカーネルがあなたのカーネルと違って
いる場合に役立つコンテキスト情報が得られます。

<sect> カーネルモジュール
<p>
ここでは、ローダブルカーネルモジュールのサポート状況と SCSI との関係に
ついて説明します。

<sect1> 一般的な情報
<p>
ローダブルモジュールは、ユーザーやシステム管理者がカーネルのメモリーに
ファイルをロードして、カーネルの能力を拡張することを可能にするものです。
ローダブルモジュールはハードウェアをサポートするドライバや、ファイル
システムをロードするためによく使われます。

SCSI にとってモジュールはいくつかの利点があります。
ひとつは、多数のマシンを管理するシステム管理者が、すべてのマシンに
対して唯一のカーネルイメージを使用し、マシン特有のハードウェアを
サポートするためにはカーネルモジュールをロードするといった使い方が
できることです。

配布パッケージの作成者が、どのモジュールをロードするか問い合わせる
スクリプトをブートフロッピー上に用意することもできます。
こうすれば、使われないドライバのためにメモリを浪費することはなくな
りますし、存在しないハードウェアを検出しに行って他のハードウェアを
おかしくしてしまう可能性も減らすことができます。

モジュールはラップトップコンピュータにも適しています。ラップトップ
コンピュータはデスクトップマシンよりもメモリが少ないことが多く、
なるべくカーネルイメージを小さくして、必要に応じてモジュールをロード
することができるからです。
また、モジュールによって PCMCIA SCSI カードのサポートも簡単になります。
カードが挿入/抜出される時にドライバをロード/アンロードできるからです。
&lsqb; 注意: 現在のところ、PCMCIA をサポートしているのは qlogic と 152x の
ドライバです。&rsqb;

最後に、カーネル開発者にとってドライバのデバッグやテストが簡単になるという
利点もあります。新しいドライバのテストのために、マシンをリブートする必要が
ないからです (もちろん、ドライバのバグによってマシンがクラッシュしてしまう
ことがなければ、の話ですが)。

モジュールには数々の利点がありますが、大きな制限もあります。
ルートディスクパーティションが SCSI デバイス上にある場合、ディスク
アクセスに必要な SCSI ドライバをモジュールとしてロードすることは
できません。
これは、システムがディスクからモジュールをロードする前に、ルート
パーティションをマウントしなければならないからです。
ローダとカーネルを変更して、カーネルがルートファイルシステムをマウント
する前にモジュールをロードできるようにしようと考えている人々がいます
から、将来はこの制限もなくなることでしょう。

<sect1> カーネル 1.2.N でのモジュールのサポート <label id="modules-1.2">
<p>

1.2.N シリーズのカーネルでは、SCSI カーネルモジュールは部分的に
サポートされています。ハイレベル (ディスク、テープなど) のドライバは
モジュールとして使用することはできませんが、ローレベル (1542、1522 など) 
のドライバは必要に応じてロード/アンロードすることができます。
ローレベルのドライバはロードされるたびに、まずそのドライバがサポート
しているカードを探しに行きます。次に、見つかったカードそれぞれに対して、
SCSI バスがスキャンされ、内部データ構造がセットアップされて、デバイスが
使用できるようになります。

使わなくなったローレベルドライバは、アンロードすることができます。
マウント中のファイルシステムやオープン中のファイルなどについて使用中
カウンタが保持されているため、ドライバが管理しているデバイスを使って
いる間は <tt/rmmod/ ユーティリティがデバイスが使用中であるという警告
を発し、ドライバはアンロードできないことに注意してください。
ドライバがアンロードされると、関連するデータ構造はすべて開放され、
システムはモジュールがロードされる前の状態に戻ります。
これは、ドライバはその後必要に応じて再びロードできるということを意味します。

<sect1> カーネル 1.3.N でのモジュールのサポート
<p>
1.3 シリーズのカーネルでは、SCSI ドライバは完全にモジュール化されています。
つまり、まったく SCSI をサポートしていないカーネルでブートした後に
モジュールをロードすることによって SCSI をフルサポートすることもできる
ということです。

お望みならば、SCSI ドライバの一部分をカーネルに組み込んでコンパイルし、
その他の部分を後でロードすることもできます。どの部分を実行時にロードするか、
どの部分をカーネルに直接リンクするかは、自由に選択することができます。

まったく SCSI をサポートしていないカーネルでブートした場合、まず 
SCSI コアをカーネルにロードする必要があります。
これは <tt/scsi_mod/ という名前のモジュールになっています。
このモジュールをカーネルメモリにロードするまでは、これ以外の SCSI 
モジュールをロードすることはできません。
このモジュールにはローレベルドライバは含まれていませんから、
このモジュールをロードしても SCSI バスはスキャンされませんし、
SCSI ディスクやテープが使えるようにもなりません。
カーネルを構築する際 <tt/CONFIG_SCSI/ に「y」と答えたのであれば、
このモジュールをロードする必要はありません。

この後は、あまり順番を気にせずに必要な機能を実現するモジュールを
ロードすることができます。使用中のモジュールがアンロードされて
しまうことを防ぐために、使用中カウンタによるインターロックがかかって
いるので、モジュールがビジーの場合には <tt/rmmod/ からメッセージが
出力されます。

ディスク、CDROM、テープ、それに SCSI 汎用のハイレベルドライバは、
それぞれ「sd_mod」、「sr_mod」、「st」、「sg」という名前になっています。
ハイレベルドライバがロードされると、接続されたすべてのホストアダプタの
デバイスリストが調べられ、サポートされているデバイスは自動的に有効に
なります。

ローレベルドライバのモジュールとしての使い方は、
<ref id="modules-1.2" name="カーネル 1.2 でのモジュールのサポート">
を参照してください。
ローレベルドライバがロードされると、バスがスキャンされ、見つかった
デバイスはハイレベルドライバによってサポートされているデバイスとして
認識できるかどうか調べられます。認識されたドライバは自動的にアタッチ
され、活性化されます。

<sect>ホストアダプタ
<p>
この章では Linux でサポートされている各種のホストアダプタに対して、
それぞれのホストアダプタに固有の情報を示します。

<sect1>サポートされている／いないハードウェア
<p>

<sect2>配布カーネルに含まれているドライバ<p>

Adaptec 152x、Adaptec 154x (DTC 329x のボードも動くようですが、サポー
トの対象にはなっていません)、
Adaptec 174x、Adaptec 274x/284x (294x を利用するには新しいバージョンの
ドライバが必要です)、
BusLogic MultiMaster ホストアダプタ、EATA-DMA および EATA-PIO プロトコルを
使うボード (DPT PM2001、PM2011、PM2012A、PM2012B、PM2021、PM2022、PM2024、
PM2122、PM2124、PM2322、PM2041、PM2042、PM2044、PM2142、PM2144、PM2322、
PM3021、PM3122、PM3222、PM3224、PM3334、
それに加えて NEC、AT&amp;T、SNI、AST、Olivetti、および Alphatronix などの
メーカーのボードのいくつか)、
Future Domain 850、885、950、および同社の他のシリーズ 
(ただし 840、841、880、881 のボードは適当なパッチを当てないと動作しま
せん)、
Future Domain 16x0 (チップが TMC-1800、TMC-18C30、または TMC-18C50 のもの)、
NCR53c8xx、PAS16 の SCSI ポート、Seagate ST0x、
Trantor の T128/T130/T228 ボード、
Ultrastor 14F、24F および 34F、Western Digital 7000。

<sect2>MCA<p>

MCA のカードのうち、上にあるサポートされているカードと互換性のあるもの
(つまり Adaptec 1640 と BusLogic 640) は動作します。

<sect2>アルファ版のドライバ<p>

アルファ版のドライバの多くが以下のサイトに置かれています。

<tscreen>
<url url="ftp://tsx-11.mit.edu/pub/linux/ALPHA/scsi">
</tscreen>

<sect2>修正をすれば動作するドライバ<p>

<sect3>NCR53c8x0/7x0<p>

NCR53c8xx のドライバは開発されていますが、このドライバは NCR53c700、
NCR53c710、NCR53c720 のチップに対してそのままでは適用できません。
これらのチップを動作させるには以下のような修正が必要です。
修正の難易度についても示しています。
<quote>
訳注: カーネル 2.0.27 では、すでにこれらのチップはサポートされて
いるようです。
</quote>

<descrip>
<tag/NCR53c720 (簡単)/
カードの検出部分の変更、初期化の変更、'810 のレジスタアドレスを '7xx 
用にマッピングするためのコードの変更。
<tag/NCR53c710 (簡単)/
カードの検出部分の変更、初期化の変更 (以上はアセンブラソースの変更)、'810 
のレジスタアドレスを '7xx にマッピングするためのコードの変更、IID 割り
込みを扱うための割り込みハンドラを INTFLY 命令からそのエミュレーション
に変更。

<tag/NCR53c700, NCR53c700-66 (非常に困難)/
検出部分の変更、初期化の変更、 NCR のコードを DSA を使わないように変更、 
Linux 本体のコードを変更し、コンテキストスイッチを扱えるようにする。
</descrip>

<sect2>多分動作しない SCSI ホスト<p>

パラレル-&gt;SCSI アダプタ全部、 Rancho の SCSI ボード、ジャンク品の
SCSI カード。 Buslogic の FlashPoint ボード (BT-930/932/950 など) もま
だサポートされていません。

<sect2><em/絶対に/動作しない SCSI ホスト<p>

Adaptec と非互換で NCR53c8xx を使用していない DTC のボード (3270、
3280 など)。CMD の SCSI ボード。

DTC/CMD からプログラムに必要な情報をもらうには、秘密保持契約を結ぶ
必要があります。これはつまり Linux のドライバを書いても、そのドライバ
を公開できない、ということになります。秘密保持契約に従えばソースは
公開できませんから、これは GPL に反します。また GPL に従う場合は
ソースを公開しなければなりませんから、これは秘密保持契約に反する
ことになります。

もしこれら以外のサポートされていないハードウェアを動かしたければ、選択
肢は二つあります。一つはあなた自身がドライバを書くことです (Eric Youngdale 
と私は Linux の SCSI ドライバに関する技術的な質問には通常喜んでお答え
します)。もう一つはドライバの作成を依頼することです (個人での利用の場
合には契約料金が高く付きすぎるでしょうが)。

<sect2>複数のホストアダプタ
<p>

ホストアダプタの中には、一台のシステムで同じ形式のアダプタを
複数使うことができるものがあります (
<ref id="BuyerGuideFeatures" name="購入の手引き: ドライバ機能の比較">
を見てください)。
同じ形式のアダプタを一つのホストで複数使う場合は、通常最も低いアドレス
のものが scsi0 になり、その次が scsi1... のようになります。

種類の違うホストアダプタなら、どんな場合でも複数のアダプタを同時に使う
ことが可能です。ただしアドレスが競合していないことが条件です。 SCSI コ
ントローラは <tt>drivers/scsi/hosts.c</tt> の
中の <tt/builtin_scsi_hosts&lsqb;&rsqb;/
配列の順番で検索されます。現在の順番は以下の通りです。

<tscreen>
BusLogic, Ultrastor 14/34F, Ultrastor 14F,, Adaptec 151x/152x,
Adaptec 154x, Adaptec 174x, AIC7XXX, AM53C974, Future Domain 16x0,
Always IN2000, Generic NCR5380, QLOGIC, PAS16, Seagate,
Trantor T128/T130, NCR53c8xx, EATA-DMA, WD7000, debugging driver.
</tscreen>

ほとんどの場合 (Buslogic と Adaptec のドライバの両方を使っていない場合) 
には、このエントリを入れ替えることで、検索の順番を都合の良いように変え
ることができます。例えば新しい SCSI ホストをシステムに追加したときに、
元からのデバイス名を変更したくない場合などがあるでしょう。

<sect1>よくある問題 <label id="CommonProblems">
<p>

<sect2>SCSI がタイムアウトしてしまう
<p>
割り込みがちゃんと有効になっているか、他のボードとの IRQ、DMA、
IO アドレスなどの競合が起こっていないかを確認してください。

<sect2> BIOS 依存のボード自動検出ルーチンが失敗する
<p>
もしお使いの SCSI アダプタが以下のどれかの場合:
<tscreen>
Adaptec 152x, Adaptec 151x, Adaptec AIC-6260,
Adaptec AIC-6360, Future Domain 1680, Future Domain TMC-950,
Future Domain TMC-8xx, Trantor T128, Trantor T128F, 
Trantor T228F, Seagate ST01, Seagate ST02, Western Digital 7000
</tscreen>

そしてアダプタがブートアップの時に検出されない場合、すなわち

<tscreen><verb>
scsi : 0 hosts
</verb></tscreen>

や

<tscreen><verb>
scsi%d : type
</verb></tscreen>

といったようなメッセージがシステムにインストールされている
(サポート対象の) SCSI アダプタそれぞれに対して表示されない場合は、
自動検出のルーチンがそのボードを知らないために問題が起こっている
ものと考えられます。

BIOS を使って自動検出を行うドライバでは、BIOS が有効になっている必要が
あります。よく調べてください。
またほかの機器の BIOS と競合していないかもチェックしてください。

ボードのシグネチャや BIOS のアドレスがドライバに登録されているものと
違う場合も自動検出は失敗します。
<quote>
訳注: シグネチャとは、BIOS の先頭部分に書き込まれている情報の
ことです。
</quote>

BIOS がインストールされている場合は、DOS と DEBUG を使ってボードの
シグネチャを調べてください。

例えば 0xc8000 にあるボードに対しては、DOS から

<tscreen><verb>
debug
d c800:0
q
</verb></tscreen>

として、結果を ASCII で Linux メーリングリストの SCSI チャネルに送っ
てください。メッセージの長さとベースアドレス (この場合 0xc8000) からの
オフセットも同時に送ってください。メッセージは完全に正確でなければなり
ません。またテキストには 16 進と ASCII の両方が含まれる必要があるでしょ
う。

BIOS がインストールされていない場合、そしてお使いのドライバが Adaptec
152x、 Trantor T128、 Seagate のどれかである場合は、コマンドラインやコ
ンパイル時に検出を強制するように設定を変更することができます。

お持ちの SCSI カードに対応した節をご覧になってください。
<ref id="Flakiness" name="不安定なシステム">
も見てください。

<sect2>メモリマップ方式の I/O を用いたボードの障害
<p>
(Trantor T128 と Seagate のボードが該当します。 Adaptec、
NCR5380 汎用、PAS16、Ultrastor のボードには該当しません。)

この問題は、メモリマップされた I/O ポートが誤ってキャッシュされて
いるときによく起こります。
BIOS 設定で、ボードの占有するアドレス空間をキャッシュ不可に設定して
ください。

これができない場合は、キャッシュを全てオフにしてください。

ボードのアドレスをマニュアルで設定する場合は、Linux に必要なのは 16バイトセ
グメントの値 (マニュアルにはたいていこちらが書いてあります) ではなく、
実際のアドレスであることに注意してください。

つまり 0xc8000 が正しい値であり、 0xc800 では正しく動作しません。後者
では恐らくメモリの内容が破壊されてしまうでしょう。

<sect2> アルファ版のドライバでブートフロッピーを作ってブートさせると
「kernel panic : cannot mount root device」というメッセージ
が出る
<p>

カーネルのバイナリイメージを (フロッピーにコピーする前／した後に) 編集
する必要があります。 2 バイトのフィールド (リトルエンディアンに注意) 
をいくつか修正すれば、お使いのシステムで動くようになります。

<enum>
<item>オフセット 502 バイト目にあるデフォルトのスワップデバイスの指定
を 0x00 0x00 にセットします。

<item>オフセット 504 バイト目にあるラムディスクのサイズはブートフロッ
ピーのサイズ (キロバイト単位) にする必要があります。つまり 5.25 インチ
の場合は 1200、 3.5 インチの場合は 1440 です。 

<tscreen><verb>
バイト表現では以下のようになります。

3.5" : 0xA0 0x05 
5.25" : 0xB0 0x04
</verb></tscreen>

<item>オフセット 508 バイト目にはルートデバイスを設定します。これは 
0x00 0x00 にしておきます (ブートデバイスがルートデバイスとなります)。

</enum>

<tt/dd/ か <tt/rawrite/ を用いてファイルをディスクに書き込んでください。
そのディ
スクを <tt/A:/ のフロッピードライブに入れ、「ルートディスクを入れるように」
というプロンプトが出るのを待って、お使いの配布パッケージのルートフロッ
ピーを入れてください。

<sect2>標準カーネルに入っていないドライバをインストールするには
<p>
まずドライバの作者が使っているバージョンのカーネルを手に入れる必要があ
ります。バージョンの情報は恐らくドライバと同時に配布されているドキュメ
ントに記述があるでしょう。

最新のものを含め、様々なバージョンのカーネルは
<tscreen>
<url url="ftp://nic.funet.fi/pub/OS/Linux/PEOPLE/Linus">
</tscreen>

にあります。名前は <tt/linux-/<em/version/<tt/.tar.gz/ となっているは
ずです。

これらは <url url="ftp://tsx-11.mit.edu" name="tsx-11"> などの
多くのサイトにもミラーされています。

ソースを手に入れたら <tt>/usr/src</tt> へ移動し、古い Linux のソースを
削除しましょう。バックアップとして残したい場合は以下のようにします。

<tscreen><verb>
mv linux linux-old
</verb></tscreen>

アーカイブを展開します。

<tscreen><verb>
gunzip < linux-0.99.12.tar.gz | tar xvfp -
</verb></tscreen>

パッチを当てます。パッチファイルで記述されているファイル名は、ファイル
システムの適当なディレクトリを基準として、そこからの相対パスで記述され
ています。パッチファイル中の出力ファイルの行を
調べる (<tt/&circ;---/ を <tt/grep/ すれば表示されます) ことで、
この基準ディレクトリがどこかわかります。例えば

<tscreen><verb>
--- ./kernel/blk_drv/scsi/Makefile

--- ./config.in Wed Sep  1 16:19:33 1993
</verb></tscreen>

のような行がパッチファイルにあったら、基準ディレクトリは 
<tt>/usr/src/linux</tt> です。

ドライバのソースを適当な場所に展開します。アーカイブの中身を見るには以
下のようにします。

<tscreen><verb>
tar tfv patches.tar 
</verb></tscreen>

展開したファイルは必要な場所に移動します。 SCSI のドライバファイル
は <tt>/usr/src/linux/kernel/drivers/scsi</tt> に置く必要があります。

パッチファイル中の基準ディレクトリに移動して以下のようにタイプすること
でパッチが当たります。

<tscreen><verb>
patch -p0 < patch_file
</verb></tscreen>

パッチファイル中のファイル指定における、最初の方のディレクトリを無視する
ように指定することもできます。例えば

<tscreen><verb>
--- linux-new/kernel/blk_drv/scsi/Makefile 
</verb></tscreen>

のような指定がパッチファイル中にあり、これを <tt>/usr/src/linux</tt> 
以下のファイルにパッチ当てしたい場合は、まず <tt>/usr/src/linux</tt> に 
<tt/cd/ してから

<tscreen><verb>
patch -p1 < patches 
</verb></tscreen>

と打ち込みます。これで <tt/linux-new/ は無視されます。

パッチ当てが終わったら、失敗したパッチがないか調べてください。パッチが
失敗すると <tt/&num;/ という拡張子がついたファイルができているはずです。
<quote>
訳注: 普通この拡張子は <tt/.rej/ ですが、<tt/patch/ のコンパイル時
のオプションによって、 <tt/&num;/ になることもあります。
</quote>

<tscreen><verb>
find /usr/src/linux/ -name "*#" -print 
</verb></tscreen>

このようなファイルが存在したら、その中身を見てください。もしかしたら単
に RCS の識別子が違っているだけかもしれません。この場合は無害ですから
無視してかまいません。それ以外の場合は、手でパッチ当てをする必要がある
かもしれません。<tt/diff/ ファイルの形式とパッチ当てに関してはこの文書の範
囲外です。

<ref id="KernelConfig" name="カーネルの設定と再構築">
もご覧になってください。

<sect2>パッチのないドライバをインストールするには
<p>
ときにはドライバの作者が自分の書いたドライバの <tt/.c/ や <tt/.h/ 
ファイルへのパッチを提供していない場合もあります。またパッチ元の
カーネルのバージョンが古すぎて、うまくパッチが当たらない場合も
ありえます。
<enum>
<item>拡張子が <tt/.c/ や <tt/.h/ などのファイルを 
<tt>/usr/src/linux/drivers/scsi</tt> へコピーします。

<item> 設定オプションに追加します。

<tt>/usr/src/linux/config.in</tt> を編集して

<tscreen><verb>
*
* SCSI low-level drivers
*
</verb></tscreen>

以下のセクションに、使用するドライバの設定変数をブール値で追加します。
例えば以下のようになるでしょう。

<tscreen><verb>
bool 'Always IN2000 SCSI support' CONFIG_SCSI_IN2000 y
</verb></tscreen>

<item> <tt/Makefile/ にエントリを追加します。

<tt>/usr/src/linux/drivers/scsi/Makefile</tt> を編集して、以下のような
行を追加します。

<tscreen><verb>
ifdef CONFIG_SCSI_IN2000
SCSI_OBS := $(SCSI_OBJS) in2000.o
SCSI_SRCS := $(SCSI_SRCS) in2000.c
endif
</verb></tscreen>

これらの行は <tt/Makefile/ 中の

<tscreen><verb>
scsi.a: $(SCSI_OBJS)
</verb></tscreen>

の行の前に置きます。指定行の <tt/.c/ のファイルには先ほどコピーし
た <tt/.c/ のファイルを、<tt/.o/ のファイルには <tt/.c/ のファイルの
拡張子を <tt/.o/ に置き換えたものを書きます。

<item>エントリポイントを加えます。

<tt>/usr/src/linux/drivers/scsi/hosts.c</tt> を編集して、
ヘッダファイルのための <tt/&num;include/ 行を追加します。
設定ファイルに加えた <tt/CONFIG_SCSI/ の値によって
プリプロセッサの処理を変更できるようにしておくと良いでしょう。
例えば、
<tscreen><verb>
#ifdef CONFIG_SCSI_GENERIC_NCR5380
#include "g_NCR5380.h"
#endif
</verb></tscreen>

などの行の後に、以下のような行を加えることになります。

<tscreen><verb>
#ifdef CONFIG_SCSI_IN2000
#include "in2000.h"
#endif
</verb></tscreen>

次に <tt/Scsi_Host_Template/ のエントリを 
<tt/scsi_host&lsqb;&rsqb;/ 配列に追加する必要があります。
<tt/.h/ ファイルを見てみると例えば以下のような <tt/&num;define/ 
行があるはずです。

<tscreen><verb>
#define IN2000 {"Always IN2000", in2000_detect, \
    in2000_info, in2000_command,    \
    in2000_queuecommand,            \
    in2000_abort,                   \
    in2000_reset,                   \
    NULL,                           \
    in2000_biosparam,               \
    1, 7, IN2000_SG, 1, 0, 0}
</verb></tscreen>

このマクロを <tt/scsi_hosts&lsqb;&rsqb;/ 配列に追加します。
設定ファイルで定義したシンボルによってプリプロセッサの動作を
制御できるようにしておきましょう。

つまり

<tscreen><verb>
#ifdef CONFIG_SCSI_GENERIC_NCR5380
        GENERIC_NCR5380,
#endif
</verb></tscreen>

のような行の後に、追加するエントリを以下のように書くわけです。

<tscreen><verb>
#ifdef CONFIG_SCSI_IN2000
	IN2000,
#endif
</verb></tscreen>

<ref id="KernelConfig" name="カーネルの設定と再構築">
の章も見てください。

</enum>


<sect2> Compaq のシステムで PCI のボードが動かない
<p>
Compaq のシステムの多くでは PCI デバイスを検出するための 32 ビット拡張 
BIOS がメモリにマップされています。メモリレイアウトが特殊なために、
Linux では この BIOS をアクセスすることができません。 Linux は (サポー
トされているはずの) PCI SCSI ボードの検出に失敗すると、以下のようなメッ
セージが出力されます。

<tscreen><verb>
pcibios_init: entry in high memory, unable to access
</verb></tscreen>

以下のファイルを手に入れてください。

<tscreen>
<!-- 原文では ftp://ftp.compaq.com/pub/softpaq/Software-Solutions/sp0921.zip
となっていましたが、以下が正しいようです。-->
<url url="ftp://ftp.compaq.com/pub/softpaq/sp0921.zip">
</tscreen>

これは自己解凍型のアーカイブで、BIOS32 のコードを再配置するためのプロ
グラムが入っています。
<quote>
訳注: この <tt/zip/ ファイルを <tt/unzip/ すると、<tt/exe/ サフィックス
を持った自己解凍型のアーカイブができます。
</quote>

<sect2> PCI の SCSI システムが <tt/&percnt;d Hosts/ というメッセージを
出した後にハングアップします。
<p>

PCI のシステムの中には、BIOS 中で割り込みを禁止し、再び割り込みを
可能にせずに呼び出し元に制御を返してしまうものがあります。
以下のパッチでなおるはずです。

<tscreen><verb>
--- bios32.c.orig	Mon Nov 13 22:35:31 1995
+++ bios32.c	Thu Jan 18 00:15:09 1996
@@ -56,6 +56,7 @@
 #include <linux/pci.h>
 
 #include <asm/segment.h>
+#include <asm/system.h>
 
 #define PCIBIOS_PCI_FUNCTION_ID 	0xb1XX
 #define PCIBIOS_PCI_BIOS_PRESENT 	0xb101
@@ -125,7 +126,9 @@
 	unsigned long address;		/* %ebx */
 	unsigned long length;		/* %ecx */
 	unsigned long entry;		/* %edx */
+	unsigned long flags;
 
+	save_flags(flags);
 	__asm__("lcall (%%edi)"
 		: "=a" (return_code),
 		  "=b" (address),
@@ -134,6 +137,7 @@
 		: "0" (service),
 		  "1" (0),
 		  "D" (&ero;bios32_indirect));
+	restore_flags(flags);
 
 	switch (return_code) {
 		case 0:
@@ -161,11 +165,13 @@
 	unsigned char present_status;
 	unsigned char major_revision;
 	unsigned char minor_revision;
+	unsigned long flags;
 	int pack;
 
 	if ((pcibios_entry = bios32_service(PCI_SERVICE))) {
 		pci_indirect.address = pcibios_entry;
 
+		save_flags(flags);
 		__asm__("lcall (%%edi)\n\t"
 			"jc 1f\n\t"
 			"xor %%ah, %%ah\n"
@@ -176,6 +182,7 @@
 			: "1" (PCIBIOS_PCI_BIOS_PRESENT),
 			  "D" (&ero;pci_indirect)
 			: "bx", "cx");
+		restore_flags(flags);
 
 		present_status = (pack >> 16) & 0xff;
 		major_revision = (pack >> 8) & 0xff;
@@ -210,7 +217,9 @@
 {
 	unsigned long bx;
 	unsigned long ret;
+	unsigned long flags;
 
+	save_flags(flags);
 	__asm__ ("lcall (%%edi)\n\t"
 		"jc 1f\n\t"
 		"xor %%ah, %%ah\n"
@@ -221,6 +230,7 @@
 		  "c" (class_code),
 		  "S" ((int) index),
 		  "D" (&ero;pci_indirect));
+	restore_flags(flags);
 	*bus = (bx >> 8) & 0xff;
 	*device_fn = bx & 0xff;
 	return (int) (ret & 0xff00) >> 8;
@@ -232,7 +242,9 @@
 {
 	unsigned short bx;
 	unsigned short ret;
+	unsigned long flags;
 
+	save_flags(flags);
 	__asm__("lcall (%%edi)\n\t"
 		"jc 1f\n\t"
 		"xor %%ah, %%ah\n"
@@ -244,6 +256,7 @@
 		  "d" (vendor),
 		  "S" ((int) index),
 		  "D" (&ero;pci_indirect));
+	restore_flags(flags);
 	*bus = (bx >> 8) & 0xff;
 	*device_fn = bx & 0xff;
 	return (int) (ret & 0xff00) >> 8;
@@ -254,7 +267,9 @@
 {
 	unsigned long ret;
 	unsigned long bx = (bus << 8) | device_fn;
+	unsigned long flags;
 
+	save_flags (flags);
 	__asm__("lcall (%%esi)\n\t"
 		"jc 1f\n\t"
 		"xor %%ah, %%ah\n"
@@ -273,7 +288,9 @@
 {
 	unsigned long ret;
 	unsigned long bx = (bus << 8) | device_fn;
+	unsigned long flags;
 
+	save_flags(flags);
 	__asm__("lcall (%%esi)\n\t"
 		"jc 1f\n\t"
 		"xor %%ah, %%ah\n"
@@ -292,7 +309,9 @@
 {
 	unsigned long ret;
 	unsigned long bx = (bus << 8) | device_fn;
+	unsigned long flags;
 
+	save_flags(flags);
 	__asm__("lcall (%%esi)\n\t"
 		"jc 1f\n\t"
 		"xor %%ah, %%ah\n"
@@ -303,6 +322,7 @@
 		  "b" (bx),
 		  "D" ((long) where),
 		  "S" (&ero;pci_indirect));
+	restore_flags(flags);
 	return (int) (ret & 0xff00) >> 8;
 }
 
@@ -311,7 +331,9 @@
 {
 	unsigned long ret;
 	unsigned long bx = (bus << 8) | device_fn;
+	unsigned long flags;
 
+	save_flags(flags);
 	__asm__("lcall (%%esi)\n\t"
 		"jc 1f\n\t"
 		"xor %%ah, %%ah\n"
@@ -322,6 +344,7 @@
 		  "b" (bx),
 		  "D" ((long) where),
 		  "S" (&ero;pci_indirect));
+	restore_flags(flags);
 	return (int) (ret & 0xff00) >> 8;
 }
 
@@ -330,7 +353,9 @@
 {
 	unsigned long ret;
 	unsigned long bx = (bus << 8) | device_fn;
+	unsigned long flags;
 
+	save_flags(flags);
 	__asm__("lcall (%%esi)\n\t"
 		"jc 1f\n\t"
 		"xor %%ah, %%ah\n"
@@ -341,6 +366,7 @@
 		  "b" (bx),
 		  "D" ((long) where),
 		  "S" (&ero;pci_indirect));
+	restore_flags(flags);
 	return (int) (ret & 0xff00) >> 8;
 }
 
@@ -349,7 +375,9 @@
 {
 	unsigned long ret;
 	unsigned long bx = (bus << 8) | device_fn;
+	unsigned long flags;
 
+	save_flags(flags);
 	__asm__("lcall (%%esi)\n\t"
 		"jc 1f\n\t"
 		"xor %%ah, %%ah\n"
@@ -360,6 +388,7 @@
 		  "b" (bx),
 		  "D" ((long) where),
 		  "S" (&ero;pci_indirect));
+	restore_flags(flags);
 	return (int) (ret & 0xff00) >> 8;
 }
</verb></tscreen>

<sect1> Adaptec 152x、151x、1505、282x、Sound Blaster 16 SCSI / SCSI Pro、
Gigabyte、その他 AIC 6260/6360 を用いた製品 (標準)
<p>

<sect2>可能な設定<p>

<tscreen><verb>
BIOS アドレス : 0xd8000, 0xdc000, 0xd0000, 0xd4000,
                0xc8000, 0xcc000, 0xe0000, 0xe4000
IO ポート     : 0x140, 0x340
IRQ           : 9, 10, 11, 12
DMA           : 使用していません
IO            : ポートマップ方式
</verb></tscreen>

<sect2>自動検出<p>

BIOS が入っているボードではだいたいうまく動作するようです。入っていな
いボード (Adaptec 1510、Sound Blaster16 SCSI など) では、カーネルのコ
マンドラインオプションかコンパイル時の設定変更が必要になります。

<sect2>自動検出の設定変更<p>

<descrip>
<tag/コンパイル時/

<tt/PORTBASE/、<tt/IRQ/、<tt/SCSI_ID/、<tt/RECONNECT/、<tt/PARITY/ を
適当な値に定義してください。
「定義可能なパラメータ」のところを参考にしてください。

<tag/カーネルのコマンドライン/

<tscreen><verb>
aha152x=<PORTBASE>[,<IRQ>[,<SCSI-ID>[,<RECONNECT>[,<PARITY>]]]]
</verb></tscreen>

SCSI-ID はホストアダプタの SCSI ID です。特に ID 7 が必要な他のデバイ
スをつないでいない限り 7 にしておきましょう。

I/O アドレスを 0x340 に固定し、IRQ 11、SCSI-ID 7、
ディスコネクト/リコネクトを許可するようにするには、
以下のようなコマンドラインオプションを使うことになります。

<tscreen><verb>
aha152x=0x340,11,7,1
</verb></tscreen>

</descrip>

<sect2>アップデートによって解決された問題<p>

<enum>
<item> VLB のボードでドライバが動かない問題。これは 1.0.5 以前のカーネ
ルのタイミングの問題でした。
</enum>

<sect2>定義可能なパラメータ<p>
<descrip>
<tag><tt/AUTOCONF/</tag> コントローラが報告してきた設定を使う (152x のみ)
<tag><tt/IRQ/</tag> 割り込みチャネルの設定変更 (9,10,11 or 12) (デフォルト 11)
<tag><tt/SCSI_ID/</tag> AIC-6260 の SCSI ID の設定変更 (0-7) (デフォルト 7)
<tag><tt/RECONNECT/</tag> ターゲットからのディスコネクト/リコネクトの設定を
変更する (0 以外で許可、0 で禁止)
<tag><tt/DONT_SNARF/</tag> ポートを登録しない (pl12 以下)
<tag><tt/SKIP_BIOSTEST/</tag> BIOS シグネチャのテストを
行わない (AHA-1510 または BIOS のない機器)
<tag><tt/PORTBASE/</tag> ポートのベースアドレスを指定し、検出を行わない。
</descrip>
<quote>
訳注: カーネル 2.0.27 に付属のドライバでは、DONT_SNARF はなくなっています。
また、PORTBASE は IOPORT に変更されています。
</quote>

<sect1> Adaptec 154x、AMI FastDisk VLB、DTC 329x (標準)
<p>

<sect2>可能な設定<p>

<tscreen><verb>
IO ポート      : 0x330 and 0x334 
IRQ            : 9, 10, 11, 12, 14, 15
DMA チャネル   : 5, 6, 7
IO             : ポートマップ方式、バスマスタ方式
</verb></tscreen>

<sect2>自動検出<p>

自動検出されるのは I/O アドレス 0x330 と 0x334 だけです。

<sect2>自動検出の設定変更<p>

<tscreen><verb>
aha1542=<PORTBASE>[,<BUSON>,<BUSOFF>[,<DMASPEED>]]
</verb></tscreen>

<sect2>注意<p>

<enum>
<item> BusLogic のボードには Adaptec 1542 にソフトウェア互換のシリーズ
があり、 ISA、VLB、EISA、PCI の製品があります。
<item> 無印 154? と、初期の 154?A のボードはスキャッタ/ギャザ機能を
サポートしていないので、これらは動作しないことになっています。しかし 
<tt>drivers/scsi/aha1542.h</tt> 中の <tt>AHA1542_SCATTER</tt> を 0 に
すると、(動作する、という言葉の定義によりますが) 無理矢理動作させる
こともできます。
<quote>
訳注: スキャッタ/ギャザについて補足説明。<newline>
Linux は仮想記憶を採用していることはご存知ですね。
CPU から指定された仮想アドレスは、MMU によって物理アドレスに変換され
ます。しかしこの変換が行われるのは CPU からのアドレスだけであって、
DMA やバスマスタ転送を行う場合のアドレスは、物理アドレスを使用しな
ければなりません (PC/AT アーキテクチャの場合。ちなみに Sun の
SPARCstation などは DMA も仮想アドレスを使います)。
仮想アドレスから物理アドレスへの対応づけは、ページと呼ばれる単位ごとに
行われますから、プログラムから見て仮想アドレスが連続していても、物理
アドレスは飛び飛びになっているということがあり得ます。
このような場合にも、コントローラを一度設定するだけで、
飛び飛びの物理アドレスにデータを転送してくれるような機能の
ことを、スキャッタ/ギャザといいます。
コントローラがスキャッタ/ギャザをサポートしていない場合には、飛び飛びに
なっている物理アドレスの個数分だけ、DMA を複数回行なう必要があります。
</quote>
</enum>

<sect2>アップデートによって解決された問題<p>

<enum>
<item> バージョン 0.99.10 以前のカーネルは 154?C のカードをサポート
していません。
<item> バージョン 0.99.14k 以前のカーネルは、 154?C のカードのうち、
以下の機能をサポートしていません。

<itemize>
<item> 1G 以上のディスクに対する拡張マッピングの BIOS 機能
<item> 3 台以上のドライブに関する BIOS 機能
<item> SCSI バスの自動検索に関する BIOS 機能
</itemize>

<item> バージョン 0.99.15e 以前のカーネルは 154?C の BIOS 機能のうち、
3 台以上のドライブを利用する機能を有効にすることができません。
また 1G 以上のディスクに関する拡張マッピング機能を無効にすることも
できません。
<item> バージョン 0.99.14u 以前のカーネルは 154?CF のカードをサポート
していません。
<item> バージョン 1.0.5 以前のカーネルでは、複数のデバイスに対するアクセスが
同時に起こると排他制御が失敗することがあります。
</enum>

<sect2>よくある問題<p>

<enum>
<item> 154xC や 1542xCF で予期しないエラーが出る。
<label id="154_1">
<p>
154xC の初期のカードでは SCSI 信号の立ち上がりが速すぎるため、
インピーダンスの正しくないケーブルを使うと信号の反射が起こって
しまうことがありました。
<p>
新しいボードでは幾分改善されているようですが、それでもケーブルや
ターミネーションに対しては非常に敏感です。
<p>
この章の「よくある問題」の<ref id="154_2" name="その2"> や
<ref id="154_3" name="その3">、それに
<ref id="CommonProblems" name="よくある問題">、
<ref id="Flakiness" name="不安定なシステム">の章も参考にしてください。
	
<item> 154xC や 154x に内蔵デバイスと外付けデバイスの両方を接続すると、
予期しないエラーが発生する。<label id="154_2">
<p>
おそらくターミネーションの問題でしょう。ソフトウェアでホストアダプタの
ターミネーションを無効にするには、スイッチ 1 をオフにする必要があります。
この章の「よくある問題」の<ref id="154_1" name="その1"> や
<ref id="154_3" name="その3">、それに
<ref id="CommonProblems" name="よくある問題">や
<ref id="Flakiness" name="不安定なシステム">の章も参考にしてください。

<item> SCSI システムが完全に固まってしまう。<label id="154_3">
<p>
複数のデバイスが同時に使用されると、システムがフリーズしたように見える
ことがあります。この場合はデバイスのメーカに連絡して見るとよいでしょう。
ファームウェアのアップグレードによってこの問題は解決されているかもしれ
ません。最後の手段としては <tt/aha1542.h/ 中の <tt/AHA1542_MAILBOX/ を 
1 に変更する方法があります。これは SCSI バスに同時に出力されるコマンド
を実効的に一つだけにするので、この状況を解決できるかもしれません。しかし
遅いテープドライブや CD-ROM デバイスを用いている場合は、実用的な解決法に
はならないでしょう。

この章の「よくある問題」の<ref id="154_1" name="その1"> や 
<ref id="154_2" name="その2">、それに
<ref id="CommonProblems" name="よくある問題">、
<ref id="SCSISysLockups"
name="よくある問題: SCSI システムがロックアップする"> などの項も
参考にしてください。

<item> ブート時に「Interrupt received, but no mail」という
メッセージが出力されて、SCSI デバイスが認識されない。
<p>
BIOS の拡張機能のうち、 1G 以上のディスクに対する拡張マッピング、3 台
以上のディスクのサポート機能、およびバスの自動スキャンを無効にします。
あるいはカーネルを 0.99.14k 以上にアップグレードしましょう。

<item> もし 154xC のボードでタイムアウトエラーが起こる場合には、
Adaptec setup プログラムを起動して同期転送交渉を有効にしてみてください。
<p>
<item> カーネル 1.2.x で以下のメッセージが出る。
<tscreen>
Unable to determine Adaptec DMA priority.  Disabling board.
</tscreen>
<p>
これは古い BusLogic のドライバとの間で衝突が起こってしまうためです。カー
ネルを再構築して BusLogic のドライバを含まないカーネルを作るか、カーネ
ルのコマンドラインオプションを用いて BusLogic のドライバに別のアドレス
を検出するようにさせます。もし使っている Adaptec のボードがポートアド
レス 0x334 を使っており、0x330 を使っているボードが何もないようでした
ら、以下のようなコマンドラインオプションになります。

<tscreen><verb>
buslogic=0x330
</verb></tscreen>

<item> 1542C と 1540C でディスコネクト機能を有効にしておくと、複数の
デバイスへのアクセスが同時に起こったときにシステムがフリーズしてしまう。
<p>
Adaptec のファームウェアのあるバージョンにはバグがあります。 BIOS を 
v2.11 以上にするとこの問題は解決されているそうです。
</enum>

<sect1> Adaptec 174x
<p>

<sect2>可能な設定<p>

<tscreen><verb>
スロット       : 1-8
IO ポート      : EISA ボードなので関係無し
IRQ            : 9, 10, 11, 12, 14, 15
DMA チャネル   : EISA ボードなので関係無し
IO             : ポートマップ方式、バスマスタ方式
</verb></tscreen>

<sect2>自動検出<p>

全ての設定で動作します。

<sect2>自動検出の設定変更<p>

ありません。

<sect2>注意<p>

<enum>
<item> Adaptec はこのボードの生産を中止しています。
</enum>

<sect2>よくある問題<p>

<enum>
<item> Adaptec 1740 のドライバが以下のようなメッセージを出す
<tscreen>
aha1740: Board detected, but EBCNTRL = &percnt;x, so disabled it.
</tscreen>
<p>
使用中のボードがエンハンストモードではないのでボードを有効にできないためです。
1542 モードでボードを動作させることはできません。
</enum>

<sect1> Adaptec 274x、284x (標準) 294x (アルファ版)
<p>
<quote>
訳注: カーネル 2.0.27 では、294x もサポートされています。
</quote>

Adaptec 294x もサポートする新しいバージョンは以下から入手できます。

<tscreen>
<url url="ftp://ftp.ims.com/pub/Linux/aic7xxx">
</tscreen>

<sect2>可能な設定<p>

<tscreen><verb>
		 274x		284x		294x
EISA スロット  : 1-12		N/A		N/A
IO ポート      : N/A		ALL		ALL
IRQ            : ALL		ALL		ALL
DMA チャネル   : N/A		ALL		N/A

IO             : ポートマップ方式、バスマスタ方式
</verb></tscreen>

<sect2>自動検出の設定変更<p>

<descrip>
<tag/カーネルのコマンドライン/

拡張マッピングを強制するには以下のようにします。

<tscreen><verb>
aha274x=extended
</verb></tscreen>

</descrip>

<sect2>注意<p>
<enum>
<item> BIOS を有効にしておく必要があります。
<item> 2742AT ボードの B チャンネルは無視されます。
<item> PCI ボードの場合には <tt/CONFIG_PCI/ を指定しておく必要があります。
</enum>

<sect1> Always IN2000 (標準)
<p>

<sect2>可能な設定<p>

<tscreen><verb>
IO ポート     : 0x100, 0x110, 0x200, 0x220
IRQ           : 10, 11, 14, 15
DMA チャネル  : 使用していない
IO            : ポートマップ方式
</verb></tscreen>

<sect2>自動検出<p>

BIOS は不必要。

<sect2>自動検出の設定変更<p>

ありません。

<sect2>よくある問題<p>

<enum>
<item> IDE ドライブとスワッピングが設定されているシステムでは問題が
あることが知られています。
</enum>

<sect1> BusLogic MultiMaster ホストアダプタ <label id="BuslogicMulti">
<p>

(この節は Leonard N. Zubkoff <htmlurl url="mailto:lnz@dandelion.com"
name="&lt;lnz@dandelion.com&gt;"> に著作権があります。)
<newline>
(Buslogic のドライバの文書としてより詳細なものを望む方は 
<tt/README.BusLogic/ を見てください。)

<verb>
		  BusLogic MultiMaster SCSI Driver for Linux

		       Version 1.2.2 for Linux 1.2.13
		       Version 1.3.2 for Linux 1.3.88

		 ftp://ftp.dandelion.com/BusLogic-1.2.2.tar.gz
		 ftp://ftp.dandelion.com/BusLogic-1.3.2.tar.gz

				 16 April 1996

			       Leonard N. Zubkoff
			       Dandelion Digital
			       lnz@dandelion.com

</verb>

BusLogic Inc. は高性能な SCSI ホストアダプタを何種類も設計、生産しています。
MultiMaster ASIC 技術を用いることで、これらのホストアダプタでは使用する
バスが異なってもプログラミングのインターフェースは共通化されています。
このドライバは現存する全ての BusLogic MultiMaster ホストアダプタをサポート
しており、恐らく将来リリースされるシリーズ製品に対してもそのまま (あるいは
わずかな修正で) 対応できるでしょう。 FlashPoint アーキテクチャに基づいた
ホストアダプタはこのドライバではサポートしていません。
こちらに関しては <tt/README.FlashPoint/ ファイルを参考にしてください。
Linux ではサポート外の FlashPoint LT から、サポート対象である BT-948 へ
アップグレードできる Linux ユーザ向けのキャンペーンに関する情報があります。

私がこの完全に新しい BusLogic のドライバを Linux 向けに書くに当たっては、
以下のような事を目標にしました。まず BusLogic のホストアダプタおよび
SCSI 機器の性能を最大限に発揮させること、そして高い信頼性を持ち、高性能が
要求される重要な用途でも安心して使えるようにすることです。
主要な SCSI 拡張機能やエラー回復機能は Linux カーネルのコマンドライン
オプションで設定できるようになっており、必要に応じてドライバの性能や
エラー回復機能の微調整が可能です。

BusLogic は私の仕事に非常に好意的でした。私は同社の製品を Linux コミュニ
ティに強く推薦します。
1995 年の 11 月に、私は彼らの最新の MultiMaster 製品である BT-948 PCI 
Ultra SCSI ホストアダプタをβテストすることができました。
また 1996 年の 9 月には BT-958 PCI Wide Ultra SCSI を同じく提供して
もらいました。これによって BusLogic 社は、社内のテストグループでは
行えなかったようなテストを質量ともに行なうことができましたし、
Linux コミュニティは Linux 向けによくテストされた高性能なホストアダプタを
販売前に手に入れることができました。
この際に私は同社の技術スタッフと直接話し合うことができ、彼らの製品の
内部動作に関してより深く知ることができました。
また逆に彼らには Linux コミュニティが必要としているものとその潜在的な
需要について伝えることができました。彼らの Linux に対する関心と協力とに
深く感謝します。

Linux で起こった問題についてメーカの技術サポートに問い合わせると
「あなたの使い方はサポート対象外です」などと言われがちなものですが、
BusLogic ではそんなことはありません。
彼らの最新製品の宣伝では「BusLogic のホストアダプタは以下のような全ての
主要な OS で用いることができます:... Linux ...」とさえ記述されているのです。

BusLogic の所在地は 4151 Burton Drive, Santa Clara, California, 95054, USA 
で、電話番号は 408/492-9090、 FAX は 408/492-1542 です。
anonymous FTP サイトが <url url="ftp://ftp.buslogic.com">
に、BBS が 408/492-1984 にあります。
BusLogic の技術サポートには電子メール
<htmlurl url="mailto:techsup@buslogic.com" name="techsup@buslogic.com">
、電話 408/654-0760、 FAX 408/492-1542 で
連絡をとることができます。
ヨーロッパおよび日本における連絡先は Web サイトから得ることができます。

<sect2>サポートされているアダプタ
<p>
以下のリストは BusLogic 社のホストアダプタのうち、現在までにサポート
されているものの一覧です。以下の表にない BusLogic 製品を購入しようと
考えている方には、その製品のサポートがされているか、あるいはされる
予定があるかどうかを筆者まで尋ねてからにすることをお勧めします。

<verb>
"W" Series Host Adapters:

BT-948	    PCI	    Ultra Fast Single-ended SCSI-2
BT-958	    PCI	    Ultra Wide Single-ended SCSI-2
BT-958D	    PCI	    Ultra Wide Differential SCSI-2

"C" Series Host Adapters:

BT-946C	    PCI	    Fast Single-ended SCSI-2
BT-956C	    PCI	    Fast Wide Single-ended SCSI-2
BT-956CD    PCI	    Fast Wide Differential SCSI-2
BT-445C	    VLB	    Fast Single-ended SCSI-2
BT-747C	    EISA    Fast Single-ended SCSI-2
BT-757C	    EISA    Fast Wide Single-ended SCSI-2
BT-757CD    EISA    Fast Wide Differential SCSI-2
BT-545C	    ISA	    Fast Single-ended SCSI-2
BT-540CF    ISA	    Fast Single-ended SCSI-2

"S" Series Host Adapters:

BT-445S	    VLB	    Fast Single-ended SCSI-2
BT-747S	    EISA    Fast Single-ended SCSI-2
BT-747D	    EISA    Fast Differential SCSI-2
BT-757S	    EISA    Fast Wide Single-ended SCSI-2
BT-757D	    EISA    Fast Wide Differential SCSI-2
BT-545S	    ISA	    Fast Single-ended SCSI-2
BT-542D	    ISA	    Fast Differential SCSI-2
BT-742A	    EISA    Single-ended SCSI-2 (742A revision H)
BT-542B	    ISA	    Single-ended SCSI-2 (542B revision H)

"A" Series Host Adapters:

BT-742A	    EISA    Single-ended SCSI-2 (742A revisions A - G)
BT-542B	    ISA	    Single-ended SCSI-2 (542B revisions A - G)
</verb>

AMI の FastDisk ホストアダプタは BusLogic の完全なクローンなので、
このドライバで動作させることができます。

<sect2> BT-948/958/958D インストールの注意
<p>
BT-948/958/958D PCI Ultra SCSI ホストアダプタの機能には、Linux をイン
ストールする際に (場合によっては) 注意しなければならない点があります。

<descrip>
<tag> PCI I/O ポートの割り当て</tag>
工場出荷時の設定では、BT-948/958/958D のボードはマザーボードの PCI BIOS が
割り当てた I/O ポートのみを認識するようになっていて、以前の BusLogic の 
SCSI ホストアダプタが応答した ISA 互換の I/O ポートには応答しません。
このドライバは PCI の I/O ポート割り当て機能をサポートしていますので、
こちらの設定が望ましいでしょう。しかし何らかの理由 (パッケージの
ブートカーネルがこのドライバを使っていない場合など) で、
古い BusLogic のドライバを使わなければならない場合には、
AutoSCSI の設定で古い ISA 互換の I/O ポートを用いるようにすることもできます。

この古い機能との互換性を持たせるオプションを有効にするには、システムの
ブート時に Ctrl-B を押して AutoSCSI を立ち上げ、「Adapter Configration」、
「View/Modify Configration」と選んで、その中の「ISA Compatible Port」を
「Disable」から「Primary」か「Alternate」に変えてください。このドライバが
インストールされた後には、I/O ポートの衝突を防ぐため、
この「ISA Compatible Port」は「Disable」に戻しておく必要があります。
少々古い製品である BT-946C/956C/956CD にもこの設定オプションがありますが、
工場出荷時の設定は「Primary」になっています。

<tag/PCI スロットの検索順序/
BusLogic の PCI ホストアダプタを複数枚備えたシステムでは、PCI スロットの
検索の順番が BT-948/958/958D の場合と BT-946C/956C/956CD の場合とで逆に
なることがあります。
SCSI のディスクから正しくブートさせるには、ホストアダプタの BIOS とカー
ネルの間で、ブートデバイスと認識しているドライブが一致している必要があり
ます。
つまり PCI ホストアダプタの認識の順序が同じでなければならないのです。
マザーボードの PCI BIOS は通常 PCI ホストアダプタを番号付けする標準的な
機能を持っており、 Linux のカーネルではこれを用いています。
PCI BIOS のインプリメントによって、PCI スロットをバス番号とデバイス番号の
昇順にカウントするか降順にするかは異なっています。

不幸なことに Microsoft は Windows 95 で PCI スロットの番号付けをバス番号と
デバイス番号の昇順に固定することにしてしまい、 Windows 95 対応の証明をもら
うにはホストアダプタの BIOS はこの順序を守らなければならなくなりました。
したがって BT-948/958/958D の工場出荷値ではバス番号とデバイス番号の昇順に
ホストアダプタの番号付けをすることになっています。この機能を無効にするには、
システムブートの際に Ctrl-B で AutoSCSI を起動し、「Adapter Configuration」
「View/Modify Configreation」を選んで Ctrl-F10 を押してください。
そして「Use Bus And Device &num; For PCI Scanning Seq」オプションを OFF に
してください。

このドライバは PCI の検索手順のオプション設定を問い合わせて、ホストアダプタ
をアダプタの BIOS と同じ順序で認識するようにしています。

</descrip>

<sect2>BusLogic の広報用メーリングリスト
<p>
BusLogic の広報用メーリングリストは Linux ユーザに新しいドライバの
リリースを知らせたり、 BusLogic SCSI ホストアダプタの Linux サポート関連の
アナウンスを伝えるのに用いられています。
このメーリングリストに参加するには、本文に「subscribe」と書いたメールを 
<htmlurl url="mailto:BusLogic-announce-request@dandelion.com"
name="BusLogic-announce-request@dandelion.com">
まで送ってください。

<sect1> BusLogic FlashPoint ホストアダプタ
<p>

(この節は Leonard N.Zubkoff <htmlurl url="mailto:lnz@dandelion.com"
name="&lt;lnz@dandelion.com&gt;"> に
著作権があります)

現在のところ FlashPoint LT/DT/LW (BT-930/932/950) の Linux ドライバは
ありませんし、将来にわたってリリースされるかどうかもはっきりしていません。
FlashPoint のボードは MultiMaster のボードとはアーキテクチャが異なっていて、
オンボードの CPU は無く SCSI シーケンサのみが搭載されています。
FlashPoint はデスクトップパソコン用の製品であり、 Linux のような高機能な
マルチタスク OS に特に向いているというわけではありません。

MultiMaster BT-948/958 にはオンボードの CPU とメールボックスプログラム
インターフェース機能があり、ホストの OS とアダプタの間で並列化とパイプ
ライン化が可能になっています。
一方 FlashPoint のボードではホストの CPU への割り込みが頻繁に起こります。
システムの負荷が高くなるとこの割り込みが重荷になってしまい、
BT-948/958 が良い性能を維持するのに対して、FlashPoint の性能は急速に低下
します。
さらに BT-948/958 のファームウェアには SCSI バスとの信号のやり取りに関する
低レベルの命令がすでに含まれています。 FlushPoint では Linux のドライバが
これらの命令を全て持つ必要があるので、SCSI シーケンサとの間で命令をやり取り
して仕事をするのに多くの時間がかかってしまいます。実売価格ではそれほど差が
ありませんが、 Linux で用いるには BT-948 と BT-958 の方がはっきりと優れて
いるのです。

&lt; 引用はじめ &gt;
<verb>
				 ANNOUNCEMENT
		  BusLogic FlashPoint/BT-948 Upgrade Program
				1 February 1996
</verb>

十月終わりにリリースされて以来、BusLogic FlashPoint LT は Linux コミュニ
ティのメンバーにとって問題の種になってきました。この Ultra SCSI 対応の
新製品には Linux ドライバがないためです。
FlashPoint はデスクトップパソコン用の製品という位置づけにあり、Linux の
ような高性能のマルチタスク OS に特に向いているというわけではありません。
しかし PC のベンダは FlashPoint を最新製品と言って売り込み、ハイエンドの
システムにも MaltiMaster 製品ではなくこちらを付けてきました。その結果、
BusLogic の SCSI ホストアダプタは全て Linux でサポートされていると思って
うっかりこのようなシステムを買ってしまった多くの人々が残念な思いをする
ことになってしまいました。 FlashPoint はまだサポートされておらず、将来
されるにしても相当先の事になるでしょう。

この問題が認識されて以来、BusLogic は主要な OEM 先と連絡を取り、
BT-946C/956C MultiMaster のカードを選択可能にすること、そして
間違って FlashPoint を購入してしまった Linux ユーザに BT-946C への
アップグレードを可能とすることを申し合わせました。
これで新規システムを購入する多くの人が救われるでしょうが、
しかし Linux ユーザへの FlashPoint サポートの問題の一部を解決したに
すぎません。 FlashPoint に対応している OS のために製品を買って、
後に Linux への移行を決めた人や、対応していると思って FlashPoint LT を
購入し、返品出来なくなってしまった人には何の助けにもならないのです．

12 月の半ばに私は BusLogic の上位管理職に会談を求め、FlushPoint への 
Linux やフリーソフトの対応に関して話し合いました。
Linux コミュニティに対する BusLogic の態度について様々な噂が流れていた
ので、これらについて直接聞くのがベストだと思ったのです。
私は夜の 11 時に電子メールを送り、翌日の午後に会合がもたれました。
残念ながら会社における歯車と言うのは (特に会社が買収されようとしている
ときは) 回転が遅いもので、詳細までがはっきり決定されて公式な声明が
行われるのは現在となってしまいました。

BusLogic は現在のところ FlushPoint のドライバを書くために必要な情報を
サードパーティに公開していません。現存している FlushPoint のドライバは
全て BusLogic のエンジニアによって直接書かれたものです。
外部の開発者が助力なしにドライバを書くために必要な、FlushPoint の詳細な
情報を記した文書はないのです。
BusLogic の社内には FlushPoint のアーキテクチャを公開すべきでないという
意見の人もおり、この議論はまだ決着していません。いずれにしろ、
もしドキュメントが今日入手できたとしても、まっとうに動作するドライバを
書くには長いことかかるでしょう。このドライバを書くのに必要な努力がその
価値に見合うとは私は納得していません。

しかし BusLogic は Linux コミュニティに高性能な SCSI を提供し続けることを
確約しており、FlashPoint LT を購入してしまったために Linux を動作できない
ユーザを座視することは望んでいません。そこで BusLogic はアップグレード
キャンペーンを行ない、世界中の Linux ユーザに FlushPoint LT と
新製品 BT-948 MultiMaster PCI Ultra SCSI ホストアダプタとを交換できる
ようにしました。
BT-948 は BT-946C の後継の Ultra SCSI アダプタであり、BT-946C と 
FlashPoint LT の両方の利点を受け継いでいます。終端処理の自動化や
ファームウェアのアップグレードが容易な flash PROM の採用、そしてもちろん
現在の Linux ドライバへの互換性もあります。
このアップグレードに必要な価格は 45US&dollar; で、
BusLogic のテクニカルサポートが実行しています。
連絡先は電子メールが
<htmlurl url="mailto:techsup@BusLogic.com" name="techsup@BusLogic.com">、
電話が +1 408 654-0760、
FAX が +1 408 492-1542 です。

私は BT-948 のβテスタであり、私が書いた BusLogic ドライバの 1.2.1 と 
1.3.1 にはこの BT-948 へのサポートが含まれています。
Ultra SCSI MultiMaster カードへの additional cosmetic サポートは続く
リリースで追加される予定です。
BusLogic との共同テストの結果、ファームウェアにあったいくつかのバグが発見・
修正されました (ファームウェアのバージョンが 5.05R 以降であることを確認
して下さい)。
私が高負荷をかけて使用している Linux システムはエラー回復プロセスを
テストするに理想的な環境です。エラー回復は製品のシステムではめったに
用いられませんが、しかしシステム全体の安定性には必要不可欠の機能です。
ファームウェアのエンジニア達と直接一緒に仕事ができ、ファームウェアの
デバッグ環境下で障害を再現できたことは特に便利でした。
私が組込みのファームウェアで仕事していた頃とは大違いでした。
私は現在性能のテストを行なっており、そう遠くない将来にまとまった
データを報告できる予定です。

BusLogic は私にこのアナウンスをするように言ってきました。
FlashPoint のサポートに関する質問の多くが私宛の電子メールや私の参加
している Linux のニュースグループに寄せられているからです。
まとめますと、BusLogic は Linux ユーザ向けに、
サポート外の FlashPoint LT (BT-930) をサポートされている BT-948 へ &dollar;45 で
アップグレードする道を提供しています。
アップグレードを受けるには、BusLogic のテクニカルサポート 
<htmlurl url="mailto:techsup@BusLogic.com"
name="techsup@BusLogic.com"> か +1 408 654-0760 へ連絡してください。

<verb>
		Leonard N. Zubkoff
		lnz@dandelion.com
</verb>
&lt;引用終わり&gt;

<sect1> EATA: DPT SmartCache、SmartCache Plus、SmartCache III、
SmartCache IV、SmartRAID (標準)
<p>

<sect2>サポートされているボード<p>
EATA-DMA プロトコルを使っているもの全て。
以下のようなものがあります。

<verb>
DPT Smartcache (Plus) family:
PM2011      ISA	    Fast Single-ended SCSI-2
PM2012B     EISA    Fast Single-ended SCSI-2

DPT Smartcache III family:
PM2021 	    ISA     Fast Single-ended SCSI-2
PM2021W     ISA     Wide Single-ended SCSI-2
PM2022      EISA    Fast Single-ended SCSI-2
PM2022W     EISA    Wide Single-ended SCSI-2
PM2024      PCI     Fast Single-ended SCSI-2
PM2024W     PCI     Wide Single-ended SCSI-2
PM2122      EISA    Fast Single-ended SCSI-2
PM2122W     EISA    Wide Single-ended SCSI-2
PM2124      PCI     Fast Single-ended SCSI-2
PM2124W     PCI     Wide Single-ended SCSI-2
PM2322      EISA    Fast Single-ended SCSI-2
PM2322W     EISA    Wide Single-ended SCSI-2

DPT Smartcache VI family:
PM2041W     ISA     Wide Single-ended SCSI-2
PM2041UW    ISA     Ultra Wide Single-ended SCSI-2
PM2042W     EISA    Wide Single-ended SCSI-2 
PM2042UW    EISA    Ultra Wide Single-ended SCSI-2 
PM2044W     PCI     Wide Single-ended SCSI-2
PM2044UW    PCI     Ultra Wide Single-ended SCSI-2
PM2142W     EISA    Wide Single-ended SCSI-2
PM2142UW    EISA    Ultra Wide Single-ended SCSI-2
PM2144W     PCI     Wide Single-ended SCSI-2
PM2144UW    PCI     Ultra Wide Single-ended SCSI-2
PM2322W     EISA    Wide Single-ended SCSI-2
PM2322UW    EISA    Ultra Wide Single-ended SCSI-2

DPT SmartRAID family:
PM3021 	    ISA     Fast Single-ended SCSI-2
PM3021W	    ISA     Wide Single-ended SCSI-2
PM3122      EISA    Fast Single-ended SCSI-2
PM3122W     EISA    Wide Single-ended SCSI-2
PM3222      EISA    Fast Single-ended SCSI-2
PM3222W     EISA    Wide Single-ended SCSI-2
PM3224      PCI     Fast Single-ended SCSI-2
PM3224W     PCI     Wide Single-ended SCSI-2
PM3334W     PCI     Wide Single-ended SCSI-2
PM3334UW    PCI     Ultra Wide Single-ended SCSI-2
</verb>

この他、上記のボードに対応するディファレンシャル SCSI の
ボードもサポートされています。

また以下のメーカのコントローラにもサポートされているものが
あります。

NEC、AT&amp;T、SNI、AST、Olivetti、Alphatronix

<sect2>可能な設定<p>

<tscreen><verb>
スロット       : ALL
IO ポート      : ALL
IRQ            : 全レベル、エッジトリガ
DMA チャネル   : ISA のものは全て、EISA/PCI は関係無し
IO             : ポートマップ方式、バスマスタ方式
SCSI Channels  : ALL
</verb></tscreen>

<sect2>自動検出<p>

全ての設定で動作します。

EATA-DMA ドライバの最新バージョンは以下から入手できます。

<tscreen>
<url url="ftp://ftp.i-Connect.Net:/pub/Local/EATA/">
</tscreen>

<sect2>メーリングリスト<p>
EATA メーリングリストは EATA-DMA および EATA-PIO ドライバを使用してい
る Linux ユーザに議論の場と新バージョンその他のアナウンスの場を提供し
ています。メーリングリストに参加するには、
メッセージ本文に「subscribe」と書いたメールを
<htmlurl url="mailto:linux-eata-request@i-connect.net"
name="linux-eata-request@i-connect.net"> 宛に
送ってください。

<sect2><tt>/proc/scsi</tt> サポート<p>
<tscreen><verb>
より詳細なコマンドの統計をとるには以下を実行してください。

echo "eata_dma latency" > /proc/scsi/eata_dma<driver_no>

これを再び off にするには以下のようにします。

echo "eata_dma nolatency" > /proc/scsi/eata_dma<driver_no>
</verb></tscreen>

<sect2>よくある問題<p>

<enum>
<item> Slackware でコントローラを検出できない。
<p>
解決法は、<tt/ascsi*/ のブートディスクを使うことです。

<item> 1.3.x 以前のカーネルで、IDE ドライバが EATA ボードの ST-506 イ
ンターフェースを検出してしまう。

<enum>
<item>以下の 2 例のような状況となります。

<tscreen><verb>
hd.c: ST-506 interface disk with more than 16 heads detected,
  probably due to non-standard sector translation.  Giving up.
  (disk %d: cyl=%d, sect=63, head=64)
</verb></tscreen>

<tscreen><verb>
hdc: probing with STATUS instead of ALTSTATUS
hdc: MP0242 A, 0MB w/128KB Cache, CHS=0/0/0
hdc: cannot handle disk with 0 physical heads
hdd: probing with STATUS instead of ALTSTATUS
hdd: MP0242 A, 0MB w/128KB Cache, CHS=0/0/0
hdd: cannot handle disk with 0 physical heads
</verb></tscreen>

このために IDE ドライバに問題が生じたら (つまり実際の IDE デバイスに
アクセスできなくなったら)、EATA ボードの IO ポートか IRQ (あるいはその
両方) を変えてみてください。

<item>IDE のドライバが自分の扱うべきデバイス (つまり 504MB 以下のハー
ドディスク) を検出すると、 IDE ドライバは IO ポートと IRQ を割り当てて
しまうので、 eata のドライバはそれらを使えなくなります。この場合も IO 
ポートと IRQ (14、15 以外に) を変更してください。
</enum>

<item>古い SK2011 のボードにはファームウェアに問題がある場合があります。
DPT のカスタマーサポートに連絡してアップデートしてください。
</enum>

<sect2>注意<p>
<enum>
<item> もし PCI のボードを使っている場合は CONFIG_PCI をセットする必要
があります。
</enum>

<sect1> TMC-1800、TMC-18C30、TMC-18C50、TMC-36C70 のうちのどれかのチップ
を使っている Future Domain の 16x0
<p>

<sect2>可能な設定<p>

<tscreen><verb>
<BIOS           : 2.0, 3.0, 3.2, 3.4, 3.5
<BIOS アドレス  : 0xc8000, 0xca000, 0xce000, 0xde000
<IO ポート      : 0x140, 0x150, 0x160, 0x170
<IRQ            : 3, 5, 10, 11, 12, 14, 15
<DMA チャネル   : 使用しません
<IO             : ポートマップ方式
</verb></tscreen>

<sect2>自動検出<p>

全ての設定で動作します。 BIOS がインストールされていることが必要です。

<sect2>自動検出の設定変更<p>

ありません。

<sect2>アップデートによって解決された問題<p>
<enum>
<item> 古いバージョンでは TMC-18C50 チップに対応していません。
従って新しいボードでは動作しないでしょう。
<item> 古いバージョンは最近の BIOS シグネチャの自動検出情報を持っていません。
<item> 1.0.9 あるいは 1.1.6 カーネルに含まれているバージョンよりも古い
ドライバでは、新しいチップや 3.4 版の BIOS に対応していません。
</enum>

<sect2>注意<p>
<enum>
<item> Future Domain の BIOS は SCSI 番号の大きい方からデバイスをスキャン
します。これは他の SCSI BIOS とは逆になります。従って sda になるのは
「ドライブ番号」の最後 (つまり C:、D: とあったら D:) のディスクになります。
また LILO を使う際には <tt/disktab/ を使用する必要があります。
</enum>

<sect1> NCR5380 汎用 / T130B (標準)
<p>

<sect2>可能な設定<p>

<tscreen><verb>
IO ポート     : all
IRQ           : all
DMA チャネル  : DMA は使用しません
IO            : ポートマップ方式
</verb></tscreen>

<sect2>自動検出<p>

できません。

<sect2>自動検出の設定変更<p>

<descrip>
<tag/コンパイル時/
<tt/GENERIC_NCR5380_OVERRIDE/ を IO ポート、IRQ、DMA、およびボード形式
からなる配列データとして定義します。

ポート 0x330、IRQ 5 の NCR5380 の場合は以下のようになります。
<verb>
#define GENERIC_NCR5380_OVERRIDE {{0x330, 5, DMA_NONE, BOARD_NCR5380}}
</verb>

ポート 0x350 の T130B の場合なら以下のようになります。
<verb>
#define GENERIC_NCR5380_OVERRIDE {{0x350, 5, DMA_NONE, BOARD_NCR53C400}}
</verb>

古いバージョンのコードでは <tt/BOARD_*/ のエントリが無視されるかもしれません。

IRQ の部分に <tt/IRQ_NONE/ と <tt/IRQ_AUTO/ が使えます。

<tag/カーネルのコマンドライン/

<verb>
ncr5380=port,irq
ncr5380=port,irq,dma
ncr53c400=port,irq
		 
irq を使わない場合は 255、自動選択する場合は 254 にします。
</verb>

</descrip>

<sect2>よくある問題<p>

<enum>
<item> T130B で NCR5380 汎用の古いドライバ (パブリック
リリース 6 以前) を使うと ncr53c400 コマンドラインオプションが使えない。
<p>
NCR5380 互換レジスタのベースアドレスからのオフセットは 8 です。
従って、ベースアドレスが 0x350 ならば、カーネルのコマンドラインから
以下のように入力してください。

<tscreen><verb>
ncr5380=0x358,254
</verb></tscreen>

</enum>

<sect2>アップデートによって解決された問題<p>
<enum>
<item> T130B 等の NCR53c400 を用いたボードで、カーネルがディスクアクセス中に
フリーズする。
<p>
パブリックリリース 6 以前の NCR5380 汎用ドライバは
これらのボードの割り込みに対応していません。
バージョンアップして下さい。
</enum>

<sect2>注意<p>

<enum>
<item> このドライバはまだ DMA をサポートしていません。
擬似 DMA もサポートされていません。
</enum>

<sect1> NCR53c8xx (標準)
<p>

<sect2>可能な設定<p>

<tscreen><verb>
ベースアドレス : ALL
IRQ            : ALL
DMA チャネル   : PCI なので関係なし
IO             : ポートマップ方式、バスマスタ方式
</verb></tscreen>

<sect2>自動検出<p>

PCI BIOS が必要です。デバイスのスキャンやコンフィギュレーション空間の
読み出しには PCI BIOS のルーチンを使っています。

<p>
ドライバは初期化の際、いくつかのレジスタにプログラムされている値を用います。
従って BIOS がインストールされている必要があるのです。

<sect2>アップデートによって解決された問題<p>

<enum>

<item> 古いバージョンのカーネルではスワップの際に問題が生じることがあります。
<ref id="SystemHangs" name="ディスク: スワップ時にシステムがハングする"> の
節を見て下さい。

<item> 古いドライバでは '815 と '825 を用いたボードを認識できません。

<item> 配布版のカーネルに入っているドライバはリリース 4 または 5 の
ものです。これらにはまだ重要な機能が実装されていません。
例えばディスコネクト/リコネクト (これがないとテープの巻戻しや頭出しの
ときに SCSI デバイスをフリーズさせてしまう原因になります) や複数の
ホストアダプタへの対応、BIOS なしの動作などです。
<quote>
訳注: 最新のカーネル (2.0.27) では、ディスコネクト/リコネクトは
サポートされています。
</quote>
<p>

ドライバの最新リリース版は以下のところから手に入ります。

<tscreen>
<url url="ftp://tsx-11.mit.edu/pub/linux/ALPHA/scsi/ncr53c810">
</tscreen>

現在のところここには 1.2.10 以降へのパッチが置いてありますが、
次のリリースでは 1.3.x だけになります。これらのパッチはすべて
完璧に当たるとは限りません。ELF 対応パッチや他のパッチが開発
者である私のベースシステムには既に当たっているからです。
もしパッチの際の障害 (４つあります) を手動で訂正できない場合は、
これらのパッチは使わないで下さい。パッチは最新のものだけが必要です。
インクリメンタルなパッチではありません。

次のリリースが待てず、NCR のドライバを 1.3.x カーネルで使いたいという方の
ために、 Harald Evensen <htmlurl url="mailto:Harald.Evensen@pvv.unit.no"
name="&lt;Harald.Evensen@pvv.unit.no&gt;"> が 1.3.x 用の
パッチを公開しています。

<tscreen>
<url url="ftp://ftp.pvv.unit.no/pub/Linux/ALPHA/ncr">
</tscreen>

これらのパッチは問題なく当たるはずです。

まずこれらのディレクトリの README ファイルをすべて読んで下さい。
またアルファ版のコードを用いたい場合は NCR メーリングリストにも
入って下さい。ここでは暫定的なバグフィックスや次バージョンの
リリース情報などがポストされます。

参加するには以下のような内容をメール本文に書いて、
<htmlurl url="mailto:majordomo@colorado.edu"
name="majordomo@colorado.edu"> に
送って下さい。

<tscreen><verb>
subscribe ncr53c810
</verb></tscreen>

参加をやめる場合にはメール本文に以下のような内容を書いて同じアドレスに
送って下さい。
<tscreen><verb>
unsubscribe ncr53c810
</verb></tscreen>

</enum>

<sect2>よくある問題<p>
<enum>
<item>
DOS ではうまく動いているのに、Linux では割り込み待ちの状態で
タイムアウトしてしまう、という問題を多くの人が経験しています。
<label id="NCRCommonProblem1">

これはスロットのカードないしはマザーボードのジャンパによる IRQ の
ハードウェア設定と、BIOS 設定の値が異なっているためで
あることが多いようです。以下をよく確認して下さい。

<itemize>
<item> 使用している IRQ はマザーボードの NCR チップもしくは
スロットの NCR ボードだけが使っている。
<item> オンボードチップやスロットの IRQ を設定するマザーボード上の
ジャンパが BIOS の設定と合っている。
<item> PCI のマザーボードは自動割り当て機能を持っていることが
ありますが、うまく動くとは限りません。
</itemize>

PCI の INTA しかサポートしていないシステムで、INTB、
INTC、INTD などが選択されているのが原因なこともあります。
もしお使いの NCR のボードに PCI 割り込みラインを選択する
ジャンパがあったら INTA にしておくようにして下さい。

最後に、PCI はエッジトリガではなく、レベルセンス割り込みを使わなくては
なりません。ボードにジャンパがある場合には、レベルセンスに設定されている
ことを確認してください。それでもうまくいかない場合には、もしかすると
設定が逆になっているかもしれませんから、エッジトリガの方を試してみて
ください。

この問題は特に Viglen のマザーボードによく見られます。Viglen の
ボードでは IRQ のジャンパ設定がマニュアルの記述とは違っているのです。
マニュアルで IRQ5 と記述されているところが実は IRQ9 なのだそうです。
しかしあなたのボードではもしかしたらまた違うことになっているかも
しれません。

<item> S3 928 や Tseng ET4000W32 PCI 等のビデオカードを一緒に用いると、
システムフリーズなどの問題が生じる。

これらのチップの (少なくともいくつかのバージョンにおける) ハードウェア
上のバグのためです。これらは使わないようにしてください。

<item> 『ベースアドレス 0 のビット 0..1 の内容にしたがって 
I/O マッピングを無効にする』といったメッセージがブート時に出る。

これはいくつかのシステムに存在するバグのためです。
設定レジスタの 4 バイトの値を読んでくるとき、
上位と下位の 16 ビットワードの値を逆に返してしまうのです。

<item> システムによっては PCI の遅延書き込みや CPU-&gt;PCI の
バッファリングを有効にすると問題が生じることがあります。
問題が生じたら、これらの機能はオフにして下さい。
<quote>
訳注: 特に neptune や mercury チップセットは危ないようです。
</quote>

<item> ボード上の BIOS ROM とシステム BIOS の両方に NCR SDMS ソフト
ウェアを持っているようなシステムで、DOS をブートすることができない。

どちらかの BIOS を無効にすればこの問題は解決します。

<item> 以下のようなメッセージが出てしまう

<tscreen><verb>
"scsi%d: IRQ0 not free, detaching"
</verb></tscreen>

あるいは次のような場合もあります。

<tscreen><verb>
"scsi%d: IRQ255 not free, detaching"
</verb></tscreen>

割り込みラインを設定する NCR のチップの PCI 設定レジスタが、
すべて 0 または 1 にセットされてしまっています。
設定に問題があるか (<ref id="NCRCommonProblem1"
name="よくある問題: その1"> を見て下さい)、マザーボードの BIOS に
欠陥があるのでしょう。

<tt>drivers/scsi/ncr53c7,8xx.c</tt> の <tt/pci_init()/ 関数を変更すると
この問題を回避することができます。

<tscreen><verb>
irq = my_irq;
</verb></tscreen>

という行を以下の部分の前に追加して下さい。

<tscreen><verb>
return normal_init (tpnt, board, chip, (int) base, 
    (int) io_port, (int) irq, DMA_NONE, 1, bus, device_fn, 
    options);
</verb></tscreen>

<item> いくつかのシステムでは BIOS チップの内容がひどくいかれている場
合があります。お使いのボードベンダーの最新の ROM を使っていない場合は、
バグレポートは送らないようにしてください。

<item> コマンドラインオプションの <tt/ncr53c810=xxx/ などが機能しない

現在のカーネルでは <tt>init/main.c</tt> にこれらのオプションへの
エントリポイントが無いためです。これは実は根拠があってのことです。

コマンドラインオプションが与えられていると、ドライバは必ずそのパラメー
タでボードの自動検出を行ないます。もしコマンドラインの設定が PCI の設
定ルーチンで得られるものと異なると、問題が生じることになります。

実際にコマンドラインによる指定が必要となるのは、PCI のハードウェアと 
BIOS が壊れている場合でしょうが、この場合はエラー復帰ルーチンも
機能しないので、コマンドラインオプションにはほとんど価値がないのです。

最後に。利用者がコマンドラインオプションを必要だと考えるのは、ドライバ
が設定などのエラーメッセージを出したときだけです。が、ドライバが設定に
問題があると言ってきたときは、システムの設定に問題があるか、あるいはシ
ステムが壊れているかなのです。このような場合コマンドラインオプションを
使っても問題は解決しません。

<tt>init/main.c</tt> に適当なエントリポイントを追加すればコマンドライン
オプションを有効にすることはできるかもしれませんが、これは完全にサポート
の範囲外であるだけでなく、おそらく動作もしないでしょう。

<item> NCR BIOS を用いていないボード (特に Nexstor のもの) で
タイムアウトが発生します。

この種のボードの ROM の中には、電源投入時の同期転送交渉を行うものが
ありますが、Linux のドライバはその結果を知ることができません。
この状態で配布版の NCR のドライバが SCSI デバイスと通信しようとすると
タイムアウトしてしまい、SCSI バスのリセットや再交渉が実行できないので
タイムアウトからの復帰ができません。

この問題が起こったら、ボードの設定プログラムで同期転送を無効にするか、
最新のアルファ版ドライバを用いて下さい。最新版の NCR ドライバでは同期
転送が行なえるようになっています。
<quote>
訳注: 2.0.27 のドライバは、同期転送をサポートしています。
</quote>

<item> Tyan S1365 '825 ボードで、タイムアウトの際
(特にディスコネクトが有効になっていると) 問題が生じる。

これらのボードの付属ドキュメントにおけるターミネーション
設定ジャンパの記述は逆になっています。
従って off にしたつもりが on に、on が off になってしまいます。

ジャンパの位置を逆にしてみてください。
</enum>

<sect2>注意<p>
<enum>
<item> CONFIG_PCI を設定しておく必要があります
</enum>

<sect1> Seagate ST0x/Future Domain TMC-8xx/TMC-9xx (標準)
<p>

<sect2>可能な設定<p>

<tscreen><verb>
ベースアドレス : 0xc8000, 0xca000, 0xcc000, 0xce000, 0xdc000, 0xde000 
IRQ            : 3, 5
DMA チャネル   : 使用されません
IO             : メモリーマップ方式
</verb></tscreen>

<sect2>自動検出<p>

アドレスに関してのみスキャンを行ないます。 
IRQ は 5 とみなされます。BIOS がインストールされている必要があります。

<sect2>自動検出の設定変更<p>

<descrip>
<tag/コンパイル時/
<tt/OVERRIDE/ をベースアドレスに、<tt/CONTROLLER/ を <tt/FD/ もし
くは <tt/SEAGATE/ のどちらかに、<tt/IRQ/ をシステムの IRQ にそれぞれ
定義します。

<tag/カーネルのコマンドライン/

<tscreen><verb>
st0x=address, irq または tmc8xx=address,irq 
(0.99.13b 以降のカーネルで動作します)
</verb></tscreen>

</descrip>

<sect2>アップデートによって解決された問題<p>

<enum>
<item> カーネル 0.99.12 以前に添付されていたバージョン 1 以前の
ドライバでは、遅いデバイスとのハンドシェイクに失敗することがあります。
<p>
ハンドシェイクは以下のような手順で行われます。

<enum>
<item> 1バイトのデータをデータレジスタに書き込み、データレジスタが
バスにアサートされる
<item> 残り時間 = 12 us
<item> 残り時間 &gt; 0 で、REQ がアサートされていない間待つ
<item> 残り時間 &gt; 0 ならば ACK をアサートする
<item> 残り時間 &gt; 0 で REQ がアサートされている間待つ
<item> ACK をデアサートする
</enum>

コマンドを読み込んで処理するのが遅いデバイスでは、 REQ/ACK ハンドシェ
イクに 12us 以上の時間がかかってしまいます。するとドライバで指定されて
いる経過時間が過ぎても REQ がデアサートされないので、
一つの REQ パルスに対して複数バイトのデータを送ってしまいます。

カーネル 0.99.12 にはバグがあって、アービトレーションのコードを
書き換えた結果セレクションが失敗するようになっていました。
0.99.13 で修正されています。
</enum>
	
<sect2>よくある問題<p>

<enum>

<item> カーネルがパーティションテーブルの読み込みなどのディスクアクセ
スを行なおうとすると、コマンドのタイムアウトが起こる。
<p>
出荷時のボードのデフォルト設定は MSDOS 向けになっています。
つまり割り込みが無効になっているのです。割り込みを有効にする
ジャンパスイッチは、 Seagate のボードではジャンパ W3 (ST01) 
または JP3 (ST02) で、IRQ 5 を選択するには F と G のピンを
ショートします。

<item> ドライバが扱えないデバイス (特に安い SCSI テープドライブや 
CD-ROM など) がある。

Seagate のボードでは、 SCSI バスの REQ/ACK ハンドシェイクを ISA バス
の IO CHANNEL READY および 0WS シグナル (こちらはオプション) と関連
づけています。残念ながらこれではいつウォッチドッグタイマがタイムアウト
したのかを知ることができないため、REQ 信号の立ち下がりを確実に知る
ことができず、結果としてひとつの REQ パルスを複数の REQ パルスと
みなしてしまうおそれがあります。

これをちゃんと扱うには REQ 信号が low に変わるのをループで監視し、
割り込みなどによって信号の切り替わりをキャッチできなかったときの
ためにタイムアウトを出すようにしなければなりません。
この取り扱いをすると性能が落ちてしまうので、全ての SCSI デバイスに
適用するのは得策ではありません。代わりに <tt/scsi_devices/ 配列の
<tt/broken/ フィールドの値を用いて、デバイスごとに選択する
ようにしています。
もし問題が生じたら、該当するデバイスを <tt/broken/ が 0 にリセット
されないデバイスのリストに登録してください。
現在リストには TENEX CDROM ドライブのみが登録されています。

<item> Future Domain のボード (特に 840、841、880、881) が動作しない

Future Domain のボードのいくつかでは Seagate のレジスタマッピングを用
いていますが、ステータスレジスタの MSG および CD のビットが逆転してい
ることがあります。

<tt/seagate.h/ を編集して、<tt/STAT_MSG/ と <tt/STAT_CD/ の定義を交換し、
カーネルを再コンパイルして下さい。
その際 <tt/CONTGROLLER/ を <tt/SEAGATE/ に定義し、
<tt/IRQ/ と <tt/OVERRIDE/ を適当な値に設定して下さい。

<item> ドライブを <tt/fdisk/ しようとすると、<tt/HDIO_REQ/ か 
<tt/HDIO_GETGEO ioctl/ が失敗したというエラーメッセージや、
以下のようなエラーメッセージが表示される。

<verb>
You must set heads sectors and cylinders.
You can do this from the extra functions menu.
</verb>

<ref id="DiskPartitioning" name="パーティションの作成"> を
見て下さい。

<item> 手動でドライブのジオメトリを設定してからパーティションテーブル
を読み込もうとすると、『パーティションの境界がシリンダの境界と一致して
いない』とか『物理的な境界と論理的な境界が一致していない』などといった
エラーメッセージが出る。

<ref id="DiskPartitioning" name="パーティションの作成"> を見て下さい。

<item> 0.99.13 以前のカーネルでは動くが、新しいカーネルでは動かなく
なるシステムがあるようです。

古いバージョンのカーネルでは CONTROL と DATA レジスタを Seagate の
ドキュメントとは逆の順序で代入しており、いくつかのシステムでうまく
動かなくなることがありました。新しいバージョンでは正しい順序にしま
したが、これによって他のシステムがうまく動かなくなってしまうことが
あるようです。

<tt/seagate.c/ には以下のようなコードがあるはずです。

<tscreen><verb>
cli();
DATA = (unsigned char) ((1 &lt;&lt; target) | (controller_type == SEAGATE ? 0x80 : 0x40));
CONTROL = BASE_CMD | CMD_DRVR_ENABLE | CMD_SEL | 
	    (reselect ? CMD_ATTN : 0);
sti();
</verb></tscreen>

これを以下のように直せば解決するでしょう。

<tscreen><verb>
cli();
CONTROL = BASE_CMD | CMD_DRVR_ENABLE | CMD_SEL | 
	    (reselect ? CMD_ATTN : 0);
DATA = (unsigned char) ((1 &lt;&lt; target) | (controller_type == SEAGATE ? 0x80 : 0x40));
sti();
</verb></tscreen>

</enum>

<sect2>定義可能なパラメータ<p>

<descrip>
<tag><tt/FAST/ または <tt/FAST32/</tag> これらを定義すると
可能な場合にはブラインド転送を行ないます。

<tag><tt/ARBITRATE/</tag> ホストアダプタが SCSI-II 互換の
アービトレーションを行なうようにします (バスフリーフェーズを待って
いきなりセレクションをはじめるのではなく)。
配布版のソースを再構成する時には、LUN 当たりひとつのコマンドを
実行するように変更する予定です (訳注: つまり今はそうなっていないと
いうことか？)。

<tag><tt/SLOW_HANDSHAKE/</tag> Seagate のソースコードのハンドシェイクの
スピードについていけないイカレたデバイス (ある種の CD ROM など) を使う
時に定義してください。

<tag><tt/SLOW_RATE=x/</tag> ハンドシェイクが正しく動作しないときに
デフォルトの転送レートにする値を x に指定します。

</descrip>

<sect1> PAS16 SCSI (標準)
<p>

<sect2>可能な設定<p>

<tscreen><verb>
IO ポート      : 0x388, 0x384, 0x38x, 0x288
IRQ            : 10, 12, 14, 15
        (重要) : IRQ はこのボードのサウンド機能が用いる IRQ とは
                 別にする必要があります。
DMA            : このボードの SCSI 機能では用いません。
IO             : ポートマップ方式
</verb></tscreen>

<sect2>自動検出<p>

<tscreen>
BIOS は必要ありません。
</tscreen>

<sect2>自動検出の設定変更<p>

<descrip>
<tag/コンパイル時/

<tt/PAS16_OVERRIDE/ を IO ポートと IRQ の配列として定義して下さい。
ポート 0x388、IRQ10 の場合ならば以下のようになります。

<tscreen><verb>
#define PAS16_OVERRIDE ((0x388, 10))
</verb></tscreen>

<tag/カーネルのコマンドライン/

<tscreen><verb>
pas16=port,irq 
</verb></tscreen>

</descrip>

<sect2>定義可能なパラメータ<p>

<descrip>
<tag><tt/AUTOSENSE/</tag> 定義されていると CHECK CONDITION ステータスを
返してくるコマンドに対して自動的に REQUEST SENSE が実行されます。

<tag><tt/PSEUDE_DMA/</tag> 擬似 DMA のハードウェアを使用できるようにします。
性能は I/O ポーリングを使ったものの 3-4 倍になります。

<tag><tt/PARITY/</tag> パリティチェック機能を有効にします。
まだサポートされていません。

<tag><tt/SCSI2/</tag> SCSI-II タグ付きコマンドキューイングをサポートします。
テストされていません。

<tag><tt/UNSAFE/</tag> 割り込みを許可したまま擬似 DMA 転送を行います。
高速シリアル通信でデータ落ちが生じる場合にだけ使って下さい。
その場合でも、転送サイズを変更する方が良い結果が得られるでしょう。

<tag><tt/USLEEP/</tag> ディスコネクトを行なわないデバイスをサポートします。
テストされていません。

</descrip>

<sect2>よくある問題<p>
<enum>
<item> コマンドがタイムアウトしたり強制終了してしまう

少し前に私がネットにポストした NCR5380 のパッチをインストールするのが
良いでしょう。このパッチは将来のアルファ版に統合されるはずです。このパッ
チでは古い NCR5380 ドライバにあった排他制御の問題を修正しており、また 
NCR5380 を用いたボードの複数デバイスのサポートの部分もなおしてあります。

これで直らなければ、<tt/PSEUDO_DMA/ の定義を無効にして下さい。
<tt>drivers/scsi/pas16.c</tt> の中の <tt>&num;define PSEUDO_DMA </tt>を 
<tt>&num;undef PSEUDO_DMA</tt> に修正します。

後者の方法は最後の手段と思って下さい。この方法を選ぶと著しく性能が落ち
てしまいます。
</enum>


<sect1> Trantor T128/T128F/T228 (標準)
<p>

<sect2>可能な設定<p>

<tscreen><verb>
ベースアドレス :  0xcc000, 0xc8000, 0xdc000, 0xd8000
IRQ            : なし, 3, 5, 7  (全てのボード)
	         10, 12, 14, 15 (T128F のみ)
DMA            : 使用していません
IO             : メモリーマップ方式
</verb></tscreen>

<sect2>自動検出<p>

全ての設定において動作します。BIOS がインストールされている必要があります。

<sect2>自動検出の設定変更<p>

<descrip>
<tag/コンパイル時/

<tt/T128_OVERRIDE/ をベースアドレスと IRQ からなる配列として定義します。
例えばアドレス 0xcc000、IRQ 5 のボードの場合には以下のようになります。
IRQ の指定には <tt/IRQ_NONE/ と <tt/IRQ_AUTO/ も使えます。

<tscreen><verb>
#define T128_OVERRIDE ((0xcc000, 5))
</verb></tscreen>

<tag/カーネルのコマンドライン/

<tscreen><verb>
t128=address,irq
</verb></tscreen>
IRQ を用いないときは -1 を、自動検出には -2 を指定します。

</descrip>

<sect2>定義可能なパラメータ<p>

<descrip>
<tag><tt/AUTOSENSE/</tag> 定義されていると CHECK CONDITION ステータスを
返してくるコマンドに対して自動的に REQUEST SENSE が実行されます。

<tag><tt/PSEUDE_DMA/</tag> 擬似 DMA のハードウェアを使用できるようにします。
性能は I/O ポーリングを使ったものの 3-4 倍になります。

<tag><tt/PARITY/</tag> パリティチェック機能を有効にします。
まだサポートされていません。

<tag><tt/SCSI2/</tag> SCSI-II タグ付きコマンドキューイングをサポートします。
テストされていません。

<tag><tt/UNSAFE/</tag> 割り込みを許可したまま擬似 DMA 転送を行います。
高速シリアル通信でデータ落ちが生じる場合にだけ使って下さい。
その場合でも、転送サイズを変更する方が良い結果が得られるでしょう。

<tag><tt/USLEEP/</tag> ディスコネクトを行なわないデバイスをサポートします。
テストされていません。

</descrip>

<sect2>よくある問題<p>
<enum>
<item> コマンドがタイムアウトしたり強制終了してしまう

少し前に私がネットにポストした NCR5380 のパッチをインストールするのが
良いでしょう。このパッチは将来のアルファ版に統合されるはずです。このパッ
チでは古い NCR5380 ドライバにあった排他制御の問題を修正しており、また 
NCR5380 を用いたボードの複数デバイスのサポートの部分もなおしてあります。

これで直らなければ、<tt/PSEUDO_DMA/ の定義を無効にして下さい。
<tt>drivers/scsi/pas16.c</tt> の中の <tt>&num;define PSEUDO_DMA </tt>を 
<tt>&num;undef PSEUDO_DMA</tt> に修正します。

後者の方法は最後の手段と思って下さい。
この方法を選ぶと著しく性能が落ちてしまいます。
</enum>

<sect1> Ultrastor 14f (ISA)、24f (EISA)、34f (VLB) (標準)
<p>

<sect2>可能な設定<p>

<tscreen><verb>
IO ポート      : 0x130, 0x140, 0x210, 0x230, 0x240, 0x310, 0x330, 0x340
IRQ            : 10, 11, 14, 15
DMA チャネル   : 5, 6, 7
IO             : ポートマップ方式、バスマスタ方式
</verb></tscreen>

<sect2>自動検出<p>

ポートが 0x310 の場合は機能しません。BIOS は必要ありません。

<sect2>自動検出の設定変更<p>

コンパイル時のみです。<tt/PORT_OVERRIDE/ を定義します。

<sect2>よくある問題<p>
<enum>

<item> ポートアドレス 0x310 は自動検出されません。
また、もしネットワーク機能が有効になっていると衝突の原因になってしまいます。

別のアドレスを用いて下さい。

<item> Ultrastor で 0x330 を用いると、サウンドドライバが自動検出を
行なった際にシステムがハングアップすることがあります。

別のアドレスを用いて下さい。

<item> 他のドライバが行なう自動検出は必ずしも安全ではなく、また様々な
アドレスが探索されます。もし検出に失敗したりシステムがブート時にハング
アップするときは、別のアドレスを試してみてください。

おすすめのアドレスは 0x340 です。これは動くことがわかっています。

<item> SCSI デバイスがひとつも検出されず、Ultrastor に接続されている 
SCSI ハードディスクが IDE ハードディスクとして認識されるが、
IDE ドライバにはサポートされない。
この場合以下のようなメッセージが出力されるでしょう。

<verb>
hd.c: ST-506 interface disk with more than 16 heads detected, 
probably due to non-standard sector translation.  Giving up.
(disk &percnt;d: cyl=&percnt;d, sect=63, head=64)
</verb>

これは Ultrastor のボードを WD1003 のエミュレーションモードで
動作させているときに起こります。解決法は二つあります。

<enum>

<item> Ultrastor をネイティブモードに切り替えます。こちらがお薦めです。
なぜなら SCSI ドライバは IDE ドライバより高速だからです。特にクラスタ
単位の read/write パッチが当たっている場合は高速で、ファイルシステムを
介して 2M/sec 以上の転送レートが得られているユーザもいるそうです。

もしハードディスク以外のデバイスを用いていたり、2 台以上のハードディ
スクを Ultarstor に接続している場合は、こちらが唯一の選択肢となります。

<item> カーネルのコマンドラインオプションを用います。

<tscreen><verb>
hd=cylinders,heads,sectors
</verb></tscreen>

とするとデフォルト設定が上書きされ、ブートできるようになります。シリン
ダ、ヘッダ、セクタの数はそれぞれ 2048、16、255未満にして、それらを
掛けた値が本来の値と等しくなるようにします。

Linux から fdisk を用いる際にも手動でディスクのジオメトリを指定する必
要があります。そうしないとパーティションエントリが正しく書き込まれない
ため、 Linux では動作しますが DOS ではシリンダ／ヘッド／セクタ各エン
トリの取得に失敗するので動作しなくなってしまいます。

一度 Linux が立ち上がってしまえば、<tt>include/linux/config.h</tt> の 
<tt/HD_TYPE/ マクロを適当な値に定義して再コンパイルすることで、
手動ブートしなくてもすむようになります。

</enum>

</enum>

<sect1> Western Digital 7000 (標準)
<p>

<sect2>可能な設定<p>

<tscreen><verb>
BIOS アドレス  : 0xce000
IO ポート      : 0x350
IRQ            : 15
DMA チャネル   : 6
IO             : ポートマップ方式、バスマスタ方式
</verb></tscreen>

<sect2>自動検出<p>

BIOS がインストールされている必要があります。

<sect2>よくある問題<p>

<enum>
<item> チップやファームウェアにいくつかのバージョンがあります。おそら
くバージョン 3 のボードは動作しません。バージョン 5 は大丈夫です。無印
のチップは動作せず、'A' が最後についているものは動作します。

<item> このボードは、ドライバでサポートしていない BIOS アドレスを使う
ことができるようです。この場合ドライバがサポートしているアドレスを
使って下さい。また <ref id="BugReport" name="バグレポート"> に従って
バグレポートを送って下さい。
</enum>

<sect1> AM53/79C974 (アルファ版)
<p>

<tscreen>
<url url="ftp://tsx-11.mit.edu/pub/linux/ALPHA/scsi/AM53C974-0.3.tar.gz">
</tscreen>

にあります。
<quote>
訳注: カーネル 2.0.27 には含まれています。
</quote>

<sect2>可能な設定<p>

<tscreen><verb>
IO ポート      : all
IRQ            : all
DMA チャネル   : 6
IO             : ポートマップ方式、バスマスタ方式 (unintelligent)
</verb></tscreen>

<sect1> qlogic (標準)
<p>
ねえ Drew、この章はどこにあるの？ 目次にしかないよ ;-) - by D.F.

<sect> ディスク <label id="Disks">
<p>

ここでは、ディスクドライブに固有の情報を示します。

<sect1> 対応している (いない) ハードウェア
<p>

すべてのダイレクトアクセス SCSI デバイス (訳注: これは「ハードディスク」を
意味する SCSI 用語です) で、ブロックサイズが 256バイトか 512バイト、または
1024バイトのものは使えるはずです。
これ以外のブロックサイズは使えませんが、多くの場合ブロックサイズまたは
セクタサイズは SCSI の MODE SELECT コマンドを使って変更できます。

セクタサイズとは、デバイスのセクタに割り当てられたデータバイト数のことです。
例えば、CDROM のセクタサイズは 2048 です。

ブロックサイズとは、デバイスとのインターフェースに使用される論理ブロックの
大きさのことです。これは通常セクタサイズと等しいのですが、複数の小さな
物理セクタ (55M サイクエストドライブの場合には 256バイト) を大きな論理
ブロックにマップしたり、逆にひとつの物理セクタを複数の論理ブロックに
分割する (例えば、SUN コンパチブルの CDROM ドライブのブロックサイズは
512 バイトです) こともあります。

リムーバブルメディアデバイスには、Bernouli、フロプティカル、MO ドライブ、
Syquest などの種類があります。

理論的には、1テラバイトまでのドライブは使えるはずです。
9ギガバイトまでの小さなドライブに関しては、まったく問題はありません。

<sect1> よくある問題 
<p>

<sect2> 「シリンダが 1024 よりも多い」というメッセージ
<p>

パーティションを切るときに、「シリンダが 1024 よりも多い」という
警告メッセージが表示される。
あるいは、1024 以降の論理シリンダを含んだパーティションからブート
できない。

これは、BIOS の制限によるものです。

詳しい説明は、<ref id="DiskGeometry" name="ディスクのジオメトリ">
および<ref id="DiskPartitioning" name="パーティションの作成">
を参照してください。

<sect2> <tt>/dev/hd*</tt> にパーティションが切れない
<p>

<tt>/dev/hd*</tt> は SCSI デバイスではありません。
SCSI デバイスは <tt>/dev/sd*</tt> です。  

正しいデバイス名とパーティションの切り方については、
<ref id="DevFiles" name="デバイスファイル">や
<ref id="DiskGeometry" name="ディスクのジオメトリ">、それに
<ref id="DiskPartitioning" name="パーティションの作成">
を参照してください。

<sect2> リムーバブルメディアドライブからメディアを排出できない
<p>

Linux は、メディアがマウントされている時にはドライブのドアを
ロックします。予期せぬメディアの入れ替えによって
ファイルシステムが壊れるのを防ぐためです。

まずディスクをアンマウントしてください。

<sect2> SCSI ディスクから LILO でブートできない
<p>

SCSI ドライバと BIOS との間で、使用すべき BIOS マッピングに関して
情報が食い違っていることがあります。
この場合、ブート時に LILO が「LI」まで表示してハングする
などの問題を引き起こすことがあります。

この問題を回避するためには、DOS で使われる BIOS ジオメトリ
マッピングを調べて、これを <tt>/etc/lilo/disktab</tt> に書き込む
必要があります。

あるいは、「linear」jfile 設定オプションを使うという方法も
あります。

<sect2> <tt/fdisk/ が以下のようなメッセージを出力する
<p>

<tscreen><verb>
You must set heads sectors and cylinders.
You can do this from the extra functions menu.
</verb></tscreen>

そして fdisk を再起動すると、変更したはずのディスクジオメトリが
変更されていない。

<ref id="DiskPartitioning" name="パーティションの作成"> を参照して
ください。

<sect2> ブリッジボードに複数のドライブが接続されているのに、
ひとつのドライブしか検出されない。
<p>

Linux は ANSI SCSI リビジョン 1 以前の SCSI デバイスに対しては、
0 以外の LUN を探しに行きません。
0以外の LUN を認識させたければ、<tt>drivers/scsi/scsi.c</tt> の
<tt/scan_scsis()/ 関数を変更する必要があります。

<sect2> スワップ時にシステムがハングする <label id="SystemHangs">
<p>

この問題はすでに解決されています。
カーネルを 1.1.38 にバージョンアップしてください。

<sect2> Conner の CFP1060S ディスクの内容が壊れる
<p>
<quote>
訳注: 現在 Conner は Seagate に買収されています。
</quote>

これは、先読みとキャッシュに関するマイクロコードのバグのためです。

Soenke Behrens (Conner テクニカルサポート) からのメールより : 

<quote>
過去数週間の間に、Linux オペレーティングシステムを使用していて 
Conner CFP1060x 1GB SCSI ドライブに深刻な問題が生じたという電話を
何人かのお客様から頂きました。
症状は、ファイルシステムの破壊 (inode の損傷) がシステムブート時に 
<tt/e2fsck/ によって報告されるというものです。
<newline>
CFP1060x (マイクロコードリビジョン 9WA1.62/1.66/1.68) と Linux を
使用されているお客様には、マイクロコードの修正が御利用頂けます。
マイクロコードをバージョンアップするためには、DOS ブートディスクと
ハードディスクドライブにアクセスできる ASPI ドライバが必要です。
バージョンアップによって、新しいキューイングと先読みのコードが
ドライブの不揮発性 SCSI RAM にダウンロードされます。
<newline>
マイクロコードリビジョンが 9WA1.60 のディスクで問題が生じた
場合には、最寄りの Conner サービスセンターに連絡して、ディスクを
バージョンアップしてもらう必要があります。
マイクロコードのリビジョンは、ドライブ上のラベルと、ドライブの下側の
IC のひとつに貼られたラベルに書いてあります。
<newline>
自分でバージョンアップできる自信のある方は、Conner テクニカルサポートに
連絡して、最新のマイクロコードを入手してください。
ヨーロッパの Conner テクニカルサポートの電話番号は +44-1294-315333 です。
アメリカの Conner テクニカルサポートの電話番号は 1-800-4CONNER です。
<newline>
敬具
<newline>
Soenke Behrens<newline>
ヨーロッパテクニカルサポート
</quote>

<sect1> デバイスファイル <label id="DevFiles">
<p>

SCSI ディスクのブロックデバイスメジャー番号は 8 で、BSD のような「ロー」
デバイスは存在しません。

ひとつの SCSI ディスクには、16個のマイナー番号が割り当てられています。
minor &percnt; 16 == 0 はディスク全体を表し、1 &lt;= (minor &percnt; 16)
&lt;= 4 は4つのプライマリパーティションを、5 &lt;= (minor &percnt; 16)
&lt;= 15 は拡張パーティション (訳注: 正確には「拡張パーティション中の
論理ドライブ」でしょう) を表します。

たとえば、以下のような構成では次のようにデバイス名が割り当てられます。
(ひとつのホストアダプタの場合)

<verb>
Device			Target, Lun	SCSI disk
84M Seagate 		0	0	/dev/sda
SCSI->SMD bridge disk 0	3	0	/dev/sdb 
SCSI->SMD bridge disk 1	3	1	/dev/sdc
Wangtek tape		4	0	none
213M Maxtor		6	0	/dev/sdd
</verb>

標準的なデバイス名の付け方は、次のようになります。

/dev/sd&lcub;letter&rcub; ディスクデバイス全体 ((minor &percnt; 16) == 0)
<newline>
/dev/sd&lcub;letter&rcub;&lcub;partition&rcub; そのデバイス上のパーティション
	(1 &lt;= (minor &percnt; 16) &lt;= 15)

たとえば次のように。

<verb>
/dev/sda	block device major 8 minor 0
/dev/sda1	block device major 8 minor 1
/dev/sda2	block device major 8 minor 2
/dev/sdb	block device major 8 minor 16
</verb>

<sect1> パーティションの作成 <label id="DiskPartitioning">
<p>

SCSI ディスクにパーティションを切るには、DOS、OS/2、Linux やその他の
標準的なパーティションの作成方法をサポートしている OS 上のパーティション
作成プログラムを使用することができます。

Linux の <tt/fdisk/ プログラムを起動する場合は、必ずデバイスをコマンド
ラインで指定してください。例えば最初の SCSI ディスクにパーティションを
作成する場合には、以下のように入力します。

<tscreen><verb>
fdisk /dev/sda
</verb></tscreen>

デバイスを指定しなかった場合には、デフォルトの <tt>/dev/hda</tt> が
使われてしまうことがあります。これは SCSI ディスクではありません。

<tt/fdisk/ が次のようなメッセージを出力することがあります。

<tscreen><verb>
You must set heads sectors and cylinders.
You can do this from the extra functions menu.

Command (m for help): 
</verb></tscreen>

あるいは <tt/HDIO_REQ/ または <tt/HDIO_GETGEO ioctl/ が失敗したという
メッセージが出力されることもあります。
こういう場合には、<ref id="DiskGeometry" name="ディスクのジオメトリ">
での説明にしたがって、ディスクのジオメトリを入力しなければなりません。
また <tt/LILO/ を使ってそのディスクからカーネルをブートするには、
<tt>/etc/disktab</tt> にもディスクジオメトリを設定する必要があります。

ディスクジオメトリを入力した場合には、その後 <tt/fdisk/ を起動しよう
とすると同様のメッセージが表示されます。これは PC がディスクジオメトリ
情報をパーティションテーブルに保存しないためで、異常ではありません。
それ自体は問題とはなりませんし、そのドライブに作成したパーティション
を Linux でアクセスすることにも問題はありません。
しかし、いくつかのメーカーの出来の悪いインストールプログラムの中には、
これをうまく処理できないものもあります。
その場合にはメーカーに連絡し、プログラムを修正するよう要求してください。

場合によっては、シリンダ 1024 以降に食い込んだパーティションに
関する警告メッセージが出力されることがあります。そのような
パーティションを作成した場合、そのパーティションから LILO を
使って Linux カーネルをブートすることはできません。
しかし、一部または全部がシリンダ 1024 以降にあるルートパーティションを
作成できないわけではありません。
シリンダ 1024 以下に小さな <tt>/boot</tt> パーティションを
作成するか、既存のパーティションからカーネルをブートすれば
よいからです。

<sect1> ディスクのジオメトリ <label id="DiskGeometry">
<p>

Linux では、ディスクは SCSI ホストアダプタから見える通りに、エラーの
ない 0 から N-1 まで番号づけされた N 個のブロックとして認識されます。
一方 DOS や BIOS では賢いディスクにも過去の慣習が適用されてしまい、
このようなリニアなアドレッシングが恣意的にヘッド/シリンダ/セクタに
マッピングされてしまいます。

このことは、Linux でドライブにパーティションを切る場合に問題となる
おそれがあります。DOS や BIOS がどのようにジオメトリをマップするかを
知る汎用的な方法がないからです。多くの場合 <tt/HDIO_GETGEO ioctl()/ が
このマッピングを知るために使えます。
残念ながら、一部のメーカー (Seagate) のように、ひねくれた、標準から
外れた、しかも文書化されていない方法でマッピングを行っている場合、
この方法は使えず、ジオメトリをマニュアルで指定する必要があります。

マニュアル指定には、いくつかの方法があります。

<enum>
<item> DOS を使うつもりがないか、LILO がインストールされているドライブ
からカーネルをブートする場合、ヘッド * シリンダ * セクタ * 512 &lt; 
ドライブのサイズ (バイト数) となるようにそれぞれの値を設定する (メガ
バイトは 2^20 バイトと定義されます)。

<verb>
1 <= heads <= 256
1 <= cylinders <= 1024 
1 <= sectors <= 63
</verb>

<item> BIOS マッピングを使う方法。場合によっては、ディスクの SCSI ID を 0 に
設定し直し、2番目の IDE ドライブ (もしあるならば) をディセーブルする必要
があります。

</enum>

NU (訳注: Norton Utilities のことでしょう) のようなプログラムを使うこと
もできますし、次のプログラムも使えます。

<verb>
begin 664 dparam.com
MBAZ``##_B+^!`+N!`(H'0SP@=/D\,'5:@#]X=`6`/UAU4(!_`3AU2H!_`P!U
M1(I7`H#J,(#Z`7&lt;Y@,*`M`C-$PCD=3-14HC()#\PY.@R`.@J`%J(\/[`,.3H
M)0#H'0!8AL2Q!M+L0.@7`+K"`;0)S2'#NIP!ZR"ZQ0'K&amp;[K5`>L6N]T!,=*Y
M"@#W\8#",$N(%PG`=>^)VK0)S2'#=7-A9V4Z(&amp;1P87)A;2`P>#@P#0H@("!O
L&lt;B`@9'!A&lt;F%M(#!X.#$-"B1);G9A;&amp;ED(&amp;1R:79E#0HD("`D```````D``!O
`
end
</verb>

このプログラムを実行すると、コマンドラインで指定した BIOS アドレス
 (0x80 が最初のディスク、0x81 が 2番目のディスク) のドライブについて、
セクタ数、ヘッダ数、シリンダ数をプリントします。

つまり、<tt/dparam 0x80/ を実行して以下のように表示された場合、
<verb>
60	17	1007
</verb>

C: ドライブのセクタ数が 60、ヘッド数が 17、シリンダ数が 1007 で
あることを示しています。

<sect> CDROM
<p>

ここでは、CDROM 特有の情報を示します。

<sect1> 対応している (いない) ハードウェア
<p>

ブロックサイズが 512 または 2048 バイトの SCSI CDROM は使えます。
これ以外のブロックサイズはサポートされていません。

<sect1> よくある問題
<p>

<sect2> CDROM がマウントできない
<p>

ISO-9660 CDROM をマウントするための正しいコマンドは以下の通りです。

<tscreen><verb>
mount -t iso9660 /dev/sr0 /mount_point -o ro
</verb></tscreen>

このコマンドが正しく動作するためには、SCSI のサポートと使用している
ホストアダプタや SCSI CDROM のドライバ、それに iso9660 ファイル
システムがカーネルに組み込まれている必要があります。

カーネル 1.1.32 では、CDROM のようなリードオンリーのデバイスは
デフォルトの読み書き可能オプションではマウントできないことに
注意してください。

<sect2> CDROM が排出できない。
<p>

Linux は、メディアがマウントされている時にはドライブのドアをロック
します。予期せぬメディアの入れ替えによってファイルシステムが壊れる
のを防ぐためです。

まずディスクをアンマウントしてください。

<sect2> オーディオ CD が演奏できない
<p>

<tt/workman/ あるいは <tt/xcdplayer/ などのプログラムを使ってください。

<sect2> <tt/workman/ や <tt/xcdplayer/ がうまく動かない
<p>

オーディオ機能の制御は SCSI-II のコマンドセットに含まれているので、
SCSI-II に準拠していないドライブでは動作しないでしょう。
また、多くの SCSI-I CDROM ドライブと SCSI-II CDROM ドライブの一部には、
SCSI-II コマンドセットではなく、独自のコマンドセットを使ってオーディオ
機能にアクセスするものがあります。
NEC のドライブについては、この種のコマンドセットを使うようにパッチが
あたった <tt/xcdplayer/ があります。
<url url="ftp://tsx-11.mit.edu/pub/linux/BETA/cdrom"> を探してみて
ください。

これらのプログラムは、SCSI 以外の CDROM にも使える可能性があります。
ドライバが SCSI ドライバと同様の <tt>ioctl</tt> を実装していることが
条件です。

<sect2> CD ROM チェンジャの2番目以降のドライブが動作しない
<p>
たいていの CD チェンジャはディスクごとに一つの論理ユニットを割り当てます。
論理ユニットに対応するスペシャルファイルを作成してあるかどうか確かめて
ください (<ref id="DevFiles" name="デバイスファイル">を参照のこと)。
また、<ref id="LunsNot0" name="0 以外の LUN が使えない">も読んで
ください。

<sect1> デバイスファイル
<p>

SCSI CD ROM のメジャーデバイス番号は 11 です。

マイナー番号は動的に割り当てられます (<ref id="Disks" name="ディスク"> や 
<ref id="DevFiles" name="デバイスファイル"> を見てください)。
最初に見つかった CDROM のマイナー番号が 0、2番目に見つかった
CDROM のマイナー番号が 1、という具合になります。

標準的なデバイス名は <tt>/dev/sr&lcub;数字&rcub;</tt> ですが、
パッケージによっては以下の例のように <tt>/dev/scd&lcub;数字&rcub;</tt> を
使っているものもあります。

<verb>
/dev/sr0	/dev/scd0
/dev/sr1	/dev/scd1
</verb>

<sect> テープ
<p>

この章では SCSI のテープドライブに特有の情報を記述しています。

<sect1> 対応している (いない) ハードウェア
<p>

固定長ブロックのドライブにも可変長ブロックにも対応しています。ただしド
ライバで定義しているバッファよりもブロックは小さくなければなりません。
配布版カーネルのソースではドライバのバッファは 32K に設定されています。

ブロックサイズやバッファリング、記録密度などのパラメータは <tt/ioctl/ を
使って (通常は <tt/mt/ プログラムで) 設定されます。この設定はデバイスが 
<tt>close/reopen</tt> した後も保持されます。

ほとんど全てのドライブが動作します。以下に一部を示します。
<itemize>
<item> Archive Viper QIC ドライブ。150M のモデルも 525M も動作します。
<item> Exabyte の 8mm ドライブ
<item> Wangtek 5150S ドライブ
<item> Wangdat の DAT ドライブ製品群
</itemize>

<sect1>よくある問題
<p>

<sect2> ブート時にテープドライブが認識されない
<p>
テープをドライブに入れてからブートしてみてください。

<sect2> 複数のファイルを含んだテープが正しく読み取れない
<p>
複数のファイルをテープから読み出すとき、最初の <tt/tar/ は成功し、その
次の <tt/tar/ はなにも出力せずに終わります。さらに次の <tt/tar/ を
行なうと二つめのファイルが読めます。

<tt/tar/ のようなユーザレベルのプログラムはファイルマークを認識しません。
最初の <tt/tar/ は先頭のファイルの最後まで読み込みます。
2 度目の <tt/tar/ はファイルマークの位置で読み込みを始めるのでなにも出力
しません。しかしこれによりテープは次のファイルの先頭に移動するので 3 度目
の <tt/tar/ は 2 番めのファイルを読み込みます。

次のファイルにスキップするためには、巻戻しをしないデバイス 
(<tt>/dev/nst?</tt>) に <tt/mt/ コマンドを用いて下さい。

<sect2> 圧縮が失敗する
<p>
圧縮プログラムはファイルの最終ブロックに追加される 0 のデータを正しく
扱うことができません。

警告やエラーを防ぐには、圧縮ファイルを <tt/.tar/ ファイルの中にまとめて
下さい。つまり
<tscreen><verb>
tar cfvz /dev/nrst0 file.1 file.2 ...
</verb></tscreen>

とするのではなく、以下のようにして下さい。

<tscreen><verb>
tar cfvz tmp.tar.z file.1 file.2 ...

tar cf /dev/nrst0 tmp.tar.z
</verb></tscreen>

<sect2> 他のシステムとテープでのデータのやり取りができない
<p>
他の OS で書き込んだテープを Linux で読み込むことができない。
または、Linux で書き込んだテープを他の OS で読み込むことができない。

システムが異なるとブロックサイズも異なることがあります。ブロックサイズが
固定のデバイスに、異なったサイズのブロックを読み込ませることはできません。

このようなテープを読むには、テープドライブのブロックサイズを書き込まれ
たときのサイズに合わせてやるか、あるいは可変長にしてやる必要があります。

注意 : これはハードウェアのブロックサイズのことであって、<tt/tar/ や 
<tt/dump/ 等のコマンドのブロッキングファクターのことではありません。

ブロックサイズを変えるには <tt/mt/ コマンドを使います。
<tscreen><verb>
mt setblk <size>
</verb></tscreen>

可変長にするときには以下のようにします。

<tscreen><verb>
mt setblk 0
</verb></tscreen>
<tt/mt/ の <tt/setblk/ フラグは、 Linux の配布パッケージに入っている 
GNU 版の <tt/mt/ ではサポートされていません。代わりに BSD から移植
された <tt/mt/ コマンドを使う必要があります。ソースコードは以下の
ところから入手できます。

<tscreen>
<url url="ftp://tsx-11.mit.edu/pub/linux/ALPHA/scsi">
</tscreen>

またデフォルトでは、バッファサイズの最大値が 32K バイトに指定されてい
ることに注意して下さい。これは 
<tt>/usr/src/linux/drivers/scsi/st_options.h</tt> (古いカーネルでは 
<tt/st.c/) の <tt/ST_BUFFER_BLOCKS/ で定義されています。 32K 以上の
ブロックを使う場合はこれを変更してカーネルを再構築する必要があります。

<sect2> 「No such device」というエラーメッセージが出る
<p>
テープにアクセスするたびに「No such device」といったような
エラーメッセージが出てしまう場合です。

テープデバイスのタイプをチェックして下さい。テープデバイスはキャラクタ
デバイスでなければならず、またデバイスのメジャー番号とマイナー番号が
<ref id="DevFiles" name="デバイスファイル"> に記述してあるような値に
なっていなければなりません。

<sect2> 読み込みには密度を指定できるのに、書き込みではできない
<p>

多くのテープドライブでは古いハードウェアとの互換性を保つために、低密度
での読み込みをサポートしていますが、普通書き込みはできません。

特に QIC のドライブでこの問題が生じることが多いでしょう。例えば古い形
式の 60M テープが読めても、書き込みは 120, 150, 250, 525M のフォーマット
でしかできない場合などです。

<sect2> テープの頭出しをすると全ての SCSI デバイスがフリーズしてしまう
<p>
これは一度にひとつのコマンドしか処理できない SCSI ドライバで特に良く生
じる問題です。(内容については <ref id="MultiDevs" name="複数のデバイス"> を
見て下さい。またどのドライバがそうかについては <ref id="BuyerGuideFeatures"
name="購入の手引: ドライバ機能の比較"> を見て下さい。)
しかし切断を拒否するテープドライブもいくつか存在しています。

<quote>
訳注:
SCSI ホストアダプタから見て、複数のコマンドを同時に実行するには、
ターゲットデバイスがディスコネクトをサポートしていることが必要です。
(つまりコマンドを受けとったら SCSI バスを解放し、データが準備できたら
ターゲット側からバスを要求してデータ転送を行なう。それまでの間に別の
デバイスに対するコマンドの送出やデータ転送などが可能となる。)
ディスコネクトをサポートしていないターゲットデバイスは、コマンドの
実行を終るまで SCSI バスを放さないので、テープドライブの巻き戻し
コマンドなどを送ると悲惨なことになります。
</quote>

<tt>drivers/scsi/st.c</tt> の先頭に以下の行を追加してカーネルを再構築
することで、この問題を回避できる場合もあります。

<tscreen><verb>
#define ST_NOWAIT
</verb></tscreen>

この変更を行なった場合、エラー状態のレポートは次の SCSI コマンドが実行
されるまでされません。従って、mt などを使った頭出しがちゃんとできてい
るかどうかを確認するには以下のようなコマンドを実行してみる必要がありま
す。

<tscreen><verb>
mt status
</verb></tscreen>

この確認をしておかないと、頭出しに失敗した場合にテープを上書きしてしま
うことになります。

しかし複数ファイルをテープに書き込んでいて、この解決法を使わなければな
らない場合は、よりサポートの良い SCSI ボードか、新しいドライブにする方
が良いかもしれません。

<sect1> デバイスファイル
<p>
SCSI テープはキャラクタデバイスのメジャー番号 9 を使います。

Linux では 16 ビットの <tt/dev_t/ を使っているので、マイナー番号には 8 ビッ
トしか割り当てられていません。このため SCSI テープのマイナー番号は 
SCSI のホスト/ID/LUN の低い方から動的に割り付けされます。

巻戻しデバイスは 0 からはじまります。一台目の SCSI テープ 
<tt>/dev/rst0</tt> は <tt/c 9 0/ となり、二台目は <tt/c 9 1/ となります。
巻戻しをしないデバイスではマイナー番号の最上位ビットがセットされます。
つまり <tt>/dev/nrst0</tt> は <tt/c 9 128/ となります。

通常は以下のような名前が使われます。
<verb>
/dev/nst{数字}      巻戻さないデバイス
/dev/st{数字}       巻戻すデバイス
</verb>

<sect> 汎用デバイス
<p>
この章では汎用 SCSI デバイスのドライバに特有の情報について示します。

<sect1> 対応しているハードウェア
<p>

汎用 SCSI ドライバは全ての SCSI デバイス (ディスク、テープ、 CDROM、 
メディアチェンジャーロボットなどなど) へ SCSI コマンドを送るインター
フェースです。

お使いの SCSI ボードと電気的に :-) 互換性のあるものは全て動作するはず
です。

<sect1> よくある問題
<p>
ありません :-)

<sect1> デバイスファイル
<p>

SCSI の汎用デバイスはキャラクタデバイスのメジャー番号 21 を使います。 
Linux では <tt/dev_t/ が 16ビットであるという制限から、マイナー番号
は 0 から順番にデバイス毎に動的に割り当てられます。

<verb>
/dev/sg0 
</verb>

は一枚目の SCSI ボードにおける最小の SCSI/LUN 番号のデバイスになります。

<sect> 購入の手引き <label id="BuyerGuide">
<p>

「Linux に対応しているたくさんのボードの中で、どの SCSI ホスト
アダプタを買えばいいんでしょう？」という質問をよく聞きます。

答えは、どの程度の性能を期待するか (あるいは必要とするか) によって
異なりますし、使用するマザーボードや接続を予定している SCSI 周辺機器
によっても違ってきます。

<sect1> 転送のタイプ
<p>

性能 (ここではスループットと SCSI I/O の応答時間を指しています) に
もっとも大きく影響するのは、転送のタイプです。
以下、各種の転送タイプに対して、性能に与える影響とどのような場合に
お勧めかを示します。

<descrip>
<!--
<tag/転送のタイプ/ 解説・性能・お勧め
-->

<tag/純粋なポーリング/ 純粋なポーリングを行う I/O ボードは、
REQ/ACK ハンドシェークを含むすべての SCSI 信号処理を CPU で行います。

高速な CPU であっても、単純なシーケンサよりも REQ/ACK ハンドシェークは
遅いので、ピーク転送レートは高速のマシンで 150K/秒、低速のマシンでは
おそらく 60K/秒程度になってしまうでしょう (ファイルシステムを介した
転送レート)。

またドライバは SCSI バスがビジーである間ループしていなければならない
ので、SCSI I/O 中にはほぼ 100&percnt; CPU が使用され、応答が極端に
悪くなります。
低速でディスコネクト/リコネクトに対応していない CDROM をこの種の
ボードに接続すると、使い物にならないほど応答性が低下します。

この種のボードは、お勧めできません。

<tag/インターロックポーリング/ インターロックポーリングを使用した
ボードは、SCSI REQ/ACK ハンドシェーク信号が PC バスのハンドシェーク
信号と連動していることを除けば、純粋なポーリングのボードと
本質的に変わりません。
ハンドシェーク以外の SCSI 信号処理は、CPU によって行われます。

この種のボードのファイルシステムを介したピーク転送レートは、
最大で 500〜600K/秒程度です。

純粋なポーリング I/O ボードと同様に、ドライバは SCSI バスがビジーで
ある間ループしていなければならないので、CPU の利用率はデバイスの転送
レートとディスコネクト/リコネクトを行う頻度によって変化します。
CPU の利用率は 25&percnt; (ディスコネクト/リコネクトを適切に行う等速
CDROM の場合) から 100&percnt; (高速のドライブ、またはディスコネクト/
リコネクトを行わないイカレた CDROM の場合) まで変化します。

筆者の 486-66 の場合、ヘッドレート 1080K/秒のドライブと T128 ボードで
547K/秒のスループットを得た時の CPU 使用率は 90&percnt; でした。

コストを安く抑えることが最優先ならば、
場合によって低速のテープや CDROM ドライブには使用可能でしょう。

<tag/FIFO ポーリング/ FIFO ポーリングを行うボードは、小さな
(8K 程度の) バッファを CPU と SCSI バスの間に持っており、多少は
インテリジェントな処理を行うことができます。
その結果 CPU は FIFO との間でフルスピードでデータを転送することが
でき、データ転送と割り込み処理 (FIFO エンプティ、ディスコネクト/
リコネクト処理など) 以外には CPU を占有しません。

ピーク転送レートは、ほとんどの SCSI デバイスに十分な値が得られます。
FAST SCSI に対応した Seagate Barracuda と Adaptec 1520 の
組み合わせで、低レベルの SCSI コマンドを使って 64K ブロックの
読み出しを行った場合、転送レートは 4M/秒に達しました。

CPU の使用率は、デバイスの転送レートによって異なります。
デバイスが高速になるほど、単位時間当たりに発生する割り込みが多くなり、
より多くの CPU 処理時間を必要とします。
高速なデバイスでは CPU 使用率は高くなる (75&percnt; 程度) ものの、
システムが使い物にならなくなることは普通ありません。
この種のボードは、ディスコネクト/リコネクトを行わないイカレた
デバイス (安物の CDROM ドライブに多い) に対しても、優れた
応答性を示します。

予算が厳しい人にはお勧めです。

<tag/スレーブ DMA/ スレーブ DMA ボードのドライバは、
PC の DMA コントローラの 1チャネルを使ってデータ転送を行い、
CPU に制御を返します。

ピーク転送レートは、PC の DMA コントローラが低速なため、あまり
高くなりません。
この種の 8bit ボードとあるマザーボードの組み合わせでは、
140〜150K/秒以上の転送レートでは問題が生じました。

CPU 使用率はかなり優秀で、FIFO ポーリング I/O ボードよりも
わずかに低い程度です。
この種のボードは、ディスコネクト/リコネクトを行わないイカレた
デバイス (安物の CDROM ドライブに多い) にも十分耐えられます。

低速の CDROM やテープドライブには使用可能でしょう。

<tag>バスマスタリング DMA</tag> インテリジェントなボードです。
この種のボードのドライバは、SCSI コマンド、ターゲットと LUN、
それにデータへのポインタを構造体にセットして、ボードに処理を
任せます。
ドライバは他のプログラムに制御を戻し、SCSI ボードは割り込みを
あげて処理が終わったことを知らせます。

インテリジェンスがドライバではなくファームウェアにあるため、
この種のボードのドライバは、同期転送、タグ付きコマンドキュー
イングなど、より高度な機能をサポートすることができます。

単位のリード/ライトを行うパッチを当てると、ファイルシステムを
介したピーク転送レートは、ライトの場合でヘッドレートの 100&percnt;、
リードの場合で 70&percnt; に達します。

CPU 使用率は I/O 負荷に関わらず最小で、Adaptec 1540 で倍速 CDROM を
アクセス中に 5&percnt;、SCSI ディスクに 1.2M/秒で継続的にデータ
転送している場合で 20&percnt; でした。

予算が非常に厳しい場合、マザーボードにバグがある場合 (バグのある
マザーボードには、バスマスタが動作しないものもあります)、スルー
プットよりもデータアクセス時間の方が重要なアプリケーションを
使っている場合 (バスマスタのオーバヘッドは 1コマンドあたり 3〜4ms
あります) を除き、常にお勧めできます。
</descrip>

<sect1> スキャッタ/ギャザ
<p>

性能に大きな影響を与える 2番目に重要なドライバやハードウェアの機能は
スキャッタ/ギャザ I/O です。
SCSI コマンドの実行に必要なオーバヘッドはかなり大きく、ミリ秒のオーダ
です。Adaptec 1540 のようなインテリジェントバスマスタは、ターゲットに 
SCSI コマンドを送る前の処理に 3〜4ms かかる場合があります。
バッファなしのデバイスの場合、このオーバヘッドは次のセクタにアクセスする
のに常にもう1回転待たなければならないほど大きいため、一度に1ブロックの
転送を行なう場合には、転送レートは 60K/秒 (3600rpm のドライブの場合) に
まで低下してしまいます。
したがって、性能を上げるためには、与えられた大きさのデータを転送するのに
必要な SCSI コマンドの数を少なくすることが必要となってきます。これは、
ひとつのコマンドあたりに転送されるデータ量を大きくすることを意味します。
Linux のバッファキャッシュの設計により、ディスクブロックとして連続している
データであっても、メモリ上で連続しているとは限りません。クラスタごとの
リード/ライトパッチがあたっている場合には、4K のバッファは連続しています。
したがって、SCSI コマンドあたり転送されるデータ量は最大で 1K * スキャッタ/
ギャザ領域の数 (クラスタごとのリード/ライトパッチがあたっていない場合)、
あるいは4K * スキャッタ/ギャザ領域の数 (クラスタごとのリード/ライトパッチ
があたっている場合) となります。
<!-- 原文ではパッチが当たっている場合とそうでない場合の数値が逆になって
いました。-->
実験の結果、私たちはひとつの SCSI コマンドあたりに転送するデータの大きさは
64K が適当だろうという結論に達しました。これは、クラスタごとのリード/ライト
パッチが当たっている場合でバッファサイズの 16倍、そうでない場合には 64倍です。
16K から 64K に転送サイズを増やした結果、Adaptec 1540 シリーズのボードを
使った場合でファイルシステムを介した読み書きがヘッドレートの 50&percnt; か
ら 75&percnt; (リードの場合) および 100&percnt; (ライトの場合) にまで向上し
ました。

<sect1> メールボックスインターフェース
<p>

Ultrastor や WD7000 や Adaptec 1540 や 1740、それに BusLogic の
ボードなど、インテリジェントなホストアダプタの多くはメイルボックス
インターフェースを持っています。これは、SCSI コマンドを実行する際、
特定のメモリアドレス (メイルボックス) に SCSI コマンド構造体を
書き込み、ボードに信号を送り (つまり、出すべきメールがあることを
示すフラグを上げ)、結果 (返信) を待つものです。
このような高レベルのプログラミングインターフェースを使用した場合、
ソフトウェアの変更なしに FAST + WIDE SCSI のような新しい機能を持った
ボードにバージョンアップできることが多くなります。
一般的な傾向としてドライバはシンプルな実装で機能が多く、安定したものに
なります。

それに対して NCR53c7/8xx ファミリや Adaptec AIC-7770/7870 チップ 
(274x、284x、それに 2940 ボードに使われています) などのボードは、
より低レベルのプログラミングインターフェースを使います。
この利点としては、処理の多くがボード上のプロセッサからより高速な
ホスト CPU に移るため高速化しやすいという点、柔軟性に富みある種の
機能 (任意のデバイスに対するターゲットモードなど) が実装しやすいという点、
それに製造コストが低い (NCR のボードのように、消費者にとっても
安く買えることにつながります) という点などがあげられます。
一方欠点としては、ドライバが複雑になりがち (これはバグの入り込む
余地も多くなることを意味します) だという点、それに新しいチップの
機能を生かすためにはドライバの変更が必要だという点があげられます。

<sect1> バスのタイプ
<p>

バスのタイプは次に考慮すべき点で、ISA、EISA、VL、それに PCI などの
選択肢があります。マーケティングの連中は、バースト転送レートと空想に
基づいたばかばかしい数値を宣伝していますが、こんなものは実際の役には
立ちはしません。
そのかわりに私は各種の周辺機器について測定した結果をもとにした、より
実用的な数値を示すことにします。

<descrip>
<!--
<tag>バス</tag> バンド幅と説明。 
-->

<tag>ISA</tag> バンド幅は、バスマスタデバイスの場合、5M/秒よりも少し
良い程度です。ISA バスの調停は、いにしえの 8237 DMA コントローラに
よって行われるので、バスの獲得にかかる時間は比較的長くなります。
割り込みの検出はエッジトリガ方式なので、割り込みの共有はできません。
通常、ISA はバッファされていないため、転送中はホストバスとメモリバスが
占有されてしまいます。バスの占有を防ぐメカニズムは提供されません。

<tag>VL</tag> バンド幅はおよそ 30M/秒です。システムによっては
規格から外れたタイミングでバスを駆動しているものもあり、この
ようなシステムでは動かないボードもありますから、返品保証のない
ハードウェアを購入する場合にはこの点を考慮する必要があります。
通常、VL バスはバッファされていないため、転送中にはホストバスと
メモリバスが占有されてしまいます。

<tag>EISA</tag> バンド幅はおよそ 30M/秒ですが、バスマスタ転送は
通常 VL よりも高速です。
バスがバッファされているシステムでは、高速なホスト/メモリバスへの
バースト転送が可能で、CPU 性能への影響も最小限となります。
EISA の割り込み検出はエッジトリガにもレベルセンスにも設定できるため、
ドライバが対応していれば割り込みの共有が可能です。
EISA バスはボードごとに独立したアドレス空間を割り当てるため、ISA や
VL に比べて資源の衝突が起こるおそれは少なくなります。

<tag>PCI</tag> バンド幅はおよそ 60M/秒です。PCI システムはたいてい
ホストブリッジ上に遅延書き込みバッファを持っており、バス間のスピードの
違いがバスや CPU の性能に与える影響を最小限に抑えることができます。
PCI の割り込みはレベルセンスなので、ドライバが対応していれば割り込みを
共有することが可能です。
バスの占有を防ぐメカニズムが提供されており、マスタとスレーブのどちら
からでもバスサイクルを中断することが可能です。

PCI は、書き込み可能な設定レジスタをボードごとに独立したアドレス空間に
持っており、プラグアンドプレイメカニズムを提供します。
正しく実装された PCI システムはプラグアンドプレイ機能を持っています。

PCI はトレース長、負荷、機械的寸法などについて大変厳密に規定して
いるので、VL や ISA よりも信頼性は高いはずです。

結論を言うと、PCI が最良の PC バスですが、弱点もあります。PCI はまだ
製品が世に出てから日が浅く、大部分のメーカーはすでに問題を解決している
とはいえ、まだ古いバグありの PCI ハードウェアやイカレた BIOS が存在
します。このため、筆者は返品保証付きのハードウェアを購入することを
<bf/強く/お勧めします。最近の PCI マザーボードは真のプラグアンドプレイを
実現していますが、古いボードではジャンパとソフトウェアによる設定が必要な
場合もあります (例えば割り込みレベルの割当)。
PCI の問題を解決するには時間がかかることが多く、このため
システムを動作させるまでの時間が非常に重要な場合にはおすすめできません。
</descrip>

低速の SCSI デバイス、例えばヘッドレートが 2M/秒程度かそれ以下の
ディスクや CDROM、テープドライブに関しては、PC 側のバスインター
フェースが違ってもスループットはほとんど変化しません。
最近のギガバイトクラスのハイエンド SCSI ドライブのヘッドレートは
4-5M/秒に達し、あるメーカーは 14M/秒のヘッドレートを実現する並列
ヘッドユニットのアルファテストを行っています。このようなドライブ
では高速なバス上のコントローラが性能を発揮します。
あるユーザーは Adaptec 1542 ISA ボードから NCR53c810 PCI ボードに
変えて、2.5倍性能が向上したそうです。

PCI の遅延書き込みや、同様のライトバッファ機構が使用される場合を除いて、
システム中のひとつのバスがビジーのときは、すべてのバスがアクセス不可能と
なります。したがって、バスのスピードが頭打ちになることは SCSI の性能に
影響しないとしても、システムの応答性には悪影響を与えるおそれがあります。
つまり、ISA バス上で 4M/秒の SCSI ディスクを使用している場合、バンド幅の
80&percnt; を失っていることになります。
ISA/VL システムでは画面描画に使えるのは 6M/秒しかありません。
たいていの場合、バックグラウンドで実行中のジョブには同様の影響があります。

16M 以上のメモリーがあっても ISA バスマスタ SCSI ボードが使えないわけ
ではないことに注意してください。
他のイカレた OS と違って、Linux は ISA コントローラで 16M 以上の領域に
DMA 転送する時にはダブルバッファリングを行います。
これによる性能の低下はわずか 1.5&percnt; 程度で、まったく気になりません。

最後に、バスインターフェースが違っても、バスマスタ方式のボードの値段は
それほど変わらないことが多い、ということは覚えておいてください。

以上の議論を踏まえて、目的によってバスに順序をつけると次のようになるで
しょう。

<tscreen><verb>
安定性を求める。インストールに必要な時間が	EISA ISA VL PCI
重要。ボードが返品できない場合。

性能を求める。インストールには多少時間が	PCI EISA VL ISA
かかってもよい。
</verb></tscreen>
<quote>
訳注: 現在の PCI は、少なくとも VL よりは安定していると思います。
</quote>

すでに述べたように、バスマスタ方式が総合的なシステムの性能に与える影響は
非常に大きくなってきているので、SCSI コントローラを購入する際にはバスの
タイプよりもバスマスタであるかどうかの方を重視すべきです。

<sect1> 複数のデバイス <label id="MultiDevs">
<p>

SCSI バス上に複数のデバイスが存在する場合、ホストアダプタやドライバが
同時に複数のコマンドを並列に処理できるかどうかが重要になってきます。
この機能は、テープドライブを使用する場合にはほぼ必須となりますし、
例えば CDROM とディスクドライブといった、スピードの異なるデバイスが
存在する場合には非常に望ましい機能と言えます。
Linux ドライバが1つのコマンドしか同時には処理できない場合、テープ
ドライブがテープを巻き戻したりメディアの最後を探している間 (おそらく
30分ほど)、ディスクドライブにアクセスできなくなってしまいます。
ディスクドライブが 2台ある場合、この問題は顕著ではありませんが、
スループットが 2台の転送レートの和ではなく、2台の転送レートの平均に
なってしまいます。

<sect1> SCSI-I、SCSI-II、SCSI-III、FAST および WIDE オプションなどについて
<p>

SCSI は年々進歩しています。
新しいバージョンの規格には、より高い転送レートやスループットを向上させる
ための方法、新しいデバイスに対するコマンドの標準化、すでにサポートされて
いるデバイスに対する新しいコマンドの追加などが規定されています。

SCSI のリビジョンレベルそれ自体には、実際には意味はありません。
SCSI-II が SCSI-I の単一イニシエータオプションを許さない、といった些細な
点を除けば SCSI は下位互換性を保っており、新しい機能は必須機能としてでは
なく、オプション機能として導入されます。
したがって、SCSI アダプタを SCSI、SCSI-II、あるいは SCSI-III と呼ぶのは
マーケティング的な意味しかないと言っても過言ではないでしょう。

<sect1> ドライバ機能の比較 <label id="BuyerGuideFeatures">
<p>

ドライバ機能の比較を以下の表に示します (そのドライバでサポートされている
チップはカッコ内に示してあります)。

<verb>
ドライバ名  				同時発行可能な	スキャッタ/	複数
		転送モード		コマンド数	ギャザの制限	ボード
					全体/LUN

AM53C974	バスマスタリング DMA	12s/1s		255s		Y
aha152x	  	FIFO(8k) ポーリング   	7s/1s		255s		N
    (AIC6260,
    AIC6360)
aha1542   	バスマスタリング DMA 	8s/1s		16		Y
aha1740	  	バスマスタリング DMA 	32s		16		N
aha274x		バスマスタリング DMA	4s/1s		255s		Y
BusLogic	バスマスタリング DMA	192/31		128s, 8192h	Y
(この値は BT-948/958/958D のもので、古いボードのサポートするコマンド数は
もっと少ない)
eata_dma	バスマスタリング DMA	64s-8192h/2-64	512s, 8192h	Y
fdomain		FIFO(8k) ポーリング	1s		64s		N
    (TMC1800, 	TMC18c30 は 2k FIFO
    TMC18c30,
    TMC18c50,
    TMC36c70)

in2000*		FIFO(2k) ポーリング	1s		255s		N
g_NCR5380	純粋なポーリング	16s/2s		255s		Y
    (NCR5380,
    NCR53c80,
    NCR5381, 
    NCR53c400)
gsi8*		スレーブ DMA		16s/2s		255s
    (NCR5380)
PAS16		純粋なポーリング	16s/2s		255s		Y
    (NCR5380)	またはインターロックポーリング
		(システムによっては動作しません！)
seagate		インターロックポーリング1s/1s		255s		N
wd7000		バスマスタリング DMA	16s/1s		16 		Y
t128		インターロックポーリング16s		255s		Y
    (NCR5380)
qlogic		インターロックポーリング1s/1s		255s		N
ultrastor 	バスマスタリング DMA	16s/2s		32		Y
53c7,8xx	バスマスタリング DMA	
    (NCR53c810,
     NCR53c815,
     NCR53c820,
     NCR53c825)
    rel5	 			1s/1s		127s		N
    rel10				8s/1s		127s		Y
</verb>

注:
<enum>
<item> 後ろに '*' の印が付いたドライバは配布版のカーネルには
含まれておらず、
バイナリブートイメージは入手できないかもしれません。
<item> 後ろに 's' のついた数字はソフトウェアによる恣意的な制限で、
コンパイル時に <tt/define/ し直すことによって変更することができます。
<item> 後ろに 'h' のついた数字はハードウェアによる制限で、Linux の
ドライバによるソフトウェアの制限と一致しないことがあります。
<item> 後ろに何も付いていない数字は、ハードウェアまたはソフトウェア
のいずれかによる制限です。
<item> NCR53c810 ドライバのリリース 5 は、カーネル 1.2.x および 1.3.x に
含まれています。リリース 10 は匿名 FTP によって入手可能です。
<item> AM53C974 を例外として、バスマスタ DMA ボードはインテリジェント
です。NCR のチップはメインメモリ上のマイクロコードを実行しますが、
AIC7770 はオンチップ RAM 上のマイクロコードを実行します。それ以外の
チップはメールボックス形式のインターフェースを持っています。
</enum>

<sect1> ボードの比較
<p>

<verb>
ボード名		ドライバ	バス	価格	備考
Adaptec AIC-6260	aha152x		ISA		ボードではなくチップ
Adaptec AIC-6360	aha152x		VLB		ボードではなくチップ
    (VL/ISA の SCSI つきマルチ I/O ボードの多くと Zenon の
    マザーボードに使われています)
Adaptec 1520		aha152x		ISA		 
Adaptec 1522		aha152x		ISA	$80	1520 + FDC
Adaptec 1510		aha152x		ISA		ブート ROM なしの 1520
							自動認識不可
Adaptec 1540C		aha1542		ISA		
Adaptec 1542C		aha1542		ISA		1540C + FDC
Adaptec 1540CF		aha1542		ISA		FAST SCSI-II
Adaptec 1542CF		aha1542		ISA	$200	1540CF + FDC
Adaptec 1640		aha1542		MCA		

Adaptec 1740		aha1740		EISA		生産中止
Adaptec 1742		aha1740		EISA		生産中止、1740 + FDC
Adaptec 2740		aha274x		EISA
Adaptec 2742		aha274x		EISA		FDC つき
Adaptec 2840		aha274x		VLB
Adaptec 2842		aha274x		VLB		FDC つき
Adaptec 2940		aha274x		PCI		
Always IN2000		in2000		ISA
BusLogic BT-948		BusLogic	PCI	$180	Ultra SCSI
BusLogic BT-958		BusLogic	PCI	$230	Wide Ultra SCSI
</verb>
(BusLogic のボードの詳細については、
<ref id="BuslogicMulti" name="BusLogic MultiMaster ホストアダプタ">
を参照してください。)
<verb>
DPT 	PM2011		eata_dma	ISA		FAST SCSI-II
	PM2012A		eata_dma	EISA		FAST SCSI-II
	PM2012B		eata_dma	EISA		FAST SCSI-II
	PM2021		eata_dma	ISA		FAST SCSI-II
 	PM2022		eata_dma	EISA		FAST SCSI-II
	PM2024		eata_dma	PCI		FAST SCSI-II  
	PM2122		eata_dma	EISA		FAST SCSI-II
	PM2322		eata_dma	EISA		FAST SCSI-II
	PM2124		eata_dma	PCI		FAST SCSI-II
	PM2124		eata_dma	PCI		FAST SCSI-II
	PM2124		eata_dma	PCI		FAST SCSI-II
	PM2124		eata_dma	PCI		FAST SCSI-II
	PM2124		eata_dma	PCI		FAST SCSI-II
	PM2124		eata_dma	PCI		FAST SCSI-II
        PM2041W     	eata_dma	ISA     	Wide Single-ended 
							SCSI-II
        PM2041UW    	eata_dma	ISA     	Ultra Wide Single-ended
	PM2042W     	eata_dma	EISA    	Wide Single-ended 
	PM2042UW    	eata_dma	EISA    	Ultra Wide Single-ended
	PM2044W     	eata_dma	PCI     	Wide Single-ended 
	PM2044UW    	eata_dma	PCI     	Ultra Wide Single-ended
	PM2142W     	eata_dma	EISA    	Wide Single-ended
	PM2142UW    	eata_dma	EISA    	Ultra Wide Single-ended
	PM2144W     	eata_dma	PCI     	Wide Single-ended 
	PM2144UW    	eata_dma	PCI     	Ultra Wide Single-ended
	PM3021		eata_dma	ISA		multichannel
							raid/simm sockets 
	PM3122		eata_dma	EISA		multichannel/raid
	PM3222		eata_dma	EISA		multichannel
							raid/simm sockets 
	PM3224		eata_dma	PCI		multichannel
							raid/simm sockets 
	PM3334		eata_dma	PCI		Wide Ultra SCSI
							multichannel
							raid/simm sockets 

DTC 3290		aha1542		EISA		動作するはずですが、
							ドキュメントリリース
							ポリシーのため、DTC の
							ハードウェアはサポート
							されません
DTC 3130		53c7,8xx	PCI		'810
DTC 3130B		53c7,8xx	PCI		'815
DTC 3292		aha1542		EISA		3290 + FDC
DTC 3292		aha1542		EISA		3290 + FDC
Future Domain 1680	fdomain		ISA		FDC
Future Domain 3260	fdomain		PCI
NCR53c810		53c7,8xx	PCI     $60	ボードではなくチップ。
    (FIC、Chaintech、Nextor、Gigabyte	      (ボード)	ボードには BIOS は
    などの SCSI ボードや AMI、ASUS、			含まれていませんが、
    J-Bond などのマザーボードに使われ			たいていのマザーボード
    ています。DEC PCI システムに			には SDMS BIOS が
    使われているのも普通これです。)			ついています。
NCR53c815		53c7,8xx	PCI	$100	NCR53c810 + BIOS
    (Intel PCISCSIKIT
    NCR8150S など)
NCR53c825		53c7,8xx	PCI     $120	NCR53c815 の WIDE 版。
							現在の Linux ドライバは
							Wide 転送のネゴシエー
							ションを行なわないこと
							に注意。
Pro Audio Spectrum 16	pas16		ISA		サウンドボード + SCSI
Seagate ST01		seagate		ISA	$20	ドライブによっては
							BIOS は動作しません
Seagate ST02		seagate		ISA	$40	ST01 + FDC
Sound Blaster 16 SCSI 	aha152x		ISA		サウンドボード + SCSI
Western Digital 7000	wd7000		ISA		FDC つき
Trantor T128		t128		ISA		
Trantor T128F		t128		ISA		T128 + FDC
							IRQ 10 以上をサポート
Trantor T130B		g_NCR5380	ISA		
Ultrastor 14F		ultrastor	ISA		FDC つき
Ultrastor 24F		ultrastor	EISA		FDC つき
Ultrastor 34F		ultrastor	VLB 
</verb>

注: 
<enum>
<item> Trantor は最近 Adaptec に買収されました。いくつかの製品は Adaptec の
名前で売られています。
<item> Ultrastor は最近 Chapter 11 による破産を宣告されたため、現時点では
テクニカルサポートを受けることはできません。
<item> NCR53c810 ボードの値段は間違いではありません。これには DOS 用の標準の
ASPI/CAM ドライバパッケージを含んでいます。OS/2 や Windows (32ビットアクセス)
などのドライバも無料でダウンロードすることができます。

この会社にコンタクトしてみてください。

<tscreen><verb>
SW (swt@netcom.com) (214) 907-0871 fax (214) 907-9339
</verb></tscreen>

1995年 12月 23日の時点で、ここでは '810 のボードを 53ドルで売って
いました。

<item> Adaptec の最近の SCSI チップはケーブルやターミネーションの
問題に非常に敏感です。このため、私は Adaptec の 154x C および CF 
バージョンや 2xxx シリーズのホストアダプタをお勧めすることはでき
ません。

この問題は、古い 154x B バージョンや 174x A バージョンのボード、
それに私の知る限りでは AIC-6360/AIC-6260 チップを使ったボード 
(1505、1510、1520 など) などには当てはまらないことに注意してください。

また、Adaptec のテクニカルサポートの質は最近とみに低下しました。
長い間待たされることはしょっちゅうですし、従業員は無知だったり 
(公開されている文書を公開してはいけないかのように示唆したり)、
敵意をあらわにしたり (自分が答えられない問題を他の従業員に渡す
ことを拒否したり) するのです。

政治的な発言をする場合には、この点を考慮に入れて下さい。
この点を除いては、Adaptec の 152x/1510/1505 ボードは、同価格帯の
他の ISA ボードよりも優れていますし、中古や在庫処分品の 154x B や 
1742 ボードを安く手に入れることができれば、サポートの問題には目を
つぶってもいいと私は思います。

<item> DPT のボードはすべてキャッシュと RAID モジュールのアップ
グレードが可能です。また多くのボードにはワイド/ディファレンシャル
バージョンがあります。

<item> NCR のボードには各種ありますが、まったく同じだというわけ
ではありません。ASUS SC200 はアクティブターミネーションですが、
他の NCR53c810 ボードの多くはパッシブターミネーション
です。 '825 ボードの多くはアクティブターミネーションですが、ROM BIOS の
ものもあれば FLASH ROM のものもあるという具合
です。 '825 ボードの多くは外部 WIDE コネクタと内部 WIDE コネクタ、それに
通常の内部コネクタを持っていますが、通常の内部コネクタを持って
いないもの (CSC の安価なモデルなど) もあります。
</enum>

<sect1> まとめ
<p>
性能、機能 (アクティブターミネーションなど)、Adaptec 1540 シリーズ
との互換性などの点から、BusLogic のMultiMaster ボードは ISA、EISA、
VL、PCI のいずれにもお勧めできます。
EISA、ISA、PCI、VL のバスインターフェースと
シングルエンドやディファレンシャル、8/16 ビットの SCSI バスに対応した
たくさんのモデルが用意されています。
最新の Ultra SCSI PCI モデル BT-948/958/958D はフラッシュ ROM により
容易にファームウェアをバージョンアップでき、スマートターミネーション
機能も持っています。

最高の I/O 性能を求める人には、DPT のボードがいいでしょう。
RAID とキャッシュ、複数の SCSI チャネルに対応したボードは他に
ありません。

PCI システムを使っている場合、NCR53c8xx チップを使ったボードは検討に
値します。バスマスタ SCSI コントローラが、53ドル (何と Adaptec 1520 
よりも安い！) という値段で手に入るのです。
C't マガジンによる DOS のベンチマークでは Adaptec 2940 や BusLogic 
BT-946C を凌ぐ性能が出ていますし、Linux でもかなりの性能 (ファイル
システムを介して 6M/sec) が得られています。
これらのボードの BusLogic に対する弱点は、Adaptec 1540 互換でない
ことと、アクティブターミネータがついているかどうかわからないこと、
ハードウェアの性能を発揮させるためには最新のドライバ (1.3.5x の
カーネルには標準でついてきます。1.2.x のカーネル用のドライバは
匿名 ftp で取ってくることができます) が必要だということ、それに
BusLogic や DPT などのメールボックスインターフェースのボードに比べて
ドライバに問題が起こりやすいという点です。

確実に動作させることが必要な場合には、BusLogic MultiMaster か DPT の
ボードがおそらくベストでしょう。
NCR53c8xx や Adaptec AIC7xxx のようなメールボックスインターフェースで
ないボードはドライバが複雑で問題が生じやすいので、このような目的には
適していません。

予算が限られていて、PCI 以外の SCSI カードが必要ならば、在庫処分品や
中古の Adaptec 154x B バージョンや 174x A バージョンのボードを見つけ
るか、Adaptec 1520 互換のボード (新品で 80ドルくらいからあります) を
探すのがいいでしょう。
これらのボードのスループットと応答性はかなりのもので、値段もまあまあ
です。

<sect> マイナー番号の割り当て
<p>

Linux では、<tt/dev_t/ に 16ビットを使用しており、マイナー番号には 8ビット
しか割り当てられていないため、SCSI ディスクやテープ、CDROM、それに
汎用デバイスのマイナー番号は、以下にしたがって動的に割り当てられます。

<quote><verb>
For すべての SCSI ホストアダプタ (scsi0 から scsiN まで) について
    For ホストアダプタ自身の ID を除く、すべての SCSI ID (0 から 7 まで) について
        For すべての LUN (0 から max_scsi_luns まで) について
	  - TEST UNIT READY コマンドを発行して、バス、ターゲット、
	    LUN の組み合わせを探索する。あるバス上の SCSI ID に
	    デバイスが存在しないと判断したら、そのバスと SCSI ID の
	    対しては LUN の探索を行わない。
	  - INQUIRY コマンドを発行して、見つかったデバイスに関する
	    情報を集める。デバイスタイプ、メーカー、モデル名、
	    ファームウェアのバージョンなど。
	  - この結果を特別な認識関数を通して、存在するハイレベル
	    ドライバ (ディスク、テープなど) に通知する。
	    このデバイスを扱えるドライバのユニットとしてアタッチする。
	    汎用ドライバはすべてのデバイスをアタッチする。
	  - SCSI-I デバイスの場合、あるいは複数の LUN を扱えない
	    デバイスのリストに載っているデバイスの場合は、
	    このバスのこの SCSI ID に対して LUN の探索を行わない。
	  - 複数の LUN を持っていることがわかっているデバイスの
	    場合は、max_scsi_luns を無視してすべての LUN を
	    スキャンする。
</verb></quote>

この方法では、しばしば問題が生じる場合があるということが分かっています。
ある時点でしか存在しないデバイスがあった場合、そのデバイスのマイナー
デバイス番号は、ブート時に見付かったデバイスに依存して決まります。
この場合、<tt/rc/ スクリプトや <tt>/etc/fstab</tt> ファイルによって
マウントされるパーティションのマイナー番号が異なってしまう可能性が
あるからです。

この問題は、まだ完全には解決されていません。
<tt>/dev/scsi</tt> 以下のデバイス階層をホスト番号と SCSI ID および 
LUN から作成するプログラムがあり、<url url="ftp://tsx-11.mit.edu"> から
取ってくることができます。
ちょっと扱いづらい点もありますが、これによって問題の一部が軽減される
ことは確かでしょう。

多分もっと良い解決法は、<tt>/proc/scsi</tt> 擬似ディレクトリを使うこと
でしょう。現在作業が進行中なので、どのような方法になるかはまだ正確には
言えませんが、この問題を解決するためには有望だと思えます。

</article>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:2
sgml-indent-data:t
sgml-parent-document:nil
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->
