/*++ Copyright (c) 1996-1999 Microsoft Corporation Module Name: status.c Abstract: status indications handled in here.... Author: Charlie Wickham (charlwi) 20-Jun-1996 Rajesh Sundaram (rajeshsu) 01-Aug-1998. Environment: Kernel Mode Revision History: --*/ #include "psched.h" #pragma hdrstop /* External */ /* Static */ /* Forward */ VOID ClStatusIndication( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_STATUS GeneralStatus, IN PVOID StatusBuffer, IN UINT StatusBufferSize ); VOID ClStatusIndicationComplete( IN NDIS_HANDLE BindingContext ); /* End Forward */ VOID ClStatusIndication( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_STATUS GeneralStatus, IN PVOID StatusBuffer, IN UINT StatusBufferSize ) /*++ Routine Description: Called by the NIC via NdisIndicateStatus Arguments: See the DDK... Return Values: None --*/ { PADAPTER Adapter = (PADAPTER)ProtocolBindingContext; NDIS_STATUS Status; ULONG ErrorLogData[2]; PVOID Context; PsDbgOut(DBG_TRACE, DBG_PROTOCOL, ("(%08X) ClStatusIndication: Status %08X\n", Adapter, GeneralStatus)); // General rule: // If our device is not ready, we cannot forward the status indication. // Yes - we care about the Media connect and link speed oids. We will // query for these OIDs when we get to D0. // // (i) Special case for media_status. // Condition is that: // (Adapter state is OFF, so we can't process it ourselves) AND // (Status indication is about 'connect' or 'disconnect') AND // (Adapter state is 'running') AND // (Adapter has a binding handle for the protocol above) // We will process fix our internal state when we wake up and go back to D0. if( (IsDeviceStateOn(Adapter) == FALSE) && ((GeneralStatus == NDIS_STATUS_MEDIA_CONNECT) || (GeneralStatus == NDIS_STATUS_MEDIA_DISCONNECT)) && (Adapter->PsMpState == AdapterStateRunning ) && (Adapter->PsNdisHandle != NULL) ) { NdisMIndicateStatus(Adapter->PsNdisHandle, GeneralStatus, StatusBuffer, StatusBufferSize ); return; } // (ii) Special case for wan-line-down: // This is a special case for wan_line_down. Need to forward it even if the adapter is not in D0. if( (IsDeviceStateOn(Adapter) == FALSE) && (GeneralStatus != NDIS_STATUS_WAN_LINE_DOWN) ) { return; } // // we cannot forward status indications until we have been called in our // MpInitialize handler. But we need to look at certain events even if we // are not called in the MpInitialize handler. Otherwise, we could lose these // indications. // switch(GeneralStatus) { case NDIS_STATUS_MEDIA_CONNECT: case NDIS_STATUS_LINK_SPEED_CHANGE: PsGetLinkSpeed(Adapter); break; case NDIS_STATUS_MEDIA_DISCONNECT: // // reset the link speed so definite rate flows can be // admitted. // Adapter->RawLinkSpeed = (ULONG)UNSPECIFIED_RATE; UpdateAdapterBandwidthParameters(Adapter); break; default: break; } // // Our virtual adapter has not been initialized. We cannot forward this indication. // if(Adapter->PsMpState != AdapterStateRunning || Adapter->PsNdisHandle == NULL) { return; } // // For these WAN related indications, we have to send them to wanarp // So, there is no point in looking at these if our virtual adapter has not been initialized. // switch(GeneralStatus) { case NDIS_STATUS_WAN_LINE_UP: { if(Adapter->ProtocolType == ARP_ETYPE_IP) { // // This will call NdisMIndicateStatus, so we have to return // directly. // Status = CreateInterfaceForNdisWan(Adapter, StatusBuffer, StatusBufferSize); return; } break; } case NDIS_STATUS_WAN_LINE_DOWN: // // NDISWAN link has been torn down. // if(Adapter->ProtocolType == ARP_ETYPE_IP) { DeleteInterfaceForNdisWan(Adapter, StatusBuffer, StatusBufferSize); return; } break; default: break; } // // now indicate the status to the upper layer. // NdisMIndicateStatus(Adapter->PsNdisHandle, GeneralStatus, StatusBuffer, StatusBufferSize ); } // ClStatusIndication VOID ClStatusIndicationComplete( IN NDIS_HANDLE ProtocolBindingContext ) /*++ Routine Description: Called by the NIC via NdisIndicateStatusComplete Arguments: See the DDK... Return Values: None --*/ { PADAPTER Adapter = (PADAPTER)ProtocolBindingContext; PsDbgOut(DBG_TRACE, DBG_PROTOCOL, ("(%08X) ClStatusIndicationComplete\n", Adapter)); if ( Adapter->PsNdisHandle != NULL) { NdisMIndicateStatusComplete( Adapter->PsNdisHandle ); } } // ClStatusIndication /* end status.c */