advansys: switch to ->show_info()
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 31 Mar 2013 06:59:55 +0000 (02:59 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 9 Apr 2013 18:13:21 +0000 (14:13 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
drivers/scsi/advansys.c

index dcfaee6..9029a20 100644 (file)
@@ -2178,22 +2178,6 @@ do { \
 
 #define ASC_INFO_SIZE           128    /* advansys_info() line size */
 
-#ifdef CONFIG_PROC_FS
-/* /proc/scsi/advansys/[0...] related definitions */
-#define ASC_PRTBUF_SIZE         2048
-#define ASC_PRTLINE_SIZE        160
-
-#define ASC_PRT_NEXT() \
-    if (cp) { \
-        totlen += len; \
-        leftlen -= len; \
-        if (leftlen == 0) { \
-            return totlen; \
-        } \
-        cp += len; \
-    }
-#endif /* CONFIG_PROC_FS */
-
 /* Asc Library return codes */
 #define ASC_TRUE        1
 #define ASC_FALSE       0
@@ -2384,7 +2368,6 @@ struct asc_board {
        } eep_config;
        ulong last_reset;       /* Saved last reset time */
        /* /proc/scsi/advansys/[0...] */
-       char *prtbuf;           /* /proc print buffer */
 #ifdef ADVANSYS_STATS
        struct asc_stats asc_stats;     /* Board statistics */
 #endif                         /* ADVANSYS_STATS */
@@ -2875,64 +2858,21 @@ static const char *advansys_info(struct Scsi_Host *shost)
 }
 
 #ifdef CONFIG_PROC_FS
-/*
- * asc_prt_line()
- *
- * If 'cp' is NULL print to the console, otherwise print to a buffer.
- *
- * Return 0 if printing to the console, otherwise return the number of
- * bytes written to the buffer.
- *
- * Note: If any single line is greater than ASC_PRTLINE_SIZE bytes the stack
- * will be corrupted. 's[]' is defined to be ASC_PRTLINE_SIZE bytes.
- */
-static int asc_prt_line(char *buf, int buflen, char *fmt, ...)
-{
-       va_list args;
-       int ret;
-       char s[ASC_PRTLINE_SIZE];
-
-       va_start(args, fmt);
-       ret = vsprintf(s, fmt, args);
-       BUG_ON(ret >= ASC_PRTLINE_SIZE);
-       if (buf == NULL) {
-               (void)printk(s);
-               ret = 0;
-       } else {
-               ret = min(buflen, ret);
-               memcpy(buf, s, ret);
-       }
-       va_end(args);
-       return ret;
-}
 
 /*
  * asc_prt_board_devices()
  *
  * Print driver information for devices attached to the board.
- *
- * Note: no single line should be greater than ASC_PRTLINE_SIZE,
- * cf. asc_prt_line().
- *
- * Return the number of characters copied into 'cp'. No more than
- * 'cplen' characters will be copied to 'cp'.
  */
-static int asc_prt_board_devices(struct Scsi_Host *shost, char *cp, int cplen)
+static void asc_prt_board_devices(struct seq_file *m, struct Scsi_Host *shost)
 {
        struct asc_board *boardp = shost_priv(shost);
-       int leftlen;
-       int totlen;
-       int len;
        int chip_scsi_id;
        int i;
 
-       leftlen = cplen;
-       totlen = len = 0;
-
-       len = asc_prt_line(cp, leftlen,
-                          "\nDevice Information for AdvanSys SCSI Host %d:\n",
-                          shost->host_no);
-       ASC_PRT_NEXT();
+       seq_printf(m,
+                  "\nDevice Information for AdvanSys SCSI Host %d:\n",
+                  shost->host_no);
 
        if (ASC_NARROW_BOARD(boardp)) {
                chip_scsi_id = boardp->dvc_cfg.asc_dvc_cfg.chip_scsi_id;
@@ -2940,60 +2880,42 @@ static int asc_prt_board_devices(struct Scsi_Host *shost, char *cp, int cplen)
                chip_scsi_id = boardp->dvc_var.adv_dvc_var.chip_scsi_id;
        }
 
-       len = asc_prt_line(cp, leftlen, "Target IDs Detected:");
-       ASC_PRT_NEXT();
+       seq_printf(m, "Target IDs Detected:");
        for (i = 0; i <= ADV_MAX_TID; i++) {
-               if (boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) {
-                       len = asc_prt_line(cp, leftlen, " %X,", i);
-                       ASC_PRT_NEXT();
-               }
+               if (boardp->init_tidmask & ADV_TID_TO_TIDMASK(i))
+                       seq_printf(m, " %X,", i);
        }
-       len = asc_prt_line(cp, leftlen, " (%X=Host Adapter)\n", chip_scsi_id);
-       ASC_PRT_NEXT();
-
-       return totlen;
+       seq_printf(m, " (%X=Host Adapter)\n", chip_scsi_id);
 }
 
 /*
  * Display Wide Board BIOS Information.
  */
-static int asc_prt_adv_bios(struct Scsi_Host *shost, char *cp, int cplen)
+static void asc_prt_adv_bios(struct seq_file *m, struct Scsi_Host *shost)
 {
        struct asc_board *boardp = shost_priv(shost);
-       int leftlen;
-       int totlen;
-       int len;
        ushort major, minor, letter;
 
-       leftlen = cplen;
-       totlen = len = 0;
-
-       len = asc_prt_line(cp, leftlen, "\nROM BIOS Version: ");
-       ASC_PRT_NEXT();
+       seq_printf(m, "\nROM BIOS Version: ");
 
        /*
         * If the BIOS saved a valid signature, then fill in
         * the BIOS code segment base address.
         */
        if (boardp->bios_signature != 0x55AA) {
-               len = asc_prt_line(cp, leftlen, "Disabled or Pre-3.1\n");
-               ASC_PRT_NEXT();
-               len = asc_prt_line(cp, leftlen,
-                                  "BIOS either disabled or Pre-3.1. If it is pre-3.1, then a newer version\n");
-               ASC_PRT_NEXT();
-               len = asc_prt_line(cp, leftlen,
-                                  "can be found at the ConnectCom FTP site: ftp://ftp.connectcom.net/pub\n");
-               ASC_PRT_NEXT();
+               seq_printf(m, "Disabled or Pre-3.1\n");
+               seq_printf(m,
+                         "BIOS either disabled or Pre-3.1. If it is pre-3.1, then a newer version\n");
+               seq_printf(m,
+                         "can be found at the ConnectCom FTP site: ftp://ftp.connectcom.net/pub\n");
        } else {
                major = (boardp->bios_version >> 12) & 0xF;
                minor = (boardp->bios_version >> 8) & 0xF;
                letter = (boardp->bios_version & 0xFF);
 
-               len = asc_prt_line(cp, leftlen, "%d.%d%c\n",
+               seq_printf(m, "%d.%d%c\n",
                                   major, minor,
                                   letter >= 26 ? '?' : letter + 'A');
-               ASC_PRT_NEXT();
-
                /*
                 * Current available ROM BIOS release is 3.1I for UW
                 * and 3.2I for U2W. This code doesn't differentiate
@@ -3001,16 +2923,12 @@ static int asc_prt_adv_bios(struct Scsi_Host *shost, char *cp, int cplen)
                 */
                if (major < 3 || (major <= 3 && minor < 1) ||
                    (major <= 3 && minor <= 1 && letter < ('I' - 'A'))) {
-                       len = asc_prt_line(cp, leftlen,
-                                          "Newer version of ROM BIOS is available at the ConnectCom FTP site:\n");
-                       ASC_PRT_NEXT();
-                       len = asc_prt_line(cp, leftlen,
-                                          "ftp://ftp.connectcom.net/pub\n");
-                       ASC_PRT_NEXT();
+                       seq_printf(m,
+                                  "Newer version of ROM BIOS is available at the ConnectCom FTP site:\n");
+                       seq_printf(m,
+                                  "ftp://ftp.connectcom.net/pub\n");
                }
        }
-
-       return totlen;
 }
 
 /*
@@ -3115,20 +3033,11 @@ static int asc_get_eeprom_string(ushort *serialnum, uchar *cp)
  * asc_prt_asc_board_eeprom()
  *
  * Print board EEPROM configuration.
- *
- * Note: no single line should be greater than ASC_PRTLINE_SIZE,
- * cf. asc_prt_line().
- *
- * Return the number of characters copied into 'cp'. No more than
- * 'cplen' characters will be copied to 'cp'.
  */
-static int asc_prt_asc_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen)
+static void asc_prt_asc_board_eeprom(struct seq_file *m, struct Scsi_Host *shost)
 {
        struct asc_board *boardp = shost_priv(shost);
        ASC_DVC_VAR *asc_dvc_varp;
-       int leftlen;
-       int totlen;
-       int len;
        ASCEEP_CONFIG *ep;
        int i;
 #ifdef CONFIG_ISA
@@ -3139,129 +3048,75 @@ static int asc_prt_asc_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen
        asc_dvc_varp = &boardp->dvc_var.asc_dvc_var;
        ep = &boardp->eep_config.asc_eep;
 
-       leftlen = cplen;
-       totlen = len = 0;
-
-       len = asc_prt_line(cp, leftlen,
-                          "\nEEPROM Settings for AdvanSys SCSI Host %d:\n",
-                          shost->host_no);
-       ASC_PRT_NEXT();
+       seq_printf(m,
+                  "\nEEPROM Settings for AdvanSys SCSI Host %d:\n",
+                  shost->host_no);
 
        if (asc_get_eeprom_string((ushort *)&ep->adapter_info[0], serialstr)
-           == ASC_TRUE) {
-               len =
-                   asc_prt_line(cp, leftlen, " Serial Number: %s\n",
-                                serialstr);
-               ASC_PRT_NEXT();
-       } else {
-               if (ep->adapter_info[5] == 0xBB) {
-                       len = asc_prt_line(cp, leftlen,
-                                          " Default Settings Used for EEPROM-less Adapter.\n");
-                       ASC_PRT_NEXT();
-               } else {
-                       len = asc_prt_line(cp, leftlen,
-                                          " Serial Number Signature Not Present.\n");
-                       ASC_PRT_NEXT();
-               }
-       }
-
-       len = asc_prt_line(cp, leftlen,
-                          " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
-                          ASC_EEP_GET_CHIP_ID(ep), ep->max_total_qng,
-                          ep->max_tag_qng);
-       ASC_PRT_NEXT();
-
-       len = asc_prt_line(cp, leftlen,
-                          " cntl 0x%x, no_scam 0x%x\n", ep->cntl, ep->no_scam);
-       ASC_PRT_NEXT();
-
-       len = asc_prt_line(cp, leftlen, " Target ID:           ");
-       ASC_PRT_NEXT();
-       for (i = 0; i <= ASC_MAX_TID; i++) {
-               len = asc_prt_line(cp, leftlen, " %d", i);
-               ASC_PRT_NEXT();
-       }
-       len = asc_prt_line(cp, leftlen, "\n");
-       ASC_PRT_NEXT();
-
-       len = asc_prt_line(cp, leftlen, " Disconnects:         ");
-       ASC_PRT_NEXT();
-       for (i = 0; i <= ASC_MAX_TID; i++) {
-               len = asc_prt_line(cp, leftlen, " %c",
-                                  (ep->
-                                   disc_enable & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
-                                  'N');
-               ASC_PRT_NEXT();
-       }
-       len = asc_prt_line(cp, leftlen, "\n");
-       ASC_PRT_NEXT();
-
-       len = asc_prt_line(cp, leftlen, " Command Queuing:     ");
-       ASC_PRT_NEXT();
-       for (i = 0; i <= ASC_MAX_TID; i++) {
-               len = asc_prt_line(cp, leftlen, " %c",
-                                  (ep->
-                                   use_cmd_qng & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
-                                  'N');
-               ASC_PRT_NEXT();
-       }
-       len = asc_prt_line(cp, leftlen, "\n");
-       ASC_PRT_NEXT();
-
-       len = asc_prt_line(cp, leftlen, " Start Motor:         ");
-       ASC_PRT_NEXT();
-       for (i = 0; i <= ASC_MAX_TID; i++) {
-               len = asc_prt_line(cp, leftlen, " %c",
-                                  (ep->
-                                   start_motor & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
-                                  'N');
-               ASC_PRT_NEXT();
-       }
-       len = asc_prt_line(cp, leftlen, "\n");
-       ASC_PRT_NEXT();
-
-       len = asc_prt_line(cp, leftlen, " Synchronous Transfer:");
-       ASC_PRT_NEXT();
-       for (i = 0; i <= ASC_MAX_TID; i++) {
-               len = asc_prt_line(cp, leftlen, " %c",
-                                  (ep->
-                                   init_sdtr & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
-                                  'N');
-               ASC_PRT_NEXT();
-       }
-       len = asc_prt_line(cp, leftlen, "\n");
-       ASC_PRT_NEXT();
+           == ASC_TRUE)
+               seq_printf(m, " Serial Number: %s\n", serialstr);
+       else if (ep->adapter_info[5] == 0xBB)
+               seq_printf(m,
+                          " Default Settings Used for EEPROM-less Adapter.\n");
+       else
+               seq_printf(m,
+                          " Serial Number Signature Not Present.\n");
+
+       seq_printf(m,
+                  " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
+                  ASC_EEP_GET_CHIP_ID(ep), ep->max_total_qng,
+                  ep->max_tag_qng);
+
+       seq_printf(m,
+                  " cntl 0x%x, no_scam 0x%x\n", ep->cntl, ep->no_scam);
+
+       seq_printf(m, " Target ID:           ");
+       for (i = 0; i <= ASC_MAX_TID; i++)
+               seq_printf(m, " %d", i);
+       seq_printf(m, "\n");
+
+       seq_printf(m, " Disconnects:         ");
+       for (i = 0; i <= ASC_MAX_TID; i++)
+               seq_printf(m, " %c",
+                          (ep->disc_enable & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
+       seq_printf(m, "\n");
+
+       seq_printf(m, " Command Queuing:     ");
+       for (i = 0; i <= ASC_MAX_TID; i++)
+               seq_printf(m, " %c",
+                          (ep->use_cmd_qng & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
+       seq_printf(m, "\n");
+
+       seq_printf(m, " Start Motor:         ");
+       for (i = 0; i <= ASC_MAX_TID; i++)
+               seq_printf(m, " %c",
+                          (ep->start_motor & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
+       seq_printf(m, "\n");
+
+       seq_printf(m, " Synchronous Transfer:");
+       for (i = 0; i <= ASC_MAX_TID; i++)
+               seq_printf(m, " %c",
+                          (ep->init_sdtr & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
+       seq_printf(m, "\n");
 
 #ifdef CONFIG_ISA
        if (asc_dvc_varp->bus_type & ASC_IS_ISA) {
-               len = asc_prt_line(cp, leftlen,
-                                  " Host ISA DMA speed:   %d MB/S\n",
-                                  isa_dma_speed[ASC_EEP_GET_DMA_SPD(ep)]);
-               ASC_PRT_NEXT();
+               seq_printf(m,
+                          " Host ISA DMA speed:   %d MB/S\n",
+                          isa_dma_speed[ASC_EEP_GET_DMA_SPD(ep)]);
        }
 #endif /* CONFIG_ISA */
-
-       return totlen;
 }
 
 /*
  * asc_prt_adv_board_eeprom()
  *
  * Print board EEPROM configuration.
- *
- * Note: no single line should be greater than ASC_PRTLINE_SIZE,
- * cf. asc_prt_line().
- *
- * Return the number of characters copied into 'cp'. No more than
- * 'cplen' characters will be copied to 'cp'.
  */
-static int asc_prt_adv_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen)
+static void asc_prt_adv_board_eeprom(struct seq_file *m, struct Scsi_Host *shost)
 {
        struct asc_board *boardp = shost_priv(shost);
        ADV_DVC_VAR *adv_dvc_varp;
-       int leftlen;
-       int totlen;
-       int len;
        int i;
        char *termstr;
        uchar serialstr[13];
@@ -3281,13 +3136,9 @@ static int asc_prt_adv_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen
                ep_38C1600 = &boardp->eep_config.adv_38C1600_eep;
        }
 
-       leftlen = cplen;
-       totlen = len = 0;
-
-       len = asc_prt_line(cp, leftlen,
-                          "\nEEPROM Settings for AdvanSys SCSI Host %d:\n",
-                          shost->host_no);
-       ASC_PRT_NEXT();
+       seq_printf(m,
+                  "\nEEPROM Settings for AdvanSys SCSI Host %d:\n",
+                  shost->host_no);
 
        if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
                wordp = &ep_3550->serial_number_word1;
@@ -3297,38 +3148,28 @@ static int asc_prt_adv_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen
                wordp = &ep_38C1600->serial_number_word1;
        }
 
-       if (asc_get_eeprom_string(wordp, serialstr) == ASC_TRUE) {
-               len =
-                   asc_prt_line(cp, leftlen, " Serial Number: %s\n",
-                                serialstr);
-               ASC_PRT_NEXT();
-       } else {
-               len = asc_prt_line(cp, leftlen,
-                                  " Serial Number Signature Not Present.\n");
-               ASC_PRT_NEXT();
-       }
+       if (asc_get_eeprom_string(wordp, serialstr) == ASC_TRUE)
+               seq_printf(m, " Serial Number: %s\n", serialstr);
+       else
+               seq_printf(m, " Serial Number Signature Not Present.\n");
 
-       if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
-               len = asc_prt_line(cp, leftlen,
-                                  " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
-                                  ep_3550->adapter_scsi_id,
-                                  ep_3550->max_host_qng, ep_3550->max_dvc_qng);
-               ASC_PRT_NEXT();
-       } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
-               len = asc_prt_line(cp, leftlen,
-                                  " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
-                                  ep_38C0800->adapter_scsi_id,
-                                  ep_38C0800->max_host_qng,
-                                  ep_38C0800->max_dvc_qng);
-               ASC_PRT_NEXT();
-       } else {
-               len = asc_prt_line(cp, leftlen,
-                                  " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
-                                  ep_38C1600->adapter_scsi_id,
-                                  ep_38C1600->max_host_qng,
-                                  ep_38C1600->max_dvc_qng);
-               ASC_PRT_NEXT();
-       }
+       if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
+               seq_printf(m,
+                          " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
+                          ep_3550->adapter_scsi_id,
+                          ep_3550->max_host_qng, ep_3550->max_dvc_qng);
+       else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800)
+               seq_printf(m,
+                          " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
+                          ep_38C0800->adapter_scsi_id,
+                          ep_38C0800->max_host_qng,
+                          ep_38C0800->max_dvc_qng);
+       else
+               seq_printf(m,
+                          " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
+                          ep_38C1600->adapter_scsi_id,
+                          ep_38C1600->max_host_qng,
+                          ep_38C1600->max_dvc_qng);
        if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
                word = ep_3550->termination;
        } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
@@ -3352,34 +3193,26 @@ static int asc_prt_adv_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen
                break;
        }
 
-       if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
-               len = asc_prt_line(cp, leftlen,
-                                  " termination: %u (%s), bios_ctrl: 0x%x\n",
-                                  ep_3550->termination, termstr,
-                                  ep_3550->bios_ctrl);
-               ASC_PRT_NEXT();
-       } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
-               len = asc_prt_line(cp, leftlen,
-                                  " termination: %u (%s), bios_ctrl: 0x%x\n",
-                                  ep_38C0800->termination_lvd, termstr,
-                                  ep_38C0800->bios_ctrl);
-               ASC_PRT_NEXT();
-       } else {
-               len = asc_prt_line(cp, leftlen,
-                                  " termination: %u (%s), bios_ctrl: 0x%x\n",
-                                  ep_38C1600->termination_lvd, termstr,
-                                  ep_38C1600->bios_ctrl);
-               ASC_PRT_NEXT();
-       }
+       if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
+               seq_printf(m,
+                          " termination: %u (%s), bios_ctrl: 0x%x\n",
+                          ep_3550->termination, termstr,
+                          ep_3550->bios_ctrl);
+       else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800)
+               seq_printf(m,
+                          " termination: %u (%s), bios_ctrl: 0x%x\n",
+                          ep_38C0800->termination_lvd, termstr,
+                          ep_38C0800->bios_ctrl);
+       else
+               seq_printf(m,
+                          " termination: %u (%s), bios_ctrl: 0x%x\n",
+                          ep_38C1600->termination_lvd, termstr,
+                          ep_38C1600->bios_ctrl);
 
-       len = asc_prt_line(cp, leftlen, " Target ID:           ");
-       ASC_PRT_NEXT();
-       for (i = 0; i <= ADV_MAX_TID; i++) {
-               len = asc_prt_line(cp, leftlen, " %X", i);
-               ASC_PRT_NEXT();
-       }
-       len = asc_prt_line(cp, leftlen, "\n");
-       ASC_PRT_NEXT();
+       seq_printf(m, " Target ID:           ");
+       for (i = 0; i <= ADV_MAX_TID; i++)
+               seq_printf(m, " %X", i);
+       seq_printf(m, "\n");
 
        if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
                word = ep_3550->disc_enable;
@@ -3388,15 +3221,11 @@ static int asc_prt_adv_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen
        } else {
                word = ep_38C1600->disc_enable;
        }
-       len = asc_prt_line(cp, leftlen, " Disconnects:         ");
-       ASC_PRT_NEXT();
-       for (i = 0; i <= ADV_MAX_TID; i++) {
-               len = asc_prt_line(cp, leftlen, " %c",
-                                  (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
-               ASC_PRT_NEXT();
-       }
-       len = asc_prt_line(cp, leftlen, "\n");
-       ASC_PRT_NEXT();
+       seq_printf(m, " Disconnects:         ");
+       for (i = 0; i <= ADV_MAX_TID; i++)
+               seq_printf(m, " %c",
+                          (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
+       seq_printf(m, "\n");
 
        if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
                word = ep_3550->tagqng_able;
@@ -3405,15 +3234,11 @@ static int asc_prt_adv_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen
        } else {
                word = ep_38C1600->tagqng_able;
        }
-       len = asc_prt_line(cp, leftlen, " Command Queuing:     ");
-       ASC_PRT_NEXT();
-       for (i = 0; i <= ADV_MAX_TID; i++) {
-               len = asc_prt_line(cp, leftlen, " %c",
-                                  (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
-               ASC_PRT_NEXT();
-       }
-       len = asc_prt_line(cp, leftlen, "\n");
-       ASC_PRT_NEXT();
+       seq_printf(m, " Command Queuing:     ");
+       for (i = 0; i <= ADV_MAX_TID; i++)
+               seq_printf(m, " %c",
+                          (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
+       seq_printf(m, "\n");
 
        if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
                word = ep_3550->start_motor;
@@ -3422,42 +3247,28 @@ static int asc_prt_adv_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen
        } else {
                word = ep_38C1600->start_motor;
        }
-       len = asc_prt_line(cp, leftlen, " Start Motor:         ");
-       ASC_PRT_NEXT();
-       for (i = 0; i <= ADV_MAX_TID; i++) {
-               len = asc_prt_line(cp, leftlen, " %c",
-                                  (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
-               ASC_PRT_NEXT();
-       }
-       len = asc_prt_line(cp, leftlen, "\n");
-       ASC_PRT_NEXT();
+       seq_printf(m, " Start Motor:         ");
+       for (i = 0; i <= ADV_MAX_TID; i++)
+               seq_printf(m, " %c",
+                          (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
+       seq_printf(m, "\n");
 
        if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
-               len = asc_prt_line(cp, leftlen, " Synchronous Transfer:");
-               ASC_PRT_NEXT();
-               for (i = 0; i <= ADV_MAX_TID; i++) {
-                       len = asc_prt_line(cp, leftlen, " %c",
-                                          (ep_3550->
-                                           sdtr_able & ADV_TID_TO_TIDMASK(i)) ?
-                                          'Y' : 'N');
-                       ASC_PRT_NEXT();
-               }
-               len = asc_prt_line(cp, leftlen, "\n");
-               ASC_PRT_NEXT();
+               seq_printf(m, " Synchronous Transfer:");
+               for (i = 0; i <= ADV_MAX_TID; i++)
+                       seq_printf(m, " %c",
+                                  (ep_3550->sdtr_able & ADV_TID_TO_TIDMASK(i)) ?
+                                  'Y' : 'N');
+               seq_printf(m, "\n");
        }
 
        if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
-               len = asc_prt_line(cp, leftlen, " Ultra Transfer:      ");
-               ASC_PRT_NEXT();
-               for (i = 0; i <= ADV_MAX_TID; i++) {
-                       len = asc_prt_line(cp, leftlen, " %c",
-                                          (ep_3550->
-                                           ultra_able & ADV_TID_TO_TIDMASK(i))
-                                          ? 'Y' : 'N');
-                       ASC_PRT_NEXT();
-               }
-               len = asc_prt_line(cp, leftlen, "\n");
-               ASC_PRT_NEXT();
+               seq_printf(m, " Ultra Transfer:      ");
+               for (i = 0; i <= ADV_MAX_TID; i++)
+                       seq_printf(m, " %c",
+                                  (ep_3550->ultra_able & ADV_TID_TO_TIDMASK(i))
+                                  ? 'Y' : 'N');
+               seq_printf(m, "\n");
        }
 
        if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
@@ -3467,21 +3278,16 @@ static int asc_prt_adv_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen
        } else {
                word = ep_38C1600->wdtr_able;
        }
-       len = asc_prt_line(cp, leftlen, " Wide Transfer:       ");
-       ASC_PRT_NEXT();
-       for (i = 0; i <= ADV_MAX_TID; i++) {
-               len = asc_prt_line(cp, leftlen, " %c",
-                                  (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
-               ASC_PRT_NEXT();
-       }
-       len = asc_prt_line(cp, leftlen, "\n");
-       ASC_PRT_NEXT();
+       seq_printf(m, " Wide Transfer:       ");
+       for (i = 0; i <= ADV_MAX_TID; i++)
+               seq_printf(m, " %c",
+                          (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
+       seq_printf(m, "\n");
 
        if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800 ||
            adv_dvc_varp->chip_type == ADV_CHIP_ASC38C1600) {
-               len = asc_prt_line(cp, leftlen,
-                                  " Synchronous Transfer Speed (Mhz):\n  ");
-               ASC_PRT_NEXT();
+               seq_printf(m,
+                          " Synchronous Transfer Speed (Mhz):\n  ");
                for (i = 0; i <= ADV_MAX_TID; i++) {
                        char *speed_str;
 
@@ -3517,99 +3323,64 @@ static int asc_prt_adv_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen
                                speed_str = "Unk";
                                break;
                        }
-                       len = asc_prt_line(cp, leftlen, "%X:%s ", i, speed_str);
-                       ASC_PRT_NEXT();
-                       if (i == 7) {
-                               len = asc_prt_line(cp, leftlen, "\n  ");
-                               ASC_PRT_NEXT();
-                       }
+                       seq_printf(m, "%X:%s ", i, speed_str);
+                       if (i == 7)
+                               seq_printf(m, "\n  ");
                        sdtr_speed >>= 4;
                }
-               len = asc_prt_line(cp, leftlen, "\n");
-               ASC_PRT_NEXT();
+               seq_printf(m, "\n");
        }
-
-       return totlen;
 }
 
 /*
  * asc_prt_driver_conf()
- *
- * Note: no single line should be greater than ASC_PRTLINE_SIZE,
- * cf. asc_prt_line().
- *
- * Return the number of characters copied into 'cp'. No more than
- * 'cplen' characters will be copied to 'cp'.
  */
-static int asc_prt_driver_conf(struct Scsi_Host *shost, char *cp, int cplen)
+static void asc_prt_driver_conf(struct seq_file *m, struct Scsi_Host *shost)
 {
        struct asc_board *boardp = shost_priv(shost);
-       int leftlen;
-       int totlen;
-       int len;
        int chip_scsi_id;
 
-       leftlen = cplen;
-       totlen = len = 0;
+       seq_printf(m,
+               "\nLinux Driver Configuration and Information for AdvanSys SCSI Host %d:\n",
+               shost->host_no);
 
-       len = asc_prt_line(cp, leftlen,
-                          "\nLinux Driver Configuration and Information for AdvanSys SCSI Host %d:\n",
-                          shost->host_no);
-       ASC_PRT_NEXT();
+       seq_printf(m,
+                  " host_busy %u, last_reset %u, max_id %u, max_lun %u, max_channel %u\n",
+                  shost->host_busy, shost->last_reset, shost->max_id,
+                  shost->max_lun, shost->max_channel);
 
-       len = asc_prt_line(cp, leftlen,
-                          " host_busy %u, last_reset %u, max_id %u, max_lun %u, max_channel %u\n",
-                          shost->host_busy, shost->last_reset, shost->max_id,
-                          shost->max_lun, shost->max_channel);
-       ASC_PRT_NEXT();
+       seq_printf(m,
+                  " unique_id %d, can_queue %d, this_id %d, sg_tablesize %u, cmd_per_lun %u\n",
+                  shost->unique_id, shost->can_queue, shost->this_id,
+                  shost->sg_tablesize, shost->cmd_per_lun);
 
-       len = asc_prt_line(cp, leftlen,
-                          " unique_id %d, can_queue %d, this_id %d, sg_tablesize %u, cmd_per_lun %u\n",
-                          shost->unique_id, shost->can_queue, shost->this_id,
-                          shost->sg_tablesize, shost->cmd_per_lun);
-       ASC_PRT_NEXT();
+       seq_printf(m,
+                  " unchecked_isa_dma %d, use_clustering %d\n",
+                  shost->unchecked_isa_dma, shost->use_clustering);
 
-       len = asc_prt_line(cp, leftlen,
-                          " unchecked_isa_dma %d, use_clustering %d\n",
-                          shost->unchecked_isa_dma, shost->use_clustering);
-       ASC_PRT_NEXT();
+       seq_printf(m,
+                  " flags 0x%x, last_reset 0x%x, jiffies 0x%x, asc_n_io_port 0x%x\n",
+                  boardp->flags, boardp->last_reset, jiffies,
+                  boardp->asc_n_io_port);
 
-       len = asc_prt_line(cp, leftlen,
-                          " flags 0x%x, last_reset 0x%x, jiffies 0x%x, asc_n_io_port 0x%x\n",
-                          boardp->flags, boardp->last_reset, jiffies,
-                          boardp->asc_n_io_port);
-       ASC_PRT_NEXT();
-
-       len = asc_prt_line(cp, leftlen, " io_port 0x%x\n", shost->io_port);
-       ASC_PRT_NEXT();
+       seq_printf(m, " io_port 0x%x\n", shost->io_port);
 
        if (ASC_NARROW_BOARD(boardp)) {
                chip_scsi_id = boardp->dvc_cfg.asc_dvc_cfg.chip_scsi_id;
        } else {
                chip_scsi_id = boardp->dvc_var.adv_dvc_var.chip_scsi_id;
        }
-
-       return totlen;
 }
 
 /*
  * asc_prt_asc_board_info()
  *
  * Print dynamic board configuration information.
- *
- * Note: no single line should be greater than ASC_PRTLINE_SIZE,
- * cf. asc_prt_line().
- *
- * Return the number of characters copied into 'cp'. No more than
- * 'cplen' characters will be copied to 'cp'.
  */
-static int asc_prt_asc_board_info(struct Scsi_Host *shost, char *cp, int cplen)
+static void asc_prt_asc_board_info(struct seq_file *m, struct Scsi_Host *shost)
 {
        struct asc_board *boardp = shost_priv(shost);
        int chip_scsi_id;
-       int leftlen;
-       int totlen;
-       int len;
        ASC_DVC_VAR *v;
        ASC_DVC_CFG *c;
        int i;
@@ -3619,105 +3390,79 @@ static int asc_prt_asc_board_info(struct Scsi_Host *shost, char *cp, int cplen)
        c = &boardp->dvc_cfg.asc_dvc_cfg;
        chip_scsi_id = c->chip_scsi_id;
 
-       leftlen = cplen;
-       totlen = len = 0;
+       seq_printf(m,
+                  "\nAsc Library Configuration and Statistics for AdvanSys SCSI Host %d:\n",
+                  shost->host_no);
 
-       len = asc_prt_line(cp, leftlen,
-                          "\nAsc Library Configuration and Statistics for AdvanSys SCSI Host %d:\n",
-                          shost->host_no);
-       ASC_PRT_NEXT();
-
-       len = asc_prt_line(cp, leftlen, " chip_version %u, mcode_date 0x%x, "
-                          "mcode_version 0x%x, err_code %u\n",
-                          c->chip_version, c->mcode_date, c->mcode_version,
-                          v->err_code);
-       ASC_PRT_NEXT();
+       seq_printf(m, " chip_version %u, mcode_date 0x%x, "
+                  "mcode_version 0x%x, err_code %u\n",
+                  c->chip_version, c->mcode_date, c->mcode_version,
+                  v->err_code);
 
        /* Current number of commands waiting for the host. */
-       len = asc_prt_line(cp, leftlen,
-                          " Total Command Pending: %d\n", v->cur_total_qng);
-       ASC_PRT_NEXT();
+       seq_printf(m,
+                  " Total Command Pending: %d\n", v->cur_total_qng);
 
-       len = asc_prt_line(cp, leftlen, " Command Queuing:");
-       ASC_PRT_NEXT();
+       seq_printf(m, " Command Queuing:");
        for (i = 0; i <= ASC_MAX_TID; i++) {
                if ((chip_scsi_id == i) ||
                    ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
                        continue;
                }
-               len = asc_prt_line(cp, leftlen, " %X:%c",
-                                  i,
-                                  (v->
-                                   use_tagged_qng & ADV_TID_TO_TIDMASK(i)) ?
-                                  'Y' : 'N');
-               ASC_PRT_NEXT();
+               seq_printf(m, " %X:%c",
+                          i,
+                          (v->use_tagged_qng & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
        }
-       len = asc_prt_line(cp, leftlen, "\n");
-       ASC_PRT_NEXT();
+       seq_printf(m, "\n");
 
        /* Current number of commands waiting for a device. */
-       len = asc_prt_line(cp, leftlen, " Command Queue Pending:");
-       ASC_PRT_NEXT();
+       seq_printf(m, " Command Queue Pending:");
        for (i = 0; i <= ASC_MAX_TID; i++) {
                if ((chip_scsi_id == i) ||
                    ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
                        continue;
                }
-               len = asc_prt_line(cp, leftlen, " %X:%u", i, v->cur_dvc_qng[i]);
-               ASC_PRT_NEXT();
+               seq_printf(m, " %X:%u", i, v->cur_dvc_qng[i]);
        }
-       len = asc_prt_line(cp, leftlen, "\n");
-       ASC_PRT_NEXT();
+       seq_printf(m, "\n");
 
        /* Current limit on number of commands that can be sent to a device. */
-       len = asc_prt_line(cp, leftlen, " Command Queue Limit:");
-       ASC_PRT_NEXT();
+       seq_printf(m, " Command Queue Limit:");
        for (i = 0; i <= ASC_MAX_TID; i++) {
                if ((chip_scsi_id == i) ||
                    ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
                        continue;
                }
-               len = asc_prt_line(cp, leftlen, " %X:%u", i, v->max_dvc_qng[i]);
-               ASC_PRT_NEXT();
+               seq_printf(m, " %X:%u", i, v->max_dvc_qng[i]);
        }
-       len = asc_prt_line(cp, leftlen, "\n");
-       ASC_PRT_NEXT();
+       seq_printf(m, "\n");
 
        /* Indicate whether the device has returned queue full status. */
-       len = asc_prt_line(cp, leftlen, " Command Queue Full:");
-       ASC_PRT_NEXT();
+       seq_printf(m, " Command Queue Full:");
        for (i = 0; i <= ASC_MAX_TID; i++) {
                if ((chip_scsi_id == i) ||
                    ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
                        continue;
                }
-               if (boardp->queue_full & ADV_TID_TO_TIDMASK(i)) {
-                       len = asc_prt_line(cp, leftlen, " %X:Y-%d",
-                                          i, boardp->queue_full_cnt[i]);
-               } else {
-                       len = asc_prt_line(cp, leftlen, " %X:N", i);
-               }
-               ASC_PRT_NEXT();
+               if (boardp->queue_full & ADV_TID_TO_TIDMASK(i))
+                       seq_printf(m, " %X:Y-%d",
+                                  i, boardp->queue_full_cnt[i]);
+               else
+                       seq_printf(m, " %X:N", i);
        }
-       len = asc_prt_line(cp, leftlen, "\n");
-       ASC_PRT_NEXT();
+       seq_printf(m, "\n");
 
-       len = asc_prt_line(cp, leftlen, " Synchronous Transfer:");
-       ASC_PRT_NEXT();
+       seq_printf(m, " Synchronous Transfer:");
        for (i = 0; i <= ASC_MAX_TID; i++) {
                if ((chip_scsi_id == i) ||
                    ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
                        continue;
                }
-               len = asc_prt_line(cp, leftlen, " %X:%c",
-                                  i,
-                                  (v->
-                                   sdtr_done & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
-                                  'N');
-               ASC_PRT_NEXT();
+               seq_printf(m, " %X:%c",
+                          i,
+                          (v->sdtr_done & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
        }
-       len = asc_prt_line(cp, leftlen, "\n");
-       ASC_PRT_NEXT();
+       seq_printf(m, "\n");
 
        for (i = 0; i <= ASC_MAX_TID; i++) {
                uchar syn_period_ix;
@@ -3728,69 +3473,48 @@ static int asc_prt_asc_board_info(struct Scsi_Host *shost, char *cp, int cplen)
                        continue;
                }
 
-               len = asc_prt_line(cp, leftlen, "  %X:", i);
-               ASC_PRT_NEXT();
+               seq_printf(m, "  %X:", i);
 
                if ((boardp->sdtr_data[i] & ASC_SYN_MAX_OFFSET) == 0) {
-                       len = asc_prt_line(cp, leftlen, " Asynchronous");
-                       ASC_PRT_NEXT();
+                       seq_printf(m, " Asynchronous");
                } else {
                        syn_period_ix =
                            (boardp->sdtr_data[i] >> 4) & (v->max_sdtr_index -
                                                           1);
 
-                       len = asc_prt_line(cp, leftlen,
-                                          " Transfer Period Factor: %d (%d.%d Mhz),",
-                                          v->sdtr_period_tbl[syn_period_ix],
-                                          250 /
-                                          v->sdtr_period_tbl[syn_period_ix],
-                                          ASC_TENTHS(250,
-                                                     v->
-                                                     sdtr_period_tbl
-                                                     [syn_period_ix]));
-                       ASC_PRT_NEXT();
+                       seq_printf(m,
+                                  " Transfer Period Factor: %d (%d.%d Mhz),",
+                                  v->sdtr_period_tbl[syn_period_ix],
+                                  250 / v->sdtr_period_tbl[syn_period_ix],
+                                  ASC_TENTHS(250,
+                                             v->sdtr_period_tbl[syn_period_ix]));
 
-                       len = asc_prt_line(cp, leftlen, " REQ/ACK Offset: %d",
-                                          boardp->
-                                          sdtr_data[i] & ASC_SYN_MAX_OFFSET);
-                       ASC_PRT_NEXT();
+                       seq_printf(m, " REQ/ACK Offset: %d",
+                                  boardp->sdtr_data[i] & ASC_SYN_MAX_OFFSET);
                }
 
                if ((v->sdtr_done & ADV_TID_TO_TIDMASK(i)) == 0) {
-                       len = asc_prt_line(cp, leftlen, "*\n");
+                       seq_printf(m, "*\n");
                        renegotiate = 1;
                } else {
-                       len = asc_prt_line(cp, leftlen, "\n");
+                       seq_printf(m, "\n");
                }
-               ASC_PRT_NEXT();
        }
 
        if (renegotiate) {
-               len = asc_prt_line(cp, leftlen,
-                                  " * = Re-negotiation pending before next command.\n");
-               ASC_PRT_NEXT();
+               seq_printf(m,
+                          " * = Re-negotiation pending before next command.\n");
        }
-
-       return totlen;
 }
 
 /*
  * asc_prt_adv_board_info()
  *
  * Print dynamic board configuration information.
- *
- * Note: no single line should be greater than ASC_PRTLINE_SIZE,
- * cf. asc_prt_line().
- *
- * Return the number of characters copied into 'cp'. No more than
- * 'cplen' characters will be copied to 'cp'.
  */
-static int asc_prt_adv_board_info(struct Scsi_Host *shost, char *cp, int cplen)
+static void asc_prt_adv_board_info(struct seq_file *m, struct Scsi_Host *shost)
 {
        struct asc_board *boardp = shost_priv(shost);
-       int leftlen;
-       int totlen;
-       int len;
        int i;
        ADV_DVC_VAR *v;
        ADV_DVC_CFG *c;
@@ -3809,47 +3533,35 @@ static int asc_prt_adv_board_info(struct Scsi_Host *shost, char *cp, int cplen)
        iop_base = v->iop_base;
        chip_scsi_id = v->chip_scsi_id;
 
-       leftlen = cplen;
-       totlen = len = 0;
-
-       len = asc_prt_line(cp, leftlen,
-                          "\nAdv Library Configuration and Statistics for AdvanSys SCSI Host %d:\n",
-                          shost->host_no);
-       ASC_PRT_NEXT();
+       seq_printf(m,
+                  "\nAdv Library Configuration and Statistics for AdvanSys SCSI Host %d:\n",
+                  shost->host_no);
 
-       len = asc_prt_line(cp, leftlen,
-                          " iop_base 0x%lx, cable_detect: %X, err_code %u\n",
-                          v->iop_base,
-                          AdvReadWordRegister(iop_base,
-                                              IOPW_SCSI_CFG1) & CABLE_DETECT,
-                          v->err_code);
-       ASC_PRT_NEXT();
+       seq_printf(m,
+                  " iop_base 0x%lx, cable_detect: %X, err_code %u\n",
+                  v->iop_base,
+                  AdvReadWordRegister(iop_base,IOPW_SCSI_CFG1) & CABLE_DETECT,
+                  v->err_code);
 
-       len = asc_prt_line(cp, leftlen, " chip_version %u, mcode_date 0x%x, "
-                          "mcode_version 0x%x\n", c->chip_version,
-                          c->mcode_date, c->mcode_version);
-       ASC_PRT_NEXT();
+       seq_printf(m, " chip_version %u, mcode_date 0x%x, "
+                  "mcode_version 0x%x\n", c->chip_version,
+                  c->mcode_date, c->mcode_version);
 
        AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
-       len = asc_prt_line(cp, leftlen, " Queuing Enabled:");
-       ASC_PRT_NEXT();
+       seq_printf(m, " Queuing Enabled:");
        for (i = 0; i <= ADV_MAX_TID; i++) {
                if ((chip_scsi_id == i) ||
                    ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
                        continue;
                }
 
-               len = asc_prt_line(cp, leftlen, " %X:%c",
-                                  i,
-                                  (tagqng_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
-                                  'N');
-               ASC_PRT_NEXT();
+               seq_printf(m, " %X:%c",
+                          i,
+                          (tagqng_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
        }
-       len = asc_prt_line(cp, leftlen, "\n");
-       ASC_PRT_NEXT();
+       seq_printf(m, "\n");
 
-       len = asc_prt_line(cp, leftlen, " Queue Limit:");
-       ASC_PRT_NEXT();
+       seq_printf(m, " Queue Limit:");
        for (i = 0; i <= ADV_MAX_TID; i++) {
                if ((chip_scsi_id == i) ||
                    ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
@@ -3859,14 +3571,11 @@ static int asc_prt_adv_board_info(struct Scsi_Host *shost, char *cp, int cplen)
                AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + i,
                                lrambyte);
 
-               len = asc_prt_line(cp, leftlen, " %X:%d", i, lrambyte);
-               ASC_PRT_NEXT();
+               seq_printf(m, " %X:%d", i, lrambyte);
        }
-       len = asc_prt_line(cp, leftlen, "\n");
-       ASC_PRT_NEXT();
+       seq_printf(m, "\n");
 
-       len = asc_prt_line(cp, leftlen, " Command Pending:");
-       ASC_PRT_NEXT();
+       seq_printf(m, " Command Pending:");
        for (i = 0; i <= ADV_MAX_TID; i++) {
                if ((chip_scsi_id == i) ||
                    ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
@@ -3876,33 +3585,26 @@ static int asc_prt_adv_board_info(struct Scsi_Host *shost, char *cp, int cplen)
                AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_QUEUED_CMD + i,
                                lrambyte);
 
-               len = asc_prt_line(cp, leftlen, " %X:%d", i, lrambyte);
-               ASC_PRT_NEXT();
+               seq_printf(m, " %X:%d", i, lrambyte);
        }
-       len = asc_prt_line(cp, leftlen, "\n");
-       ASC_PRT_NEXT();
+       seq_printf(m, "\n");
 
        AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
-       len = asc_prt_line(cp, leftlen, " Wide Enabled:");
-       ASC_PRT_NEXT();
+       seq_printf(m, " Wide Enabled:");
        for (i = 0; i <= ADV_MAX_TID; i++) {
                if ((chip_scsi_id == i) ||
                    ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
                        continue;
                }
 
-               len = asc_prt_line(cp, leftlen, " %X:%c",
-                                  i,
-                                  (wdtr_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
-                                  'N');
-               ASC_PRT_NEXT();
+               seq_printf(m, " %X:%c",
+                          i,
+                          (wdtr_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
        }
-       len = asc_prt_line(cp, leftlen, "\n");
-       ASC_PRT_NEXT();
+       seq_printf(m, "\n");
 
        AdvReadWordLram(iop_base, ASC_MC_WDTR_DONE, wdtr_done);
-       len = asc_prt_line(cp, leftlen, " Transfer Bit Width:");
-       ASC_PRT_NEXT();
+       seq_printf(m, " Transfer Bit Width:");
        for (i = 0; i <= ADV_MAX_TID; i++) {
                if ((chip_scsi_id == i) ||
                    ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
@@ -3913,37 +3615,30 @@ static int asc_prt_adv_board_info(struct Scsi_Host *shost, char *cp, int cplen)
                                ASC_MC_DEVICE_HSHK_CFG_TABLE + (2 * i),
                                lramword);
 
-               len = asc_prt_line(cp, leftlen, " %X:%d",
-                                  i, (lramword & 0x8000) ? 16 : 8);
-               ASC_PRT_NEXT();
+               seq_printf(m, " %X:%d",
+                          i, (lramword & 0x8000) ? 16 : 8);
 
                if ((wdtr_able & ADV_TID_TO_TIDMASK(i)) &&
                    (wdtr_done & ADV_TID_TO_TIDMASK(i)) == 0) {
-                       len = asc_prt_line(cp, leftlen, "*");
-                       ASC_PRT_NEXT();
+                       seq_printf(m, "*");
                        renegotiate = 1;
                }
        }
-       len = asc_prt_line(cp, leftlen, "\n");
-       ASC_PRT_NEXT();
+       seq_printf(m, "\n");
 
        AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
-       len = asc_prt_line(cp, leftlen, " Synchronous Enabled:");
-       ASC_PRT_NEXT();
+       seq_printf(m, " Synchronous Enabled:");
        for (i = 0; i <= ADV_MAX_TID; i++) {
                if ((chip_scsi_id == i) ||
                    ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
                        continue;
                }
 
-               len = asc_prt_line(cp, leftlen, " %X:%c",
-                                  i,
-                                  (sdtr_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
-                                  'N');
-               ASC_PRT_NEXT();
+               seq_printf(m, " %X:%c",
+                          i,
+                          (sdtr_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
        }
-       len = asc_prt_line(cp, leftlen, "\n");
-       ASC_PRT_NEXT();
+       seq_printf(m, "\n");
 
        AdvReadWordLram(iop_base, ASC_MC_SDTR_DONE, sdtr_done);
        for (i = 0; i <= ADV_MAX_TID; i++) {
@@ -3959,358 +3654,170 @@ static int asc_prt_adv_board_info(struct Scsi_Host *shost, char *cp, int cplen)
                        continue;
                }
 
-               len = asc_prt_line(cp, leftlen, "  %X:", i);
-               ASC_PRT_NEXT();
+               seq_printf(m, "  %X:", i);
 
                if ((lramword & 0x1F) == 0) {   /* Check for REQ/ACK Offset 0. */
-                       len = asc_prt_line(cp, leftlen, " Asynchronous");
-                       ASC_PRT_NEXT();
+                       seq_printf(m, " Asynchronous");
                } else {
-                       len =
-                           asc_prt_line(cp, leftlen,
-                                        " Transfer Period Factor: ");
-                       ASC_PRT_NEXT();
+                       seq_printf(m, " Transfer Period Factor: ");
 
                        if ((lramword & 0x1F00) == 0x1100) {    /* 80 Mhz */
-                               len =
-                                   asc_prt_line(cp, leftlen, "9 (80.0 Mhz),");
-                               ASC_PRT_NEXT();
+                               seq_printf(m, "9 (80.0 Mhz),");
                        } else if ((lramword & 0x1F00) == 0x1000) {     /* 40 Mhz */
-                               len =
-                                   asc_prt_line(cp, leftlen, "10 (40.0 Mhz),");
-                               ASC_PRT_NEXT();
+                               seq_printf(m, "10 (40.0 Mhz),");
                        } else {        /* 20 Mhz or below. */
 
                                period = (((lramword >> 8) * 25) + 50) / 4;
 
                                if (period == 0) {      /* Should never happen. */
-                                       len =
-                                           asc_prt_line(cp, leftlen,
-                                                        "%d (? Mhz), ");
-                                       ASC_PRT_NEXT();
+                                       seq_printf(m, "%d (? Mhz), ");
                                } else {
-                                       len = asc_prt_line(cp, leftlen,
-                                                          "%d (%d.%d Mhz),",
-                                                          period, 250 / period,
-                                                          ASC_TENTHS(250,
-                                                                     period));
-                                       ASC_PRT_NEXT();
+                                       seq_printf(m,
+                                                  "%d (%d.%d Mhz),",
+                                                  period, 250 / period,
+                                                  ASC_TENTHS(250, period));
                                }
                        }
 
-                       len = asc_prt_line(cp, leftlen, " REQ/ACK Offset: %d",
-                                          lramword & 0x1F);
-                       ASC_PRT_NEXT();
+                       seq_printf(m, " REQ/ACK Offset: %d",
+                                  lramword & 0x1F);
                }
 
                if ((sdtr_done & ADV_TID_TO_TIDMASK(i)) == 0) {
-                       len = asc_prt_line(cp, leftlen, "*\n");
+                       seq_printf(m, "*\n");
                        renegotiate = 1;
                } else {
-                       len = asc_prt_line(cp, leftlen, "\n");
+                       seq_printf(m, "\n");
                }
-               ASC_PRT_NEXT();
        }
 
        if (renegotiate) {
-               len = asc_prt_line(cp, leftlen,
-                                  " * = Re-negotiation pending before next command.\n");
-               ASC_PRT_NEXT();
+               seq_printf(m,
+                          " * = Re-negotiation pending before next command.\n");
        }
-
-       return totlen;
-}
-
-/*
- * asc_proc_copy()
- *
- * Copy proc information to a read buffer taking into account the current
- * read offset in the file and the remaining space in the read buffer.
- */
-static int
-asc_proc_copy(off_t advoffset, off_t offset, char *curbuf, int leftlen,
-             char *cp, int cplen)
-{
-       int cnt = 0;
-
-       ASC_DBG(2, "offset %d, advoffset %d, cplen %d\n",
-                (unsigned)offset, (unsigned)advoffset, cplen);
-       if (offset <= advoffset) {
-               /* Read offset below current offset, copy everything. */
-               cnt = min(cplen, leftlen);
-               ASC_DBG(2, "curbuf 0x%lx, cp 0x%lx, cnt %d\n",
-                        (ulong)curbuf, (ulong)cp, cnt);
-               memcpy(curbuf, cp, cnt);
-       } else if (offset < advoffset + cplen) {
-               /* Read offset within current range, partial copy. */
-               cnt = (advoffset + cplen) - offset;
-               cp = (cp + cplen) - cnt;
-               cnt = min(cnt, leftlen);
-               ASC_DBG(2, "curbuf 0x%lx, cp 0x%lx, cnt %d\n",
-                        (ulong)curbuf, (ulong)cp, cnt);
-               memcpy(curbuf, cp, cnt);
-       }
-       return cnt;
 }
 
 #ifdef ADVANSYS_STATS
 /*
  * asc_prt_board_stats()
- *
- * Note: no single line should be greater than ASC_PRTLINE_SIZE,
- * cf. asc_prt_line().
- *
- * Return the number of characters copied into 'cp'. No more than
- * 'cplen' characters will be copied to 'cp'.
  */
-static int asc_prt_board_stats(struct Scsi_Host *shost, char *cp, int cplen)
+static void asc_prt_board_stats(struct seq_file *m, struct Scsi_Host *shost)
 {
        struct asc_board *boardp = shost_priv(shost);
        struct asc_stats *s = &boardp->asc_stats;
 
-       int leftlen = cplen;
-       int len, totlen = 0;
+       seq_printf(m,
+                  "\nLinux Driver Statistics for AdvanSys SCSI Host %d:\n",
+                  shost->host_no);
 
-       len = asc_prt_line(cp, leftlen,
-                          "\nLinux Driver Statistics for AdvanSys SCSI Host %d:\n",
-                          shost->host_no);
-       ASC_PRT_NEXT();
+       seq_printf(m,
+                  " queuecommand %lu, reset %lu, biosparam %lu, interrupt %lu\n",
+                  s->queuecommand, s->reset, s->biosparam,
+                  s->interrupt);
 
-       len = asc_prt_line(cp, leftlen,
-                          " queuecommand %lu, reset %lu, biosparam %lu, interrupt %lu\n",
-                          s->queuecommand, s->reset, s->biosparam,
-                          s->interrupt);
-       ASC_PRT_NEXT();
+       seq_printf(m,
+                  " callback %lu, done %lu, build_error %lu, build_noreq %lu, build_nosg %lu\n",
+                  s->callback, s->done, s->build_error,
+                  s->adv_build_noreq, s->adv_build_nosg);
 
-       len = asc_prt_line(cp, leftlen,
-                          " callback %lu, done %lu, build_error %lu, build_noreq %lu, build_nosg %lu\n",
-                          s->callback, s->done, s->build_error,
-                          s->adv_build_noreq, s->adv_build_nosg);
-       ASC_PRT_NEXT();
-
-       len = asc_prt_line(cp, leftlen,
-                          " exe_noerror %lu, exe_busy %lu, exe_error %lu, exe_unknown %lu\n",
-                          s->exe_noerror, s->exe_busy, s->exe_error,
-                          s->exe_unknown);
-       ASC_PRT_NEXT();
+       seq_printf(m,
+                  " exe_noerror %lu, exe_busy %lu, exe_error %lu, exe_unknown %lu\n",
+                  s->exe_noerror, s->exe_busy, s->exe_error,
+                  s->exe_unknown);
 
        /*
         * Display data transfer statistics.
         */
        if (s->xfer_cnt > 0) {
-               len = asc_prt_line(cp, leftlen, " xfer_cnt %lu, xfer_elem %lu, ",
-                                  s->xfer_cnt, s->xfer_elem);
-               ASC_PRT_NEXT();
+               seq_printf(m, " xfer_cnt %lu, xfer_elem %lu, ",
+                          s->xfer_cnt, s->xfer_elem);
 
-               len = asc_prt_line(cp, leftlen, "xfer_bytes %lu.%01lu kb\n",
-                                  s->xfer_sect / 2, ASC_TENTHS(s->xfer_sect, 2));
-               ASC_PRT_NEXT();
+               seq_printf(m, "xfer_bytes %lu.%01lu kb\n",
+                          s->xfer_sect / 2, ASC_TENTHS(s->xfer_sect, 2));
 
                /* Scatter gather transfer statistics */
-               len = asc_prt_line(cp, leftlen, " avg_num_elem %lu.%01lu, ",
-                                  s->xfer_elem / s->xfer_cnt,
-                                  ASC_TENTHS(s->xfer_elem, s->xfer_cnt));
-               ASC_PRT_NEXT();
+               seq_printf(m, " avg_num_elem %lu.%01lu, ",
+                          s->xfer_elem / s->xfer_cnt,
+                          ASC_TENTHS(s->xfer_elem, s->xfer_cnt));
 
-               len = asc_prt_line(cp, leftlen, "avg_elem_size %lu.%01lu kb, ",
-                                  (s->xfer_sect / 2) / s->xfer_elem,
-                                  ASC_TENTHS((s->xfer_sect / 2), s->xfer_elem));
-               ASC_PRT_NEXT();
+               seq_printf(m, "avg_elem_size %lu.%01lu kb, ",
+                          (s->xfer_sect / 2) / s->xfer_elem,
+                          ASC_TENTHS((s->xfer_sect / 2), s->xfer_elem));
 
-               len = asc_prt_line(cp, leftlen, "avg_xfer_size %lu.%01lu kb\n",
-                                  (s->xfer_sect / 2) / s->xfer_cnt,
-                                  ASC_TENTHS((s->xfer_sect / 2), s->xfer_cnt));
-               ASC_PRT_NEXT();
+               seq_printf(m, "avg_xfer_size %lu.%01lu kb\n",
+                          (s->xfer_sect / 2) / s->xfer_cnt,
+                          ASC_TENTHS((s->xfer_sect / 2), s->xfer_cnt));
        }
-
-       return totlen;
 }
 #endif /* ADVANSYS_STATS */
 
 /*
- * advansys_proc_info() - /proc/scsi/advansys/{0,1,2,3,...}
+ * advansys_show_info() - /proc/scsi/advansys/{0,1,2,3,...}
  *
- * *buffer: I/O buffer
- * **start: if inout == FALSE pointer into buffer where user read should start
- * offset: current offset into a /proc/scsi/advansys/[0...] file
- * length: length of buffer
- * hostno: Scsi_Host host_no
- * inout: TRUE - user is writing; FALSE - user is reading
+ * m: seq_file to print into
+ * shost: Scsi_Host
  *
  * Return the number of bytes read from or written to a
  * /proc/scsi/advansys/[0...] file.
- *
- * Note: This function uses the per board buffer 'prtbuf' which is
- * allocated when the board is initialized in advansys_detect(). The
- * buffer is ASC_PRTBUF_SIZE bytes. The function asc_proc_copy() is
- * used to write to the buffer. The way asc_proc_copy() is written
- * if 'prtbuf' is too small it will not be overwritten. Instead the
- * user just won't get all the available statistics.
  */
 static int
-advansys_proc_info(struct Scsi_Host *shost, char *buffer, char **start,
-                  off_t offset, int length, int inout)
+advansys_show_info(struct seq_file *m, struct Scsi_Host *shost)
 {
        struct asc_board *boardp = shost_priv(shost);
-       char *cp;
-       int cplen;
-       int cnt;
-       int totcnt;
-       int leftlen;
-       char *curbuf;
-       off_t advoffset;
 
        ASC_DBG(1, "begin\n");
 
-       /*
-        * User write not supported.
-        */
-       if (inout == TRUE)
-               return -ENOSYS;
-
        /*
         * User read of /proc/scsi/advansys/[0...] file.
         */
 
-       /* Copy read data starting at the beginning of the buffer. */
-       *start = buffer;
-       curbuf = buffer;
-       advoffset = 0;
-       totcnt = 0;
-       leftlen = length;
-
        /*
         * Get board configuration information.
         *
         * advansys_info() returns the board string from its own static buffer.
         */
-       cp = (char *)advansys_info(shost);
-       strcat(cp, "\n");
-       cplen = strlen(cp);
        /* Copy board information. */
-       cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
-       totcnt += cnt;
-       leftlen -= cnt;
-       if (leftlen == 0) {
-               ASC_DBG(1, "totcnt %d\n", totcnt);
-               return totcnt;
-       }
-       advoffset += cplen;
-       curbuf += cnt;
-
+       seq_printf(m, "%s\n", (char *)advansys_info(shost));
        /*
         * Display Wide Board BIOS Information.
         */
-       if (!ASC_NARROW_BOARD(boardp)) {
-               cp = boardp->prtbuf;
-               cplen = asc_prt_adv_bios(shost, cp, ASC_PRTBUF_SIZE);
-               BUG_ON(cplen >= ASC_PRTBUF_SIZE);
-               cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp,
-                                 cplen);
-               totcnt += cnt;
-               leftlen -= cnt;
-               if (leftlen == 0) {
-                       ASC_DBG(1, "totcnt %d\n", totcnt);
-                       return totcnt;
-               }
-               advoffset += cplen;
-               curbuf += cnt;
-       }
+       if (!ASC_NARROW_BOARD(boardp))
+               asc_prt_adv_bios(m, shost);
 
        /*
         * Display driver information for each device attached to the board.
         */
-       cp = boardp->prtbuf;
-       cplen = asc_prt_board_devices(shost, cp, ASC_PRTBUF_SIZE);
-       BUG_ON(cplen >= ASC_PRTBUF_SIZE);
-       cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
-       totcnt += cnt;
-       leftlen -= cnt;
-       if (leftlen == 0) {
-               ASC_DBG(1, "totcnt %d\n", totcnt);
-               return totcnt;
-       }
-       advoffset += cplen;
-       curbuf += cnt;
+       asc_prt_board_devices(m, shost);
 
        /*
         * Display EEPROM configuration for the board.
         */
-       cp = boardp->prtbuf;
-       if (ASC_NARROW_BOARD(boardp)) {
-               cplen = asc_prt_asc_board_eeprom(shost, cp, ASC_PRTBUF_SIZE);
-       } else {
-               cplen = asc_prt_adv_board_eeprom(shost, cp, ASC_PRTBUF_SIZE);
-       }
-       BUG_ON(cplen >= ASC_PRTBUF_SIZE);
-       cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
-       totcnt += cnt;
-       leftlen -= cnt;
-       if (leftlen == 0) {
-               ASC_DBG(1, "totcnt %d\n", totcnt);
-               return totcnt;
-       }
-       advoffset += cplen;
-       curbuf += cnt;
+       if (ASC_NARROW_BOARD(boardp))
+               asc_prt_asc_board_eeprom(m, shost);
+       else
+               asc_prt_adv_board_eeprom(m, shost);
 
        /*
         * Display driver configuration and information for the board.
         */
-       cp = boardp->prtbuf;
-       cplen = asc_prt_driver_conf(shost, cp, ASC_PRTBUF_SIZE);
-       BUG_ON(cplen >= ASC_PRTBUF_SIZE);
-       cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
-       totcnt += cnt;
-       leftlen -= cnt;
-       if (leftlen == 0) {
-               ASC_DBG(1, "totcnt %d\n", totcnt);
-               return totcnt;
-       }
-       advoffset += cplen;
-       curbuf += cnt;
+       asc_prt_driver_conf(m, shost);
 
 #ifdef ADVANSYS_STATS
        /*
         * Display driver statistics for the board.
         */
-       cp = boardp->prtbuf;
-       cplen = asc_prt_board_stats(shost, cp, ASC_PRTBUF_SIZE);
-       BUG_ON(cplen >= ASC_PRTBUF_SIZE);
-       cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
-       totcnt += cnt;
-       leftlen -= cnt;
-       if (leftlen == 0) {
-               ASC_DBG(1, "totcnt %d\n", totcnt);
-               return totcnt;
-       }
-       advoffset += cplen;
-       curbuf += cnt;
+       asc_prt_board_stats(m, shost);
 #endif /* ADVANSYS_STATS */
 
        /*
         * Display Asc Library dynamic configuration information
         * for the board.
         */
-       cp = boardp->prtbuf;
-       if (ASC_NARROW_BOARD(boardp)) {
-               cplen = asc_prt_asc_board_info(shost, cp, ASC_PRTBUF_SIZE);
-       } else {
-               cplen = asc_prt_adv_board_info(shost, cp, ASC_PRTBUF_SIZE);
-       }
-       BUG_ON(cplen >= ASC_PRTBUF_SIZE);
-       cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
-       totcnt += cnt;
-       leftlen -= cnt;
-       if (leftlen == 0) {
-               ASC_DBG(1, "totcnt %d\n", totcnt);
-               return totcnt;
-       }
-       advoffset += cplen;
-       curbuf += cnt;
-
-       ASC_DBG(1, "totcnt %d\n", totcnt);
-
-       return totcnt;
+       if (ASC_NARROW_BOARD(boardp))
+               asc_prt_asc_board_info(m, shost);
+       else
+               asc_prt_adv_board_info(m, shost);
+       return 0;
 }
 #endif /* CONFIG_PROC_FS */
 
@@ -11743,7 +11250,7 @@ static int AdvInitGetConfig(struct pci_dev *pdev, struct Scsi_Host *shost)
 static struct scsi_host_template advansys_template = {
        .proc_name = DRV_NAME,
 #ifdef CONFIG_PROC_FS
-       .proc_info = advansys_proc_info,
+       .show_info = advansys_show_info,
 #endif
        .name = DRV_NAME,
        .info = advansys_info,
@@ -11939,20 +11446,6 @@ static int advansys_board_found(struct Scsi_Host *shost, unsigned int iop,
 #endif /* CONFIG_PCI */
        }
 
-#ifdef CONFIG_PROC_FS
-       /*
-        * Allocate buffer for printing information from
-        * /proc/scsi/advansys/[0...].
-        */
-       boardp->prtbuf = kmalloc(ASC_PRTBUF_SIZE, GFP_KERNEL);
-       if (!boardp->prtbuf) {
-               shost_printk(KERN_ERR, shost, "kmalloc(%d) returned NULL\n",
-                               ASC_PRTBUF_SIZE);
-               ret = -ENOMEM;
-               goto err_unmap;
-       }
-#endif /* CONFIG_PROC_FS */
-
        if (ASC_NARROW_BOARD(boardp)) {
                /*
                 * Set the board bus type and PCI IRQ before
@@ -12010,7 +11503,7 @@ static int advansys_board_found(struct Scsi_Host *shost, unsigned int iop,
        }
 
        if (ret)
-               goto err_free_proc;
+               goto err_unmap;
 
        /*
         * Save the EEPROM configuration so that it can be displayed
@@ -12055,7 +11548,7 @@ static int advansys_board_found(struct Scsi_Host *shost, unsigned int iop,
                ASC_DBG(2, "AscInitSetConfig()\n");
                ret = AscInitSetConfig(pdev, shost) ? -ENODEV : 0;
                if (ret)
-                       goto err_free_proc;
+                       goto err_unmap;
        } else {
                ADVEEP_3550_CONFIG *ep_3550;
                ADVEEP_38C0800_CONFIG *ep_38C0800;
@@ -12290,7 +11783,7 @@ static int advansys_board_found(struct Scsi_Host *shost, unsigned int iop,
                                shost_printk(KERN_ERR, shost, "request_dma() "
                                                "%d failed %d\n",
                                                shost->dma_channel, ret);
-                               goto err_free_proc;
+                               goto err_unmap;
                        }
                        AscEnableIsaDma(shost->dma_channel);
                }
@@ -12371,8 +11864,6 @@ static int advansys_board_found(struct Scsi_Host *shost, unsigned int iop,
        if (shost->dma_channel != NO_ISA_DMA)
                free_dma(shost->dma_channel);
 #endif
- err_free_proc:
-       kfree(boardp->prtbuf);
  err_unmap:
        if (boardp->ioremap_addr)
                iounmap(boardp->ioremap_addr);
@@ -12406,7 +11897,6 @@ static int advansys_release(struct Scsi_Host *shost)
                iounmap(board->ioremap_addr);
                advansys_wide_free_mem(board);
        }
-       kfree(board->prtbuf);
        scsi_host_put(shost);
        ASC_DBG(1, "end\n");
        return 0;