⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 miniport.c

📁 wince底层驱动开发代码 ARM作为一种嵌入式系统处理器
💻 C
📖 第 1 页 / 共 3 页
字号:
    case OID_GEN_MAXIMUM_LOOKAHEAD:

		GenericULong = CS8900_MAX_LOOKAHEAD;

		DEBUGMSG(0, (TEXT("----> OID_GEN_MAXIMUM_LOOKAHEAD\r\n")));
		break;


    case OID_GEN_MAXIMUM_FRAME_SIZE:

		GenericULong = (ULONG)(1518 - CS8900_HEADER_SIZE);

		DEBUGMSG(0, (TEXT("----> OID_GEN_MAXIMUM_FRAME_SIZE\r\n")));
		break;


    case OID_GEN_MAXIMUM_TOTAL_SIZE:

		GenericULong = (ULONG)(1518);

		DEBUGMSG(0, (TEXT("----> OID_GEN_TOTAL_SIZE\r\n")));
		break;


    case OID_GEN_LINK_SPEED:

		GenericULong = (ULONG)(100000);

		DEBUGMSG(0, (TEXT("----> OID_GEN_LINK_SPEED\r\n")));
		break;


    case OID_GEN_TRANSMIT_BUFFER_SPACE:

		GenericULong = (ULONG)(1518);

		DEBUGMSG(0, (TEXT("----> OID_GEN_TRANSMIT_BUFFER_SPACE\r\n")));
//		while(1);
		break;

    case OID_GEN_RECEIVE_BUFFER_SPACE:

		GenericULong = (ULONG)(1518);

		DEBUGMSG(0, (TEXT("----> OID_GEN_RECEIVE_BUFFER_SPACE\r\n")));
//		while(1);
		break;

    case OID_GEN_TRANSMIT_BLOCK_SIZE:

		GenericULong = (ULONG)(1518);

		DEBUGMSG(0, (TEXT("----> OID_GEN_TRANSMIT_BLOCK_SIZE\r\n")));
//		while(1);
		break;

    case OID_GEN_RECEIVE_BLOCK_SIZE:

		GenericULong = (ULONG)(1518);

		DEBUGMSG(0, (TEXT("----> OID_GEN_RECEIVE_BLOCK_SIZE\r\n")));
//		while(1);
		break;

#ifdef CS8900

    case OID_GEN_VENDOR_ID:

		NdisMoveMemory(
	    	(PVOID)&GenericULong,
	    	Adapter->PermanentAddress,
	    	3
	    	);
		GenericULong &=	0xFFFFFF00;
		MoveSource = (PVOID)(&GenericULong);
		MoveBytes = sizeof(GenericULong);

		DEBUGMSG(0, (TEXT("----> OID_GEN_VENDER_ID\r\n")));
		break;

    case OID_GEN_VENDOR_DESCRIPTION:

		MoveSource = (PVOID)"CS8900A Adapter";
		MoveBytes = 21;

		DEBUGMSG(0, (TEXT("----> OID_GEN_VENDOR_DESCRIPTION\r\n")));
		break;

#else

    case OID_GEN_VENDOR_ID:

		NdisMoveMemory(
	    	(PVOID)&GenericULong,
	    	Adapter->PermanentAddress,
	    	3
	    	);
		GenericULong &=	0xFFFFFF00;
		GenericULong |=	0x01;
		MoveSource = (PVOID)(&GenericULong);
		MoveBytes = sizeof(GenericULong);

		break;

    case OID_GEN_VENDOR_DESCRIPTION:

		MoveSource = (PVOID)"Novell 1000 Adapter.";
		MoveBytes = 21;

		break;

