rem: uint32 i, j;
context: sis900_interrupt(void *data){	struct sis_info *info = data;	int32 handled = B_UNHANDLED_INTERRUPT;	int16 worklimit = 20;	uint32 intr;	uint32 i, j;	cpu_status former;	former = disable_interrupts();	acquire_spinlock(&info->lock);	while (worklimit-- > 0) {		// reading the interrupt status register clears all interrupts		intr = read32((uint32)info->registers + SiS900_MAC_INTR_STATUS);		if (!intr)			break;		TRACE(("************ interrupt received: %08lx **************\n", intr));		intrCounter = (intrCounter + 1) % 100;		lastIntr[intrCounter] = intr;		// wake-up event interrupt		if (intr & SiS900_INTR_WAKEUP_EVENT)		{			TRACE(("wake-up event received: %ld\n", read32((uint32)info->registers + SiS900_MAC_WAKEUP_EVENT)));			// clear PM event register			write32((uint32)info->registers + SiS900_MAC_WAKEUP_EVENT,				SiS900_WAKEUP_LINK_ON | SiS900_WAKEUP_LINK_LOSS);			handled = B_HANDLED_INTERRUPT;		}		// receive packet interrupts		if (intr & (/*SiS900_INTR_Rx_STATUS_OVERRUN |*/ SiS900_INTR_Rx_OVERRUN |					SiS900_INTR_Rx_ERROR | SiS900_INTR_Rx_OK))			handled = sis900_rxInterrupt(info);		// transmit packet interrupts		if (intr & (SiS900_INTR_Tx_UNDERRUN | SiS900_INTR_Tx_ERROR |					SiS900_INTR_Tx_IDLE | SiS900_INTR_Tx_OK))			handled = sis900_txInterrupt(info);	}	release_spinlock(&info->lock);	restore_interrupts(former);	return handled;}