mirror of
https://github.com/SCST-project/scst.git
synced 2026-05-20 20:21:30 +00:00
From Erik Habbinga:
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: http://svn.code.sf.net/p/scst/svn/trunk@68 d57e44dd-8a1f-0410-8b47-8ef2f437770f
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user