Bagikan melalui


Fungsi ScsiPortNotification (srb.h)

Rutinitas ScsiPortNotification menginformasikan driver port khusus sistem operasi dari peristiwa tertentu, seperti ketika driver miniport menyelesaikan permintaan atau siap untuk memulai SRB lain, serta ketika adaptor bus host (HBA) menunjukkan kondisi kesalahan SCSI tertentu yang terjadi selama operasi.

Catatan

Driver port SCSI dan model driver miniport SCSI dapat diubah atau tidak tersedia di masa mendatang. Sebagai gantinya, sebaiknya gunakan driver Storport dan model driver miniport Storport .

Sintaks

SCSIPORT_API VOID ScsiPortNotification(
  SCSI_NOTIFICATION_TYPE NotificationType,
  PVOID                  HwDeviceExtension,
  ...                    
);

Parameter

NotificationType

Menentukan jenis pemberitahuan. Lihat Keterangan.

HwDeviceExtension

Arahkan ke ekstensi perangkat keras. Ini adalah area penyimpanan per HBA yang dialokasikan dan diinisialisasi driver port atas nama driver miniport. Driver Miniport biasanya menyimpan informasi khusus HBA dalam ekstensi ini, seperti status HBA dan rentang akses HBA yang dipetakan. Area ini tersedia untuk driver miniport di deviceExtension-HwDeviceExtension> anggota objek perangkat HBA segera setelah driver miniport memanggil ScsiPortInitialize. Pengandar porta membebaskan memori ini ketika melepas perangkat.

...

Argumen variadik untuk rutinitas ini. Jumlah dan jenis argumen bergantung pada NotificationType. Lihat Keterangan.

Nilai kembali

Tidak ada

Keterangan

