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

📄 lan91c96_miniport.c

📁 ARM9基于WINDOWSCE的BSP源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
                                ReturnData = NdisHardwareStatusReset;
                }
                break;

        default:
                RETAILMSG(ZONE_INIT, (TEXT("Unknown or Unsupported OID Statistics Query\r\n")));
                BytesToMove = 0;
                Status      = NDIS_STATUS_NOT_SUPPORTED;
                break;
        }
        
        
        if(BytesToMove)
        {
                Status = CopyInfo(InformationBuffer,
                        Source,
                        InformationBufferLength,
                        BytesToMove,
                        BytesWritten,
                        BytesNeeded);
        }
        
        
        RETAILMSG(ZONE_INIT, (TEXT("LAN91C96 <== MiniportQuery Information OID\r\n")));
        return Status;
}


/*
 Function Name : LAN91C96_MiniportReset
 Description   : This function is a required function that issues a hardware reset 
                    to the network adapter and/or resets the driver抯 software state.
 Parameters    : 
                PBOOLEAN    AddressingReset -Points to a variable that MiniportReset
                            sets to TRUE if the NDIS library should call 
                            MiniportSetInformation to restore addressing information 
                            to the current values. 
                                NDIS_HANDLE AdapterContext - Handle to the adapter structure

 Return Value  :
            NDIS_STATUS Status
 */
NDIS_STATUS     LAN91C96_MiniportReset          (
                                                        PBOOLEAN    AddressingReset,
                                                        NDIS_HANDLE AdapterContext
                                                )
{
        NDIS_STATUS          Status=NDIS_STATUS_SUCCESS;
        MINIPORT_ADAPTER        *Adapter = (MINIPORT_ADAPTER *) AdapterContext;
        RETAILMSG(ZONE_INIT, (TEXT("LAN91C96 ==> Miniport Reset\r\n")));
        Status = AdapterReset(Adapter);
		RETAILMSG(ZONE_INIT, (TEXT("LAN91C96 <== Miniport Reset\r\n")));
        return Status;
}



