FreeBSD/sys/dev/cxgb/cxgb_sge.c
/*
 * The MSI interrupt handler.  This needs to handle data events from SGE
 * response queues as well as error and other async events as they all use
 * the same MSI vector.  We use one SGE response queue per port in this mode
 * and protect all response queues with queue 0's lock.
 */
The MSI interrupt handler.  This needs to handle data events from SGE
response queues as well as error and other async events as they all use
the same MSI vector.  We use one SGE response queue per port in this mode
and protect all response queues with queue 0's lock.
The MSI interrupt handler . This needs to handle data events from SGE response queues as well as error and other async events as they all use the same MSI vector . We use one SGE response queue per port in this mode and protect all response queues with queue 0 ' s lock .
void
t3_intr_msi(void *data)
{
	adapter_t *adap = data;
	struct sge_rspq *q0 = &adap->sge.qs[0].rspq;
	int i, new_packets = 0;
	mtx_lock(&q0->lock);
	for_each_port(adap, i)
	    if (process_responses_gts(adap, &adap->sge.qs[i].rspq)) 
		    new_packets = 1;
	mtx_unlock(&q0->lock);
	if (new_packets == 0) {
		t3_write_reg(adap, A_PL_INT_ENABLE0, 0);
		(void) t3_read_reg(adap, A_PL_INT_ENABLE0);
		taskqueue_enqueue(adap->tq, &adap->slow_intr_task);
	}
}
void t3_intr_msi ( void * data ) { adapter_t * adap = data ; struct sge_rspq * q0 = & adap -> sge . qs [ 0 ] . rspq ; int i , new_packets = 0 ; mtx_lock ( & q0 -> lock ) ; for_each_port ( adap , i ) if ( process_responses_gts ( adap , & adap -> sge . qs [ i ] . rspq ) ) new_packets = 1 ; mtx_unlock ( & q0 -> lock ) ; if ( new_packets == 0 ) { t3_write_reg ( adap , A_PL_INT_ENABLE0 , 0 ) ; ( void ) t3_read_reg ( adap , A_PL_INT_ENABLE0 ) ; taskqueue_enqueue ( adap -> tq , & adap -> slow_intr_task ) ; } }
The MSI interrupt handler.
The MSI interrupt handler .