rem: dprintf("tx error: %x\n", status);
add: dprintf("tx error: %lx\n", status);
context: sis900_txInterrupt(struct sis_info *info){	int16 releaseTxSem = 0;	uint32 status;	int16 limit;	acquire_spinlock(&info->txSpinlock);	HACK(spin(10000));//dprintf("here we are: sent = %d\n",info->txSent);	for (limit = info->txSent; limit > 0; limit--)	{		status = info->txDescriptor[info->txInterruptIndex].status;//dprintf("txIntr: %d: mem = %lx : hardware = %lx\n",info->txInterruptIndex,//		physicalAddress(&info->txDescriptor[info->txInterruptIndex],sizeof(struct buffer_desc)),//		read32((uint32)info->registers + SiS900_MAC_Tx_DESCR));		/* Does the device generate extra interrupts? */		if (status & SiS900_DESCR_OWN)		{			struct buffer_desc *b = (void *)read32((uint32)info->registers + SiS900_MAC_Tx_DESCR);			int16 that;			for (that = 0;that < NUM_Tx_DESCR && (void *)physicalAddress(&info->txDescriptor[that],sizeof(struct buffer_desc)) != b;that++);			if (that == NUM_Tx_DESCR)			{				//dprintf("not in ring!\n");				that = 0;			}//dprintf("tx busy %d: %lx (hardware status %d = %lx)!\n",info->txInterruptIndex,status,that,info->txDescriptor[that].status);//			if (limit == info->txSent)//			{//dprintf("oh no!\n");//				limit++;//				continue;//			}			break;		}//dprintf("tx %d!\n",info->txInterruptIndex);		if (status & (SiS900_DESCR_Tx_ABORT | SiS900_DESCR_Tx_UNDERRUN |					  SiS900_DESCR_Tx_OOW_COLLISION))			dprintf("tx error: %x\n", status);		else			info->txDescriptor[info->txInterruptIndex].status = 0;		releaseTxSem++;	/* this many buffers are free */		info->txInterruptIndex = (info->txInterruptIndex + 1) & NUM_Tx_MASK;		info->txSent--;		if (info->txSent < 0 || info->txSent > NUM_Tx_DESCR)			dprintf("ERROR interrupt: txSent = %d\n", info->txSent);	}	release_spinlock(&info->txSpinlock);	if (releaseTxSem)	{//		sem_info semInfo;		//		get_sem_info(info->txSem,&semInfo);		release_sem_etc(info->txSem,releaseTxSem,B_DO_NOT_RESCHEDULE);		return B_INVOKE_SCHEDULER;	}	return B_HANDLED_INTERRUPT;}