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