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

📄 oid.c

📁 PXA255/270平台的 CS8900网卡驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
    case OID_802_3_MAC_OPTIONS:            // NEW
         GenericUlong = 0;
         break;
    case OID_802_3_RCV_ERROR_ALIGNMENT:
         GenericUlong = pvMini_Context->RcvErrorAlignments;
         break;
    case OID_802_3_XMIT_ONE_COLLISION:
         GenericUlong = pvMini_Context->XmitOneCollisions;
         break;
    case OID_802_3_XMIT_MORE_COLLISIONS:
         GenericUlong = pvMini_Context->XmitMoreCollisions;
         break;
    case OID_802_3_XMIT_MAX_COLLISIONS:
         GenericUlong = pvMini_Context->XmitMaxCollisions;
         break;
    case OID_802_3_XMIT_LATE_COLLISIONS:
         GenericUlong = pvMini_Context->XmitLateCollisions;
         break;
    case OID_802_3_XMIT_UNDERRUN:
         GenericUlong = pvMini_Context->XmitUnderrun;
         break;
    case OID_802_3_XMIT_TIMES_CRS_LOST:
         GenericUlong = pvMini_Context->XmitLostCRS;
         break;
    case OID_802_3_RCV_OVERRUN:
         GenericUlong = pvMini_Context->RcvOverrun;
         break;
//  case OID_802_3_XMIT_DEFERRED:
//  case OID_802_3_XMIT_HEARTBEAT_FAILURE:
//       *BytesWritten = 0;
//       return NDIS_STATUS_RESOURCES;
//       break;
    case OID_PNP_CAPABILITIES:
        NKDbgPrintfW(TEXT("OID_PNP_CAPABILITIES.\r\n"));
        break;
    default:
         *BytesWritten = 0;
         return NDIS_STATUS_INVALID_OID;
    } /* endswitch */

    if (SourceBufferLength > InformationBufferLength) {

       NdisMoveMemory(InformationBuffer, SourceBuffer, InformationBufferLength);
       *BytesWritten = InformationBufferLength;
       *BytesNeeded = SourceBufferLength;
       return NDIS_STATUS_INVALID_LENGTH;

    }

    NdisMoveMemory(InformationBuffer, SourceBuffer, SourceBufferLength);
    *BytesWritten = SourceBufferLength;

    PRINTDEBUGMSG(1, (TEXT("<==CS8900:CrystalQueryInformation\r\n")));   
    return NDIS_STATUS_SUCCESS;
}


/*++

Routine Description:
    CrystalSetInformation handles a set operation for a
    single OID.

Arguments:
    MiniportAdapterContext - Context registered with the wrapper, really
        a pointer to the VP context.

    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

--*/

extern
NDIS_STATUS
CrystalSetInformation(
    IN NDIS_HANDLE MiniportAdapterContext,
    IN NDIS_OID Oid,
    IN PVOID InformationBuffer,
    IN ULONG InformationBufferLength,
    OUT PULONG BytesRead,
    OUT PULONG BytesNeeded
    )
{
    NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
    ULONG PacketFilter;
    ULONG OldPacketFilter;
    WORD  LookAhead;
    WORD  LookAheadIndex;
    //WORD  data;       //delete by diaoliangpeng 20051208

    VPM_SetupMiniContext;

    PRINTDEBUGMSG(1, (TEXT("==>CS8900:CrystalSetInformation OID=0x%x\r\n"), Oid));   
    //RETAILMSG(1, (TEXT("==>CS8900:CrystalSetInformation OID=0x%x\r\n"), Oid));   
    //
    // Now check for the most common OIDs
    //
    switch (Oid) 
    {
    case OID_802_3_MULTICAST_LIST:
        /* Make Sure Length of Data looks okay */
        if (InformationBufferLength % ETH_LENGTH_OF_ADDRESS != 0) 
            Status = NDIS_STATUS_INVALID_DATA;
        else
        {
            /* Make sure Multicast buffer has not been exceeded */
            if (InformationBufferLength <= sizeof(pvMini_Context->McastList)) 
            {
                /* Copy Multicast addresses and inform VCHIP */
                NdisMoveMemory(pvMini_Context->McastList, InformationBuffer, InformationBufferLength);
                *BytesRead = InformationBufferLength;

                pvMini_Context->McastListSize = InformationBufferLength / ETH_LENGTH_OF_ADDRESS;

                // Do Flush
                VchipMulticastDeleteAll( pChip );

                // Add each one
                for (LookAheadIndex=0;
                     LookAheadIndex < pvMini_Context->McastListSize;
                     LookAheadIndex++ )
                {
                   VchipMulticastAdd( pChip, (PEA)&pvMini_Context->McastList[LookAheadIndex] );
                } /* endfor */
            } 
            else 
            {
                *BytesRead = 0;
                Status = NDIS_STATUS_MULTICAST_FULL;
            } /* endif */
        } /* endif */
        PRINTDEBUGMSG(1, (TEXT("<==CS8900:CrystalSetInformation OID_802_3_MULTICAST_LIST status = %d\r\n"), Status));   
        return Status;
        break;

    case OID_GEN_CURRENT_PACKET_FILTER:
        if (InformationBufferLength != 4) 
        {
            *BytesNeeded = 4;
            PRINTDEBUGMSG(1, (TEXT("<==CS8900:CrystalSetInformation OID_GEN_CURRENT_PACKET_FILTER NDIS_STATUS_INVALID_LENGTH\r\n")));   
            return NDIS_STATUS_INVALID_LENGTH;
        }
        //
        // Now call the filter package to set the packet filter.
        //
        NdisMoveMemory((PVOID)&PacketFilter, InformationBuffer, (ULONG) sizeof(ULONG));

        //
        // Verify bits
        //
        if (PacketFilter & (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 |
                             NDIS_PACKET_TYPE_ALL_MULTICAST | // Fails Cert test
                             NDIS_PACKET_TYPE_ALL_LOCAL // No Loopback!
                            )) 
        {
            *BytesRead = 4;
            *BytesNeeded = 0;

            PRINTDEBUGMSG(1, (TEXT("<==CS8900:CrystalSetInformation OID_GEN_CURRENT_PACKET_FILTER NDIS_STATUS_NOT_SUPPORTED\r\n")));   
            return NDIS_STATUS_NOT_SUPPORTED;
        }
        OldPacketFilter = pvMini_Context->PacketFilter;
        pvMini_Context->PacketFilter = PacketFilter;
        pChip->Config.Filtering = 0;
        if (PacketFilter & NDIS_PACKET_TYPE_DIRECTED) 
            pChip->Config.Filtering |= FILTER_INDIVIDUAL_ACCEPT;

        if (PacketFilter & NDIS_PACKET_TYPE_BROADCAST) 
            pChip->Config.Filtering |= FILTER_BROADCAST_ACCEPT;

        if (PacketFilter & (NDIS_PACKET_TYPE_MULTICAST |
                            NDIS_PACKET_TYPE_ALL_MULTICAST)) 
        {
            pChip->Config.Filtering |= FILTER_MULTICAST_ACCEPT;
             // Do Flush
            VchipMulticastDeleteAll( pChip );
            if (PacketFilter & NDIS_PACKET_TYPE_ALL_MULTICAST)
                VchipMulticastAddAll( pChip );
            else 
            {
                // Add each one
                for (LookAheadIndex=0;
                     LookAheadIndex < pvMini_Context->McastListSize;
                     LookAheadIndex++ )
                {
                   VchipMulticastAdd( pChip, (PEA)&pvMini_Context->McastList[LookAheadIndex] );
                } /* endfor */
            }
        } /* endif */

        if (PacketFilter & NDIS_PACKET_TYPE_PROMISCUOUS) 
            pChip->Config.Filtering |= FILTER_PROMISCUOUS_ACCEPT;
        VchipChangeFiltering( pChip );
        break;

    case OID_GEN_CURRENT_LOOKAHEAD:
        LookAhead = *((WORD *)InformationBuffer);
        if (LookAhead > (VP_MAX_FRAMESIZE - VP_HEADERSIZE))
        {
            PRINTDEBUGMSG(1, (TEXT("<==CS8900:CrystalSetInformation OID_GEN_CURRENT_LOOKAHEAD NDIS_STATUS_INVALID_LENGTH\r\n")));   
            return NDIS_STATUS_INVALID_LENGTH;
        }
        pvMini_Context->ProtocolLookahead = LookAhead;
        *BytesRead = InformationBufferLength;
        break;
  
    case OID_GEN_PROTOCOL_OPTIONS:
        *BytesRead = InformationBufferLength;
        break;

 /*      case OID_GEN_RESET_COUNTS:  //QQQQQQQQQQQQ new for CE 4.0
          *BytesRead = 125;  //125 ms
          break;


       case OID_GEN_MEDIA_SENSE_COUNTS: //QQQQQQQQQQQQ new for CE 4.0
          *BytesRead = 5000; //5 sec
          break;
*/
     case OID_PNP_SET_POWER:
         if(*((int*)InformationBuffer)==NdisDeviceStateD0) 
         {
			 RETAILMSG(1, (TEXT("|++>CS8900A power on\r\n")));
			 VchipStartup( pChip );
		     RETAILMSG(1, (TEXT("|-->CS8900A power on\r\n")));
         }   
         else
         {
             RETAILMSG(1, (TEXT("|++>CS8900A power off\r\n")));   
			 VchipDisableInterrupts( pChip );
			 VchipShutdown( pChip );
			 pvMini_Context->CurrentState = NdisHardwareStatusNotReady;
			 VominiShutdown( pChip->pOSD );
//           data = ReadPacketPage(CRYSTAL_SELF_CONTROL_REGISTER);
//           data |= CRYSTAL_SCR_SW_SUSPEND;
//           WritePacketPage( CRYSTAL_SELF_CONTROL_REGISTER, data );
             RETAILMSG(1, (TEXT("|-->CS8900A power off\r\n")));             
         }
         //Status = NDIS_STATUS_SUCCESS;
        break;
	default:
	    *BytesRead = 0;                           //@251
	    *BytesNeeded = 0;                         //@251
	    PRINTDEBUGMSG(1, (TEXT("<==CS8900:CrystalSetInformation INVALID_OID\r\n")));   
        return NDIS_STATUS_INVALID_OID;
        break;
    }

    PRINTDEBUGMSG(1, (TEXT("<==CS8900:CrystalSetInformation SUCCESS\r\n")));   
    return NDIS_STATUS_SUCCESS;
}

⌨️ 快捷键说明

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