diff --git a/sm5/scsicmds.c b/sm5/scsicmds.c
index 749d4bd4078a2e350f46cd9fb869495f16e78e21..77583b426498baf30b3ae4d6e62e12dc09aa3517 100644
--- a/sm5/scsicmds.c
+++ b/sm5/scsicmds.c
@@ -46,7 +46,7 @@
 #include "utility.h"
 #include "extern.h"
 
-const char *scsicmds_c_cvsid="$Id: scsicmds.c,v 1.61 2003/11/16 12:15:24 dpgilbert Exp $" EXTERN_H_CVSID SCSICMDS_H_CVSID;
+const char *scsicmds_c_cvsid="$Id: scsicmds.c,v 1.62 2003/11/17 11:48:47 dpgilbert Exp $" EXTERN_H_CVSID SCSICMDS_H_CVSID;
 
 /* for passing global control variables */
 extern smartmonctrl *con;
@@ -743,7 +743,7 @@ int scsiFetchIECmpage(int device, struct scsi_iec_mode_page *iecp, int modese_le
     iecp->modese_len = modese_len;
     iecp->requestedCurrent = 1;
     if (iecp->modese_len <= 6) {
-        if ((err = scsiModeSense(device, INFORMATIONAL_EXCEPTIONS_CONTROL, 
+        if ((err = scsiModeSense(device, INFORMATIONAL_EXCEPTIONS_CONTROL_PAGE, 
                                  MODE_PAGE_CONTROL_CURRENT, 
                                  iecp->raw_curr, sizeof(iecp->raw_curr)))) {
             if (0 == err)
@@ -757,7 +757,7 @@ int scsiFetchIECmpage(int device, struct scsi_iec_mode_page *iecp, int modese_le
         }
     }
     if (10 == iecp->modese_len) {
-        err = scsiModeSense10(device, INFORMATIONAL_EXCEPTIONS_CONTROL, 
+        err = scsiModeSense10(device, INFORMATIONAL_EXCEPTIONS_CONTROL_PAGE,
                               MODE_PAGE_CONTROL_CURRENT, 
                               iecp->raw_curr, sizeof(iecp->raw_curr));
         if (err) {
@@ -768,11 +768,11 @@ int scsiFetchIECmpage(int device, struct scsi_iec_mode_page *iecp, int modese_le
     iecp->gotCurrent = 1;
     iecp->requestedChangeable = 1;
     if (10 == iecp->modese_len)
-        err = scsiModeSense10(device, INFORMATIONAL_EXCEPTIONS_CONTROL,
+        err = scsiModeSense10(device, INFORMATIONAL_EXCEPTIONS_CONTROL_PAGE,
                                  MODE_PAGE_CONTROL_CHANGEABLE,
                                  iecp->raw_chg, sizeof(iecp->raw_chg));
     else if (6 == iecp->modese_len)
-        err = scsiModeSense(device, INFORMATIONAL_EXCEPTIONS_CONTROL, 
+        err = scsiModeSense(device, INFORMATIONAL_EXCEPTIONS_CONTROL_PAGE, 
                             MODE_PAGE_CONTROL_CHANGEABLE, 
                             iecp->raw_chg, sizeof(iecp->raw_chg));
     if (err)
@@ -1766,3 +1766,38 @@ int scsiFetchControlGLTSD(int device, int modese_len)
         return (buff[offset + 2] & 2) ? 1 : 0;
     return -EINVAL;
 }
+
+/* Returns a negative value if failed to fetch Protocol specific port mode 
+   page or it was malformed. Returns transport protocol identifier when
+   value >= 0 . */
+int scsiFetchTransportProtocol(int device, int modese_len)
+{
+    int err, offset;
+    UINT8 buff[64];
+
+    memset(buff, 0, sizeof(buff));
+    if (modese_len <= 6) {
+        if ((err = scsiModeSense(device, PROTOCOL_SPECIFIC_PORT_PAGE, 
+                                 MODE_PAGE_CONTROL_CURRENT, 
+                                 buff, sizeof(buff)))) {
+            if (0 == err)
+                modese_len = 6;
+            else if (SIMPLE_ERR_BAD_OPCODE == err)
+                modese_len = 10;
+            else
+                return -EINVAL;
+        }
+    }
+    if (10 == modese_len) {
+        err = scsiModeSense10(device, PROTOCOL_SPECIFIC_PORT_PAGE, 
+                              MODE_PAGE_CONTROL_CURRENT, 
+                              buff, sizeof(buff));
+        if (err)
+            return -EINVAL;
+    } 
+    offset = scsiModePageOffset(buff, sizeof(buff), modese_len);
+    if ((offset >= 0) && (buff[offset + 1] > 1))
+        return (buff[offset + 2] & 0xf);
+    return -EINVAL;
+}
+
diff --git a/sm5/scsicmds.cpp b/sm5/scsicmds.cpp
index a93a4124ad7de406b0c524c69d9746dc2cb33ad4..34e9325098fcd74d936af3d7bdd231bcdf072a86 100644
--- a/sm5/scsicmds.cpp
+++ b/sm5/scsicmds.cpp
@@ -46,7 +46,7 @@
 #include "utility.h"
 #include "extern.h"
 
-const char *scsicmds_c_cvsid="$Id: scsicmds.cpp,v 1.61 2003/11/16 12:15:24 dpgilbert Exp $" EXTERN_H_CVSID SCSICMDS_H_CVSID;
+const char *scsicmds_c_cvsid="$Id: scsicmds.cpp,v 1.62 2003/11/17 11:48:47 dpgilbert Exp $" EXTERN_H_CVSID SCSICMDS_H_CVSID;
 
 /* for passing global control variables */
 extern smartmonctrl *con;
@@ -743,7 +743,7 @@ int scsiFetchIECmpage(int device, struct scsi_iec_mode_page *iecp, int modese_le
     iecp->modese_len = modese_len;
     iecp->requestedCurrent = 1;
     if (iecp->modese_len <= 6) {
-        if ((err = scsiModeSense(device, INFORMATIONAL_EXCEPTIONS_CONTROL, 
+        if ((err = scsiModeSense(device, INFORMATIONAL_EXCEPTIONS_CONTROL_PAGE, 
                                  MODE_PAGE_CONTROL_CURRENT, 
                                  iecp->raw_curr, sizeof(iecp->raw_curr)))) {
             if (0 == err)
@@ -757,7 +757,7 @@ int scsiFetchIECmpage(int device, struct scsi_iec_mode_page *iecp, int modese_le
         }
     }
     if (10 == iecp->modese_len) {
-        err = scsiModeSense10(device, INFORMATIONAL_EXCEPTIONS_CONTROL, 
+        err = scsiModeSense10(device, INFORMATIONAL_EXCEPTIONS_CONTROL_PAGE,
                               MODE_PAGE_CONTROL_CURRENT, 
                               iecp->raw_curr, sizeof(iecp->raw_curr));
         if (err) {
@@ -768,11 +768,11 @@ int scsiFetchIECmpage(int device, struct scsi_iec_mode_page *iecp, int modese_le
     iecp->gotCurrent = 1;
     iecp->requestedChangeable = 1;
     if (10 == iecp->modese_len)
-        err = scsiModeSense10(device, INFORMATIONAL_EXCEPTIONS_CONTROL,
+        err = scsiModeSense10(device, INFORMATIONAL_EXCEPTIONS_CONTROL_PAGE,
                                  MODE_PAGE_CONTROL_CHANGEABLE,
                                  iecp->raw_chg, sizeof(iecp->raw_chg));
     else if (6 == iecp->modese_len)
-        err = scsiModeSense(device, INFORMATIONAL_EXCEPTIONS_CONTROL, 
+        err = scsiModeSense(device, INFORMATIONAL_EXCEPTIONS_CONTROL_PAGE, 
                             MODE_PAGE_CONTROL_CHANGEABLE, 
                             iecp->raw_chg, sizeof(iecp->raw_chg));
     if (err)
@@ -1766,3 +1766,38 @@ int scsiFetchControlGLTSD(int device, int modese_len)
         return (buff[offset + 2] & 2) ? 1 : 0;
     return -EINVAL;
 }
+
+/* Returns a negative value if failed to fetch Protocol specific port mode 
+   page or it was malformed. Returns transport protocol identifier when
+   value >= 0 . */
+int scsiFetchTransportProtocol(int device, int modese_len)
+{
+    int err, offset;
+    UINT8 buff[64];
+
+    memset(buff, 0, sizeof(buff));
+    if (modese_len <= 6) {
+        if ((err = scsiModeSense(device, PROTOCOL_SPECIFIC_PORT_PAGE, 
+                                 MODE_PAGE_CONTROL_CURRENT, 
+                                 buff, sizeof(buff)))) {
+            if (0 == err)
+                modese_len = 6;
+            else if (SIMPLE_ERR_BAD_OPCODE == err)
+                modese_len = 10;
+            else
+                return -EINVAL;
+        }
+    }
+    if (10 == modese_len) {
+        err = scsiModeSense10(device, PROTOCOL_SPECIFIC_PORT_PAGE, 
+                              MODE_PAGE_CONTROL_CURRENT, 
+                              buff, sizeof(buff));
+        if (err)
+            return -EINVAL;
+    } 
+    offset = scsiModePageOffset(buff, sizeof(buff), modese_len);
+    if ((offset >= 0) && (buff[offset + 1] > 1))
+        return (buff[offset + 2] & 0xf);
+    return -EINVAL;
+}
+