diff options
Diffstat (limited to 'sys/dev/atapiscsi')
-rw-r--r-- | sys/dev/atapiscsi/atapiscsi.c | 134 |
1 files changed, 67 insertions, 67 deletions
diff --git a/sys/dev/atapiscsi/atapiscsi.c b/sys/dev/atapiscsi/atapiscsi.c index 192a470c5f9..7542a5626f2 100644 --- a/sys/dev/atapiscsi/atapiscsi.c +++ b/sys/dev/atapiscsi/atapiscsi.c @@ -1,4 +1,4 @@ -/* $OpenBSD: atapiscsi.c,v 1.63 2003/02/13 20:54:59 grange Exp $ */ +/* $OpenBSD: atapiscsi.c,v 1.64 2003/09/28 21:01:43 grange Exp $ */ /* * This code is derived from code with the copyright below. @@ -127,7 +127,7 @@ void wdc_atapi_pio_intr(struct channel_softc *, struct wdc_xfer *, int, struct atapi_return_args *); void wdc_atapi_send_packet(struct channel_softc *, struct wdc_xfer *, int, struct atapi_return_args *); -void wdc_atapi_ctrl(struct channel_softc *, struct wdc_xfer *, +void wdc_atapi_ctrl(struct channel_softc *, struct wdc_xfer *, int, struct atapi_return_args *); char *wdc_atapi_in_data_phase(struct wdc_xfer *, int, int); @@ -167,7 +167,7 @@ int wdc_atapi_ioctl(struct scsi_link *, u_long, caddr_t, int, struct proc *); int wdc_atapi_send_cmd(struct scsi_xfer *sc_xfer); -static struct scsi_adapter atapiscsi_switch = +static struct scsi_adapter atapiscsi_switch = { wdc_atapi_send_cmd, wdc_atapi_minphys, @@ -176,7 +176,7 @@ static struct scsi_adapter atapiscsi_switch = wdc_atapi_ioctl }; -static struct scsi_device atapiscsi_dev = +static struct scsi_device atapiscsi_dev = { NULL, NULL, @@ -255,8 +255,8 @@ atapiscsi_attach(parent, self, aux) sizeof(drvp->drive_name) - 1); drvp->cf_flags = as->sc_dev.dv_cfdata->cf_flags; - wdc_probe_caps(drvp, id); - + wdc_probe_caps(drvp, id); + WDCDEBUG_PRINT( ("general config %04x capabilities %04x ", id->atap_config, id->atap_capabilities1), @@ -267,26 +267,26 @@ atapiscsi_attach(parent, self, aux) else drvp->n_dmaerrs = 0; drvp->drive_flags |= DRIVE_DEVICE_RESET; - + /* Tape drives do funny DSC stuff */ - if (ATAPI_CFG_TYPE(id->atap_config) == + if (ATAPI_CFG_TYPE(id->atap_config) == ATAPI_CFG_TYPE_SEQUENTIAL) drvp->atapi_cap |= ACAP_DSC; - + if ((id->atap_config & ATAPI_CFG_CMD_MASK) == ATAPI_CFG_CMD_16) drvp->atapi_cap |= ACAP_LEN; - + drvp->atapi_cap |= (id->atap_config & ATAPI_CFG_DRQ_MASK); - + WDCDEBUG_PRINT(("driver caps %04x\n", drvp->atapi_cap), DEBUG_PROBE); - + as->sc_adapterlink.scsibus = (u_int8_t)-1; - config_found((struct device *)as, + config_found((struct device *)as, &as->sc_adapterlink, scsiprint); if (as->sc_adapterlink.scsibus != (u_int8_t)-1) { @@ -294,16 +294,16 @@ atapiscsi_attach(parent, self, aux) extern struct cfdriver scsibus_cd; struct scsibus_softc *scsi = scsibus_cd.cd_devs[bus]; struct scsi_link *link = scsi->sc_link[0][0]; - + if (link) { - strncpy(drvp->drive_name, - ((struct device *)(link->device_softc))->dv_xname, + strncpy(drvp->drive_name, + ((struct device *)(link->device_softc))->dv_xname, sizeof(drvp->drive_name) - 1); - + wdc_print_caps(drvp); } } - + #ifdef WDCDEBUG if (chp->wdc->sc_dev.dv_cfdata->cf_flags & WDC_OPTION_PROBE_VERBOSE) wdcdebug_atapi_mask &= ~DEBUG_PROBE; @@ -330,7 +330,7 @@ wdc_atapi_send_cmd(sc_xfer) return (COMPLETE); } - xfer = wdc_get_xfer(sc_xfer->flags & SCSI_NOSLEEP + xfer = wdc_get_xfer(sc_xfer->flags & SCSI_NOSLEEP ? WDC_NOSLEEP : WDC_CANSLEEP); if (xfer == NULL) { return (TRY_AGAIN_LATER); @@ -348,11 +348,11 @@ wdc_atapi_send_cmd(sc_xfer) timeout_set(&xfer->atapi_poll_to, wdc_atapi_timer_handler, chp); WDCDEBUG_PRINT(("wdc_atapi_send_cmd %s:%d:%d ", - chp->wdc->sc_dev.dv_xname, chp->channel, as->drive), + chp->wdc->sc_dev.dv_xname, chp->channel, as->drive), DEBUG_XFERS | DEBUG_ERRORS); for (idx = 0; idx < sc_xfer->cmdlen; idx++) { - WDCDEBUG_PRINT((" %02x", + WDCDEBUG_PRINT((" %02x", ((unsigned char *)sc_xfer->cmd)[idx]), DEBUG_XFERS | DEBUG_ERRORS); } @@ -374,7 +374,7 @@ wdc_atapi_send_cmd(sc_xfer) holding the bus. */ if (!(drvp->drive_flags & DRIVE_DSCBA)) { xfer->c_bcount = 0; - xfer->transfer_len = + xfer->transfer_len = _3btol(((struct scsi_rw_tape *) sc_xfer->cmd)->len); _lto3b(0, @@ -386,8 +386,8 @@ wdc_atapi_send_cmd(sc_xfer) DEBUG_DSC); } else WDCDEBUG_PRINT(("R/W %d blocks %d bytes\n", - _3btol(((struct scsi_rw_tape *) - sc_xfer->cmd)->len), + _3btol(((struct scsi_rw_tape *) + sc_xfer->cmd)->len), sc_xfer->datalen), DEBUG_DSC); @@ -545,7 +545,7 @@ wdc_atapi_timer_handler(arg) s = splbio(); xfer = TAILQ_FIRST(&chp->ch_queue->sc_xfer); - if (xfer == NULL || + if (xfer == NULL || !timeout_triggered(&xfer->atapi_poll_to)) { splx(s); return; @@ -580,7 +580,7 @@ wdc_atapi_intr(chp, xfer, irq) struct atapi_return_args { int timeout; - int delay; + int delay; int expect_irq; }; @@ -589,7 +589,7 @@ struct atapi_return_args { void wdc_atapi_the_poll_machine(chp, xfer) struct channel_softc *chp; - struct wdc_xfer *xfer; + struct wdc_xfer *xfer; { int idx = 0; int current_timeout = 10; @@ -626,13 +626,13 @@ wdc_atapi_the_poll_machine(chp, xfer) void wdc_atapi_the_machine(chp, xfer, ctxt) struct channel_softc *chp; - struct wdc_xfer *xfer; + struct wdc_xfer *xfer; enum atapi_context ctxt; { int idx = 0; extern int ticks; int timeout_delay = hz / 10; - + if (xfer->c_flags & C_POLL) { if (ctxt != ctxt_process) { if (ctxt == ctxt_interrupt) @@ -651,13 +651,13 @@ wdc_atapi_the_machine(chp, xfer, ctxt) for (idx = 0; idx < 50; idx++) { struct atapi_return_args retargs = ARGS_INIT; - (xfer->next)(chp, xfer, + (xfer->next)(chp, xfer, xfer->endticks && (ticks - xfer->endticks >= 0), &retargs); - - if (retargs.timeout != -1) + + if (retargs.timeout != -1) /* - * Add 1 tick to compensate for the fact that we + * Add 1 tick to compensate for the fact that we * can be just microseconds before the tick changes. */ xfer->endticks = @@ -669,7 +669,7 @@ wdc_atapi_the_machine(chp, xfer, ctxt) wdc_free_xfer(chp, xfer); wdcstart(chp); - + return; } @@ -678,7 +678,7 @@ wdc_atapi_the_machine(chp, xfer, ctxt) timeout_add(&chp->ch_timo, xfer->endticks - ticks); return; } - + if (retargs.delay != 0) { timeout_delay = max(retargs.delay * hz / 1000, 1); break; @@ -729,14 +729,14 @@ wdc_atapi_real_start(chp, xfer, timeout, ret) #endif struct ata_drive_datas *drvp = &chp->ch_drive[xfer->drive]; - /* + /* * Only set the DMA flag if the transfer is reasonably large. * At least one older drive failed to complete a 4 byte DMA transfer. */ /* Turn off DMA flag on REQUEST SENSE */ - if (!(xfer->c_flags & (C_POLL | C_SENSE | C_MEDIA_ACCESS)) && + if (!(xfer->c_flags & (C_POLL | C_SENSE | C_MEDIA_ACCESS)) && (drvp->drive_flags & (DRIVE_DMA | DRIVE_UDMA)) && (xfer->c_bcount > 100)) xfer->c_flags |= C_DMA; @@ -779,11 +779,11 @@ wdc_atapi_real_start_2(chp, xfer, timeout, ret) return; } else { wdc_atapi_update_status(chp); - + if (chp->ch_status & (WDCS_BSY | WDCS_DRQ)) return; } - + /* Do control operations specially. */ if (drvp->state < ATAPI_READY_STATE) { xfer->next = wdc_atapi_ctrl; @@ -814,9 +814,9 @@ wdc_atapi_send_packet(chp, xfer, timeout, ret) * data is necessary, multiple data transfer phases will be done. */ - wdccommand(chp, xfer->drive, ATAPI_PKT_CMD, + wdccommand(chp, xfer->drive, ATAPI_PKT_CMD, xfer->c_bcount <= 0xfffe ? xfer->c_bcount : 0xfffe, - 0, 0, 0, + 0, 0, 0, (xfer->c_flags & C_DMA) ? ATAPI_PKT_CMD_FTRE_DMA : 0); if (xfer->c_flags & C_DMA) @@ -854,7 +854,7 @@ wdc_atapi_intr_command(chp, xfer, timeout, ret) int cmdlen = (drvp->atapi_cap & ACAP_LEN) ? 16 : 12; int dma_flags = ((sc_xfer->flags & SCSI_DATA_IN) || (xfer->c_flags & C_SENSE)) ? WDC_DMA_READ : 0; - + wdc_atapi_update_status(chp); if ((chp->ch_status & WDCS_BSY) || !(chp->ch_status & WDCS_DRQ)) { @@ -873,12 +873,12 @@ wdc_atapi_intr_command(chp, xfer, timeout, ret) cmd_reqsense = (struct scsi_sense *)&cmd[0]; cmd_reqsense->opcode = REQUEST_SENSE; cmd_reqsense->length = xfer->c_bcount; - } else + } else bcopy(sc_xfer->cmd, cmd, sc_xfer->cmdlen); WDC_LOG_ATAPI_CMD(chp, xfer->drive, xfer->c_flags, cmdlen, cmd); - + for (i = 0; i < 12; i++) WDCDEBUG_PRINT(("%02x ", cmd[i]), DEBUG_INTR); WDCDEBUG_PRINT((": PHASE_CMDOUT\n"), DEBUG_INTR); @@ -886,7 +886,7 @@ wdc_atapi_intr_command(chp, xfer, timeout, ret) /* Init the DMA channel if necessary */ if (xfer->c_flags & C_DMA) { if ((*chp->wdc->dma_init)(chp->wdc->dma_arg, - chp->channel, xfer->drive, xfer->databuf, + chp->channel, xfer->drive, xfer->databuf, xfer->c_bcount, dma_flags) != 0) { sc_xfer->error = XS_DRIVER_STUFFUP; @@ -968,7 +968,7 @@ wdc_atapi_in_data_phase(xfer, len, ire) message = "data phase where none expected"; goto unexpected_state; } - + /* Make sure polarities match */ if (((ire & WDCI_IN) == WDCI_IN) == ((sc_xfer->flags & SCSI_DATA_OUT) == SCSI_DATA_OUT)) { @@ -981,7 +981,7 @@ wdc_atapi_in_data_phase(xfer, len, ire) goto unexpected_state; } } - + if (len == 0) { message = "zero length transfer requested in data phase"; goto unexpected_state; @@ -1026,17 +1026,17 @@ wdc_atapi_intr_data(chp, xfer, timeout, ret) if (!timeout) { ret->delay = 100; - return; + return; } } - + if (xfer->c_bcount >= len) { WDCDEBUG_PRINT(("wdc_atapi_intr: c_bcount %d len %d " "st 0x%x err 0x%x " "ire 0x%x\n", xfer->c_bcount, len, chp->ch_status, chp->ch_error, ire), DEBUG_INTR); - + /* Common case */ if (sc_xfer->flags & SCSI_DATA_OUT) wdc_output_bytes(drvp, (u_int8_t *)xfer->databuf + @@ -1058,13 +1058,13 @@ wdc_atapi_intr_data(chp, xfer, timeout, ret) wdc_output_bytes(drvp, (u_int8_t *)xfer->databuf + xfer->c_skip, xfer->c_bcount); - - CHP_WRITE_RAW_MULTI_2(chp, NULL, + + CHP_WRITE_RAW_MULTI_2(chp, NULL, len - xfer->c_bcount); } else { printf("wdc_atapi_intr: warning: reading only " "%d of %d bytes\n", xfer->c_bcount, len); - + wdc_input_bytes(drvp, (char *)xfer->databuf + xfer->c_skip, xfer->c_bcount); @@ -1120,16 +1120,16 @@ wdc_atapi_intr_complete(chp, xfer, timeout, ret) ret->expect_irq = 1; return; } - + chp->wdc->dma_status = (*chp->wdc->dma_finish) (chp->wdc->dma_arg, chp->channel, xfer->drive); - if (chp->wdc->dma_status & WDC_DMAST_UNDER) + if (chp->wdc->dma_status & WDC_DMAST_UNDER) xfer->c_bcount = 1; else - xfer->c_bcount = 0; + xfer->c_bcount = 0; } as->protocol_phase = as_none; @@ -1177,7 +1177,7 @@ wdc_atapi_intr_complete(chp, xfer, timeout, ret) xfer->next = wdc_atapi_real_start; return; } - } + } } if ((xfer->c_flags & C_DMA) && @@ -1188,7 +1188,7 @@ wdc_atapi_intr_complete(chp, xfer, timeout, ret) xfer->next = wdc_atapi_reset; return; } - + if (xfer->c_bcount != 0) { WDCDEBUG_PRINT(("wdc_atapi_intr: bcount value is " @@ -1208,7 +1208,7 @@ wdc_atapi_intr_complete(chp, xfer, timeout, ret) if (xfer->c_done) xfer->next = xfer->c_done; - else + else xfer->next = wdc_atapi_done; return; @@ -1300,7 +1300,7 @@ timeout: "status=%02x, ireason=%02x\n", chp->wdc->sc_dev.dv_xname, chp->channel, xfer->drive, xfer->c_bcount, xfer->c_skip, chp->ch_status, ireason); - + sc_xfer->error = XS_TIMEOUT; xfer->next = wdc_atapi_reset; return; @@ -1374,7 +1374,7 @@ wdc_atapi_ctrl(chp, xfer, timeout, ret) errstring = "dmamode"; if (chp->ch_status & (WDCS_BSY | WDCS_DRQ)) drvp->drive_flags &= ~(DRIVE_DMA | DRIVE_UDMA); - else + else trigger_timeout = 0; break; @@ -1392,7 +1392,7 @@ wdc_atapi_ctrl(chp, xfer, timeout, ret) DEBUG_INTR | DEBUG_FUNCS); switch (drvp->state) { - /* My ATAPI slave device likes to assert DASP-/PDIAG- until + /* My ATAPI slave device likes to assert DASP-/PDIAG- until it is DEVICE RESET. This causes the LED to stay on. There is a trade-off here. This drive will cause any @@ -1439,7 +1439,7 @@ wdc_atapi_ctrl(chp, xfer, timeout, ret) } drvp->state = ATAPI_PIOMODE_STATE; - /* + /* * Note, we can't go directly to set PIO mode * because the drive is free to assert BSY * after the transfer @@ -1539,7 +1539,7 @@ wdc_atapi_tape_done(chp, xfer, timeout, ret) return; } - + void wdc_atapi_done(chp, xfer, timeout, ret) struct channel_softc *chp; @@ -1574,7 +1574,7 @@ wdc_atapi_reset(chp, xfer, timeout, ret) struct atapi_return_args *ret; { struct ata_drive_datas *drvp = &chp->ch_drive[xfer->drive]; - + if (drvp->state == 0) { xfer->next = wdc_atapi_done; return; @@ -1603,14 +1603,14 @@ wdc_atapi_reset_2(chp, xfer, timeout, ret) { struct ata_drive_datas *drvp = &chp->ch_drive[xfer->drive]; struct scsi_xfer *sc_xfer = xfer->cmd; - + if (timeout) { printf("%s:%d:%d: soft reset failed\n", chp->wdc->sc_dev.dv_xname, chp->channel, xfer->drive); sc_xfer->error = XS_SELTIMEOUT; wdc_reset_channel(drvp); - + xfer->next = wdc_atapi_done; return; } |