void tws_reset(void *arg) { struct tws_softc *sc = (struct tws_softc *)arg; if ( tws_get_state(sc) == TWS_RESET ) { return; } device_printf(sc->tws_dev, "Resetting controller\n"); lockmgr(&sc->gen_lock, LK_EXCLUSIVE); tws_send_event(sc, TWS_RESET_START); lockmgr(&sc->gen_lock, LK_RELEASE); tws_turn_off_interrupts(sc); lockmgr(&sc->sim_lock, LK_EXCLUSIVE); tws_freeze_simq(sc); lockmgr(&sc->sim_lock, LK_RELEASE); tws_assert_soft_reset(sc); callout_reset(&sc->reset_cb_handle, hz/10, tws_reset_cb, sc); }
int32_t tws_map_request(struct tws_softc *sc, struct tws_request *req) { int32_t error = 0; /* If the command involves data, map that too. */ if (req->data != NULL) { int my_flags = ((req->type == TWS_REQ_TYPE_SCSI_IO) ? BUS_DMA_WAITOK : BUS_DMA_NOWAIT); /* * Map the data buffer into bus space and build the SG list. */ mtx_lock(&sc->io_lock); if (req->flags & TWS_DATA_CCB) error = bus_dmamap_load_ccb(sc->data_tag, req->dma_map, req->data, tws_dmamap_data_load_cbfn, req, my_flags); else error = bus_dmamap_load(sc->data_tag, req->dma_map, req->data, req->length, tws_dmamap_data_load_cbfn, req, my_flags); mtx_unlock(&sc->io_lock); if (error == EINPROGRESS) { TWS_TRACE(sc, "in progress", 0, error); tws_freeze_simq(sc, req); error = 0; // EINPROGRESS is not a fatal error. } } else { /* no data involved */ error = tws_submit_command(sc, req); } return(error); }