diff --git a/sys/dev/aic7xxx/aic7xxx.c b/sys/dev/aic7xxx/aic7xxx.c index d8278b2c1b4c..8117a8c3cd14 100644 --- a/sys/dev/aic7xxx/aic7xxx.c +++ b/sys/dev/aic7xxx/aic7xxx.c @@ -2661,12 +2661,22 @@ ahc_handle_scsiint(struct ahc_softc *ahc, u_int intstat) /* Stop the selection */ ahc_outb(ahc, SCSISEQ, 0); + /* No more pending messages */ ahc_clear_msg_state(ahc); + /* + * Although the driver does not care about the + * 'Selection in Progress' status bit, the busy + * LED does. SELINGO is only cleared by a sucessful + * selection, so we must manually clear it to ensure + * the LED turns off just incase no future successful + * selections occur (e.g. no devices on the bus). + */ + ahc_outb(ahc, CLRSINT0, CLRSELINGO); + + /* Clear interrupt state */ ahc_outb(ahc, CLRSINT1, CLRSELTIMEO|CLRBUSFREE); - ahc_outb(ahc, CLRINT, CLRSCSIINT); - restart_sequencer(ahc); } else if (scb == NULL) { printf("%s: ahc_intr - referenced scb not " @@ -4536,9 +4546,6 @@ ahc_action(struct cam_sim *sim, union ccb *ccb) xpt_done(ccb); break; } - if (ccb->ccb_h.func_code == XPT_NOTIFY_ACK) { - /* Clear notification state */ - } SLIST_INSERT_HEAD(&lstate->immed_notifies, &ccb->ccb_h, sim_links.sle); ccb->ccb_h.status = CAM_REQ_INPROG; @@ -5872,9 +5879,7 @@ ahc_abort_scbs(struct ahc_softc *ahc, int target, char channel, { struct ccb_hdr *ccb_h; - ccb_h = ahc->pending_ccbs.lh_first; - while (ccb_h != NULL) { scbp = (struct scb *)ccb_h->ccb_scb_ptr; ccb_h = ccb_h->sim_links.le.le_next;