AT/LANTIC(tm) ソフトウェア開発者向けガイド ナショナルセミコンダクタ アプリケーションノート 887 David Milne 1993年3月 ----- 序文 ----- この文章は AT/LANTIC(tm) デバイスのためのソフトウェア開発を補助する ために書かれた。AT/LANTIC データシートを読む前や、読んでからこの説明と 融合させることを推奨する。 ----- 目次 ----- 1.0 AT/LANTIC デバイスの概要 2.0 AT/LANTIC のコンフィギュレーション 2.1 コンフィギュレーションの変更と保存 2.2 新しいアダプタを有効にする 2.3 コンフィギュレーションレジスタ C のプログラミング 3.0 AT/LANTIC の初期化 3.1 ハードウェアリセット 3.2 バスサイズとIDバイトの取得 3.3 レジスタの初期化 3.4 ケーブルのチェック 3.5 割り込みのチェック 3.6 ブートロムのチェック 4.0 情報転送 4.1 I/O モード転送 4.1.1 DMA ライトシーケンス 4.2.2 DMA リードシーケンス 4.2 共有メモリ転送 5.0 送信シーケンス 5.1 レジスタシーケンス 6.0 受信シーケンス 6.1 バッファリング(Buffer Ring) 6.2 パケットの除去 6.3 オーバーフロー時の扱い ----- 1.0 AT/LANTIC デバイスの概要 ----- AT/LANTIC(Local Area Network Twist Pair Interface Controler)は、あら ゆる ISA(Industry Standard Architecture) バスベースシステムにイーサネッ トワークを簡易なインタフェイスによって提供するものである。このデバイス は最も有名なイーサネットアダプタ構造の一種であるノベル NE-2000 アダプ タをエミュレーションすることができる。 デバイスの構造、アドレス、割り込みなどに関する設定情報は、スイッチと EPROM のどちらからでも読み込むことができる。EPROM を用いる方法によって、 デバイスの設定をソフト的に行なうことが可能となる。そのため、より多くの ユーザに親しみやすいイーサネットアダプタを提供することができる。 2 つのアダプタ構造の概要を以下に示す。 NE-2000 モードでは、全てのバッファ RAM から/への通信はデータポートレ ジスタを通して行なわれる。あらゆる通信には、通信を行なう前にそのバッファ RAM アドレス、転送サイズ、方向をレジスタに設定する必要がある。 この動作モードはよく I/O モードといわれる。 共有メモリモードでは、バッファ RAM はシステムメモリにマッピングされ る。このモードでは、バッファ RAM 内のあらゆるデータを ISA バスを通して 直接通信することができる。 AT/LANTIC は、PC の I/O ポートマップから 20H バイトの領域を必要とす る。この領域は AT/LANTIC の全てのレジスタを含んでいる。このレジスタブ ロックの内容は、このモードでの AT/LANTIC の動作状態に依存する。共通の 要素として、NIC コアレジスタブロックがあり、そこには16 のレジスタを持 つ。レジスタブロックの位置は I/O アドレス(あるいは I/O ベースとも呼ば れる)によって与えられる。FIGURE 3 と 4 にそれぞれのモードでのレジスタ ブロックの内容を示す。 AT/LANTIC は 64KB までの RAM 領域にアクセスすることができる。しかし、 標準ではこの領域中の 16KB しか使用しない。 この RAM 領域へのアクセス方法はこの文章のセクション 4.0 で説明する。 AT/LANTIC のメモリマップはデバイスのモードに依存する。FIGURE 5 と 6 に それぞれのモードでの 64KB 全てのメモリマップを示す(チップを伴ったコン パチブルモードでのそれぞれのモードでは 16KB の RAM バッファしか利用で きない)。 ----- 2.0 AT/LANTIC のコンフィギュレーション ----- AT/LANTIC コントローラは、完全なソフトウェアでのコンフィギュレーショ ンが行なえるように設計されています。コンフィギュレーション情報は、この データシートのセクション 5.1 で解説されているレジスタ A,B,C の 3 つの レジスタによって保持されます。安全のために追加された特徴として、コンフィ ギュレーションレジスタ A と B は隠され、事故によって上書きができないよ うになっている。レジスタ C のみがリセット状態の間のみアクセスでき、ソ フトウェアからは直接的にはアクセスできないようになっている。 レジスタ A は I/O アドレス、割り込み、AT/LANTIC デバイスのモードをコ ントロールする。レジスタ B は ケーブルタイプの選択と ISA バスのインタ フェイスタイミング変更の確実なフラグをコントロールする(セクション 4.1 「バスエラー状態」を参照)。 ----- 2.1 コンフィギュレーションの変更と保存 ----- コンフィギュレーションの変更 レジスタ A と B は、それぞれ I/O アドレスオフセット 0AH と 0BH で直 接読み出すことができる。これらのレジスタに書き込むためには、読みだしア クセスのあとすぐに書き込みアクセスを行なわなければならない。書き込みを 行なう間、割り込みが発生しないことを確実にするために割り込みを禁止しな ければならない。これらのレジスタは、NIC コマンドレジスタをページ 0 に セットしている間のみ、アクセスを行なうことができる(AT/LANTIC データシー トのセクション 5.3 を参照)。 レジスタ A は AT/LANTIC のアドレスロケーションを変更することができる ので(そしてレジスタ B も)、そのためソフトウェアによって変更されるレジ スタ A と B は、まず B を変更してから A を変更しなければならない。この 方法によって、同じベース I/O アドレスを用いてで両方のレジスタを変更す ることができる。 GDLNK ビット レジスタ B の GDLNK ビットを設定を行なう時には、特別の注意が必要であ る。もしこのビットが 1 にセットされると、リンクの確実性のチェック(TPI モード)が無効となる。もしリンクの確実性のチェックが禁止されなくなった 場合(10BT の標準)、このビットにリンク状態が良ければ 1 が、悪ければ 0 がセットされる。もし、AT/LANTIC がリンク状態がよく TPI モードとなって いる時にレジスタ B が読み出されると、GDLNK ビットは 1 を示し、もしこの 値が直接レジスタ B に書き出されると、リンク確実性のチェックが禁止され る。したがって、リンク確実性チェックを禁止する必要がある場合を除き、レ ジスタ B に書き込みを行なう場合には GDLNK ビットをマスクすることが必要 不可欠である。 コンフィギュレーションのセーブ AT/LANTIC には、電源起動時にコンフィギュレーションレジスタの値を自動 的に設定させるために、コンフィギュレーションを EPROM に保存する機能が ある。EPROM にコンフィギュレーションを保存するたには特別なアルゴリズム を用いるが、これについては以下に疑似コードを用いて説明する。このアルゴ リズムではレジスタの値を直接は変更しない。すなわち、新しい状態は次の起 動時になって始めて現れる、ということである。 CONFIGURATION_SAVE () { // 割り込みは、シーケンスの発生が起きないことを確実にするために、禁止 // しておく Disable interrupts; // レジスタ B 中の EELOAD ビットをセット value = READ (Config_Reg_B); value = value & (~GDLNK); value = value | EELOAD; WRITE (Config_Reg_B, value); // コンフィギュレーション情報を出力 READ (Config_Reg_B); WRITE (Config_Reg_B, config_for_A); WRITE (Config_Reg_B, config_for_B); WRITE (Config_Reg_B, config_for_C); // EELOAD ビットが LOW になるまで待つ while(value && EELOAD) { value = READ (Config_Reg_B); WAIT(); } Enable interrupts; } ----- 2.2 新しいアダプタを有効にする ----- AT/LANTIC コントローラには、あらゆる I/O ベースによらず応答しないで あろう「無反応な」状態となる事ができる。これは、AT/LANTIC ベースのアダ プタを有効にする前に、利用できるコンフィギュレーションの自動選択を可能 とするようなソフトウェアコンフィギュレーションに対して特に有効なモード である。ゆえに、割り込みや I/O ベースアドレスの衝突の可能性を回避する 事ができる。 AT/LANTIC をこの「無反応な」状態から有効にするための方法は、シーケン スの発生が起きないことを確実にするために割り込みを禁止にし、その間にあ る 1 バイトデータを連続して 4 回、ポート 278H に書き込むことからなる。 この 1 バイトデータの内の下位 3 ビットは、AT/LANTIC に対し、有効とされ るアドレスを知らせる。I/O ベースアドレスのためのこの 3 ビットの対応に 関するより詳しい解説は、AT/LANTIC データシートのセクション 5.1 にて見 つける事ができる。 ポート 278H は通常、IBMPC の 2 番目のプリンタポートとなっている。「4 回の書き込み」シーケンスを行なうことは、もしこのポートが使用中であって も、アダプタを偶然に有効としてしまうことを確実に防ぐこととなる。もし、 アダプタを有効にしようとする時にこのポートがアクティブであれば、プリン トシーケンスを不当に発生させてしまうが、この事態を避けるために、ポート がアクティブな場合にはポートが空くまで待つようなチェックを次に示すコー ドで行なうことができる。プリンタはデータポートとして 278H を、そして制 御ポートとして 279H を用いる(IBMPC のテクニカルマニュアルにて、これら のレジスタと、これらのポートの制御方法の解説を参照できる)。 一旦 AT/LANTIC を有効にすると、コンフィギュレーションレジスタ A に古 い情報の 3 から 7 ビット目が与えられる。レジスタ A のビット 7 は MEMIO (アーキテクチャ) ビットであり、コンフィギュレーションレジスタオフセッ トがこのビットの状態によって変化する。よってソフトウェアは、AT/LANTIC が見えるようになる前の新しいコンフィギュレーション情報によって上書きさ れる、レジスタ A の 3-7 ビットと レジスタ B から、どのアーキテクチャモー ドになっているかを検出することができる。 AT/LANTIC モードの検出 AT/LANTIC は I/O ポートモードとして、あるいは共有メモリモードとして 見ることができる。I/O アドレスがわかっている時は、動作モードはレジスタ A のアドレスにある値を調べることで検出できる。すなわち、I/O モードにお いてはオフセット 0AH を、共有メモリモードにおいてはオフセット 1AH を調 べればよいということである。I/O ベースがわかっている時に、AT/LANTIC アー キテクチャの検出を行なうための推奨される方法を、以下に疑似コードとして 示す。 FIND_MODE() { // I/O モードのチェック config_a = READ(IO_BASE + 0AH); // MEMIO が LOW (すなわち I/O モード)かどうかのチェック if((config_a & 80H) == 0) { // IOAD ビットが I/O ベースアドレスにマッチするかチェック if((config_a & 7) relatrs to IO_BASE) return(IO_MODE_DETECTED); } // 共有メモリモードのチェック config_a = READ(IO_BASE + 1AH); // MEMIO が HIGH (すなわち共有メモリモード)かどうかのチェック if ((config_a & 80H) == 80H) { // IOAD ビットが I/O ベースアドレスにマッチするかチェック if((config_a & 7) relatrs to IO_BASE) return(SHARED_MEM_DETECTED); } // AT/LANTIC のモードを検出できない return(NO_MODE_DETECTED); } ----- 2.3 コンフィギュレーションレジスタ C のプログラミング ----- コンフィギュレーションレジスタ C はソフトウェアから直接アクセスする ことはできない。どのようにしてコンフィギュレーションレジスタ C を制御 するかは AT/LANTIC データシートのセクション 5.1 に見ることができる。レ ジスタ C の上位 4 ビットはアダプタの設計時において固定され、下位 4 ビッ トはブート ROM のオプションの選択によって変化する。ブート ROM オプショ ンによって選択され、その結果レジスタ C が(セクション 2.1 で説明したよ うに)「コンフィギュレーションセーブ」ルーチンによって正しく設定される ことを理解する必要がある。レジスタ C を読み出すことができないので、ブー ト ROM オプションを利用した検出方法が必要となる。ブート ROM 中の特定の 位置にある、シグネチャテキスト文字列というものを用いる方法が推奨される。 この文字列は、知るべき ROM のサイズについての情報が含まれているはずで ある。この規則は、RAM 空間からシグネチャ文字列を調べるものである。もし 見つかれば、その位置と ROM のサイズを知ることができ、レジスタ C が計算 できる値を求められる。レジスタ C は直接書き込むことができないので、値 を更新する唯一の方法は「コンフィギュレーションセーブ」ルーチンを用いる ことのみとなる。 レジスタ C に対するあらゆる変更は、AT/LANTIC がリセットされ、そして 新しい EEPROM の内容がレジスタにロードされて始めて行なわれる、というこ とに注意しなければならない。 ----- 3.0 AT/LANTIC の初期化 ----- この章で述べる内容は、初期化に必要な機能に関することと、AT/LANTIC の 部分的なテストとに分けられている。各サブセクション毎に説明されている規 則が推奨される。 ----- 3.1 ハードウェアリセット ----- 初期化の第一ステップは、 AT/LANTIC デバイスの NIC コアにリセットパル スを与えることである。この信号を与えるための方法は、AT/LANTIC に対し選 択されているモードに依存する。 I/O モードリセット手順 このモード中では、I/O アドレスマップの一部がリセットポートとして作用 する(オフセット 18H から 1FH までの全てのポートがリセットポートとして 用いられる)。リセット状態にするためには、そのポートから読みだし、それ から書き込みを同じポートに(同じ値を)行なわなければならない。その直後、 リセットが終了するのを確認するために 1.6 [ms]のウェイトが必要である。 共有メモリモードリセット手順 このモードには、2 つのコントロールレジスタ(AT/LANTIC データシートの セクション 5.2 を参照)が含まれる。コントロールレジスタ 1 の最上位ビッ トはリセットフラグである。リセット状態にするためには、リセットビットを HIGH にし、それから LOW に切替える必要がある。ここでも同様に、リセット の終了を確認するため 1.6 [ms]のウェイトが必要である。 AT/LANTIC をストップモードにする ハードウェアリセットを行なったあと、AT/LANTIC の NIC コアをストップ モード(ソフトウェアリセットとして機能する)にする必要がある。これは、 NIC コマンドレジスタのストップビットと RS2 ビット(AT/LANTIC データシー トのセクション 5.3 に NIC コアレジスタに関するより詳しい説明がある)を セットすることで行なわれる。また、NIC コアをページ 0 とするために、PS0 と PS1 をクリアしなければならない(NIC コアレジスタは 16 レジスタ 3 ペー ジ分に分割され、コマンドレジスタ中の PS0, PS1 ビットによって NIC に対 しどのページで動作させるかを設定する)。この手順のあと、ソフトウェアリ セットが終了状態を示すまで(割り込みステータスレジスタの RST ビットが 1 にセットされるまで)待たなければならない。 ----- 3.2 バスサイズとIDバイトの取得 ----- この章ではバスに挿入されているアダプタのスロットサイズの認識やIDバイ ト値が選択されている動作モードにあっているかのチェックについて述べる。 その2種類のAT/LANTICモードはこの問題に対するそれらのアプローチによって まったく違うので、分けて議論するべきだろう。 I/O モード I/O モードアーキテクチャでは、PROM データが RAM 空間の 00H 〜 1FH の 位置にマップされる。この RAM 空間の内容は、Figure.7 に示される。オフセッ ト 1EH には、現在存在しているアダプタのスロットのサイズに依存した、あ るワード値が格納される。もし、値が 5757H であれば、そのスロットは 16 ビットであり、4242H であれば、スロットは 8 ビットである。もし、値が前 述のどちらでもなかったら、アダプタは NE200 エミュレーションモードの正 しい機能を搭載していない。言い換えれば、これらの値は ID 値として作用も する。オフセット 1EH からワードデータを得るための DMA リード動作の例が、 この文章のセクション 4.1.2 で述べられている。この初期転送ではデータコ ンフィギュレーションレジスタ(DCR)を 8 ビット動作に設定し、コンピュータ はデータポートから 2 バイト読み込みを実行する必要がある。一旦データが が DCR とコンピュータに転送されてしまうと、転送は正しいバス幅にセット される。 共有メモリモード 共有メモリモードではアダプタが占有しているスロット数についての情報を 保持したレジスタがある。この AT 検知レジスタ(AT/LANTIC データシートの セクション 5.2 を参照)の最下位ビットは、16 ビットモードでは 1 に、8 ビッ トモードでは 0 に設定される。 Ethercard Plus 16 の正しいエミュレーションでは、ID バイトを必要とす る。このモードではレジスタのオフセット 08H から 0FH (図 8 を参照)まで にまずイーサネットアドレスがあり、続いて ID バイトとチェックサムがある。 AT/LANTIC の共有メモリモードでは、オフセット 0EH の ID バイトは値 05H を持つ。8 バイト全ての合計の 2 の補数は FFH でなければならない。も しこのケースに当てはまらなければ、そのアダプタは Ethercard Plus 16 エ ミュレーションモードとして正しく動作していないことになる。 3.3 レジスタの初期化 共有メモリモードでアダプタを初期化する場合には、後で述べている I/O ポートモードでは無視されているが、NIC コアレジスタを初期化する前に 2 つのコントロールレジスタを設定する必要がある。 共有メモリモード 共有メモリモードでは、バッファ RAM はコンピュータのアドレス空間に割 り当てられている。2 つのコントロールレジスタは、コンピュータのメモリマッ プ内のその RAM が現れるであろう場所に定義される(AT/LANTIC データシート のセクション 5.2 を参照)。選択されたメモリアドレスのアドレスビット A13-A18 は、コントロールレジスタ 1 の 0-5 ビット目で設定しなければなら ない。アドレスビット A19-A23 はコントロールレジスタ 2 の 0-4 ビットで 設定しなければならない。コントロールレジスタ 2 の MEMW ビットはメモリ が 8 kword であるか、あるいは 8 kbyte であるかを定義する。このビットは この初期化の間に行わなければならない。また、コントロールレジスタ 1 の MEME ビットの初期化も、バッファ RAM の制御の方法によっては必要である (セクション 4.2 を参照)。 例: D0000H が 16KB のメモリであれば、 コントロールレジスタ 1 は 28H コントロールレジスタ 2 は 41H NIC コアレジスタの初期化 以下に示すレジスタ初期化処理は、I/O ポートモードと共有メモリモードの どちらにおいても必要である。議論されてきたすべてのレジスタは、 AT/LANTIC データシートのセクション 5.3 に詳細が説明されている。 1. AT/LANTIC を停止状態にする。AT/LANTIC を停止状態することについては、 セクション 3.1 を参照のこと。 2. データコンフィギュレーションレジスタ(DCR)の、前の段階の結果によって はWTS(転送幅)と、LS のセットと、受信バッファリングの制御方法の選択によっ ては(セクション 6.0 を参照) ARM の初期化を行う。FIFO のしきい値は通常、 8 バイト/4 ワードに設定する。すなわち、FT1 を設定する(共有メモリモード においては、16 kバイトの RAM が利用できるのであれば、WTS ビットは常に セット出来る)。 3. リモートバイトカウントレジスタをクリアする。 4. 受信コンフィギュレーションレジスタ(RCR)の初期化を行う。このレジスタ は、AT/LANTIC によって受け取られ、RAM へバッファリングされるパケットを 決定する。このオプションによって出来ることは、エラーパケット、runt パ ケット(訳注:手持ちの辞書ではよくわからなかった)、マルチキャストパケッ ト、ブロードキャストパケット、物理アドレスマッチパケット、そしてすべて の物理アドレスパケットを保存する(promiscuous(訳注:乱雑な?)モード)。レ ジスタを 00H に設定すると、物理アドレスパケットのみを許可する。物理ア ドレスとマルチキャストアドレスについてのより詳しい議論は、このセクショ ンの後の方で得られる。 5. 転送コンフィギュレーションレジスタ(TCR)の LB0 あるいは LB1 を設定し て、NIC をループバックモード 1 あるいは 2 にする。ループバックについて はデータシートのセクション 6.5 で述べられている。 6. 受信バッファリングを初期化する。 Boundary Pointer (BNDRY). Page Start(PSTART). Page Stop(PSTOP). Transmit Page Start (TPSR). これらのレジスタの値は、このセクションの最後の方で議論されている。 7. Interrupt Status Register (ISR) を FFH を書き込むことで初期化する。 8. 割り込みマスクレジスタ(IMR)を初期化する。このレジスタは、割り込みの ソースを許可あるいは不許可にするための制御を行う。レジスタ中の、PRXE (packet recieved),PTXE(packet transmitted),PTXEE(packet transmission error),そしてOVWE(overflow)をセットするのが普通であろう。 9. コマンドレジスタをページ1に設定(PS0,RD2,STP をセット)し、physical packet, multicast packet,そして CURR レジスタをこのセクションの後で述 べられるように初期化する。 10. START ビットをセットし、コマンドレジスタ中の STOP, PS0, PS1 ビット ををクリアして、NIC をスタートモードにする。NIC コアをループバックモー ドにしておいて、その受け手はまだアクティブにはしない。 11. 転送コンフィギュレーションレジスタ(TCR)を正しい値(具体的には 00H) に初期化して、AT/LANTIC をループバックモードから抜け出させる。 AT/LANTIC は、これで受信とパケットの転送が可能となる。 バッファリングの設定 設定されるべきバッファリングへのポインタ PSTART, PSTOP, CURR, BNDRY, TPSR の値は、AT/LANTIC の動作モードに依存する。16k バッファ RAM を用い る NE2000 や EthercardPlus 16 の互換モードや、64K 以上のバッファ RAM を用いることができる非互換モードなど、設定可能なさまざまなモードがある。 問題の転送サイズはまた、バッファリングのサイズに変更する。バッファ RAM はそれぞれが 256 バイトに抑えられた「ページ」に分割される。標準では、 受信バッファリングの後に転送バッファが持たれる。パフォーマンスを向上さ せるために、2 つの転送バッファを用いることが推奨される。他のパケットが ネットワーク上を転送され始めている間に、パケットは RAM 内に転送される。 それぞれの転送バッファは、完全なイーサネットパケットのために 6 ページ 必要がとなる(プロトコルによっては、イーサネットパケットの上限を必要と しない)。転送ページ開始レジスタ(TPSR)は、転送時間の間ずっと転送される バッファを指していなければならない。すなわち、他のバッファに転送が行わ れ始めている間、TPSR は変更されてはならないということである。受信バッ ファリングは転送バッファの下にある。ページスタートレジスタ(PSTART)は転 送バッファの下のページに設定する。ページストップレジスタ(PSTOP)はバッ ファ RAM の最後に 1 ページを足した値に設定する(バッファ RAM のサイズは バス幅/メモリ幅によって決定される)。 NE2000 エミュレーションモードでは 4000H〜8000H の位置にバッファ RAM が存在する(Figure 6 を参照)。Ethercard Plus 16 モードでは 0000H〜4000H の位置にバッファ RAM が存在する(Figure 5 を参照)。これらの例は 16 ビッ トモードについての場合である。 受信バッファを制御する 2 種類の可能な方法として、ソフトウェア的な方 法と、「パケット送信」と呼ばれる自動的な方法とがある。これらはこの文章 のセクション 6.0 でより細かな議論がなされている。 CURR と BNDRY の初期化 (1) ソフトウェア的な方法の場合 CURR = START + 1 BNDRY = PSTART Next_PKT = PSTART + 1 (2) 「パケット送信」の場合 CURR = BNDRY = Next_PKT = PSTART (「Next_PKT」は先のセクション 6.0 で詳しく述べられている、ソフト的に定 義される変数である) 物理アドレスレジスタの設定 初期化をする間、NIC コアの物理アドレスレジスタにはアダプタのイーサネッ トアドレスが読み込まれる(AT/LANTIC データシートのセクション 5.3 を参照)。 それぞれのアダプタにはネットワーク上での識別子としてユニークな 6 バイ トのアドレスが与えられている。イーサネットアドレスは AT/LANTIC 内の PROM に保持されている。その情報の取得方法は、AT/LANTIC がおかれている アーキテクチャモードに依存する。共有メモリモードでは、イーサネットアド レスはレジスタオフセット 08H〜0DH までに保持されている(Figure 3 を参照)。 I/O モードでは、アドレスは RAM の始めの 3 ワードに保持されている。した がって、リモート DMA リードがその情報の取得に必要となる(セクション 4.1.2 を参照)。 マルチキャストレジスタの設定 ネットワークステーションが、自身の物理ノードアドレスとは違った転送先 からのパケットの受信を許可するために、これらの転送先アドレスのリストを 持つことが必要となる。受信のためのアドレスのグループは、マルチキャスト アドレスとして参照される。AT/LANTIC は受信のためのアドレスをデコードす るための 8 つのマルチキャストアドレスレジスタ(MAR0-7)をもつために、こ のデバイスはすべてのアドレスを保持することはできない。これらのマルチキャ ストレジスタには、CRC ロジックによってハッシュ化されたマルチキャストア ドレスのフィルタが提供される。すべての転送先アドレスは CRC ロジックを 通して送り出され、また転送先アドレスの最終ビットは CRC に組み込まれ、 CRC ジェネレータの 6 MSB は固定される(訳注:このあたりはよく理解できな い)。これら 6 ビットはその後、マルチキャストアドレスレジスタ内のユニー クなフィルタービット(FB0-63)インデックス化するのに用いられる。ソフトウェ アデベロッパが特別なマルチキャストアドレスを受け入れたいとした時、上記 の処理の流れはマルチキャストレジスタ内のフィルタビットを設定すべきかを 決定してから行わなければならない。それぞれのビットは、それぞれのマルチ キャストアドレスを受け入れるかどうかを設定する。このために必要な処理の 擬似コードによる例を以下に示す。 // NIC の CRC equn が 16 ビットの環境(訳注:equn が何を意味するかが不明) define CRC_POLYNOMIAL 04C11DB6H // マルチキャストアドレスを 6 バイトの配列に保持する unsigned char mult_addr[6]; crc = FFFFFFFFH; // 以下のループで 32 ビット CRC の値を作成する for (i = 0; i < 6; i ++) { // バイトデータ中のそれぞれのビットがループを通る for (bit = 0; bit < 8; bit ++) { carry=(crc31)^((mult_addr[i] & (1 << bit)) >> bit); crc <<= 1; if (carry) crc = ((crc^CRC_POLYNOMINAL) | carry); } } // CRC の値の中から 6 つの MSB を展開する。この 6 ビットの値はユニーク // なフィルタービットのインデックス化に用いられる index >>= 26; index &= 3FH // マルチキャストレジスタの数とそのレジスタが設定されているビットを調 // べる register_no = crc >> 3; register_bit = 1 << (crc & 7); // 新しいレジスタの値を計算する value = READ(MAR[register_no]) | register_bit; // マルチキャストアドレスレジスタ(MAR)の値を設定する WRITE(MAR[register_no], value); ケーブルのチェック AT/LANTIC デバイスには選択可能な 4 つのメディアタイプがある。 TPI(10BT) と TPI(ノンスペック)モードでは、コンフィギュレーションレジス タ B の GDLINK ビットを、単純にケーブル状態を示すために用いる。良好な 「シン」イーサネットケーブルのためのテストでは、より多くを必要とする。 この後に、何が必要かを説明する仮想コードを示す。シックイーサネットケー ブルは、AT/LANTIC データシートのセクション 6.5 で説明されているレベル 3 ループバックの実行によってチェックできる。しかしながら、このテストで は、アクティブでないネットワーク上での動作しか保証できない。すなわち、 テストを行う間、ネットワーク上にデータはまったく出て行かない。 // 初期化はすでに行われていると仮定する thin_cable_check() { // 転送のためのケーブルチェックパケットを設定する。転送先アドレスは、 // 他のネットワークにこのパケットが届くことを避けるために、転送元アド // レスと同じにしておく必要がある。データフィールドは開発者の選択の範 // 囲にある。 packet = set_up_cable_pkt(); length = size of (packet); // 転送バイト数カウントレジスタの設定 WRITE(TBCR0, length_LSB); WRITE(TBCR1, length_MSB); // 割り込み状態レジスタのクリア WRITE(INTSTATUS, FFH); // 転送コマンドの発行 WRITE(CMND, (RD2 | STA | RXP)); // 割り込み状態レジスタを、パケットが転送されたことを示すかタイムアウ // トになるまで監視する while (time_in_loop < 1 second) { STATUS = READ(INTSTATUS); if (STATUS & (ISR_TXE | ISR_PTX) break; update--time--in--loop(); Short_Delay(); } // もし、処理がタイムアウトしたら転送は失敗 if (time_in_loop > 1 second) return(NO_CABLE); // 転送状態レジスタを読む TSR_value = READ(TSR); // 過度のパケットの衝突が発生しているかチェック if (TSR_value & ABT) return(UNTERMINATED); // 衝突が 1〜15 なら、ケーブルの状態は良い if (TSR_value & COL) return(CABLE_OK); // 他の転送エラーのチェックを、衝突のチェックが終わってから行う。なぜ // なら、衝突が発生すると以下のビットの一部がエラーとしてセットされて // しまうからである。 if (TSR_value & (CDH | CRS | FU)) return(NO_CABLE); // ここまで処理が継続されれば、転送は行われている return(CABLE_OK); } 割り込み状態レジスタ(ISR)と転送状態レジスタ(TSR)に関するより細かな説 明は、AT/LANTIC データシートのセクション 5.2 に見つけることができる。 3.5 割り込みのチェック 割り込みが検知されたとき、割り込みハンドラが呼び出される。このハンド ラは、割り込みの原因としかるべき処理を行わなければならない。AT/LANTIC の場合は、割り込み状態レジスタに割り込みの原因の情報が提供されるように なっている。ハンドラは、テスト処理が実行される前に設定しておく必要があ る。 以下の擬似コードは、割り込みハンドラが呼び出され、ISR の PTX ビット がセットされたことを検知し、それから「パケット転送」フラグがセット/増 加された時に、必要となる割り込み処理のチェックをするものである。 // 初期化と ISR の設定は出来ているものとする Interrupt_check() { // 「パケット転送」フラグをクリアする packet_transmitted = 0; // 割り込み状態レジスタをクリアする WRITE(INTSTATUS, FFH); // 転送バイト数カウントレジスタをゼロにする WRITE(TBCR0, 0); WRITE(TBCR1, 0); // 転送コマンドを発行する WRITE(CMND, (RD2 | STA | TXP)); // この転送は、割り込みを発生させるために用いられる // ISR が呼び出され、パケット転送フラグがセットされるか、タイムアウト // が発生するまで繰り返す while (time_in_loop < 1 second) { if (packet_transmitted) return(Interrupt_OK); update_time_in_loop(); } return(Inttrupt_FAILED); } 3.6 ブート ROM のチェック 診断時において、ブート ROM がアダプタに存在することが判明した場合、 そのデータが破壊されていないかチェックすることができる。ROM のデータす べての合計は 0 と等しくなければならない。(1/2 k セグメント内での) ROM のサイズは、バイトオフセット 03H にて保持され、オフセット 00H と 01H はそれぞれ、値として 55H と AAH を保持していなければならない。 4.0 情報の送信 パケットの送信や受信の処理を行う前には、バッファ RAM にデータを一時 的にためておく、あるいは回収を行う必要がある。AT/LANTIC には、2 種類の 設定可能なアーキテクチャモードがあり、バッファ RAM に対する違ったアク セス方法を持っている。 4.1 I/O モード転送 I/O モードでは、AT/LANTIC の NIC コアは、バッファ RAM へ、あるいはバッ ファ RAM から DMA チャンネルの一つを用いて転送を行う。ソフトウェアは 転送量と、転送方向と、RAM セグメントの先頭アドレスに転送されるような設 定が行われる。DMA コントローラは、データ転送ポートとバッファ RAM の間 を、一度に 1 ワードあるいは 1 バイト通す。システムは常にこのポートを経 由して読み書きされる。データ転送ポートは I/O ベースオフセット 10H 〜 17H までにマッピングされる(これらのレジスタのどれもがデータ転送ポート として動作する)。DMA 転送をしている間、いかなる値もコマンドレジスタに 書き込まれないという点は重要である。 バスエラー状態 ISA バスの実装によっては、DMA 転送中にエラー状態の発生が起こり得る。 これはコンフィギュレーションレジスタ B 内の「BE」(バスエラー)ビットが セットされることで知らされる(このビットへ何かを書き込むことでリセット される)。AT/LANTIC はこの状態を正すための 2 種類の方法を提供している。 これらは、コンフィギュレーションレジスタ B 内の「IO16CON」ビット、また は「CHRDY」ビットのどちらかを設定することで実施される。このエラーの発 生する理由や対処についてのより細かな議論は、AT/LANTIC データシートのセ クション 6.7(「CHDRY の修正を伴った 16 ビット I/O サイクル」)を参照す るとよいだろう。 アダプタがネットワーク上で有効になる前に、このエラー状態のチェックを 実行することが推奨されている。このことは DMA の動作によって、BE ビット がセットされ、そしてその修正が実行されるかどうかによってチェックできる。 また、DMA 転送ごとの終わりにこのチェックを実行することによっても(エラー がすべての DMA 処理の間で発生しなければ)可能である。 4.1.1 DMA 書き込み処理 DMA 書き込み処理は一般的には、以下の例で挙げるようなパケットの転送バッ ファ内への転送に用いられる。 ... // 転送パケットを作成し、PC RAM 内のアドレスへのポインタを保持する packet = set_up_xmt_pkt(); Disable Interrupts; // パケット転送のために、リモート DMA アドレスへバッファ RAM アドレス // を書き出す WRITE(RSAR0, TPSR_LSB); WRITE(RSAR1, TPSR_MSB); // リモート DMA バイト数カウントレジスタへパケットの量を書き出す length = SIZEOF(packet); WRITE(RBCR0, length_LSB); WRITE(RBCR1, length_MSB); // リモート DMA 書き込みコマンドを発行する WRITE(CMND, (RD1 | STA)); // 全てのバイト/ワードが転送されるまでループする address = packet; for (loop through the transmit pkt) { value = counts of address; WRITE(DATA_POINT, value); increment address pointer; } // 最後の転送がメモリ内に置かれることが知らされるまで待たなければなら // ない。DMA 処理が完了する前のコマンドレジスタへのアクセスは、最後の // 転送を不正にし、重大なシステムエラーを引き起こす。 while (time_in_loop < 1 second) { status = READ(INTSTATUS); if (status & ISR_RDC) return(TRANSFER_OK); update_time_in_loop(); Short_Delay(); } Enable Interrupts; return(TRANSFER_FAILED); ... 4.1.2 DMA 読み込み処理 DMA 読み込み処理は、受信バッファ内からのパケットの除去に用いられる。 しかし、以下の例ではバッファ RAMから(初期化の際に必要となる)イーサネッ トアドレスを読み込んでいる。 ... // イーサネットアドレスを読み込み、PC RAM 空間を示すポインタを addr に // する Disable Interrupts; // リモート読み込みアドレスを 0 に設定する WRITE(RSAR0, 0); WRITE(RSAR1, 0); // リモート DMA バイト数カウンタを 0 に設定する WRITE(CMND, (RD0 | STA)); // 3 ワードあるいは 6 バイト、バス幅に合う量を読み出す for (loop 3 or 6 rimes) { contents of addr = READ(DATA_PORT); incriment address; { Enable Interrupts; return(TRANSFER_COMPLETED); ... 上の例では、頻繁にコマンドレジスタや割り込み状態レジスタ、そしてそれ らに関連するビットを参照している。これらのレジスタに関する詳細は AT/LANTIC データシートのセクション 5.3 に見ることができる。 データポートへのアクセスサイズは初期化処理で検知されたバスの幅に依存 する。しかし、16 ビットモードにおいては転送の長さがたとえデータポート からもしくはデータポートへの転送がワード幅であったとしても、バイトとし て設定されることに気をつけなければならない。 以下は非常に単純なデータポートへの転送ループのアセンブリ言語コマンド である。 インテル 286 プロセッサでの例 set cx to byte count; set es:di to pc RAM destination; set dx to DATA_PORT; set direction flag; rep insw/outsw 4.2 共有メモリ転送 共有メモリモードでは、バッファ RAM は PC RAM 空間の一部分に割り当て られる。バッファへのアクセスは PC アドレス空間のある一部分へのアクセス と同じ方法で行われる。バッファ RAM の現れる位置は、2 つの共有メモリ制 御レジスタによって制御される。これらのレジスタはまた、RAM バッファを有 効にする、あるいは無効にするのと同じように転送の量や幅を設定する。バッ ファ RAM はサイズを、16 kbyte あるいは 8 kbyte に設定でき(アダプタハー ドウェアによって決定される)、また CPU 転送幅も 8 bit あるいは 16 bit に(セクション 3.2 にあるように)できる。これらの設定は 2 つのレジスタビッ トによって制御される。コントロールレジスタ 2 の MEMW ビットはメモリの 幅を制御する。すなわち、コントロールレジスタの 8kbyte/16kbyte 設定と 8bit/16bit 設定は、転送が 8bit 幅か 16bit 幅であるかを制御する。もし、 転送が 16 bit 幅であれば、8bit/16bit 設定は転送の間だけセットされる。 また、コントロールレジスタ 1 の MEME ビットを用いることによって転送中 でない状態の時は、バッファ RAM を無効にすることも可能である。これは、 複数のアダプタを PC メモリマップ中の同一の RAM アドレスで使用すること を認めるものである。もし、複数のアダプタを同一の RAM アドレスで用いる のであれば、転送中でないときにはすべてのアダプタの RAM を無効にする必 要があることに注意しなければならない。もしひとつのアダプタだけを特定の RAM アドレスで使用することを認めるのであれば、メモリは初期化時に有効に することができる。もし、ソフトウェアが Ethercard Plus 16 アーキテクチャ と完全互換に開発されているのであれば、制御レジスタは読み込み可能とはなっ ていない。よって、転送中に MEME や 8bit/16bit の設定をトグル動作させる 時には、レジスタ内のアドレスビットの値を再計算するか、どこかに保存して おいた初期値を再度呼び出すかのどちらかが必要となる。 転送例 この例は、メモリを転送時の間のみ有効とし、16 ビット幅で転送を行う場 合についてのものである。 // 'Cntrl1' と 'Cntrl2' は初期化時の値を保存してある // バッファメモリを有効にする WRITE(CNTRL1, (cntrl1 | MEME)); // 16 ビット転送を有効にする WRITE(CNTRL2, (cntrl2 | 8/16)); // メモリ転送 MEMCOPY(PCaddr, BufferArrd, size); // バッファメモリを無効にする WRITE(CNTRL1, cntrl1); // 16 ビット転送を無効にする WRITE(CNTRL2, cntrl2); 以下は上の例の中にあるmemcopy() 関数を、単純で能率的な実装を提供する アセンブリ言語コマンドである。 インテル 286 プロセッサでの例 set cx to byte count; set es:di to pc RAM destination; set ds:si to pc RAM source; set direction flag; rep movsw 4.3 ブート ROM AT/LANTIC はブート ROM とフラッシュ PROMS の両方を標準でサポートして いる。設定レジスタ C によって、ROM を有効にする位置を制御する。ROM へ のアクセスはそれから、PC RAM へのあらゆるアクセスと同じようになる。 フラッシュ PROM の使用は、ソフトウェアによるアダプタの最新ドライバへ のブート ROM の更新、すなわち ROM の交換による最新リリースのソフトウェ アへの置き換えをしなくてもすむ、ということを認めるものである。フラッシュ PROM を更新するときには、設定レジスタ B の BPWR ビットを設定する必要が ある。ROM 領域への書き込みサイクルは、このビットが設定されているときの み許される。このビットが設定されたあと、そのソフトウェアは(PROM のデー タシートにあるような)フラッシュ PROM の設定アルゴリズムに続かなくては ならない。 5.0 転送処理 転送が要求される時には、パケット情報を置くための空きのあるバッファ (少なくともバッファ RAM 内に一つ以上の転送バッファ)が選択されている必 要がある。パケットは、その後セクション 4.0 で示したように、その場所へ 転送される。それから、パケットがまもなくネットワーク上に転送されはじめ ているかを見るためのチェックが要求される。もし、転送が行われている最中 であれば、それから転送が完了するまで、その新しいパケットのアドレスとサ イズをどこかの格納場所へ保持しなければならない。もし、転送が行われてい る最中であれば、それからそのパケットはネットワーク上へ、直接送信される。 このことを行うためには、は転送ページ開始レジスタと転送バイト数カウント レジスタに、パケットのアドレスと長さのそれぞれを設定する必要がある。こ れに続いて、転送コマンドがコマンドレジスタに対して発行される。転送中、 TPSR は変更できないことを覚えておくことは重要である。 転送の発行 ... // 実行中の転送は存在しないとする。新しいパケットは転送バッファアドレ // ス XMT_BUFFERx に保存されている。 WRITE(TPSR, XMT_BUFFERx_MSB); // 'length' に保持されている、パケットのバイトサイズを設定する。 WRITE(RBCR0, length_LSB); WRITE(RBCR1, length_MSB); // 転送コマンドを発行する WRITE(CMND, (RD2 | STA | TXP)); ... 5.1 転送状態チェック 一旦転送が終了すると、AT/LANTIC は割り込みを返す。それは、割り込みサー ビスルーチン(ISR)によって決定される処理であり、転送が成功したか失敗し たかとそれに然るべき扱いをするためのものである。もし転送が成功して完了 すれば、まだ他の転送が要求されているかどうかを調べるためのチェックが必 要となる。保存領域に保持されているものについての詳細は、前のパラグラフ に説明されている。 呼ばれた場合、ISR で割り込み状態レジスタをチェックしなければならない。 もし PTX ビットが設定されていれば、それはパケットがエラー無しで転送さ れ、転送が成功であることの合図を示している。もし TXE ビットが設定され ていれば、それはエラーが発生したことを示し、より多くの情報を必要とする。 この特別な情報は転送状態レジスタ(TSR)によって、転送がエラーを伴って完 了したことを示す前に更新された、適切なエラーフラグと統計カウンタから提 供される。もし、転送中に衝突が発生していれば、COL ビットと TSR ビット が設定され、発生した衝突の回数が衝突数レジスタ(NCR)に保持される。ソフ トウェアは、ネットワーク上で発生する衝突の量についての統計量を維持する ために、このレジスタを用いることが出来る。 6.0 受信処理 6.1 バッファリング パケットが受信されて行くにつれ、それらはバッファリング内に置かれ、ま たそれらが処理されるにつれ、リングから取り除かれる。初期化時に、受信バッ ファリングとして作用するためのメモリ領域が確保される。また、AT/LANTIC のメモリ管理体系は、そのメモリ操作によって制御される。 4 つのポインタが、そのリングの制御に用いられる。ページスタートポイン タ(PSTART)とページストップポインタ(PSTOP)はバッファリングのサイズを決 定し、カレントページレジスタ(CURR)はネットワークからの次のパケットがど こに書き込まれるかを決定し、境界ポインタ(BNDRY)は次のパケットがどこに 読み込まれ、処理されたものがどこに置かれるかを明らかにする。パケットが 受信されるにつれ、境界ポインタはリングの中を回りながらカレントページポ インタのあとに続く。処理中、ページスタートレジスタとページストップレジ スタは依然として変更されない。 受信バッファリングは 256 バイトのバッファ(「ページ」と呼ばれる)に分 割され、そしてそれらは受信パケットによって求められるように、お互いに連 結される。すべての AT/LANTIC レジスタはバイト幅なので、リングポインタ は Figure 10 にあるように、ページ境界(256 バイト)で参照される。 妥当な受信によって、パケットは、バッファリング内の CURR + 4 バイトオ フセット(Figure 11 参照)に示されるページに置かれる。完全なパケットが転 送されるまで、必要となるページバッファに連結されている AT/LANTIC を通 して、パケットはリングへ転送される。最初と最後のバッファ(PSTART と PSTOP)は、単に最初と 2 番目のバッファであるであろうものとして連結され る。受信の終わりには、受信状態レジスタ(RSR)からの状態と、次のパケット へのポインタと、現在のパケットのバイト数が 4 バイトオフセットのなかに 書き込まれる(Figure 12 参照)。 6.2 パケットの除去 一度パケットがバッファリング内に受信されると、それらは処理されなけれ ばならない。AT/LANTIC は、この文章のセクション 4.0 で議論されているよ うな、それぞれバッファメモリへのアクセス方法の違う、2 種類の異なるアダ プタアーキテクチャをサポートしている。パケットがバッファリングから取り 除かれるにあわせて、境界ポインタ(BNDRY)は更新されなければならない。リ ングを回るように、BNDRY の後には CURR が続いてゆく(Figure 13 を参照)。 処理が完了してしまうまでに現在のローカルな DMA アドレス(新しく受信さ れたパケットが置かれ始める場所)がいっぱいになり、そしてこれ以上受信デー タを記録できなくなることがある。この状態はオーバーフローとして知られる。 この状態についての詳細と、それを解決する方法についてはセクション 6.3 で得られる。 CURR ポインタと BNDRY ポインタが等しいとき、バッファリングは一杯か空 かのどちらかである。ソフトウェアがこの状態を確実に間違えないようにする ために、いかに示す方法でリングが空の時も BNDRY ポインタを CURR ポイン タより小さくならないように維持し、リングが一杯になったときのみ CURR と 等しくなるようにする。 1. バッファリングから取り除かれる次のパケットを示す変数(Next_pkt)を使 用する。 2. 初期化時に、次のように設定する (セクション 3.3 を参照) BNDRY = PSTART CURR = PSTART + 1 Next_pkt = PSTART + 1 3. パケットがリングから取り除かれたあと、ヘッダセクションにある次のパ ケットへのポインタ HNXTPKT (ヘッダの 2 番目のバイト値)を用い、設定する。 Next_pkt = HNXTPKT BNDRY = HNXTPKT if (BNDRY < PSTART) BNDRY = PSTOP - 1 パケット転送コマンド I/O モードの場合、受信バッファリングからの単一のパケットを転送するた めに、リモート DMA チャンネルは自動的に初期化される。転送は、コマンド レジスタに RD1 ビット、RD0 ビット、STA ビットを設定することで発行され る「パケット送信」コマンドによって開始される。DMA は BNDRY ポインタの 値に初期化され、またリモートバイト数カウントレジスタはそれぞれの受信パ ケットのバッファヘッダから得られる値に初期化される。データが転送された 後、BNDRY ポインタは進みリモート DMA はそれから次のパケットの受信のた めに準備される。 この方法は、ステップ 1-3 で述べられたようなレジスタの手動更新を必要 としない。しかしながら、ソフトウェアのパケットへのアクセスは、ただ一度 のみに制限される。 受信処理は、リングからデータを除去する準備が整っているか、オーバーフ ローが起きたときに AT/LANTIC が発生させる割り込みによって開始される。 割り込みサービス処理はその後、パケットが除去される準備が整っていること を示す PRX ビットか、バッファリングがあふれていることを示す OVW ビット が割り込み状態レジスタに設定されているかを問い合わせなければならない。 PRX ビットが設定されていた場合、上記の処理に続けて受信サブルーチンを呼 び出さなければならない。OVW ビットが設定されていた場合はセクション 6.3 で述べられているオーバーフロー処理を呼び出さなければならない。 受信バッファリングは、バッファの終点(PSTOP)と始点(PSTART)を繋ぎあわ せてリングとさせるようにした、連続した RAM 部分である。受信されたパケッ トのなかには、このバッファリング連結のなかで一部が重なったり、包み込ま れてしまったりするものもあるであろう。言い換えれば、パケットの開始位置 は PSTOP までで止められ、残りは PSTART から保持されるということである。 この状態は、I/O モードでは自動的に分けられる。しかし、共有メモリモード ではより注意が必要となる。共有メモリモードでは「包み込まれた」パケット はその 2 つの区分に転送される。すなわち、PSTOP までの区分と PSTART か らの区分である。 処理を行う擬似コードの例を以下に示す。 受信処理 Receive_subroutine() { // このルーチンはバッファリングに保持されているすべてのパケットが除去 // されるまで繰り返される while(Next_pkt is CURR) { // Next_pkt が示すパケットから 4 バイトのヘッダを読み出す。このデータ // 除去方法は AT/LANTIC の転送モードに依存する status = read_status(); // もし、共有メモリモードであればパケットが PSTOP ポインタを超えて先頭 // に回り込んでいる(原文:the packet wraps around the PSTOP pointer)か // どうかをチェックする if (in_share_memory_mode) { if (statu.length + Next_pkt > PSTOP) { transfer_up_to_PSTOP(); transfer_from_PSTART(); } else transfer_all_at_once(); } else // I/O モードでは自動的に回り込んで転送される transfer_all_once(); // Next_pkt ポインタをステータスバイト内にある次のパケットへのポインタ // に設定する Next_pkt = status.next_packet; // 境界ポインタの値を更新する BNDRY = Next_pkt - 1; if (BNDRY < PSTART) BNDRY = PSTOP - 1; WRITE(BNDRY); } // while ループの終わり } 6.3 オーバーフローの取り扱い 負荷の高いネットワークでは、まだ処理要求のあるパケットが残っているに も関わらず受信バッファリングが一杯になってしまう、すなわち CURR ポイン タが BNDRY ポインタに追いついてしまうということがある。この事態が発生 した場合、AT/LANTIC はこれ以上の受信を中断して、オーバーフロー割り込み (OVW)を発行する。 オーバーフロー状態が発生している中では、以下に示す処理に続かなければ ならない。この処理を忠実に実行しなかった場合、AT/LANTIC は予期できない 振る舞いをするだろう。この処理のフローチャートを Figure 8 に示す。 注意:"Resend" と呼ばれる変数がドライバ内で定義されている必要がある。 1. AT/LANTIC コントローラのコマンドレジスタ内の TXP ビットの値を読み込 み、保存する。 2. AT/LANTIC コントローラに対し、STOP コマンドを発行する。これは、 AT/LANTIC コントローラのコマンドレジスタ内の STP ビットと RD2 ビットを 設定することによって達成される。 3. 最低 1.6 ミリ秒以上のウェイトをいれる。AT/LANTIC コントローラが、す べての実行中の送信あるいは受信を完了するまで、最大限取り得るイーサネッ ト送信/受信所要時間を待つ必要がある。1.6 ミリ秒待つことによって、帯域 への追加に対する保護を伴って、送受信は完了する(原文:this is achieved with some guard band added.)。未解決の送受信の完了に対する保険として、 前もって割り込み状態レジスタの RSB ビットをポーリングすることが推奨さ れる。このビットは信用できる指針ではなく、あとで無視する必要がある。 4. AT/LANTIC コントローラのリモートバイト数カウントレジスタ(RBCR0 と RBCR1)をクリアする。 5. 前のステップ 1 で保存しておいた TXP ビットの値を読む。 この値が 0 であった場合、"Resend" 変数に 0 を設定し、ステップ 6 へ進 む。 値が 1 だった場合は、AT/LANTIC コントローラの割り込み状態レジスタの 値を読む。そこのパケット転送ビット(PTX)と転送エラービット(TXE)のどちら かが 1 だったら、"Resend" 変数に 0 を設定し、ステップ 6 へ進む。どちら のビットもセットされていなかったら、"Resend" 変数の値を 1 に設定し、ス テップ 6 へ進む。 このステップでは、ステップ 2 での STOP コマンドが発行されたときに、 転送が実行中であったかどうかを決定する。転送中だった場合、AT/LANTIC に よってパケットの転送を行うかどうかを決定するために、AT/LANTIC コントロー ラの ISR は読み出される。PTX と TXE のどちらも設定されていなければ、パ ケットは本質的にロストされざるをえない。パケットがロストしてしまった場 合は、(ステップ 11 で示される)オーバーフロー処理が完了してからすぐに、 AT/LANTIC に対して転送コマンドが再発行される。また、ネットワークの過負 荷によって中断された時は、AT/LANTIC に対して即座に中止させることが出来 る。ステップ 5 はまた、この問題をある程度緩和する。ステップ 5 は、 AT/LANTIC コントローラを適切に正しく扱う上で、オーバーフローから除外さ せることは本質的にできない。 6. AT/LANTIC コントローラをループバックモード 1 または 2 のどちらかに する。このことは、転送設定レジスタの D2 ビットと D1 ビットを、それぞれ 0, 1 あるいは 1, 0 に設定することで行える。これ以上のループバックの説 明は、AT/LANTIC データシートのセクション 6.5 に見ることが出来る。 7. AT/LANTIC コントローラに START コマンドを発行する。このことは、コマ ンドレジスタの START ビットと RD2 ビットを設定することで行える。これは、 AT/LANTIC コントローラのリモート DMA チャンネルをアクティブにするため に必要である。 8. 受信バッファリングから、一つ以上のパケットを除去する。 9. 割り込み状態レジスタの、上書き警告ビット(OVW、オーバーフロー)をリセッ トする。 10. AT/LANTIC のループバックモードを解除する。これは、転送設定レジスタ に、通常状態の時に自身が保持する値(D2 ビットと D1 ビットの両方が 0 と なるであろう)を書き込むことによってなされる。 11. "Resend" 変数が 1 に設定されていれば、"Resend" 変数をリセットして、 転送コマンドを再発行する。これは、コマンドレジスタの TXP ビットを設定 することでなされる。"Resend" 変数が 0 であれば、すべきことは何もない。 注意:リモート DMA が使用されない場合、AT/LANTIC コントローラは受信バッ ファリングからパケットが取り除かれる前に開始される必要はない。先に、ス テップ 8 がステップ 7 の前に行われなければならず、ステップ 5 の時間稼 ぎは排除するか、短くする。 注意:AT/LANTIC コントローラが STOP モードのとき、ミスパケット記録カウ ンタは無効となる。