(57)【特許請求の範囲】
【請求項１】
コンピュータを大容量記憶デバイスにインターフェースする大容量記憶デバイス・コントローラであって、
大容量記憶バッファ・メモリ・インターフェースと；
プロセッサと；
第１ポートを使用して先入れ先出し法で前記大容量記憶バッファ・メモリ・インターフェースからデータを受信するように結合されるべく形成されたダイレクト・メモリ・アクセス転送を使用してロード可能な第１メモリ回路と；
を具備し、
前記第１メモリ回路のデータ記憶領域は、先入れ先出し法で前記データを受信し、かつ、第２ポートを使用してランダム・アクセス・メモリとして前記プロセッサによってデータの読出しアクセスおよび書込みアクセスが可能な大容量記憶デバイス・コントローラ。
【請求項２】
前記第１メモリ回路に結合された第２メモリ回路であって、ランダム・アクセス・メモリとして形成されている第２メモリ回路と；
前記第２メモリ回路に結合されたファイバー・チャネル・インターフェースであって、前記第２メモリ回路が前記ファイバー・チャネル・インターフェースからファイバー・チャネル制御ブロックを受信するように形成されているファイバー・チャネル・インターフェースと；
前記プロセッサ、前記第１メモリ回路、および前記第２メモリ回路に結合されたステート・マシンであって、前記プロセッサから命令を受信し、これに応答して、前記第２メモリ回路と前記第１メモリ回路間に前記ファイバー・チャネル制御ブロックを転送するように形成されているステート・マシンと；
をさらに含む請求項１に記載の大容量記憶デバイス・コントローラ。
【請求項３】
前記第２メモリ回路は、ファイバー・チャネルが伝送したフレームを記憶する
請求項２に記載の大容量記憶デバイス・コントローラ。
【請求項４】
大容量記憶デバイスをＩ／Ｏバスを介してコンピュータにインターフェースするための大容量記憶デバイス・コントローラであって、
前記大容量記憶デバイスからデータを受信し、また前記Ｉ／Ｏバスからデータを受信するように形成されたバッファ・メモリと；
プロセッサと；
前記バッファ・メモリと前記プロセッサに結合されたメモリ回路であって、前記メモリ回路と前記バッファ・メモリ間のデータの少なくとも第１転送中、先入れ先出しメモリとして動作するように形成され、前記メモリ回路の記憶領域は、先入れ先出し法で前記データを受信し、かつ、前記メモリ回路と前記プロセッサ間のデータの少なくとも第１転送中、前記プロセッサによるデータの読出しアクセスおよび書込みアクセスが可能なランダム・アクセス・メモリとして動作するように形成されたメモリ回路と；
を具備する大容量記憶デバイス・コントローラ。
【請求項５】
メモリ回路がフルのときに、前記転送の少なくとも一つが休止する請求項４に記載の大容量記憶デバイス・コントローラ。
【請求項６】
前記メモリ回路がデータを前記バッファ・メモリにバースト転送するように形成されている請求項４または５に記載の大容量記憶デバイス・コントローラ。
【請求項７】
前記メモリ回路がオーバーフロー状態になるまで、前記メモリ回路にはデータが転送され、一方でデータが前記メモリ回路から前記バッファ・メモリにデータがバースト転送される請求項４から６のいずれかに記載の大容量記憶デバイス・コントローラ。
【請求項８】
前記メモリ回路が複数のディスク・ドライブ・コントローラ・レジスタ・ファイルに結合されている請求項４から７のいずれかに記載の大容量記憶デバイス・コントローラ。
【請求項９】
前記メモリ回路が、転送サイズを前記メモリ回路のサイズよりも大きく指定する転送命令を受容するように形成されている請求項４から８のいずれかに記載の大容量記憶デバイス・コントローラ。
【請求項１０】
ファイバー・チャネル・インターフェースにより、前記コンピュータにインターフェースする請求項４から９のいずれかに記載の大容量記憶デバイス・コントローラ。
【請求項１１】
前記プロセッサ、前記バッファ・メモリおよび前記メモリ回路に結合されたステート・マシンをさらに含み、前記ステート・マシンがファイバー・チャネル制御ブロックを前記バッファ・メモリから前記メモリ回路に転送するとともに、エラー検出コードをチェックする請求項４から１０のいずれかに記載の大容量記憶デバイス・コントローラ。
【請求項１２】
前記大容量記憶デバイスが磁気ディスク・ドライブである請求項４から１１のいずれかに記載の大容量記憶デバイス・コントローラ。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
（技術分野）
本発明は概してディスク・コントローラ、より詳しくはマルチポート・メモリ・アーキテクチャを有するディスク・コントローラに関する。
【０００２】
【従来の技術】
（背景技術）
従来のコンピュータ・システムは一般的にいくつもの機能ユニットを含んでいる。これらの機能ユニットは中央処理ユニット（ＣＰＵ）、メイン・メモリ、Ｉ／Ｏデバイスおよび磁気ディスク・ドライブを含んでいる。従来のシステムにおいて、メイン・メモリは、システム・バスまたはローカル・メモリ・バスを介してＣＰＵに強力に結合（接続）されている。このメイン・メモリは、ＣＰＵに対して、実行時間でメイン・メモリに記憶されたデータまたはプログラム情報への迅速なアクセスを提供する。一般的に、メイン・メモリはランダム・アクセス・メモリ（ＲＡＭ）回路で構成される。ＣＰＵとメイン・メモリの組み合わせを含むコンピュータ・システムは、しばしばホスト・システムと呼ばれる。
【０００３】
メイン・メモリは一般的に磁気ディスク・ドライブよりも小さい。メイン・メモリは普通揮発性であり、一方磁気ディスク・ドライブは不揮発性である。従って、プログラミング・データ情報はしばしば磁気ディスク・ドライブに記憶され、必要に応じてメイン・メモリに読み取られる。ＣＰＵと接近して結合されたメイン・メモリとは逆に、磁気ディスク・ドライブは普通ＣＰＵにより遠くに結合されている。磁気ディスク・ドライブがＣＰＵにより遠くに結合されているので、磁気ディスク・ドライブへのアクセスは一般的に遅く、またメイン・メモリへのアクセスよりもより複雑である。ディスク・コントローラは一般的にホスト・システムを磁気ディスク・ドライブに結合させるとともに、磁気ディスク・ドライブのホスト・システムとのインターフェースの複雑な詳細(detail)を処理する。ホスト・システムとディスク・コントローラ間の通信は普通、多様な標準Ｉ／Ｏバス・インターフェースの一つを使用して提供される。
【０００４】
磁気ハードディスク・ドライブ・アセンブリは普通、一つまたはそれ以上の磁気ディスクで構成されている。各ディスクは一般的に多数の同心円リングないしトラックを有しており、これにデータが記憶される。トラック自体は、最も小さいアクセス可能なデータ・ユニットであるセクターにさらに分割される。セクターは適切なトラックの上方に磁気ヘッドが配置されることによってアクセスされる。トラックの第１セクターは一般的にインデックス・パルスによって識別される。各々の別のトラックのセクターのスタートは、セクター・パルスで識別される。所望のセクターがヘッドの下方に回転されるまでドライブが待機し、データが読取りまたは書込みを実行する。データが一度に１ビットで、連続してアクセスされる。普通、ディスク・ドライブ中の各ディスクは、それ自身の読取／書込ヘッドを有している。
【０００５】
ディスク・ドライブは、ディスク・コントローラに接続される。ディスク・コントローラは数々の機能を実行し、例えば、デジタルデータのアナログヘッド信号への変換、アナログヘッド信号のデジタルデータへの変換、ディスク・フォーマッティング、エラーチェック、論理−物理アドレスのマッピング、データ・バッファリングである。例えば、ディスク・ドライブは、一般的にドライブからのデータをフォーマットする。ドライブからのデータは、シリアルに配列されており、ディスク・コントローラは、シリアルデータをパラレル配列に変換する。
【０００６】
データ・バッファ機能が、ホストと大容量記憶メモリ間のデータ伝送に使用される。ディスク・ドライブがホストからデータを供給ないし受け入れることのできる速度が、ホストがデータを同様に読取りないし供給する速度と異なるので、データ・バッファリングが必要とされる。従って、ディスク・コントローラは従来通りハード・ドライブに読取り、書込みされるデータを一時的に記憶し、接続されたＩ／Ｏバスの速度にデータを同期させるバッファ・メモリを含んでいる。従って、バッファは、データがドライブとホスト間で交換されるレートと、データがドライブに書込み、読取りされるレートとをデカップル(decouple)する。バッファ機能は、各セクターが全体として読取り、または書込みされるので特に必要である。
【０００７】
Ｉ／Ｏバスとディスク・ドライブ両方にアクセスを提供することに加えて、バッファ・メモリはディスク・コントローラのローカル・プロセッサによってしばしばアクセスされる。従って、ディスク・コントローラ・バッファ・メモリはディスク・コントローラの多数の機能部によって、またホストによってアクセスされる。従来のシステムにおいて、バッファ・メモリへのアクセスの競争は、ディスク・ドライブとホスト間だけでなく、しばしばバッファ・メモリと機能ユニット間のデータ伝送レートを大きく制限するボトルネックとなる。
【０００８】
従来のディスク・コントローラに見られる別の機能的なボトルネックは、ローカル・プロセッサである。ローカル・プロセッサは一般的に、全体としてディスク・コントローラの管理だけでなく、Ｉ／Ｏバス・インターフェース回路、バッファ・メモリ、ディスク・フォーマッタを管理する。さらに、従来のシステムはローカル・プロセッサを必要とし、データ伝送を低レベルでバッファ・メモリを介して管理する。一般的な汎用プロセッサは、効率的な方法でこのようなアプリケーション特定機能を処理するのに不適である。
【０００９】
加うるに、従来のディスク・コントローラはそのプロセッサを十分に利用していない。例えば、ディスクからＩ／Ｏバスへの伝送データが一つまたはそれ以上のディスク・コントローラ・プロセッサを使用している間、伝送がデータを供給するディスク能力に勝っておれば、ディスクが追い付くまでプロセッサは無駄に休止させられていることになる。
【００１０】
【課題を解決するための手段】
（発明の開示）
本発明は概して大容量記憶デバイスへの書込み、またはこれから読取られるデータをバッファし、アクセスする効果的、かつ、融通性のある方法およびシステムに関する。
【００１１】
一実施例において、ディスク・コントローラは大容量記憶デバイスとＩ／Ｏバス間で伝送されるデータをバッファするのに使用されるデータ・バッファを含んでいる。別の実施例において、データ・バッファはマルチポート・メモリを含んでいる。このマルチポート・メモリは、一つまたはそれ以上のプロセッサだけでなく、例として、ディスク・チャネルおよびＩ／Ｏチャネルのような複数のチャネルに結合（接続）されている。
【００１２】
一実施例において、マルチポート・メモリはランダム・アクセス・メモリと先入れ先出し（ＦＩＦＯ）メモリ両方として使用されている。従って、先入れ先出しメモリとして使用されるときは、マルチポート・メモリはディスク・チャネルとＩ／Ｏチャネル間のデータをバッファするのに使用される。マルチポート・メモリはコンテキスト切り替えのために使用され、ここで一つまたはそれ以上のプロセッサからのレジスタ・データがメモリの内外でスワップされる。本発明の一実施例によって提供される効果的なレジスタ・スワッピングが、プロセッサが好都合にタスク間の迅速な切り替えをすることを許容する。これは第１タスクが待機状態にあれば非常に有利である。なぜなら、プロセッサ時間を浪費するよりはむしろ、待機状態のための待機の間の休止を終了させ、プロセッサが別のタスクに迅速に切り替え、待機状態が第１タスクの終了後、第１タスクにスイッチバックするからである。
【００１３】
さらに、一実施例において、ランダム・アクセス機構がマルチポート・メモリに記憶された選択データを迅速に検索する。例えば、メモリがファイバー・チャネル・フレームおよび関連するＣＲＣデータを記憶するように使用されれば、ＣＲＣデータが、全フレームを読み取る必要なしに、直ちに検索することができる。
【００１４】
一実施例において、マルチポート・メモリはＤＭＡ（ダイレクト・メモリ・アクセス）メモリである。一つの例としての実施例において、マルチポート・メモリのポートはランダム・アクセス・ポート、ＦＩＦＯアクセス・ポート、レジスタ・アクセス・ポート、および（または）バッファ・コントローラＤＭＡポートを含んでいる。ランダム・アクセス・ポートはマイクロプロセッサ・インターフェース・バスに結合され、次にこれが、ＦＩＦＯアクセス・ポートだけでなく、マイクロプロセッサとマイクロコントローラのような一つまたはそれ以上のプロセッサに結合されている。レジスタ・アクセス・ポートもマイクロコントローラのような一つまたはそれ以上のプロセッサに結合されている。バッファ・コントローラＤＭＡポートがＣＲＣ（巡回冗長コード）チェッカーと、バッファ・メモリに結合されている。
【００１５】
一実施例において、マルチポート・メモリは６４バイトからなり、またファイバー・チャネル・プロトコル命令全体を保有することができる。さらに、マルチポート・メモリに関連するステート・マシンがいくつもの命令を実行することができる。別の実施例において、一つまたはそれ以上の命令がＩ／Ｏパケットないしフレームを効果的に管理するように構成されている。なおも別の実施例において、ステート・マシン命令が、次に示す命令の一つまたはそれ以上を含んでいる。すなわち、フェッチ・カレントＦＣＰ（ファイバー・チャネル・プロトコル）命令、アップデート・カレントＦＣＰポインタ命令、ロードＦＩＦＯ命令、アンロードＦＩＦＯ命令、ＣＲＣを伴うロードＦＩＦＯ、ＣＲＣを伴うアンロードＦＩＦＯ、バッファ・メモリへの書込命令、およびバッファ・メモリからの読取命令である。一実施例において、命令はマイクロプロセッサまたはマイクロコントローラからのさらなる介入なしに全ファイバー・チャネル命令をＦＩＦＯに伝送せしめることで提供される。一実施例はダイレクト・フレーム・アクセスをファイバー・チャネル・フレームに提供する。別の実施例において、命令は停止および（または）休止されることもある。
【００１６】
【発明の実施の形態】
（好ましい実施例の詳細な説明）
本発明は概して大容量記憶デバイスへの書込み、またはこれから読取られるデータをバッファリングする効果的、かつ、融通性のある方法およびシステムに関する。
【００１７】
図１に示したように、電子システム１００の一実施例において、ディスク・コントローラ１０２がホスト・システム１０４を、ディスク・ポート１３６を介して例えば磁気ディスク・ドライブまたは光ディスク・ドライブのような大容量記憶デバイス１０６にインターフェースするのに使用される。図示ディスク・コントローラ１０２はマイクロプロセッサ１０８、埋込コントローラ１１０、バッファ・メモリ１１２および外部ＤＭＡ（ダイレクト・メモリ・アクセス）デバイス１１４を含んでいる。ディスク・コントローラが、デュアル・ループを有しているファイバ・チャネル・バスのようなＩ／Ｏバス１１６を介してホスト・システム１０４に結合（接続）されている。埋込コントローラ１１０は、マイクロプロセッサ１０８に結合されたマイクロプロセッサ・インターフェース１１８を含んでいる。マイクロプロセッサ・バス１３０がマイクロプロセッサ・インターフェース・ロジック１１８を外部ＤＭＡインターフェース１３４、マイクロコントローラ１２０、バッファ・コントローラ１２２および埋込コントローラ１１０内に配備されたファイバー・チャネル・インターフェース１２４に結合させている。次に、外部ＤＭＡインターフェース１３４が外部ＤＭＡデバイス１３４に、またバッファ・コントローラ１２２に結合されている。バッファ・コントローラ１２２は、バッファ・メモリ１１２とファイバー・チャネル・インターフェース１２４にも結合されている。ファイバー・チャネル・インターフェース１２４は、インターフェース１２４内のファイバー・チャネル送受信回路を介してファイバー・チャネル・ループ１１６に結合されている。ファイバー・チャネル・ループ１１６は一つまたはそれ以上のホスト１０４にも結合されている。ファイバー・チャネル・インターフェース１２４はファイバー・チャネル・プロトコルとＳＣＳＩプロトコル両方と通信するように使用することができる。
【００１８】
データ・フロー・コントローラ１２６が、外部ＤＭＡインターフェース１３４、バッファ・コントローラ１２２およびファイバー・チャネル・インターフェース１２４に結合されている。ＥＣＣエンジン・モジュール１３２が、データ・バス１２６を介してディスク・フォーマッタ１２８、バッファ・コントローラ１２２およびファイバー・チャネル・インターフェース１２４に結合されている。
【００１９】
ファイバー・チャネル・インターフェース１２４がファイバー・チャネル・プロトコルを実行する。一実施例において、ファイバー・チャネル・インターフェース１２４は、ファイバー・チャネル信号送信インターフェースのＦＣ−１およびＦＣ−２層を含むＦＣ−ＡＬ（ファイバー・チャネル調停ループ）プロトコルを実行する。ファイバー・チャネル・インターフェース１２４は、エンコーダとデコーダとクロック・スキュー・マネジメントのためのフレーム・バッファとファイバー・チャネル・プロトコル・ハンドラー・マシンを含む。ファイバー・チャネル・インターフェース１２４は、ファイバー・チャネル・ループから受信されたデータ列を承認し、フレーム・バッファ内の適切なエリアにルートする。ファイバー・チャネル・インターフェース１２４の伝送経路が、フレーム・バッファからファイバー・チャネルにフレームを伝送する。ファイバー・チャネル・インターフェース１２４はフレーム・デリミタとフレーム・コントロールを自動的に処理する。
【００２０】
一実施例において、ディスク・フォーマッタ１２８がインターフェースをディスク１０６に提供する。ディスク・フォーマッタ１２８は、ローカル・プロセッサ１０８から制御情報とパラメータを受信する。次に、ディスク・フォーマッタ１０８が要請アクションを実行する。マイクロプロセッサも、ディスク・ヘッドのサーボ・コントロールのための信号処理と、ファイバー・チャネルによってデータを通信するのに使用されるＳＣＳＩプロトコル管理のような他のタスクを処理する。マイクロコントローラ１２０は、ファイバー・チャネル伝送管理タスクのような低レベル・タスクを含む他のタスクを実行するのに使用され、これによってプロセッサ１０８がオフロード（アンロード）される。従って、一実施例において、コントローラ・ワークロードが、より効果的なタスク実行を許容するマルチプル・プロセッサ内で好都合に分割される。
【００２１】
一実施例において、マイクロプロセッサ１２０は、８ビット・マシンであり、８ビットかまたは１６ビットＤＭＡ伝送のいずれかを支持することができる。さらに、マイクロコントローラ１２０はレジスタと、数学的演算のために使用されるアキュムレータを含む内部ＡＬＵを有している。
【００２２】
一実施例において、バッファ・コントローラ１２２は同期ＤＲＡＭ（ＳＤＲＡＭ）コントローラと一体化されたマルチプル・チャネルＤＭＡコントローラである。別の実施例において、バッファ・コントローラ１２２は４メガバイトまでのバッファ・サイズを支持する。しかし、なおさらに別の実施例において、４メガバイトより大きいかまたは小さいサイズも同様に支持される。バッファ・コントローラ１２２が高速バッファ・メモリ１１２の初期化と検証（ベリファイ）も提供し、また、初期化時に電力を低減させる。バッファ・コントローラ１２２はバッファ・メモリ１１２の制御も提供し、一実施例において、同期ＤＲＡＭ（ＳＤＲＡＭ）を使用して実行される。しかし、非同期ＲＡＭまたはスタティックＲＡＭのような他のメモリ・アーキテクチャも同様に使用できる。
【００２３】
バッファ管理は４チャネル、高速、バースティングＤＭＡコントローラによって提供される。バッファ・コントローラ１２２は、多様なモジュールとインターフェース間のインターフェースを提供する。例を挙げると、バッファないしホールディング・メモリ１１２、ディスク・チャネル、ＥＣＣチャネル、ファイバー・チャネル、マイクロプロセッサ１０８およびマイクロコントローラ１２０を含む。バッファ・コントローラ１２２は、ＳＤＲＡＭバッファ・メモリ１１２に出入りするデータの移動を調整し、バッファする。各ＤＭＡチャネルがデータのマルチプル・ブロックのＤＭＡバーストを支持し、高帯域伝送を許容する。各ＤＭＡチャネルが、関連するコントロール、コンフィギュレーションおよびバッファ・メモリ・アドレス・レジスタを有している。一実施例において、バッファ・メモリ１１２はアクセス・ターンないしアクセス期間を備えた他のユニットによって分担されている。期間内で、伝送が完了するか、または関連する期間が経過するまで、所与のデータ・ソースがデータをバーストする。しかし、多数のＤＭＡチャネルが、異なるクロックで稼働するか、またはバッファ・コントローラ１２２の速度とは異なる速度で稼働するモジュールに結合される。これによって、以下に説明するように、ＦＩＦＯ（先入れ先出し）メモリとして構成されたメモリ・ユニットが同期およびバッファ・チャネル・データに使用される。
【００２４】
バッファ・コントローラ１２２がマイクロプロセッサ・アドレス・デコーディング、バッファ・リソースのための優先権アービトレーション、ブロックＣＲＣ（ＢＣＲＣ）チェッキング、および自動ＤＲＡＭリフレッシュ・コントロールも提供する。一実施例において、ＣＲＣカルキュレータ／チェッカがフィードバックを伴うアキュムレータを含んでいる。
【００２５】
データ・フロー・コントローラ１２６が、データ伝送時間を、一実施例においては、ディスク１０６とファイバー・チャネル・ポート間のデータのフローを自動的にモニターし、制御することによって短縮する。これらのチャネル間のデータ・フローの自動制御は、一般的なディスク対ファイバー・チャネル・データ伝送中に発生する多数の割り込みを減じる。さらに、データ・フロー・コントローラ１２６がバッファのオーバーフローとアンダーフロー状態を自動的に阻止する作用をし、一方でバッファがいっぱいになるかまたは空になる前に、ディスク・フォーマッタまたはファイバー・チャネルＤＭＡチャネルを一時的にサスペンドするか、または休止する。
【００２６】
ホスト１０４とディスク１０６間の代表的なデータ・フロー操作について次に説明する。一般的な書込操作は次のように進行する。ホスト１０４がファイバー・チャネル・バス１１６により書込コマンド（命令）をディスク・コントローラ１０２に送る。命令がファイバー・チャネル・インターフェース１２４を通過し、次にバス・コントローラ１２４を介してバッファ・メモリ１１２にロードさされる。ディスク・コントローラへのホスト・パスをチャネル１と呼ぶ。一度、書込命令がバッファ・メモリ１１２に書き込まれると、マイクロプロセッサ１０８がバッファ・メモリ１１２からの命令を読取るとともに、命令書込操作のための準備中にディスク・コントローラ・レジスタを適切に設定する。ディスク・コントローラ・レジスタは、バッファ・コントローラ１２２と関連するレジスタ、ディスク・フォーマッタ１２８およびデータ・フロー・コントローラ１２６を含んでいる。一度、セットアップが完了し、ディスク・コントローラ１０２が既に書込データを受信したことをマイクロプロセッサ１０８がホスト１０４に通知する。次に、ホスト１０４がバッファ・メモリ１１２へのＤＭＡ（ダイレクト・メモリ・アクセス）伝送を初期化する。バッファ・ロード操作中、ＣＨ１モジュール３１０が、書込データに基づいてＣＲＣを連続して計算する。計算されたＣＲＣが関連する書込データによりバッファ・メモリ１１２に記憶される。データ・フロー・コントローラ１２６が、所与の多数のセクターがバッファ・メモリ１１２に記憶されたときをモニターし、バッファ・メモリ１１２からバッファ・コントローラ１２２を介してディスク・フォーマッタ１２８への転送およびここからの転送が初期化され、ディスク・フォーマッタ１２８がデータを書込チャネルを介してディスク１０６に書き込む。データがバッファ・メモリ１１２から読み取られ、ディスク１０６に書き込まれると、関連するＥＣＣコードが計算され、セクター・データの最後に付け加えられる。書込操作が完了すると、マイクロプロセッサ１０８が割り込みを発生し、これがファイバー・チャネル・インターフェースによってホスト１０４に転送され、これによってホスト１０４が書込操作の完了を通知する。
【００２７】
読取操作が書込操作と同様の形態で、しかしこれとは逆に実行される。ホスト１０４が読取命令をディスク・コントローラ１０２に送り、次に読取命令をバッファ・メモリ１１２に記憶させる。こうしてマイクロプロセッサ１０８がバッファ・メモリ１１２からの命令を読取り、ディスク・コントローラ１０２の種々の機能ブロックを初期化して読取りを実行する。データがディスク１０６から読み取られ、ディスク・フォーマッタ１２８を介してバッファ・コントローラ１２２に通され、またバッファ・コントローラ１２２からバッファ・メモリ１１２に通される。データ及び関連するＣＲＣの両方が一緒にバッファ・メモリ１１２に記憶される。ＥＣＣモジュール１３２がデータ転送をモニタし、このデータ記憶操作を通してＥＣＣコードを計算する。ＥＣＣ計算の完了時に、ＥＣＣモジュール１３２が、読取データ中に発生したエラーとバッファ・メモリ内のこれらのエラーを適切に修正することを決定する。ＣＨ１モジュール３１０がバッファ・メモリ１１２からデータを読取り、次にバッファ・メモリ１１２からの結果として記憶されたセクターのＣＲＣをチェックし、エラーが全くないことを保証する。一度、データ中に、エラーが全く残っていないことが決定されると、データはバッファ・メモリ１１２からバッファ・コントローラ１２２を介してまたホスト・バスから転送される。ＣＲＣコードが、このプロセスにおいて排除され、これによってデータのみがホスト１０４に送られる。
【００２８】
図２はバッファ・コントローラへのインターフェースの一実施例を示す。バッファ・コントローラは、マイクロプロセッサ・インターフェース２０２、マイクロコントローラ・インターフェース２０４、ＥＣＣインターフェース２０６、ディスク・フォーマッタ・インターフェース２０８、ホスト・インターフェース２１２、およびＳＤＲＡＭバッファ・メモリ・インターフェース２１０に結合されている。バッファ・コントローラは対応するＦＩＦＯを利用して種々のインターフェース間で転送されるデータをバッファする。
【００２９】
図３はバッファ・コントローラ１２２の一実施例をより詳細に示した図である。バッファ・コントローラ１２２は、４個のポートを備えたＦＩＦＯとして構成可能なメモリ・ユニット３０２を含んでいる。例えば、ＭＰ  ＦＩＦＯ３０２はランダムまたはダイレクト・アクセス・インターフェース、ＦＩＦＯまたはインダイレクト・アクセス・インターフェース、レジスタ・アクセス・インターフェース、およびバッファ・コントローラＤＭＡインターフェースを有している。ＦＩＦＯ３０２は多数のクライアントと他のデバイスによってアクセスされ、また交換局 (スイッチング・ステーション）として作用し、データが一つの場所から他の場所にルートされている間、一時的に記憶する。図示実施例において、ＤＭＡインターフェースはバッファ・メモリ１１２へのアクセスを提供するように使用される。レジスタ・アクセス・インターフェースは、その内のＦＩＦＯの全てまたは一部がマイクロプロセッサによって内部レジスタ・ファイルとしてローカル的にアドレス可能であり、いくつかのアクセス経路の一つをマイクロコントローラ１２０へ提供する。インダイレクト・アクセス・インターフェースは、その内のＦＩＦＯの全てまたは一部がＦＩＦＯポインタを使用してアドレス可能であり、ここでも別のアクセス経路を提供する。ダイレクト・アクセス・インターフェースは、その内のＦＩＦＯの全てまたは一部がランダム・アクセス・メモリとしてアドレス可能であり、またメモリマップされ、なおも別のアクセス経路を提供する。
【００３０】
一実施例において、ＦＩＦＯ３０２の全てまたは一部が、マイクロプロセッサ１０８および（または）マイクロコントローラ１２０のような一つまたはそれ以上のプロセッサのアドレス・スペース内にある。別の実施例において、ＦＩＦＯ３０２は多少のポートを有している。多数のタイプのＦＩＦＯアクセス・ポートを設けることにより、柔軟性、有効性およびＦＩＦＯ３０２を通るデータ転送量が大きく高められる。ＦＩＦＯ３０２はさらにディスク・フォーマット・テーブル、データ、プログラム・コード、およびＦＩＦＯ３０２内に、またはバッファ・メモリ１１２内に記憶されたファイバー・チャネル命令ブロックにアクセスするマイクロプロセッサ１０８を提供する。例えば、ＦＩＦＯ３０２はバッファ・メモリ１１２内に記憶されたプログラムをオーバーレイするのに使用できる。従って、ＦＩＦＯ３０２はＭＰ（マイクロプロセッサ）ＦＩＦＯまたはＭＰ  ＤＭＡ  ＦＩＦＯとも呼ばれる。
【００３１】
一実施例において、ＭＰ  ＦＩＦＯ３０２は６４バイトの記憶容量を含んでいる。以下に説明するように、これが好都合に十分な記憶容量のメモリを提供し、完全なファイバー・チャネル命令と、関連するＣＲＣとバッファ長さフィールドを保持する。ファイバー・チャネル命令のフォーマットを図７に示す。ＦＩＦＯ３０２はバッファ・メモリ１１２へのデータ、またこれからのデータをバーストするのに使用できる。従って、データ転送待機時間が大きく短縮される。ランダム・アクセス・ポートが、マイクロプロセッサ・バスおよびマイクロコントローラ・バス１３０を介してアクセスできる。これらはマイクロプロセッサ１０８とマイクロコントローラ１２０にそれぞれ接続されている。さらに、マイクロコントローラ１２０がレジスタ・アクセス・ポートを介してＭＰ  ＦＩＦＯ３０２にアクセスできる。バッファ・コントローラＤＭＡポートがＣＲＣチェッカとジェネレータにだけでなく、ＳＤＲＡＭバッファ・メモリ１１２にもインターフェースを提供する。種々のバッファ・コントローラ機能ブロックないしモジュールが内部バッファ・コントローラ・データ・バスによって相互結合されている。従って、一実施例において、ＦＩＦＯ３０２はランダム・アクセス・メモリとしてダイレクト・アドレスすることによりアクセスできる。さらに、ＭＰ  ＦＩＦＯ３０２は、ＦＩＦＯアクセス・レジスタないしポートを介してＦＩＦＯ３０２にロードおよびアンロードし、またこれからロードし、アンロードして先入れ先出しメモリとしてアクセスすることができる。
【００３２】
図４はマルチ・アクセス・チャネルを伴うＭＰ  ＦＩＦＯ３０２のより詳細な一実施例を示す。一実施例において、ＭＰ  ＦＩＦＯ３０２は１６ｘ３２アレイ４０２内で組織化された６４バイトまで記憶する。従って、ＦＩＦＯアレイ４０２は１６個の３２ビットワードをホールドできる。一実施例において、ＦＩＦＯアレイ４０２はデュアル・ポート非同期スタティックＲＡＭ素子を使用して実行される。二つのＲＡＭポートの一つが読取ポートであり、他のＲＡＭポートが書込ポートである。読取ポートおよび書込ポートは各々別々に、かつ、独立して制御される。読取ポートおよび書込ポートは一つまたはそれ以上のインターフェースまたはアクセス・ポートを介してアクセスすることができる。一実施例において、ＦＩＦＯアレイ４０２は、内部レジスタ・ファイルとして、マイクロコントローラ１２０のような一つまたはそれ以上のプロセッサにアクセス可能である。従って、ＦＩＦＯアレイ４０２は少ない時間で、ないし管理オーバーヘッドでマイクロコントローラ１２０によって迅速にアクセスすることができる。これは外部メモリからのもっと遅くアクセスする従来のディスク・コントローラとを対比したものである。
【００３３】
図４に示したように、一実施例において、ＭＰ  ＦＩＦＯ３０２はバッファ・メモリ転送アドレス・レジスタ４０４、バッファ・メモリ転送カウンタ４０６、ＭＰ  ＦＩＦＯ命令レジスタ４０８、ＦＩＦＯ書込ポインタ４１０、ＦＩＦＯ読取ポインタ４１２、ＦＩＦＯ利用カウンタ４１４、ＦＩＦＯアクセス・レジスタ４１６、ＦＣＰ命令フェッチ・アドレス・レジスタ４２０、４２２、およびステート・マシン４１８を含んでいる。上述したレジスタおよびカウンタはデータのＭＰ  ＦＩＦＯ３０２への転送およびこれからのデータの転送を制御するのに使用される。ＦＩＦＯアレイ４０２は内部マイクロコントローラ・レジスタ・ファイルに直接メモリマップされる。一実施例において、レジスタ、カウンタ、およびＦＩＦＯアレイ４０２は、マイクロプロセッサ１０８および（または）マイクロコントローラ１２０によってランダム・アクセス・メモリとしてアクセス可能である。次に説明するように、ファイバー・フレームへのアクセスが非常に融通性があり、またランダムＦＩＦＯロケーションに配置された関連するＣＲＣデータをロケーティングすることが提供される。
【００３４】
一実施例において、セマフォが、ＦＩＦＯリソースにアクセスを試みて、マイクロプロセッサ１０８およびマイクロコントローラ１２０のようなマルチ・デバイス間の矛盾（不一致）を回避するのに使用される。従って、一実施例において、レジスタがセマフォ・グラント・ビットを記憶するのに使用される。ポインタ、カウンタ、アクセス・レジスタ等々のようなＦＩＦＯ３０２を使用すること、またはＦＩＦＯ情報を修正することに使用する試みをする前に、リクエスト・デバイスが最初にセマフォを獲得することを試みる。
【００３５】
ＭＰ  ＦＩＦＯ命令レジスタ４０８が、バッファ・メモリ１１２からＭＰ  ＦＩＦＯ３０２への転送、またはＭＰ  ＦＩＦＯ３０２からバッファ・メモリ１１２への転送を初期化するのに使用される。多様なＦＩＦＯ命令がＦＩＦＯ３０２とバッファ・メモリ１１２間のデータ転送を制御するのに使用される。転送命令は、普通、四つのグループに分類することができる。これらの命令グループにはロード／アンロード命令、読取／書込命令、制御命令、および自動化命令が含まれる。命令のいくつかはファイバー・チャネル・フレームにダイレクト・フレーム・アクセスができる。ロード／アンロード・データ転送命令は、先入れ先出しメモリとしてＦＩＦＯ３０２を処理する。ロード／アンロード・データ転送命令は、ＭＰ  ＦＩＦＯ書込ポインタ４１０、ＭＰ  ＦＩＦＯ読取ポインタ４１２、およびＭＰ  ＦＩＦＯ利用カウンタ４１４を使用してＦＩＦＯ３０２のロードおよび（または）アンロードを実行する。一実施例において、一つまたはそれ以上の転送命令がＦＩＦＯサイズより大きい転送を処理するように構成される。
【００３６】
読取／書込データ転送命令が、ランダム・アクセス・メモリのようにＦＩＦＯを処理する。一実施例において、読取／書込命令がＦＩＦＯ３０２内のロケーション・ゼロでスタートするデータを読取り、書込みする。別の実施例において、データ転送が他のＦＩＦＯメモリ・アドレスで開始する。
【００３７】
クリアＦＩＦＯ命令のような制御命令が、関連するカウンタとレジスタをクリアすることによってＦＩＦＯをクリアするのに使用される。さらに、一つのまたはそれ以上の制御命令が目下進行中の任意の命令を休止または停止するのに使用される。フェッチＦＣＰ命令およびアップデート・カレントＦＣＰコマンドポインタ命令のような自動化命令が、バッファ・メモリ１１２等からのファイバー・チャネル命令フレームのような命令をＦＩＦＯ３０２へのフェッチまたは転送を効率的に自動化する。上述したように、一実施例において、ＦＩＦＯ命令はステート・マシンによって実行される。
【００３８】
ＦＩＦＯ３０２が先入れ先出し方式でアクセスされるときに、ＦＩＦＯ読取／書込ポインタ４１２、４１０が、現在の読取／書込ロケーションのトラックを維持するのにそれぞれ使用される。書込ポインタ４１０が現在のＦＩＦＯ書込操作のロケーションないしアドレスを制御する。書込ポインタ４１０はＦＩＦＯアレイ４０２の開始アドレスに関連するバイト・オフセットを含んでいる。一実施例において、書込ポインタ４１０が、パワオン・リセットのときにまたはＭＰ  ＤＭＡ  ＦＩＦＯリセット命令の受信時にゼロに初期化される。同様にして、読取ポインタ４１２が現在のＦＩＦＯ読取操作のロケーションないしアドレスを制御する。読取ポインタ４１２はＦＩＦＯアレイ４０２の開始アドレスに関連するバイト・オフセットを含んでいる。一実施例において、読取ポインタ４１２がパワオン・リセットのときにまたはＭＰ  ＤＭＡ  ＦＩＦＯリセット命令の受信時にゼロに初期化される。
【００３９】
ＦＩＦＯ利用カウンタ４１４がＦＩＦＯ利用カウントのトラックを維持するのに使用される。例えば、ＦＩＦＯ利用カウンタ４１４は利用されたＦＩＦＯメモリ・ロケーションの量をトラックし、従って、利用されていないＦＩＦＯロケーションの数をトラックする。一実施例において、利用カウンタ４１４がローカル・マイクロプロセッサ１０８および（または）マイクロコントローラ１２０によってレジスタとして読取りまたは書込みされる。読取り可能カウントが、ＦＩＦＯアレイ４０２内に記憶されたバイト数を提供する。一実施例において、バイト数が最も近いワードの境界に丸められる。ＦＩＦＯカウントは、データがＦＩＦＯアレイ４０２から読み取られるにつれて、減少する。従って、一実施例において、アクセス・レジスタ４１６を介する４バイト読取操作が、４バイトの最後が読み取られたときに、４だけカウントを減らす。同様にして、ＦＩＦＯアレイ４０２からの二つの１６ビット・ハーフワードの読取りが、最後の１６ビットのハーフワードが読み取られたときに、ＦＩＦＯアレイ４０２がＦＩＦＯカウントを４だけ減らす。さらに、ＦＩＦＯカウントが、ＦＩＦＯアレイ４０２からの３２ビット・ワードが読み取られたときに、４だけ減らす。アレイ４０２からのデータ読取りはバッファ・メモリ１１２のような別のメモリに記憶される。
【００４０】
ＭＰ  ＦＩＦＯアクセス・レジスタ４１６がマイクロプロセッサ１０８によって使用され、ＦＩＦＯアレイ４０２に対してデータの読取りと書込みがされる。従って、アクセス・レジスタ４１６に書込みされたデータは、次に書込ポインタ４１０によって指示されたＦＩＦＯロケーションに書込みされる。書込ポインタ４１０は一般的に次に述べるような書込みアクセスをインクリメントする。同様にして、データがアクセス・レジスタ４１６を介して読み取られるときに、ＦＩＦＯ読取カウンタがインクリメントされる。一実施例において、バイトの変化する数がアクセス・レジスタ４１６を介して読取り、または書込みされる。従って、例として、１バイトか、または２バイトのいずれかがアクセス・レジスタ４１６を使用する一つの操作で読取り、または書込みされる。ＦＩＦＯアレイ４０２へのＳＤＲＡＭアクセスが次に説明するようにステート・マシン４１８によって提供される。
【００４１】
バッファ・メモリ１１２へのデータの転送、またはこのメモリからの転送のときに、ＭＰ  ＦＩＦＯバッファ・メモリ転送アドレス・レジスタ４０４が使用される。バッファ・メモリ転送アドレス・レジスタ４０４は、転送が実行される前に適切なバッファ・メモリ・アドレスでロードされる。バッファ・メモリ転送カウンタ４０６は、バッファ・メモリ１１２に転送されるバイトの数のトラックを維持するように使用される。転送カウンタ４０６が、バイト数のような転送されるべきデータの数に対応する数にセットする。一実施例において、バイト・カウントは４の倍数である。好都合なことに、バイト・カウントはＦＩＦＯアレイ４０２のサイズを超えることができる。一実施例において、転送カウントは６４Ｋバイトまで転送するようにセットされる。別の実施例において、転送カウント４０６は６４Ｋよりも大きいカウントにセットできる。従って、本発明の一実施例において、ブロック転送はＦＩＦＯサイズに限定されない。ＦＩＦＯアレイ４０２が、データのＦＩＦＯ３０２への転送中、いっぱいになれば、データがＦＩＦＯアレイ４０２から読み取られるまで、転送はサスペンド（待機）される。同様にして、ＦＩＦＯアレイ４０２が転送中、いっぱいになれば、データがＦＩＦＯアレイ４０２にロードされるまで、転送がサスペンドされる。
【００４２】
一実施例において、マイクロプロセッサ１０８またはマイクロコントローラ１２０のようなデバイスは、ＦＩＦＯ命令が実行されている間、ＭＰ  ＦＩＦＯアクセス・レジスタ４１６を介してＦＩＦＯ３０２にアクセスすることができる。従って、例えば、マイクロプロセッサまたはマイクロコントローラが、ＦＩＦＯ３０２がいっぱいになるにつれて、ＦＩＦＯ３０２から読み取ることができる。同様にして、マイクロプロセッサ１０８またはマイクロコントローラ１２０が、ＦＩＦが読取られ、または空になるにつれて、ＦＩＦＯ３０２に書き込むことができる。
【００４３】
先入れ先出しメモリとしてのＭＰ  ＦＩＦＯ３０２の操作につき、ここに説明する。一実施例において、ＦＩＦＯアクセス・レジスタ４１６への書込みはデータをして、書込ポインタにロードされるオフセットに記憶せしめる。書込ポインタが、データがＦＩＦＯアクセス・レジスタ４１６に書き込まれる時間ごとにサーキュラ・ファッション（循環形態）でインクリメントされる。アクセス・レジスタ４１６への書込操作が試行されたときに、ポーズ（休止）信号が発生され、そのときに利用カウンタがＦＩＦＯサイズに等しくカウントする。これが、ＦＩＦＯデータが上書きされないことを保証する。メモリ・ロケーションが利用可能になるまで、ポーズ信号がデバイスをして、マイクロプロセッサ１０８またはマイクロコントローラ１２０のようなＦＩＦＯ３０２に書込みを停止せしめる。メモリ・ロケーションは、アクセス・レジスタからの読取操作の実行によって利用可能になり、これによって利用化カウントをデクリメントする。休止機能がＦＩＦＯサイズよりも大きくなるＦＩＦＯ３０２への、またこれを介してのデータ転送を許容する。ＦＩＦＯ３０２が、書込工程または読取工程中に、いっぱいになるかまたは空になれば、工程は終了するのではなく単に休止される。従って、休止機能は、オーバーフロー状態がデータ転送中に発生しないことを保証する。
【００４４】
さらに、ＦＩＦＯメモリ・ロケーションが、利用化カウンタをクリアないしゼロにするＦＩＦＯクリア命令の実行時に利用可能となる。
【００４５】
ＦＩＦＯアクセス・レジスタ４１６の読取りにより、読取ポインタのオフセットに配置されたデータが読み取られ、読取ポインタを循環態様(circular fashion)にインクリメントせしめる。利用化ワード・カウントが、読取操作が実行される毎に、デクリメントされる。ＦＩＦＯ利用化カウントがゼロのとき、ＦＩＦＯアクセス・レジスタからの読取操作が試行されれば、休止信号が発生される。一つまたはそれ以上のＦＩＦＯメモリ・ロケーションがいっぱいになるか、またはロードされるまで、休止信号がデバイスをして、マイクロプロセッサ１０８、マイクロコントローラ１２０またはＤＭＡチャネルのようなＦＩＦＯ３０２を読み取らせしめる。メモリ・ロケーションがアクセス・レジスタからの書込操作の実行によってロードされ、これによって利用化カウントがインクリメントされる。従って、データ転送中のアンダーフロー状態が発生しないことを、休止機能が保証する。
【００４６】
これまでに説明したように、一実施例において、ＭＰ  ＦＩＦＯアレイ４０２がマイクロプロセッサ１０８またはマイクロコントローラ１２０によって直接的、かつ、ランダムにアクセスされる。ＭＰ  ＦＩＦＯアレイ４０２を形成するのに使用されるスタティックＲＡＭ素子が、６４バイトのランダム・アクセス・メモリとしてＭＰ  ＦＩＦＯ３０２を読取りできるようにする。アレイ４０２がマイクロプロセッサ・アドレス・スペースおよびマイクロコントローラ・アドレス・スペース両方にマップされる。一実施例において、直接アドレス可能ランダム・アクセス・アレイとしてＭＰ  ＦＩＦＯ３０２の読取り、または書込みは、操作の先入れ先出しタイプに関連したＭＰ  ＦＩＦＯレジスタまたはカウンタに影響しない。
【００４７】
ＭＰ  ＦＩＦＯ３０２は、コンテキスト切り替え操作中、マイクロプロセッサまたはマイクロコントローラの内部レジスタ情報を記憶するために使用される。従って、マイクロプロセッサ１０８またはマイクロコントローラ１２０は、ＦＩＦＯアレイ４０２からの、およびこれへのレジスタ・ファイル・データを迅速にスワップすることができる。本発明の一実施例によって提供される有効なレジスタ・スワッピングは、好都合にプロセッサをして迅速な切り替え（スイッチ）タスクを許容する。
【００４８】
コンテキスト・スイチッングがディスク・コントローラ・タスクをより効果的な方式で実行されるようにする。例えば、ディスク１０６からファイバー・チャネル・インターフェース１２４へのデータの転送中に、マイクロコントローラ１２０のような一つまたはそれ以上のディスク・コントローラ・プロセッサが使用されれば、転送がデータを供給するディスク能力を勝ることになり、この期間中ディスク１０６がこれに追いつくまでの無駄な休止よりむしろマイクロコントローラのいくつかの他のタスクの実行する方がより効果的である。例によれば、付加的なディスク・データが発生するのを待機している間、キャッシュ・データを異なるホストに送ることが有利である。従って、本発明の一実施例は、別のタスクを実行中、一つの操作のコンテキストをＦＩＦＯ３０２内で蓄えることを許容する。ＦＩＦＯアレイ４０２がマイクロコントローラ１２０の内部レジスタ・ファイルとしてアクセス可能であるように、コンテキスト・スイッチングが本発明の一実施例で特に迅速に実行される。従って、マイクロコントローラ１２０は、ＦＩＦＯアレイ４０２へ、またはこれからコンテキスト情報を迅速にスワップすることができる。このようにコンテキストは、バッファ・メモリ１１２のような、より遅い二次的メモリ内に記憶されるべきではない。ＦＩＦＯアレイ４０２のサイズとコンテキスト・データ量に依存して、ＦＩＦＯアレイ４０２は同時に多数のコンテキストを記憶するのに使用できる。
【００４９】
コンテキスト情報が、フレーム・カウント、シーケンス・カウント、転送カウント等々のようなタスクのトラックを維持するのに使用される適切な情報を含んでいる。従って、一実施例において、転送が利用可能データを使い果たせば、転送操作はサスペンドされ、操作のコンテキストがＦＩＦＯアレイ４０２に記憶されることになる。キャッシュ・データのサイズに依存して、コンテキストが数回変更される。
【００５０】
記憶されたコンテキストは、多様な技術を使用してリストアされる。例えば、記憶されたコンテキストは、一度付加的なデータが、サスペンドされた転送のために利用可能であれば、リストアされる。リストアされたコンテキストは、もはや必要でなければ、既存のコンテキストに上書きできる。別の方法を使用して、コンテキストはＦＩＦＯアレイ４０２にスワップバックすることができ、また置換されたコンテキストが同時にＦＩＦＯアレイ４０２からスワップされる。
【００５１】
図３を参照して、ＳＤＲＡＭコントローラ３０４とアービタ・モジュール３０６がバッファ・メモリ１１２にアクセスするのに使用される。マルチ・リクエストがアクティブであるとき、アービタ３０６がリクエスターを選択し、アクセス期間を確立する。次に、アービタ３０６が、リクエスターにアクセス・ターンを認める。ＳＤＲＡＭコントローラ３０４が、バッファ・メモリ１１２とバッファ・コントローラ・データ・バス間のデータの移動を処理する。
【００５２】
上述したように、特定命令がＭＰ  ＦＩＦＯ３０２内に記憶されたデータへのアクセスを容易にすることを提供する。一実施例において、ＦＩＦＯステート・マシン４１８が以下の表１にリストした命令を受容し、実行する。
【００５３】
一実施例において、命令が命令レジスタ４００に書き込まれたときに、転送が開始される。ＭＰ  ＤＭＡ  ＦＩＦＯコマンド・アクティブ・ビットがステータス・レジスタ内にセットされ、ＦＩＦＯ命令が実行される工程内にあることを指示する。次の表１は、命令レジスタ４０８のために割り当てられたビットの一実施例を示す。
【００５４】
【表１】
0004741735.tif 000002
表１を参照して、コマンド・レジスタ４０８のビット１５−８がリザーブされる。ＬＢＡ（ロジカル・ブロック・アドレス）フォーマット・ビット（８）がセットされたとき、ＣＲＣハードウエア・アキュムレータがシードとして反転ＬＢＡで初期化される。そうでなければ、ＣＲＣアキュムレータが、一実施例において、全て１であるシード(seed)をちょうど使用する。一実施例において、それ専門のハードウエアＣＲＣアキュムレータの使用が、このタスクでプロセッサをロード・ダウンせずにＣＲＣをして迅速に計算せしめる。
【００５５】
命令レジスタ４０８にロードされた命令が割り込み信号を発生せしめる。一実施例において、命令が完了し、また「インタラプト・ウエン・コンプリート・ビット（７）」がコマンド・レジスタ４０８にセットされたときに、割り込みが発生する。「コマンド・アクティブ・ビット」がステータス・レジスタにセットされ、一方コマンドはなおもアクティブのままである。さらに、命令の完了時に、「コマンド・コンプリート・ビット」が、ステータス・レジスタにセットされる。一実施例において、割り込みがマイクロコントローラ１２０またはマイクロプロセッサ１０８のようなプロセッサに発せられる。受信プロセッサが割り込みをマスクし、別のプロセッサかまたはホスト１０４に割り込みをパスする。
【００５６】
ビット６−４の説明は後述する。下記の表２は、コマンド・レジスタ４０８のビット３−０によって規定された操作を示す。
【００５７】
【表２】
0004741735.tif 000003
「クリアＦＩＦＯ」命令（コマンド）がセット、または、ＦＩＦＯ読取りおよび書込みポインタ４１２、４１０をゼロにクリアする。一実施例において、ＦＩＦＯアレイ４０２のコンテンツは、クリアＦＩＦＯ命令により不変にされる。一実施例において、クリアＦＩＦＯ命令が発せられ、一方他の命令がアクティブになる。
【００５８】
「ストップＦＩＦＯ」命令が、任意のアクティブＦＩＦＯ命令を停止し、ＦＩＦＯステート・マシン４１８をリセットする。一実施例において、「ストップＦＩＦＯ」命令が発せられ、一方他の命令がアクティブになる。一実施例において、ポインタ４１０、４１２およびＦＩＦＯアレイ４０２のコンテンツが「ストップＦＩＦＯ」命令によって不変にされる。
【００５９】
「ロードＦＩＦＯ」命令がデータをバッファ・メモリ１１２からＭＰ  ＦＩＦＯ３０２に転送する。データが、ＭＰ  ＦＩＦＯ書込ポインタ４１０によって規定されたロケーションで開始してＦＩＦＯアレイ４０２にロードされる。転送されるべきバイト数がバッファ・メモリ転送カウンタ４０６にセットされる。転送のためのバッファ・メモリ開始アドレスが、バッファ転送アドレス・レジスタ４０４にセットされる。好都合なことに、転送されるべきバイト数がＦＩＦＯアレイ４０２のサイズを超えることが認められる。従って、転送はいずれの所望のサイズとすることができる。一実施例において、転送カウンタは６４バイトＦＩＦＯアレイのサイズと比較して、４Ｋバイトまでのサイズの転送を管理するように大きさが決められる。しかし、転送カウンタは所望により、より大きいかまたはより小さい転送を処理するように大きさを決めることができる。
【００６０】
一実施例において、４Ｋバイトが一つのロード命令の結果として転送することができる。ＦＩＦＯ３０２がいっぱいで、転送が未完了であれば、「ロードＦＩＦＯ」操作がサスペンドされる。ステータス・レジスタ内にセットされたＭＰ  ＤＭＡ  ＦＩＦＯフル・ビットがセットされ、ＦＩＦＯアレイ４０２がいっぱい (フル) であることを指示する。ＦＩＦＯ３０２が空になり始め、またＭＰ  ＤＭＡ  ＦＩＦＯフル・ビットがクリアされたときに、転送が自動的に再開する。
【００６１】
図８はロードＦＩＦＯ命令操作の一例を示す。ＦＩＦＯアレイ４０２が、「ｘｘ」で示された「ドント・ケア」情報を含んでいると想定される。書込ポインタ（ＷＰ）４１０および読取ポインタ（ＲＰ）４１２が「０」にセットされ、これによってＦＩＦＯアレイ４０２の物理的開始アドレスが指示される。読取ポインタ４１２が書込ポインタ４１０と同じアドレスを指示したときに、ＦＩＦＯアレイ４０２は、利用カウントに依存して、空であるか、いっぱいであるかのいずれかである。どれだけのＦＩＦＯワード・ロケーションが使用されたかを指示するＦＩＦＯワード・カウントが「０」であれば、ＦＩＦＯアレイ４０２が空であることを指示している。バッファ・メモリ転送カウンタ４０６が「３２」でロードされると、３２バイトの指示がバッファ・メモリ１１２からＦＩＦＯアレイ４０２に転送される。明瞭にするために、本例においては、バッファ・メモリ１１２は連続番号でロードされているが、一実施例において、実際のバッファ・メモリ・コンテンツは「ロードＦＩＦＯ」命令の操作に作用しない。
【００６２】
一度「ロードＦＩＦＯ」命令がコマンド・レジスタ４０８によって受信されると、バッファ・メモリ１１２からＦＩＦＯアレイ４０２への３２バイトの転送が生じる。バッファ・メモリ・データが、書込ポインタ４１０によって指示されたロケーション、本例では「０」の開始でＦＩＦＯ３０２に書き込まれる。書込ポインタ４１０は、各バイトが転送され、またＦＩＦＯアレイ４０２にロードされるようにインクリメントされる。この工程は、転送カウントによって特定されたバイト数、本例では３２が転送されまで反復される。図８に示したように、一度「ロードＦＩＦＯ」命令が完了すると、ＦＩＦＯアレイ４０２は転送データを含み、書込ポインタ４１０が３２にインクリメントされ、読取ポインタ４１２が０を維持し、またＦＩＦＯワードが８になる。一実施例において、転送データもバッファ・メモリ１１２内に維持される。
【００６３】
「アンロードＦＩＦＯ」命令がデータをＭＰ  ＦＩＦＯ３０２からバッファ・メモリ１１２に転送する。データが、ＭＰ  ＦＩＦＯ読取ポインタ４１２によって規定されたロケーションの開始でＦＩＦＯアレイ４０２からアンロードされる。転送されるべきバイト数が、バッファ・メモリ転送カウンタ４０６内にセットされる。転送のためのバッファ・メモリ開始方向アドレスが、バッファ転送アドレス・レジスタ４０４内にセットされる。「ロード命令」によるように、転送されるべきバイト数がＦＩＦＯアレイ４０２のサイズを超えるように許可される。ＦＩＦＯ３０２が空であり、転送が未完了であれば、「アンロードＦＩＦＯ」操作がサスペンドされる。ステータス・レジスタ内でクリアされた「ＭＰ  ＤＭＡ  ＦＩＦＯノット・エンンプティ」ビットが、ＦＩＦＯアレイ４０２が空であることを指示するようにセットされる。ＦＩＦＯ３０２がいっぱいになり始め、またＭＰ  ＤＭＡ  ＦＩＦＯノット・エンプティ・ビットがセットされたときに、転送が再開される。
【００６４】
図９は「アンロードＦＩＦＯ」コマンド操作の一例を示す。書込ポインタ（ＷＰ）４１０が目下「３２」にセットされ、また読取ポインタ（ＲＰ）４１２が「０」にセットされている。どれだけ多くのＦＩＦＯワード・ロケーションが使用されるかを示すＦＩＦＯワード・カウントが「８」であれば、ＦＩＦＯアレイ４０２内に８ワードがあることを示している。バッファ・メモリ転送カウンタ４０６が「３２」でロードされると、３２バイトの指示がＦＩＦＯアレイ４０２からバッファ・メモリ１１２に転送される。明瞭にするために、本例において、ＦＩＦＯアレイ４０２は連続番号でロードされているが、実際のバッファ・メモリ・カウンタは「アンロードＦＩＦＯ」命令の操作に作用しない。
【００６５】
一度、「アンロードＦＩＦＯ」命令がコマンド・レジスタ４０８によって受信されると、ＦＩＦＯアレイ４０２からバッファ・メモリ１１２への３２バイトの転送が生じる。データが読取ポインタ４１２によって指示されたロケーションの開始で、本例では「０」でＦＩＦＯ３０２から読み取られる。読取ポインタ４１２が、各ワードが転送され、またバッファ・メモリ１１２にロードされるにつれて、４だけインクリメントされる。この工程が、転送カウンタによって特定されたバイト数、本例では３２が転送されるまで、反復される。図８に示したように、一度「アンロードＦＩＦＯ」命令が完了すると、バッファ・メモリ１１２が転送データを含み、書込ポインタ４１０が３２を維持し、読取ポインタ４１２が３２にインクリメントされ、またＦＩＦＯワード・カウントが０になり、ＦＩＦＯが空であることを示す。一実施例において、たとえＦＩＦＯアレイ４０２が空であっても、データがＦＩＦＯアレイ４０２から消去されない。
【００６６】
「ＢＣＲＣ（ブロックＣＲＣ）チェックによるＦＩＦＯロード」命令が、データをバッファ・メモリ１１２からＭＰ  ＦＩＦＯ３０２に転送し、一方ＣＲＣチェックが実行される。このコマンドは関連するセクターＣＲＣを伴うディスク・セクターを転送するために特に有利である。データが、ＭＰ  ＦＩＦＯ書込ポインタ４１０によって規定されたロケーションでの開始でＦＩＦＯアレイ４０２にロードされる。転送されるべきバイト数はバッファ・メモリ転送カウンタ４０６内にセットされる。転送のためのバッファ・メモリ開始ソース・ドアレスがバッファ転送アドレス・レジスタ４０４内にセットされる。転送されるべきバイト数はＦＩＦＯアレイ４０２のサイズを超えることが認められる。一実施例において、転送されるべき最終ワードであるブロックＣＲＣが、チェックされる。ＣＲＣチェックが、ブロックＣＲＣが有効であることを指示すれば、ＭＰ  ＤＭＡ  ＦＩＦ  ＣＲＣグッド・ビットがステータス・レジスタにセットされる。「ＢＣＲＣチェックによるＦＩＦＯロード」操作が、ＦＩＦＯ３０２がいっぱいで、転送が未完了であれば、サスペンドされるか、または休止される。転送は、ＦＩＦＯ３０２が空になり始めると、自動的に再開される。
【００６７】
休止特性はバッファ・メモリ１１２から、関連するエラー検出および（または）修正コードで、ＦＩＦＯ３０２よりもサイズが多量の大きいデータ・ブロックを転送するために特に有利である。エラー検出コードは、例によれば、ＣＲＣである。従来の技術を使用することで、ＦＩＦＯアレイ４０２よりも大きいデータ・ブロックの転送は、ＦＩＦＯアレイ４０２とサイズにおいて同じであるいくつかの小さいブロックとして大きいブロックを処理することによって不都合に実行される。従って、この大きいブロックは一連の小さい、分離した転送として転送される。しかし、この従来技術は、全ブロックのためのであるＣＲＣの計算を困難にし、あるいは各ＦＩＦＯサイズの転送の開始時にＣＲＣアキュムレータのリシードを必要とすることによって実行が遅くなる。これとは逆に、本発明の一実施例は、転送の工程に渡って蓄積されたＣＲＣで、リシード(reseed)なしに、全ブロックを一つのブロックとして処理することが許容される。
【００６８】
図１０は「ＢＣＲＣチェックによるＦＩＦＯロード」命令操作の一例を示す。ＦＩＦＯアレイ４０２が、「ｘｘ」で示された「ドント・ケア」情報を含むと想定されている。書込ポインタ（ＷＰ）４１０と読取ポインタ（ＲＰ）４１２が「０」にセットされ、これによってＦＩＦＯアレイ４０２の物理的開始アドレスに指示される。ＦＩＦＯ利用ワード・カウントが「０」で、ＦＩＦＯアレイ４０２が空であることを指示している。バッファ・メモリ転送カウンタ４０６が、３６バイトを指示する「３２＋４」、または、３６でロードされ、３２のデータ・バイトと４ＢＣＲＣバイトの指示がバッファ・メモリ１２からＦＩＦＯアレイ４０２に転送される。明瞭にするために、本例においては、バッファ・メモリ１１２が連続番号でロードされるが、一実施例において、実際のバッファ・メモリ・コンテンツは「ＢＣＲＣチェック命令によるＦＩＦＯロード」命令の操作に作用しない。
【００６９】
一度、「ＢＣＲＣチェックによるＦＩＦＯロード」命令がコマンド・レジスタ４０８によって受信されると、３２データ・バイトと、バッファ・メモリ１１２からＦＩＦＯアレイ４０２への４ＢＣＲＣバイトの転送が生じる。バッファ・メモリ・データとＢＣＲＣが、書込ポインタ４１０によって指示されたロケーションにおける開始で、本例では「０」でＦＩＦＯ３０２に書込される。各バイトが転送され、またＦＩＦＯアレイ４０２にロードされると、書込ポインタ４１０がインクリメントされる。この工程は、転送カウントによって特定されたバイト数、本例では３６が転送されるまで、反復される。ＢＣＲＣが転送中チェックされ、ＣＲＣが有効であることが指示されれば、ＭＰ  ＤＭＡ  ＦＩＦＯ  ＣＲＣグッド・ビットがステータス・レジスタにセットされる。図１０に示したように、一度「ＢＣＲＣチェックによるＦＩＦＯロード」命令が完了すると、ＦＩＦＯアレイ４０２が転送データを含み、書込ポインタ４１０が３６にインクリメントされ、読取ポインタ４１２が０に維持され、またＦＩＦＯワード・カウントが９になる。一実施例において、転送データもバッファ・メモリ１１２内に保持される。
【００７０】
「ＢＣＲＣ発生によるＦＩＦＯアンロード」命令が、ブロックＣＲＣの生成中、データをＭＰ  ＦＩＦＯ３０２からバッファ・メモリ１１２に転送する。転送がＭＰ  ＦＩＦＯ読取ポインタ４１２によって規定されたロケーションで開始（スタート）がはじまる。転送されるべきバイト数が、バッファ・メモリ転送カウンタ４０６内にセットされる。転送のためのバッファ・メモリ・スタート方向アドレスがバッファ転送アドレス・レジスタ４０４内にセットされる。転送されるべき最終ワードはダミー・ワードであり、ＣＲＣエンジン１３２によって計算されたブロックＣＲＣと置換される。転送されるべきバイト数が、ＦＩＦＯアレイ４０２のサイズを超えて許容される。「ＢＣＲＣ発生によるＦＩＦＯアンロード」操作が、ＦＩＦＯ３０２が空であり、また転送が未完了であれば、サスペンドされるか、または休止される。転送は、ＦＩＦＯ３０２がいっぱいになり始めたときに、自動的に再開する。
【００７１】
図１１は「ＢＣＲＣ発生によるＦＩＦＯアンロード」命令操作の一例を示す。バッファ・メモリ１１２が、「ｘｘ」で示された「ドント・ケア」情報を含むと想定されている。明瞭にするために、本例において、ＦＩＦＯアレイ４０２は連続番号の３２バイトでロードされる。さらに、データに続く４バイトがダミーＢＣＲＣを「含んでいる」。すなわち、ＦＩＦＯアドレス０−３１での３２データ・バイトのためのＢＣＲＣは、未だ計算されていないが、ＦＩＦＯ管理目的のために、まるでアドレス・ロケーション３２−３５が実際のＢＣＲＣを含んでいるかのように書込ポインタ４１０が３６にセットされる。読取ポインタ（ＲＰ）４１２が「０」にセットされる。どれだけのＦＩＦＯワード・ロケーションが使用されたかを指示するＦＩＦＯ利用ワード・カウントが「９」であれば、９ワードがＦＩＦＯアレイ４０２にあることを指示している。バッファ・メモリ転送カウンタ４０６が「３２＋４」、すなわち、３６でロードされる。３６バイトの指示がＦＩＦＯアレイ４０２からバッファ・メモリ１１２に転送される。
【００７２】
一度、「ＢＣＲＣ発生によるＦＩＦＯアンロード」命令がコマンド・レジスタ４０８によって受信されると、ＦＩＦＯアレイ４０２からバッファ・メモリ１１２への３２バイトの転送が生じる。データが、読取ポインタ４１２によって指示されたロケーションで、本例では「０」で、ＦＩＦＯ３０２から読み取られる。読取ポインタ４１２が、各ワードが転送されるとともにバッファ・メモリ１１２にロードされると、インクリメントされる。ＢＣＲＣはこの転送中、連続して計算される。この工程は、転送カウントからＢＣＲＣデータのための４バイトを減算したカウントによって特定されたバイト数が転送されるまで、反復される。本例において、３２バイトがＦＩＦＯアレイ４０２から転送される。バッファ・メモリ１１２に転送される最終の４バイトは、ＦＩＦＯアレイ４０２よりもむしろＣＲＣアキュムレータによって供給されたＢＣＲＣデータを含んでいる。図１１に示したように、一度「ＢＣＲＣ発生によるＦＩＦＯアンロード」命令が完了すると、バッファ・メモリ１１２は、関連するＢＣＲＣを伴う転送データを含んでいる。書込ポインタ４１０が３６を維持し、読取ポインタ４１２が３６にインクリメントされ、またＦＩＦＯワード・カウントが０になり、ＦＩＦＯが空であることを指示する。一実施例において、たとえＦＩＦＯアレイ４０２が空であっても、データはＦＩＦＯアレイ４０２から消去されない。
【００７３】
「バッファ・メモリからの読取」命令が、バッファ・メモリ１１２からのデータのデータ６４バイトをＭＰ  ＦＩＦＯ３０２へ転送する。データが、ＦＩＦＯアレイ４０２の開始時ないしゼロ・アドレスでＦＩＦＯアレイ４０２にロードされる。転送のためのバッファ・メモリ開始ソース・アドレスがバッファ転送アドレス・レジスタ４０４にセットされる。一実施例において、読取ポインタ４１２と転送カウンタ４０８がデフォルト値を使用して自動的に初期化される。従って、冗長なセットアップ工程によって実行するのではなく、一つの命令がカウンタを迅速に初期化する。さらに、一実施例において、ＣＲＣチェックがまったく実行されない。従って、ＦＩＦＯアレイ３０２［４０２？］のスタート時で自動的に６４バイトをロードする「バッファ・メモリからの読取」命令が、シーケンスをなすページをして、ＦＩＦＯポインタの管理に関連するオーバーヘッド時間を取らずに、迅速にロードせしめる。このコマンドが、マイクロプロセッサ１０８またはマイクロコントローラ１２０のようなプロセッサを許容して、ＦＩＦＯロードを迅速に実行せしめて、６４バイト・インターバルでバッファ・メモリに記憶されたデータを検査する。一実施例において、ＣＲＣはこの転送中まったく実行されない。
【００７４】
図１３は「バッファ・メモリからの読取」命令操作の一例を示す。ＦＩＦＯアレイ４０２が、「ｘｘ」で示された「ドント・ケア」情報を含むように想定される。書込ポインタ（ＷＰ）４１０、読取ポインタ（ＲＰ）４１２、転送カウンタ４０６および利用カウンタ４１４に基づいたワード・カウントが、デフォルト値で自動的に初期化される。明瞭にするために、本例において、バッファ・メモリ１１２は連続番号でロードされるが、一実施例において、実際のバッファ・メモリ・コンテンツは、「バッファ・メモリからの読取」命令の操作に影響しない。
【００７５】
一度、「バッファ・メモリからの読取」命令がコマンド・レジスタ４０８によって受信されると、バッファ・メモリ１１２からＦＩＦＯアレイ４０２への６４バイトの自動転送が生じる。バッファ・メモリ・データが、第１ＦＩＦＯメモリ・ロケーションの開始でＦＩＦＯアレイ４０２に書き込まれる。全ての６４バイトが転送される。図１３に示したように、一度、「バッファ・メモリからの読取」命令が完了すると、ＦＩＦＯアレイ４０２が転送データを含むことになる。一実施例において、転送データもバッファ・メモリ１１２に保持される。
【００７６】
「バッファ・メモリへの書込」命令がＦＩＦＯアレイ４０２の全６４バイト・コンテンツをバッファ・メモリ１１２に転送する。データが、ＦＩＦＯアレイ４０２の開始時ないしゼロ・アドレスでの開始でＦＩＦＯアレイ４０２にロードされる。転送のためのバッファ・メモリ・スタート方向アドレスが、バッファ転送ドレス・レジスタ４０４にセットされる。一実施例において、「バッファ・メモリへの書込」命令は、書込ポインタ４１０、読取ポインタ４１２、または転送カウンタ４０６を使用しない。従って、ＦＩＦＯアレイ４０２のスタート時で自動的に６４バイトをアンロードする「バッファ・メモリからの書込」命令が、ＦＩＦＯポインタの管理に関連するオーバーヘッド時間を取らずに、連続ページをしてバッファ・メモリ１１２に迅速に転送せしめる。一実施例において、ＣＲＣがこれらの転送中に実行される。
【００７７】
図１４は「バッファ・メモリへの書込」命令操作の一例を示す。バッファ・メモリ１１２が、「ｘｘ」で示された「ドント・ケア」情報を含むように想定される。書込ポインタ（ＷＰ）４１０、読取ポインタ（ＲＰ）４１２、転送カウンタ４０６および利用カウンタ４１４が、デフォルト値で自動的に初期化される。明瞭にするために、本例において、ＦＩＦＯアレイ４０２は連続番号でロードされるが、一実施例において、実際のコンテンツは、「バッファ・メモリへの書込」命令の操作に影響しない。
【００７８】
一度、「バッファ・メモリからの書込」命令がコマンド・レジスタ４０８によって受信されると、ＦＩＦＯアレイ４０２からバッファ・メモリ１１２への６４バイトの自動転送が生じる。６４バイトのＦＩＦＯデータがバッファ転送アドレス・レジスタ４０４に記憶されたアドレスでの開始でバッファ・メモリ１１２に自動的に書き込まれる。図１４に示したように、一度、「バッファ・メモリへの書込」命令が完了すると、バッファ・メモリ１１２が転送データを含むことになり、書込ポインタ４１０と読取ポインタ４１２が不変にされる。一実施例において、転送データもＦＩＦＯアレイ４０２に保持される。
【００７９】
「セレクトＦＣＰ（ファイバー・チャネル・プロトコル）ＣＭＤ２ビット（６）が、「フェッチ・カレントＦＣＰ」命令と「アップデート・カレントＦＣＰコマンド・ポインタ」命令に関連して使用される。「フェッチ・カレントＦＣＰ」命令が実行されると、現ＦＣＰ命令が、バッファ・メモリ１１２内のコマンド・バッファからＭＰ  ＦＩＦＯアレイ４０２に転送される。一実施例において、この転送は、一度ＦＩＦＯ命令がコマンド・レジスタ４０８に書き込まれると、プロセッサの介在なしに自動的に実行される。
【００８０】
以下に詳細に説明するように、ステート・マシン４１８が、「フェッチ・カレントＦＣＰ」命令を、「クリアＦＩＦＯ」シーケンスの実行、ポインタと利用カウンタのクリア、および「ＦＣＰコマンド・フェッチ・アドレス」を「ＭＰ  ＦＩＦＯバッファ・メモリ転送アドレス・レジスタ４０４へコピーすることによって実行する。「セレクトＦＣＰ  ＣＭＤ２ビット（６）が、二つのフェッチ・アドレス、ＦＣＰコマンド１フェッチ・アドレスまたはＦＣＰコマンド２フェッチ・アドレスのいずれが、カレントＦＣＰ命令をフェッチするのに使用されるかを決定する。二つのフェッチ・アドレス、ＦＣＰコマンド１フェッチ・アドレスまたはＦＣＰコマンド２フェッチ・アドレスを用意することが、二つの命令バッファをしてバッファ・メモリ１１２内に存在することを好都合に許容する。ＦＣＰコマンド１フェッチ・アドレスと、ＦＣＰコマンド２フェッチ・アドレスがＦＣＰコマンド１フェッチ・アドレス・レジスタ４２０と、ＦＣＰコマンド２フェッチ・アドレス・レジスタ４２２内にそれぞれ記憶される。レジスタ４２０、４２２は対応するＦＣＰコマンド・フレーム・テーブル・ベース、ＦＣＰコマンド・フェッチ・アドレス・フレーム・ポインタ、および６４バイトコマンド・フレーム・スタートを含んでいる。
【００８１】
次に、ステート・マシン４１８が、ＭＰ  ＦＩＦＯバッファ・メモリ転送カウンタ４０６を６０にセットする。これは関連するＣＲＣおよびバッファ長さフィールドを除いたＦＣＰコマンドのバイトによるサイズである。バッファ長さフィールドが、ＦＩＦＯアレイ４０２のトップで、またはゼロ・アドレス・ロケーションでの開始でＭＰ  ＦＩＦＯ３０２にロードされる。従って、バッファ長さフィールドがマイクロコントローラ１２０のような処理素子による使用のために迅速、かつ、自動的に配置される。一実施例において、バッファ長さフィールドは固定位置に、またはＦＣＰコマンド・ヘッダに関係するスペーシングにある。バッファ長さフィールドはＣＲＣを位置付けするのに使用され、これがチェックされフレームが不正であるかどうかが決定される。一実施例において、ＦＣＰコマンド・フレームが、図７に示したようにＣＲＣがバッファ長さフィールド上方に配置された状態でバッファ・メモリ１１２に記憶される。次に「ＢＣＲＣチェックによるＦＩＦＯロード」命令が、自動的に実行される。一実施例において、「インタラプト・アポン・コンプリート」ビットが同様にセットされる。
【００８２】
従って、さらなるマイクロプロセッサまたはマイクロコントローラの介在を必要とせずに、ステート・マシンに対してＦＣＰコマンドをロードし、チェックする複雑なタスクを自動的に実行させることによって、マイクロプロセッサ１０８およびマイクロコントローラ１２０の処理負荷を大々的に低減している。さらに、ＦＣＰコマンドの読取りがより迅速、かつ、効果的に達成される。
【００８３】
「アップデート・カレントＦＣＰコマンド・ポインタ」命令が、「カレント・コマンド・フェッチ」アドレス・カウンタまたはレジスタを進行させるのに必要とされる工程を実行する。最初に、「フェッチ・アドレス」ポインタが、コマンド・サイズ、６４だけインクリメントされる。「セレクトＦＣＰ  ＣＭＤ２ビット（６）」が、いずれのＦＣＰコマンド１フェッチ・アドレスとＦＣＰコマンド２フェッチ・アドレスが使用されるかを決定する。次に、ＭＰ  ＦＩＦＯコマンド・コンプリート・インタラプトが生成される。次に、コマンド・カウントがデクリメントされる。
【００８４】
図１２は「フェッチ・カレントＦＣＰ」命令操作の一例を示す。ＦＩＦＯアレイ４０２が、「ｘｘ」で示された「ドント・ケア」情報を含むように想定される。書込ポインタ（ＷＰ）４１０、読取ポインタ（ＲＰ）４１２、およびワード・カウントも「ドント・ケア」である。バッファ・メモリ１１２がＦＣＰコマンド・フレームでロードされる。フレーム・ヘッダに対して８ワード、フレーム・ペイロードに対して８ワード、ＦＣＰコマンドＣＲＣに対して１ワード、およびワード・バッファ長さフィールドに対して１ワードを含み、合計６４バイトである。
【００８５】
一度、「フェッチ・カレントＦＣＰ」命令が、コマンド・レジスタ４０８によって受信されると、バッファ・メモリ１１２からＦＩＦＯアレイ４０２への６４バイトの自動転送が生じる。転送は対応するＦＣＰコマンド・フェッチ・アドレスによって指示されたバッファ・メモリ・ロケーションからである。最初に、バッファ長さフィールドがＦＩＦＯアレイ４０２の始め（beginning)、ないしトップ・アドレスに自動的にロードされる。従って、バッファ長さフィールドはＦＩＦＯアレイ４０２からアンロードされた第１ワード後である。次に、ＦＣＰコマンド・フレーム・ヘッダが、チェックされたフレーム・ペイロードとＣＲＣに続いて転送される。図１２に示したように、一度、「フェッチ・カレント」命令が完了すると、ＦＩＦＯアレイ４０２が、バッファ長さフィールドをトップにした転送データを含むことになる。書込ポインタ４１０と読取ポインタ４１２が０を保持し、またＦＩＦＯワード・カウントが６４であり、これはＦＩＦＯアレイ４０２がいっぱいであることを指示している。
【００８６】
図１５はコンテキスト・スイッチング操作の一例を示す。本例は前もってＦＩＦＯアレイ４０２に記憶されたコンテキストを代表的なレジスタ・ファイルにスワップないし転送する態様を、一方レジスタ・ファイルからのコンテキストをＦＩＦＯアレイ４０２に転送する態様を示す。レジスタ・ファイルは多数のレジスタ・ファイルの一つであり、またＦＣＰヘッダ、転送カウント・ステータス等々のような種々のデータないしコンテキストを含むように使用される。本例において、ＦＩＦＯアレイ４０２はアレイの第１の２８バイトに記憶された第１コンテキストを含む。ＦＩＦＯアレイ４０２の残部は、「ｘｘ」によって指定された「ドント・ケア」情報を含んでいる。書込ポインタ（ＷＰ）４１０は２８に、すなわち、書込ポインタ４１０はＦＩＦＯアレイ４０２によって受信された次のデータをして、第１コンテキストに続くメモリ・ロケーションに書き込ませる。読取ポインタ（ＲＰ）４１２が「０」にセットされ、これによってＦＩＦＯアレイ４０２の物理的開始アドレスを指示する。どれだけのＦＩＦＯワード・ロケーションが使用されたかを指示するＦＩＦＯ利用ワード・カウントは、「７」である。マイクロコントローラ（ＭＣ）アキュムレータが「１４」にセットされている。バッファ・メモリ転送カウンタ４０６は、「ドント・ケア」であり、データはこの操作ではバッファ・メモリ１１２に転送もされず、またこれからの転送もない。レジスタ・ファイル１５０２が第２コンテキストを含み、２８バイトを含んでいる。一方、本例において、第１および第２コンテキストが同じサイズであるが、両者は異なるサイズでもよい。明瞭にするために、本例においては、ＦＩＦＯアレイ４０２は連続番号００−１Ｂでロードされており、一方、レジスタ・ファイル１５０２は連続番号２０−３Ｂでロードされている。
【００８７】
「ＭＣイクスチェンジ・ロードＦＩＦＯ」命令がコンテキスト・スイッチングないしスワッピングを実行するのに使用される。一度、ＭＣ  ＥＸＣＨＡＮＧＥロードＦＩＦＯ命令が発せられると、ＦＩＦＯアレイ４０２に記憶されたコンテキストが、レジスタ・ファイル１５０２に記憶されたコンテキストでスワップされる。図示例において、第１コンテキストはスワップ・アウトされているが、ＦＩＦＯアレイ４０２から消去されない。しかし、所望ならば、第１コンテキストは、スワップ操作中、ＦＩＦＯアレイ４０２に上書きでき、一方第１コンキストのスワップアウト・コピーはレジスタ・ファイル１５０２に記憶される。例えば、スワップされたコンテキストが未使用ＦＩＦＯロケーションよりも大きければ、ＦＩＦＯアレイ４０２内に記憶された第１コンテキストの全てのまたは一部が、上書きできる。従って、一実施例において、レジスタ・ファイルからスワップされたコンテキストが６４バイトであれば、ＦＩＦＯアレイ４０２内の第１コンテキストは完全に上書きされる。
【００８８】
図１５に示したように、本例において、レジスタ・ファイル１５０２からＦＩＦＯアレイ４０２に転送されたコンテキストは、第１コンテキストのすぐ後に記憶される。レジスタ・ファイル１５０２はここで第１コンテキストを含むことになる。書込ポインタ（ＷＰ）４１０が５６に進行し、ＦＩＦＯアレイ４０２に書き込まれた付加的なデータが表わされている。読取ポインタ（ＲＰ）４１２が２８に進行し、２８バイトがＦＩＦＯアレイ４０２から読み取られた事実が表れている。ＦＩＦＯワード・カウントは７のままであり、ＦＩＦＯアレイ４０２の読取ワードの数は、スワップ中にＦＩＦＯアレイ４０２に書き込まれたワード数と同じである。
【００８９】
本発明の一実施例は、データがＭＰ  ＦＩＦＯ３０２とバッファ・メモリ１１２間で転送されたときに、データ変換が任意に実行される。図６に示したように、３２ビット・ワード内の二つの１６ビット・ハーフワードがスワップされ、また各ハーフワード内の二つのバイトがスワップされる。コマンド・レジスタ４０８のビット５が、ワード内のハーフワードをスワップすべく使用する。ビット４が、ハーフワード内のバイトをスワップすべく使用する。これらのスワッピング機能は、ビッグ−エンディアン・フォーマット(big-endian format) 内でフォーマットされたデータからリトル−エンディアン・フォーマット(little-endian format)へのデータ変換を好都合に許容する。同様にして、これらのスワッピング機能はリトル・エンディアン・フォーマット内でフォーマットされたデータからビッグ−エンディアン・フォーマットへのデータ変換を好都合に許容する。例えば、ファイバー・チャネルは従来リトル−エンディアン・フォーマットを使用し、一方プロセッサ１０６、１２０はビッグ−エンディアン・フォーマットを使用する。加うるに、スワッピング機能は、異なる境界線上で再編成されるべきＦＩＦＯ３０２の内外でワードの転送を許容する。
【００９０】
バッファ・メモリ・アクセス方向、転送カウント値、バッファ・メモリ・アドレスのソース、およびコメントを含む付加的な命令情報を次の表３に提示する。
【００９１】
【表３】
0004741735.tif 000004
一実施例において、上にリストした一つまたはそれ以上のコマンド（命令）が発せられ、一方他のコマンドが実行される。例えば、一実施例において、操作なし（ＮＯＰ）、クリアＦＩＦＯ、およびストップＦＩＦＯコマンドが発せられ、一方他のコマンドが実行される。
【００９２】
ステート・マシン４１８が、ＭＰ  ＦＩＦＯポインタ、ＭＰ  ＦＩＦＯバッファ・メモリ転送カウンタ４０６、ファイバー・チャネル・プロトコル（ＦＣＰ）フェッチ・アドレス・カウンタ、ＣＲＣアキュムレータ、およびフレーム長さカウンタを含むコントローラ・メモリ・アクセス・リソースを制御する。ステート・マシン４１８がこれらのリソースを初期化し、モードをセットし、またＳＤＲＡＭリクエスタとして作用する。
【００９３】
図５Ａ−ＤはＭＰ  ＦＩＦＯステート・マシン４１８の一実施例を示す。アイドル・ステート５１４から開始され、アンロードＦＩＦＯコマンドの受信時に、ステート・マシン４１８がステート５０２に進行し、アンロードの工程時に、ＦＩＦＯ３０２が開始される。ＦＩＦＯ３０２が空でなければ、ステート・マシン４１８がステート５０４に進行する。次に、ただ一つのワードがＦＩＦＯアレイ４０２に残り、また転送カウントが１に等しくなるまで、ＦＩＦＯ３０２が連続してアンロードされる。次に、ステート・マシン４１８がステート５０８に進行し、ここで最終ＦＩＦＯワードがアンロードされる。従って、ＭＰ  ＦＩＦＯアービタからの確認（ＡＣＫ）信号とＳＤＲＡＭコントローラからのデータ確認（ＤＡＣＫ）信号両方がアクティブであるとき、ＦＩＦＯアレイ４０２内のデータの最後の一つが転送される。転送カウントが０にセットされ、またステート・マシン４１８がアイドル・ステート５１４に復帰する。
【００９４】
アイドル・ステート５１４にあってＣＲＣコマンドによるアンロードＦＩＦＯが受信されれば、ステート・マシン４１８がステート５０８に進行する。ＣＲＣコマンドによるアンロードＦＩＦＯが、ＦＩＦＯアレイ４０２からバッファ・メモリ１１２へのデータの書込に使用され、この間に関連ＣＲＣが生成される。一実施例において、ＣＲＣはバッファ・メモリ１１２に最終ワードを書き込むことになる。ＦＩＦＯアレイ４０２が空であれば、ステート・マシン４１８がアンロードＦＩＦＯステート５０８に留まる。しかし、ＦＩＦＯアレイ４０２が空でなければ、ステート・マシン４１８がアンロードＦＩＦＯステート５１０に進行する。ＣＲＣ計算は、ＦＩＦＯアレイ４０２がアンロードされ、ＳＤＲＡＭバッファ・メモリに書込みされるにつれて、実行される。転送カウントが１に等しいとき、ステート・マシン４１８がアンロードＦＩＦＯステート５１２に進行する。ＣＲＣ計算が完了したとき、ＣＲＣデータがＳＤＲＡＭバッファ・メモリ１１２に転送され、また転送カウンタが０にセットされる。次に、ステート・マシン４１８がアイドル・ステート５１４に復帰する。
【００９５】
ステート・マシン４１８がロードＦＩＦＯコマンドを受信すれば、ステート・マシン４１８がアイドル・ステート５１４からロードＦＩＦＯステート５１６に進行する。ロードＦＩＦＯコマンドはバッファ・メモリからＦＩＦＯアレイ４０２へのデータの読取りに使用される。ステート・マシン４１８がいっぱいでなければ、次にステート・マシン４１８は、アービタからのＭＰ  ＦＩＦＯ確認信号の受信時に、ステート５１８に進行する。次に、転送カウントが１に等しくなり、またＭＰ  ＦＩＦＯ３０２が「ほとんど完全（いっぱい）信号」を発生するまで、ステート・マシン４１８がデータをしてバッファ・メモリ１１２からＦＩＦＯアレイ４０２に転送せしめる。転送カウントが１に等しく、またＦＩＦＯアレイ４０２がほとんどいっぱい (フル) であれば、ただ一つのデータ・ワードのために余裕があることを意味し、ステート・マシン４１８がロードＦＩＦＯステートを５２０に進行する。転送カウンタが１に等しく、ＭＰ  ＦＩＦＯ３０２がフル信号を発生すれば、次に、アービタからのＭＰ  ＦＩＦＯ確認信号とＳＤＲＡＭコントローラからのＤＡＣＫ信号の受信時に、最終ワードがＦＩＦＯアレイ４０２にロードされ、ステート・マシン４１８がアイドル・ステート５１４に復帰する。
【００９６】
ＣＲＣを伴ったロードＦＩＦＯコマンドが受信されると、ステート・マシン４１８がＣＲＣコマンドを伴ったロードＦＩＦＯステート５２２に進行する。ＣＲＣを伴ったロードＦＩＦＯコマンドがバッファ・メモリ１１２からのデータを読取るのに使用され、一方ＣＲＣをチェックする。一実施例において、ＣＲＣが転送されるべき最終ワードとなる。ステート５２２において、ＭＰ  ＦＩＦＯ３０２がいっぱいでなければ、ＭＰ  ＦＩＦＯ読取信号が作動され、ＭＰ  ＦＩＦＯ  ＣＲＣが有効信号となる。ＭＰ  ＦＩＦＯ確認信号が受信されると、ステート・マシン４１８がＣＲＣを伴うロードＦＩＦＯステート５２４に進行する。ほぼフル信号が行使され、また転送カウントが１より大きくなるまで、ステート・マシン４１８がデータをＳＤＲＡＭバッファ・メモリからＦＩＦＯアレイ４０２にロードするように進行する。この期間中、ＣＲＣが計算される。次に、ステート・マシン４１８がＣＲＣを伴ってロードＦＩＦＯステート５２６に進行する。ステート・マシン４１８がＣＲＣをしてＦＩＦＯアレイ４０２にロードせしめる。転送カウントが１にセットされ、またステート・マシン４１８はアイドル・ステート５１４に復帰する。
【００９７】
「ライト・トウ・バッファ・メモリ（バッファ・メモリへの書込）」コマンドが受信されたときに、ステート・マシン４１８がアイドル・ステート５１４から書込ステート５２８に進行する。上述したように、「ライト・トウ・バッファ・メモリ」コマンドがＦＩＦＯアレイ４０２からバッファ・メモリ１１２へのデータの書込みに使用される。もし、ＦＩＦＯアレイ４０２が空でなければ、ＭＰ  ＦＩＦＯアービタからの確認信号の受信時に、ステート・マシン４１８がステート５３０に進行する。次に、ＦＩＦＯアレイ４０２がアンロードされ、またアンロードされたデータがバッファ・メモリ１１２に書き込まれる。ただ一つのワードがＦＩＦＯメモリに残り、また転送カウントが１に等しくなるまで、ＦＩＦＯアンロード工程が継続される。次に、ステート・マシン４１８が、ステート５３２に進行し、ここで最終ＦＩＦＯワードがアンロードされる。こうして、ＭＰ  ＦＩＦＯアービタからの確認（ＡＣＫ）信号とＳＤＲＡＭコントローラからのデータ確認（ＤＡＣＫ）信号の両方がアクティブなとき、ＦＩＦＯ内のデータの最終のものが転送される。転送カウントは０にセットされ、ステート・マシンはアイドルステージ５１４に復帰する。
【００９８】
アップデートＦＣＰポインタ・コマンドが受信されたときに、ステート・マシン４１８がアイドル・ステート５１４からＦＣＭＤ  ＰＴＲステート５２８に進行する。コマンド・ポインタ・インクリメント信号が１クロックの間、作動され、これがＦＣＰアドレスとカウントを更新する。ステート・マシン４１８がステート５３６に進行し、コマンド・コンプリート・インタラプトをクリアする。こうして、ステート・マシン４１８がアイドル・ステート５１４に復帰する。
【００９９】
リード（読取り）バッファ・メモリ・コマンドが受信されると、ステート・マシン４１８がアイドル・ステート５１４からリード・ステート５３８に進行し、ＳＤＲＡＭ読取信号を行使する。ＦＩＦＯがいっぱいでなければ、ＭＰ  ＦＩＦＯアービタからの確認信号の受信時に、ステート・マシン４１８がステート５４０に進行する。次に、データがバッファ・メモリ１１２からＦＩＦＯアレイ４０２に読み取られる。読取工程は、ＦＩＦＯメモリがほぼいっぱいになり、また転送カウントが１に等しくなるまで、続行される。次に、ステート・マシン４１８がステート５４２に進行し、ここでもう一つのワードがバッファ・メモリ１１２からＦＩＦＯに読み取られる。こうして、ＭＰ  ＦＩＦＯアービタからの確認（ＡＣＫ）信号とＳＤＲＡＭコントローラからのデータ確認（ＤＡＣＫ）信号両者がアクティブであるとき、転送カウントが０にセットされ、またステート・マシン４１８がアイドル・ステート５１４に復帰する。
【０１００】
フェッチＦＣＰコマンドが受信されると、ステート・マシン４１８がアイドル・ステート５１４からＦＣＰコマンド・ステート５４４に進行する。ステート・マシンがＦＣＰ＿ＣＭＤ、ＲＤ＿ＳＩＧ、ＬＤ＿ＣＭＤ＿ＬＥＮ＿ＡＤＲ、ＣＬＲ＿ＦＩＦＯ、ＬＤ＿ＸＦＥＲ＿ＣＮＴ＿６４およびＲＥＱ＿ＳＩＧ信号を適切にセットし、パケットの終端に配置されたパケット長さデータを得るように用意する。従って、転送アドレスがフレーム長さアドレスとともにロードされる。一実施例において、フレーム長さアドレスには、セグメント・サイズに付加したベース・アドレスが含まれている。ステート５４６に進行して、フレーム長さデータが検索される。ＭＰ  ＦＩＦＯアービタからの確認（ＡＣＫ）信号とＳＤＲＡＭコントローラからのデータ確認（ＤＡＣＫ）信号両者がアクティブであるとき、フレーム長さがＦＩＦＯアレイ４０２に配置される。ステート５４８に進行して、ＣＲＣシードがリセットされ、また転送アドレスがＦＣＰコマンド・フレームのスタート・アドレスまたはベース・アドレスにセットされる。確認信号がドロップしたとき、ステート・マシンがステート５５０に進行する。バッファ・メモリ１１２からのパケットの転送が開始し、またＣＲＣアキュムレーションが開始する。転送カウントが１に等しくなるまで、転送は続行される。次に、ステート・マシン４１８はステート５５２に進行し、最終ワードが転送される。転送カウンタがここでゼロに等しくなり、またステート・マシン４１８がアイドル・ステート５１４に進行する。
【０１０１】
本発明のある好ましい実施例を説明してきたが、これらの実施例は例としてのみ提示したものであって、本発明の範囲を限定することを意図していない。従って、本発明の概念と範囲は請求の範囲とその等価なものによってのみ規定される。
【図面の簡単な説明】
【図１】  本発明の一実施例を使用する一環境を示す図
【図２】  バッファ・コントローラの一実施例のポートを示す図
【図３】  図２のバッファ・コントローラをより詳細に示す図
【図４】  メモリ・ユニットの一実施例を示す図
【図５】  Ａ−Ｄは、バッファ・コントローラと併用したステート・マシンの一実施例を示す図
【図６】  データ変換の一実施例を示す図
【図７】  ファイバー・チャネル・コントロール・ブロックを示す図
【図８】  第１の代表的なデータ転送を示す図
【図９】  第２の代表的なデータ転送を示す図
【図１０】  第３の代表的なデータ転送を示す図
【図１１】  第４の代表的なデータ転送を示す図
【図１２】  第５の代表的なデータ転送を示す図
【図１３】  第６の代表的なデータ転送を示す図
【図１４】  第７の代表的なデータ転送を示す図
【図１５】  第８の代表的なデータ転送を示す図
【図１】
0004741735.tif 000005
【図２】
0004741735.tif 000006
【図３】
0004741735.tif 000007
【図４】
0004741735.tif 000008
【図５】
0004741735.tif 000009
【図５Ａ】
0004741735.tif 000010
【図５Ｂ】
0004741735.tif 000011
【図５Ｃ】
0004741735.tif 000012
【図５Ｄ】
0004741735.tif 000013
【図６】
0004741735.tif 000014
【図７】
0004741735.tif 000015
【図８】
0004741735.tif 000016
【図９】
0004741735.tif 000017
【図１０】
0004741735.tif 000018
【図１１】
0004741735.tif 000019
【図１２】
0004741735.tif 000020
【図１３】
0004741735.tif 000021
【図１４】
0004741735.tif 000022
【図１５】
0004741735.tif 000023