From Erik Habbinga:
authorvlnb <vlnb@d57e44dd-8a1f-0410-8b47-8ef2f437770f>
Wed, 20 Dec 2006 17:53:41 +0000 (17:53 +0000)
committervlnb <vlnb@d57e44dd-8a1f-0410-8b47-8ef2f437770f>
Wed, 20 Dec 2006 17:53:41 +0000 (17:53 +0000)
This patch allows reading and writing of the LSI SCSI target id via /proc/scsi_tgt/mpt_scst/x (where x is the controller number). Reading that file dumps various statistics as before:

# cat /proc/scsi_tgt/mpt_scst/0
ProductID        :0x020b (LSI53C1030)
Target Enable    :True
Target ID        :3
Capabilities     :0x7087fa0
PhysicalInterface:0x30000fe
Configuration    :0x3000800
OnBusTimerValue  :0x0
TargetConfig     :0x1
IDConfig         :0x0
PortFlags        :0x2000000
PortSettings     :0x37020000
  Device 00: 0x7087fa0, 0x0
  Device 01: 0x7087fa0, 0x0
  Device 02: 0x7087fa0, 0x0
  Device 03: 0x7087fa0, 0x0
  Device 04: 0x7087fa0, 0x0
  Device 05: 0x7087fa0, 0x0
  Device 06: 0x7087fa0, 0x0
  Device 07: 0x7087fa0, 0x0
  Device 08: 0x7087fa0, 0x0
  Device 09: 0x7087fa0, 0x0
  Device 10: 0x7087fa0, 0x0
  Device 11: 0x7087fa0, 0x0
  Device 12: 0x7087fa0, 0x0
  Device 13: 0x7087fa0, 0x0
  Device 14: 0x7087fa0, 0x0
  Device 15: 0x7087fa0, 0x0

Writing "target_id:n" will change the SCSI target id to n.

# echo "target_id:5" > /proc/scsi_tgt/mpt_scst/0
# cat /proc/scsi_tgt/mpt_scst/0
ProductID        :0x020b (LSI53C1030)
Target Enable    :True
Target ID        :5
Capabilities     :0x7087fa0
....

git-svn-id: https://scst.svn.sourceforge.net/svnroot/scst/trunk@68 d57e44dd-8a1f-0410-8b47-8ef2f437770f

mpt/mpt_scst.c
mpt/mpt_scst.h

index 0e20664..ba2839a 100644 (file)
@@ -121,6 +121,7 @@ static int stm_wait_for(MPT_STM_PRIV *priv, volatile int *flag, int seconds,
             int sleep);
 static void stmapp_srr_process(MPT_STM_PRIV *priv, int rx_id, int r_ctl, 
                u32 offset, LinkServiceBufferPostReply_t *rep, int index);
+static void stm_set_scsi_port_page1(MPT_STM_PRIV *priv, int sleep);
 
 #ifdef DEBUG
 #define trace_flag mpt_trace_flag
@@ -156,7 +157,7 @@ mpt_target_show(struct seq_file *seq, void *v)
                seq_printf(seq, "Target ID        :%d\n"
                                "Capabilities     :0x%x\n"
                                "PhysicalInterface:0x%x\n",
-                               tgt->target_id,
+                               priv->port_id,
                                priv->SCSIPortPage0.Capabilities,
                                priv->SCSIPortPage0.PhysicalInterface);
 
@@ -236,12 +237,19 @@ mpt_proc_target_write(struct file *file, const char __user *buf,
                }
        }
 
-#ifdef DEBUG   
        if (strncmp("target_id:", tmp, strlen("target_id:")) == 0) {
                char *s = tmp + strlen("target_id:");
-               TRACE_DBG("target id is '%s'", s);
+               int id = simple_strtoul(s, NULL, 0);
+               if (id < MPT_MAX_SCSI_DEVICES) {
+                       if (IsScsi(tgt->priv)) {
+                               TRACE_DBG("Changing target id to %d\n", 
+                                               id);
+                               tgt->priv->port_id = id;
+                               stm_set_scsi_port_page1(tgt->priv, 
+                                               NO_SLEEP);
+                       }
+               }
        }
-#endif
 
 out:
        TRACE_EXIT_RES(res);
@@ -353,8 +361,12 @@ mptstm_probe(struct pci_dev *pdev, const struct pci_device_id *id)
     }
     memset(tgt, 0, sizeof(*tgt));
     tgt->priv = mpt_stm_priv[ioc->id];
-       tgt->target_enable = 0;
-       tgt->target_id = 0;
+    tgt->target_enable = 0;
+    tgt->priv->port_id = 1;
+    /* tgt->priv->scsi_port_config = MPI_SCSIPORTPAGE1_TARGCONFIG_INIT_TARG; */
+    tgt->priv->scsi_port_config = MPI_SCSIPORTPAGE1_TARGCONFIG_TARG_ONLY;
+    /* tgt->priv->scsi_id_config = 0x7; */
+    tgt->priv->scsi_id_config = 0;
     atomic_set(&tgt->sess_count, 0);
     init_waitqueue_head(&tgt->waitQ);
     
