Написать специальный драйвер PCIe hotplug для Linux 2.6.x - PullRequest
1 голос
/ 25 июня 2009

Я пишу драйвер / модуль PCIe для нестандартного устройства. Поскольку устройство поддерживает горячую замену, оно может исчезнуть в любое время.

Вот как я настраиваю структуру 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, а затем правильно удалить устройство из моего драйвера?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2009

Поскольку оборудование удалено, это не значит, что ваш драйвер удален. Так что вам нужно знать, есть ваше оборудование или нет.

Тогда вы должны завершить все запущенные транзакции. Это означает, что какую бы операцию вы ни выполняли в своих файловых операциях, она должна в какой-то момент завершиться и вернуться с кодом ошибки, чтобы вы могли вернуться к коду пользователя. Для USB-устройств есть функция, которая делает это за вас.

Код пространства пользователя может выполнять чтение / запись / ioctl после того, как ваше устройство было удалено. Эти системные вызовы знают, что аппаратного обеспечения больше нет, поэтому они должны вернуть код ошибки.

Любое вменяемое приложение затем закроет или закроет соответствующий файловый дескриптор. Так что пересчет должен происходить в методе open / release. Какой бы ресурс вы ни выделили, они могут существовать и после удаления вашего устройства.

0 голосов
/ 25 июня 2009

Это очень широкий вопрос. Вы должны создать свой код так, чтобы он поддерживал удаление устройства. Вы можете взять пример с любого USB-драйвера / usr / src / linux / drivers / usb / ..., который по своей природе является съемным.

Ответ на комментарий:
Нет, USB-подсистема не отвечает за синхронизацию в вашем драйвере. Существует множество способов синхронизировать счетчик ссылок, вы можете использовать блокированную операцию или спин-блокировку или ...
Есть хороший документ , описывающий примитивы синхронизации в Windows, терминология немного другая, но концепции совпадают, поэтому я рекомендую.

...