Index: etc/defaults/pccard.conf =================================================================== RCS file: /home/ncvs/src/etc/defaults/pccard.conf,v retrieving revision 1.173 diff -u -r1.173 pccard.conf --- etc/defaults/pccard.conf 2001/01/14 08:40:20 1.173 +++ etc/defaults/pccard.conf 2001/02/03 04:19:20 @@ -38,12 +38,10 @@ # Adaptec SlimSCSI (also included with Sony CD-ROM players) card "Adaptec, Inc." "/APA-1460 .*/" config 0x9 "aic" ? - insert camcontrol rescan $device # NewMedia Bustoaster SCSI card "New Media" "SCSI" config 0x22 "aic" ? - insert camcontrol rescan $device ########## an ########## Index: sys/dev/aic/aic.c =================================================================== RCS file: /home/ncvs/src/sys/dev/aic/aic.c,v retrieving revision 1.12 diff -u -r1.12 aic.c --- sys/dev/aic/aic.c 2000/10/15 14:18:00 1.12 +++ sys/dev/aic/aic.c 2001/02/03 04:19:20 @@ -30,6 +30,8 @@ #include #include #include +#include +#include /* for struct devstat */ #include #include @@ -39,6 +41,7 @@ #include #include #include +#include #include @@ -65,6 +68,9 @@ static void aic_scsi_reset __P((struct aic_softc *aic)); static void aic_chip_reset __P((struct aic_softc *aic)); static void aic_reset __P((struct aic_softc *aic, int initiate_reset)); +static void aic_cam_rescan_callback __P((struct cam_periph *periph, + union ccb *ccb)); +static void aic_cam_rescan __P((struct aic_softc *aic)); devclass_t aic_devclass; @@ -1497,14 +1503,6 @@ return (ENXIO); } - if (xpt_create_path(&aic->path, /*periph*/NULL, - cam_sim_path(aic->sim), CAM_TARGET_WILDCARD, - CAM_LUN_WILDCARD) != CAM_REQ_CMP) { - xpt_bus_deregister(cam_sim_path(aic->sim)); - cam_sim_free(aic->sim, /*free_devq*/TRUE); - return (ENXIO); - } - aic_init(aic); printf("aic%d: %s", aic->unit, @@ -1516,6 +1514,9 @@ if (aic->flags & AIC_PARITY_ENABLE) printf(", parity check"); printf("\n"); + + aic_cam_rescan(aic); /* have CAM rescan the bus */ + return (0); } @@ -1527,4 +1528,30 @@ xpt_bus_deregister(cam_sim_path(aic->sim)); cam_sim_free(aic->sim, /*free_devq*/TRUE); return (0); +} + +static void +aic_cam_rescan_callback(struct cam_periph *periph, union ccb *ccb) +{ + free(ccb, M_TEMP); +} + +static void +aic_cam_rescan(struct aic_softc *aic) +{ + union ccb *ccb = malloc(sizeof(union ccb), M_TEMP, M_WAITOK | M_ZERO); + + if (xpt_create_path(&aic->path, xpt_periph, cam_sim_path(aic->sim), 0, 0) + != CAM_REQ_CMP) { + /* A failure is benign as the user can do a manual rescan */ + return; + } + + xpt_setup_ccb(&ccb->ccb_h, aic->path, 5/*priority (low)*/); + ccb->ccb_h.func_code = XPT_SCAN_BUS; + ccb->ccb_h.cbfcnp = aic_cam_rescan_callback; + ccb->crcn.flags = CAM_FLAG_NONE; + xpt_action(ccb); + + /* The scan is in progress now. */ }