處理 NDIS 選擇性暫停閒置通知
如果發生下列其中一個事件,NDIS 就會啟動選擇性暫停作業:
網路介面卡已閒置逾時超過閒置逾時期間。 此逾時期間的持續時間是由 *SSIdleTimeout 標準化 INF 關鍵字的值所指定。 如需此關鍵字的詳細資訊,請參閱 NDIS 選擇性暫停的標準化 INF 關鍵字。
如需 NDIS 如何判斷網路介面卡閒置的詳細資訊,請參閱 NDIS 如何偵測閒置網路介面卡。
與 Always On Always Connected (AOAC) 技術相容的系統正轉換為連線待命狀態。
透過選擇性暫停作業,網路介面卡會轉換為低電源狀態。 NDIS 會呼叫 MiniportIdleNotification 處理常式函式,發出迷你埠驅動程式的閒置通知,以開始此作業。
迷你埠驅動程式在處理閒置通知時,可能需要執行與匯流排相關的動作。 下圖顯示由 USB 網路介面卡的迷你埠驅動程式處理閒置通知所涉及的步驟。
本主題包含下列有關如何處理 NDIS 選擇性暫停閒置通知的資訊:
處理MiniportIdleNotification呼叫的指導方針
呼叫NdisMIdleNotificationConfirm的指導方針
處理MiniportIdleNotification呼叫的指導方針
當 NDIS 呼叫 MiniportIdleNotification時,NDIS 和迷你埠驅動程式會遵循下列步驟:
NDIS 會呼叫 MiniportIdleNotification 處理常式函式,通知驅動程式基礎網路介面卡似乎閒置。 NDIS 會將MiniportIdleNotification處理常式函式的ForceIdle參數設定為下列其中一個值:
當網路介面卡閒置逾時期間超過閒置逾時期間時,NDIS 會將 ForceIdle 參數設定為 FALSE 。
當符合 Always On Always Connected (AOAC) 技術的系統轉換為連線待命狀態時,NDIS 會將ForceIdle參數設定為TRUE。
呼叫 MiniportIdleNotification 時,迷你埠驅動程式可以傳回閒置通知和選擇性暫停作業NDIS_STATUS_BUSY。 例如,如果驅動程式偵測到網路介面卡上的活動,驅動程式可能會有閒置通知。
如果迷你埠驅動程式已擁有閒置通知,NDIS 會重新開機網路介面卡上的活動監視器。 如果介面卡在閒置逾時期間內再次變成非作用中,NDIS 會呼叫 MiniportIdleNotification。
注意 如果 ForceIdle 參數設定為 TRUE,迷你埠驅動程式就不能有閒置通知。 在此情況下,驅動程式必須繼續執行選擇性暫停作業。
如果迷你埠驅動程式沒有閒置通知,則必須執行任何匯流排特定的作業,以準備網路介面卡以進行選擇性暫停作業。 例如,USB 網路介面卡的迷你埠驅動程式會執行下列步驟,以判斷網路介面卡是否可以轉換為低電源狀態:
迷你埠驅動程式會呼叫 IoCallDriver ,對基礎 USB 匯流排驅動程式發出 I/O 要求封包 (IRP) (IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION) IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION。 在此 IRP 中,迷你埠驅動程式必須指定回呼和完成常式。
USB 匯流排驅動程式不會立即完成 IRP。 IRP 會透過低電源轉換處於擱置狀態。 當發生下列任何事件時,匯流排驅動程式會在稍後完成 IRP:
迷你埠驅動程式會取消 IRP。
需要系統電源狀態變更。
裝置已從 USB 中樞移除。
在 USB 匯流排驅動程式判斷它可以讓網路介面卡處於低電源狀態之後,它會呼叫迷你埠驅動程式的 IRP 回呼常式。 此呼叫會確認網路介面卡可以轉換為低電源狀態。
如需如何撰寫 USB 閒置要求 IRP 回呼常式的指導方針,請參閱 實作 USB 閒置要求 IRP 回呼常式。
迷你埠驅動程式完成選擇性暫停作業的網路介面卡準備之後,它會呼叫 NdisMIdleNotificationConfirm。 在此呼叫中,迷你埠驅動程式會指定網路介面卡可以轉換到的最低電源狀態。
根據選擇性暫停作業的匯流排需求,迷你埠驅動程式會在MiniportIdleNotification的呼叫內容中以同步方式呼叫NdisMIdleNotificationConfirm,或在MiniportIdleNotification傳回之後以非同步方式呼叫。 例如,USB 網路介面卡的迷你埠驅動程式會在 USB 閒置要求的回呼常式內容中呼叫 NdisMIdleNotificationConfirm 。 USB 匯流排驅動程式會在 呼叫 IoCallDriver 的內容中以同步方式呼叫回呼常式,或在 MiniportIdleNotification 傳回之後以非同步方式呼叫。
如果網路介面卡可以轉換成低電源狀態,迷你埠驅動程式會從呼叫 MiniportIdleNotification傳回NDIS_STATUS_PENDING。
注意 迷你埠驅動程式會傳回NDIS_STATUS_PENDING,因為除非驅動程式呼叫 NdisMIdleNotificationComplete,否則不會完成閒置通知。 迷你埠驅動程式不得從 MiniportIdleNotification傳回NDIS_STATUS_SUCCESS。
迷你埠驅動程式應該執行下列作業,直到網路介面卡暫停並轉換為低電源狀態為止:
迷你埠驅動程式應該處理已接收的封包,並藉由呼叫 NdisMIndicateReceiveNetBufferLists 向 NDIS指示這些封包。
迷你埠驅動程式應該處理已完成的傳送封包,並藉由呼叫 NdisMSendNetBufferListsComplete將其指示給 NDIS。
注意如果MiniportIdleNotification傳回NDIS_STATUS_PENDING,NDIS 將不會呼叫驅動程式的MiniportSendNetBufferLists函式來傳送封包。
呼叫NdisMIdleNotificationConfirm的指導方針
當迷你埠驅動程式呼叫 NdisMIdleNotificationConfirm 時,NDIS 和迷你埠驅動程式會遵循下列步驟:
基礎匯流排驅動程式 IRP_MN_WAIT_WAKE 的 NDIS 問題。 此 IRP 可讓匯流排驅動程式喚醒網路介面卡,以回應外部喚醒訊號。
NDIS 會將物件識別碼發出 (OID) OID_PM_PARAMETERS至迷你埠驅動程式的要求。 此 OID 要求與 NDIS_PM_PARAMETERS 結構相關聯,指定網路介面卡產生喚醒事件的設定。
迷你埠驅動程式在處理 NDIS_PM_PARAMETERS 結構的成員時,必須遵循下列指導方針:
如果MiniportIdleNotification處理常式函式的ForceIdle參數設定為 FALSE,NDIS 只會在NDIS_PM_PARAMETERS 結構的WakeUpFlags成員中設定NDIS_PM_SELECTIVE_SUSPEND_ENABLED旗標。 在此情況下,網路介面卡可以在發生下列其中一個事件時發出喚醒事件訊號:
網路介面卡會收到符合接收封包篩選的封包。 介面卡會設定為透過 OID_GEN_CURRENT_PACKET_FILTER的 OID 集合要求使用這些篩選。
網路介面卡會偵測需要網路驅動程式堆疊處理的其他外來事件,例如當連結狀態變更為媒體中斷連線或媒體連線時。
如果MiniportIdleNotification處理常式函式的ForceIdle參數設定為TRUE,NDIS 不會在NDIS_PM_PARAMETERS 結構的WakeUpFlags成員中設定NDIS_PM_SELECTIVE_SUSPEND_ENABLED旗標。 在此情況下,NDIS 會針對與 NDIS 選擇性暫停無關的喚醒事件,在 NDIS_PM_PARAMETERS 結構中設定其他成員。
注意NDIS 只有在 Always On符合 Always Connected (AOAC) 技術的系統轉換為連線待命狀態時,才會將 ForceIdle參數設定為TRUE。
驅動程式會使用 NDIS_STATUS_SUCCESS 完成 OID 要求。
注意如果 NDIS 在NDIS_PM_PARAMETERS結構的WakeUpFlags成員中設定NDIS_PM_SELECTIVE_SUSPEND_ENABLED旗標,它會直接將OID_PM_PARAMETERS的 OID 集合要求發出至迷你埠驅動程式。 這可讓 NDIS 略過網路驅動程式堆疊中的驅動程式來處理。
順利完成 OID_PM_PARAMETERS 的 OID 集合要求之後,NDIS 會將 OID 設定要求 OID_PNP_SET_POWER 至迷你埠驅動程式。
當它處理此 OID 集合要求時,驅動程式會準備網路介面卡,以轉換為 OID 要求中指定的低電源狀態。 驅動程式必須以下列方式完成所有擱置中的作業:
迷你埠驅動程式會等候所有先前指出的接收封包,透過 對 MiniportReturnNetBufferLists的呼叫傳回。
迷你埠驅動程式會等候硬體處理的傳送要求完成。 要求完成之後,迷你埠驅動程式必須呼叫 NdisMSendNetBufferListsComplete。
迷你埠驅動程式會呼叫 NdisMSendNetBufferListsComplete來完成所有擱置的傳送要求。
迷你埠驅動程式必須取消所有擱置的 NDIS 計時器和工作專案。 取消這些專案之後,驅動程式必須等候這些計時器和工作專案完成。
迷你埠驅動程式必須將網路介面卡置於靜止狀態。 例如,驅動程式必須取消所有硬體計時器。
迷你埠驅動程式會設定基礎網路介面卡,以啟用先前在 OID 集合要求中指定 OID_PM_PARAMETERS的指定喚醒事件。 在網路介面卡準備好進行低電源轉換之後,迷你埠驅動程式會使用 NDIS_STATUS_SUCCESS 完成OID_PNP_SET_POWER 的 OID 集合要求。
NDIS 對基礎匯流排驅動程式發出 IRP_MN_SET_POWER 。 此 IRP 要求網路介面卡轉換為低電源狀態。
注意 在選擇性暫停作業期間,網路介面卡會轉換為 呼叫 NdisMIdleNotificationConfirm中指定的裝置電源狀態。 迷你埠驅動程式會在此函式的 IdlePowerState 參數中指定此裝置電源狀態。
完成 IRP 之後,NDIS 會從 對 NdisMIdleNotificationConfirm的呼叫傳回。
取消和完成 NDIS 選擇性暫停閒置通知
發出閒置通知之後,可以透過下列方式取消和完成:
如果下列條件成立,NDIS 可以取消未處理的閒置通知:
過度配置通訊協定或篩選驅動程式會發出傳送封包要求或 OID 要求給迷你埠驅動程式。
基礎配接器會發出喚醒事件的訊號,例如接收符合網路喚醒 (WOL) 模式的封包,或偵測其媒體線上狀態的變更。
NDIS 會呼叫 MiniportCancelIdleNotification來取消閒置通知。 呼叫此處理程式函式時,迷你埠驅動程式會取消先前針對閒置通知發出的任何匯流排特定 IRP。 最後,迷你埠驅動程式會呼叫 NdisMIdleNotificationComplete 來完成閒置通知。
如需 NDIS 如何取消閒置通知的詳細資訊,請參閱 取消 NDIS 選擇性暫停閒置通知。
網路介面卡處於低電源狀態之後,迷你埠驅動程式可以完成閒置通知本身,以繼續介面卡到全電源狀態。 執行此動作的原因,是驅動程式和配接器的設計和需求專屬。 迷你埠驅動程式會呼叫 NdisMIdleNotificationComplete來完成閒置通知。
如需迷你埠驅動程式如何完成閒置通知的詳細資訊,請參閱 完成 NDIS 選擇性暫停閒置通知。