#endif

    case OID_GEN_DRIVER_VERSION:

		GenericUShort =	((USHORT)CS8900_NDIS_MAJOR_VERSION << 8) |
			CS8900_NDIS_MINOR_VERSION;

		MoveSource = (PVOID)(&GenericUShort);
		MoveBytes = sizeof(GenericUShort);
		break;

    case OID_GEN_CURRENT_LOOKAHEAD:

		GenericULong = (ULONG)(Adapter->MaxLookAhead);

		DEBUGMSG(0, (TEXT("----> OID_GEN_CURRENT_LOOKAHEAD\r\n")));
		break;

    case OID_802_3_PERMANENT_ADDRESS:

		CS8900_MOVE_MEM((PCHAR)GenericArray,
		    Adapter->PermanentAddress,
		    CS8900_LENGTH_OF_ADDRESS);

		MoveSource = (PVOID)(GenericArray);
		MoveBytes = sizeof(Adapter->PermanentAddress);

		DEBUGMSG(0, (TEXT("----> OID_802_3_PERMANENT_ADDRESS\r\n")));
		break;

    case OID_802_3_CURRENT_ADDRESS:

		CS8900_MOVE_MEM((PCHAR)GenericArray,
		    Adapter->StationAddress,
		    CS8900_LENGTH_OF_ADDRESS);

		MoveSource = (PVOID)(GenericArray);
		MoveBytes = sizeof(Adapter->StationAddress);

		DEBUGMSG(0, (TEXT("----> OID_802_3_CURRENT_ADDRESS\r\n")));
		break;

    case OID_802_3_MAXIMUM_LIST_SIZE:

		GenericULong = (ULONG) (Adapter->MulticastListMax);

		DEBUGMSG(0, (TEXT("----> OID_802_3_MAXIMUM_LIST_SIZE\r\n")));
		break;

    case OID_GEN_XMIT_OK:

		GenericULong = (UINT)(Adapter->FramesXmitGood);

		DEBUGMSG(0, (TEXT("----> OID_GEN_XMIT_OK\r\n")));
		break;

    case OID_GEN_RCV_OK:

		GenericULong = (UINT)(Adapter->FramesRcvGood);

		DEBUGMSG(0, (TEXT("----> OID_GEN_RCV_OK\r\n")));
		break;

    case OID_GEN_XMIT_ERROR:

		GenericULong = (UINT)(Adapter->FramesXmitBad);
		DEBUGMSG(0, (TEXT("----> OID_GEN_XMIT_ERROR\r\n")));
		break;

    case OID_GEN_RCV_ERROR:

		GenericULong = (UINT)(Adapter->CrcErrors);
		DEBUGMSG(0, (TEXT("----> OID_GEN_RCV_ERROR\r\n")));
		break;

    case OID_GEN_RCV_NO_BUFFER:

		GenericULong = (UINT)(Adapter->MissedPackets);
		DEBUGMSG(0, (TEXT("----> OID_GEN_RCV_NO_BUFFER\r\n")));
		break;

    case OID_802_3_RCV_ERROR_ALIGNMENT:

		GenericULong = (UINT)(Adapter->FrameAlignmentErrors);
		DEBUGMSG(0, (TEXT("----> OID_802_3_RCV_ERROR_ALIGNMENT\r\n")));
		break;

    case OID_802_3_XMIT_ONE_COLLISION:

		GenericULong = (UINT)(Adapter->FramesXmitOneCollision);
		DEBUGMSG(0, (TEXT("----> OID_802_3_XMIT_ONE_COLLISION\r\n")));
		break;

    case OID_802_3_XMIT_MORE_COLLISIONS:

		GenericULong = (UINT)(Adapter->FramesXmitManyCollisions);
		break;


    case OID_GEN_MEDIA_CONNECT_STATUS:		
		GenericULong = NdisMediaStateConnected;                 
		break;

    case OID_GEN_MAXIMUM_SEND_PACKETS:

        	GenericULong = 1;
        	break;
		
    case OID_GEN_VENDOR_DRIVER_VERSION:		
		GenericULong = (DRIVER_MAJOR_VERSION << 16) | DRIVER_MINOR_VERSION;
		break;
		

    default:

		StatusToReturn = NDIS_STATUS_INVALID_OID;
		break;

    }


    if (StatusToReturn == NDIS_STATUS_SUCCESS) {

		if (MoveBytes >	BytesLeft) {

			//
	    	// Not enough room in InformationBuffer. Punt
	    	//

	    	*BytesNeeded = MoveBytes;

	    	StatusToReturn = NDIS_STATUS_INVALID_LENGTH;

		} else {

	    	//
	    	// Store result.
	    	//

	    	CS8900_MOVE_MEM(InfoBuffer,	MoveSource, MoveBytes);

	    	(*BytesWritten) += MoveBytes;

		}
    }

	DEBUGMSG(0, (TEXT("-CS8900:CS8900QueryInformation\r\n")));
    return StatusToReturn;
}

