📄 intproc.c
字号:
////NKDbgPrintfW(TEXT("WLAN: pRxBufVM is %x \n"),pRxBufVM);
p_pkt = (PHostCmd_DS_CODE_DNLD)((ULONG)pRxBufVM - MRVDRV_ETH_RX_HIDDEN_HEADER_SIZE);
//p_pkt = (PHostCmd_DS_CODE_DNLD)pRxBufVM;
pAdapter->pRxPD1 = (PRxPD)p_pkt->Code;
//pAdapter->pRxPD1 = (PRxPD)pkt.Code;
////NKDbgPrintfW(TEXT("WLAN: pRxBufVM is %x \n"),pRxBufVM);
////NKDbgPrintfW(TEXT("WLAN: pAdapter->pRxCurPkt is %x \n"),pAdapter->pRxCurPkt);
////NKDbgPrintfW(TEXT("WLAN: pAdapter->pRxPD1 is %x \n"),pAdapter->pRxPD1);
//gspi_read_data_direct((unsigned char*)p_pkt->Code, DATA_RDWRPORT_REG, (usLength));
gspi_read_data_direct((unsigned char*)p_pkt->Code, DATA_RDWRPORT_REG, (usLength>>1));
gspi_write_reg(CARD_INT_CAUSE_REG, CIC_RxUpLdOvr);
// length of the packet content itself
//usLength = usLength - sizeof(pkt.Type) - sizeof(pkt.Len);
#ifdef WPA
if((*((UCHAR *)((ULONG)pRxBufVM + 14)) == 0xaa ) &&
(*((UCHAR *)((ULONG)pRxBufVM + 15)) == 0xaa ) &&
(*((UCHAR *)((ULONG)pRxBufVM + 16)) == 0x03 ) &&
(*((UCHAR *)((ULONG)pRxBufVM + 20)) == 0x88 ) &&
(*((UCHAR *)((ULONG)pRxBufVM + 21)) == 0x8e ) )
{
//RETAILMSG(1,(TEXT("EAPOL Key: Packet is a Rx DATA! \r\n")));
usLength -= 8;
//NdisMoveMemory( ttBuf, pAdapter->pRxBuf+20, pAdapter->ulRxSize-20);
NdisMoveMemory((PUCHAR)((ULONG)pRxBufVM + 12),(PUCHAR)((ULONG)pRxBufVM + 20), (usLength-20));
//NdisMoveMemory( pAdapter->pRxBuf+12, pAdapter->pRxBuf+20, pAdapter->ulRxSize-20);
}
#endif // WPA
//dralee 072705
//pAdapter->ulRxSize = usLength;
pAdapter->ulRxSize = usLength-sizeof(RxPD);
//NdisMoveMemory(pRxBufVM,pkt.Code + sizeof(RxPD), pAdapter->ulRxSize);
//#ifdef MRVL_PSCONFIRM
//if(pAdapter->bPSConfirm==FALSE)
HandleRxReadyEvent(pAdapter);
//else if(pAdapter->bPSConfirm==TRUE)
//{
//dralee_0110
// pPacket = pAdapter->pRxCurPkt;
// pAdapter->pRxCurPkt = NULL;
// if( pPacket )
// ReturnRxPacketDesc(pAdapter,pPacket);
// RETAILMSG(1,(TEXT("error:RxPkt in Sleep state\n")));
// }
//#else
// HandleRxReadyEvent(pAdapter);
//#endif // MRVL_PSCONFIRM
}
else
{
gspi_read_data_direct((unsigned char*)&(acEmergencyBuffer[0]), DATA_RDWRPORT_REG, (usLength>>1));
gspi_write_reg(CARD_INT_CAUSE_REG, CIC_RxUpLdOvr);
ReturnRxPacketDesc(pAdapter,pPacket);
RETAILMSG(1,(TEXT("NdisQueryBufferSafe Fail, drop rx pkt\n")));
}
} //GPS_FAILED
}
else
{
gspi_write_reg(CARD_INT_CAUSE_REG, CIC_RxUpLdOvr);
RETAILMSG(1,(L"error: UPLOAD_RDY in ps_confimed state,evt=%x\n",ucLHostIntStatus));
}
} //if( ucLHostIntStatus & UPLOAD_HOST_INT_STATUS_RDY )
if( ucLHostIntStatus & HIS_CmdUpLdRdy )
{
if(pAdapter->CurCmd)
{
// Command finished
// IF_API_STATUS ifStatus;
gspi_read_reg16(SCRATCH_2_REG, &usLength);
//RETAILMSG(1,(TEXT("MrvDrvSdioIstThread: Packet is a UPLOAD_HOST_INT_STATUS_RDY!\n")));
//ifStatus = If_GetLengthOfDataBlock( pAdapter, &usLength );
// if ( !IF_IS_SUCCESS(ifStatus) )
// return;
//dralee_0111
if(usLength & 0x0001)
usLength++;
p_pkt = &pkt;
gspi_read_data_direct((unsigned char*)p_pkt->Code, CMD_RDWRPORT_REG, (usLength/2));
//drlaee_1226
gspi_write_reg(CARD_INT_CAUSE_REG, CIC_CmdUpLdOvr);
#ifdef MRVL_PSCONFIRM
if(pAdapter->bPSConfirm==FALSE)
{
if(pAdapter->CurCmd != NULL)
{
// still making 1 buffer copy, need to improve on this
NdisMoveMemory(pAdapter->CurCmd->BufVirtualAddr, p_pkt->Code, usLength);
}
HandleCommandFinishedEvent(pAdapter);
}
else if(pAdapter->bPSConfirm==TRUE)
{
RETAILMSG(1,(TEXT("[Marvell]MrvDrvSdioIntTimerHandler: Error => Receive CommandFinishedEvent()")));
//NKDbgPrintfW(TEXT("[Marvell]MrvDrvSdioIntTimerHandler: Error => Receive CommandFinishedEvent()\r\n"));
}
#else
if(pAdapter->CurCmd != NULL)
{
// still making 1 buffer copy, need to improve on this
NdisMoveMemory(pAdapter->CurCmd->BufVirtualAddr, p_pkt->Code, usLength);
}
HandleCommandFinishedEvent(pAdapter);
#endif
}
//dralee_0110
else
{
gspi_write_reg(CARD_INT_CAUSE_REG, CIC_CmdUpLdOvr);
RETAILMSG(1,(TEXT("Cmd Uploadover with NULL CurCmd, ignore it\n")));
GetCmdFromQueueToExecute (pAdapter);
}
}
if( ucLHostIntStatus & HIS_CmdDnLdRdy )
{
}
if( ucLHostIntStatus & HIS_CardEvent )
{
////NKDbgPrintfW(TEXT("INTR - CardEvent \n"));
gspi_read_reg16(SCRATCH_3_REG, &macEvent);
///crlo:PSMode-fix ++
///We found some extra steps are needed for MAC event since firmware 5.0.11
{
///re-enable th interrupt
//dralee_0111
//gspi_write_reg(HOST_INT_STATUS_REG, HIS_CardEvent);
///Generate interrupt to firmware
gspi_write_reg(CARD_INT_CAUSE_REG, CIC_HostEvent);
}
////NKDbgPrintfW(TEXT("SCRATCH_3_REG %x\n"),macEvent);
#ifdef MRVL_PSCONFIRM
//dralee 072705
//if((pAdapter->bPSConfirm==TRUE)&&(macEvent==MACREG_INT_CODE_PS_AWAKE))
if(pAdapter->bPSConfirm==FALSE)
HandleMACEvent(pAdapter,macEvent);
else if(macEvent==MACREG_INT_CODE_PS_AWAKE || macEvent == MACREG_INT_CODE_HOST_SLEEP_AWAKE || macEvent == MACREG_INT_CODE_PS_SLEEP)
// else if(macEvent==MACREG_INT_CODE_PS_AWAKE || macEvent == MACREG_INT_CODE_HOST_SLEEP_AWAKE)
{
pAdapter->bPSConfirm=FALSE;
HandleMACEvent(pAdapter,macEvent);
}
//else
//RETAILMSG(1, (TEXT("[WARNING]: invalid Rx Evts in Ps state:%x\n\r")));
//NKDbgPrintfW(TEXT("[WARNING]: invalid Rx Evts in Ps state:%x, Mac Event is %x"),pAdapter->bPSConfirm,macEvent);
#else
//original
HandleMACEvent(pAdapter,macEvent);
#endif // MRVL_PSCONFIRM
}
#elif defined(SDIO)
//////////////////////////////////////////////////////
// HostIntStatus &0x1
if( ucLHostIntStatus & UPLOAD_HOST_INT_STATUS_RDY )
{
const int nMaxReadCount = 5;
IF_API_STATUS ifStatus;
//RETAILMSG(1,(TEXT("MrvDrvSdioIstThread: Packet is a UPLOAD_HOST_INT_STATUS_RDY!\n")));
ifStatus = If_GetLengthOfDataBlock( pAdapter, &usLength );
if ( !IF_IS_SUCCESS(ifStatus) )
return;
ifStatus = If_GetCardStatusAndMacEvent( pAdapter, &ucCardStatus, &macEvent );
if ( !IF_IS_SUCCESS(ifStatus) )
return;
// set up the appropriate data structure to read the packet into
switch ( ucCardStatus )
{
case SDIO_DATA_PKT:
qStatus=GetRxPacketDesc(pAdapter, &pPacket);
if (qStatus == GPS_FAILED)
{
//RETAILMSG(1,(TEXT("[Marvell]HandleRxReadyEvent:Unable to obtain packet descriptor, just drop packet")));
return;
}
pAdapter->pRxCurPkt = pPacket;
NdisQueryPacket(pPacket, NULL, NULL, &pBuffer, NULL);
NdisQueryBufferSafe(pBuffer, &pRxBufVM, &bufferLength, HighPagePriority);
//(ULONG)pRxBufVM -= (sizeof(RxPD)+sizeof(pkt.Len)+sizeof(pkt.Type));
//NdisAdjustBufferLength(pBuffer, (usLength-(sizeof(RxPD)+sizeof(pkt.Len)+sizeof(pkt.Type))));
NdisAdjustBufferLength(pBuffer, (usLength-MRVDRV_ETH_RX_HIDDEN_HEADER_SIZE));
//p_pkt = (PHostCmd_DS_CODE_DNLD)((ULONG)pRxBufVM - (sizeof(RxPD)+sizeof(pkt.Len)+sizeof(pkt.Type)));
p_pkt = (PHostCmd_DS_CODE_DNLD)((ULONG)pRxBufVM - MRVDRV_ETH_RX_HIDDEN_HEADER_SIZE);
//p_pkt = (PHostCmd_DS_CODE_DNLD)pRxBufVM;
pAdapter->pRxPD1 = (PRxPD)p_pkt->Code;
break;
case SDIO_CMD_PKT:
case SDIO_TX_DONE_EVENT:
case SDIO_MAC_EVENT:
p_pkt = &pkt;
break;
default:
NKDbgPrintfW( L"[Marvell]MrvDrvSdioIstThread:Error!![p_pkt=%x] usLength= %d ucCardStatus=%d\r\n", p_pkt,usLength,ucCardStatus );
ErrorFlag=TRUE;
break;
}
usWrongPktLen =0;
//lykao, 052405, begin
if ( usLength > MRVDRV_ETH_RX_PACKET_BUFFER_SIZE )
{
usWrongPktLen = TT_WRONG_PKT_LEN_TOO_BIG;
//DBGPRINT(DBG_ERROR,("***MrvDrvSdioIntTimerHandler: Got Huge packet size= %d \n",usLength));
//RETAILMSG(1, (L"[Marvell]MrvDrvSdioIntTimer:Error!! usLength= %d", usLength));
usLength=MRVDRV_ETH_RX_PACKET_BUFFER_SIZE;
}
if ( usLength < sizeof(RxPD)+14 && ucCardStatus == SDIO_DATA_PKT )
{
NKDbgPrintfW( L"*** Got small packet, size = %d\r\n", usLength );
usWrongPktLen = TT_WRONG_PKT_LEN_TOO_SMALL;
usLength = sizeof(RxPD)+14;
}
ifStatus = If_GetDataBlock( pAdapter, usLength, ucCardStatus, (UCHAR*)p_pkt );
if ( !IF_IS_SUCCESS(ifStatus) )
return;
if(ErrorFlag==TRUE)
{
//RETAILMSG(1,(TEXT("[Marvell]MrvDrvSdioIntTimer:ErrorFlag==TRUE")));
return;
}
// length of the packet content itself
usLength = usLength - sizeof(pkt.Type) - sizeof(pkt.Len);
// process the interrupt type
switch ( ucCardStatus )
{
case SDIO_DATA_PKT:
//RETAILMSG(1,(TEXT("MrvDrvSdioIntTimer: Packet is a Rx DATA! \r\n")));
#ifdef WPA
if((*((UCHAR *)((ULONG)pRxBufVM + 14)) == 0xaa ) &&
(*((UCHAR *)((ULONG)pRxBufVM + 15)) == 0xaa ) &&
(*((UCHAR *)((ULONG)pRxBufVM + 16)) == 0x03 ) &&
(*((UCHAR *)((ULONG)pRxBufVM + 20)) == 0x88 ) &&
(*((UCHAR *)((ULONG)pRxBufVM + 21)) == 0x8e ) )
{
//RETAILMSG(1,(TEXT("EAPOL Key: Packet is a Rx DATA! \r\n")));
usLength -= 8;
//NdisMoveMemory( ttBuf, pAdapter->pRxBuf+20, pAdapter->ulRxSize-20);
NdisMoveMemory((PUCHAR)((ULONG)pRxBufVM + 12),(PUCHAR)((ULONG)pRxBufVM + 20), (usLength-20));
//NdisMoveMemory( pAdapter->pRxBuf+12, pAdapter->pRxBuf+20, pAdapter->ulRxSize-20);
}
#endif // WPA
//dralee 072705
//pAdapter->ulRxSize = usLength;
pAdapter->ulRxSize = usLength-sizeof(RxPD);
#ifdef MRVL_PSCONFIRM
if(pAdapter->bPSConfirm==FALSE)
HandleRxReadyEvent(pAdapter);
else if(pAdapter->bPSConfirm==TRUE)
RETAILMSG(1,(TEXT("[Marvell]MrvDrvSdioIntTimerHandler: Error => Receive RxReadyEvent()")));
#else //MRVL_PSCONFIRM
HandleRxReadyEvent(pAdapter);
#endif //MRVL_PSCONFIRM
break;
case SDIO_CMD_PKT:
//RETAILMSG(1,(TEXT("MrvDrvSdioIstThread: Cmd Pkt! \r\n")));
if (pAdapter->CurCmd == NULL)
{
PHostCmd_DS_GEN pCMD = (PHostCmd_DS_GEN)p_pkt->Code;
// command may have timed out already!
//RETAILMSG(1,(L"MrvDrvSdioIntTimer: Cmd (0x%x) response received", pCMD->Command));
if ( pCMD->Command == 0x8021 )
{
PHostCmd_DS_802_11_PS_MODE pPSCmd = (PHostCmd_DS_802_11_PS_MODE)pCMD;
//RETAILMSG(1,(L"SubCommand = 0x%x\n", pPSCmd->SubCommand));
}
//EnableInterrupt(pAdapter);
//#ifndef MRVL_WINCE50
// NdisFreeSpinLock(&pAdapter->lDPCLock);
//#endif
p_pkt = NULL;
return;
}
#ifdef MRVL_PSCONFIRM
if(pAdapter->bPSConfirm==FALSE)
{
if(pAdapter->CurCmd != NULL)
{
// still making 1 buffer copy, need to improve on this
NdisMoveMemory(pAdapter->CurCmd->BufVirtualAddr, p_pkt->Code, usLength);
}
HandleCommandFinishedEvent(pAdapter);
}
else if(pAdapter->bPSConfirm==TRUE)
{
RETAILMSG(1,(TEXT("[Marvell]MrvDrvSdioIntTimerHandler: Error => Receive CommandFinishedEvent()")));
}
#else // MRVL_PSCONFIRM
if(pAdapter->CurCmd != NULL)
{
// still making 1 buffer copy, need to improve on this
NdisMoveMemory(pAdapter->CurCmd->BufVirtualAddr, p_pkt->Code, usLength);
}
HandleCommandFinishedEvent(pAdapter);
#endif // MRVL_PSCONFIRM
break;
case SDIO_TX_DONE_EVENT:
//RETAILMSG(1,(TEXT("MrvDrvSdioIntTimer: Packet is a Tx done Pkt! \r\n")));
//dralee, 072705, for integrity, only for Hw versin early than B0
if(pAdapter->SentPacket)
{
//RETAILMSG(1,(TEXT("MrvDrvSdioIstThread: Txdone \r\n")));
#ifdef MRVL_PSCONFIRM
if(pAdapter->bPSConfirm==FALSE)
HandleTxSingleDoneEvent(pAdapter);
#else // MRVL_PSCONFIRM
HandleTxSingleDoneEvent(pAdapter);
#endif // MRVL_PSCONFIRM
}
//HandleTxSingleDoneEvent(pAdapter);
break;
case SDIO_MAC_EVENT:
#ifdef MRVL_PSCONFIRM
//dralee 072705
//if((pAdapter->bPSConfirm==TRUE)&&(macEvent==MACREG_INT_CODE_PS_AWAKE))
if(pAdapter->bPSConfirm==FALSE)
HandleMACEvent(pAdapter,macEvent);
else if(macEvent==MACREG_INT_CODE_PS_AWAKE || macEvent==MACREG_INT_CODE_HOST_SLEEP_AWAKE)
{
//RETAILMSG(1,(L"Rx Evts in Ps state:%x\n\r",macEvent));
pAdapter->bPSConfirm=FALSE;
HandleMACEvent(pAdapter,macEvent);
}
else
RETAILMSG(1, (L"[WARNING]: invalid Rx Evts in Ps state:%x\n\r",macEvent));
#else // MRVL_PSCONFIRM
//original
HandleMACEvent(pAdapter,macEvent);
#endif // MRVL_PSCONFIRM
break;
default:
// SHOULD not be here
RETAILMSG(1, (L"MrvDrvSdioIntTimer: ERROR, received unexpected type from FW: %d\n", pkt.Type));
ASSERT(FALSE);
break;
}// switch ( ucCardStatus )
} //HostIntStatus &0x1
#endif // SDIO
} // end of while loop
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -