]> xenbits.xensource.com Git - people/liuw/freebsd.git/commitdiff
Add partial support for QUERY TMF to CAM and isp(4).
authormav <mav@FreeBSD.org>
Fri, 23 Oct 2015 18:34:18 +0000 (18:34 +0000)
committermav <mav@FreeBSD.org>
Fri, 23 Oct 2015 18:34:18 +0000 (18:34 +0000)
This change allows to decode respective functions in isp(4) in target mode
and pass them through CAM to CTL.  Unfortunately neither CAM nor isp(4)
support returning response info for those task management functions now.

On the other side I just have no initiator to test this functionality.

sys/cam/ctl/scsi_ctl.c
sys/cam/scsi/scsi_message.h
sys/dev/isp/isp_freebsd.c
sys/dev/isp/isp_stds.h
sys/dev/isp/isp_target.c
sys/dev/isp/isp_target.h

index 27c5ad7e71c5b6cf5910208e7378350f9324659e..85a341e4d8955fc954ee35a262913b80fdaf1673 100644 (file)
@@ -1459,24 +1459,31 @@ ctlfedone(struct cam_periph *periph, union ccb *done_ccb)
                                    CTL_TASK_ABORT_TASK_SET;
                                break;
                        case MSG_TARGET_RESET:
-                               io->taskio.task_action =
-                                       CTL_TASK_TARGET_RESET;
+                               io->taskio.task_action = CTL_TASK_TARGET_RESET;
                                break;
                        case MSG_ABORT_TASK:
-                               io->taskio.task_action =
-                                       CTL_TASK_ABORT_TASK;
+                               io->taskio.task_action = CTL_TASK_ABORT_TASK;
                                break;
                        case MSG_LOGICAL_UNIT_RESET:
-                               io->taskio.task_action =
-                                       CTL_TASK_LUN_RESET;
+                               io->taskio.task_action = CTL_TASK_LUN_RESET;
                                break;
                        case MSG_CLEAR_TASK_SET:
                                io->taskio.task_action =
-                                       CTL_TASK_CLEAR_TASK_SET;
+                                   CTL_TASK_CLEAR_TASK_SET;
                                break;
                        case MSG_CLEAR_ACA:
+                               io->taskio.task_action = CTL_TASK_CLEAR_ACA;
+                               break;
+                       case MSG_QUERY_TASK:
+                               io->taskio.task_action = CTL_TASK_QUERY_TASK;
+                               break;
+                       case MSG_QUERY_TASK_SET:
+                               io->taskio.task_action =
+                                   CTL_TASK_QUERY_TASK_SET;
+                               break;
+                       case MSG_QUERY_ASYNC_EVENT:
                                io->taskio.task_action =
-                                       CTL_TASK_CLEAR_ACA;
+                                   CTL_TASK_QUERY_ASYNC_EVENT;
                                break;
                        case MSG_NOOP:
                                send_ctl_io = 0;
index 53b7640ade4de5c41d0722949b6930619f0eaecd..ddac571e6b43a93f3403bcf203fe770cbfb8fd59 100644 (file)
@@ -68,3 +68,9 @@
 #define        MSG_EXT_PPR_QAS_REQ     0x04
 #define        MSG_EXT_PPR_DT_REQ      0x02
 #define        MSG_EXT_PPR_IU_REQ      0x01
+
+/* Fake messages not defined for SPI, but needed for other transports */
+#define        MSG_QUERY_TASK          0x100
+#define        MSG_QUERY_TASK_SET      0x101
+#define        MSG_QUERY_ASYNC_EVENT   0x102
+
index c46762e8d08885026395e7e7810800d0c8380849..94e505587513a552a84d6860b3e1425b35f39841 100644 (file)
@@ -3484,6 +3484,12 @@ isp_handle_platform_target_tmf(ispsoftc_t *isp, isp_notify_t *notify)
        case NT_TARGET_RESET:
                inot->arg = MSG_TARGET_RESET;
                break;
+       case NT_QUERY_TASK_SET:
+               inot->arg = MSG_QUERY_TASK_SET;
+               break;
+       case NT_QUERY_ASYNC_EVENT:
+               inot->arg = MSG_QUERY_ASYNC_EVENT;
+               break;
        default:
                isp_prt(isp, ISP_LOGWARN, "%s: unknown TMF code 0x%x for chan %d lun %#jx", __func__, notify->nt_ncode, notify->nt_channel, (uintmax_t)lun);
                goto bad;