extern
NDIS_STATUS
CS8900SetInformation(
    IN NDIS_HANDLE MiniportAdapterContext,
    IN NDIS_OID	Oid,
    IN PVOID InformationBuffer,
    IN ULONG InformationBufferLength,
    OUT	PULONG BytesRead,
    OUT	PULONG BytesNeeded
    )

/*++

Routine	Description:

    CS8900SetInformation handles a set operation for a
    single OID.

Arguments:

    MiniportAdapterContext - Context registered	with the wrapper, really
	a pointer to the adapter.

    Oid	- The OID of the set.

    InformationBuffer -	Holds the data to be set.

    InformationBufferLength - The length of InformationBuffer.

    BytesRead -	If the call is successful, returns the number
	of bytes read from InformationBuffer.

    BytesNeeded	- If there is not enough data in InformationBuffer
	to satisfy the OID, returns the	amount of storage needed.

Return Value:

    NDIS_STATUS_SUCCESS
    NDIS_STATUS_PENDING
    NDIS_STATUS_INVALID_LENGTH
    NDIS_STATUS_INVALID_OID

--*/
{
    //
    // Pointer to the adapter structure.
    //
    PCS8900_ADAPTER Adapter = (PCS8900_ADAPTER)MiniportAdapterContext;

    //
    // General Algorithm:
    //
    //	   Verify length
    //	   Switch(Request)
    //	      Process Request
    //

    UINT BytesLeft = InformationBufferLength;
    PUCHAR InfoBuffer =	(PUCHAR)(InformationBuffer);

    //
    // Variables for a particular request
    //
    UINT OidLength;

    //
    // Variables for holding the new values to be used.
    //
    ULONG LookAhead;
    ULONG Filter;

    //
    // Status of the operation.
    //
    NDIS_STATUS	StatusToReturn = NDIS_STATUS_SUCCESS;


    DEBUGMSG(0,
	(TEXT("+CS8900:CS8900SetInformation\r\n")));

    //
    // Get Oid and Length of request
    //
    OidLength =	BytesLeft;

    switch (Oid) {

    case OID_802_3_MULTICAST_LIST:

		DEBUGMSG(0, (TEXT("OID_802_3_MULTICAST_LIST\r\n")));

		//
		// Verify length
		//
		if ((OidLength % CS8900_LENGTH_OF_ADDRESS) != 0)
		{
			StatusToReturn = NDIS_STATUS_INVALID_LENGTH;

	    	*BytesRead = 0;
	    	*BytesNeeded = 0;

	   		break;
		}

		//
		// Set the new list on the adapter.
		//
		NdisMoveMemory(Adapter->Addresses, InfoBuffer, OidLength);
	
		break;

    case OID_GEN_CURRENT_PACKET_FILTER:

		DEBUGMSG(0, (TEXT("OID_GEN_CURRENT_PACKET_FILTER\r\n")));

		//
		// Verify length
		//

		if (OidLength != 4 ) {

	    	StatusToReturn = NDIS_STATUS_INVALID_LENGTH;

	    	*BytesRead = 0;
	    	*BytesNeeded = 0;

			break;

		}

		CS8900_MOVE_MEM(&Filter, InfoBuffer, 4);

		//
		// Verify bits
		//

		if (Filter & (NDIS_PACKET_TYPE_SOURCE_ROUTING |
	      	NDIS_PACKET_TYPE_SMT |
	      	NDIS_PACKET_TYPE_MAC_FRAME |
	      	NDIS_PACKET_TYPE_FUNCTIONAL |
	      	NDIS_PACKET_TYPE_ALL_FUNCTIONAL |
	      	NDIS_PACKET_TYPE_GROUP
	     	))	{

	    	StatusToReturn = NDIS_STATUS_NOT_SUPPORTED;

	    	*BytesRead = 4;
	    	*BytesNeeded = 0;

	    	break;

		}

		break;

    case OID_GEN_CURRENT_LOOKAHEAD:

		DEBUGMSG(0, (TEXT("OID_GEN_CURRENT_LOOKAHEAD\r\n")));

		//
		// Verify length
		//

		if (OidLength != 4) {
		
			StatusToReturn = NDIS_STATUS_INVALID_LENGTH;

	    	*BytesRead = 0;
	    	*BytesNeeded = 0;

	    	break;

		}

		//
		// Store the new value.
		//

		CS8900_MOVE_MEM(&LookAhead, InfoBuffer,	4);

		if (LookAhead <= CS8900_MAX_LOOKAHEAD) {
			Adapter->MaxLookAhead = LookAhead;
		} else {
			StatusToReturn = NDIS_STATUS_INVALID_LENGTH;
		}

		break;

    default:

		StatusToReturn = NDIS_STATUS_INVALID_OID;

		*BytesRead = 0;
		*BytesNeeded = 0;

		break;
    }


    if (StatusToReturn == NDIS_STATUS_SUCCESS) {

		*BytesRead = BytesLeft;
		*BytesNeeded = 0;

    }

    DEBUGMSG(0, (TEXT("-CS8900:CS8900SetInformation\r\n")));
    return(StatusToReturn);
}

