void sda_slot_exit(sda_slot_t *slot) { ASSERT(sda_slot_owned(slot)); mutex_enter(&slot->s_lock); slot->s_circular--; if (slot->s_circular == 0) { slot->s_owner = 0; cv_broadcast(&slot->s_cv); } mutex_exit(&slot->s_lock); }
void sda_slot_abort(sda_slot_t *slot, sda_err_t errno) { sda_cmd_t *cmdp; ASSERT(sda_slot_owned(slot)); if ((cmdp = slot->s_xfrp) != NULL) { slot->s_xfrp = NULL; sda_cmd_notify(cmdp, 0, errno); list_insert_tail(&slot->s_abortlist, cmdp); } while ((cmdp = list_head(&slot->s_cmdlist)) != NULL) { list_remove(&slot->s_cmdlist, cmdp); sda_cmd_notify(cmdp, 0, errno); list_insert_tail(&slot->s_abortlist, cmdp); } sda_slot_wakeup(slot); }
void sda_slot_abort(sda_slot_t *slot, sda_err_t errno) { sda_cmd_t *cmdp; ASSERT(sda_slot_owned(slot)); if ((cmdp = slot->s_xfrp) != NULL) { slot->s_xfrp = NULL; sda_cmd_notify(cmdp, SDA_CMDF_BUSY | SDA_CMDF_DAT, errno); } while ((cmdp = list_head(&slot->s_cmdlist)) != NULL) { list_remove(&slot->s_cmdlist, cmdp); sda_cmd_notify(cmdp, 0, errno); mutex_enter(&slot->s_evlock); list_insert_tail(&slot->s_abortlist, cmdp); mutex_exit(&slot->s_evlock); } sda_slot_wakeup(slot); }