in include/asm/sun3xflop.h [114:201]
asmlinkage irqreturn_t sun3xflop_hardint(int irq, void *dev_id)
{
register unsigned char st;
#undef TRACE_FLPY_INT
#define NO_FLOPPY_ASSEMBLER
#ifdef TRACE_FLPY_INT
static int calls=0;
static int bytes=0;
static int dma_wait=0;
#endif
if(!doing_pdma) {
floppy_interrupt(irq, dev_id);
return IRQ_HANDLED;
}
// pr_info("doing pdma\n");// st %x\n", sun_fdc->status_82072);
#ifdef TRACE_FLPY_INT
if(!calls)
bytes = virtual_dma_count;
#endif
{
register int lcount;
register char *lptr;
for(lcount=virtual_dma_count, lptr=virtual_dma_addr;
lcount; lcount--, lptr++) {
/* st=fd_inb(virtual_dma_port+4) & 0x80 ; */
st = *(sun3x_fdc.status_r);
/* if(st != 0xa0) */
/* break; */
if((st & 0x80) == 0) {
virtual_dma_count = lcount;
virtual_dma_addr = lptr;
return IRQ_HANDLED;
}
if((st & 0x20) == 0)
break;
if(virtual_dma_mode)
/* fd_outb(*lptr, virtual_dma_port+5); */
*(sun3x_fdc.data_r) = *lptr;
else
/* *lptr = fd_inb(virtual_dma_port+5); */
*lptr = *(sun3x_fdc.data_r);
}
virtual_dma_count = lcount;
virtual_dma_addr = lptr;
/* st = fd_inb(virtual_dma_port+4); */
st = *(sun3x_fdc.status_r);
}
#ifdef TRACE_FLPY_INT
calls++;
#endif
// pr_info("st=%02x\n", st);
if(st == 0x20)
return IRQ_HANDLED;
if(!(st & 0x20)) {
virtual_dma_residue += virtual_dma_count;
virtual_dma_count=0;
doing_pdma = 0;
#ifdef TRACE_FLPY_INT
pr_info("count=%x, residue=%x calls=%d bytes=%x dma_wait=%d\n",
virtual_dma_count, virtual_dma_residue, calls, bytes,
dma_wait);
calls = 0;
dma_wait=0;
#endif
floppy_interrupt(irq, dev_id);
return IRQ_HANDLED;
}
#ifdef TRACE_FLPY_INT
if(!virtual_dma_count)
dma_wait++;
#endif
return IRQ_HANDLED;
}