diff options
Diffstat (limited to 'drivers/scsi/advansys.c')
| -rw-r--r-- | drivers/scsi/advansys.c | 1164 | 
1 files changed, 327 insertions, 837 deletions
| diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c index dcfaee66a8b9..c67e401954c5 100644 --- a/drivers/scsi/advansys.c +++ b/drivers/scsi/advansys.c @@ -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 %lu, 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%lx, jiffies 0x%lx, 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%lx\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", +		   (unsigned long)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), ", period);  				} 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 %u, reset %u, biosparam %u, interrupt %u\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 %u, done %u, build_error %u, build_noreq %u, build_nosg %u\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 %u, exe_busy %u, exe_error %u, exe_unknown %u\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 %u, xfer_elem %u, ", +			   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 %u.%01u 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 %u.%01u, ", +			   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 %u.%01u 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 %u.%01u 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; | 
