Funzione SCSIPortNotification (srb.h)
La routine SCSIPortNotification informa il driver di porta specifico del sistema operativo di determinati eventi, ad esempio quando un driver miniport completa una richiesta o è pronto per avviare un'altra SRB, nonché quando l'adattatore del bus host (HBA) indica determinate condizioni di errore SCSI che si sono verificate durante un'operazione.
Nota
I modelli di driver di porta SCSI e miniport SCSI possono essere modificati o non disponibili in futuro. È invece consigliabile usare i modelli di driver Storport e Miniport Storport.
Sintassi
SCSIPORT_API VOID ScsiPortNotification(
SCSI_NOTIFICATION_TYPE NotificationType,
PVOID HwDeviceExtension,
...
);
Parametri
NotificationType
Specifica il tipo di notifica. Vedere la sezione Osservazioni.
HwDeviceExtension
Puntatore all'estensione del dispositivo hardware. Si tratta di un'area di archiviazione per HBA che il driver di porta alloca e inizializza per conto del driver miniport. I driver miniport in genere archiviano informazioni specifiche di HBA in questa estensione, ad esempio lo stato dell'HBA e gli intervalli di accesso mappati di HBA. Questa area è disponibile per il driver miniport nel membro DeviceExtension-HwDeviceExtension> dell'oggetto dispositivo HBA immediatamente dopo che il driver miniport chiama SCSIPortInitialize. Il driver di porta libera questa memoria quando rimuove il dispositivo.
...
Argomenti variadici per questa routine. Il numero e il tipo di argomenti dipendono da NotificationType. Vedere la sezione Osservazioni.
Valore restituito
nessuno
Osservazioni
La routine SCSIPortNotification ha un set diverso di parametri facoltativi associati a ogni tipo di notifica. L'elenco dei valori possibili per NotificationType segue, insieme alle descrizioni per ogni valore.
NotificationType = RequestComplete
Indica che il valore Srb specificato è terminato. Se questo valore è impostato, SCSIPortNotification richiede un parametro aggiuntivo: l'indirizzo della SRB. Dopo questa notifica, il driver di porta specifico del sistema operativo possiede la richiesta. Il driver miniport non deve accedere a Srb e non deve passare la Srb a un'altra routine,ad esempio SCSIPortLogError.
Sintassi:
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // RequestComplete _In_ PVOID HwDeviceExtension, _In_opt_ PSCSI_REQUEST_BLOCK Srb );
NotificationType = NextRequest
Indica che il driver miniport è pronto per un'altra richiesta a una destinazione che non è attualmente occupato. Questa notifica deve essere inviata dal driver miniport non appena il driver è pronto per un'altra richiesta. In genere, questa notifica viene inviata dalla routine HwScsiStartIo ma, a volte, dalla routine HwScsiInterrupt (o HwScsiEnableInterruptsCallback).
NotificationType = NextLuRequest
Indica che l'HBA è pronto per un'altra richiesta per l'unità logica specificata. Se questo valore è impostato, SCSIPortNotification richiede tre parametri aggiuntivi: (1) l'ID percorso, (2) l'ID di destinazione e (3) il numero di unità logica. Questo valore deve essere usato solo se l'HBA può accodare più richieste e supportare l'accodamento automatico o l'accodamento con tag.
Sintassi:
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // NextLuRequest _In_ PVOID HwDeviceExtension, _In_opt_ PathId, _In_opt_ TargetId, _In_opt_ Lun );
NotificationType = ResetDetected
Indica che l'HBA ha rilevato una reimpostazione del bus SCSI. Dopo questa notifica, il driver miniport è ancora responsabile del completamento di eventuali richieste attive. Il driver della porta SCSI gestirà tutti i ritardi necessari per la reimpostazione del bus.
NotificationType = CallEnableInterrupts
Indica che il driver miniport richiede al driver di porta specifico del sistema operativo di chiamare la routine HwScsiEnableInterruptsCallback del driver miniport. Se questo valore è impostato, SCSIPortNotification richiede un parametro aggiuntivo: il punto di ingresso per HwScsiEnableInterruptsCallback. La routine HwScsiInterrupt del driver miniport effettua questa chiamata dopo la disabilitazione degli interruzioni nell'HBA, per rinviare un'elaborazione di I/O basata su interruzioni se l'HBA richiede il polling o lo stallo nell'ISR. Durante l'esecuzione del callback, gli interruzioni di sistema rimangono abilitati, ma la routine HwSCSIInterrupt del driver miniport non verrà chiamata. HwScsiEnableInterruptsCallback è responsabile del completamento dell'elaborazione di I/O posticipata e della chiamata di nuovo a SCSIPortNotification con CallDisableInterrupts e al punto di ingresso HwScsiDisruptsCallback del driver miniport.
Sintassi:
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // CallEnableInterrupts _In_ PVOID HwDeviceExtension, _In_opt_ PHW_INTERRUPT HwScsiXxxInterruptsCallback );
NotificationType = CallDisableInterrupts
Indica che il driver miniport richiede il driver di porta specifico del sistema operativo per chiamare la routine HwScsiDisableInterruptsCallback del driver miniport. Se questo valore è impostato, SCSIPortNotification richiede un parametro aggiuntivo: il punto di ingresso per HwScsiDisableInterruptsCallback. Durante l'esecuzione di questo callback, non può essere preceduto da un interruzione tranne da un dispositivo con una priorità superiore rispetto all'HBA. In questo callback, il driver miniport reenables interrompe l'hbA.
Sintassi:
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // CallDisableInterrupts _In_ PVOID HwDeviceExtension, _In_opt_ PHW_INTERRUPT HwScsiXxxInterruptsCallback );
NotificationType = RequestTimerCall
Indica che il driver miniport richiede al driver di porta specifico del sistema operativo di chiamare la routine HwScsiTimer del driver miniport nel numero richiesto di microsecondi. Se questo valore è impostato, SCSIPortNotification richiede due parametri aggiuntivi: (1) il punto di ingresso per la routine HwScsiTimer del driver miniport e (2) un intervallo MiniportTimerValue , in microsecondi. Si noti che la risoluzione del timer di sistema è di circa 10 millisecondi.
Sintassi:
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // RequestTimerCall _In_ PVOID HwDeviceExtension, _In_opt_ PHW_TIMER HwScsiTimer, _In_opt_ ULONG MiniportTimerValue );
NotificationType = BusChangeDetected
Indica che un dispositivo di destinazione potrebbe essere stato aggiunto o rimosso da un bus dinamico. Se questo valore è impostato, SCSIPortNotification richiede un parametro aggiuntivo: l'ID percorso del bus in cui è stata rilevata la modifica. Dopo questa notifica, il driver della porta rinumera il bus emettendo comandi INQUIRY. L'enumerazione del bus richiede tempo e collega il bus, quindi un conducente miniport non deve inviare questa notifica inutilmente.
Sintassi:
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // BusChangeDetected _In_ PVOID HwDeviceExtension, _In_opt_ UCHAR PathId );
NotificationType = WMIEvent
Indica che il driver miniport ha rilevato un evento per il quale viene registrato uno o più consumer di dati WMI. Se questo valore è impostato, SCSIPortNotification richiede almeno tre argomenti aggiuntivi: (1) un puntatore a una struttura di eventi WMI, (2) le dimensioni della struttura evento e (3) l'ID percorso del dispositivo di destinazione se l'evento ha origine da un dispositivo o 0xFF se l'evento ha origine dall'adattatore. Se (3) è un ID percorso, SCSIPortNotification richiede due argomenti aggiuntivi: (4) l'ID di destinazione e (5) il numero di unità logica (LUN) del dispositivo di destinazione.
Sintassi per PathId != 0xFF
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // WMIEvent _In_ PVOID HwDeviceExtension, _In_opt_ PVOID WMIEvent, _In_opt_ UCHAR PathId, // != 0xFF _In_opt_ UCHAR TargetId, _In_opt_ UCHAR Lun );
Sintassi per PathId = 0xFF
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // WMIEvent _In_ PVOID HwDeviceExtension, _In_opt_ PVOID WMIEvent, _In_opt_ UCHAR PathId // 0xFF );
NotificationType = WMIReregister
Indica che il driver miniport ha modificato gli elementi di dati o il numero di istanze di un determinato blocco di dati registrato in precedenza chiamando IoWMIRegistrationControl. Se WMIReregister è impostato, SCSIPortNotification richiede almeno due argomenti aggiuntivi: (1) l'ID percorso del dispositivo di destinazione per registrare nuovamente il dispositivo o 0xFF per registrare nuovamente l'adapter. Se (1) è un ID percorso, SCSIPortNotification richiede due argomenti aggiuntivi: (2) l'ID di destinazione e (3) il numero di unità logica (LUN) del dispositivo di destinazione.
Sintassi per PathId != 0xFF
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // WMIReregister _In_ PVOID HwDeviceExtension, _In_opt_ UCHAR PathId, // != 0xFF _In_opt_ UCHAR TargetId, _In_opt_ UCHAR Lun );
Sintassi per PathId = 0xFF
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // WMIReregister _In_ PVOID HwDeviceExtension, _In_opt_ UCHAR PathId // 0xFF );
Ogni driver miniport deve chiamare due volte SCSIPortNotification per ogni chiamata alla routine HwScsiStartIo del driver miniport con una SRB completata correttamente dal driver miniport. Prima di tutto, il driver miniport chiama SCSIPortNotification con il tipo di notifica di NextRequest o con NextLuRequest se il driver miniport supporta accodamento con tag o più richieste per LU. Il driver miniport chiama quindi SCSIPortNotification con NotificationType of RequestComplete e la richiesta appena soddisfatta.
La routine HwScsiInterrupt di un driver miniport è più probabile chiamare SCSIPortNotification con Il tipo di notifica di ResetDetected.
Se un driver HBA richiede che il driver miniport usi più di un millisecondo di operazioni di I/O basate su interruzioni di elaborazione, la routine HwSCSIInterrupt deve disabilitare gli interruzioni nell'HBA e chiamare SCSIPortNotification con CallEnableInterrupts e una routine HwSCSIEnableInterruptsCallback. Questa routine, a sua volta, chiama SCSIPortNotification con CallDisableInterrupts e il driver fornito corrispondente HwSCSIDisruptsCallback.
Un driver miniport registrato come provider di dati WMI può chiamare SCSIPortNotification con WMIEvent per pubblicare un evento per cui ha ricevuto in precedenza una richiesta di abilitazione. Il driver della porta accoda l'evento nell'area dati di interruzione dell'estensione del dispositivo del driver miniport per l'elaborazione successiva in un irQL inferiore. Poiché solo un numero limitato di eventi può essere accodato alla volta, il driver miniport deve usare WMIEvent per segnalare condizioni eccezionali anziché di routine e deve dare il tempo del driver della porta per tornare a DISPATCH_LEVEL tra le registrazioni, per evitare che gli eventi vengano persi.
Requisiti
Requisito | Valore |
---|---|
Piattaforma di destinazione | Universale |
Intestazione | srb.h (include Miniport.h, SCSI.h) |
Libreria | Scsiport.lib; Storport.lib |
IRQL | (Vedere la sezione Osservazioni) |
Vedi anche
HwScsiDisableInterruptsCallback