static int macscsi_pread (struct Scsi_Host *instance, unsigned char *dst, int len) { unsigned char *d; volatile unsigned char *s; NCR5380_local_declare(); NCR5380_setup(instance); s = mac_scsi_drq+0x60; d = dst; /* These conditions are derived from MacOS */ while (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ) && !(NCR5380_read(STATUS_REG) & SR_REQ)) ; if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ) && (NCR5380_read(BUS_AND_STATUS_REG) & BASR_PHASE_MATCH)) { printk(KERN_ERR "Error in macscsi_pread\n"); return -1; } CP_IO_TO_MEM(s, d, len); if (len != 0) { printk(KERN_NOTICE "Bus error in macscsi_pread\n"); return -1; } return 0; }
static int macscsi_pread(struct Scsi_Host *instance, unsigned char *dst, int len) { struct NCR5380_hostdata *hostdata = shost_priv(instance); unsigned char *d; unsigned char *s; NCR5380_local_declare(); NCR5380_setup(instance); s = hostdata->pdma_base + (INPUT_DATA_REG << 4); d = dst; /* These conditions are derived from MacOS */ while (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ) && !(NCR5380_read(STATUS_REG) & SR_REQ)) ; if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ) && (NCR5380_read(BUS_AND_STATUS_REG) & BASR_PHASE_MATCH)) { pr_err("Error in macscsi_pread\n"); return -1; } CP_IO_TO_MEM(s, d, len); if (len != 0) { pr_notice("Bus error in macscsi_pread\n"); return -1; } return 0; }
static inline int macscsi_pread(struct NCR5380_hostdata *hostdata, unsigned char *dst, int len) { unsigned char *s = hostdata->pdma_io + (INPUT_DATA_REG << 4); unsigned char *d = dst; int n = len; int transferred; while (!NCR5380_poll_politely(hostdata, BUS_AND_STATUS_REG, BASR_DRQ | BASR_PHASE_MATCH, BASR_DRQ | BASR_PHASE_MATCH, HZ / 64)) { CP_IO_TO_MEM(s, d, n); transferred = d - dst - n; hostdata->pdma_residual = len - transferred; /* No bus error. */ if (n == 0) return 0; /* Target changed phase early? */ if (NCR5380_poll_politely2(hostdata, STATUS_REG, SR_REQ, SR_REQ, BUS_AND_STATUS_REG, BASR_ACK, BASR_ACK, HZ / 64) < 0) scmd_printk(KERN_ERR, hostdata->connected, "%s: !REQ and !ACK\n", __func__); if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_PHASE_MATCH)) return 0; dsprintk(NDEBUG_PSEUDO_DMA, hostdata->host, "%s: bus error (%d/%d)\n", __func__, transferred, len); NCR5380_dprint(NDEBUG_PSEUDO_DMA, hostdata->host); d = dst + transferred; n = len - transferred; } scmd_printk(KERN_ERR, hostdata->connected, "%s: phase mismatch or !DRQ\n", __func__); NCR5380_dprint(NDEBUG_PSEUDO_DMA, hostdata->host); return -1; }