diff options
Diffstat (limited to 'sys/dev')
-rw-r--r-- | sys/dev/ciss/ciss.c | 8 | ||||
-rw-r--r-- | sys/dev/firewire/sbp.c | 4 | ||||
-rw-r--r-- | sys/dev/firewire/sbp_targ.c | 91 | ||||
-rw-r--r-- | sys/dev/iir/iir.c | 13 | ||||
-rw-r--r-- | sys/dev/iscsi/initiator/iscsi_subr.c | 7 | ||||
-rw-r--r-- | sys/dev/isp/isp_freebsd.h | 26 | ||||
-rw-r--r-- | sys/dev/mly/mly.c | 8 | ||||
-rw-r--r-- | sys/dev/mps/mps_sas.c | 15 | ||||
-rw-r--r-- | sys/dev/mpt/mpt_cam.c | 15 | ||||
-rw-r--r-- | sys/dev/usb/storage/umass.c | 29 |
10 files changed, 154 insertions, 62 deletions
diff --git a/sys/dev/ciss/ciss.c b/sys/dev/ciss/ciss.c index e892e50..016d5f3 100644 --- a/sys/dev/ciss/ciss.c +++ b/sys/dev/ciss/ciss.c @@ -3249,13 +3249,17 @@ ciss_cam_complete(struct ciss_request *cr) ce->sense_length, ce->residual_count); bzero(&csio->sense_data, SSD_FULL_SIZE); bcopy(&ce->sense_info[0], &csio->sense_data, ce->sense_length); - csio->sense_len = ce->sense_length; + if (csio->sense_len > ce->sense_length) + csio->sense_resid = csio->sense_len - ce->sense_length; + else + csio->sense_resid = 0; csio->resid = ce->residual_count; csio->ccb_h.status |= CAM_SCSI_STATUS_ERROR | CAM_AUTOSNS_VALID; #ifdef CISS_DEBUG { struct scsi_sense_data *sns = (struct scsi_sense_data *)&ce->sense_info[0]; - debug(0, "sense key %x", sns->flags & SSD_KEY); + debug(0, "sense key %x", scsi_get_sense_key(sns, csio->sense_len - + csio->sense_resid, /*show_errors*/ 1)); } #endif break; diff --git a/sys/dev/firewire/sbp.c b/sys/dev/firewire/sbp.c index 0ac7d14..2387bf9 100644 --- a/sys/dev/firewire/sbp.c +++ b/sys/dev/firewire/sbp.c @@ -1515,10 +1515,10 @@ static void sbp_scsi_status(struct sbp_status *sbp_status, struct sbp_ocb *ocb) { struct sbp_cmd_status *sbp_cmd_status; - struct scsi_sense_data *sense; + struct scsi_sense_data_fixed *sense; sbp_cmd_status = (struct sbp_cmd_status *)sbp_status->data; - sense = &ocb->ccb->csio.sense_data; + sense = (struct scsi_sense_data_fixed *)&ocb->ccb->csio.sense_data; SBP_DEBUG(0) sbp_print_scsi_cmd(ocb); diff --git a/sys/dev/firewire/sbp_targ.c b/sys/dev/firewire/sbp_targ.c index c5b9d23..f04b968 100644 --- a/sys/dev/firewire/sbp_targ.c +++ b/sys/dev/firewire/sbp_targ.c @@ -41,6 +41,7 @@ #include <sys/types.h> #include <sys/conf.h> #include <sys/malloc.h> +#include <sys/endian.h> #if __FreeBSD_version < 500000 #include <sys/devicestat.h> #endif @@ -632,6 +633,12 @@ sbp_targ_send_status(struct orb_info *orbi, union ccb *ccb) { struct sbp_cmd_status *sbp_cmd_status; struct scsi_sense_data *sense; + int error_code, sense_key, asc, ascq; + uint8_t stream_bits; + uint8_t sks[3]; + uint64_t info; + int64_t sinfo; + int sense_len; if (debug) printf("%s: STATUS %d\n", __func__, @@ -659,35 +666,75 @@ sbp_targ_send_status(struct orb_info *orbi, union ccb *ccb) #endif #endif - if ((sense->error_code & SSD_ERRCODE) == SSD_CURRENT_ERROR) + sense_len = ccb->csio.sense_len - ccb->csio.sense_resid; + scsi_extract_sense_len(sense, sense_len, &error_code, + &sense_key, &asc, &ascq, /*show_errors*/ 0); + + switch (error_code) { + case SSD_CURRENT_ERROR: + case SSD_DESC_CURRENT_ERROR: sbp_cmd_status->sfmt = SBP_SFMT_CURR; - else + break; + default: sbp_cmd_status->sfmt = SBP_SFMT_DEFER; + break; + } - sbp_cmd_status->valid = (sense->error_code & SSD_ERRCODE_VALID) - ? 1 : 0; - sbp_cmd_status->s_key = sense->flags & SSD_KEY; - sbp_cmd_status->mark = (sense->flags & SSD_FILEMARK)? 1 : 0; - sbp_cmd_status->eom = (sense->flags & SSD_EOM) ? 1 : 0; - sbp_cmd_status->ill_len = (sense->flags & SSD_ILI) ? 1 : 0; + if (scsi_get_sense_info(sense, sense_len, SSD_DESC_INFO, &info, + &sinfo) == 0) { + uint32_t info_trunc; + sbp_cmd_status->valid = 1; + info_trunc = info; - bcopy(&sense->info[0], &sbp_cmd_status->info, 4); + sbp_cmd_status->info = htobe32(info_trunc); + } else { + sbp_cmd_status->valid = 0; + } - if (sense->extra_len <= 6) - /* add_sense_code(_qual), info, cmd_spec_info */ - sbp_status->len = 4; - else - /* fru, sense_key_spec */ - sbp_status->len = 5; - - bcopy(&sense->cmd_spec_info[0], &sbp_cmd_status->cdb, 4); + sbp_cmd_status->s_key = sense_key; + + if (scsi_get_stream_info(sense, sense_len, NULL, + &stream_bits) == 0) { + sbp_cmd_status->mark = + (stream_bits & SSD_FILEMARK) ? 1 : 0; + sbp_cmd_status->eom = + (stream_bits & SSD_EOM) ? 1 : 0; + sbp_cmd_status->ill_len = + (stream_bits & SSD_ILI) ? 1 : 0; + } else { + sbp_cmd_status->mark = 0; + sbp_cmd_status->eom = 0; + sbp_cmd_status->ill_len = 0; + } + + + /* add_sense_code(_qual), info, cmd_spec_info */ + sbp_status->len = 4; + + if (scsi_get_sense_info(sense, sense_len, SSD_DESC_COMMAND, + &info, &sinfo) == 0) { + uint32_t cmdspec_trunc; + + cmdspec_trunc = info; + + sbp_cmd_status->cdb = htobe32(cmdspec_trunc); + } - sbp_cmd_status->s_code = sense->add_sense_code; - sbp_cmd_status->s_qlfr = sense->add_sense_code_qual; - sbp_cmd_status->fru = sense->fru; + sbp_cmd_status->s_code = asc; + sbp_cmd_status->s_qlfr = ascq; - bcopy(&sense->sense_key_spec[0], - &sbp_cmd_status->s_keydep[0], 3); + if (scsi_get_sense_info(sense, sense_len, SSD_DESC_FRU, &info, + &sinfo) == 0) { + sbp_cmd_status->fru = (uint8_t)info; + sbp_status->len = 5; + } else { + sbp_cmd_status->fru = 0; + } + + if (scsi_get_sks(sense, sense_len, sks) == 0) { + bcopy(sks, &sbp_cmd_status->s_keydep[0], sizeof(sks)); + sbp_status->len = 5; + } break; } diff --git a/sys/dev/iir/iir.c b/sys/dev/iir/iir.c index b0915c2..2be7c39 100644 --- a/sys/dev/iir/iir.c +++ b/sys/dev/iir/iir.c @@ -1839,13 +1839,20 @@ gdt_sync_event(struct gdt_softc *gdt, int service, } else { /* error */ if (gccb->gc_service == GDT_CACHESERVICE) { + struct scsi_sense_data *sense; + ccb->ccb_h.status |= CAM_SCSI_STATUS_ERROR | CAM_AUTOSNS_VALID; ccb->ccb_h.status &= ~CAM_SIM_QUEUED; ccb->csio.scsi_status = SCSI_STATUS_CHECK_COND; bzero(&ccb->csio.sense_data, ccb->csio.sense_len); - ccb->csio.sense_data.error_code = - SSD_CURRENT_ERROR | SSD_ERRCODE_VALID; - ccb->csio.sense_data.flags = SSD_KEY_NOT_READY; + sense = &ccb->csio.sense_data; + scsi_set_sense_data(sense, + /*sense_format*/ SSD_TYPE_NONE, + /*current_error*/ 1, + /*sense_key*/ SSD_KEY_NOT_READY, + /*asc*/ 0x4, + /*ascq*/ 0x01, + SSD_ELEM_NONE); gdt->sc_dvr.size = sizeof(gdt->sc_dvr.eu.sync); gdt->sc_dvr.eu.sync.ionode = gdt->sc_hanum; diff --git a/sys/dev/iscsi/initiator/iscsi_subr.c b/sys/dev/iscsi/initiator/iscsi_subr.c index 03d9293..ffe1baa 100644 --- a/sys/dev/iscsi/initiator/iscsi_subr.c +++ b/sys/dev/iscsi/initiator/iscsi_subr.c @@ -153,6 +153,7 @@ getSenseData(u_int status, union ccb *ccb, pduq_t *pq) scsi_rsp_t *cmd = &pp->ipdu.scsi_rsp; caddr_t bp; int sense_len, mustfree = 0; + int error_code, sense_key, asc, ascq; bp = mtod(pq->mp, caddr_t); if((sense_len = scsi_2btoul(bp)) == 0) @@ -174,10 +175,14 @@ getSenseData(u_int status, union ccb *ccb, pduq_t *pq) scsi->sense_resid = 0; if(cmd->flag & (BIT(1)|BIT(2))) scsi->sense_resid = ntohl(pp->ipdu.scsi_rsp.rcnt); + + scsi_extract_sense_len(sense, scsi->sense_len - scsi->sense_resid, + &error_code, &sense_key, &asc, &ascq, /*show_errors*/ 1); + debug(3, "sense_len=%d rcnt=%d sense_resid=%d dsl=%d error_code=%x flags=%x", sense_len, ntohl(pp->ipdu.scsi_rsp.rcnt), scsi->sense_resid, - pp->ds_len, sense->error_code, sense->flags); + pp->ds_len, error_code, sense_key); if(mustfree) free(bp, M_ISCSI); diff --git a/sys/dev/isp/isp_freebsd.h b/sys/dev/isp/isp_freebsd.h index 1fb5fc5..9d14039 100644 --- a/sys/dev/isp/isp_freebsd.h +++ b/sys/dev/isp/isp_freebsd.h @@ -438,11 +438,19 @@ default: \ #define XS_SNSP(ccb) (&(ccb)->sense_data) #define XS_SNSLEN(ccb) \ - imin((sizeof((ccb)->sense_data)), ccb->sense_len) + imin((sizeof((ccb)->sense_data)), ccb->sense_len - ccb->sense_resid) -#define XS_SNSKEY(ccb) ((ccb)->sense_data.flags & 0xf) -#define XS_SNSASC(ccb) ((ccb)->sense_data.add_sense_code) -#define XS_SNSASCQ(ccb) ((ccb)->sense_data.add_sense_code_qual) +#define XS_SNSKEY(ccb) (scsi_get_sense_key(&(ccb)->sense_data, \ + ccb->sense_len - ccb->sense_resid, \ + /*show_errors*/ 1)) + +#define XS_SNSASC(ccb) (scsi_get_asc(&(ccb)->sense_data, \ + ccb->sense_len - ccb->sense_resid, \ + /*show_errors*/ 1)) + +#define XS_SNSASCQ(ccb) (scsi_get_ascq(&(ccb)->sense_data, \ + ccb->sense_len - ccb->sense_resid, \ + /*show_errors*/ 1)) #define XS_TAG_P(ccb) \ (((ccb)->ccb_h.flags & CAM_TAG_ACTION_VALID) && \ (ccb)->tag_action != CAM_TAG_ACTION_NONE) @@ -476,9 +484,13 @@ default: \ #define XS_INITERR(ccb) \ XS_SETERR(ccb, CAM_REQ_INPROG), (ccb)->ccb_h.spriv_field0 = 0 -#define XS_SAVE_SENSE(xs, sense_ptr, sense_len) \ - (xs)->ccb_h.status |= CAM_AUTOSNS_VALID; \ - memcpy(&(xs)->sense_data, sense_ptr, imin(XS_SNSLEN(xs), sense_len)) +#define XS_SAVE_SENSE(xs, sense_ptr, slen) do { \ + (xs)->ccb_h.status |= CAM_AUTOSNS_VALID; \ + memcpy(&(xs)->sense_data, sense_ptr, imin(XS_SNSLEN(xs),\ + slen)); \ + if (slen < (xs)->sense_len) \ + (xs)->sense_resid = (xs)->sense_len - slen; \ + } while (0); #define XS_SENSE_VALID(xs) (((xs)->ccb_h.status & CAM_AUTOSNS_VALID) != 0) diff --git a/sys/dev/mly/mly.c b/sys/dev/mly/mly.c index 90f2819..ee73ae9 100644 --- a/sys/dev/mly/mly.c +++ b/sys/dev/mly/mly.c @@ -1294,9 +1294,11 @@ mly_complete_event(struct mly_command *mc) static void mly_process_event(struct mly_softc *sc, struct mly_event *me) { - struct scsi_sense_data *ssd = (struct scsi_sense_data *)&me->sense[0]; - char *fp, *tp; - int bus, target, event, class, action; + struct scsi_sense_data_fixed *ssd; + char *fp, *tp; + int bus, target, event, class, action; + + ssd = (struct scsi_sense_data_fixed *)&me->sense[0]; /* * Errors can be reported using vendor-unique sense data. In this case, the diff --git a/sys/dev/mps/mps_sas.c b/sys/dev/mps/mps_sas.c index 2aa4773..fb4e224 100644 --- a/sys/dev/mps/mps_sas.c +++ b/sys/dev/mps/mps_sas.c @@ -1490,7 +1490,6 @@ mpssas_scsiio_complete(struct mps_softc *sc, struct mps_command *cm) MPI2_SCSI_IO_REPLY *rep; union ccb *ccb; struct mpssas_softc *sassc; - u_int sense_len; int dir = 0; mps_dprint(sc, MPS_TRACE, "%s\n", __func__); @@ -1666,10 +1665,16 @@ mpssas_scsiio_complete(struct mps_softc *sc, struct mps_command *cm) } if (rep->SCSIState & MPI2_SCSI_STATE_AUTOSENSE_VALID) { - sense_len = MIN(rep->SenseCount, - sizeof(struct scsi_sense_data)); - if (sense_len < rep->SenseCount) - ccb->csio.sense_resid = rep->SenseCount - sense_len; + int sense_len; + + if (rep->SenseCount < ccb->csio.sense_len) + ccb->csio.sense_resid = ccb->csio.sense_len - + rep->SenseCount; + else + ccb->csio.sense_resid = 0; + + sense_len = min(rep->SenseCount, ccb->csio.sense_len - + ccb->csio.sense_resid); bcopy(cm->cm_sense, &ccb->csio.sense_data, sense_len); ccb->ccb_h.status |= CAM_AUTOSNS_VALID; } diff --git a/sys/dev/mpt/mpt_cam.c b/sys/dev/mpt/mpt_cam.c index d512458..a3f740a 100644 --- a/sys/dev/mpt/mpt_cam.c +++ b/sys/dev/mpt/mpt_cam.c @@ -3167,12 +3167,19 @@ mpt_scsi_reply_frame_handler(struct mpt_softc *mpt, request_t *req, if ((sstate & MPI_SCSI_STATE_AUTOSENSE_VALID) != 0 && (ccb->ccb_h.flags & (CAM_SENSE_PHYS | CAM_SENSE_PTR)) == 0) { + uint32_t sense_returned; + ccb->ccb_h.status |= CAM_AUTOSNS_VALID; - ccb->csio.sense_resid = - ccb->csio.sense_len - le32toh(scsi_io_reply->SenseCount); + + sense_returned = le32toh(scsi_io_reply->SenseCount); + if (sense_returned < ccb->csio.sense_len) + ccb->csio.sense_resid = ccb->csio.sense_len - + sense_returned; + else + ccb->csio.sense_resid = 0; + bcopy(req->sense_vbuf, &ccb->csio.sense_data, - min(ccb->csio.sense_len, - le32toh(scsi_io_reply->SenseCount))); + min(ccb->csio.sense_len, sense_returned)); } if ((sstate & MPI_SCSI_STATE_QUEUE_TAG_REJECTED) != 0) { diff --git a/sys/dev/usb/storage/umass.c b/sys/dev/usb/storage/umass.c index 41e98d5..b932cfa 100644 --- a/sys/dev/usb/storage/umass.c +++ b/sys/dev/usb/storage/umass.c @@ -2344,14 +2344,14 @@ umass_cam_action(struct cam_sim *sim, union ccb *ccb) */ if ((sc->sc_quirks & (NO_INQUIRY_EVPD | NO_INQUIRY)) && (sc->sc_transfer.cmd_data[1] & SI_EVPD)) { - struct scsi_sense_data *sense; - - sense = &ccb->csio.sense_data; - bzero(sense, sizeof(*sense)); - sense->error_code = SSD_CURRENT_ERROR; - sense->flags = SSD_KEY_ILLEGAL_REQUEST; - sense->add_sense_code = 0x24; - sense->extra_len = 10; + + scsi_set_sense_data(&ccb->csio.sense_data, + /*sense_format*/ SSD_TYPE_NONE, + /*current_error*/ 1, + /*sense_key*/ SSD_KEY_ILLEGAL_REQUEST, + /*asc*/ 0x24, + /*ascq*/ 0x00, + /*extra args*/ SSD_ELEM_NONE); ccb->csio.scsi_status = SCSI_STATUS_CHECK_COND; ccb->ccb_h.status = CAM_SCSI_STATUS_ERROR | CAM_AUTOSNS_VALID; @@ -2631,12 +2631,17 @@ umass_cam_sense_cb(struct umass_softc *sc, union ccb *ccb, uint32_t residue, uint8_t status) { uint8_t *cmd; - uint8_t key; switch (status) { case STATUS_CMD_OK: case STATUS_CMD_UNKNOWN: - case STATUS_CMD_FAILED: + case STATUS_CMD_FAILED: { + int key, sense_len; + + ccb->csio.sense_resid = residue; + sense_len = ccb->csio.sense_len - ccb->csio.sense_resid; + key = scsi_get_sense_key(&ccb->csio.sense_data, sense_len, + /*show_errors*/ 1); if (ccb->csio.ccb_h.flags & CAM_CDB_POINTER) { cmd = (uint8_t *)(ccb->csio.cdb_io.cdb_ptr); @@ -2644,8 +2649,6 @@ umass_cam_sense_cb(struct umass_softc *sc, union ccb *ccb, uint32_t residue, cmd = (uint8_t *)(ccb->csio.cdb_io.cdb_bytes); } - key = (ccb->csio.sense_data.flags & SSD_KEY); - /* * Getting sense data always succeeds (apart from wire * failures): @@ -2704,7 +2707,7 @@ umass_cam_sense_cb(struct umass_softc *sc, union ccb *ccb, uint32_t residue, } xpt_done(ccb); break; - + } default: DPRINTF(sc, UDMASS_SCSI, "Autosense failed, " "status %d\n", status); |