この章では Linux でサポートされている各種のホストアダプタに対して、 それぞれのホストアダプタに固有の情報を示します。
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&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。
MCA のカードのうち、上にあるサポートされているカードと互換性のあるもの (つまり Adaptec 1640 と BusLogic 640) は動作します。
アルファ版のドライバの多くが以下のサイトに置かれています。
ftp://tsx-11.mit.edu/pub/linux/ALPHA/scsi
NCR53c8xx のドライバは開発されていますが、このドライバは NCR53c700、 NCR53c710、NCR53c720 のチップに対してそのままでは適用できません。 これらのチップを動作させるには以下のような修正が必要です。 修正の難易度についても示しています。
訳注: カーネル 2.0.27 では、すでにこれらのチップはサポートされて いるようです。
カードの検出部分の変更、初期化の変更、'810 のレジスタアドレスを '7xx 用にマッピングするためのコードの変更。
カードの検出部分の変更、初期化の変更 (以上はアセンブラソースの変更)、'810 のレジスタアドレスを '7xx にマッピングするためのコードの変更、IID 割り 込みを扱うための割り込みハンドラを INTFLY 命令からそのエミュレーション に変更。
検出部分の変更、初期化の変更、 NCR のコードを DSA を使わないように変更、 Linux 本体のコードを変更し、コンテキストスイッチを扱えるようにする。
パラレル->SCSI アダプタ全部、 Rancho の SCSI ボード、ジャンク品の SCSI カード。 Buslogic の FlashPoint ボード (BT-930/932/950 など) もま だサポートされていません。
Adaptec と非互換で NCR53c8xx を使用していない DTC のボード (3270、 3280 など)。CMD の SCSI ボード。
DTC/CMD からプログラムに必要な情報をもらうには、秘密保持契約を結ぶ 必要があります。これはつまり Linux のドライバを書いても、そのドライバ を公開できない、ということになります。秘密保持契約に従えばソースは 公開できませんから、これは GPL に反します。また GPL に従う場合は ソースを公開しなければなりませんから、これは秘密保持契約に反する ことになります。
もしこれら以外のサポートされていないハードウェアを動かしたければ、選択 肢は二つあります。一つはあなた自身がドライバを書くことです (Eric Youngdale と私は Linux の SCSI ドライバに関する技術的な質問には通常喜んでお答え します)。もう一つはドライバの作成を依頼することです (個人での利用の場 合には契約料金が高く付きすぎるでしょうが)。
ホストアダプタの中には、一台のシステムで同じ形式のアダプタを 複数使うことができるものがあります ( 購入の手引き: ドライバ機能の比較 を見てください)。 同じ形式のアダプタを一つのホストで複数使う場合は、通常最も低いアドレス のものが scsi0 になり、その次が scsi1... のようになります。
種類の違うホストアダプタなら、どんな場合でも複数のアダプタを同時に使う
ことが可能です。ただしアドレスが競合していないことが条件です。 SCSI コ
ントローラは drivers/scsi/hosts.c
の
中の builtin_scsi_hosts[]
配列の順番で検索されます。現在の順番は以下の通りです。
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.
ほとんどの場合 (Buslogic と Adaptec のドライバの両方を使っていない場合) には、このエントリを入れ替えることで、検索の順番を都合の良いように変え ることができます。例えば新しい SCSI ホストをシステムに追加したときに、 元からのデバイス名を変更したくない場合などがあるでしょう。
割り込みがちゃんと有効になっているか、他のボードとの IRQ、DMA、 IO アドレスなどの競合が起こっていないかを確認してください。
もしお使いの SCSI アダプタが以下のどれかの場合:
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
そしてアダプタがブートアップの時に検出されない場合、すなわち
scsi : 0 hosts
や
scsi%d : type
といったようなメッセージがシステムにインストールされている (サポート対象の) SCSI アダプタそれぞれに対して表示されない場合は、 自動検出のルーチンがそのボードを知らないために問題が起こっている ものと考えられます。
BIOS を使って自動検出を行うドライバでは、BIOS が有効になっている必要が あります。よく調べてください。 またほかの機器の BIOS と競合していないかもチェックしてください。
ボードのシグネチャや BIOS のアドレスがドライバに登録されているものと 違う場合も自動検出は失敗します。
訳注: シグネチャとは、BIOS の先頭部分に書き込まれている情報の ことです。
BIOS がインストールされている場合は、DOS と DEBUG を使ってボードの シグネチャを調べてください。
例えば 0xc8000 にあるボードに対しては、DOS から
debug
d c800:0
q
として、結果を ASCII で Linux メーリングリストの SCSI チャネルに送っ てください。メッセージの長さとベースアドレス (この場合 0xc8000) からの オフセットも同時に送ってください。メッセージは完全に正確でなければなり ません。またテキストには 16 進と ASCII の両方が含まれる必要があるでしょ う。
BIOS がインストールされていない場合、そしてお使いのドライバが Adaptec 152x、 Trantor T128、 Seagate のどれかである場合は、コマンドラインやコ ンパイル時に検出を強制するように設定を変更することができます。
お持ちの SCSI カードに対応した節をご覧になってください。 不安定なシステム も見てください。
(Trantor T128 と Seagate のボードが該当します。 Adaptec、 NCR5380 汎用、PAS16、Ultrastor のボードには該当しません。)
この問題は、メモリマップされた I/O ポートが誤ってキャッシュされて いるときによく起こります。 BIOS 設定で、ボードの占有するアドレス空間をキャッシュ不可に設定して ください。
これができない場合は、キャッシュを全てオフにしてください。
ボードのアドレスをマニュアルで設定する場合は、Linux に必要なのは 16バイトセ グメントの値 (マニュアルにはたいていこちらが書いてあります) ではなく、 実際のアドレスであることに注意してください。
つまり 0xc8000 が正しい値であり、 0xc800 では正しく動作しません。後者 では恐らくメモリの内容が破壊されてしまうでしょう。
カーネルのバイナリイメージを (フロッピーにコピーする前/した後に) 編集 する必要があります。 2 バイトのフィールド (リトルエンディアンに注意) をいくつか修正すれば、お使いのシステムで動くようになります。
バイト表現では以下のようになります。
3.5" : 0xA0 0x05
5.25" : 0xB0 0x04
dd
か rawrite
を用いてファイルをディスクに書き込んでください。
そのディ
スクを A:
のフロッピードライブに入れ、「ルートディスクを入れるように」
というプロンプトが出るのを待って、お使いの配布パッケージのルートフロッ
ピーを入れてください。
まずドライバの作者が使っているバージョンのカーネルを手に入れる必要があ ります。バージョンの情報は恐らくドライバと同時に配布されているドキュメ ントに記述があるでしょう。
最新のものを含め、様々なバージョンのカーネルは
ftp://nic.funet.fi/pub/OS/Linux/PEOPLE/Linus
にあります。名前は linux-
version.tar.gz
となっているは
ずです。
これらは tsx-11 などの 多くのサイトにもミラーされています。
ソースを手に入れたら /usr/src
へ移動し、古い Linux のソースを
削除しましょう。バックアップとして残したい場合は以下のようにします。
mv linux linux-old
アーカイブを展開します。
gunzip < linux-0.99.12.tar.gz | tar xvfp -
パッチを当てます。パッチファイルで記述されているファイル名は、ファイル
システムの適当なディレクトリを基準として、そこからの相対パスで記述され
ています。パッチファイル中の出力ファイルの行を
調べる (^---
を grep
すれば表示されます) ことで、
この基準ディレクトリがどこかわかります。例えば
--- ./kernel/blk_drv/scsi/Makefile
--- ./config.in Wed Sep 1 16:19:33 1993
のような行がパッチファイルにあったら、基準ディレクトリは
/usr/src/linux
です。
ドライバのソースを適当な場所に展開します。アーカイブの中身を見るには以 下のようにします。
tar tfv patches.tar
展開したファイルは必要な場所に移動します。 SCSI のドライバファイル
は /usr/src/linux/kernel/drivers/scsi
に置く必要があります。
パッチファイル中の基準ディレクトリに移動して以下のようにタイプすること でパッチが当たります。
patch -p0 < patch_file
パッチファイル中のファイル指定における、最初の方のディレクトリを無視する ように指定することもできます。例えば
--- linux-new/kernel/blk_drv/scsi/Makefile
のような指定がパッチファイル中にあり、これを /usr/src/linux
以下のファイルにパッチ当てしたい場合は、まず /usr/src/linux
に
cd
してから
patch -p1 < patches
と打ち込みます。これで linux-new
は無視されます。
パッチ当てが終わったら、失敗したパッチがないか調べてください。パッチが
失敗すると #
という拡張子がついたファイルができているはずです。
訳注: 普通この拡張子は.rej
ですが、patch
のコンパイル時 のオプションによって、#
になることもあります。
find /usr/src/linux/ -name "*#" -print
このようなファイルが存在したら、その中身を見てください。もしかしたら単
に RCS の識別子が違っているだけかもしれません。この場合は無害ですから
無視してかまいません。それ以外の場合は、手でパッチ当てをする必要がある
かもしれません。diff
ファイルの形式とパッチ当てに関してはこの文書の範
囲外です。
カーネルの設定と再構築 もご覧になってください。
ときにはドライバの作者が自分の書いたドライバの .c
や .h
ファイルへのパッチを提供していない場合もあります。またパッチ元の
カーネルのバージョンが古すぎて、うまくパッチが当たらない場合も
ありえます。
.c
や .h
などのファイルを
/usr/src/linux/drivers/scsi
へコピーします。
/usr/src/linux/config.in
を編集して
*
* SCSI low-level drivers
*
以下のセクションに、使用するドライバの設定変数をブール値で追加します。
例えば以下のようになるでしょう。
bool 'Always IN2000 SCSI support' CONFIG_SCSI_IN2000 y
Makefile
にエントリを追加します。
/usr/src/linux/drivers/scsi/Makefile
を編集して、以下のような
行を追加します。
ifdef CONFIG_SCSI_IN2000
SCSI_OBS := $(SCSI_OBJS) in2000.o
SCSI_SRCS := $(SCSI_SRCS) in2000.c
endif
これらの行は Makefile
中の
scsi.a: $(SCSI_OBJS)
の行の前に置きます。指定行の .c
のファイルには先ほどコピーし
た .c
のファイルを、.o
のファイルには .c
のファイルの
拡張子を .o
に置き換えたものを書きます。
/usr/src/linux/drivers/scsi/hosts.c
を編集して、
ヘッダファイルのための #include
行を追加します。
設定ファイルに加えた CONFIG_SCSI
の値によって
プリプロセッサの処理を変更できるようにしておくと良いでしょう。
例えば、
#ifdef CONFIG_SCSI_GENERIC_NCR5380
#include "g_NCR5380.h"
#endif
などの行の後に、以下のような行を加えることになります。
#ifdef CONFIG_SCSI_IN2000
#include "in2000.h"
#endif
次に Scsi_Host_Template
のエントリを
scsi_host[]
配列に追加する必要があります。
.h
ファイルを見てみると例えば以下のような #define
行があるはずです。
#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}
このマクロを scsi_hosts[]
配列に追加します。
設定ファイルで定義したシンボルによってプリプロセッサの動作を
制御できるようにしておきましょう。
つまり
#ifdef CONFIG_SCSI_GENERIC_NCR5380
GENERIC_NCR5380,
#endif
のような行の後に、追加するエントリを以下のように書くわけです。
#ifdef CONFIG_SCSI_IN2000
IN2000,
#endif
カーネルの設定と再構築
の章も見てください。
Compaq のシステムの多くでは PCI デバイスを検出するための 32 ビット拡張 BIOS がメモリにマップされています。メモリレイアウトが特殊なために、 Linux では この BIOS をアクセスすることができません。 Linux は (サポー トされているはずの) PCI SCSI ボードの検出に失敗すると、以下のようなメッ セージが出力されます。
pcibios_init: entry in high memory, unable to access
以下のファイルを手に入れてください。
ftp://ftp.compaq.com/pub/softpaq/sp0921.zip
これは自己解凍型のアーカイブで、BIOS32 のコードを再配置するためのプロ グラムが入っています。
訳注: このzip
ファイルをunzip
すると、exe
サフィックス を持った自己解凍型のアーカイブができます。
%d Hosts
というメッセージを出した後にハングアップします。
PCI のシステムの中には、BIOS 中で割り込みを禁止し、再び割り込みを 可能にせずに呼び出し元に制御を返してしまうものがあります。 以下のパッチでなおるはずです。
--- 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" (&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" (&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" (&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" (&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" (&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" (&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" (&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" (&pci_indirect));
+ restore_flags(flags);
return (int) (ret & 0xff00) >> 8;
}
BIOS アドレス : 0xd8000, 0xdc000, 0xd0000, 0xd4000,
0xc8000, 0xcc000, 0xe0000, 0xe4000
IO ポート : 0x140, 0x340
IRQ : 9, 10, 11, 12
DMA : 使用していません
IO : ポートマップ方式
BIOS が入っているボードではだいたいうまく動作するようです。入っていな いボード (Adaptec 1510、Sound Blaster16 SCSI など) では、カーネルのコ マンドラインオプションかコンパイル時の設定変更が必要になります。
PORTBASE
、IRQ
、SCSI_ID
、RECONNECT
、PARITY
を
適当な値に定義してください。
「定義可能なパラメータ」のところを参考にしてください。
aha152x=<PORTBASE>[,<IRQ>[,<SCSI-ID>[,<RECONNECT>[,<PARITY>]]]]
SCSI-ID はホストアダプタの SCSI ID です。特に ID 7 が必要な他のデバイ スをつないでいない限り 7 にしておきましょう。
I/O アドレスを 0x340 に固定し、IRQ 11、SCSI-ID 7、 ディスコネクト/リコネクトを許可するようにするには、 以下のようなコマンドラインオプションを使うことになります。
aha152x=0x340,11,7,1
AUTOCONF
コントローラが報告してきた設定を使う (152x のみ)
IRQ
割り込みチャネルの設定変更 (9,10,11 or 12) (デフォルト 11)
SCSI_ID
AIC-6260 の SCSI ID の設定変更 (0-7) (デフォルト 7)
RECONNECT
ターゲットからのディスコネクト/リコネクトの設定を 変更する (0 以外で許可、0 で禁止)
DONT_SNARF
ポートを登録しない (pl12 以下)
SKIP_BIOSTEST
BIOS シグネチャのテストを 行わない (AHA-1510 または BIOS のない機器)
PORTBASE
ポートのベースアドレスを指定し、検出を行わない。
訳注: カーネル 2.0.27 に付属のドライバでは、DONT_SNARF はなくなっています。 また、PORTBASE は IOPORT に変更されています。
IO ポート : 0x330 and 0x334
IRQ : 9, 10, 11, 12, 14, 15
DMA チャネル : 5, 6, 7
IO : ポートマップ方式、バスマスタ方式
自動検出されるのは I/O アドレス 0x330 と 0x334 だけです。
aha1542=<PORTBASE>[,<BUSON>,<BUSOFF>[,<DMASPEED>]]
drivers/scsi/aha1542.h
中の AHA1542_SCATTER
を 0 に
すると、(動作する、という言葉の定義によりますが) 無理矢理動作させる
こともできます。
訳注: スキャッタ/ギャザについて補足説明。
Linux は仮想記憶を採用していることはご存知ですね。 CPU から指定された仮想アドレスは、MMU によって物理アドレスに変換され ます。しかしこの変換が行われるのは CPU からのアドレスだけであって、 DMA やバスマスタ転送を行う場合のアドレスは、物理アドレスを使用しな ければなりません (PC/AT アーキテクチャの場合。ちなみに Sun の SPARCstation などは DMA も仮想アドレスを使います)。 仮想アドレスから物理アドレスへの対応づけは、ページと呼ばれる単位ごとに 行われますから、プログラムから見て仮想アドレスが連続していても、物理 アドレスは飛び飛びになっているということがあり得ます。 このような場合にも、コントローラを一度設定するだけで、 飛び飛びの物理アドレスにデータを転送してくれるような機能の ことを、スキャッタ/ギャザといいます。 コントローラがスキャッタ/ギャザをサポートしていない場合には、飛び飛びに なっている物理アドレスの個数分だけ、DMA を複数回行なう必要があります。
154xC の初期のカードでは SCSI 信号の立ち上がりが速すぎるため、 インピーダンスの正しくないケーブルを使うと信号の反射が起こって しまうことがありました。
新しいボードでは幾分改善されているようですが、それでもケーブルや ターミネーションに対しては非常に敏感です。
この章の「よくある問題」の その2 や その3、それに よくある問題、 不安定なシステムの章も参考にしてください。
おそらくターミネーションの問題でしょう。ソフトウェアでホストアダプタの ターミネーションを無効にするには、スイッチ 1 をオフにする必要があります。 この章の「よくある問題」の その1 や その3、それに よくある問題や 不安定なシステムの章も参考にしてください。
複数のデバイスが同時に使用されると、システムがフリーズしたように見える
ことがあります。この場合はデバイスのメーカに連絡して見るとよいでしょう。
ファームウェアのアップグレードによってこの問題は解決されているかもしれ
ません。最後の手段としては aha1542.h
中の AHA1542_MAILBOX
を
1 に変更する方法があります。これは SCSI バスに同時に出力されるコマンド
を実効的に一つだけにするので、この状況を解決できるかもしれません。しかし
遅いテープドライブや CD-ROM デバイスを用いている場合は、実用的な解決法に
はならないでしょう。
この章の「よくある問題」の その1 や その2、それに よくある問題、 よくある問題: SCSI システムがロックアップする などの項も 参考にしてください。
BIOS の拡張機能のうち、 1G 以上のディスクに対する拡張マッピング、3 台 以上のディスクのサポート機能、およびバスの自動スキャンを無効にします。 あるいはカーネルを 0.99.14k 以上にアップグレードしましょう。
Unable to determine Adaptec DMA priority. Disabling board.
これは古い BusLogic のドライバとの間で衝突が起こってしまうためです。カー ネルを再構築して BusLogic のドライバを含まないカーネルを作るか、カーネ ルのコマンドラインオプションを用いて BusLogic のドライバに別のアドレス を検出するようにさせます。もし使っている Adaptec のボードがポートアド レス 0x334 を使っており、0x330 を使っているボードが何もないようでした ら、以下のようなコマンドラインオプションになります。
buslogic=0x330
Adaptec のファームウェアのあるバージョンにはバグがあります。 BIOS を v2.11 以上にするとこの問題は解決されているそうです。
スロット : 1-8
IO ポート : EISA ボードなので関係無し
IRQ : 9, 10, 11, 12, 14, 15
DMA チャネル : EISA ボードなので関係無し
IO : ポートマップ方式、バスマスタ方式
全ての設定で動作します。
ありません。
aha1740: Board detected, but EBCNTRL = %x, so disabled it.
使用中のボードがエンハンストモードではないのでボードを有効にできないためです。 1542 モードでボードを動作させることはできません。
訳注: カーネル 2.0.27 では、294x もサポートされています。
Adaptec 294x もサポートする新しいバージョンは以下から入手できます。
ftp://ftp.ims.com/pub/Linux/aic7xxx
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 : ポートマップ方式、バスマスタ方式
拡張マッピングを強制するには以下のようにします。
aha274x=extended
CONFIG_PCI
を指定しておく必要があります。
IO ポート : 0x100, 0x110, 0x200, 0x220
IRQ : 10, 11, 14, 15
DMA チャネル : 使用していない
IO : ポートマップ方式
BIOS は不必要。
ありません。
(この節は Leonard N. Zubkoff
<lnz@dandelion.com> に著作権があります。)
(Buslogic のドライバの文書としてより詳細なものを望む方は
README.BusLogic
を見てください。)
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
BusLogic Inc. は高性能な SCSI ホストアダプタを何種類も設計、生産しています。
MultiMaster ASIC 技術を用いることで、これらのホストアダプタでは使用する
バスが異なってもプログラミングのインターフェースは共通化されています。
このドライバは現存する全ての BusLogic MultiMaster ホストアダプタをサポート
しており、恐らく将来リリースされるシリーズ製品に対してもそのまま (あるいは
わずかな修正で) 対応できるでしょう。 FlashPoint アーキテクチャに基づいた
ホストアダプタはこのドライバではサポートしていません。
こちらに関しては 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 サイトが ftp://ftp.buslogic.com に、BBS が 408/492-1984 にあります。 BusLogic の技術サポートには電子メール techsup@buslogic.com 、電話 408/654-0760、 FAX 408/492-1542 で 連絡をとることができます。 ヨーロッパおよび日本における連絡先は Web サイトから得ることができます。
以下のリストは BusLogic 社のホストアダプタのうち、現在までにサポート されているものの一覧です。以下の表にない BusLogic 製品を購入しようと 考えている方には、その製品のサポートがされているか、あるいはされる 予定があるかどうかを筆者まで尋ねてからにすることをお勧めします。
"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)
AMI の FastDisk ホストアダプタは BusLogic の完全なクローンなので、 このドライバで動作させることができます。
BT-948/958/958D PCI Ultra SCSI ホストアダプタの機能には、Linux をイン ストールする際に (場合によっては) 注意しなければならない点があります。
工場出荷時の設定では、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」になっています。
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 # For PCI Scanning Seq」オプションを OFF に してください。
このドライバは PCI の検索手順のオプション設定を問い合わせて、ホストアダプタ をアダプタの BIOS と同じ順序で認識するようにしています。
BusLogic の広報用メーリングリストは Linux ユーザに新しいドライバの リリースを知らせたり、 BusLogic SCSI ホストアダプタの Linux サポート関連の アナウンスを伝えるのに用いられています。 このメーリングリストに参加するには、本文に「subscribe」と書いたメールを BusLogic-announce-request@dandelion.com まで送ってください。
(この節は Leonard N.Zubkoff <lnz@dandelion.com> に 著作権があります)
現在のところ 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 の方がはっきりと優れて いるのです。
< 引用はじめ >
ANNOUNCEMENT BusLogic FlashPoint/BT-948 Upgrade Program 1 February 1996
十月終わりにリリースされて以来、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$ で、 BusLogic のテクニカルサポートが実行しています。 連絡先は電子メールが 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 へ $45 で アップグレードする道を提供しています。 アップグレードを受けるには、BusLogic のテクニカルサポート techsup@BusLogic.com か +1 408 654-0760 へ連絡してください。
Leonard N. Zubkoff lnz@dandelion.com<引用終わり>
EATA-DMA プロトコルを使っているもの全て。 以下のようなものがあります。
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
この他、上記のボードに対応するディファレンシャル SCSI の ボードもサポートされています。
また以下のメーカのコントローラにもサポートされているものが あります。
NEC、AT&T、SNI、AST、Olivetti、Alphatronix
スロット : ALL
IO ポート : ALL
IRQ : 全レベル、エッジトリガ
DMA チャネル : ISA のものは全て、EISA/PCI は関係無し
IO : ポートマップ方式、バスマスタ方式
SCSI Channels : ALL
全ての設定で動作します。
EATA-DMA ドライバの最新バージョンは以下から入手できます。
ftp://ftp.i-Connect.Net:/pub/Local/EATA/
EATA メーリングリストは EATA-DMA および EATA-PIO ドライバを使用してい る Linux ユーザに議論の場と新バージョンその他のアナウンスの場を提供し ています。メーリングリストに参加するには、 メッセージ本文に「subscribe」と書いたメールを linux-eata-request@i-connect.net 宛に 送ってください。
/proc/scsi
サポート
より詳細なコマンドの統計をとるには以下を実行してください。
echo "eata_dma latency" > /proc/scsi/eata_dma<driver_no>
これを再び off にするには以下のようにします。
echo "eata_dma nolatency" > /proc/scsi/eata_dma<driver_no>
解決法は、ascsi*
のブートディスクを使うことです。
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)
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
このために IDE ドライバに問題が生じたら (つまり実際の IDE デバイスに
アクセスできなくなったら)、EATA ボードの IO ポートか IRQ (あるいはその
両方) を変えてみてください。
<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 : ポートマップ方式
全ての設定で動作します。 BIOS がインストールされていることが必要です。
ありません。
disktab
を使用する必要があります。
IO ポート : all
IRQ : all
DMA チャネル : DMA は使用しません
IO : ポートマップ方式
できません。
GENERIC_NCR5380_OVERRIDE
を IO ポート、IRQ、DMA、およびボード形式
からなる配列データとして定義します。
ポート 0x330、IRQ 5 の NCR5380 の場合は以下のようになります。
#define GENERIC_NCR5380_OVERRIDE {{0x330, 5, DMA_NONE, BOARD_NCR5380}}
ポート 0x350 の T130B の場合なら以下のようになります。
#define GENERIC_NCR5380_OVERRIDE {{0x350, 5, DMA_NONE, BOARD_NCR53C400}}
古いバージョンのコードでは BOARD_*
のエントリが無視されるかもしれません。
IRQ の部分に IRQ_NONE
と IRQ_AUTO
が使えます。
ncr5380=port,irq ncr5380=port,irq,dma ncr53c400=port,irq irq を使わない場合は 255、自動選択する場合は 254 にします。
NCR5380 互換レジスタのベースアドレスからのオフセットは 8 です。 従って、ベースアドレスが 0x350 ならば、カーネルのコマンドラインから 以下のように入力してください。
ncr5380=0x358,254
パブリックリリース 6 以前の NCR5380 汎用ドライバは これらのボードの割り込みに対応していません。 バージョンアップして下さい。
ベースアドレス : ALL
IRQ : ALL
DMA チャネル : PCI なので関係なし
IO : ポートマップ方式、バスマスタ方式
PCI BIOS が必要です。デバイスのスキャンやコンフィギュレーション空間の 読み出しには PCI BIOS のルーチンを使っています。
ドライバは初期化の際、いくつかのレジスタにプログラムされている値を用います。 従って BIOS がインストールされている必要があるのです。
訳注: 最新のカーネル (2.0.27) では、ディスコネクト/リコネクトは サポートされています。
ドライバの最新リリース版は以下のところから手に入ります。
ftp://tsx-11.mit.edu/pub/linux/ALPHA/scsi/ncr53c810
現在のところここには 1.2.10 以降へのパッチが置いてありますが、 次のリリースでは 1.3.x だけになります。これらのパッチはすべて 完璧に当たるとは限りません。ELF 対応パッチや他のパッチが開発 者である私のベースシステムには既に当たっているからです。 もしパッチの際の障害 (4つあります) を手動で訂正できない場合は、 これらのパッチは使わないで下さい。パッチは最新のものだけが必要です。 インクリメンタルなパッチではありません。
次のリリースが待てず、NCR のドライバを 1.3.x カーネルで使いたいという方の ために、 Harald Evensen <Harald.Evensen@pvv.unit.no> が 1.3.x 用の パッチを公開しています。
ftp://ftp.pvv.unit.no/pub/Linux/ALPHA/ncr
これらのパッチは問題なく当たるはずです。
まずこれらのディレクトリの README ファイルをすべて読んで下さい。 またアルファ版のコードを用いたい場合は NCR メーリングリストにも 入って下さい。ここでは暫定的なバグフィックスや次バージョンの リリース情報などがポストされます。
参加するには以下のような内容をメール本文に書いて、 majordomo@colorado.edu に 送って下さい。
subscribe ncr53c810
参加をやめる場合にはメール本文に以下のような内容を書いて同じアドレスに 送って下さい。
unsubscribe ncr53c810
訳注: 特に neptune や mercury チップセットは危ないようです。
"scsi%d: IRQ0 not free, detaching"
あるいは次のような場合もあります。
"scsi%d: IRQ255 not free, detaching"
割り込みラインを設定する NCR のチップの PCI 設定レジスタが、
すべて 0 または 1 にセットされてしまっています。
設定に問題があるか (
よくある問題: その1 を見て下さい)、マザーボードの BIOS に
欠陥があるのでしょう。
drivers/scsi/ncr53c7,8xx.c
の pci_init()
関数を変更すると
この問題を回避することができます。
irq = my_irq;
という行を以下の部分の前に追加して下さい。
return normal_init (tpnt, board, chip, (int) base,
(int) io_port, (int) irq, DMA_NONE, 1, bus, device_fn,
options);
ncr53c810=xxx
などが機能しない
現在のカーネルでは init/main.c
にこれらのオプションへの
エントリポイントが無いためです。これは実は根拠があってのことです。
コマンドラインオプションが与えられていると、ドライバは必ずそのパラメー
タでボードの自動検出を行ないます。もしコマンドラインの設定が PCI の設
定ルーチンで得られるものと異なると、問題が生じることになります。
実際にコマンドラインによる指定が必要となるのは、PCI のハードウェアと
BIOS が壊れている場合でしょうが、この場合はエラー復帰ルーチンも
機能しないので、コマンドラインオプションにはほとんど価値がないのです。
最後に。利用者がコマンドラインオプションを必要だと考えるのは、ドライバ
が設定などのエラーメッセージを出したときだけです。が、ドライバが設定に
問題があると言ってきたときは、システムの設定に問題があるか、あるいはシ
ステムが壊れているかなのです。このような場合コマンドラインオプションを
使っても問題は解決しません。
init/main.c
に適当なエントリポイントを追加すればコマンドライン
オプションを有効にすることはできるかもしれませんが、これは完全にサポート
の範囲外であるだけでなく、おそらく動作もしないでしょう。
訳注: 2.0.27 のドライバは、同期転送をサポートしています。
ベースアドレス : 0xc8000, 0xca000, 0xcc000, 0xce000, 0xdc000, 0xde000
IRQ : 3, 5
DMA チャネル : 使用されません
IO : メモリーマップ方式
アドレスに関してのみスキャンを行ないます。 IRQ は 5 とみなされます。BIOS がインストールされている必要があります。
OVERRIDE
をベースアドレスに、CONTROLLER
を FD
もし
くは SEAGATE
のどちらかに、IRQ
をシステムの IRQ にそれぞれ
定義します。
st0x=address, irq または tmc8xx=address,irq
(0.99.13b 以降のカーネルで動作します)
ハンドシェイクは以下のような手順で行われます。
コマンドを読み込んで処理するのが遅いデバイスでは、 REQ/ACK ハンドシェ イクに 12us 以上の時間がかかってしまいます。するとドライバで指定されて いる経過時間が過ぎても REQ がデアサートされないので、 一つの REQ パルスに対して複数バイトのデータを送ってしまいます。
カーネル 0.99.12 にはバグがあって、アービトレーションのコードを 書き換えた結果セレクションが失敗するようになっていました。 0.99.13 で修正されています。
出荷時のボードのデフォルト設定は MSDOS 向けになっています。 つまり割り込みが無効になっているのです。割り込みを有効にする ジャンパスイッチは、 Seagate のボードではジャンパ W3 (ST01) または JP3 (ST02) で、IRQ 5 を選択するには F と G のピンを ショートします。
scsi_devices
配列の
broken
フィールドの値を用いて、デバイスごとに選択する
ようにしています。
もし問題が生じたら、該当するデバイスを broken
が 0 にリセット
されないデバイスのリストに登録してください。
現在リストには TENEX CDROM ドライブのみが登録されています。
seagate.h
を編集して、STAT_MSG
と STAT_CD
の定義を交換し、
カーネルを再コンパイルして下さい。
その際 CONTGROLLER
を SEAGATE
に定義し、
IRQ
と OVERRIDE
を適当な値に設定して下さい。
fdisk
しようとすると、HDIO_REQ
か
HDIO_GETGEO ioctl
が失敗したというエラーメッセージや、
以下のようなエラーメッセージが表示される。
You must set heads sectors and cylinders. You can do this from the extra functions menu.パーティションの作成 を 見て下さい。
seagate.c
には以下のようなコードがあるはずです。
cli();
DATA = (unsigned char) ((1 << target) | (controller_type == SEAGATE ? 0x80 : 0x40));
CONTROL = BASE_CMD | CMD_DRVR_ENABLE | CMD_SEL |
(reselect ? CMD_ATTN : 0);
sti();
これを以下のように直せば解決するでしょう。
cli();
CONTROL = BASE_CMD | CMD_DRVR_ENABLE | CMD_SEL |
(reselect ? CMD_ATTN : 0);
DATA = (unsigned char) ((1 << target) | (controller_type == SEAGATE ? 0x80 : 0x40));
sti();
FAST
または FAST32
これらを定義すると 可能な場合にはブラインド転送を行ないます。
ARBITRATE
ホストアダプタが SCSI-II 互換の アービトレーションを行なうようにします (バスフリーフェーズを待って いきなりセレクションをはじめるのではなく)。 配布版のソースを再構成する時には、LUN 当たりひとつのコマンドを 実行するように変更する予定です (訳注: つまり今はそうなっていないと いうことか?)。
SLOW_HANDSHAKE
Seagate のソースコードのハンドシェイクの スピードについていけないイカレたデバイス (ある種の CD ROM など) を使う 時に定義してください。
SLOW_RATE=x
ハンドシェイクが正しく動作しないときに デフォルトの転送レートにする値を x に指定します。
IO ポート : 0x388, 0x384, 0x38x, 0x288
IRQ : 10, 12, 14, 15
(重要) : IRQ はこのボードのサウンド機能が用いる IRQ とは
別にする必要があります。
DMA : このボードの SCSI 機能では用いません。
IO : ポートマップ方式
BIOS は必要ありません。
PAS16_OVERRIDE
を IO ポートと IRQ の配列として定義して下さい。
ポート 0x388、IRQ10 の場合ならば以下のようになります。
#define PAS16_OVERRIDE ((0x388, 10))
pas16=port,irq
AUTOSENSE
定義されていると CHECK CONDITION ステータスを 返してくるコマンドに対して自動的に REQUEST SENSE が実行されます。
PSEUDE_DMA
擬似 DMA のハードウェアを使用できるようにします。 性能は I/O ポーリングを使ったものの 3-4 倍になります。
PARITY
パリティチェック機能を有効にします。 まだサポートされていません。
SCSI2
SCSI-II タグ付きコマンドキューイングをサポートします。 テストされていません。
UNSAFE
割り込みを許可したまま擬似 DMA 転送を行います。 高速シリアル通信でデータ落ちが生じる場合にだけ使って下さい。 その場合でも、転送サイズを変更する方が良い結果が得られるでしょう。
USLEEP
ディスコネクトを行なわないデバイスをサポートします。 テストされていません。
PSEUDO_DMA
の定義を無効にして下さい。
drivers/scsi/pas16.c
の中の #define PSEUDO_DMA
を
#undef PSEUDO_DMA
に修正します。
後者の方法は最後の手段と思って下さい。この方法を選ぶと著しく性能が落ち
てしまいます。
ベースアドレス : 0xcc000, 0xc8000, 0xdc000, 0xd8000
IRQ : なし, 3, 5, 7 (全てのボード)
10, 12, 14, 15 (T128F のみ)
DMA : 使用していません
IO : メモリーマップ方式
全ての設定において動作します。BIOS がインストールされている必要があります。
T128_OVERRIDE
をベースアドレスと IRQ からなる配列として定義します。
例えばアドレス 0xcc000、IRQ 5 のボードの場合には以下のようになります。
IRQ の指定には IRQ_NONE
と IRQ_AUTO
も使えます。
#define T128_OVERRIDE ((0xcc000, 5))
t128=address,irq
IRQ を用いないときは -1 を、自動検出には -2 を指定します。
AUTOSENSE
定義されていると CHECK CONDITION ステータスを 返してくるコマンドに対して自動的に REQUEST SENSE が実行されます。
PSEUDE_DMA
擬似 DMA のハードウェアを使用できるようにします。 性能は I/O ポーリングを使ったものの 3-4 倍になります。
PARITY
パリティチェック機能を有効にします。 まだサポートされていません。
SCSI2
SCSI-II タグ付きコマンドキューイングをサポートします。 テストされていません。
UNSAFE
割り込みを許可したまま擬似 DMA 転送を行います。 高速シリアル通信でデータ落ちが生じる場合にだけ使って下さい。 その場合でも、転送サイズを変更する方が良い結果が得られるでしょう。
USLEEP
ディスコネクトを行なわないデバイスをサポートします。 テストされていません。
PSEUDO_DMA
の定義を無効にして下さい。
drivers/scsi/pas16.c
の中の #define PSEUDO_DMA
を
#undef PSEUDO_DMA
に修正します。
後者の方法は最後の手段と思って下さい。
この方法を選ぶと著しく性能が落ちてしまいます。
IO ポート : 0x130, 0x140, 0x210, 0x230, 0x240, 0x310, 0x330, 0x340
IRQ : 10, 11, 14, 15
DMA チャネル : 5, 6, 7
IO : ポートマップ方式、バスマスタ方式
ポートが 0x310 の場合は機能しません。BIOS は必要ありません。
コンパイル時のみです。PORT_OVERRIDE
を定義します。
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)これは Ultrastor のボードを WD1003 のエミュレーションモードで 動作させているときに起こります。解決法は二つあります。
hd=cylinders,heads,sectors
とするとデフォルト設定が上書きされ、ブートできるようになります。シリン
ダ、ヘッダ、セクタの数はそれぞれ 2048、16、255未満にして、それらを
掛けた値が本来の値と等しくなるようにします。
Linux から fdisk を用いる際にも手動でディスクのジオメトリを指定する必
要があります。そうしないとパーティションエントリが正しく書き込まれない
ため、 Linux では動作しますが DOS ではシリンダ/ヘッド/セクタ各エン
トリの取得に失敗するので動作しなくなってしまいます。
一度 Linux が立ち上がってしまえば、include/linux/config.h
の
HD_TYPE
マクロを適当な値に定義して再コンパイルすることで、
手動ブートしなくてもすむようになります。
BIOS アドレス : 0xce000
IO ポート : 0x350
IRQ : 15
DMA チャネル : 6
IO : ポートマップ方式、バスマスタ方式
BIOS がインストールされている必要があります。
ftp://tsx-11.mit.edu/pub/linux/ALPHA/scsi/AM53C974-0.3.tar.gz
にあります。
訳注: カーネル 2.0.27 には含まれています。
IO ポート : all
IRQ : all
DMA チャネル : 6
IO : ポートマップ方式、バスマスタ方式 (unintelligent)
ねえ Drew、この章はどこにあるの? 目次にしかないよ ;-) - by D.F.