📄 intproc.c
字号:
/******************* ?Marvell Semiconductor, Inc., 2001-2004 *****************
*
* Purpose: This module provides implementaion of ISR, DPC and other
* interrupt related routines
*
* $Author: schiu $
*
* $Date: 2004/10/27 $
*
* $Revision: #3 $
*
*****************************************************************************/
/*
===============================================================================
INCLUDE FILES
===============================================================================
*/
#include "precomp.h"
#include "If.h"
#ifdef UNDER_CE#include "pkfuncs.h"#endif
/******************************************************************************
*
* Name: MrvDrvDisableInterrupt()
*
* Description: Miniport HW interrupt disable routine
*
* Conditions for Use: Will be called to disable HW PCI/CardBus interrupt
*
* Arguments:
* IN NDIS_HANDLE MiniportAdapterContext
*
* Return Value: None
*
* Notes:
*
*****************************************************************************/
VOID
MrvDrvDisableInterrupt(
IN NDIS_HANDLE MiniportAdapterContext
)
{
PMRVDRV_ADAPTER Adapter;
// DBGPRINT(DBG_ISR,("INT - Enter MrvDrvDisableInterrupt \n"));
Adapter = (PMRVDRV_ADAPTER)MiniportAdapterContext;
#ifdef IF_SDIO
{
SD_API_STATUS status; // intermediate status
// Though macro names are different in below lines,
// the values defined for them are same. To avoid
// confusion, we have redefined with new names.
// See "sdio.h" for their defenitions.
//
#ifdef PWARE_SDIO_INTR_MODIFICATIONS
UCHAR ucMask = SDIO_DISABLE_INTERRUPT_MASK;
#else // old code follows
UCHAR ucMask = SDIO_ENABLE_INTERRUPT;;
#endif // PWARE_SDIO_INTR_MODIFICATIONS
status = If_WriteRegister(Adapter,
//SD_IO_WRITE ,
1, // function 1
HCR_HOST_INT_MASK_REGISTER, // reg 4
FALSE,
&ucMask,
sizeof(ucMask));
}
#else ///IF_SDIO
If_DisableInterrupt(Adapter);
#endif //IF_SDIO
}
/******************************************************************************
*
* Name: MrvDrvEnableInterrupt()
*
* Description: Miniport HW interrupt enable routine
*
* Conditions for Use: Will be called to enable HW PCI/CardBus interrupt
*
* Arguments:
* IN NDIS_HANDLE MiniportAdapterContext
*
* Return Value: None
*
* Notes:
*
*****************************************************************************/
VOID
MrvDrvEnableInterrupt(
IN NDIS_HANDLE MiniportAdapterContext
)
{
PMRVDRV_ADAPTER Adapter;
// DBGPRINT(DBG_ISR,("INT - Enter MrvDrvEnbleInterrupt \n"));
//yz_add
RETAILMSG(1,(TEXT("MrvDrvEnableInterrupt() \r\n")));
Adapter = (PMRVDRV_ADAPTER)MiniportAdapterContext;
#ifdef IF_SDIO
{
SD_API_STATUS status; // intermediate status
// Though macro names are different in below lines,
// the values defined for them are same. To avoid
// confusion, we have redefined with new names.
// See "sdio.h" for their defenitions.
//
#ifdef PWARE_SDIO_INTR_MODIFICATIONS
UCHAR ucMask = SDIO_ENABLE_INTERRUPT_MASK;
#else // old code follows
UCHAR ucMask = SDIO_DISABLE_INTERRUPT;;
#endif // PWARE_SDIO_INTR_MODIFICATIONS
status = If_WriteRegister(Adapter,
//SD_IO_WRITE ,
1, // function 1
HCR_HOST_INT_MASK_REGISTER, // reg 4
FALSE,
&ucMask,
sizeof(ucMask));
}
#else //IF_SDIO
If_EnableInterrupt(Adapter);
#endif //IF_SDIO
}
#ifdef IF_SDIO
///////////////////////////////////////////////////////////////////////////////
// SDNdisSlotEventCallBack - slot event callback for fast-path events
// Input: hDevice - device handle
// pContext - device specific context that was registered
// SlotEventType - slot event type
// pData - Slot event data (can be NULL)
// DataLength - length of slot event data (can be 0)
// Output:
// Returns:
// Notes:
//
// If this callback is registered the client driver can be notified of
// slot events (such as device removal) using a fast path mechanism. This
// is useful if a driver must be notified of device removal
// before its XXX_Deinit is called.
//
// This callback can be called at a high thread priority and should only
// set flags or set events. This callback must not perform any
// bus requests or call any apis that can perform bus requests.
///////////////////////////////////////////////////////////////////////////////
VOID SDNdisSlotEventCallBack(SD_DEVICE_HANDLE hDevice,
PVOID pContext,
SD_SLOT_EVENT_TYPE SlotEventType,
PVOID pData,
DWORD DataLength)
{
PMRVDRV_ADAPTER pAdapter;
//BOOLEAN timerStatus;
DBGPRINT(DBG_OID,("Entered +SDNdisSlotEventCallBack: event 0x%x \n",
SlotEventType));
switch (SlotEventType)
{
case SDCardEjected :
RETAILMSG(1,(TEXT("SDCardEjected Event!\n\r")));
DBGPRINT(DBG_LOAD, ("SDCardEjected Event!\n"));
pAdapter = (PMRVDRV_ADAPTER)pContext;
pAdapter->SurpriseRemoved = TRUE;
SDIODisconnectInterrupt(pAdapter->hDevice);
pAdapter->ShutDown = TRUE;
NdisMSleep(100);
break;
}
}
#endif //IF_SDIO
///////////////////////////////////////////////////////////////////////////////
// SDNdisInterruptCallback - interrupt handler
// Input: hDevice - handle to the SDIO device
// pAdapter - adapter context
// Output:
// Returns: SD_API_STATUS code
// Notes:
//
// SD_API_STATUS_SUCCESS is returned for HW to acknowledge the interrupt
///////////////////////////////////////////////////////////////////////////////
#ifdef IF_SDIO
SD_API_STATUS SDNdisInterruptCallback(SD_DEVICE_HANDLE hDevice,
PVOID pContext)
#elif defined(IF_GSPI)
SD_API_STATUS SPINdisInterruptCallback(IN NDIS_HANDLE MiniportAdapterContext)
#endif
{
PMRVDRV_ADAPTER pAdapter;
#ifdef IF_SDIO
UCHAR ucHostIntStatus;
UCHAR ucCardStatus;
SD_API_STATUS status;
#endif ///IF_SDIO
#ifdef IF_GSPI
WORD ucHostIntStatus;
USHORT ucCardStatus;
SD_API_STATUS status;
#endif ///IF_GSPI
#ifdef IF_SDIO
pAdapter = (PMRVDRV_ADAPTER)pContext;
#elif defined(IF_GSPI)
pAdapter = (PMRVDRV_ADAPTER)MiniportAdapterContext;
#endif
#if 1
//dralee_20060513
//clear Int work around timeout count
pAdapter->IntWARTimeoutCount = 0;
#endif
/*
if( pAdapter->ulINTCount < 5 )
{
int pri;
pri = CeGetThreadPriority(GetCurrentThread());
DbgMrvPrintFile( ("HCD thread priority: %d\n",pri) );
}
*/
DBGPRINT(DBG_ISR,("INT - SDNdisInterruptCallback(%d)\n", pAdapter->ulINTCount));
// tt ps chk pAdapter->dwInterruptTick = GetTickCount();
/* dralee 072905
if ( pAdapter->hISRThread == NULL )
{
pAdapter->hISRThread = GetCurrentThread();
}
*/
///#ifdef IF_SDIO
///crlo:intr ++
#if defined(IF_GSPI)
{
WORD maskreg=0;
status = If_WriteRegister(pAdapter,
1,
HCR_HOST_INT_MASK_REGISTER,
FALSE,
&maskreg, // reg
sizeof(maskreg));
if (!SD_API_SUCCESS(status))
{
LeaveCriticalSection(&pAdapter->IntCriticalSection);
return status;
}
}
#endif ///(IF_GSPI)
///crlo:intr --
// read Host Int Status register (function 1,addr 6)
status = If_ReadRegister(pAdapter,
//SD_IO_READ ,
1, // function 1
HCR_HOST_INT_STATUS_REGISTER,
FALSE,
&ucHostIntStatus,
sizeof(ucHostIntStatus));
if (!SD_API_SUCCESS(status))
{
DBGPRINT(DBG_ISR,("Unable to read Host interrupt status register\n"));
DBGPRINT(DBG_ISR, ("ISR read error 1\n") );
return status;
}
EnterCriticalSection(&pAdapter->IntCriticalSection);
pAdapter->ucGHostIntStatus |= ucHostIntStatus;
LeaveCriticalSection(&pAdapter->IntCriticalSection);
ucCardStatus = ~ucHostIntStatus;
//dralee_1226
ucCardStatus &= 0x1f;
//EnterCriticalSection(&pAdapter->SDIOCriticalSection);
status = If_WriteRegister(pAdapter,
//SD_IO_WRITE,
1,
HCR_HOST_INT_STATUS_REGISTER,
FALSE,
&ucCardStatus, // reg
sizeof(ucCardStatus));
if (!SD_API_SUCCESS(status))
{
DBGPRINT(DBG_ISR,("Unable to clear Host interrupt status register\n"));
DBGPRINT(DBG_ISR, ("ISR read error 2\n") );
return status;
}
///crlo:intr ++
#if defined(IF_GSPI)
{
WORD maskreg=HIS_TxDnLdRdy | HIS_RxUpLdRdy | HIS_CmdDnLdRdy | HIS_CardEvent | HIS_CmdUpLdRdy;
status = If_WriteRegister(pAdapter,
1,
HCR_HOST_INT_MASK_REGISTER,
FALSE,
&maskreg, // reg
sizeof(maskreg));
if (!SD_API_SUCCESS(status))
{
LeaveCriticalSection(&pAdapter->IntCriticalSection);
return status;
}
}
#endif ///(IF_GSPI)
///crlo:intr --
//#ifndef MRV_CHIP_8305
// pAdapter->ucGHostIntStatus=ucHostIntStatus;
// DBGPRINT(DBG_ISR,("SDNdisInterruptCallback pAdapter->ucGHostIntStatus=%d\n",pAdapter->ucGHostIntStatus));
//#endif
#if defined (IF_GSPI)
if (ucHostIntStatus == 0xffff)
#else
if ( ucHostIntStatus == 0xff )
#endif ///IF_GSPI
{
// card removed?
DBGPRINT(DBG_ISR,("read 0xff\n"));
return SD_API_STATUS_SUCCESS;
}
///#endif // IF_SDIO
//Disable further interrupts at this point
//DisableInterrupt(pAdapter);
// use timer to get into Miniport context
//NdisMSetTimer(&pAdapter->MrvDrvSdioIntTimer, 0);
//pAdapter->MrvDrvSdioIntTimerIsSet = TRUE;
/*
//dralee_1101
if(pAdapter->RetQTimerIsSet==1)
{
pAdapter->RetQTimerIsSet=2;
NdisMSetTimer(&pAdapter->MrvRetQTimer,
MRVDRV_DEFAULT_RETQ_TIME_OUT);
}
*/
SetEvent(pAdapter->hControllerInterruptEvent);
return SD_API_STATUS_SUCCESS;
}
#ifdef IF_SDIO
///////////////////////////////////////////////////////////////////////////////
// MrvDrvSdioAsyncBusRequestCB - handles asynchronous bus call back for
// reading CMD53 from card.
// It is used when the response is discarded
// so it just frees up the buffer
//
///////////////////////////////////////////////////////////////////////////////
VOID MrvDrvSdioAsyncBusRequestCB(SD_DEVICE_HANDLE hDevice,
PSD_BUS_REQUEST pRequest,
PVOID pDeviceContext,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -