Date: Thu, 27 May 1999 11:17:46 -0400 (EDT) From: Garrett Wollman <wollman@khavrinen.lcs.mit.edu> To: "John W. DeBoskey" <jwd@unx.sas.com> Cc: freebsd-current@FreeBSD.ORG Subject: Re: cvs commit: src/sys/i386/isa ida.c Message-ID: <199905271517.LAA19291@khavrinen.lcs.mit.edu> In-Reply-To: <199905270323.XAA66917@bb01f39.unx.sas.com> References: <199905270323.XAA66917@bb01f39.unx.sas.com>
next in thread | previous in thread | raw e-mail | index | archive | help
<<On Wed, 26 May 1999 23:23:27 -0400 (EDT), "John W. DeBoskey" <jwd@unx.sas.com> said: > I have/use Dell enclosures. These show-up at boot-time as: > pass6 at ahc0 bus 0 target 6 lun 0 > pass6: <DELL 8UWS BACKPLANE 5> Fixed Processor SCSI-2 device > pass6: 3.300MB/s transfers If they implement the SAF-TE standard, then they will return 50 bytes of inquire data; after the usual SCSI standard data comes the string `SAF-TE'. Here is an example, using the old `libscsi' interface and some appropriate structure definitions: static int is_safte(int fd, struct hsbp *hs) { int i; char *cp; struct scsireq req; struct inquire_response resp; struct encl_config encl; struct hsbp_info *info = &hs->info; scsireq_reset(&req); scsireq_build(&req, sizeof resp, (char *)&resp, SCCMD_READ, "12 v:b3 0:b5 0 0 v 0", (int)info->hi_sc_lun, (int)sizeof resp); scsireq_enter(fd, &req); /* * If we had an error this early, we can't possibly work with this * device. Also return false if we didn't get enough data back * to be a valid SAF-TE response. */ if (SCSIREQ_ERROR((&req)) || req.datalen_used < sizeof resp) return 0; if (strncmp(resp.safte_id, "SAF-TE", 6) != 0) return 0; if (strncmp(resp.safte_rev, "1.0", 3) != 0) return 0; info->hi_type = HSBP_TYPE_SAFTE_1; /* * Format the enclosure ID as something human-readable. */ for (i = 0, cp = info->hi_serial; i < sizeof(resp.encl_id); i++, cp += 2) { snprintf(cp, 2, "%02x", (u_int)resp.encl_id[i] & 0xff); } /* * Copy the other INQUIRE information into the standard * format. */ #define TRIM(field) \ do { cp = &field[(sizeof field) - 1]; \ while (cp > field && *cp == ' ') { \ *cp-- = '\0'; \ } \ } while(0) TRIM(resp.vendor); TRIM(resp.product); TRIM(resp.firmware); #undef TRIM info->hi_vendor[0] = info->hi_model[0] = info->hi_swrev[0] = '\0'; strncat(info->hi_vendor, resp.vendor, sizeof resp.vendor); strncat(info->hi_model, resp.product, sizeof resp.product); strncat(info->hi_swrev, resp.firmware, sizeof resp.firmware); if (safte_read_buffer(fd, info->hi_sc_lun, SAFTE_BUF_ENCL_CONFIG, sizeof encl, &encl) < sizeof encl) { warnx("/dev/pt%d did not accept Read Enclosure Configuration", info->hi_pt_unit); return 0; } info->hi_nslots = encl.nslots; info->hi_nfans = encl.nfans; info->hi_nps = encl.npower; info->hi_ntemps = encl.ntemps; info->hi_haslock = encl.haslock; info->hi_hasspkr = encl.hasspkr; hs->u.safte.statuslen = encl.nfans + encl.npower + encl.nslots + 2 + encl.ntemps + 2; hs->u.safte.status = malloc(hs->u.safte.statuslen); if (hs->u.safte.status == 0) err(EX_OSERR, "malloc(%lu)", (u_long)hs->u.safte.statuslen); hs->u.safte.slotstatus = malloc(4 * encl.nslots); if (hs->u.safte.slotstatus == 0) err(EX_OSERR, "malloc(%d)", 4 * encl.nslots); hs->u.safte.oslotstatus = malloc(4 * encl.nslots); if (hs->u.safte.oslotstatus == 0) err(EX_OSERR, "malloc(%d)", 4 * encl.nslots); hs->u.safte.psstatus = hs->u.safte.status + encl.nfans; hs->u.safte.slotids = hs->u.safte.psstatus + encl.npower; hs->u.safte.lockstatus = hs->u.safte.slotids + encl.nslots; hs->u.safte.spkrstatus = hs->u.safte.lockstatus + 1; hs->u.safte.temps = hs->u.safte.spkrstatus + 1; hs->u.safte.tempalarms = hs->u.safte.temps + encl.ntemps; if (safte_read_buffer(fd, info->hi_sc_lun, SAFTE_BUF_ENCL_STATUS, hs->u.safte.statuslen, hs->u.safte.status) < (int)hs->u.safte.statuslen) { warnx("/dev/pt%d did not accept Read Enclosure Status", info->hi_pt_unit); free(hs->u.safte.status); free(hs->u.safte.slotstatus); hs->u.safte.status = 0; hs->u.safte.statuslen = 0; return 0; } /* * Build the SCSI unit number map. * The specification has the bug that, when no device is installed, * the unit might be specified as 255 (meaning ``none''). */ for (i = 0; i < 16; i++) info->hi_slotunit[i] = -1; for (cp = hs->u.safte.slotids, i = 0; i < encl.nslots; i++) { if (cp[i] < 16) info->hi_slotunit[(u_char)cp[i]] = i; } if (safte_read_buffer(fd, info->hi_sc_lun, SAFTE_BUF_SLOT_STATUS, 4 * encl.nslots, hs->u.safte.slotstatus) < 4 * encl.nslots) { warnx("/dev/pt%d did not accept Read Device Slot Status", info->hi_pt_unit); free(hs->u.safte.status); free(hs->u.safte.slotstatus); return 0; } memcpy(hs->u.safte.oslotstatus, hs->u.safte.slotstatus, 4 * encl.nslots); memset(hs->u.safte.cmdbytes, 0, sizeof hs->u.safte.cmdbytes); hs->u.safte.cmdbytes[0] = SAFTE_WRT_GLOBAL_CMD; return 1; } -GAWollman -- Garrett A. Wollman | O Siem / We are all family / O Siem / We're all the same wollman@lcs.mit.edu | O Siem / The fires of freedom Opinions not those of| Dance in the burning flame MIT, LCS, CRS, or NSA| - Susan Aglukark and Chad Irschick To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199905271517.LAA19291>