📄 lan91c96_miniport.c
字号:
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 + -