EN JA
UTOPIA(9)
UTOPIA(9) FreeBSD Kernel Developer's Manual UTOPIA(9)

名称

utopiaATM PHY チップのためのドライバモジュール

書式

#include < dev/utopia/utopia.h>

int
utopia_attach( struct utopia *utp, struct ifatm *ifatm, struct ifmedia *media, struct mtx *lock, struct sysctl_ctx_list *ctx, struct sysctl_oid_list *tree, const struct utopia_methods *vtab);

void
utopia_detach( struct utopia *utp);

int
utopia_start( struct utopia *utp);

void
utopia_stop( struct utopia *utp);

void
utopia_init_media( struct utopia *utp);

void
utopia_reset_media( struct utopia *utp);

int
utopia_reset( struct utopia *utp);

int
utopia_set_sdh( struct utopia *utp, int sdh);

int
utopia_set_unass( struct utopia *utp, int unass);

int
utopia_set_noscramb( struct utopia *utp, int noscramb);

int
utopia_update_carrier( struct utopia *utp);

int
utopia_set_loopback( struct utopia *utp, u_int mode);

void
utopia_intr( struct utopia *utp);

void
utopia_update_stats( struct utopia *utp);

解説

このモジュールは、一貫した機能性を提供するために多くの知られている PHY チップを使用するカードのためのすべての ATM ドライバによって使用されます。モジュールは、割り込みかポーリングモードでの状態のモニタ、メディアオプションの取り扱い、と PHY レジスタへのアプリケーションアクセスを実装します。

このインタフェースを使用するために、ドライバは、PHY レジスタの読み込みと書き込みのための 2 つの関数を実装し、これらの関数へのポインタで次の構造体を初期化しなければなりません:

struct utopia_methods { 
 int (*readregs)(struct ifatm *, u_int reg, 
      uint8_t *val, u_int *n); 
 int (*writereg)(struct ifatm *, u_int reg, 
      u_int mask, u_int val); 
};

readregs() 関数は、レジスタ reg で始まる PHY レジスタを読み込むべきです。読み込むレジスタの最大数は、 n によって指された整数によって与えられます。関数は成功すれば 0、またはエラーコードを返すべきです。前者の場合、 *n は読み込まれたレジスタの実際の数に設定されるべきです。 writereg() 関数は 1 つのレジスタを書き込みべきです。それは、 val の対応するビットの値のために mask の対応するビットが 1 であるすべてのビット変更しなければなりません。それは成功すれば 0、またはエラーコードを返します。

ATM ドライバのプライベート状態ブロック ( softc) は struct ifatm で始まらなければなりません。

struct utopia は、PHY チップの現在の状態を保持して、次のフィールドを含んでいます:

struct utopia { 
 struct ifatm *ifatm;  /* ドライバデータ */ 
 struct ifmedia *media;  /* ドライバで供給される */ 
 struct mtx *lock;  /* ドライバで供給される */ 
 const struct utopia_methods *methods; 
 LIST_ENTRY(utopia) link; /* これらの構造体のリスト */ 
 u_int  flags;  /* ドライバで設定されるフラグ */ 
 u_int  state;  /* 現在の状態 */ 
 u_int  carrier; /* キャリア状態 */ 
 u_int  loopback; /* ループバックモード */ 
 const struct utopia_chip *chip; /* チップ操作 */ 
 struct utopia_stats1 stats; /* 統計 */ 
};

パブリックにアクセス可能なフィールドには、次の働きがあります:

ifatm
ドライバのプライベートデータ ( softc) へのポインタ。
media
ドライバのメディア構造体へのポインタ。
lock
ドライバによって提供されたミューテックスへのポインタ。このミューテックスは、デバイスのポーリングを取り扱うカーネルスレッドに同期するために使用されます。それは、方々でロックされます:
  1. utopia_detach() では、ミューテックスは、スリープするため、およびすべての utopia デバイスのリストから struct utopia を取り除くためにカーネルスレッドをウェートするためにロックされます。呼び出し側に返える前に、ミューテックスはアンロックされます。
  2. utopia カーネルスレッドでは、ミューテックスはロックされ、 utopia_carrier_update() 関数は、このロックされたミューテックスで呼び出されます。これはロックされたミューテックスで呼び出されるドライバの readregs() 関数での結果となります。
  3. sysctl ハンドラでは、ミューテックスは、ドライバの readreg() または writereg() 関数への呼び出しの前にロックされます。