/*
 Function Name : LAN91C96_MiniportSend
 Description   :
                This function writes the packet data to the chip. Assumes that the packet has been alread
				allocated, and specified by the PacketNumber parameter.
 Parameters    : 
                MINIPORT *Adapter - Pointer to the adapter structure
                PNDIS_PACKET NDISPacket - Points to a packet descriptor to be transmitted. 
				UINT PacketNumber - Already allocated packet number, to be used for transmission

 Return Value  :
            NDIS_STATUS  Status
*/ 
NDIS_STATUS     LAN91C96_MiniportSend               (
                                                                NDIS_HANDLE  AdapterContext,
                                                                PNDIS_PACKET pNDISPacket,
                                                                UINT         Flags
                                                    )
{
        MINIPORT_ADAPTER        *Adapter = (MINIPORT_ADAPTER *) AdapterContext;
		MINIPORT_PACKET			*Packet;
        ULONG                   IOBase;
        UINT                    PacketLength,
                AllocateOk;     
        USHORT              AllocSts,
                PacketNumber,
                temp;

        RETAILMSG(ZONE_TX, (TEXT("LAN91C96 ==> Miniport Send\r\n")));
   
        IOBase = Adapter->IOBase;

        //Make sure that the packet size is in legal limits.
        NdisQueryPacket(pNDISPacket,NULL,NULL,NULL,(PUINT) &PacketLength);
        if ((PacketLength > MAX_FRAME_SIZE) || (PacketLength < MIN_FRAME_SIZE))
        {
            RETAILMSG(ZONE_TX, (TEXT("LAN91C96: Invalid Packet Size\r\n")));
            RETAILMSG(ZONE_TX, (TEXT("LAN91C96 <== Miniport Send\r\n")));
            return (NDIS_STATUS_FAILURE);
        }

		if (Adapter->AllocIntPending)
		{
			RETAILMSG(ZONE_TX, (TEXT("LAN91C96: Allocation in process\r\n")));
			RETAILMSG(ZONE_TX, (TEXT("LAN91C96: <== Miniport Send\r\n")));        
			Adapter->TxResPending = TRUE;
			return (NDIS_STATUS_RESOURCES);
		}

		//Now Allocate the on-chip buffer for transmission. (256byte units)
        temp = (PacketLength + FRAME_OVERHEAD) >> 8;
        temp &= 0x0007;         //last 3 bits only
        temp |= CMD_ALLOC;

        LAN91C96_Write(IOBase + BANK_SELECT,2);
        LAN91C96_Write(IOBase + BANK2_MMUCMD,(USHORT)(temp));
        AllocateOk = MMU_WAIT;
        while(AllocateOk)
        {
                LAN91C96_Read(IOBase + BANK2_INT_STS, (PUSHORT) &AllocSts);
				if(AllocSts & INT_ALLOC) break;
                AllocateOk--;
        }

		if (!(AllocSts & INT_ALLOC))
        {
			//Allocation failed
			Packet			= (MINIPORT_PACKET *) pNDISPacket->MiniportReserved;
			Packet->Next	= (MINIPORT_PACKET *) 0;
			QuePacket(Adapter->AllocPending, Packet);
			Adapter->AllocIntPending = TRUE;
			Adapter->TxResPending = TRUE;
			NdisMSynchronizeWithInterrupt((PNDIS_MINIPORT_INTERRUPT)&Adapter->InterruptInfo, (PVOID)AllocIntEnabler, (PVOID)Adapter);
			RETAILMSG(ZONE_TX, (TEXT("LAN91C96: Allocation FAILED - Packet Queued\r\n")));
			RETAILMSG(ZONE_TX, (TEXT("LAN91C96: <== Miniport Send\r\n")));        
			return (NDIS_STATUS_PENDING);
        }
    
        //If we get here then no problems with the shortage of buffers
        Adapter->TxResPending = FALSE;
				        
        //Get the allocated packet
        LAN91C96_Read(IOBase + BANK2_PNR,   (PUSHORT)&PacketNumber);
        PacketNumber = PacketNumber >> 8; //allocated packet number in higher byte

		AdapterWriteData(Adapter, pNDISPacket, PacketNumber);
		RETAILMSG(ZONE_TX, (TEXT("LAN91C96 <== Miniport Send\r\n")));
		return (NDIS_STATUS_PENDING);    
}