Rutinitas ScsiPortNotification memiliki serangkaian parameter opsional yang berbeda yang terkait dengan setiap NotificationType. Daftar nilai yang mungkin untuk NotificationType mengikuti, bersama dengan deskripsi untuk setiap nilai.

  • NotificationType = RequestComplete

    Menunjukkan bahwa Srb yang diberikan telah selesai. Jika nilai ini diatur, ScsiPortNotification memerlukan satu parameter tambahan: alamat SRB. Setelah pemberitahuan ini, driver port khusus sistem operasi memiliki permintaan. Driver miniport tidak boleh mengakses Srb, dan tidak boleh meneruskan Srb ke rutinitas lain (seperti ScsiPortLogError).

    Sintaks:

    VOID ScsiPortNotification(
      _In_     SCSI_NOTIFICATION_TYPE NotificationType,   // RequestComplete
      _In_     PVOID                  HwDeviceExtension,
      _In_opt_ PSCSI_REQUEST_BLOCK    Srb
    );
    
  • NotificationType = NextRequest

    Menunjukkan driver miniport siap untuk permintaan lain ke target yang saat ini tidak sibuk. Pemberitahuan ini harus dikirim oleh driver miniport segera setelah driver siap untuk permintaan lain. Biasanya, pemberitahuan ini dikirim dari rutinitas HwScsiStartIo tetapi, kadang-kadang, dari rutinitas HwScsiInterrupt (atau HwScsiEnableInterruptsCallback).

  • NotificationType = NextLuRequest

    Menunjukkan bahwa HBA siap untuk permintaan lain untuk unit logis yang ditentukan. Jika nilai ini ditetapkan, ScsiPortNotification memerlukan tiga parameter tambahan: (1) ID jalur, (2) ID target, dan (3) nomor unit logis. Nilai ini harus digunakan hanya jika HBA dapat mengantrekan beberapa permintaan dan mendukung pengertian permintaan otomatis atau antrean yang diberi tag.

    Sintaks:

    VOID ScsiPortNotification(
      _In_     SCSI_NOTIFICATION_TYPE NotificationType,   // NextLuRequest
      _In_     PVOID                  HwDeviceExtension,
      _In_opt_                        PathId,
      _In_opt_                        TargetId,
      _In_opt_                        Lun
    );
    
  • NotificationType = ResetDetected

    Menunjukkan bahwa HBA telah mendeteksi reset pada bus SCSI. Setelah pemberitahuan ini, driver miniport masih bertanggung jawab untuk menyelesaikan permintaan aktif apa pun. Driver port SCSI akan mengelola semua penundaan pengaturan ulang bus yang diperlukan.

  • NotificationType = CallEnableInterrupts

    Menunjukkan bahwa driver miniport memerlukan driver port khusus sistem operasi untuk memanggil rutinitas HwScsiEnableInterruptsCallback driver miniport. Jika nilai ini diatur, ScsiPortNotification memerlukan parameter tambahan: titik masuk untuk HwScsiEnableInterruptsCallback. Rutinitas HwScsiInterrupt driver miniport melakukan panggilan ini setelah menonaktifkan gangguan pada HBA, untuk menunda beberapa pemrosesan I/O yang digerakkan oleh interupsi jika HBA memerlukan polling atau mengulur waktu di ISR. Saat panggilan balik berjalan, gangguan sistem tetap diaktifkan tetapi rutinitas HwScsiInterrupt driver miniport tidak akan dipanggil. HwScsiEnableInterruptsCallback bertanggung jawab untuk menyelesaikan pemrosesan I/O yang ditangguhkan dan untuk memanggil ScsiPortNotification lagi dengan CallDisableInterrupts dan titik masuk HwScsiDisableInterruptsCallback driver miniport.

    Sintaks:

    VOID ScsiPortNotification(
      _In_     SCSI_NOTIFICATION_TYPE NotificationType,           // CallEnableInterrupts
      _In_     PVOID                  HwDeviceExtension,
      _In_opt_ PHW_INTERRUPT          HwScsiXxxInterruptsCallback
    );
    
  • NotificationType = CallDisableInterrupts

    Menunjukkan bahwa driver miniport memerlukan driver port khusus sistem operasi untuk memanggil rutinitas HwScsiDisableInterruptsCallback driver miniport. Jika nilai ini diatur, ScsiPortNotification memerlukan parameter tambahan: titik masuk untuk HwScsiDisableInterruptsCallback. Meskipun panggilan balik ini berjalan, panggilan balik ini tidak dapat didahulukan oleh gangguan kecuali dari perangkat dengan gangguan prioritas yang lebih tinggi daripada HBA. Dalam panggilan balik ini, driver miniport dapat mengaktifkan kembali gangguan pada HBA.

    Sintaks:

    VOID ScsiPortNotification(
      _In_     SCSI_NOTIFICATION_TYPE NotificationType,          // CallDisableInterrupts
      _In_     PVOID                  HwDeviceExtension,
      _In_opt_ PHW_INTERRUPT          HwScsiXxxInterruptsCallback
    );
    
  • NotificationType = RequestTimerCall

    Menunjukkan bahwa driver miniport memerlukan driver port khusus sistem operasi untuk memanggil rutinitas HwScsiTimer driver miniport dalam jumlah mikrosekon yang diminta. Jika nilai ini ditetapkan, ScsiPortNotification memerlukan dua parameter tambahan: (1) titik masuk untuk rutinitas HwScsiTimer driver miniport, dan (2) interval MiniportTimerValue , dalam mikrodetik. Perhatikan bahwa resolusi timer sistem adalah sekitar 10 milidetik.

    Sintaks:

    VOID ScsiPortNotification(
      _In_     SCSI_NOTIFICATION_TYPE NotificationType,    // RequestTimerCall
      _In_     PVOID                  HwDeviceExtension,
      _In_opt_ PHW_TIMER              HwScsiTimer,
      _In_opt_ ULONG                  MiniportTimerValue
    );
    
  • NotificationType = BusChangeDetected

    Menunjukkan bahwa perangkat target mungkin telah ditambahkan atau dihapus dari bus dinamis. Jika nilai ini diatur, ScsiPortNotification memerlukan parameter tambahan: ID jalur bus tempat perubahan terdeteksi. Setelah pemberitahuan ini, driver port menghitung ulang bus dengan mengeluarkan perintah INQUIRY. Enumerasi bus memakan waktu dan mengikat bus, sehingga pengemudi miniport tidak boleh mengirim pemberitahuan ini tidak perlu.

    Sintaks:

    VOID ScsiPortNotification(
      _In_     SCSI_NOTIFICATION_TYPE NotificationType,    // BusChangeDetected
      _In_     PVOID                  HwDeviceExtension,
      _In_opt_ UCHAR                  PathId
    );
    
  • NotificationType = WMIEvent

    Menunjukkan bahwa driver miniport telah mendeteksi peristiwa di mana satu atau beberapa konsumen data WMI terdaftar. Jika nilai ini diatur, ScsiPortNotification memerlukan setidaknya tiga argumen tambahan: (1) penunjuk ke struktur peristiwa WMI, (2) ukuran struktur peristiwa, dan (3) ID jalur perangkat target jika peristiwa berasal dari perangkat, atau 0xFF jika peristiwa berasal dari adaptor. Jika (3) adalah ID jalur, ScsiPortNotification memerlukan dua argumen tambahan: (4) ID target, dan (5) nomor unit logis (LUN) dari perangkat target.

    Sintaks untuk 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
    );
    

    Sintaks untuk PathId = 0xFF

    VOID ScsiPortNotification(
      _In_     SCSI_NOTIFICATION_TYPE NotificationType,    // WMIEvent
      _In_     PVOID                  HwDeviceExtension,
      _In_opt_ PVOID                  WMIEvent,
      _In_opt_ UCHAR                  PathId               // 0xFF
    );
    
  • NotificationType = WMIReregister

    Menunjukkan bahwa driver miniport telah mengubah item data atau jumlah instans blok data tertentu yang sebelumnya terdaftar dengan memanggil IoWMIRegistrationControl. Jika WMIRegister diatur, ScsiPortNotification memerlukan setidaknya dua argumen tambahan: (1) ID jalur perangkat target untuk mendaftarkan ulang perangkat tersebut, atau 0xFF untuk mendaftarkan ulang adaptor. Jika (1) adalah ID jalur, ScsiPortNotification memerlukan dua argumen tambahan: (2) ID target, dan (3) nomor unit logis (LUN) dari perangkat target.

    Sintaks untuk 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
    );
    

    Sintaks untuk PathId = 0xFF

    VOID ScsiPortNotification(
      _In_     SCSI_NOTIFICATION_TYPE NotificationType,   // WMIReregister
      _In_     PVOID                  HwDeviceExtension,
      _In_opt_ UCHAR                  PathId              // 0xFF
    );
    