flags
フラグはドライバまたは utopia モジュールのどちらかによって設定します。次のフラグが定義されます:
UTP_FL_NORESET
このフラグが設定されるなら、モジュールは SUNI マスタリセットレジスタを書き込もうとしません。 (ドライバで設定します。)
UTP_FL_POLL_CARRIER
このフラグが設定されるなら、モジュールは、(割り込み駆動キャリア状態の変化とは対象的に) 定期的にキャリア状態をポーリングします。 (ドライバで設定します。)
state
PHY チップの現在の状態を説明するフラグ。これらはモジュールによって管理されます:
UTP_ST_ACTIVE
ドライバはアクティブで、PHY レジスタをアクセスすることができます。 (レジスタがいつでも、またはインタフェースがアップしているときのみ、アクセス可能であるかどうかによって) ドライバのアタッチルーチンか、またはネットワークインタフェース初期化処理ルーチンのいずれかで呼び出されるべきである、 utopia_start() を呼び出すことによってこれは設定されます。
UTP_ST_SDH
インタフェースは SONET モードとは対照的に SDH モードです。
UTP_ST_UNASS
インタフェースはアイドルセルの代わりに割り当てられなかったセルを作り出します。
UTP_ST_NOSCRAMB
セルのスクランブルはオフに切替えられます。
UTP_ST_DETACH
(内部使用。) インタフェースは現在デタッチされています。
UTP_ST_ATTACHED
アタッチルーチンは成功して実行されました。
carrier
インタフェースのキャリア状態。このフィールドは次の 3 つの値の 1 つを持つことができます:
UTP_CARR_UNKNOWN
キャリア状態はまだ未知です。
UTP_CARR_OK
キャリアは検出されました。
UTP_CARR_LOST
キャリアは失われました。
loopback
これはインタフェースの現在のループバックモードです。すべてのチップが、すべてのループバックモードをサポートするというわけではないことに注意してください。チップの文書を参照してください。次のモードがサポートされます:
UTP_LOOP_NONE
ループバックがない、通常の操作。
UTP_LOOP_TIME
タイミングソースループバック。送信クロックは受信クロックによって駆動されます。
UTP_LOOP_DIAG
診断ループバック。
UTP_LOOP_LINE
シリアルラインループバック。
UTP_LOOP_PARAL
パラレル診断ループバック。
UTP_LOOP_TWIST
ツイストペア診断ループバック。
UTP_LOOP_PATH
診断パスループバック。
chip
これはチップ特有の関数のための関数ベクトルを指します。このベクトルの 2 つのフィールドがパブリックに利用可能です:
type
これは検出された PHY チップのタイプです。次の 1 つです:

UTP_TYPE_UNKNOWN (0)
UTP_TYPE_SUNI_LITE (1)
UTP_TYPE_SUNI_ULTRA (2)
UTP_TYPE_SUNI_622 (3)
UTP_TYPE_IDT77105 (4)
name
これは PHY チップの名前がある文字列です。

次の関数は、インタフェースのアタッチ/デタッチ、および/または、初期化処理/停止の間にドライバによって使用されます。

utopia_attach()
PHY チップをアタッチします。これは、(ドライバの softc の一部である) 前もって割り付けられた struct utopia で呼び出されます。モジュールは utopia 状態のすべてのフィールドとメディアフィールドを初期化します。ユーザ設定可能なフラグは、 utopia_attach() への呼び出しの後に設定されるべきです。この関数は sysctl ハンドラをインストール不能のために失敗するかもしれません。この場合、それは-1 を返します。成功すれば、0 が返えされ、 UTP_ST_ATTACHED フラグが設定されます。
utopia_detach()
システムから utopia アタッチメントを取り除きます。これはすべての未解決のポーリングタイムアウトを取り消します。
utopia_start()
その PHY の操業を開始します。これは、PHY レジスタがアクセス可能であると知られているときと同時に呼び出されるべきです。これはドライバのアタッチ関数またはインタフェースが実行を設定されるとき、のいずれかとなります。
utopia_stop()
PHY アタッチメントの操作を停止します。これはドライバのデタッチ関数またはインタフェースが停止されるとき、のいずれかとなります。
utopia_init_media()
これは、ATM MIB のメディアフィールドが変更されたなら、呼び出されなければなりません。関数は、ifmedia フィールドが ATM MIB と同じ情報を含んでいることをよく確かめます。
utopia_reset_media()
これは、ifmedia フィールドからすべてのメディア情報を取り除くために呼び出されます。

次の関数は、インタフェースが実行している間に PHY 状態を変更するために使用することができます:

utopia_reset()
デフォルト状態 (SONET、アイドルセル、スクランブルを有効) への操作上のパラメータをリセットします。成功すれば 0 を返し、そうでなければ、状態を未定義のままにして、エラーコードを返します。
utopia_set_sdh()
引数が 0 であるなら、チップは Sonet モードに切り換えられ、それが 0 でなければ、チップは SDH モードに切り換えられます。成功すれば 0 を返し、そうでなければ、前の状態を残して、エラーコードを返します。
utopia_set_unass()
引数が 0 であるなら、チップはアイドルセルを作り出すために切り換えられ、それが 0 でなければ、チップはセルが割り当てられなかったセルを作り出すために切り換えられます。成功すれば 0 を返し、そうでなければ、前の状態を残して、エラーコードを返します。
utopia_set_noscramb()
引数が 0 であるなら、スクランブルを有効にし、それが 0 でなければ、スクランブルを無効にします。成功すれば 0 を返し、そうでなければ、前の状態を残して、エラーコードを返します。
utopia_update_carrier()
キャリア状態をチェックし、状態の構造体のキャリアフィールドを更新します。キャリア状態が変化するなら、これは Netgraph スタックへのメッセージを生成します。ポーリングされるチップに関しては、これは自動的に呼び出され、割り込み駆動アタッチメントに関しては、これは、PHY チップからの割り込みで呼び出されなければなりません。
utopia_set_loopback()
チップのループバックモードを設定します。成功すれば 0 を返し、そうでなければ、前の状態を残して、エラーコードを返します。
utopia_intr()
PHY チップからの割り込みが検出されるとき、呼び出されます。これは、すべてのレジスタを読み込むことによって割り込み状態をリセットし、割り込みが RSOP からであるなら、キャリア状態をチェックします。
utopia_update_stats()
チップから読み込まれるカウンタで統計を更新します。

関連項目

utopia(4)

作者

Harti Brandt <harti@FreeBSD.org>
May 8, 2003 FreeBSD