@@ -3502,9 +3514,7 @@ stm_scsi_configuration(MPT_STM_PRIV *priv,
     MPT_ADAPTER                *ioc = priv->ioc;
 #endif
     SCSIPortPage0_t    *ScsiPort0;
-    SCSIPortPage1_t    *ScsiPort1;
     SCSIPortPage2_t    *ScsiPort2;
-    int                        id;
     int                        cap;
     int                        wcap;
     int                        ncap;
@@ -3520,36 +3530,20 @@ stm_scsi_configuration(MPT_STM_PRIV *priv,
     ScsiPort2 = &priv->SCSIPortPage2;
        memcpy(&priv->SCSIPortPage2, priv->hw->config_buf, sizeof(SCSIPortPage2_t));
 
-    id = 0;//le32_to_cpu(ScsiPort2->PortSettings) & MPI_SCSIPORTPAGE2_PORT_HOST_ID_MASK;
-    TRACE_DBG("%s scsi id is %d", ioc->name, id);
-    priv->port_id = id;
+    TRACE_DBG("%s scsi id is %d", ioc->name, priv->port_id);
 
     memset(priv->hw->config_buf, 0, sizeof(priv->hw->config_buf));
     if (stm_get_config_page(priv, MPI_CONFIG_PAGETYPE_SCSI_PORT, 0, 0, sleep)) {
        return (-1);
     }
-       memcpy(&priv->SCSIPortPage0, priv->hw->config_buf, sizeof(SCSIPortPage0_t));
+    memcpy(&priv->SCSIPortPage0, priv->hw->config_buf, sizeof(SCSIPortPage0_t));
     ScsiPort0 = &priv->SCSIPortPage0;
 
     cap = le32_to_cpu(ScsiPort0->Capabilities);
     TRACE_DBG("%s target %d capabilities = %08x",
-          ioc->name, id, cap);
+          ioc->name, priv->port_id, cap);
 
-    memset(priv->hw->config_buf, 0, sizeof(priv->hw->config_buf));
-    memset(&priv->SCSIPortPage1, 0, sizeof(priv->SCSIPortPage1));
-    ScsiPort1 = &priv->SCSIPortPage1;
-    ScsiPort1->Configuration = cpu_to_le32(id | (1 << (id + 16)));
-    for (i = 1; i <= priv->num_aliases; i++) {
-       id = (priv->port_id + i) & 15;
-       TRACE_DBG("%s alias %d is target %d",
-              ioc->name, i, id);
-       ScsiPort1->Configuration |= cpu_to_le32(1 << (id + 16));
-    }
-//  ScsiPort1->TargetConfig = MPI_SCSIPORTPAGE1_TARGCONFIG_INIT_TARG;
-    ScsiPort1->TargetConfig = MPI_SCSIPORTPAGE1_TARGCONFIG_TARG_ONLY;
-//     ScsiPort1->IDConfig = 0x7;
-       memcpy(priv->hw->config_buf, (u32 *)ScsiPort1, sizeof(*ScsiPort1));
-    stm_set_config_page(priv, MPI_CONFIG_PAGETYPE_SCSI_PORT, 1, 0, sleep);
+    stm_set_scsi_port_page1(priv, sleep);
 
     wcap = cap & ~MPI_SCSIPORTPAGE0_CAP_MIN_SYNC_PERIOD_MASK;
     ncap = wcap & ~MPI_SCSIPORTPAGE0_CAP_WIDE;
@@ -3584,6 +3578,37 @@ stm_scsi_configuration(MPT_STM_PRIV *priv,
     return (0);
 }
 
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+static void 
+stm_set_scsi_port_page1(MPT_STM_PRIV *priv, int sleep)
+{
+#ifdef TRACING
+       MPT_ADAPTER             *ioc = priv->ioc;
+#endif
+       SCSIPortPage1_t *ScsiPort1;
+       int i;
+       int id = priv->port_id;
+
+       TRACE_ENTRY();
+
+       memset(priv->hw->config_buf, 0, sizeof(priv->hw->config_buf));
+       memset(&priv->SCSIPortPage1, 0, sizeof(priv->SCSIPortPage1));
+       ScsiPort1 = &priv->SCSIPortPage1;
+       ScsiPort1->Configuration = cpu_to_le32(id | (1 << (id + 16)));
+       for (i = 1; i <= priv->num_aliases; i++) {
+               id = (priv->port_id + i) & 15;
+               TRACE_DBG("%s alias %d is target %d",
+                               ioc->name, i, id);
+               ScsiPort1->Configuration |= cpu_to_le32(1 << (id + 16));
+       }
+       ScsiPort1->TargetConfig = priv->scsi_port_config;
+       ScsiPort1->IDConfig = priv->scsi_id_config;
+       memcpy(priv->hw->config_buf, (u32 *)ScsiPort1, sizeof(*ScsiPort1));
+       stm_set_config_page(priv, MPI_CONFIG_PAGETYPE_SCSI_PORT, 1, 0, sleep);
+
+       TRACE_EXIT();
+}
+
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 static int
 stm_sas_configuration(MPT_STM_PRIV *priv,
index 830d555..b0dd43f 100644 (file)
@@ -179,6 +179,8 @@ typedef struct _MPT_STM_PRIV
     U64                        wwnn;
     U64                        wwpn;
     int                        port_id;
+    int                        scsi_port_config;
+    int                        scsi_id_config;
     int                        protocol;
     volatile int       port_flags;
     volatile int       port_speed;
@@ -354,7 +356,6 @@ struct mpt_tgt
        wait_queue_head_t waitQ;
        struct mpt_sess *sess[256];
        int target_enable;
-       int target_id;
 };
 
 struct mpt_mgmt_cmd