diff options
Diffstat (limited to 'sys/dev/advansys/advlib.c')
-rw-r--r-- | sys/dev/advansys/advlib.c | 40 |
1 files changed, 25 insertions, 15 deletions
diff --git a/sys/dev/advansys/advlib.c b/sys/dev/advansys/advlib.c index 2d9d164..dbd0ac4 100644 --- a/sys/dev/advansys/advlib.c +++ b/sys/dev/advansys/advlib.c @@ -45,7 +45,10 @@ __FBSDID("$FreeBSD$"); #include <sys/param.h> +#include <sys/conf.h> +#include <sys/lock.h> #include <sys/kernel.h> +#include <sys/mutex.h> #include <sys/systm.h> #include <machine/bus.h> @@ -298,6 +301,7 @@ advasync(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg) struct adv_softc *adv; adv = (struct adv_softc *)callback_arg; + mtx_assert(&adv->lock, MA_OWNED); switch (code) { case AC_FOUND_DEVICE: { @@ -460,12 +464,12 @@ adv_write_lram_16(struct adv_softc *adv, u_int16_t addr, u_int16_t value) * found, 0 otherwise. */ int -adv_find_signature(bus_space_tag_t tag, bus_space_handle_t bsh) +adv_find_signature(struct resource *res) { u_int16_t signature; - if (bus_space_read_1(tag, bsh, ADV_SIGNATURE_BYTE) == ADV_1000_ID1B) { - signature = bus_space_read_2(tag, bsh, ADV_SIGNATURE_WORD); + if (bus_read_1(res, ADV_SIGNATURE_BYTE) == ADV_1000_ID1B) { + signature = bus_read_2(res, ADV_SIGNATURE_WORD); if ((signature == ADV_1000_ID0W) || (signature == ADV_1000_ID0W_FIX)) return (1); @@ -594,8 +598,8 @@ adv_init_lram_and_mcode(struct adv_softc *adv) retval = adv_load_microcode(adv, 0, (u_int16_t *)adv_mcode, adv_mcode_size); if (retval != adv_mcode_chksum) { - printf("adv%d: Microcode download failed checksum!\n", - adv->unit); + device_printf(adv->dev, + "Microcode download failed checksum!\n"); return (1); } @@ -692,6 +696,8 @@ adv_execute_scsi_queue(struct adv_softc *adv, struct adv_scsi_q *scsiq, u_int8_t sg_entry_cnt_minus_one; u_int8_t tid_no; + if (!dumping) + mtx_assert(&adv->lock, MA_OWNED); scsiq->q1.q_no = 0; retval = 1; /* Default to error case */ target_ix = scsiq->q2.target_ix; @@ -938,6 +944,8 @@ adv_isr_chip_halted(struct adv_softc *adv) u_int8_t q_cntl; u_int8_t tid_no; + if (!dumping) + mtx_assert(&adv->lock, MA_OWNED); int_halt_code = adv_read_lram_16(adv, ADVV_HALTCODE_W); halt_qp = adv_read_lram_8(adv, ADVV_CURCDB_B); halt_q_addr = ADV_QNO_TO_QADDR(halt_qp); @@ -966,6 +974,7 @@ adv_isr_chip_halted(struct adv_softc *adv) target_mask, tid_no); } else if (int_halt_code == ADV_HALT_CHK_CONDITION) { struct adv_target_transinfo* tinfo; + struct adv_ccb_info *cinfo; union ccb *ccb; u_int32_t cinfo_index; u_int8_t tag_code; @@ -1008,6 +1017,7 @@ adv_isr_chip_halted(struct adv_softc *adv) */ cinfo_index = adv_read_lram_32(adv, halt_q_addr + ADV_SCSIQ_D_CINFO_IDX); + cinfo = &adv->ccb_infos[cinfo_index]; ccb = adv->ccb_infos[cinfo_index].ccb; xpt_freeze_devq(ccb->ccb_h.path, /*count*/1); ccb->ccb_h.status |= CAM_DEV_QFRZN; @@ -1021,9 +1031,7 @@ adv_isr_chip_halted(struct adv_softc *adv) * Ensure we have enough time to actually * retrieve the sense. */ - untimeout(adv_timeout, (caddr_t)ccb, ccb->ccb_h.timeout_ch); - ccb->ccb_h.timeout_ch = - timeout(adv_timeout, (caddr_t)ccb, 5 * hz); + callout_reset(&cinfo->timer, 5 * hz, adv_timeout, ccb); } else if (int_halt_code == ADV_HALT_SDTR_REJECTED) { struct ext_msg out_msg; @@ -1090,6 +1098,7 @@ adv_set_syncrate(struct adv_softc *adv, struct cam_path *path, u_int old_offset; u_int8_t sdtr_data; + mtx_assert(&adv->lock, MA_OWNED); tinfo = &adv->tinfo[tid]; /* Filter our input */ @@ -1102,10 +1111,8 @@ adv_set_syncrate(struct adv_softc *adv, struct cam_path *path, if ((type & ADV_TRANS_CUR) != 0 && ((old_period != period || old_offset != offset) || period == 0 || offset == 0) /*Changes in asyn fix settings*/) { - int s; int halted; - s = splcam(); halted = adv_is_chip_halted(adv); if (halted == 0) /* Must halt the chip first */ @@ -1125,7 +1132,6 @@ adv_set_syncrate(struct adv_softc *adv, struct cam_path *path, /* Start the chip again */ adv_start_chip(adv); - splx(s); tinfo->current.period = period; tinfo->current.offset = offset; @@ -1235,8 +1241,8 @@ adv_mset_lram_16(struct adv_softc *adv, u_int16_t s_addr, u_int16_t set_value, int count) { ADV_OUTW(adv, ADV_LRAM_ADDR, s_addr); - bus_space_set_multi_2(adv->tag, adv->bsh, ADV_LRAM_DATA, - set_value, count); + bus_set_multi_2(adv->res, adv->reg_off + ADV_LRAM_DATA, + set_value, count); } static u_int32_t @@ -1507,8 +1513,8 @@ adv_init_microcode_var(struct adv_softc *adv) ADV_OUTW(adv, ADV_REG_PROG_COUNTER, ADV_MCODE_START_ADDR); if (ADV_INW(adv, ADV_REG_PROG_COUNTER) != ADV_MCODE_START_ADDR) { - printf("adv%d: Unable to set program counter. Aborting.\n", - adv->unit); + device_printf(adv->dev, + "Unable to set program counter. Aborting.\n"); return (1); } return (0); @@ -2002,6 +2008,8 @@ adv_abort_ccb(struct adv_softc *adv, int target, int lun, union ccb *ccb, u_int8_t target_ix; int count; + if (!dumping) + mtx_assert(&adv->lock, MA_OWNED); scsiq = &scsiq_buf; target_ix = ADV_TIDLUN_TO_IX(target, lun); count = 0; @@ -2045,6 +2053,8 @@ adv_reset_bus(struct adv_softc *adv, int initiate_bus_reset) int i; union ccb *ccb; + if (!dumping) + mtx_assert(&adv->lock, MA_OWNED); i = 200; while ((ADV_INW(adv, ADV_CHIP_STATUS) & ADV_CSW_SCSI_RESET_ACTIVE) != 0 && i--) |