@@ -5877,6 +5883,8 @@ changed:
                case NT_CLEAR_TASK_SET:
                case NT_LUN_RESET:
                case NT_TARGET_RESET:
+               case NT_QUERY_TASK_SET:
+               case NT_QUERY_ASYNC_EVENT:
                        /*
                         * These are task management functions.
                         */
index e53f0058323d674a6f5d581660383c60c18bee48..daa199cef5d41ff42d4e153cb970270bcf3b29ad 100644 (file)
@@ -97,8 +97,10 @@ typedef struct {
 #define        FCP_CMND_TMF_CLEAR_ACA          0x40
 #define        FCP_CMND_TMF_TGT_RESET          0x20
 #define        FCP_CMND_TMF_LUN_RESET          0x10
+#define        FCP_CMND_TMF_QUERY_ASYNC_EVENT  0x08
 #define        FCP_CMND_TMF_CLEAR_TASK_SET     0x04
 #define        FCP_CMND_TMF_ABORT_TASK_SET     0x02
+#define        FCP_CMND_TMF_QUERY_TASK_SET     0x01
 
 /*
  * Basic CT IU Header
index b011997ad35be4912117f6d672a36375e0dd2de5..629bac8737af31c1d2a0b37492cfc3e847409911 100644 (file)
@@ -1024,12 +1024,18 @@ isp_got_tmf_24xx(ispsoftc_t *isp, at7_entry_t *aep)
        notify.nt_sid = sid;
        notify.nt_did = did;
        notify.nt_channel = chan;
-       if (aep->at_cmnd.fcp_cmnd_task_management & FCP_CMND_TMF_ABORT_TASK_SET) {
+       if (aep->at_cmnd.fcp_cmnd_task_management & FCP_CMND_TMF_QUERY_TASK_SET) {
+               isp_prt(isp, ISP_LOGINFO, f1, "QUERY TASK SET", sid, notify.nt_lun, aep->at_rxid);
+               notify.nt_ncode = NT_QUERY_TASK_SET;
+       } else if (aep->at_cmnd.fcp_cmnd_task_management & FCP_CMND_TMF_ABORT_TASK_SET) {
                isp_prt(isp, ISP_LOGINFO, f1, "ABORT TASK SET", sid, notify.nt_lun, aep->at_rxid);
                notify.nt_ncode = NT_ABORT_TASK_SET;
        } else if (aep->at_cmnd.fcp_cmnd_task_management & FCP_CMND_TMF_CLEAR_TASK_SET) {
                isp_prt(isp, ISP_LOGINFO, f1, "CLEAR TASK SET", sid, notify.nt_lun, aep->at_rxid);
                notify.nt_ncode = NT_CLEAR_TASK_SET;
+       } else if (aep->at_cmnd.fcp_cmnd_task_management & FCP_CMND_TMF_QUERY_ASYNC_EVENT) {
+               isp_prt(isp, ISP_LOGINFO, f1, "QUERY ASYNC EVENT", sid, notify.nt_lun, aep->at_rxid);
+               notify.nt_ncode = NT_QUERY_ASYNC_EVENT;
        } else if (aep->at_cmnd.fcp_cmnd_task_management & FCP_CMND_TMF_LUN_RESET) {
                isp_prt(isp, ISP_LOGINFO, f1, "LUN RESET", sid, notify.nt_lun, aep->at_rxid);
                notify.nt_ncode = NT_LUN_RESET;
index 8922a337e5d1aed2345f080f679d52a84fa72848..a75d73b86a7eefffd4b995d8245fdcccb28c98b8 100644 (file)
@@ -51,7 +51,9 @@ typedef enum {
        NT_LOGOUT,
        NT_GLOBAL_LOGOUT,
        NT_CHANGED,
-       NT_HBA_RESET
+       NT_HBA_RESET,
+       NT_QUERY_TASK_SET,
+       NT_QUERY_ASYNC_EVENT
 } isp_ncode_t;
 
 typedef struct isp_notify {