ips: switch to ->show_info()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
@@ -326,10 +326,9 @@ static void ips_scmd_buf_write(struct scsi_cmnd * scmd, void *data,
|
|||||||
static void ips_scmd_buf_read(struct scsi_cmnd * scmd, void *data,
|
static void ips_scmd_buf_read(struct scsi_cmnd * scmd, void *data,
|
||||||
unsigned int count);
|
unsigned int count);
|
||||||
|
|
||||||
static int ips_proc_info(struct Scsi_Host *, char *, char **, off_t, int, int);
|
static int ips_write_info(struct Scsi_Host *, char *, int);
|
||||||
static int ips_host_info(ips_ha_t *, char *, off_t, int);
|
static int ips_show_info(struct seq_file *, struct Scsi_Host *);
|
||||||
static void copy_mem_info(IPS_INFOSTR *, char *, int);
|
static int ips_host_info(ips_ha_t *, struct seq_file *);
|
||||||
static int copy_info(IPS_INFOSTR *, char *, ...);
|
|
||||||
static int ips_abort_init(ips_ha_t * ha, int index);
|
static int ips_abort_init(ips_ha_t * ha, int index);
|
||||||
static int ips_init_phase2(int index);
|
static int ips_init_phase2(int index);
|
||||||
|
|
||||||
@@ -367,7 +366,8 @@ static struct scsi_host_template ips_driver_template = {
|
|||||||
.eh_abort_handler = ips_eh_abort,
|
.eh_abort_handler = ips_eh_abort,
|
||||||
.eh_host_reset_handler = ips_eh_reset,
|
.eh_host_reset_handler = ips_eh_reset,
|
||||||
.proc_name = "ips",
|
.proc_name = "ips",
|
||||||
.proc_info = ips_proc_info,
|
.show_info = ips_show_info,
|
||||||
|
.write_info = ips_write_info,
|
||||||
.slave_configure = ips_slave_configure,
|
.slave_configure = ips_slave_configure,
|
||||||
.bios_param = ips_biosparam,
|
.bios_param = ips_biosparam,
|
||||||
.this_id = -1,
|
.this_id = -1,
|
||||||
@@ -1433,25 +1433,12 @@ ips_info(struct Scsi_Host *SH)
|
|||||||
return (bp);
|
return (bp);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* */
|
|
||||||
/* Routine Name: ips_proc_info */
|
|
||||||
/* */
|
|
||||||
/* Routine Description: */
|
|
||||||
/* */
|
|
||||||
/* The passthru interface for the driver */
|
|
||||||
/* */
|
|
||||||
/****************************************************************************/
|
|
||||||
static int
|
static int
|
||||||
ips_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset,
|
ips_write_info(struct Scsi_Host *host, char *buffer, int length)
|
||||||
int length, int func)
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int ret;
|
|
||||||
ips_ha_t *ha = NULL;
|
ips_ha_t *ha = NULL;
|
||||||
|
|
||||||
METHOD_TRACE("ips_proc_info", 1);
|
|
||||||
|
|
||||||
/* Find our host structure */
|
/* Find our host structure */
|
||||||
for (i = 0; i < ips_next_controller; i++) {
|
for (i = 0; i < ips_next_controller; i++) {
|
||||||
if (ips_sh[i]) {
|
if (ips_sh[i]) {
|
||||||
@@ -1465,18 +1452,29 @@ ips_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset,
|
|||||||
if (!ha)
|
if (!ha)
|
||||||
return (-EINVAL);
|
return (-EINVAL);
|
||||||
|
|
||||||
if (func) {
|
return 0;
|
||||||
/* write */
|
}
|
||||||
return (0);
|
|
||||||
} else {
|
|
||||||
/* read */
|
|
||||||
if (start)
|
|
||||||
*start = buffer;
|
|
||||||
|
|
||||||
ret = ips_host_info(ha, buffer, offset, length);
|
static int
|
||||||
|
ips_show_info(struct seq_file *m, struct Scsi_Host *host)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
ips_ha_t *ha = NULL;
|
||||||
|
|
||||||
return (ret);
|
/* Find our host structure */
|
||||||
|
for (i = 0; i < ips_next_controller; i++) {
|
||||||
|
if (ips_sh[i]) {
|
||||||
|
if (ips_sh[i] == host) {
|
||||||
|
ha = (ips_ha_t *) ips_sh[i]->hostdata;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!ha)
|
||||||
|
return (-EINVAL);
|
||||||
|
|
||||||
|
return ips_host_info(ha, m);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------------*/
|
||||||
@@ -2035,183 +2033,113 @@ ips_cleanup_passthru(ips_ha_t * ha, ips_scb_t * scb)
|
|||||||
/* */
|
/* */
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
static int
|
static int
|
||||||
ips_host_info(ips_ha_t * ha, char *ptr, off_t offset, int len)
|
ips_host_info(ips_ha_t *ha, struct seq_file *m)
|
||||||
{
|
{
|
||||||
IPS_INFOSTR info;
|
|
||||||
|
|
||||||
METHOD_TRACE("ips_host_info", 1);
|
METHOD_TRACE("ips_host_info", 1);
|
||||||
|
|
||||||
info.buffer = ptr;
|
seq_printf(m, "\nIBM ServeRAID General Information:\n\n");
|
||||||
info.length = len;
|
|
||||||
info.offset = offset;
|
|
||||||
info.pos = 0;
|
|
||||||
info.localpos = 0;
|
|
||||||
|
|
||||||
copy_info(&info, "\nIBM ServeRAID General Information:\n\n");
|
|
||||||
|
|
||||||
if ((le32_to_cpu(ha->nvram->signature) == IPS_NVRAM_P5_SIG) &&
|
if ((le32_to_cpu(ha->nvram->signature) == IPS_NVRAM_P5_SIG) &&
|
||||||
(le16_to_cpu(ha->nvram->adapter_type) != 0))
|
(le16_to_cpu(ha->nvram->adapter_type) != 0))
|
||||||
copy_info(&info, "\tController Type : %s\n",
|
seq_printf(m, "\tController Type : %s\n",
|
||||||
ips_adapter_name[ha->ad_type - 1]);
|
ips_adapter_name[ha->ad_type - 1]);
|
||||||
else
|
else
|
||||||
copy_info(&info,
|
seq_printf(m,
|
||||||
"\tController Type : Unknown\n");
|
"\tController Type : Unknown\n");
|
||||||
|
|
||||||
if (ha->io_addr)
|
if (ha->io_addr)
|
||||||
copy_info(&info,
|
seq_printf(m,
|
||||||
"\tIO region : 0x%lx (%d bytes)\n",
|
"\tIO region : 0x%lx (%d bytes)\n",
|
||||||
ha->io_addr, ha->io_len);
|
ha->io_addr, ha->io_len);
|
||||||
|
|
||||||
if (ha->mem_addr) {
|
if (ha->mem_addr) {
|
||||||
copy_info(&info,
|
seq_printf(m,
|
||||||
"\tMemory region : 0x%lx (%d bytes)\n",
|
"\tMemory region : 0x%lx (%d bytes)\n",
|
||||||
ha->mem_addr, ha->mem_len);
|
ha->mem_addr, ha->mem_len);
|
||||||
copy_info(&info,
|
seq_printf(m,
|
||||||
"\tShared memory address : 0x%lx\n",
|
"\tShared memory address : 0x%lx\n",
|
||||||
ha->mem_ptr);
|
ha->mem_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
copy_info(&info, "\tIRQ number : %d\n", ha->pcidev->irq);
|
seq_printf(m, "\tIRQ number : %d\n", ha->pcidev->irq);
|
||||||
|
|
||||||
/* For the Next 3 lines Check for Binary 0 at the end and don't include it if it's there. */
|
/* For the Next 3 lines Check for Binary 0 at the end and don't include it if it's there. */
|
||||||
/* That keeps everything happy for "text" operations on the proc file. */
|
/* That keeps everything happy for "text" operations on the proc file. */
|
||||||
|
|
||||||
if (le32_to_cpu(ha->nvram->signature) == IPS_NVRAM_P5_SIG) {
|
if (le32_to_cpu(ha->nvram->signature) == IPS_NVRAM_P5_SIG) {
|
||||||
if (ha->nvram->bios_low[3] == 0) {
|
if (ha->nvram->bios_low[3] == 0) {
|
||||||
copy_info(&info,
|
seq_printf(m,
|
||||||
"\tBIOS Version : %c%c%c%c%c%c%c\n",
|
"\tBIOS Version : %c%c%c%c%c%c%c\n",
|
||||||
ha->nvram->bios_high[0], ha->nvram->bios_high[1],
|
ha->nvram->bios_high[0], ha->nvram->bios_high[1],
|
||||||
ha->nvram->bios_high[2], ha->nvram->bios_high[3],
|
ha->nvram->bios_high[2], ha->nvram->bios_high[3],
|
||||||
ha->nvram->bios_low[0], ha->nvram->bios_low[1],
|
ha->nvram->bios_low[0], ha->nvram->bios_low[1],
|
||||||
ha->nvram->bios_low[2]);
|
ha->nvram->bios_low[2]);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
copy_info(&info,
|
seq_printf(m,
|
||||||
"\tBIOS Version : %c%c%c%c%c%c%c%c\n",
|
"\tBIOS Version : %c%c%c%c%c%c%c%c\n",
|
||||||
ha->nvram->bios_high[0], ha->nvram->bios_high[1],
|
ha->nvram->bios_high[0], ha->nvram->bios_high[1],
|
||||||
ha->nvram->bios_high[2], ha->nvram->bios_high[3],
|
ha->nvram->bios_high[2], ha->nvram->bios_high[3],
|
||||||
ha->nvram->bios_low[0], ha->nvram->bios_low[1],
|
ha->nvram->bios_low[0], ha->nvram->bios_low[1],
|
||||||
ha->nvram->bios_low[2], ha->nvram->bios_low[3]);
|
ha->nvram->bios_low[2], ha->nvram->bios_low[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ha->enq->CodeBlkVersion[7] == 0) {
|
if (ha->enq->CodeBlkVersion[7] == 0) {
|
||||||
copy_info(&info,
|
seq_printf(m,
|
||||||
"\tFirmware Version : %c%c%c%c%c%c%c\n",
|
"\tFirmware Version : %c%c%c%c%c%c%c\n",
|
||||||
ha->enq->CodeBlkVersion[0], ha->enq->CodeBlkVersion[1],
|
ha->enq->CodeBlkVersion[0], ha->enq->CodeBlkVersion[1],
|
||||||
ha->enq->CodeBlkVersion[2], ha->enq->CodeBlkVersion[3],
|
ha->enq->CodeBlkVersion[2], ha->enq->CodeBlkVersion[3],
|
||||||
ha->enq->CodeBlkVersion[4], ha->enq->CodeBlkVersion[5],
|
ha->enq->CodeBlkVersion[4], ha->enq->CodeBlkVersion[5],
|
||||||
ha->enq->CodeBlkVersion[6]);
|
ha->enq->CodeBlkVersion[6]);
|
||||||
} else {
|
} else {
|
||||||
copy_info(&info,
|
seq_printf(m,
|
||||||
"\tFirmware Version : %c%c%c%c%c%c%c%c\n",
|
"\tFirmware Version : %c%c%c%c%c%c%c%c\n",
|
||||||
ha->enq->CodeBlkVersion[0], ha->enq->CodeBlkVersion[1],
|
ha->enq->CodeBlkVersion[0], ha->enq->CodeBlkVersion[1],
|
||||||
ha->enq->CodeBlkVersion[2], ha->enq->CodeBlkVersion[3],
|
ha->enq->CodeBlkVersion[2], ha->enq->CodeBlkVersion[3],
|
||||||
ha->enq->CodeBlkVersion[4], ha->enq->CodeBlkVersion[5],
|
ha->enq->CodeBlkVersion[4], ha->enq->CodeBlkVersion[5],
|
||||||
ha->enq->CodeBlkVersion[6], ha->enq->CodeBlkVersion[7]);
|
ha->enq->CodeBlkVersion[6], ha->enq->CodeBlkVersion[7]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ha->enq->BootBlkVersion[7] == 0) {
|
if (ha->enq->BootBlkVersion[7] == 0) {
|
||||||
copy_info(&info,
|
seq_printf(m,
|
||||||
"\tBoot Block Version : %c%c%c%c%c%c%c\n",
|
"\tBoot Block Version : %c%c%c%c%c%c%c\n",
|
||||||
ha->enq->BootBlkVersion[0], ha->enq->BootBlkVersion[1],
|
ha->enq->BootBlkVersion[0], ha->enq->BootBlkVersion[1],
|
||||||
ha->enq->BootBlkVersion[2], ha->enq->BootBlkVersion[3],
|
ha->enq->BootBlkVersion[2], ha->enq->BootBlkVersion[3],
|
||||||
ha->enq->BootBlkVersion[4], ha->enq->BootBlkVersion[5],
|
ha->enq->BootBlkVersion[4], ha->enq->BootBlkVersion[5],
|
||||||
ha->enq->BootBlkVersion[6]);
|
ha->enq->BootBlkVersion[6]);
|
||||||
} else {
|
} else {
|
||||||
copy_info(&info,
|
seq_printf(m,
|
||||||
"\tBoot Block Version : %c%c%c%c%c%c%c%c\n",
|
"\tBoot Block Version : %c%c%c%c%c%c%c%c\n",
|
||||||
ha->enq->BootBlkVersion[0], ha->enq->BootBlkVersion[1],
|
ha->enq->BootBlkVersion[0], ha->enq->BootBlkVersion[1],
|
||||||
ha->enq->BootBlkVersion[2], ha->enq->BootBlkVersion[3],
|
ha->enq->BootBlkVersion[2], ha->enq->BootBlkVersion[3],
|
||||||
ha->enq->BootBlkVersion[4], ha->enq->BootBlkVersion[5],
|
ha->enq->BootBlkVersion[4], ha->enq->BootBlkVersion[5],
|
||||||
ha->enq->BootBlkVersion[6], ha->enq->BootBlkVersion[7]);
|
ha->enq->BootBlkVersion[6], ha->enq->BootBlkVersion[7]);
|
||||||
}
|
}
|
||||||
|
|
||||||
copy_info(&info, "\tDriver Version : %s%s\n",
|
seq_printf(m, "\tDriver Version : %s%s\n",
|
||||||
IPS_VERSION_HIGH, IPS_VERSION_LOW);
|
IPS_VERSION_HIGH, IPS_VERSION_LOW);
|
||||||
|
|
||||||
copy_info(&info, "\tDriver Build : %d\n",
|
seq_printf(m, "\tDriver Build : %d\n",
|
||||||
IPS_BUILD_IDENT);
|
IPS_BUILD_IDENT);
|
||||||
|
|
||||||
copy_info(&info, "\tMax Physical Devices : %d\n",
|
seq_printf(m, "\tMax Physical Devices : %d\n",
|
||||||
ha->enq->ucMaxPhysicalDevices);
|
ha->enq->ucMaxPhysicalDevices);
|
||||||
copy_info(&info, "\tMax Active Commands : %d\n",
|
seq_printf(m, "\tMax Active Commands : %d\n",
|
||||||
ha->max_cmds);
|
ha->max_cmds);
|
||||||
copy_info(&info, "\tCurrent Queued Commands : %d\n",
|
seq_printf(m, "\tCurrent Queued Commands : %d\n",
|
||||||
ha->scb_waitlist.count);
|
ha->scb_waitlist.count);
|
||||||
copy_info(&info, "\tCurrent Active Commands : %d\n",
|
seq_printf(m, "\tCurrent Active Commands : %d\n",
|
||||||
ha->scb_activelist.count - ha->num_ioctl);
|
ha->scb_activelist.count - ha->num_ioctl);
|
||||||
copy_info(&info, "\tCurrent Queued PT Commands : %d\n",
|
seq_printf(m, "\tCurrent Queued PT Commands : %d\n",
|
||||||
ha->copp_waitlist.count);
|
ha->copp_waitlist.count);
|
||||||
copy_info(&info, "\tCurrent Active PT Commands : %d\n",
|
seq_printf(m, "\tCurrent Active PT Commands : %d\n",
|
||||||
ha->num_ioctl);
|
ha->num_ioctl);
|
||||||
|
|
||||||
copy_info(&info, "\n");
|
seq_printf(m, "\n");
|
||||||
|
|
||||||
return (info.localpos);
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* */
|
|
||||||
/* Routine Name: copy_mem_info */
|
|
||||||
/* */
|
|
||||||
/* Routine Description: */
|
|
||||||
/* */
|
|
||||||
/* Copy data into an IPS_INFOSTR structure */
|
|
||||||
/* */
|
|
||||||
/****************************************************************************/
|
|
||||||
static void
|
|
||||||
copy_mem_info(IPS_INFOSTR * info, char *data, int len)
|
|
||||||
{
|
|
||||||
METHOD_TRACE("copy_mem_info", 1);
|
|
||||||
|
|
||||||
if (info->pos + len < info->offset) {
|
|
||||||
info->pos += len;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (info->pos < info->offset) {
|
|
||||||
data += (info->offset - info->pos);
|
|
||||||
len -= (info->offset - info->pos);
|
|
||||||
info->pos += (info->offset - info->pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (info->localpos + len > info->length)
|
|
||||||
len = info->length - info->localpos;
|
|
||||||
|
|
||||||
if (len > 0) {
|
|
||||||
memcpy(info->buffer + info->localpos, data, len);
|
|
||||||
info->pos += len;
|
|
||||||
info->localpos += len;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
/* */
|
|
||||||
/* Routine Name: copy_info */
|
|
||||||
/* */
|
|
||||||
/* Routine Description: */
|
|
||||||
/* */
|
|
||||||
/* printf style wrapper for an info structure */
|
|
||||||
/* */
|
|
||||||
/****************************************************************************/
|
|
||||||
static int
|
|
||||||
copy_info(IPS_INFOSTR * info, char *fmt, ...)
|
|
||||||
{
|
|
||||||
va_list args;
|
|
||||||
char buf[128];
|
|
||||||
int len;
|
|
||||||
|
|
||||||
METHOD_TRACE("copy_info", 1);
|
|
||||||
|
|
||||||
va_start(args, fmt);
|
|
||||||
len = vsprintf(buf, fmt, args);
|
|
||||||
va_end(args);
|
|
||||||
|
|
||||||
copy_mem_info(info, buf, len);
|
|
||||||
|
|
||||||
return (len);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
@@ -416,7 +416,6 @@
|
|||||||
/*
|
/*
|
||||||
* Scsi_Host Template
|
* Scsi_Host Template
|
||||||
*/
|
*/
|
||||||
static int ips_proc_info(struct Scsi_Host *, char *, char **, off_t, int, int);
|
|
||||||
static int ips_biosparam(struct scsi_device *sdev, struct block_device *bdev,
|
static int ips_biosparam(struct scsi_device *sdev, struct block_device *bdev,
|
||||||
sector_t capacity, int geom[]);
|
sector_t capacity, int geom[]);
|
||||||
static int ips_slave_configure(struct scsi_device *SDptr);
|
static int ips_slave_configure(struct scsi_device *SDptr);
|
||||||
@@ -959,14 +958,6 @@ typedef union {
|
|||||||
IPS_ENH_SG_LIST *enh_list;
|
IPS_ENH_SG_LIST *enh_list;
|
||||||
} IPS_SG_LIST;
|
} IPS_SG_LIST;
|
||||||
|
|
||||||
typedef struct _IPS_INFOSTR {
|
|
||||||
char *buffer;
|
|
||||||
int length;
|
|
||||||
int offset;
|
|
||||||
int pos;
|
|
||||||
int localpos;
|
|
||||||
} IPS_INFOSTR;
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char *option_name;
|
char *option_name;
|
||||||
int *option_flag;
|
int *option_flag;
|
||||||
|
Reference in New Issue
Block a user