struct tws_request * tws_get_request(struct tws_softc *sc, u_int16_t type) { struct mtx *my_mutex = ((type == TWS_REQ_TYPE_SCSI_IO) ? &sc->q_lock : &sc->gen_lock); struct tws_request *r = NULL; mtx_lock(my_mutex); if (type == TWS_REQ_TYPE_SCSI_IO) { r = tws_q_remove_head(sc, TWS_FREE_Q); } else { if ( sc->reqs[type].state == TWS_REQ_STATE_FREE ) { r = &sc->reqs[type]; } } if ( r ) { bzero(&r->cmd_pkt->cmd, sizeof(struct tws_command_apache)); r->data = NULL; r->length = 0; r->type = type; r->flags = TWS_DIR_UNKNOWN; r->error_code = TWS_REQ_RET_INVALID; r->cb = NULL; r->ccb_ptr = NULL; r->thandle.callout = NULL; r->next = r->prev = NULL; r->state = ((type == TWS_REQ_TYPE_SCSI_IO) ? TWS_REQ_STATE_TRAN : TWS_REQ_STATE_BUSY); } mtx_unlock(my_mutex); return(r); }
struct tws_request * tws_get_request(struct tws_softc *sc, u_int16_t type) { struct tws_request *r = NULL; switch ( type ) { case TWS_INTERNAL_CMD_REQ : lockmgr(&sc->gen_lock, LK_EXCLUSIVE); r = &sc->reqs[0]; if ( r->state != TWS_REQ_STATE_FREE ) { r = NULL; } else { r->state = TWS_REQ_STATE_BUSY; } lockmgr(&sc->gen_lock, LK_RELEASE); break; case TWS_AEN_FETCH_REQ : lockmgr(&sc->gen_lock, LK_EXCLUSIVE); r = &sc->reqs[1]; if ( r->state != TWS_REQ_STATE_FREE ) { r = NULL; } else { r->state = TWS_REQ_STATE_BUSY; } lockmgr(&sc->gen_lock, LK_RELEASE); break; case TWS_PASSTHRU_REQ : lockmgr(&sc->gen_lock, LK_EXCLUSIVE); r = &sc->reqs[2]; if ( r->state != TWS_REQ_STATE_FREE ) { r = NULL; } else { r->state = TWS_REQ_STATE_BUSY; } lockmgr(&sc->gen_lock, LK_RELEASE); break; case TWS_GETSET_PARAM_REQ : lockmgr(&sc->gen_lock, LK_EXCLUSIVE); r = &sc->reqs[3]; if ( r->state != TWS_REQ_STATE_FREE ) { r = NULL; } else { r->state = TWS_REQ_STATE_BUSY; } lockmgr(&sc->gen_lock, LK_RELEASE); break; case TWS_SCSI_IO_REQ : lockmgr(&sc->q_lock, LK_EXCLUSIVE); r = tws_q_remove_head(sc, TWS_FREE_Q); if ( r ) r->state = TWS_REQ_STATE_TRAN; lockmgr(&sc->q_lock, LK_RELEASE); break; default : TWS_TRACE_DEBUG(sc, "Unknown req type", 0, type); r = NULL; } if ( r ) { bzero(&r->cmd_pkt->cmd, sizeof(struct tws_command_apache)); callout_init(&r->thandle); r->data = NULL; r->length = 0; r->type = type; r->flags = TWS_DIR_UNKNOWN; r->error_code = TWS_REQ_ERR_INVALID; r->ccb_ptr = NULL; r->cb = NULL; r->next = r->prev = NULL; } return(r); }