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

📄 miscproc.c

📁 此压缩包为杰得开发得z228的BSP的源代码,可以实现很多功能,尤其是视频解码有很好的效果.
💻 C
📖 第 1 页 / 共 5 页
字号:
    Adapter->ucNumCmdTimeOut++;
	DBGPRINT(DBG_TIMERS | DBG_CMDRESP | DBG_ERROR,("MISC - Command TIME OUT !! \n"));
	pTempNode = Adapter->CurCmd;
	pRetPtr = (PHostCmd_DS_GEN)(pTempNode->BufVirtualAddr);

//lykao, 051305, begin
#ifdef IF_SDIO
 if (Adapter->ucNumCmdTimeOut > 2)
   {
        DBGPRINT(DBG_CMDRESP, ("Cmd Timer: More than 2 time out! set AdapterRemoved To TRUE!\n"));
        Adapter->SurpriseRemoved = TRUE;
    }
#endif ///IF_SDIO

    DraleeMsg((L"Command Timeout\n"));

	
    // if the current command uses NO_INT option and is already finished
	if ((pRetPtr->Command & HostCmd_RET_NONE) != 0 &&
		   pTempNode->INTOption == HostCmd_OPTION_NO_INT )
	{
	    DBGPRINT(DBG_CMDRESP,("NO INT COMMAND: calling HandleCommand FinishedEvent from timeout\n"));
		  HandleCommandFinishedEvent(Adapter);
		return;
	}

  if ((pRetPtr->Command == HostCmd_RET_802_11_SCAN ) &&
		 (Adapter->CurCmd->Pad[2] |= MRVDRV_SCAN_CMD_END))
	{
                                     

	Adapter->bIsScanInProgress = FALSE;
    Adapter->bIsAssociationBlockedByScan = FALSE;
		 
	  if (Adapter->PendingGetBssidOid.bIsPendingOID)
		{
			V5DbgMsg( (L"@ indicate get bssid fail\n") );
			NdisMQueryInformationComplete(
						Adapter->MrvDrvAdapterHdl,
						NDIS_STATUS_FAILURE);
	  }
	}	

     if ((pRetPtr->Command == HostCmd_RET_802_11_ASSOCIATE)   &&
		(pRetPtr->Command == HostCmd_RET_802_11_REASSOCIATE) &&
	    (pRetPtr->Command == HostCmd_RET_802_11_REASSOCIATE) &&
	    (pRetPtr->Command == HostCmd_RET_802_11_AD_HOC_START))
    {
        Adapter->bIsAssociateInProgress = FALSE;
        Adapter->bIsAssociationBlockedByScan = FALSE;
		
		if (Adapter->PendingSetSssidOid.bIsPendingOID)
		{
			NdisMQueryInformationComplete(
						Adapter->MrvDrvAdapterHdl,
						NDIS_STATUS_FAILURE);
		}
    }

	/// old code : verify later
    if ((pRetPtr->Command == HostCmd_RET_802_11_SCAN ) &&
	    (pRetPtr->Command == HostCmd_RET_802_11_ASSOCIATE)   &&
		(pRetPtr->Command == HostCmd_RET_802_11_REASSOCIATE) &&
	    (pRetPtr->Command == HostCmd_RET_802_11_REASSOCIATE) &&
	    (pRetPtr->Command == HostCmd_RET_802_11_AD_HOC_START))
    {
   	    // if there is a reset pending
		if (Adapter->bIsPendingReset == TRUE)
		{
			Adapter->bIsPendingReset = FALSE;
			DBGPRINT(DBG_TIMERS,("HWAC - Sending ResetComplete \n"));
			Adapter->HardwareStatus = NdisHardwareStatusReady;

			// Call SetMacPacketFilter()
		    SetMacPacketFilter(
			    	Adapter,
					Adapter->CurrentPacketFilter);
			NdisMResetComplete(
					Adapter->MrvDrvAdapterHdl,
					NDIS_STATUS_SUCCESS,
					FALSE);		
		}
    }

	// set the timer state variable to TRUE
	Adapter->isCommandTimerExpired = TRUE;

	if( pTempNode->PendingInfo == HostCmd_PENDING_ON_GET_OID )
    {
		NdisMQueryInformationComplete(
				Adapter->MrvDrvAdapterHdl,
				NDIS_STATUS_NOT_ACCEPTED
            	);
        DBGPRINT(DBG_CMDRESP, ("Call NdisMQueryInformationComplete With FAILURE\n"));
		
	}
	else if( pTempNode->PendingInfo == HostCmd_PENDING_ON_SET_OID )
    {
		NdisMSetInformationComplete(
				Adapter->MrvDrvAdapterHdl,
				NDIS_STATUS_RESOURCES
            	);
        DBGPRINT(DBG_CMDRESP, ("Call NdisMSetInformationComplete With FAILURE\n"));
	}

	// Clean up 
	ReturnCmdNode (Adapter,Adapter->CurCmd);
	Adapter->CurCmd = NULL;

	//// ExecuteNextCommand(Adapter);
	GetCmdFromQueueToExecute (Adapter);
	return;
}
#ifdef IF_SDIO
/******************************************************************************
 *
 *  Name: MrvDrvSdioCheckFWReadyTimer()
 *
 *  Description: Check if the fw is ready
 *
 *
 *  Arguments:           
 *	    IN PVOID SystemSpecific1
 *	    IN PVOID FunctionContext
 *	    IN PVOID SystemSpecific2
 *	    IN PVOID SystemSpecific3
 *    
 *  Return Value: None
 * 
 *  Notes:               
 *
 *****************************************************************************/
