Controlador de dispositivo SCSI de tmscsi
Finalidad
Da soporte a las comunicaciones de procesador a procesador a través del controlador de dispositivo de modalidad de destino SCSI.
Sintaxis
#include </usr/include/sys/devinfo.h>
#include </usr/include/sys/tmscsi.h>
#include </usr/include/sys/scsi.h>Descripción
El controlador de dispositivo de modalidad de destino SCSI (Small Computer Systems Interface) proporciona una interfaz para permitir la transferencia de datos de procesador a procesador utilizando el mandato SCSI enviar . Este controlador de dispositivo único maneja los roles de modalidad de iniciador SCSI y de modalidad de destino SCSI.
El usuario accede a las funciones de transferencia de datos a través de los archivos especiales /dev/tmscsi0.xx, /dev/tmscsi1.xx, .... Todos estos son archivos especiales de caracteres. xx puede ser im, interfaz de modalidad de iniciador o tm, interfaz de modalidad de destino. La interfaz de modalidad de iniciador la utiliza el llamante para transmitir datos y la interfaz de modalidad de destino se utiliza para recibir datos.
El bit menos significativo del número de dispositivo menor indica al controlador de dispositivo qué interfaz de modalidad está seleccionada por el llamante. Cuando el bit menos significativo del número de dispositivo menor se establece en un valor de 1, se selecciona la interfaz de modalidad de destino. Cuando el bit menos significativo se establece en un valor de 0, se selecciona la interfaz de modalidad de iniciador. Por ejemplo, tmscsi0.im debe definirse como un número de dispositivo menor incluso numerado para seleccionar la interfaz de modalidad de iniciador, y tmscsi0.tm debe definirse como un número de dispositivo menor numerado por odd para seleccionar la interfaz de modalidad de destino.
Cuando el llamante abre el archivo especial de modalidad de iniciador, se establece una vía de acceso lógica que permite la transmisión de datos. El interlocutor en modalidad de usuario emite una llamada al sistema Escribir, writev, Artículoo writevx para iniciar la transmisión de datos. El usuario en modalidad de kernel emite una llamada de servicio fp_write o fp_rwuio para iniciar la transmisión de datos. A continuación, el controlador de dispositivo de modalidad de destino SCSI crea un mandato SCSI enviar para describir la transferencia y los datos se envían al dispositivo. Una vez que vuelva el punto de entrada de escritura, el programa de llamada puede acceder al almacenamiento intermedio de transmisión.
Cuando el llamante abre el archivo especial de modalidad de destino, se establece una vía de acceso lógica que permite recibir datos. El interlocutor en modalidad de usuario emite una llamada al sistema leer, readv, readxo readvx para iniciar la recepción de datos. El interlocutor en modalidad de kernel emite una llamada de servicio fp_read o fp_rwuio para iniciar la recepción de datos. A continuación, el controlador de dispositivo de modalidad de destino SCSI devuelve datos recibidos para la aplicación.
El controlador de dispositivo de modalidad de destino SCSI permite el acceso como dispositivo de modalidad de iniciador a través del punto de entrada Escribir . El acceso de dispositivo de modalidad de destino se realiza a través del punto de entrada leer . El acceso simultáneo a los puntos de entrada leer y Escribir es posible utilizando dos procesos distintos, uno que ejecuta subrutinas leer y las otras subrutinas Escribir en ejecución.
El controlador de dispositivo de modalidad de destino SCSI no implementa ningún protocolo para gestionar el envío y recepción de datos, con la excepción de intentar impedir una aplicación del uso excesivo de almacenamiento intermedio de datos recibidos. Cualquier protocolo necesario para mantener o gestionar de otro modo las comunicaciones de datos debe implementarse en el programa de llamada. Los únicos retrasos en el envío o recepción de datos a través del controlador de dispositivo de modalidad de destino son los inherentes al entorno del controlador de hardware y software.
Información de configuración
Cuando se configura el archivo especial tmscsi0 , se crean los archivos especiales tmscsi0.im y tmscsi0.tm . Debe existir un par iniciador-mode/destino-modo para cada instancia de dispositivo, incluso si sólo se está utilizando una de las modalidades. El ID de SCSI de modalidad de destino para un dispositivo conectado debe ser el mismo que el ID de SCSI de modalidad de iniciador, pero el número de unidad lógica (LUN) se ignora en la modalidad de destino, porque el adaptador SCSI de host sólo puede responder como LUN 0.
Si se da soporte a varios LUN en el dispositivo iniciador conectado, se genera un par de archivos especiales tmscsin (donde n es la instancia de dispositivo) para cada combinación de ID/LUN SCSI. Los archivos especiales de modalidad de iniciador permiten el acceso simultáneo a las combinaciones de ID/LUN de SCSI asociadas. Sin embargo, sólo uno de los archivos especiales de modalidad de destino para este ID de SCSI se puede abrir a la vez. Esto se debe a que sólo se da soporte a un LUN 0 en el adaptador de host y sólo una conexión lógica puede estar utilizando activamente este ID a la vez. Si un archivo especial de modalidad de destino está abierto para un ID de SCSI determinado, los intentos de abrir otros archivos especiales de modalidad de destino para el mismo ID fallarán.
El punto de entrada de configuración del controlador de dispositivo de modalidad de destino sólo debe llamarse para el número de dispositivo de modalidad de iniciador. La rutina de configuración del controlador crea automáticamente los datos de configuración para el número menor de dispositivo de modalidad de destino basándose en los datos de modalidad de iniciador.
Subrutinas dependientes de dispositivo
El controlador de dispositivo de modalidad de destino da soporte a las subrutinas Abierto, cerrar, leer, Escribir, seleccionary ioctl .
Subrutina abierta
La subrutina Abierto asigna e inicializa las estructuras dependientes del dispositivo de destino o del iniciador. No se envían mandatos SCSI al dispositivo como resultado de la ejecución de la subrutina Abierto .
El iniciador SCSI o el dispositivo de modalidad de destino debe estar configurado y no se debe abrir para que funcione la subrutina Abierto . Para que el dispositivo de modalidad de iniciador se abra correctamente, su archivo especial debe abrirse sólo para escritura. Para que el dispositivo de modalidad de destino se abra correctamente, su archivo especial debe abrirse sólo para lectura.
Los posibles valores de retorno para la variable global errno incluyen:
| Valor | Descripción |
|---|---|
| FEAGA | Error en el servicio de kernel de bloqueo |
| EBUSY | Se ha intentado ejecutar una apertura para una instancia de dispositivo que ya está abierta. |
| EINVAL | Se ha intentado ejecutar una apertura para una instancia de dispositivo utilizando un distintivo de apertura incorrecto o el dispositivo aún no está configurado. |
| EIO | Se ha producido un error de E/S. |
| ENOMEM | El dispositivo SCSI carece de recursos de memoria. |
Subrutina
La subrutina cerrar desasigna recursos locales al controlador de dispositivo de destino para el dispositivo de destino o iniciador. No se envían mandatos SCSI al dispositivo como resultado de la ejecución de la subrutina cerrar . Los posibles valores de retorno para la variable global errno incluyen:
| Valor | Descripción |
|---|---|
| EINVAL | Se ha intentado ejecutar un cierre para una instancia de dispositivo que no está configurada. |
| EIO | Se ha producido un error de E/S. |
Subrutina read
La subrutina leer sólo está soportada para el dispositivo de modalidad de destino. La dispersión de datos está soportada a través de la subrutina readv o readvx de modalidad de usuario o la llamada de servicio fp_rwuio en modalidad de kernel. Si el leer la subrutina no tiene éxito, el valor de retorno se establece en un valor de retorno de-1 , y el errno La variable global se establece en el valor de retorno del controlador del dispositivo. Si el valor de retorno es diferente a-1 , entonces la lectura fue exitosa y el código de retorno indica la cantidad de bytes leídos. Este debe ser validado por el llamante. Los desplazamientos de archivos no son aplicables y, por lo tanto, se ignoran para las lecturas de modalidad de destino.
Los mandatos SCSI enviar proporcionan el límite para satisfacer las solicitudes de lectura. Si se reciben más datos en el mandato enviar del que se solicita en la operación leer actual, los datos solicitados se pasan al llamante y los datos restantes se retienen y se devuelven para la siguiente operación de leer para este dispositivo de destino. Si se reciben menos datos en el mandato enviar del que se solicita, se pasan los datos recibidos para la solicitud de lectura y el valor de retorno indica cuántos bytes se han leído.
Si no se ha recibido completamente un mandato enviar cuando se realiza una solicitud de lectura, los bloques de solicitud y las esperas de datos. Sin embargo, si el dispositivo de destino se abre con el conjunto de distintivos O_NDELAY , la lectura no se bloquea; se devuelve inmediatamente. Si no hay datos disponibles para la solicitud de lectura, el leer no es satisfactorio y la variable global errno se establece en FEAGA. Si hay datos disponibles, se devuelve y el valor de retorno indica el número de bytes recibidos. Esto es cierto incluso si el mandato enviar para estos datos no ha finalizado.
Si el programa de llamada desea romper una subrutina leer bloqueada, el programa puede generar una señal. El controlador de dispositivo de modalidad de destino recibe la señal y finaliza la subrutina leer actual con anomalía. A continuación, la variable global errno se establece en EINTR. La lectura vuelve con los datos que se han recibido, incluso si el mandato enviar no se ha completado. Si y cuando se reciben los datos restantes del mandato enviar , se pone en cola, a la espera de otra solicitud de lectura o de un cierre. Cuando el destino recibe la señal y se devuelve la lectura actual, se puede iniciar otra lectura o se puede cerrar el destino. Si la solicitud de lectura que el programa de llamada desea romper se completa antes de que se genere la señal, la lectura se completa normalmente y se ignora la señal.
El controlador de dispositivo de modalidad de destino intenta poner en cola los datos recibidos antes de las solicitudes de la aplicación. Un área de almacenamiento intermedio de lectura anticipada (cuya longitud está determinada por el producto de 4096 y el valor de atributo num_bufs en la base de datos de configuración) se utiliza para almacenar los datos en cola. A medida que el programa de aplicación ejecuta subrutinas leer , los datos en cola se copian en el almacenamiento intermedio de datos de aplicación y el espacio de almacenamiento intermedio de lectura anticipada vuelve a estar disponible para los datos recibidos. Si se produce un error al copiar los datos en el almacenamiento intermedio de datos del llamante, la lectura falla y la variable global errno se establece en EFAULT. Si las subrutinas leer no se ejecutan lo suficientemente rápido, de modo que casi todos los almacenamientos intermedios de lectura anticipada para el dispositivo se rellenan, la recepción de datos se retrasará hasta que la aplicación vuelva a ejecutar una subrutina leer . Cuando se libera suficiente área, la recepción de datos se restaura desde el dispositivo. Los datos pueden retrasarse, pero no se pierden ni se ignoran. Si se llenan casi todos los almacenamientos intermedios de lectura anticipada, se guarda la información de estado que indica esta condición. La aplicación puede consultar opcionalmente este estado a través de la operación TMIEVNT . Si la aplicación utiliza la operación opcional select/poll , puede recibir una notificación asíncrona de este y otros sucesos que afectan a la instancia de modalidad de destino.
El controlador de dispositivo de modalidad de destino sólo maneja los datos recibidos en su punto de entrada de lectura. Todos los demás mandatos SCSI enviados por iniciador se manejan sin intervención del controlador de dispositivo de modalidad de destino. Esto también significa que el controlador de dispositivo de modalidad de destino no genera directamente ningún dato de detección SCSI o estado SCSI.
El punto de entrada de lectura puede utilizarse opcionalmente junto con el punto de entrada de selección para proporcionar un medio de notificación asíncrona de datos recibidos en uno o más dispositivos de destino.
Los posibles valores de retorno para la variable global errno incluyen:
| Valor | Descripción |
|---|---|
| FEAGA | Indica que una solicitud de lectura no de bloqueo se habría bloqueado, porque no hay datos disponibles. |
| EFAULT | Se ha producido un error al copiar datos en el almacenamiento intermedio del llamante. |
| EINTR | Interrumpido por una señal. |
| EINVAL | Se ha intentado ejecutar un leer para una instancia de dispositivo que no está configurada, no está abierta o no es un número de dispositivo menor de modalidad de destino. |
| EIO | Se ha producido un error de E/S. |
Subrutina de escritura
El punto de entrada de grabación sólo está soportado para el controlador de dispositivo de modalidad de iniciador. El punto de entrada de grabación genera un único mandato SCSI enviar en respuesta a una solicitud de grabación del programa de llamada. Si la solicitud de grabación es para una longitud mayor que la longitud máxima de transferencia del adaptador SCSI de host o si la solicitud no se puede fijar como una solicitud única, la solicitud Escribir falla con la variable global errno establecida en EINVAL. El tamaño máximo de transferencia para este dispositivo se descubre emitiendo una llamada IOCINFO ioctl al controlador de dispositivo de modalidad de destino.
Algunos adaptadores con capacidad de modalidad de destino soportan la recopilación de datos de grabaciones a través de la subrutina Writev user_mode o writevx o la llamada de servicio fp_wruio en modalidad de kernel. Los almacenamientos intermedios de grabación se recopilan para que se transfieran, en orden, como un único mandato de enviar . El controlador de dispositivo de modalidad de destino pasa información al controlador de dispositivo de adaptador SCSI para permitirle realizar la grabación recopilada. Puesto que el controlador de dispositivo de adaptador SCSI puede estar realizando la función de recopilación en software (cuando el hardware no soporta directamente la recopilación de datos), es posible que la función no sea satisfactoria debido a la falta de memoria o a un error de copia. La variable global errno devuelta se establece en ENOMEM o EFAULT. Debido a cómo se manejan las grabaciones recopiladas, no es posible que el controlador de dispositivo de modalidad de destino realice reintentos. Cuando se produce un error, el llamante debe reintentar o de lo contrario recuperar la operación.
Si el escribir La operación no tiene éxito, el valor de retorno se establece en-1 y el errno La variable global se establece en el valor de retorno del controlador del dispositivo. Si el valor de retorno es un valor distinto de-1 , el escribir La operación fue exitosa y el valor de retorno indica el número de bytes escritos. El llamante debe validar el número de bytes enviados para comprobar si hay errores. Puesto que toda la longitud de transferencia de datos se envía en un único mandato de enviar , un código de retorno no igual a la longitud total esperada debe considerarse un error. Los desplazamientos de archivos no son aplicables y se ignoran para las grabaciones en modalidad de destino.
Si el programa de llamada necesita romper una operación Escribir bloqueada, se debe generar una señal. El controlador de dispositivo de modalidad de destino recibe la señal y finaliza la operación actual de Escribir . Una operación Escribir en progreso falla y la variable global errno se establece en EINTR. El programa de llamada puede continuar emitiendo otra operación de Escribir , una operación de ioctl o puede cerrar el dispositivo. Si la operación de Escribir que el llamante intenta romper se completa antes de que se genere la señal, la grabación se completa normalmente y se ignora la señal.
El controlador de dispositivo de modalidad de destino reintenta automáticamente (hasta el número de intentos especificado por el valor TM_MAXRETRY definido en el archivo /usr/include/sys/tmscsi.h ) el mandato send si se recibe una respuesta SCSI Busy o ningún estado de respuesta de dispositivo para el mandato. De forma predeterminada, el controlador de dispositivo de modalidad de destino retarda cada intento de reintento en aproximadamente dos segundos para permitir que el dispositivo de destino responda satisfactoriamente. El llamante puede cambiar la cantidad de tiempo retardada a través de la operación TMCHGIMPARM . Si los reintentos se han agotado y el mandato aún no es satisfactorio, la grabación falla. El programa de llamada puede reintentar la operación de Escribir o realizar otra recuperación de error adecuada. Todas las demás condiciones de error no se vuelven a intentar pero se devuelven con la variable global errno adecuada.
El controlador de dispositivo de modalidad de destino, de forma predeterminada, genera un valor de tiempo de espera, que es la cantidad de tiempo permitido para que se complete el mandato enviar . Si el mandato enviar no se completa antes de que caduque el valor de tiempo de espera, la grabación falla. El valor de tiempo de espera se basa en la longitud de la transferencia solicitada, en bytes, y se calcula de la siguiente manera:
timeout_value = ((transfer_length / 65536) +1) *
10En el cálculo, 10 es el factor de escalado predeterminado utilizado para generar el valor de tiempo de espera. El llamante puede personalizar el valor de tiempo de espera a través de la operación TMCHGIMPARM .
Uno de los errores que se pueden producir durante una grabación es un estado SCSI de condición de comprobación. Un error de condición de comprobación requiere que se emita un mandato SCSI sentido de solicitud al dispositivo. Esto devuelve los datos de detección SCSI del dispositivo, que deben examinarse para descubrir la causa exacta de la condición de comprobación. Para permitir que el controlador de dispositivo de modalidad de destino funcione con una variedad de dispositivos de destino cuando está en modalidad de iniciador, el controlador de dispositivo no evalúa los datos de detección de dispositivo en condiciones de comprobación. Por lo tanto, el llamante es responsable de evaluar los datos de detección para determinar la recuperación de errores adecuada. La operación TMGETSENS se proporciona para permitir que el llamante obtenga los datos de detección. Se utiliza una variable global errno exclusiva, ENXIO, para identificar las condiciones de comprobación para que el interlocutor sepa cuándo emitir la operación de TMGETSENS . Este error no se registra en el registro de errores del sistema por el controlador de dispositivo SCSI. El transcriptor del programa de llamada debe ser consciente de que, de acuerdo con los estándares SCSI, el mandato sentido de solicitud debe ser el siguiente mandato recibido por el dispositivo después de un error de condición de comprobación. Si este iniciador envía cualquier otro mandato al dispositivo, se borran los datos de detección y se pierde la información de error.
Después de cada subrutina Escribir , el controlador de dispositivo de modalidad de destino genera el valor de retorno adecuado y la variable global errno . El controlador de dispositivo también actualiza un área de estado que se mantiene para el último mandato en cada dispositivo. En ciertos errores, así como en las terminaciones satisfactorias, el llamante puede leer opcionalmente este área de estado para obtener un estado de error más detallado para el comando. La operación TMIOSTAT se puede utilizar para este propósito. Las variables globales de errno cubiertas por este estado incluyen EIO, EBUSY, ENXIOy ETIMEDOUT.
Otros posibles valores de retorno para la variable global errno incluyen:
| Valor | Descripción |
|---|---|
| EBUSY | Se ha detectado conflicto de reserva SCSI. Vuelva a intentarlo más tarde o asegúrese de que la reserva de dispositivo finaliza antes de continuar. |
| EFAULT | Esto sólo es aplicable durante la recopilación de datos. La operación de Escribir no ha sido satisfactoria debido a un error de servicio de kernel. |
| EINTR | Interrumpido por señal. |
| EINVAL | Se ha intentado ejecutar una operación de Escribir para una instancia de dispositivo que no está configurada, no está abierta o no es un número de dispositivo menor en modalidad de iniciador. La longitud de transferencia es demasiado larga o no puede marcar la transferencia completa. Vuelva a intentar el mandato con una longitud de transferencia más pequeña. |
| EIO | Se ha producido un error de E/S. Se ha producido un error no reproducible o se han agotado los reintentos sin éxito en un error no reproducible. Realice la recuperación de errores adecuada. |
| ENOCONEC | Indica que se ha producido un error de bus SCSI. El llamante debe responder reintentando con la transferencia asíncrona de datos permitida. Esto se lleva a cabo emitiendo una operación TMIOASYNC a este dispositivo antes del reintento. Si se intenta más de un reintento, la operación de TMIOASYNC sólo se debe realizar antes del último reintento. |
| ENOMEM | Esto sólo es aplicable durante la recopilación de datos. La operación Escribir no ha sido satisfactoria debido a la falta de memoria del sistema. |
| ENXIO | Se ha producido una comprobación de SCSI. Ejecute una operación de TMGETSENS para obtener los datos de detección de dispositivo y, a continuación, realice la recuperación de errores necesaria. |
| ETIMEDOUT | El mandato ha excedido el tiempo de espera. Realice la recuperación de errores adecuada. |
Subrutina ioctl
Las operaciones ioctl siguientes las proporciona el controlador de dispositivo de modalidad de destino. Algunos son específicos del dispositivo de modalidad de destino o del dispositivo de modalidad de iniciador. Todos requieren que la instancia de dispositivo respectiva esté abierta para la ejecución de la operación.
| Operación | Descripción |
|---|---|
| IOCINFO | Devuelve una estructura definida en el archivo /usr/include/sys/devinfo.h . |
| TMCHGIMPARM | Permite al llamador cambiar ciertos parámetros utilizados por el controlador de dispositivo de modalidad de destino para una instancia de dispositivo determinada. |
| TMGETSENS | Ejecuta un mandato SCSI sentido de solicitud y devuelve los datos de detección al usuario. |
| TMIOASYNC | Permite ejecutar mandatos de modalidad de iniciador en un dispositivo de modalidad de destino concreto para utilizar la transferencia de datos asíncrona. |
| TMIOCMD | Envía mandatos SCSI directamente al dispositivo conectado. |
| TMIEVNT | Permite al llamador consultar el estado del controlador de dispositivo en determinados sucesos. |
| TMIRESET | Envía un mensaje de restablecimiento de dispositivo de bus a un dispositivo de modalidad de destino conectado. |
| TMIOSTAT | Permite al interlocutor obtener información detallada sobre el estado de la operación Escribir o TMGETSENS ioctl anteriormente. |
seleccionar punto de entrada
El punto de entrada seleccionar permite al llamante saber cuándo se ha producido un suceso especificado en uno o más dispositivos de modalidad de destino. El parámetro entrada de sucesos permite al llamante especificar cuál de una o más condiciones desea que se le notifique por un OR bit a bit de uno o más distintivos. El controlador de dispositivo de modalidad de destino da soporte a los siguientes sucesos de seleccionar :
| Suceso | Descripción |
|---|---|
| POLLIN | Compruebe si los datos recibidos están disponibles. |
| POLLPRI | Compruebe si el estado está disponible. |
| POLLSYNC | Devolver sólo los sucesos que están pendientes actualmente. No se produce ninguna notificación asíncrona. |
Un suceso adicional, POLLOUT, no es aplicable y, por lo tanto, no está soportado por el controlador de dispositivo de modalidad de destino.
El parámetro Salida de reventp apunta al resultado de las comprobaciones condicionales. El controlador de dispositivo puede devolver un OR bit a bit de los siguientes distintivos:
| Distintivo | Descripción |
|---|---|
| POLLIN | Los datos recibidos están disponibles. |
| POLLPRI | Estado disponible. |
El parámetro input se utiliza para especificar un número de canal. Esto no es aplicable para controladores de dispositivo no multiplexados y debe establecerse en un valor de 0 para el controlador de dispositivo de modalidad de destino.
El suceso de POLLIN lo indica el controlador de dispositivo cuando se reciben datos para esta instancia de destino. Una subrutina leer que no bloquea, si la emite posteriormente el llamante, devuelve datos. Para una subrutina leer de bloqueo, la lectura no vuelve hasta que se recibe la longitud solicitada o hasta que se completa el mandato enviar , lo que ocurra primero.
El suceso de POLLPRI lo indica el controlador de dispositivo cuando se produce un suceso excepcional. Para determinar la causa del suceso excepcional, el llamante debe emitir una operación TMIEVNT al dispositivo que informe del suceso POLLPRI .
El posible valor de retorno para la variable global errno incluye:
| Valor | Descripción |
|---|---|
| EINVAL | Un suceso especificado no está soportado o la instancia de dispositivo no está configurada o no está abierta. |
Registro de errores
Los errores detectados por el controlador de dispositivo de modalidad de destino pueden ser uno de los siguientes:
- Error de hardware no reproducible al recibir datos
- Error de hardware no reproducible durante el mandato de iniciador
- Error de hardware no recuperado
- Error de hardware recuperado
- Error de software detectado por controlador de dispositivo de
El controlador de dispositivo de modalidad de destino pasa la responsabilidad de recuperación de errores de la mayoría de errores detectados al llamante. Para estos errores, el controlador de dispositivo de modalidad de destino no sabe si este tipo de error es permanente o temporal. Este tipo de errores se registran como errores temporales.
Sólo los errores que el controlador de dispositivo de modalidad de destino puede recuperar a través de reintentos se pueden determinar para que sean temporales o permanentes. El error se registra como temporal si tiene éxito durante el reintento (un error recuperado) o como permanente si los reintentos no son satisfactorios (un error no recuperado). El código de retorno al llamante indica el éxito si se produce un error recuperado o si se produce un error si se produce un error no recuperado. El llamante puede elegir volver a intentar el mandato o la operación, pero la probabilidad de reintentar el éxito es baja para errores no recuperados.