AHC(4)

名称
ahc - Adaptec VL/EISA/PCI SCSI ホストアダプタドライバ

書式
VL/EISA カード 1 つ以上につき: controller eisa0 controller ahc0

PCI カード 1 つ以上につき: controller pci0 controller ahc0

PCI アダプタにメモリマップド I/O を許可するには: options AHC_ALLOW_MEMIO

SCSI バス 1 つ以上につき: controller scbus0 at ahc0

解説
このドライバは Adaptec AIC7770, AIC7850, AIC7860, AIC7870, AIC7880, AIC7890, AIC7891, AIC7895, AIC7896, AIC7897 ホストアダプタチップに接続された SCSI バスを利用できるようにします。 これらのチップは 次に挙げる Adaptec SCSI コントローラカードや、 多くのマザーボードに載っています。 274X(W), 274X(T), 284X, 2920C, 2940, 2940U, 2940AU, 2940UW, 2940UW Dual, 2940U2W, 2940U2B, 2950U2W, 2950U2B, 3940, 3940U, 3940AU, 3940UW, 3940AUW, 3940U2W, 3985

このドライバは twin/wide バスやコントローラのタイプに応じた fast/ultra/ultra2 同期転送、そしてタグキューイングや SCB ページング をサポートしています。

PCI デバイスでは “AHC_ALLOW_MEMIO” 設定オプションを記述することでメモリマップド I/O を利用するようになります。 メモリマップド I/O は (オプションを記述しない場合に利用する) プログラムド I/O よりも効率的です。 たいていの PCI BIOS は、 カードと通信するのにどちらの手段でも使えるようにデバイスをマップします。 しかし場合によっては (大抵は PCI デバイスが PCI->PCI ブリッジの向こう側にある場合)、 チップがメモリマップド I/O を利用するための初期化を BIOS が実施できません。 この問題の症状は、通常、 メモリマップド I/O の利用を試みるとシステムがハングアップすることです。 最近のマザーボードはたいていうまく初期化をするので、 このオプションを有効にしてもきちんと動作します。

ターゲット毎の設定は、 EISA 以外のモデルで起動時に利用できる SCSI-Select メニューで行ない、 EISA モデルでは EISA 設定ユーティリティで行ないます。 このドライバは、このターゲット毎の設定を受け取ります。 EISA アダプタでは BIOS が有効になっているという条件が必要です。 受け取る設定項目は、同期/非同期転送、最大同期ネゴシエーション速度、 ディスコネクト、ホストアダプタの SCSI ID、そして EISA ツインチャネルコントローラの場合にはプライマリチャネルの選択です。

I/O アドレスは検出ルーチンによって自動的に決定されますが、 284x (VESA ローカルバスコントローラ) を EISA システムで使う場合には注意が必要です。 他の EISA カードとの衝突を防ぐために、 284x が使用する I/O 領域を設定するジャンパが、 カードが挿し込まれている EISA スロットと適合していることを確かめて下さい。

性能と機能の組合せは、aic7xxx の製品の種類によってさまざまです。 次の表は ahc ドライバがサポートするさまざまなチップの比較です。 ワイドおよびツインチャネル機能は、 たとえ特定のチップで常にサポートされていても、 特定のマザーボードやカードの設計では無効になっているかもしれないことに 注意して下さい。

Chip MIPS Bus MaxSync MaxWidth SCBs Features aic7770 10 EISA/VL 10MHz 16Bit 4 1 aic7850 10 PCI/32 10MHz 8Bit 3 aic7860 10 PCI/32 20MHz 8Bit 3 aic7870 10 PCI/32 10MHz 16Bit 16 aic7880 10 PCI/32 20MHz 16Bit 16 aic7890 20 PCI/32 40MHz 16Bit 16 3 4 5 6 7 aic7891 20 PCI/64 40MHz 16Bit 16 3 4 5 6 7 aic7895 15 PCI/32 20MHz 16Bit 16 2 3 4 5 aic7896 20 PCI/32 40MHz 16Bit 16 2 3 4 5 6 7 aic7897 20 PCI/64 40MHz 16Bit 16 2 3 4 5 6 7

1.  多重ツインチャネルデバイス - 1 つのコントローラが 2 つのバスを提供します。
2.  多機能ツインチャネルデバイス - 1 つのチップに 2 つのコントローラが存在します。
3.  コマンドチャネルのセカンダリ DMA エンジン - スキャッタギャザリストと SCB の先読みを許します。
4.  64 バイト SCB サポート - 余計な DMA を排除するために SCSI CDB が SCB に組み込まれています。
5.  ブロック移動命令サポート - 特定のシーケンサ操作のスピードを倍にします。
6.  ‘Bayonet’ スタイルのスキャッタギャザエンジン - S/G 先読みの性能を改善します。
7.  キューイングレジスタ - シーケンサを停止させずに新たなトランザクションをキューイングできます。

SCSI コントロールブロック (SCB)
SCSI バス上のデバイスに送られるトランザクションは、それぞれ 1 つの ‘SCSI コントロールブロック’ (SCB) に割り当てられます。 SCB はコントローラがトランザクションを処理するのに必要な全ての 情報を持っています。 (上の) チップの機能の表には、チップ上のメモリに格納できる SCB 数が挙げられています。 モデルナンバが 7870 以上の全てのチップは、 外部 SRAM によってチップ上の SCB 空間を、最大で 255 SCB まで増加可能です。 Adaptec のコントローラで外部 SRAM を持っているものはほとんどありません。 外部 SRAM が利用できない場合には SCB は限りある資源であり、 率直 (馬鹿正直) な方法で使うと、 同時に処理中にできるトランザクション数は、SCB 数までです。 これでは SCSI バスやデバイスをフルに活用するのに十分な余裕がありません。 この問題を解決するのは SCB ページング というメモリのページングと同様の考え方です。 SCB ページングは、デバイスが普段は長い時間コントローラと会話せず、 SCSI バスとの接続をディスコネクト (切断) しているという事実を利用しています。 ディスコネクトしているトランザクションの SCB は、 コントローラにとっては転送が再開した時にだけ役に立ちます。 コントローラが実行すべき別のトランザクションをホストがキューイングした時、 コントローラのファームウェアは、未使用の SCB があればそれを使います。 ない場合、ディスコネクトされてから一番時間が経っていない (それゆえ最も長くディスコネクトされたままであろう) SCB の状態を DMA を経由してホストのメモリに保存し、 コントローラの SCB を再利用して新しいトランザクションを始めます。 これによりコントローラは SCB 空間の大きさによらず 最大 255 のトランザクションをキューイング可能です。 コントローラの SCB 空間がディスコネクトされているトランザクションの キャッシュとして機能するため、利用できる SCB 空間が大きければ大きいほど、 SCB のデータを保存したり復元したりするために使われるホストのバスの 流量が少なくなります。

バグ
ある Quantum のドライブ (少なくとも Empire 2100 と 1080s) は、 AIC7870 Rev B の 10MHz の同期モードでは使えません。 この問題があるコントローラは 42MHz の水晶発振子を持っていて、 10MHz よりちょっと高い周波数で動作します。 このためドライブに支障をきたしバスがハングアップします。 SCSI-Select ユーティリティで最大同期ネゴシエーション速度を 8MHz に設定すれば 普通に使えるようになります。

関連項目
aha(4), ahb(4), cd(4), scsi(4), da(4), sa(4)

作者
ahc ドライバ、 AIC7xxx シーケンサコードアセンブラ、 そして aic7xxx チップで動作するファームウェアは Justin T. Gibbs が書きました。

歴史
ahc ドライバは FreeBSD 2.0 から登場しました。