NDIS_STATUS AdapterWriteData(
						 MINIPORT_ADAPTER *Adapter,
						 PNDIS_PACKET pNDISPacket,
						 UINT         PacketNumber
						 )
{
	PNDIS_BUFFER            pCurrentBuffer;
	ULONG                   IOBase;
	UINT                    PacketLength,CurrentBufferLength;
	USHORT              	ControlWord;
	PUCHAR              pCurrentBufferAddr,ptemp;
	UCHAR               OddByte=0;
	MINIPORT_PACKET     *Packet;
	UINT	Plength;
	unsigned short * pBuffer;
	UINT	b=1;
	
	RETAILMSG(ZONE_TX, (TEXT("LAN91C96 ==> AdapterWriteData\r\n")));
	
	IOBase = Adapter->IOBase;
	
	//Make sure that the packet size is in legal limits.
	NdisQueryPacket(pNDISPacket,NULL,NULL,&pCurrentBuffer,(PUINT) &PacketLength);
	
	LAN91C96_Write(IOBase + BANK_SELECT,2);
	//Write the allocated packet no. to PNR
	LAN91C96_Write(IOBase + BANK2_PNR, PacketNumber);
	NdisStallExecution(1);
	
	//Set the pointer register to TX + AUTO_INCR + WRITE
//	LAN91C96_Write(IOBase + BANK2_PTR, PTR_AUTO);
	LAN91C96_Write(IOBase + BANK2_PTR, 0);
	//Write the status word (placeholder)
	LAN91C96_Write(IOBase + BANK2_DATA1, (USHORT) 0);
//zq add
	LAN91C96_Write(IOBase + BANK2_PTR, 2*b);
	//Write the byte count + packet overhead
	LAN91C96_Write(IOBase + BANK2_DATA1, (USHORT)(PacketLength+FRAME_OVERHEAD));
	
	//Query for the first non-zero buffer
	NdisQueryPacket(pNDISPacket,NULL,NULL,&pCurrentBuffer,(PUINT) &PacketLength);
	NdisQueryBuffer(pCurrentBuffer, (PVOID*)&pCurrentBufferAddr, &CurrentBufferLength);
	while ((pCurrentBuffer) && (CurrentBufferLength == 0))
	{
		NdisGetNextBuffer(pCurrentBuffer, (PNDIS_BUFFER *)&pCurrentBuffer);
		NdisQueryBuffer(pCurrentBuffer, (PVOID*)&pCurrentBufferAddr, &CurrentBufferLength);
	}
	
	//Copy the data to the TxBuffer   
	ptemp = Adapter->TxBuffer;
	do
	{
		NdisMoveMemory(ptemp, pCurrentBufferAddr, (ULONG)CurrentBufferLength);
		(ULONG)ptemp += CurrentBufferLength;
		NdisGetNextBuffer (pCurrentBuffer, (PNDIS_BUFFER *)&pCurrentBuffer);  //Get the next buffer
		NdisQueryBuffer (pCurrentBuffer, (PVOID*)&pCurrentBufferAddr, &CurrentBufferLength);        
	}
	while(pCurrentBuffer);
	
	//Write the data to the chip
//	NdisRawWritePortBufferUshort(IOBase + BANK2_DATA1, Adapter->TxBuffer, PacketLength>>1);
	pBuffer = (unsigned short *)Adapter->TxBuffer;
	Plength = (PacketLength>>1);
	RETAILMSG (ZQ, (TEXT("	PacketLength	= 0x%x\r\n"),PacketLength));
{	
	//int i=0;
	for(;Plength>0;Plength--)
	{	RETAILMSG (ZQ, (TEXT("	pBuffer	= 0x%x\r\n"),*pBuffer));
	//	RETAILMSG (ZQ, (TEXT("	Adapter->TxBuffer	= 0x%x\r\n"),*((unsigned short *)Adapter->TxBuffer+i)));
	//	RETAILMSG (ZQ, (TEXT("	i	= %i\r\n"),i));
		//zq add
		b++;
		LAN91C96_Write(IOBase + BANK2_PTR, 2*b);
		LAN91C96_Write(IOBase + BANK2_DATA1,*(unsigned short *)pBuffer);
		(unsigned short *)pBuffer++;
	//	i++;
		
	}
	b++;
	LAN91C96_Write(IOBase + BANK2_PTR, 2*b);
}
//**************    
//If odd length packet
	if (PacketLength & 1)
	{RETAILMSG (ZQ, (TEXT("	odd length packet****************\r\n")));
		ptemp = Adapter->TxBuffer;
		OddByte = ptemp[PacketLength-1];
		ControlWord = ((CTL_BYTE_ODD | CTL_BYTE_CRC) << 8)| OddByte;
	}
	else
		ControlWord = (CTL_BYTE_CRC<< 8);	 
	//Write the control word to the chip
	LAN91C96_Write(IOBase+BANK2_DATA1, (USHORT)ControlWord);
	//Now enque the packet for transmission..
	LAN91C96_Write( IOBase + BANK_SELECT, (USHORT) 2);
	LAN91C96_Write (IOBase+BANK2_MMUCMD, CMD_ENQ_TX);   
	Packet			= (MINIPORT_PACKET *) pNDISPacket->MiniportReserved;
	Packet->Next	= (MINIPORT_PACKET *) 0;
	QuePacket(Adapter->AckPending, Packet);
	RETAILMSG(ZONE_TX, (TEXT("LAN91C96 <== AdapterWriteData\r\n")));
	return (NDIS_STATUS_PENDING);
}

⌨️ 快捷键说明

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