Author: sephe
Date: Wed Apr  5 08:15:47 2017
New Revision: 316519
URL: https://svnweb.freebsd.org/changeset/base/316519

Log:
  hyperv/storvsc: Fixup SRB status.
  
  This unbreaks GEN2 Hyper-V cd support.
  
  Submitted by: Hongjiang Zhang <honzhan microsoft com>
  Reviewed by:  dexuan@
  MFC after:    3 days
  Sponsored by: Microsoft
  Differential Revision:        https://reviews.freebsd.org/D10212

Modified:
  head/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c
  head/sys/dev/hyperv/storvsc/hv_vstorage.h

Modified: head/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c
==============================================================================
--- head/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c        Wed Apr  5 
06:41:42 2017        (r316518)
+++ head/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c        Wed Apr  5 
08:15:47 2017        (r316519)
@@ -2148,19 +2148,20 @@ storvsc_io_done(struct hv_storvsc_reques
 
        ccb->ccb_h.status &= ~CAM_SIM_QUEUED;
        ccb->ccb_h.status &= ~CAM_STATUS_MASK;
+       int srb_status = SRB_STATUS(vm_srb->srb_status);
        if (vm_srb->scsi_status == SCSI_STATUS_OK) {
                const struct scsi_generic *cmd;
 
                cmd = (const struct scsi_generic *)
                    ((ccb->ccb_h.flags & CAM_CDB_POINTER) ?
                     csio->cdb_io.cdb_ptr : csio->cdb_io.cdb_bytes);
-               if (vm_srb->srb_status != SRB_STATUS_SUCCESS) {
+               if (srb_status != SRB_STATUS_SUCCESS) {
                        /*
                         * If there are errors, for example, invalid LUN,
                         * host will inform VM through SRB status.
                         */
                        if (bootverbose) {
-                               if (vm_srb->srb_status == 
SRB_STATUS_INVALID_LUN) {
+                               if (srb_status == SRB_STATUS_INVALID_LUN) {
                                        xpt_print(ccb->ccb_h.path,
                                            "invalid LUN %d for op: %s\n",
                                            vm_srb->lun,
@@ -2168,7 +2169,7 @@ storvsc_io_done(struct hv_storvsc_reques
                                } else {
                                        xpt_print(ccb->ccb_h.path,
                                            "Unknown SRB flag: %d for op: %s\n",
-                                           vm_srb->srb_status,
+                                           srb_status,
                                            scsi_op_desc(cmd->opcode, NULL));
                                }
                        }
@@ -2191,7 +2192,7 @@ storvsc_io_done(struct hv_storvsc_reques
                }
 
                if (cmd->opcode == INQUIRY &&
-                   vm_srb->srb_status == SRB_STATUS_SUCCESS) {
+                   srb_status == SRB_STATUS_SUCCESS) {
                        int resp_xfer_len, resp_buf_len, data_len;
                        uint8_t *resp_buf = (uint8_t *)csio->data_ptr;
                        struct scsi_inquiry_data *inq_data =

Modified: head/sys/dev/hyperv/storvsc/hv_vstorage.h
==============================================================================
--- head/sys/dev/hyperv/storvsc/hv_vstorage.h   Wed Apr  5 06:41:42 2017        
(r316518)
+++ head/sys/dev/hyperv/storvsc/hv_vstorage.h   Wed Apr  5 08:15:47 2017        
(r316519)
@@ -242,17 +242,16 @@ struct vstor_packet {
 #define SRB_STATUS_PENDING             0x00
 #define SRB_STATUS_SUCCESS             0x01
 #define SRB_STATUS_ABORTED             0x02
-#define SRB_STATUS_ABORT_FAILED        0x03
 #define SRB_STATUS_ERROR               0x04
-#define SRB_STATUS_BUSY                        0x05
-
+#define SRB_STATUS_INVALID_LUN          0x20
 /**
  * SRB Status Masks (can be combined with above status codes)
  */
 #define SRB_STATUS_QUEUE_FROZEN         0x40
 #define SRB_STATUS_AUTOSENSE_VALID      0x80
-#define SRB_STATUS_INVALID_LUN          0X20
 
+#define SRB_STATUS(status)     \
+       ((status) & ~(SRB_STATUS_AUTOSENSE_VALID | SRB_STATUS_QUEUE_FROZEN))
 /*
  * SRB Flag Bits
  */
_______________________________________________
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