Author: mav
Date: Mon Nov  7 18:21:53 2016
New Revision: 308425
URL: https://svnweb.freebsd.org/changeset/base/308425

Log:
  Add support for EIIOE flag in Additional Element Status.
  
  It was added in SES-3 spec, and its support required to properly link
  the Additional Element Status page data to the original elements.
  
  MFC after:    2 weeks
  Sponsored by: iXsystems, Inc.

Modified:
  head/sys/cam/scsi/scsi_enc_ses.c
  head/sys/cam/scsi/scsi_ses.h

Modified: head/sys/cam/scsi/scsi_enc_ses.c
==============================================================================
--- head/sys/cam/scsi/scsi_enc_ses.c    Mon Nov  7 17:38:39 2016        
(r308424)
+++ head/sys/cam/scsi/scsi_enc_ses.c    Mon Nov  7 18:21:53 2016        
(r308425)
@@ -1758,14 +1758,20 @@ ses_process_elm_addlstatus(enc_softc_t *
                eip = ses_elm_addlstatus_eip(elm_hdr);
                if (eip && !ignore_index) {
                        struct ses_elm_addlstatus_eip_hdr *eip_hdr;
-                       int expected_index;
+                       int expected_index, index;
+                       ses_elem_index_type_t index_type;
 
                        eip_hdr = (struct ses_elm_addlstatus_eip_hdr *)elm_hdr;
-                       expected_index = iter.individual_element_index;
+                       if (eip_hdr->byte2 & SES_ADDL_EIP_EIIOE) {
+                               index_type = SES_ELEM_INDEX_GLOBAL;
+                               expected_index = iter.global_element_index;
+                       } else {
+                               index_type = SES_ELEM_INDEX_INDIVIDUAL;
+                               expected_index = iter.individual_element_index;
+                       }
                        titer = iter;
                        telement = ses_iter_seek_to(&titer,
-                                                  eip_hdr->element_index,
-                                                  SES_ELEM_INDEX_INDIVIDUAL);
+                           eip_hdr->element_index, index_type);
                        if (telement != NULL &&
                            (ses_typehasaddlstatus(enc, titer.type_index) !=
                             TYPE_ADDLSTATUS_NONE ||
@@ -1775,13 +1781,18 @@ ses_process_elm_addlstatus(enc_softc_t *
                        } else
                                ignore_index = 1;
 
-                       if (iter.individual_element_index > expected_index
+                       if (eip_hdr->byte2 & SES_ADDL_EIP_EIIOE)
+                               index = iter.global_element_index;
+                       else
+                               index = iter.individual_element_index;
+                       if (index > expected_index
                         && status_type == TYPE_ADDLSTATUS_MANDATORY) {
-                               ENC_VLOG(enc, "%s: provided element "
+                               ENC_VLOG(enc, "%s: provided %s element"
                                        "index %d skips mandatory status "
                                        " element at index %d\n",
-                                       __func__, eip_hdr->element_index,
-                                       expected_index);
+                                       __func__, (eip_hdr->byte2 &
+                                       SES_ADDL_EIP_EIIOE) ? "global " : "",
+                                       index, expected_index);
                        }
                }
                elmpriv = element->elm_private;

Modified: head/sys/cam/scsi/scsi_ses.h
==============================================================================
--- head/sys/cam/scsi/scsi_ses.h        Mon Nov  7 17:38:39 2016        
(r308424)
+++ head/sys/cam/scsi/scsi_ses.h        Mon Nov  7 18:21:53 2016        
(r308425)
@@ -2413,7 +2413,8 @@ int ses_elm_addlstatus_invalid(struct se
 
 struct ses_elm_addlstatus_eip_hdr {
        struct ses_elm_addlstatus_base_hdr base;
-       uint8_t reserved;
+       uint8_t byte2;
+#define        SES_ADDL_EIP_EIIOE      1
        uint8_t element_index;
        /* NB: This define (currently) applies to all eip=1 headers */
 #define        SES_EIP_HDR_EXTRA_LEN   2
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to