static irqreturn_t eata_pio_int_handler(int irq, void *dev_id) { unsigned int eata_stat = 0xfffff; struct scsi_cmnd *cmd; hostdata *hd; struct eata_ccb *cp; unsigned long base; unsigned int x, z; struct Scsi_Host *sh; unsigned short zwickel = 0; unsigned char stat, odd; irqreturn_t ret = IRQ_NONE; for (x = 1, sh = first_HBA; x <= registered_HBAs; x++, sh = SD(sh)->prev) { if (sh->irq != irq) continue; if (inb(sh->base + HA_RSTATUS) & HA_SBUSY) continue; int_counter++; ret = IRQ_HANDLED; hd = SD(sh); cp = &hd->ccb[0]; cmd = cp->cmd; base = cmd->device->host->base; do { stat = inb(base + HA_RSTATUS); if (stat & HA_SDRQ) { if (cp->DataIn) { z = 256; odd = 0; while ((cmd->SCp.Status) && ((z > 0) || (odd))) { if (odd) { *(cmd->SCp.ptr) = zwickel >> 8; IncStat(&cmd->SCp, 1); odd = 0; } x = min_t(unsigned int, z, cmd->SCp.this_residual / 2); insw(base + HA_RDATA, cmd->SCp.ptr, x); z -= x; IncStat(&cmd->SCp, 2 * x); if ((z > 0) && (cmd->SCp.this_residual == 1)) { zwickel = inw(base + HA_RDATA); *(cmd->SCp.ptr) = zwickel & 0xff; IncStat(&cmd->SCp, 1); z--; odd = 1; } } while (z > 0) { zwickel = inw(base + HA_RDATA); z--; } } else { /* cp->DataOut */ odd = 0; z = 256; while ((cmd->SCp.Status) && ((z > 0) || (odd))) { if (odd) { zwickel += *(cmd->SCp.ptr) << 8; IncStat(&cmd->SCp, 1); outw(zwickel, base + HA_RDATA); z--; odd = 0; } x = min_t(unsigned int, z, cmd->SCp.this_residual / 2); outsw(base + HA_RDATA, cmd->SCp.ptr, x); z -= x; IncStat(&cmd->SCp, 2 * x); if ((z > 0) && (cmd->SCp.this_residual == 1)) { zwickel = *(cmd->SCp.ptr); zwickel &= 0xff; IncStat(&cmd->SCp, 1); odd = 1; } } while (z > 0 || odd) { outw(zwickel, base + HA_RDATA); z--; odd = 0; } } } }
void eata_pio_int_handler(int irq, void *dev_id, struct pt_regs * regs) { uint eata_stat = 0xfffff; Scsi_Cmnd *cmd; hostdata *hd; struct eata_ccb *cp; uint base; ulong flags; uint x,z; struct Scsi_Host *sh; ushort zwickel=0; unchar stat,odd; save_flags(flags); cli(); for (x = 1, sh = first_HBA; x <= registered_HBAs; x++, sh = SD(sh)->prev) { if (sh->irq != irq) continue; if (inb((uint)sh->base + HA_RSTATUS) & HA_SBUSY) continue; int_counter++; hd=SD(sh); cp = &hd->ccb[0]; cmd = cp->cmd; base = (uint) cmd->host->base; do { stat=inb(base+HA_RSTATUS); if (stat&HA_SDRQ) { if (cp->DataIn) { z=256; odd=FALSE; while ((cmd->SCp.Status)&&((z>0)||(odd))) { if (odd) { *(cmd->SCp.ptr)=zwickel>>8; IncStat(&cmd->SCp,1); odd=FALSE; } x=min(z,cmd->SCp.this_residual/2); insw(base+HA_RDATA,cmd->SCp.ptr,x); z-=x; IncStat(&cmd->SCp,2*x); if ((z>0)&&(cmd->SCp.this_residual==1)) { zwickel=inw(base+HA_RDATA); *(cmd->SCp.ptr)=zwickel&0xff; IncStat(&cmd->SCp,1); z--; odd=TRUE; } } while (z>0) { zwickel=inw(base+HA_RDATA); z--; } } else /* cp->DataOut */ { odd=FALSE; z=256; while ((cmd->SCp.Status)&&((z>0)||(odd))) { if (odd) { zwickel+=*(cmd->SCp.ptr)<<8; IncStat(&cmd->SCp,1); outw(zwickel,base+HA_RDATA); z--; odd=FALSE; } x=min(z,cmd->SCp.this_residual/2); outsw(base+HA_RDATA,cmd->SCp.ptr,x); z-=x; IncStat(&cmd->SCp,2*x); if ((z>0)&&(cmd->SCp.this_residual==1)) { zwickel=*(cmd->SCp.ptr); zwickel&=0xff; IncStat(&cmd->SCp,1); odd=TRUE; } } while (z>0||odd) { outw(zwickel,base+HA_RDATA); z--; odd=FALSE; } } } }