Setiap driver miniport harus memanggil ScsiPortNotification dua kali untuk setiap panggilan ke rutinitas HwScsiStartIo driver miniport dengan SRB yang berhasil diselesaikan driver miniport. Pertama, driver miniport memanggil ScsiPortNotification dengan NotificationType of NextRequest atau dengan NextLuRequest jika driver miniport mendukung antrean bertag atau beberapa permintaan per LU. Kemudian, driver miniport memanggil ScsiPortNotification dengan NotificationType dari RequestComplete dan permintaan yang baru saja dipenuhi.

Rutinitas HwScsiInterrupt driver miniport kemungkinan besar akan memanggil ScsiPortNotification dengan NotificationType of ResetDetected.

Jika HBA mengharuskan driver miniport untuk menggunakan lebih dari operasi I/O berbasis interupsi pemrosesan milidetik, rutinitas HwScsiInterrupt-nya harus menonaktifkan gangguan pada HBA dan memanggil ScsiPortNotification dengan CallEnableInterrupts dan rutin HwScsiEnableInterruptsCallback yang disediakan driver. Rutinitas ini, pada gilirannya, memanggil ScsiPortNotification dengan CallDisableInterrupts dan HwScsiDisableInterruptsCallback yang disediakan driver yang sesuai.

Driver miniport yang terdaftar sebagai penyedia data WMI dapat memanggil ScsiPortNotification dengan WMIEvent untuk memposting peristiwa yang sebelumnya telah menerima permintaan pengaktifan. Driver port mengantre peristiwa di area data interupsi ekstensi perangkat driver miniport untuk diproses nanti pada IRQL yang lebih rendah. Karena hanya sejumlah peristiwa terbatas yang dapat diantrekan pada satu waktu, driver miniport harus menggunakan WMIEvent untuk memberi sinyal yang luar biasa daripada kondisi rutin, dan itu harus memberikan waktu driver port untuk kembali ke DISPATCH_LEVEL antara posting, untuk mencegah peristiwa hilang.

Persyaratan

Persyaratan Nilai
Target Platform Universal
Header srb.h (termasuk Miniport.h, Scsi.h)
Pustaka Scsiport.lib; Storport.lib
IRQL (Lihat bagian Keterangan)

Lihat juga

HwScsiDisableInterruptsCallback

HwScsiEnableInterruptsCallback

HwScsiTimer

IoWMIRegistrationControl

ScsiPortCompleteRequest