patch-1.3.36 linux/drivers/scsi/aic7xxx_proc.c

Next file: linux/drivers/scsi/buslogic.c
Previous file: linux/drivers/scsi/aic7xxx_asm.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v1.3.35/linux/drivers/scsi/aic7xxx_proc.c linux/drivers/scsi/aic7xxx_proc.c
@@ -0,0 +1,275 @@
+/*+M*************************************************************************
+ * Adaptec 274x/284x/294x device driver proc support for Linux.
+ *
+ * Copyright (c) 1995 Dean W. Gehnert
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * ----------------------------------------------------------------
+ *  o Modified from the EATA /proc support.
+ *  o Additional support for device block statistics provided by
+ *    Matthew Jacob.
+ *
+ *  Dean W. Gehnert, deang@ims.com, 08/30/95
+ *
+ *  $Id: aic7xxx_proc.c,v 2.2 1995/09/12 05:24:37 deang Exp $
+ *-M*************************************************************************/
+
+#define BLS buffer + len + size
+#define HDRB \
+"        < 512 512-1K   1-2K   2-4K   4-8K  8-16K 16-32K 32-64K 64-128K >128K"
+
+#ifdef PROC_DEBUG
+extern int vsprintf(char *, const char *, va_list);
+
+static void
+proc_debug(const char *fmt, ...)
+{
+  va_list ap;
+  char buf[256];
+
+  va_start(ap, fmt);
+  vsprintf(buf, fmt, ap);
+  printk(buf);
+  va_end(ap);
+}
+#else /* PROC_DEBUG */
+#  define proc_debug(fmt, args...)
+#endif /* PROC_DEBUG */
+
+/*+F*************************************************************************
+ * Function:
+ *   aic7xxx_set_info
+ *
+ * Description:
+ *   Set parameters for the driver from the /proc filesystem.
+ *-F*************************************************************************/
+int
+aic7xxx_set_info(char *buffer, int length, struct Scsi_Host *HBAptr)
+{
+  proc_debug("aic7xxx_set_info(): %s\n", buffer);
+  return (-ENOSYS);  /* Currently this is a no-op */
+}
+
+/*+F*************************************************************************
+ * Function:
+ *   aic7xxx_proc_info
+ *
+ * Description:
+ *   Return information to handle /proc support for the driver.
+ *-F*************************************************************************/
+int
+aic7xxx_proc_info(char *buffer, char **start, off_t offset, int length, 
+    int hostno, int inout)
+{
+  struct Scsi_Host *HBAptr;
+  struct aic7xxx_host *p;
+  static u8 buff[512];
+  int   i; 
+  int   size = 0;
+  int   len = 0;
+  off_t begin = 0;
+  off_t pos = 0;
+  static char *board_name[] = {"None", "274x", "284x", "7870", "7850", "7872"};
+  static char *bus_name[] = {"Single", "Twin", "Wide"};
+
+  HBAptr = NULL;
+  for (i = 0; i < NUMBER(aic7xxx_boards); i++)
+  {
+    if ((HBAptr = aic7xxx_boards[i]) != NULL)
+    {
+      if (HBAptr->host_no == hostno)
+      {
+        break;
+      }
+
+      while ((HBAptr->hostdata != NULL) &&
+          ((HBAptr = ((struct aic7xxx_host *) HBAptr->hostdata)->next) != NULL))
+      {
+        if (HBAptr->host_no == hostno)
+        {
+          break; break;
+        }
+      }
+
+      HBAptr = NULL;
+    }
+  }
+
+  if (HBAptr == NULL)
+  {
+    size += sprintf(BLS, "Can't find adapter for host number %d\n", hostno);
+    len += size; pos = begin + len; size = 0;
+    goto stop_output;
+  }
+
+  if (inout == TRUE) /* Has data been written to the file? */ 
+  {
+    return (aic7xxx_set_info(buffer, length, HBAptr));
+  }
+
+  if (offset == 0)
+  {
+    memset(buff, 0, sizeof(buff));
+  }
+
+  p = (struct aic7xxx_host *) HBAptr->hostdata;
+
+  size += sprintf(BLS, "Adaptec AIC7xxx driver version: ");
+  size += sprintf(BLS, "%s/", rcs_version(AIC7XXX_C_VERSION));
+  size += sprintf(BLS, "%s/", rcs_version(AIC7XXX_H_VERSION));
+  size += sprintf(BLS, "%s\n", rcs_version(AIC7XXX_SEQ_VER));
+  len += size; pos = begin + len; size = 0;
+
+  size += sprintf(BLS, "\n");
+  size += sprintf(BLS, "Compile Options:\n");
+#ifdef AIC7XXX_RESET_DELAY
+  size += sprintf(BLS, "  AIC7XXX_RESET_DELAY    : %d\n", AIC7XXX_RESET_DELAY);
+#endif
+#ifdef AIC7XXX_TWIN_SUPPORT
+  size += sprintf(BLS, "  AIC7XXX_TWIN_SUPPORT   : Enabled\n");
+#else
+  size += sprintf(BLS, "  AIC7XXX_TWIN_SUPPORT   : Disabled\n");
+#endif
+#ifdef AIC7XXX_TAGGED_QUEUEING
+  size += sprintf(BLS, "  AIC7XXX_TAGGED_QUEUEING: Enabled\n");
+#else
+  size += sprintf(BLS, "  AIC7XXX_TAGGED_QUEUEING: Disabled\n");
+#endif
+#ifdef AIC7XXX_SHARE_IRQS
+  size += sprintf(BLS, "  AIC7XXX_SHARE_IRQS     : Enabled\n");
+#else
+  size += sprintf(BLS, "  AIC7XXX_SHARE_IRQS     : Disabled\n");
+#endif
+#ifdef AIC7XXX_PROC_STATS
+  size += sprintf(BLS, "  AIC7XXX_PROC_STATS     : Enabled\n");
+#else
+  size += sprintf(BLS, "  AIC7XXX_PROC_STATS     : Disabled\n");
+#endif
+#ifdef AIC7XXX_POLL
+  size += sprintf(BLS, "  AIC7XXX_POLL           : Enabled\n");
+#else
+  size += sprintf(BLS, "  AIC7XXX_POLL           : Disabled\n");
+#endif
+  len += size; pos = begin + len; size = 0;
+
+  size += sprintf(BLS, "\n");
+  size += sprintf(BLS, "Adapter Configuration:\n");
+  size += sprintf(BLS, "          SCSI Adapter: %s\n", board_name[p->type]);
+  size += sprintf(BLS, "              Host Bus: %s\n", bus_name[p->bus_type]);
+  size += sprintf(BLS, "               Base IO: %#.4x\n", p->base);
+  size += sprintf(BLS, "                   IRQ: %d\n", HBAptr->irq);
+  size += sprintf(BLS, "                   SCB: %d (%d)\n", p->numscb, p->maxscb);
+  size += sprintf(BLS, "            Interrupts: %d", p->isr_count);
+  if ((p->type == AIC_274x) || (p->type == AIC_284x))
+  {
+    size += sprintf(BLS, " %s\n",
+        (p->pause & IRQMS) ? "(Level Sensitive)" : "(Edge Triggered)");
+  }
+  else
+  {
+    size += sprintf(BLS, "\n");
+  }
+  size += sprintf(BLS, "         Serial EEPROM: %s\n",
+      p->have_seeprom ? "True" : "False");
+  size += sprintf(BLS, "         Pause/Unpause: %#.2x/%#.2x\n", p->pause,
+      p->unpause);
+  size += sprintf(BLS, "  Extended Translation: %sabled\n",
+      p->extended ? "En" : "Dis");
+  size += sprintf(BLS, "        SCSI Bus Reset: %sabled\n",
+      aic7xxx_no_reset ? "Dis" : "En");
+  len += size; pos = begin + len; size = 0;
+
+#ifdef AIC7XXX_PROC_STATS
+  {
+    struct aic7xxx_xferstats *sp;
+    int channel, target, lun;
+
+    /*
+     * XXX: Need to fix this to avoid overflow...
+     */
+    size += sprintf(BLS, "\n");
+    size += sprintf(BLS, "Statistics:\n");
+    for (channel = 0; channel < 2; channel++)
+    {
+      for (target = 0; target < 16; target++)
+      {
+        for (lun = 0; lun < 8; lun++)
+        {
+          sp = &p->stats[channel][target][lun];
+          if (sp->xfers == 0)
+          {
+            continue;
+          }
+          size += sprintf(BLS, "CHAN#%c (TGT %d LUN %d):\n",
+              'A' + channel, target, lun);
+          size += sprintf(BLS, "nxfers %ld (%ld read;%ld written)\n",
+              sp->xfers, sp->r_total, sp->w_total);
+          size += sprintf(BLS, "blks(512) rd=%ld; blks(512) wr=%ld\n",
+              sp->r_total512, sp->w_total512);
+          size += sprintf(BLS, "%s\n", HDRB);
+          size += sprintf(BLS, " Reads:");
+          size += sprintf(BLS, "%6ld %6ld %6ld %6ld ", sp->r_bins[0],
+              sp->r_bins[1], sp->r_bins[2], sp->r_bins[3]);
+          size += sprintf(BLS, "%6ld %6ld %6ld %6ld ", sp->r_bins[4],
+              sp->r_bins[5], sp->r_bins[6], sp->r_bins[7]);
+          size += sprintf(BLS, "%6ld %6ld\n", sp->r_bins[8],
+              sp->r_bins[9]);
+          size += sprintf(BLS, "Writes:");
+          size += sprintf(BLS, "%6ld %6ld %6ld %6ld ", sp->w_bins[0],
+              sp->w_bins[1], sp->w_bins[2], sp->w_bins[3]);
+          size += sprintf(BLS, "%6ld %6ld %6ld %6ld ", sp->w_bins[4],
+              sp->w_bins[5], sp->w_bins[6], sp->w_bins[7]);
+          size += sprintf(BLS, "%6ld %6ld\n", sp->w_bins[8],
+              sp->w_bins[9]);
+          size += sprintf(BLS, "\n");
+        }
+      }
+    }
+    len += size; pos = begin + len; size = 0;
+  }
+#endif /* AIC7XXX_PROC_STATS */
+
+stop_output:
+  proc_debug("2pos: %ld offset: %ld len: %d\n", pos, offset, len);
+  *start = buffer + (offset - begin);   /* Start of wanted data */
+  len -= (offset - begin);      /* Start slop */
+  if (len > length)
+  {
+    len = length;               /* Ending slop */
+  }
+  proc_debug("3pos: %ld offset: %ld len: %d\n", pos, offset, len);
+  
+  return (len);     
+}
+
+/*
+ * Overrides for Emacs so that we follow Linus's tabbing style.
+ * Emacs will notice this stuff at the end of the file and automatically
+ * adjust the settings for this buffer only.  This must remain at the end
+ * of the file.
+ * ---------------------------------------------------------------------------
+ * Local variables:
+ * c-indent-level: 2
+ * c-brace-imaginary-offset: 0
+ * c-brace-offset: -2
+ * c-argdecl-indent: 2
+ * c-label-offset: -2
+ * c-continued-statement-offset: 2
+ * c-continued-brace-offset: 0
+ * indent-tabs-mode: nil
+ * tab-width: 8
+ * End:
+ */

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov with Sam's (original) version
of this