VOID MrvDrvSdioCheckFWReadyTimerFunction(
	IN PVOID SystemSpecific1,
	IN PVOID FunctionContext,
	IN PVOID SystemSpecific2,
	IN PVOID SystemSpecific3
	)
{
	// This timer is used only in SDIO mode. When NDIS calls us
	// to transmit a packet and at point of time, if the FW is not ready,
	// we return insufficient resource error to NIDS and start this timer.
	// When this timer expires (this fn called), it checks whether the
	// FW is ready. If yes, it indicates the NDIS to resend the packet.
	// If FW is not yet ready, it restarts the timer.
	//
	// In case of CF, the equivalent timer fn is MrvDrvCheckTxReadyTimerFunction()

    // get the adpater context
	PMRVDRV_ADAPTER         Adapter = (PMRVDRV_ADAPTER) FunctionContext;
    UCHAR                   ucCardStatus;
	SD_API_STATUS           status;          // intermediate status

    Adapter->MrvDrvSdioCheckFWReadyTimerIsSet = FALSE;

    // check if FW is ready for download
    status = If_ReadRegister(Adapter,
                                            //SD_IO_READ ,
                                            1, // function 1
                                            HCR_HOST_CARD_STATUS_REGISTER, // reg 0x20
                                            FALSE,
                                            &ucCardStatus,
                                            sizeof(ucCardStatus));

    if (!SD_API_SUCCESS(status))
    {
        DBGPRINT(DBG_TIMERS,
            ("SDIO: reading CCR_CARD_STATUS_REGISTER failed, reschedule timer\n"));
        // set up the timer again
        //Adapter->EagleSdioCheckFWReadyTimerIsSet = TRUE;
        //NdisMSetTimer(&Adapter->EagleSdioCheckFWReadyTimer,
        //    SDIO_FW_NOT_READY_WAIT_TIME);

        return;
    }

    if ( ucCardStatus & SDIO_IO_READY )
    {

        if ( ucCardStatus & SDIO_DOWNLOAD_CARD_READY )
        {
            // the firmware is ready for new download
            DBGPRINT(DBG_TIMERS,
                ("SDIO: device is ready for new packet, indicate to NDIS\n"));
            NdisMSendResourcesAvailable(Adapter->MrvDrvAdapterHdl);
            return;
        }

        // HW is ready but FW is not, perhaps missed an interrupt
        DBGPRINT(DBG_TIMERS,
            ("SDIO: SDIO_DOWNLOAD_CARD_READY not set, re-schedule timer.\n"));
        
        // send down last 32 bytes, then start timer
        {
            SD_API_STATUS           status;          // intermediate status
            SD_TRANSFER_CLASS       transferClass;   // general transfer class
            DWORD                   argument;        // argument
            ULONG                   numBlocks;       // number of blocks
            SD_COMMAND_RESPONSE     response;        // IO response status

            numBlocks = 1;

            // write, block mode, address starts at 0, fixed address
            argument =  BUILD_IO_RW_EXTENDED_ARG(SD_IO_OP_WRITE, 
                                                 SD_IO_BLOCK_MODE, 
                                                 1, // function number is 1 
                                                 SDIO_IO_PORT , 
                                                 SD_IO_FIXED_ADDRESS, 
                                                 numBlocks);
            transferClass = SD_WRITE;

	        status = SDSynchronousBusRequest(Adapter->hDevice, 
                                             SD_CMD_IO_RW_EXTENDED,
                                             argument,
                                             transferClass, 
                                             ResponseR5,
                                             &response, 
                                             numBlocks,
                                             SDIO_EXTENDED_IO_BLOCK_SIZE,
                                             // send down the last packet, but only the first 32 bytes
                                             (PUCHAR)Adapter->LastFWBuffer, 
                                             0); 
        }

        // set up the timer again
        Adapter->MrvDrvSdioCheckFWReadyTimerIsSet = TRUE;
        NdisMSetTimer(&Adapter->MrvDrvSdioCheckFWReadyTimer,
            SDIO_FW_NOT_READY_WAIT_TIME);

        return;

    }

    DBGPRINT(DBG_TIMERS,("SDIO: SDIO_IO_READY not set, re-schedule timer.\n"));
    // set up the timer again
    Adapter->MrvDrvSdioCheckFWReadyTimerIsSet = TRUE;
    NdisMSetTimer(&Adapter->MrvDrvSdioCheckFWReadyTimer,
        SDIO_FW_NOT_READY_WAIT_TIME);

    return;
}