VOID
CS8900CancelSendPackets(
   IN NDIS_HANDLE MiniportAdapterContext,
   IN PVOID pvCancelId
)
/*++

Routine Description:
   The miniport entry point to handle cancellation of all send packets
   that match the given CancelId. If we have queued any packets that match
   this, then we should dequeue them and call NdisMSendComplete for all
   such packets, with a status of NDIS_STATUS_REQUEST_ABORTED.

   We should also call NdisCancelSendPackets in turn, on each lower binding
   that this adapter corresponds to. This is to let miniports below cancel
   any matching packets.

Arguments:
   hMiniportAdapterContext - pointer to the binding structure
   pvCancelId - ID of packets to be cancelled.

Return Value:
   None

--*/
{
    PCS8900_ADAPTER Adapter = (PCS8900_ADAPTER)MiniportAdapterContext;


   //
   // If we queue packets on our adapter structure, this would be 
   // the place to acquire a spinlock to it, unlink any packets whose
   // Id matches CancelId, release the spinlock and call NdisMSendComplete
   // with NDIS_STATUS_REQUEST_ABORTED for all unlinked packets.
   //

   //
   // Next, pass this down so that we let the miniport(s) below cancel
   // any packets that they might have queued.
   //
//   NdisCancelSendPackets(Adapter->hPTBinding, pvCancelId);
//   DEBUGMSG(ETHDBG, (TEXT("CS8900CancelSendPackets\n")));
   return;
}

VOID
CS8900DevicePnPEvent(
   IN NDIS_HANDLE MiniportAdapterContext,
   IN NDIS_DEVICE_PNP_EVENT  devicePnPEvent,
   IN PVOID pvInformationBuffer,
   IN ULONG ulInformationBufferLength
)
/*++

Routine Description:
   This handler is called to notify us of PnP events directed to
   our miniport device object.

Arguments:
   hMiniportAdapterContext  - pointer to the binding structure
   devicePnPEvent - the event
   pvInformationBuffer - points to additional event-specific information
   ulInformationBufferLength - length of above

Return Value:
   None

--*/
{
   // TBD - add code/comments about processing this.
    PCS8900_ADAPTER Adapter = (PCS8900_ADAPTER)MiniportAdapterContext;


//   DEBUGMSG(ETHDBG, (TEXT("MiniportDevicePnPEvent\n")));
   return ;
}


VOID
CS8900AdapterShutdown(
   IN NDIS_HANDLE MiniportAdapterContext
)
/*++

Routine Description:
   This handler is called to notify us of an impending system shutdown.

Arguments:
   MiniportAdapterContext  - pointer to the binding structure

Return Value:
   None

--*/
{
    PCS8900_ADAPTER Adapter = (PCS8900_ADAPTER)MiniportAdapterContext;


//   DEBUGMSG(ETHDBG, (TEXT("MiniportAdapterShutdown:\r\n")));
   return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -