2009-06-25 26 views
0

カスタムデバイスのPCIeドライバ/モジュールを作成しています。デバイスはホットプラグ可能なので、いつでも消える可能性があります。カスタムPCIeホットプラグLinux 2.6.xドライバを作成

ここではどのようにpci_driver構造まで私のセットアップ:

struct pci_driver my_pci_driver = { 
    .name = "my_pci_driver", 
    .id_table = ids, 
    .probe = "my_pci_driver_probe", 
    .remove = "my_pci_driver_remove" 
}; 

しかし、私は正しく削除イベントを処理する方法がわかりません。 .remove関数が呼び出されたとき、私はドライバで開かれ、いくつかのioctlを実行するいくつかのプロセスを持っています。

したがって、デバイスの取り外しを正しく処理する方法は何ですか?現在実行中のioctlが終了し、ドライバからデバイスを適切に削除するのを安全に待つ方法はありますか?

答えて

0

これは非常に広い質問です。デバイスの削除をサポートする方法でコードを設計する必要があります。あなたは本質的に取り外し可能な任意のusbドライバ/ usr/src/linux/drivers/usb/...から例を取ることができます。

コメントレスポンス:
いいえ、USBサブシステムはドライバの同期化に責任を負いません。 インターロックされた操作を使用したり、スピンロックを使用したりすることができます。
Windows上で同期プリミティブを記述すると良いですが、用語は少し異なりますが、概念は同じです。私はお勧め。

+0

これは私がしたことですが、ドライバではなくカーネルのUSB層で処理されると思います。私の最初の考えは、ioctl()で扱うオブジェクトの参照カウンタを使うことでした。カウンターが0の場合は、開いているハンドルでは使用されず、デバイスを安全に取り外すことができます。しかし、私は、参照カウンタが0(逆セマフォの一種、その値が0に等しくないまでロックするもの)になるのを適切に待つ方法を見つけられませんでした。 –

0

ハードウェアが削除されても、ドライバが削除されたわけではありません。ハードウェアがあるかどうかを知る必要があります。

実行中のトランザクションをすべて終了する必要があります。これは、ファイル操作で何をしていても、何らかの時点で終了し、エラーコードとともに返され、ユーザーコードに戻ることができることを意味します。 USBデバイスの場合、これを行う機能があります。

ユーザスペースコードは、デバイスが取り外された後に読み書き/ ioctlを実行できます。これらのシステムコールはハードウェアがもう存在しないことを知っているので、エラーコードを返すべきです。

すべての正常なアプリケーションは、対応するファイルディスクリプタを終了または終了します。したがって、オープン/リリース方式でリフカウンティングを行う必要があります。割り当てられたリソースはすべて、デバイスが削除された後でも存在します。

関連する問題