Lines Matching +defs:link +defs:flags

286 	struct scsi_link		*link = sa->sa_sc_link;
288 if (cf->cf_loc[0] != -1 && cf->cf_loc[0] != link->target)
290 if (cf->cf_loc[1] != -1 && cf->cf_loc[1] != link->lun)
355 struct scsi_link *link;
359 SLIST_FOREACH(link, &sb->sc_link_list, bus_list) {
360 r = scsi_activate_link(link, act);
370 struct scsi_link *link;
374 SLIST_FOREACH(link, &sb->sc_link_list, bus_list) {
375 if (link->target == target) {
376 r = scsi_activate_link(link, act);
387 struct scsi_link *link;
389 /* Activate the (target, lun) link.*/
390 link = scsi_get_link(sb, target, lun);
391 if (link == NULL)
394 return scsi_activate_link(link, act);
398 scsi_activate_link(struct scsi_link *link, int act)
403 dev = link->device_softc;
406 atomic_setbits_int(&link->state, SDEV_S_DYING);
481 struct scsi_link *link, *link0;
490 link = malloc(sizeof(*link), M_DEVBUF, M_NOWAIT);
491 if (link == NULL) {
492 SC_DEBUG(link, SDEV_DB2, ("malloc(scsi_link) failed.\n"));
496 link->state = 0;
497 link->target = target;
498 link->lun = lun;
499 link->openings = sb->sb_openings;
500 link->node_wwn = link->port_wwn = 0;
501 link->flags = sb->sb_flags;
502 link->quirks = sb->sb_quirks;
503 link->interpret_sense = scsi_interpret_sense;
504 link->device_softc = NULL;
505 link->bus = sb;
506 memset(&link->inqdata, 0, sizeof(link->inqdata));
507 link->id = NULL;
508 TAILQ_INIT(&link->queue);
509 link->running = 0;
510 link->pending = 0;
511 link->pool = sb->sb_pool;
513 SC_DEBUG(link, SDEV_DB2, ("scsi_link created.\n"));
517 sb->sb_adapter->dev_probe(link) != 0) {
519 SC_DEBUG(link, SDEV_DB2, ("dev_probe(link) failed.\n"));
522 free(link, M_DEVBUF, sizeof(*link));
528 * using link->openings.
530 if (link->pool == NULL) {
531 link->pool = malloc(sizeof(*link->pool), M_DEVBUF, M_NOWAIT);
532 if (link->pool == NULL) {
533 SC_DEBUG(link, SDEV_DB2, ("malloc(pool) failed.\n"));
537 scsi_iopool_init(link->pool, link, scsi_default_get,
540 SET(link->flags, SDEV_OWN_IOPL);
549 devquirks = link->quirks;
550 SET(link->quirks, SDEV_NOSYNC | SDEV_NOWIDE | SDEV_NOTAGS);
560 SET(link->flags, scsidebug_level);
565 scsi_test_unit_ready(link, TEST_READY_RETRIES,
573 SC_DEBUG(link, SDEV_DB2, ("dma_alloc(inqbuf) failed.\n"));
578 rslt = scsi_inquire(link, inqbuf, scsi_autoconf | SCSI_SILENT);
586 memcpy(&link->inqdata, inqbuf, inqbytes);
588 inqbuf = &link->inqdata;
613 scsi_devid(link);
618 else if (ISSET(link->flags, SDEV_UMASS))
620 else if (link->id != NULL && !DEVID_CMP(link0->id, link->id))
625 SC_DEBUG(link, SDEV_DB1, ("IDENTIFY not supported.\n"));
630 link->quirks = devquirks; /* Restore what the device wanted. */
637 SET(link->quirks, finger->quirks);
642 SET(link->quirks, SDEV_NOTAGS | SDEV_NOSYNC | SDEV_NOWIDE |
648 if (!ISSET(inqbuf->flags, SID_CmdQue))
649 SET(link->quirks, SDEV_NOTAGS);
650 if (!ISSET(inqbuf->flags, SID_Sync))
651 SET(link->quirks, SDEV_NOSYNC);
652 if (!ISSET(inqbuf->flags, SID_WBus16))
653 SET(link->quirks, SDEV_NOWIDE);
659 if (!ISSET(inqbuf->flags, SID_CmdQue))
660 SET(link->quirks, SDEV_NOTAGS);
669 if (ISSET(link->quirks, SDEV_NOTAGS))
670 link->openings = 1;
676 SET(link->flags, SDEV_REMOVABLE);
678 sa.sa_sc_link = link;
693 if (lun == 0 && ISSET(link->flags, SDEV_UMASS) &&
697 link->lun = 1;
698 scsi_inquire(link, usbinqbuf, scsi_autoconf | SCSI_SILENT);
699 link->lun = 0;
704 scsi_add_link(link);
715 scsi_test_unit_ready(link, TEST_READY_RETRIES,
723 scsi_detach_link(link, DETACH_FORCE);
728 scsi_detach(struct scsibus_softc *sb, int target, int lun, int flags)
731 return scsi_detach_bus(sb, flags);
733 return scsi_detach_target(sb, target, flags);
735 return scsi_detach_lun(sb, target, lun, flags);
739 scsi_detach_bus(struct scsibus_softc *sb, int flags)
741 struct scsi_link *link, *tmp;
745 SLIST_FOREACH_SAFE(link, &sb->sc_link_list, bus_list, tmp) {
746 r = scsi_detach_link(link, flags);
754 scsi_detach_target(struct scsibus_softc *sb, int target, int flags)
756 struct scsi_link *link, *tmp;
760 SLIST_FOREACH_SAFE(link, &sb->sc_link_list, bus_list, tmp) {
761 if (link->target == target) {
762 r = scsi_detach_link(link, flags);
771 scsi_detach_lun(struct scsibus_softc *sb, int target, int lun, int flags)
773 struct scsi_link *link;
775 /* Detach (target, lun) link. */
776 link = scsi_get_link(sb, target, lun);
777 if (link == NULL)
780 return scsi_detach_link(link, flags);
784 scsi_detach_link(struct scsi_link *link, int flags)
786 struct scsibus_softc *sb = link->bus;
789 if (!ISSET(flags, DETACH_FORCE) && ISSET(link->flags, SDEV_OPEN))
795 if (link->pool != NULL)
796 scsi_link_shutdown(link);
799 if (link->device_softc != NULL) {
800 rv = config_detach(link->device_softc, flags);
806 if (link->pool != NULL && ISSET(link->flags, SDEV_OWN_IOPL)) {
807 scsi_iopool_destroy(link->pool);
808 free(link->pool, M_DEVBUF, sizeof(*link->pool));
813 sb->sb_adapter->dev_free(link);
816 if (link->id != NULL)
817 devid_free(link->id);
818 scsi_remove_link(link);
819 free(link, M_DEVBUF, sizeof(*link));
827 struct scsi_link *link;
829 SLIST_FOREACH(link, &sb->sc_link_list, bus_list) {
830 if (link->target == target && link->lun == lun)
831 return link;
838 scsi_add_link(struct scsi_link *link)
840 SLIST_INSERT_HEAD(&link->bus->sc_link_list, link, bus_list);
844 scsi_remove_link(struct scsi_link *link)
846 struct scsibus_softc *sb = link->bus;
850 if (elm == link) {
888 if ((link0->flags & (SDEV_UMASS | SDEV_ATAPI)) != 0 ||
979 scsi_print_link(struct scsi_link *link)
986 printf(" targ %d lun %d: ", link->target, link->lun);
988 inqbuf = &link->inqdata;
998 if (ISSET(link->flags, SDEV_ATAPI))
1008 if (ISSET(link->flags, SDEV_REMOVABLE))
1011 if (link->id != NULL && link->id->d_type != DEVID_NONE) {
1012 id = (u_int8_t *)(link->id + 1);
1013 switch (link->id->d_type) {
1031 if (ISSET(link->id->d_flags, DEVID_F_PRINT)) {
1032 for (i = 0; i < link->id->d_len; i++) {
1047 for (i = 0; i < link->id->d_len; i++)
1053 sc_print_addr(link);
1055 link->state, link->bus->sb_luns, link->openings);
1057 sc_print_addr(link);
1058 printf("flags (0x%04x) ", link->flags);
1059 scsi_show_flags(link->flags, flagnames);
1062 sc_print_addr(link);
1063 printf("quirks (0x%04x) ", link->quirks);
1064 scsi_show_flags(link->quirks, quirknames);
1134 scsi_devid(struct scsi_link *link)
1143 if (link->id != NULL)
1148 if (SID_ANSII_REV(&link->inqdata) >= SCSI_REV_2) {
1149 if (scsi_inquire_vpd(link, pg, sizeof(*pg), SI_PG_SUPPORTED,
1165 if (pg83 && scsi_devid_pg83(link) == 0)
1167 if (pg80 && scsi_devid_pg80(link) == 0)
1172 scsi_devid_wwn(link);
1178 scsi_devid_pg83(struct scsi_link *link)
1189 rv = scsi_inquire_vpd(link, hdr, sizeof(*hdr), SI_PG_DEVID,
1197 rv = scsi_inquire_vpd(link, pg, len, SI_PG_DEVID, scsi_autoconf);
1215 if (VPD_DEVID_ASSOC(dhdr.flags) == VPD_DEVID_ASSOC_LU) {
1216 type = VPD_DEVID_TYPE(dhdr.flags);
1239 switch (VPD_DEVID_TYPE(chdr.flags)) {
1259 link->id = devid_alloc(idtype, idflags, chdr.len, id);
1272 scsi_devid_pg80(struct scsi_link *link)
1282 rv = scsi_inquire_vpd(link, hdr, sizeof(*hdr), SI_PG_SERIAL,
1296 rv = scsi_inquire_vpd(link, pg, pglen, SI_PG_SERIAL, scsi_autoconf);
1300 idlen = sizeof(link->inqdata.vendor) +
1301 sizeof(link->inqdata.product) + len;
1303 memcpy(id, link->inqdata.vendor, sizeof(link->inqdata.vendor));
1304 memcpy(id + sizeof(link->inqdata.vendor), link->inqdata.product,
1305 sizeof(link->inqdata.product));
1306 memcpy(id + sizeof(link->inqdata.vendor) +
1307 sizeof(link->inqdata.product), pg + sizeof(*hdr), len);
1309 link->id = devid_alloc(DEVID_SERIAL, DEVID_F_PRINT,
1310 sizeof(link->inqdata.vendor) + sizeof(link->inqdata.product) + len,
1323 scsi_devid_wwn(struct scsi_link *link)
1327 if (link->lun != 0 || link->node_wwn == 0)
1330 wwnn = htobe64(link->node_wwn);
1331 link->id = devid_alloc(DEVID_WWN, 0, sizeof(wwnn), (u_int8_t *)&wwnn);
1337 devid_alloc(u_int8_t type, u_int8_t flags, u_int8_t len, u_int8_t *id)
1346 d->d_flags = flags;