2.7.7.2.3. info()
Функция info() возвращает указатель на статическую область, содержащую описание драйвера низкого уровня. Это описание содержится в переменной-указателе name и выводится во время загрузки.
2.7.7.2.4. queuecommand()
Функция queuecommand() осуществляет запуск команды SCSI адаптером, затем завершает работу. По завершению команды вызывается функция done() с указателем на структуру Scsi_Cmnd в качестве параметра. Это позволяет команде SCSI запуститься в режиме прерывания. Перед завершением работы функция queuecommand() должна выполнить следующие операции:
Сохранить указатель на структуру Scsi_Cmnd.
Сохранить указатель на функцию done() в качестве поля Scsi_done() в структуре Scsi_Cmnd. См. раздел 2.7.7.2.5 для более подробной информации.
Установить специальные переменные в Scsi_Cmnd, требуемые драйвером.
Запустить команду SCSI. Для расширенных host-адаптеров это может быть простейшая засылка команды в "mailbox" host-адаптера. Для менее "мудрых" адаптеров используется сначала слово ARBITRATION.
Функция queuecommand() вызывается лишь в случае ненулевой переменной can_queue (см. 2.7.7.1.2). В ином случае для всех запросов используется функция command(). В случае успеха функция queuecommand() возвращает 0. (Высокоуровневый код SCSI игнорирует это возвращаемое значение).
2.7.7.2.5. done()
Функция done() вызывается после завершения команды SCSI. Единственный параметр, этой функции - указатель на структуру Scsi_Cmnd, используемую прежде функцией queuecommand(). Перед вызовом функции done() должна быть правильно установлена переменная result. Она имеет тип 32-битного целого, каждый байт которого имеет свое значение:
Байт 0 - Содержит код SCSI STATUS, как описано в 2.7.2.1.
1 - Содерит SCSI MESSAGE, как описано в 2.7.2.1
2 - Содержит возвращаемый код host адаптера. Этим кодам присваивается значения в scsi.h:
DID_OK Ошибок не обнаружено
DID_NO_CONNECT SCSI SELECTION не может передаться из-за отсутствия устройства по указанному адресу.
DID_BUS_BUSY Ошибка SCSI ARBITRATION
DID_TIME_OUT Произошла приостановка работы процесса по неизвестной причине, возможно во время SELECTION или в ожидании RESELECTION.
DID_BAD_TARGET SCSI ID цели такой-же как ID адаптера
DID_ABORT Высоко-уровневый код вызывает низко-уровневую функцию abort().
DID_PARITY Ошибка SCSI PARITY
DID_ERROR Ошибка, не поддающаяся распознанию (к примеру ошибка самого адаптера)
DID_RESET Высоко-уровневый код вызывает низко-уровневую функцию reset()
DID_BAD_INTR Возникновение непредвиденного прерывания, которым не возожно управлять.
Возврат DID_BUS_BUSY будет пытаться запустить команду еще раз, в то время как DID_NO_CONNECT сбросит команду.
Байт 3 Этот байт предназначен для возвращения кода высокого уровня и устанавливается низким уровнем в 0.
В настоящий момент драйвера низкого уровня не описывают сообщения об ошибках, поэтому легче всего для вас найти их определения в scsi.c вместо того чтобы исследовать существующие драйвера.
[ Назад | Оглавление | Далее ]
|