static A_STATUS DevServiceCounterInterrupt(AR6K_DEVICE *pDev) { A_UINT8 counter_int_status; AR_DEBUG_PRINTF(ATH_DEBUG_IRQ, ("Counter Interrupt\n")); counter_int_status = pDev->IrqProcRegisters.counter_int_status & pDev->IrqEnableRegisters.counter_int_status_enable; AR_DEBUG_ASSERT(counter_int_status); AR_DEBUG_PRINTF(ATH_DEBUG_IRQ, ("Valid interrupt source(s) in COUNTER_INT_STATUS: 0x%x\n", counter_int_status)); /* Check if the debug interrupt is pending */ if (counter_int_status & AR6K_TARGET_DEBUG_INTR_MASK) { return DevServiceDebugInterrupt(pDev); } return A_OK; }
static int DevServiceCounterInterrupt(AR6K_DEVICE *pDev) { u8 counter_int_status; AR_DEBUG_PRINTF(ATH_DEBUG_IRQ, ("Counter Interrupt\n")); counter_int_status = pDev->IrqProcRegisters.counter_int_status & pDev->IrqEnableRegisters.counter_int_status_enable; AR_DEBUG_PRINTF(ATH_DEBUG_IRQ, ("Valid interrupt source(s) in COUNTER_INT_STATUS: 0x%x\n", counter_int_status)); /* Check if the debug interrupt is pending * NOTE: other modules like GMBOX may use the counter interrupt for * credit flow control on other counters, we only need to check for the debug assertion * counter interrupt */ if (counter_int_status & AR6K_TARGET_DEBUG_INTR_MASK) { return DevServiceDebugInterrupt(pDev); } return 0; }
/* mailbox recv message polling */ int DevPollMboxMsgRecv(AR6K_DEVICE *pDev, u32 *pLookAhead, int TimeoutMS) { int status = 0; int timeout = TimeoutMS/DELAY_PER_INTERVAL_MS; A_ASSERT(timeout > 0); AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("+DevPollMboxMsgRecv \n")); while (true) { if (pDev->GetPendingEventsFunc != NULL) { HIF_PENDING_EVENTS_INFO events; #ifdef THREAD_X events.Polling =1; #endif /* the HIF layer uses a special mechanism to get events, do this * synchronously */ status = pDev->GetPendingEventsFunc(pDev->HIFDevice, &events, NULL); if (status) { AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Failed to get pending events \n")); break; } if (events.Events & HIF_RECV_MSG_AVAIL) { /* there is a message available, the lookahead should be valid now */ *pLookAhead = events.LookAhead; break; } } else { /* this is the standard HIF way.... */ /* load the register table */ status = HIFReadWrite(pDev->HIFDevice, HOST_INT_STATUS_ADDRESS, (u8 *)&pDev->IrqProcRegisters, AR6K_IRQ_PROC_REGS_SIZE, HIF_RD_SYNC_BYTE_INC, NULL); if (status){ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Failed to read register table \n")); break; } /* check for MBOX data and valid lookahead */ if (pDev->IrqProcRegisters.host_int_status & (1 << HTC_MAILBOX)) { if (pDev->IrqProcRegisters.rx_lookahead_valid & (1 << HTC_MAILBOX)) { /* mailbox has a message and the look ahead is valid */ *pLookAhead = pDev->IrqProcRegisters.rx_lookahead[HTC_MAILBOX]; break; } } } timeout--; if (timeout <= 0) { AR_DEBUG_PRINTF(ATH_DEBUG_ERR, (" Timeout waiting for recv message \n")); status = A_ERROR; /* check if the target asserted */ if ( pDev->IrqProcRegisters.counter_int_status & AR6K_TARGET_DEBUG_INTR_MASK) { /* target signaled an assert, process this pending interrupt * this will call the target failure handler */ DevServiceDebugInterrupt(pDev); } break; } /* delay a little */ A_MDELAY(DELAY_PER_INTERVAL_MS); AR_DEBUG_PRINTF(ATH_DEBUG_RECV,(" Retry Mbox Poll : %d \n",timeout)); } AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("-DevPollMboxMsgRecv \n")); return status; }