#endif // IF_SDIO

//yz_add for wifi_DS mode
#if 0
#define USILAN_ADAPTER_NAME	L"GSPI86861"
//#define OID_MRVL_DEEP_SLEEP	0xff010220
//#define INVALID_HANDLE_VALUE (HANDLE)-1

int GetDeepSleep(OID_MRVL_DS_DEEP_SLEEP *ulEnterDeepSleep)
{
	BOOL fRetVal = TRUE;
	PNDISUIO_QUERY_OID pQueryOid = NULL;
	UCHAR QueryBuffer[sizeof(NDISUIO_QUERY_OID) + 30];
	DWORD dwBytesReturned = 0;
	TCHAR	szAdapterName[10];
	HANDLE hNdis;

	memset(szAdapterName, 0, sizeof(szAdapterName));
	wcscpy(szAdapterName, USILAN_ADAPTER_NAME);

	pQueryOid = (PNDISUIO_QUERY_OID) & QueryBuffer[0];
	pQueryOid->ptcDeviceName = szAdapterName;
	pQueryOid->Oid = OID_MRVL_DEEP_SLEEP;	

	hNdis = CreateFile(	NDISUIO_DEVICE_NAME,										//	Object name.
								0,												//	Desired access.
								0,												//	Share Mode.
								NULL,											//	Security Attr
								OPEN_EXISTING,									//	Creation Disposition.
								FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,	    //	Flag and Attributes..
								(HANDLE)INVALID_HANDLE_VALUE);

	if(hNdis != INVALID_HANDLE_VALUE)
	{
		fRetVal = DeviceIoControl(hNdis, IOCTL_NDISUIO_QUERY_OID_VALUE,
					(LPVOID) pQueryOid, sizeof(NDISUIO_QUERY_OID) + 40,
					(LPVOID) pQueryOid, sizeof(NDISUIO_QUERY_OID) + 40,
					&dwBytesReturned, NULL);
		CloseHandle(hNdis);
		if (fRetVal != 0)
		{
			//fRetVal = DeviceIoControl(g_hNdisUio, IOCTL_NDISUIO_QUERY_OID_VALUE,
			//			(LPVOID) pQueryOid, sizeof(NDISUIO_QUERY_OID) + 40,
			//			(LPVOID) pQueryOid, sizeof(NDISUIO_QUERY_OID) + 40,
			//			&dwBytesReturned, NULL);

			POID_MRVL_DS_DEEP_SLEEP p;
			p=(POID_MRVL_DS_DEEP_SLEEP) (pQueryOid->Data);
			ulEnterDeepSleep->ulEnterDeepSleep = p->ulEnterDeepSleep;		

			return 1;
		}
		else
		{
			
			return 0;
		}
	}
	return 0;
}


int SetDeepSleep(OID_MRVL_DS_DEEP_SLEEP ulEnterDeepSleep)
{
BOOL fRetVal = TRUE;
	PNDISUIO_SET_OID pSetOid = NULL;
	UCHAR SetBuffer[sizeof(NDISUIO_SET_OID) + 40];
	DWORD dwBytesReturned = 0;
	TCHAR		szAdapterName[10];
	POID_MRVL_DS_DEEP_SLEEP p;
	HANDLE hNdis;

	memset(szAdapterName, 0, sizeof(szAdapterName));
    wcscpy(szAdapterName, USILAN_ADAPTER_NAME);


	pSetOid = (PNDISUIO_SET_OID) & SetBuffer[0];
	pSetOid->ptcDeviceName = (LPTSTR) (LPCTSTR) szAdapterName;
	pSetOid->Oid = OID_MRVL_DEEP_SLEEP;
	//POID_MRVL_DS_DEEP_SLEEP p;
	p=(POID_MRVL_DS_DEEP_SLEEP) (pSetOid->Data);
	p->ulEnterDeepSleep = ulEnterDeepSleep.ulEnterDeepSleep ;

	hNdis = CreateFile(	NDISUIO_DEVICE_NAME,										//	Object name.
								0,												//	Desired access.
								0,												//	Share Mode.
								NULL,											//	Security Attr
								OPEN_EXISTING,									//	Creation Disposition.
								FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,	    //	Flag and Attributes..
								(HANDLE)INVALID_HANDLE_VALUE);

	if(hNdis != INVALID_HANDLE_VALUE)
	{
		fRetVal = DeviceIoControl(hNdis, IOCTL_NDISUIO_SET_OID_VALUE,
					(LPVOID) pSetOid, sizeof(NDISUIO_SET_OID) + 40,
					(LPVOID) pSetOid, sizeof(NDISUIO_SET_OID) + 40,
					&dwBytesReturned, NULL);
		//CString retval;
		//retval.Format(_T("fRetVal = %x"),fRetVal);
		//MessageBox(NULL, retval, L"Return", MB_OK);
		CloseHandle(hNdis);
		if (fRetVal == 0)
		{
		//	MessageBox(NULL, L"Fail", L"Fail", MB_OK);
			return 0;
			//MessageBox(TEXT("OID_MRVL_DEEP_SLEEP Fail"));
			RETAILMSG(1,(TEXT("OID_MRVL_DEEP_SLEEP Fail\r\n"))); 
		}
		else
		{
		//	Sleep(200);
			return 1;
			//MessageBox(TEXT("Set MAC_REGISTERS DeviceIoControl Success"));			
		}
	}
	return 0;
}


void wifi_DS(int mode)
{
	OID_MRVL_DS_DEEP_SLEEP nDeepSleep;
	OID_MRVL_DS_DEEP_SLEEP  tt;
	GetDeepSleep(&nDeepSleep);
	if(mode == 1)  //mode = 1, enter DS
	{
		if(nDeepSleep.ulEnterDeepSleep == 0)
		{
			tt.ulEnterDeepSleep=1;
			SetDeepSleep(tt);
			RETAILMSG(1,(TEXT("wifi_DS Enter\r\n"))); 
		}
	}
	else  //mode = 0, exit DS
	{
		if(nDeepSleep.ulEnterDeepSleep == 1)
		{	
			tt.ulEnterDeepSleep=0;
			SetDeepSleep(tt);
			RETAILMSG(1,(TEXT("wifi_DS Exit\r\n"))); 
		}
	}
}
#endif
//yz_end


#if defined(IF_SDIO) || defined(IF_GSPI)
/******************************************************************************
 *
 *  Name: SetStationPowerState()
 *
 *  Description: Set MrvDrv power state
 *
 *  Conditions for Use: Called by power state set OID handler
 *
 *  Arguments:           
 *      PMRVDRV_ADAPTER Adapter
 *      NDIS_DEVICE_POWER_STATE NewPowerState
 *      IN NDIS_OID Oid
 *      IN PULONG BytesRead
 *      IN PULONG BytesNeeded
 *      IN PVOID InformationBuffer
 *    
 *  Return Value:        
 * 
 *  Notes:               
 *
 *****************************************************************************/
NDIS_STATUS
SetStationPowerState(
    PMRVDRV_ADAPTER Adapter,
	NDIS_DEVICE_POWER_STATE NewPowerState,
	IN NDIS_OID Oid,
	IN PULONG BytesRead,
	IN PULONG BytesNeeded,
	IN PVOID InformationBuffer
)
{
	
	BOOLEAN     bFwReloaded = FALSE;
#ifdef IF_GSPI		///crlo:modify
	///UCHAR           ucCardStatus;
	WORD         ucCardStatus;
#endif ///IF_GSPI
	
    //SD_API_STATUS   status;
    IF_FW_STATUS  SdioFWStatus;

	//yz_add
	RETAILMSG(1,(TEXT("SetStationPowerState()::NewPowerState = %d\r\n"),NewPowerState)); 
    
	if( Adapter->CurPowerState == NewPowerState )
		return NDIS_STATUS_SUCCESS;

	
	switch( Adapter->CurPowerState )
	{
	case NdisDeviceStateD0:  // D0->D3
	    DBGPRINT(DBG_LOAD,("D0->D3\n"));
		
	//yz_add for power-down
	RETAILMSG(1,(TEXT("wifi power down\r\n")));
	//PM_EnableAna2(OFF);		//wifi 3.3
	//wifi_DS(ON);		//wifi 3.3			
	
#ifndef IF_GSPI
     //071205
	 /*	
        NdisZeroMemory(&Adapter->PreviousSSID, sizeof(NDIS_802_11_SSID));
         // sanity check to see if the card is up

⌨️ 快捷键说明

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