int scsi_probe(struct scsibus_softc *sc, int target, int lun) { if (target == -1 && lun == -1) return (scsi_probe_bus(sc)); /* specific lun and wildcard target is bad */ if (target == -1) return (EINVAL); if (lun == -1) return (scsi_probe_target(sc, target)); return (scsi_probe_lun(sc, target, lun)); }
/* * The routine called by the adapter boards to get all their * devices configured in. */ void scsibusattach(struct device *parent, struct device *self, void *aux) { struct scsibus_softc *sb = (struct scsibus_softc *)self; struct scsibus_attach_args *saa = aux; struct scsi_link *sc_link_proto = saa->saa_sc_link; int nbytes, i; if (!cold) scsi_autoconf = 0; sc_link_proto->scsibus = sb->sc_dev.dv_unit; sb->adapter_link = sc_link_proto; if (sb->adapter_link->adapter_buswidth == 0) sb->adapter_link->adapter_buswidth = 8; sb->sc_buswidth = sb->adapter_link->adapter_buswidth; if (sb->adapter_link->luns == 0) sb->adapter_link->luns = 8; printf(": %d targets\n", sb->sc_buswidth); /* Initialize shared data. */ scsi_init(); nbytes = sb->sc_buswidth * sizeof(struct scsi_link **); sb->sc_link = malloc(nbytes, M_DEVBUF, M_NOWAIT); if (sb->sc_link == NULL) panic("scsibusattach: can't allocate target links"); nbytes = sb->adapter_link->luns * sizeof(struct scsi_link *); for (i = 0; i < sb->sc_buswidth; i++) { sb->sc_link[i] = malloc(nbytes, M_DEVBUF, M_NOWAIT); if (sb->sc_link[i] == NULL) panic("scsibusattach: can't allocate lun links"); bzero(sb->sc_link[i], nbytes); } #if NBIO > 0 if (bio_register(&sb->sc_dev, scsibus_bioctl) != 0) printf("%s: unable to register bio\n", sb->sc_dev.dv_xname); #endif scsi_probe_bus(sb); }
/* * The routine called by the adapter boards to get all their * devices configured in. */ void scsibusattach(struct device *parent, struct device *self, void *aux) { struct scsibus_softc *sb = (struct scsibus_softc *)self; struct scsibus_attach_args *saa = aux; struct scsi_link *sc_link_proto = saa->saa_sc_link; if (!cold) scsi_autoconf = 0; sc_link_proto->bus = sb; sc_link_proto->scsibus = sb->sc_dev.dv_unit; sb->adapter_link = sc_link_proto; if (sb->adapter_link->adapter_buswidth == 0) sb->adapter_link->adapter_buswidth = 8; sb->sc_buswidth = sb->adapter_link->adapter_buswidth; if (sb->adapter_link->luns == 0) sb->adapter_link->luns = 8; printf(": %d targets", sb->sc_buswidth); if (sb->adapter_link->adapter_target < sb->sc_buswidth) printf(", initiator %d", sb->adapter_link->adapter_target); if (sb->adapter_link->port_wwn != 0x0 && sb->adapter_link->node_wwn != 0x0) { printf(", WWPN %016llx, WWNN %016llx", sb->adapter_link->port_wwn, sb->adapter_link->node_wwn); } printf("\n"); /* Initialize shared data. */ scsi_init(); SLIST_INIT(&sb->sc_link); #if NBIO > 0 if (bio_register(&sb->sc_dev, scsibus_bioctl) != 0) printf("%s: unable to register bio\n", sb->sc_dev.dv_xname); #endif scsi_probe_bus(sb); }
int scsibus_bioctl(struct device *dev, u_long cmd, caddr_t addr) { struct scsibus_softc *sc = (struct scsibus_softc *)dev; struct sbioc_device *sdev; switch (cmd) { case SBIOCPROBE: sdev = (struct sbioc_device *)addr; if (sdev->sd_target == -1 && sdev->sd_lun == -1) return (scsi_probe_bus(sc)); /* specific lun and wildcard target is bad */ if (sdev->sd_target == -1) return (EINVAL); if (sdev->sd_lun == -1) return (scsi_probe_target(sc, sdev->sd_target)); return (scsi_probe_lun(sc, sdev->sd_target, sdev->sd_lun)); case SBIOCDETACH: sdev = (struct sbioc_device *)addr; if (sdev->sd_target == -1 && sdev->sd_lun == -1) return (scsi_detach_bus(sc, 0)); if (sdev->sd_target == -1) return (EINVAL); if (sdev->sd_lun == -1) return (scsi_detach_target(sc, sdev->sd_target, 0)); return (scsi_detach_lun(sc, sdev->sd_target, sdev->sd_lun, 0)); default: return (ENOTTY); } }