diff options
Diffstat (limited to 'drivers/scsi')
70 files changed, 1566 insertions, 3516 deletions
diff --git a/drivers/scsi/BusLogic.c b/drivers/scsi/BusLogic.c index d7ca247efa3..344d87599cd 100644 --- a/drivers/scsi/BusLogic.c +++ b/drivers/scsi/BusLogic.c @@ -3201,26 +3201,30 @@ static int BusLogic_BIOSDiskParameters(struct scsi_device *sdev, struct block_de    BugLogic_ProcDirectoryInfo implements /proc/scsi/BusLogic/<N>.  */ -static int BusLogic_ProcDirectoryInfo(struct Scsi_Host *shost, char *ProcBuffer, char **StartPointer, off_t Offset, int BytesAvailable, int WriteFlag) +static int BusLogic_write_info(struct Scsi_Host *shost, char *ProcBuffer, int BytesAvailable)  {  	struct BusLogic_HostAdapter *HostAdapter = (struct BusLogic_HostAdapter *) shost->hostdata;  	struct BusLogic_TargetStatistics *TargetStatistics; -	int TargetID, Length; -	char *Buffer;  	TargetStatistics = HostAdapter->TargetStatistics; -	if (WriteFlag) { -		HostAdapter->ExternalHostAdapterResets = 0; -		HostAdapter->HostAdapterInternalErrors = 0; -		memset(TargetStatistics, 0, BusLogic_MaxTargetDevices * sizeof(struct BusLogic_TargetStatistics)); -		return 0; -	} -	Buffer = HostAdapter->MessageBuffer; -	Length = HostAdapter->MessageBufferLength; -	Length += sprintf(&Buffer[Length], "\n\ +	HostAdapter->ExternalHostAdapterResets = 0; +	HostAdapter->HostAdapterInternalErrors = 0; +	memset(TargetStatistics, 0, BusLogic_MaxTargetDevices * sizeof(struct BusLogic_TargetStatistics)); +	return 0; +} + +static int BusLogic_show_info(struct seq_file *m, struct Scsi_Host *shost) +{ +	struct BusLogic_HostAdapter *HostAdapter = (struct BusLogic_HostAdapter *) shost->hostdata; +	struct BusLogic_TargetStatistics *TargetStatistics; +	int TargetID; + +	TargetStatistics = HostAdapter->TargetStatistics; +	seq_write(m, HostAdapter->MessageBuffer, HostAdapter->MessageBufferLength); +	seq_printf(m, "\n\  Current Driver Queue Depth:	%d\n\  Currently Allocated CCBs:	%d\n", HostAdapter->DriverQueueDepth, HostAdapter->AllocatedCCBs); -	Length += sprintf(&Buffer[Length], "\n\n\ +	seq_printf(m, "\n\n\  			   DATA TRANSFER STATISTICS\n\  \n\  Target	Tagged Queuing	Queue Depth  Active  Attempted	Completed\n\ @@ -3229,66 +3233,62 @@ Target	Tagged Queuing	Queue Depth  Active  Attempted	Completed\n\  		struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[TargetID];  		if (!TargetFlags->TargetExists)  			continue; -		Length += sprintf(&Buffer[Length], "  %2d	%s", TargetID, (TargetFlags->TaggedQueuingSupported ? (TargetFlags->TaggedQueuingActive ? "    Active" : (HostAdapter->TaggedQueuingPermitted & (1 << TargetID) +		seq_printf(m, "  %2d	%s", TargetID, (TargetFlags->TaggedQueuingSupported ? (TargetFlags->TaggedQueuingActive ? "    Active" : (HostAdapter->TaggedQueuingPermitted & (1 << TargetID)  																				    ? "  Permitted" : "   Disabled"))  									  : "Not Supported")); -		Length += sprintf(&Buffer[Length], +		seq_printf(m,  				  "	    %3d       %3u    %9u	%9u\n", HostAdapter->QueueDepth[TargetID], HostAdapter->ActiveCommands[TargetID], TargetStatistics[TargetID].CommandsAttempted, TargetStatistics[TargetID].CommandsCompleted);  	} -	Length += sprintf(&Buffer[Length], "\n\ +	seq_printf(m, "\n\  Target  Read Commands  Write Commands   Total Bytes Read    Total Bytes Written\n\  ======  =============  ==============  ===================  ===================\n");  	for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++) {  		struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[TargetID];  		if (!TargetFlags->TargetExists)  			continue; -		Length += sprintf(&Buffer[Length], "  %2d	  %9u	 %9u", TargetID, TargetStatistics[TargetID].ReadCommands, TargetStatistics[TargetID].WriteCommands); +		seq_printf(m, "  %2d	  %9u	 %9u", TargetID, TargetStatistics[TargetID].ReadCommands, TargetStatistics[TargetID].WriteCommands);  		if (TargetStatistics[TargetID].TotalBytesRead.Billions > 0) -			Length += sprintf(&Buffer[Length], "     %9u%09u", TargetStatistics[TargetID].TotalBytesRead.Billions, TargetStatistics[TargetID].TotalBytesRead.Units); +			seq_printf(m, "     %9u%09u", TargetStatistics[TargetID].TotalBytesRead.Billions, TargetStatistics[TargetID].TotalBytesRead.Units);  		else -			Length += sprintf(&Buffer[Length], "		%9u", TargetStatistics[TargetID].TotalBytesRead.Units); +			seq_printf(m, "		%9u", TargetStatistics[TargetID].TotalBytesRead.Units);  		if (TargetStatistics[TargetID].TotalBytesWritten.Billions > 0) -			Length += sprintf(&Buffer[Length], "   %9u%09u\n", TargetStatistics[TargetID].TotalBytesWritten.Billions, TargetStatistics[TargetID].TotalBytesWritten.Units); +			seq_printf(m, "   %9u%09u\n", TargetStatistics[TargetID].TotalBytesWritten.Billions, TargetStatistics[TargetID].TotalBytesWritten.Units);  		else -			Length += sprintf(&Buffer[Length], "	     %9u\n", TargetStatistics[TargetID].TotalBytesWritten.Units); +			seq_printf(m, "	     %9u\n", TargetStatistics[TargetID].TotalBytesWritten.Units);  	} -	Length += sprintf(&Buffer[Length], "\n\ +	seq_printf(m, "\n\  Target  Command    0-1KB      1-2KB      2-4KB      4-8KB     8-16KB\n\  ======  =======  =========  =========  =========  =========  =========\n");  	for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++) {  		struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[TargetID];  		if (!TargetFlags->TargetExists)  			continue; -		Length += -		    sprintf(&Buffer[Length], +		seq_printf(m,  			    "  %2d	 Read	 %9u  %9u  %9u  %9u  %9u\n", TargetID,  			    TargetStatistics[TargetID].ReadCommandSizeBuckets[0],  			    TargetStatistics[TargetID].ReadCommandSizeBuckets[1], TargetStatistics[TargetID].ReadCommandSizeBuckets[2], TargetStatistics[TargetID].ReadCommandSizeBuckets[3], TargetStatistics[TargetID].ReadCommandSizeBuckets[4]); -		Length += -		    sprintf(&Buffer[Length], +		seq_printf(m,  			    "  %2d	 Write	 %9u  %9u  %9u  %9u  %9u\n", TargetID,  			    TargetStatistics[TargetID].WriteCommandSizeBuckets[0],  			    TargetStatistics[TargetID].WriteCommandSizeBuckets[1], TargetStatistics[TargetID].WriteCommandSizeBuckets[2], TargetStatistics[TargetID].WriteCommandSizeBuckets[3], TargetStatistics[TargetID].WriteCommandSizeBuckets[4]);  	} -	Length += sprintf(&Buffer[Length], "\n\ +	seq_printf(m, "\n\  Target  Command   16-32KB    32-64KB   64-128KB   128-256KB   256KB+\n\  ======  =======  =========  =========  =========  =========  =========\n");  	for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++) {  		struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[TargetID];  		if (!TargetFlags->TargetExists)  			continue; -		Length += -		    sprintf(&Buffer[Length], +		seq_printf(m,  			    "  %2d	 Read	 %9u  %9u  %9u  %9u  %9u\n", TargetID,  			    TargetStatistics[TargetID].ReadCommandSizeBuckets[5],  			    TargetStatistics[TargetID].ReadCommandSizeBuckets[6], TargetStatistics[TargetID].ReadCommandSizeBuckets[7], TargetStatistics[TargetID].ReadCommandSizeBuckets[8], TargetStatistics[TargetID].ReadCommandSizeBuckets[9]); -		Length += -		    sprintf(&Buffer[Length], +		seq_printf(m,  			    "  %2d	 Write	 %9u  %9u  %9u  %9u  %9u\n", TargetID,  			    TargetStatistics[TargetID].WriteCommandSizeBuckets[5],  			    TargetStatistics[TargetID].WriteCommandSizeBuckets[6], TargetStatistics[TargetID].WriteCommandSizeBuckets[7], TargetStatistics[TargetID].WriteCommandSizeBuckets[8], TargetStatistics[TargetID].WriteCommandSizeBuckets[9]);  	} -	Length += sprintf(&Buffer[Length], "\n\n\ +	seq_printf(m, "\n\n\  			   ERROR RECOVERY STATISTICS\n\  \n\  	  Command Aborts      Bus Device Resets	  Host Adapter Resets\n\ @@ -3299,20 +3299,12 @@ Target	Requested Completed  Requested Completed  Requested Completed\n\  		struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[TargetID];  		if (!TargetFlags->TargetExists)  			continue; -		Length += sprintf(&Buffer[Length], "\ +		seq_printf(m, "\    %2d	 %5d %5d %5d    %5d %5d %5d	   %5d %5d %5d\n", TargetID, TargetStatistics[TargetID].CommandAbortsRequested, TargetStatistics[TargetID].CommandAbortsAttempted, TargetStatistics[TargetID].CommandAbortsCompleted, TargetStatistics[TargetID].BusDeviceResetsRequested, TargetStatistics[TargetID].BusDeviceResetsAttempted, TargetStatistics[TargetID].BusDeviceResetsCompleted, TargetStatistics[TargetID].HostAdapterResetsRequested, TargetStatistics[TargetID].HostAdapterResetsAttempted, TargetStatistics[TargetID].HostAdapterResetsCompleted);  	} -	Length += sprintf(&Buffer[Length], "\nExternal Host Adapter Resets: %d\n", HostAdapter->ExternalHostAdapterResets); -	Length += sprintf(&Buffer[Length], "Host Adapter Internal Errors: %d\n", HostAdapter->HostAdapterInternalErrors); -	if (Length >= BusLogic_MessageBufferSize) -		BusLogic_Error("Message Buffer length %d exceeds size %d\n", HostAdapter, Length, BusLogic_MessageBufferSize); -	if ((Length -= Offset) <= 0) -		return 0; -	if (Length >= BytesAvailable) -		Length = BytesAvailable; -	memcpy(ProcBuffer, HostAdapter->MessageBuffer + Offset, Length); -	*StartPointer = ProcBuffer; -	return Length; +	seq_printf(m, "\nExternal Host Adapter Resets: %d\n", HostAdapter->ExternalHostAdapterResets); +	seq_printf(m, "Host Adapter Internal Errors: %d\n", HostAdapter->HostAdapterInternalErrors); +	return 0;  } @@ -3566,7 +3558,8 @@ static int __init BusLogic_ParseDriverOptions(char *OptionsString)  static struct scsi_host_template Bus_Logic_template = {  	.module = THIS_MODULE,  	.proc_name = "BusLogic", -	.proc_info = BusLogic_ProcDirectoryInfo, +	.write_info = BusLogic_write_info, +	.show_info = BusLogic_show_info,  	.name = "BusLogic",  	.info = BusLogic_DriverInfo,  	.queuecommand = BusLogic_QueueCommand, diff --git a/drivers/scsi/BusLogic.h b/drivers/scsi/BusLogic.h index 649fcb31f26..6c6c13c3be1 100644 --- a/drivers/scsi/BusLogic.h +++ b/drivers/scsi/BusLogic.h @@ -1321,7 +1321,6 @@ static inline void BusLogic_IncrementSizeBucket(BusLogic_CommandSizeBuckets_T Co  static const char *BusLogic_DriverInfo(struct Scsi_Host *);  static int BusLogic_QueueCommand(struct Scsi_Host *h, struct scsi_cmnd *);  static int BusLogic_BIOSDiskParameters(struct scsi_device *, struct block_device *, sector_t, int *); -static int BusLogic_ProcDirectoryInfo(struct Scsi_Host *, char *, char **, off_t, int, int);  static int BusLogic_SlaveConfigure(struct scsi_device *);  static void BusLogic_QueueCompletedCCB(struct BusLogic_CCB *);  static irqreturn_t BusLogic_InterruptHandler(int, void *); diff --git a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c index 450353e04dd..1e9d6ad9302 100644 --- a/drivers/scsi/NCR5380.c +++ b/drivers/scsi/NCR5380.c @@ -695,33 +695,35 @@ static void NCR5380_print_status(struct Scsi_Host *instance)   * Return the number of bytes read from or written   */ +static int __maybe_unused NCR5380_write_info(struct Scsi_Host *instance, +	char *buffer, int length) +{ +#ifdef DTC_PUBLIC_RELEASE +	dtc_wmaxi = dtc_maxi = 0; +#endif +#ifdef PAS16_PUBLIC_RELEASE +	pas_wmaxi = pas_maxi = 0; +#endif +	return (-ENOSYS);	/* Currently this is a no-op */ +} +  #undef SPRINTF -#define SPRINTF(args...) do { if(pos < buffer + length-80) pos += sprintf(pos, ## args); } while(0) +#define SPRINTF(args...) seq_printf(m, ## args)  static -char *lprint_Scsi_Cmnd(Scsi_Cmnd * cmd, char *pos, char *buffer, int length); +void lprint_Scsi_Cmnd(Scsi_Cmnd * cmd, struct seq_file *m);  static -char *lprint_command(unsigned char *cmd, char *pos, char *buffer, int len); +void lprint_command(unsigned char *cmd, struct seq_file *m);  static -char *lprint_opcode(int opcode, char *pos, char *buffer, int length); +void lprint_opcode(int opcode, struct seq_file *m); -static int __maybe_unused NCR5380_proc_info(struct Scsi_Host *instance, -	char *buffer, char **start, off_t offset, int length, int inout) +static int __maybe_unused NCR5380_show_info(struct seq_file *m, +	struct Scsi_Host *instance)  { -	char *pos = buffer;  	struct NCR5380_hostdata *hostdata;  	Scsi_Cmnd *ptr;  	hostdata = (struct NCR5380_hostdata *) instance->hostdata; -	if (inout) {		/* Has data been written to the file ? */ -#ifdef DTC_PUBLIC_RELEASE -		dtc_wmaxi = dtc_maxi = 0; -#endif -#ifdef PAS16_PUBLIC_RELEASE -		pas_wmaxi = pas_maxi = 0; -#endif -		return (-ENOSYS);	/* Currently this is a no-op */ -	}  	SPRINTF("NCR5380 core release=%d.   ", NCR5380_PUBLIC_RELEASE);  	if (((struct NCR5380_hostdata *) instance->hostdata)->flags & FLAG_NCR53C400)  		SPRINTF("ncr53c400 release=%d.  ", NCR53C400_PUBLIC_RELEASE); @@ -755,46 +757,37 @@ static int __maybe_unused NCR5380_proc_info(struct Scsi_Host *instance,  	if (!hostdata->connected)  		SPRINTF("scsi%d: no currently connected command\n", instance->host_no);  	else -		pos = lprint_Scsi_Cmnd((Scsi_Cmnd *) hostdata->connected, pos, buffer, length); +		lprint_Scsi_Cmnd((Scsi_Cmnd *) hostdata->connected, m);  	SPRINTF("scsi%d: issue_queue\n", instance->host_no);  	for (ptr = (Scsi_Cmnd *) hostdata->issue_queue; ptr; ptr = (Scsi_Cmnd *) ptr->host_scribble) -		pos = lprint_Scsi_Cmnd(ptr, pos, buffer, length); +		lprint_Scsi_Cmnd(ptr, m);  	SPRINTF("scsi%d: disconnected_queue\n", instance->host_no);  	for (ptr = (Scsi_Cmnd *) hostdata->disconnected_queue; ptr; ptr = (Scsi_Cmnd *) ptr->host_scribble) -		pos = lprint_Scsi_Cmnd(ptr, pos, buffer, length); +		lprint_Scsi_Cmnd(ptr, m);  	spin_unlock_irq(instance->host_lock); -	 -	*start = buffer; -	if (pos - buffer < offset) -		return 0; -	else if (pos - buffer - offset < length) -		return pos - buffer - offset; -	return length; +	return 0;  } -static char *lprint_Scsi_Cmnd(Scsi_Cmnd * cmd, char *pos, char *buffer, int length) +static void lprint_Scsi_Cmnd(Scsi_Cmnd * cmd, struct seq_file *m)  {  	SPRINTF("scsi%d : destination target %d, lun %d\n", cmd->device->host->host_no, cmd->device->id, cmd->device->lun);  	SPRINTF("        command = "); -	pos = lprint_command(cmd->cmnd, pos, buffer, length); -	return (pos); +	lprint_command(cmd->cmnd, m);  } -static char *lprint_command(unsigned char *command, char *pos, char *buffer, int length) +static void lprint_command(unsigned char *command, struct seq_file *m)  {  	int i, s; -	pos = lprint_opcode(command[0], pos, buffer, length); +	lprint_opcode(command[0], m);  	for (i = 1, s = COMMAND_SIZE(command[0]); i < s; ++i)  		SPRINTF("%02x ", command[i]);  	SPRINTF("\n"); -	return (pos);  } -static char *lprint_opcode(int opcode, char *pos, char *buffer, int length) +static void lprint_opcode(int opcode, struct seq_file *m)  {  	SPRINTF("%2d (0x%02x)", opcode, opcode); -	return (pos);  } diff --git a/drivers/scsi/NCR5380.h b/drivers/scsi/NCR5380.h index fd40a32b1f6..14964d0a0e9 100644 --- a/drivers/scsi/NCR5380.h +++ b/drivers/scsi/NCR5380.h @@ -314,8 +314,10 @@ static void NCR5380_print(struct Scsi_Host *instance);  static int NCR5380_abort(Scsi_Cmnd * cmd);  static int NCR5380_bus_reset(Scsi_Cmnd * cmd);  static int NCR5380_queue_command(struct Scsi_Host *, struct scsi_cmnd *); -static int __maybe_unused NCR5380_proc_info(struct Scsi_Host *instance, -	char *buffer, char **start, off_t offset, int length, int inout); +static int __maybe_unused NCR5380_show_info(struct seq_file *, +	struct Scsi_Host *); +static int __maybe_unused NCR5380_write_info(struct Scsi_Host *instance, +	char *buffer, int length);  static void NCR5380_reselect(struct Scsi_Host *instance);  static int NCR5380_select(struct Scsi_Host *instance, Scsi_Cmnd * cmd, int tag); diff --git a/drivers/scsi/a2091.c b/drivers/scsi/a2091.c index 3e09aa21c1c..30fa38a0ad3 100644 --- a/drivers/scsi/a2091.c +++ b/drivers/scsi/a2091.c @@ -166,7 +166,8 @@ static int a2091_bus_reset(struct scsi_cmnd *cmd)  static struct scsi_host_template a2091_scsi_template = {  	.module			= THIS_MODULE,  	.name			= "Commodore A2091/A590 SCSI", -	.proc_info		= wd33c93_proc_info, +	.show_info		= wd33c93_show_info, +	.write_info		= wd33c93_write_info,  	.proc_name		= "A2901",  	.queuecommand		= wd33c93_queuecommand,  	.eh_abort_handler	= wd33c93_abort, diff --git a/drivers/scsi/a3000.c b/drivers/scsi/a3000.c index e29fe0e708f..c487916a9d4 100644 --- a/drivers/scsi/a3000.c +++ b/drivers/scsi/a3000.c @@ -181,7 +181,8 @@ static int a3000_bus_reset(struct scsi_cmnd *cmd)  static struct scsi_host_template amiga_a3000_scsi_template = {  	.module			= THIS_MODULE,  	.name			= "Amiga 3000 built-in SCSI", -	.proc_info		= wd33c93_proc_info, +	.show_info		= wd33c93_show_info, +	.write_info		= wd33c93_write_info,  	.proc_name		= "A3000",  	.queuecommand		= wd33c93_queuecommand,  	.eh_abort_handler	= wd33c93_abort, diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c index dcfaee66a8b..c67e401954c 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(); -		} -	} +	    == 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"); -	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(); +	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); -	len = asc_prt_line(cp, leftlen, -			   " cntl 0x%x, no_scam 0x%x\n", ep->cntl, ep->no_scam); -	ASC_PRT_NEXT(); +	seq_printf(m, +		   " cntl 0x%x, no_scam 0x%x\n", ep->cntl, ep->no_scam); -	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(); +	seq_printf(m, " Target ID:           "); +	for (i = 0; i <= ASC_MAX_TID; i++) +		seq_printf(m, " %d", i); +	seq_printf(m, "\n"); -	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(); +	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"); -	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(); +	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"); -	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(); +	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"); -	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(); +	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; - -	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, +		"\nLinux Driver Configuration and Information for AdvanSys SCSI Host %d:\n", +		shost->host_no); -	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, +		   " 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, -			   " 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, +		   " 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, -			   " unchecked_isa_dma %d, use_clustering %d\n", -			   shost->unchecked_isa_dma, shost->use_clustering); -	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, -			   " 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(); +	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, " 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(); -	} - -	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); +		seq_printf(m, +			   " * = Re-negotiation pending before next command.\n");  	} -	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; - -	len = asc_prt_line(cp, leftlen, -			   "\nLinux Driver Statistics for AdvanSys SCSI Host %d:\n", -			   shost->host_no); -	ASC_PRT_NEXT(); +	seq_printf(m, +		   "\nLinux Driver Statistics for AdvanSys SCSI Host %d:\n", +		   shost->host_no); -	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, +		   " queuecommand %u, reset %u, biosparam %u, interrupt %u\n", +		   s->queuecommand, s->reset, s->biosparam, +		   s->interrupt); -	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(); +	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, -			   " 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; diff --git a/drivers/scsi/aha152x.c b/drivers/scsi/aha152x.c index a284be17699..3f7b6fee0a7 100644 --- a/drivers/scsi/aha152x.c +++ b/drivers/scsi/aha152x.c @@ -2977,11 +2977,10 @@ static void show_queues(struct Scsi_Host *shpnt)  }  #undef SPRINTF -#define SPRINTF(args...) pos += sprintf(pos, ## args) +#define SPRINTF(args...) seq_printf(m, ##args) -static int get_command(char *pos, Scsi_Cmnd * ptr) +static void get_command(struct seq_file *m, Scsi_Cmnd * ptr)  { -	char *start = pos;  	int i;  	SPRINTF("%p: target=%d; lun=%d; cmnd=( ", @@ -3011,13 +3010,10 @@ static int get_command(char *pos, Scsi_Cmnd * ptr)  	if (ptr->SCp.phase & syncneg)  		SPRINTF("syncneg|");  	SPRINTF("; next=0x%p\n", SCNEXT(ptr)); - -	return (pos - start);  } -static int get_ports(struct Scsi_Host *shpnt, char *pos) +static void get_ports(struct seq_file *m, struct Scsi_Host *shpnt)  { -	char *start = pos;  	int s;  	SPRINTF("\n%s: %s(%s) ", CURRENT_SC ? "on bus" : "waiting", states[STATE].name, states[PREVSTATE].name); @@ -3273,11 +3269,9 @@ static int get_ports(struct Scsi_Host *shpnt, char *pos)  	if (s & ENREQINIT)  		SPRINTF("ENREQINIT ");  	SPRINTF(")\n"); - -	return (pos - start);  } -static int aha152x_set_info(char *buffer, int length, struct Scsi_Host *shpnt) +static int aha152x_set_info(struct Scsi_Host *shpnt, char *buffer, int length)  {  	if(!shpnt || !buffer || length<8 || strncmp("aha152x ", buffer, 8)!=0)  		return -EINVAL; @@ -3320,26 +3314,11 @@ static int aha152x_set_info(char *buffer, int length, struct Scsi_Host *shpnt)  	return length;  } -#undef SPRINTF -#define SPRINTF(args...) \ -	do { if(pos < buffer + length) pos += sprintf(pos, ## args); } while(0) - -static int aha152x_proc_info(struct Scsi_Host *shpnt, char *buffer, char **start, -		      off_t offset, int length, int inout) +static int aha152x_show_info(struct seq_file *m, struct Scsi_Host *shpnt)  {  	int i; -	char *pos = buffer;  	Scsi_Cmnd *ptr;  	unsigned long flags; -	int thislength; - -	DPRINTK(debug_procinfo,  -	       KERN_DEBUG "aha152x_proc_info: buffer=%p offset=%ld length=%d hostno=%d inout=%d\n", -	       buffer, offset, length, shpnt->host_no, inout); - - -	if (inout) -		return aha152x_set_info(buffer, length, shpnt);  	SPRINTF(AHA152X_REVID "\n"); @@ -3392,25 +3371,25 @@ static int aha152x_proc_info(struct Scsi_Host *shpnt, char *buffer, char **start  	if (ISSUE_SC) {  		SPRINTF("not yet issued commands:\n");  		for (ptr = ISSUE_SC; ptr; ptr = SCNEXT(ptr)) -			pos += get_command(pos, ptr); +			get_command(m, ptr);  	} else  		SPRINTF("no not yet issued commands\n");  	DO_UNLOCK(flags);  	if (CURRENT_SC) {  		SPRINTF("current command:\n"); -		pos += get_command(pos, CURRENT_SC); +		get_command(m, CURRENT_SC);  	} else  		SPRINTF("no current command\n");  	if (DISCONNECTED_SC) {  		SPRINTF("disconnected commands:\n");  		for (ptr = DISCONNECTED_SC; ptr; ptr = SCNEXT(ptr)) -			pos += get_command(pos, ptr); +			get_command(m, ptr);  	} else  		SPRINTF("no disconnected commands\n"); -	pos += get_ports(shpnt, pos); +	get_ports(m, shpnt);  #if defined(AHA152X_STAT)  	SPRINTF("statistics:\n" @@ -3440,24 +3419,7 @@ static int aha152x_proc_info(struct Scsi_Host *shpnt, char *buffer, char **start  			HOSTDATA(shpnt)->time[i]);  	}  #endif - -	DPRINTK(debug_procinfo, KERN_DEBUG "aha152x_proc_info: pos=%p\n", pos); - -	thislength = pos - (buffer + offset); -	DPRINTK(debug_procinfo, KERN_DEBUG "aha152x_proc_info: length=%d thislength=%d\n", length, thislength); - -	if(thislength<0) { -		DPRINTK(debug_procinfo, KERN_DEBUG "aha152x_proc_info: output too short\n"); -		*start = NULL; -		return 0; -	} - -	thislength = thislength<length ? thislength : length; - -	DPRINTK(debug_procinfo, KERN_DEBUG "aha152x_proc_info: return %d\n", thislength); - -	*start = buffer + offset; -	return thislength < length ? thislength : length; +	return 0;  }  static int aha152x_adjust_queue(struct scsi_device *device) @@ -3470,7 +3432,8 @@ static struct scsi_host_template aha152x_driver_template = {  	.module				= THIS_MODULE,  	.name				= AHA152X_REVID,  	.proc_name			= "aha152x", -	.proc_info			= aha152x_proc_info, +	.show_info			= aha152x_show_info, +	.write_info			= aha152x_set_info,  	.queuecommand			= aha152x_queue,  	.eh_abort_handler		= aha152x_abort,  	.eh_device_reset_handler	= aha152x_device_reset, diff --git a/drivers/scsi/aha1740.c b/drivers/scsi/aha1740.c index df775e6ba57..5f3101797c9 100644 --- a/drivers/scsi/aha1740.c +++ b/drivers/scsi/aha1740.c @@ -106,33 +106,14 @@ static inline dma_addr_t ecb_cpu_to_dma (struct Scsi_Host *host, void *cpu)  	return hdata->ecb_dma_addr + offset;  } -static int aha1740_proc_info(struct Scsi_Host *shpnt, char *buffer, -			     char **start, off_t offset, -			     int length, int inout) +static int aha1740_show_info(struct seq_file *m, struct Scsi_Host *shpnt)  { -	int len; -	struct aha1740_hostdata *host; - -	if (inout) -		return-ENOSYS; - -	host = HOSTDATA(shpnt); - -	len = sprintf(buffer, "aha174x at IO:%lx, IRQ %d, SLOT %d.\n" +	struct aha1740_hostdata *host = HOSTDATA(shpnt); +	seq_printf(m, "aha174x at IO:%lx, IRQ %d, SLOT %d.\n"  		      "Extended translation %sabled.\n",  		      shpnt->io_port, shpnt->irq, host->edev->slot,  		      host->translation ? "en" : "dis"); - -	if (offset > len) { -		*start = buffer; -		return 0; -	} - -	*start = buffer + offset; -	len -= offset; -	if (len > length) -		len = length; -	return len; +	return 0;  }  static int aha1740_makecode(unchar *sense, unchar *status) @@ -556,7 +537,7 @@ static int aha1740_eh_abort_handler (Scsi_Cmnd *dummy)  static struct scsi_host_template aha1740_template = {  	.module           = THIS_MODULE,  	.proc_name        = "aha1740", -	.proc_info        = aha1740_proc_info, +	.show_info        = aha1740_show_info,  	.name             = "Adaptec 174x (EISA)",  	.queuecommand     = aha1740_queuecommand,  	.bios_param       = aha1740_biosparam, diff --git a/drivers/scsi/aic7xxx/aic79xx_osm.c b/drivers/scsi/aic7xxx/aic79xx_osm.c index 9328121804b..69d5c43a65e 100644 --- a/drivers/scsi/aic7xxx/aic79xx_osm.c +++ b/drivers/scsi/aic7xxx/aic79xx_osm.c @@ -906,7 +906,8 @@ struct scsi_host_template aic79xx_driver_template = {  	.module			= THIS_MODULE,  	.name			= "aic79xx",  	.proc_name		= "aic79xx", -	.proc_info		= ahd_linux_proc_info, +	.show_info		= ahd_linux_show_info, +	.write_info	 	= ahd_proc_write_seeprom,  	.info			= ahd_linux_info,  	.queuecommand		= ahd_linux_queue,  	.eh_abort_handler	= ahd_linux_abort, @@ -1702,19 +1703,13 @@ ahd_send_async(struct ahd_softc *ahd, char channel,  	switch (code) {  	case AC_TRANSFER_NEG:  	{ -		char	buf[80];  		struct  scsi_target *starget; -		struct	info_str info;  		struct	ahd_initiator_tinfo *tinfo;  		struct	ahd_tmode_tstate *tstate;  		unsigned int target_ppr_options;  		BUG_ON(target == CAM_TARGET_WILDCARD); -		info.buffer = buf; -		info.length = sizeof(buf); -		info.offset = 0; -		info.pos = 0;  		tinfo = ahd_fetch_transinfo(ahd, channel, ahd->our_id,  					    target, &tstate); diff --git a/drivers/scsi/aic7xxx/aic79xx_osm.h b/drivers/scsi/aic7xxx/aic79xx_osm.h index 28e43498cdf..c58fa33c659 100644 --- a/drivers/scsi/aic7xxx/aic79xx_osm.h +++ b/drivers/scsi/aic7xxx/aic79xx_osm.h @@ -379,14 +379,6 @@ void ahd_insb(struct ahd_softc * ahd, long port,  int		ahd_linux_register_host(struct ahd_softc *,  					struct scsi_host_template *); -/*************************** Pretty Printing **********************************/ -struct info_str { -	char *buffer; -	int length; -	off_t offset; -	int pos; -}; -  /******************************** Locking *************************************/  static inline void  ahd_lockinit(struct ahd_softc *ahd) @@ -513,8 +505,8 @@ ahd_flush_device_writes(struct ahd_softc *ahd)  }  /**************************** Proc FS Support *********************************/ -int	ahd_linux_proc_info(struct Scsi_Host *, char *, char **, -			    off_t, int, int); +int	ahd_proc_write_seeprom(struct Scsi_Host *, char *, int); +int	ahd_linux_show_info(struct seq_file *,struct Scsi_Host *);  /*********************** Transaction Access Wrappers **************************/  static inline void ahd_cmd_set_transaction_status(struct scsi_cmnd *, uint32_t); diff --git a/drivers/scsi/aic7xxx/aic79xx_proc.c b/drivers/scsi/aic7xxx/aic79xx_proc.c index 59c85d5a153..e9778b4f7e3 100644 --- a/drivers/scsi/aic7xxx/aic79xx_proc.c +++ b/drivers/scsi/aic7xxx/aic79xx_proc.c @@ -42,16 +42,12 @@  #include "aic79xx_osm.h"  #include "aic79xx_inline.h" -static void	copy_mem_info(struct info_str *info, char *data, int len); -static int	copy_info(struct info_str *info, char *fmt, ...);  static void	ahd_dump_target_state(struct ahd_softc *ahd, -				      struct info_str *info, +				      struct seq_file *m,  				      u_int our_id, char channel,  				      u_int target_id); -static void	ahd_dump_device_state(struct info_str *info, +static void	ahd_dump_device_state(struct seq_file *m,  				      struct scsi_device *sdev); -static int	ahd_proc_write_seeprom(struct ahd_softc *ahd, -				       char *buffer, int length);  /*   * Table of syncrates that don't follow the "divisible by 4" @@ -93,58 +89,15 @@ ahd_calc_syncsrate(u_int period_factor)  	return (10000000 / (period_factor * 4 * 10));  } - -static void -copy_mem_info(struct info_str *info, char *data, int len) -{ -	if (info->pos + len > info->offset + info->length) -		len = info->offset + info->length - info->pos; - -	if (info->pos + len < info->offset) { -		info->pos += len; -		return; -	} - -	if (info->pos < info->offset) { -		off_t partial; - -		partial = info->offset - info->pos; -		data += partial; -		info->pos += partial; -		len  -= partial; -	} - -	if (len > 0) { -		memcpy(info->buffer, data, len); -		info->pos += len; -		info->buffer += len; -	} -} - -static int -copy_info(struct info_str *info, char *fmt, ...) -{ -	va_list args; -	char buf[256]; -	int len; - -	va_start(args, fmt); -	len = vsprintf(buf, fmt, args); -	va_end(args); - -	copy_mem_info(info, buf, len); -	return (len); -} -  static void -ahd_format_transinfo(struct info_str *info, struct ahd_transinfo *tinfo) +ahd_format_transinfo(struct seq_file *m, struct ahd_transinfo *tinfo)  {  	u_int speed;  	u_int freq;  	u_int mb;  	if (tinfo->period == AHD_PERIOD_UNKNOWN) { -		copy_info(info, "Renegotiation Pending\n"); +		seq_printf(m, "Renegotiation Pending\n");  		return;  	}          speed = 3300; @@ -156,34 +109,34 @@ ahd_format_transinfo(struct info_str *info, struct ahd_transinfo *tinfo)  	speed *= (0x01 << tinfo->width);          mb = speed / 1000;          if (mb > 0) -		copy_info(info, "%d.%03dMB/s transfers", mb, speed % 1000); +		seq_printf(m, "%d.%03dMB/s transfers", mb, speed % 1000);          else -		copy_info(info, "%dKB/s transfers", speed); +		seq_printf(m, "%dKB/s transfers", speed);  	if (freq != 0) {  		int	printed_options;  		printed_options = 0; -		copy_info(info, " (%d.%03dMHz", freq / 1000, freq % 1000); +		seq_printf(m, " (%d.%03dMHz", freq / 1000, freq % 1000);  		if ((tinfo->ppr_options & MSG_EXT_PPR_RD_STRM) != 0) { -			copy_info(info, " RDSTRM"); +			seq_printf(m, " RDSTRM");  			printed_options++;  		}  		if ((tinfo->ppr_options & MSG_EXT_PPR_DT_REQ) != 0) { -			copy_info(info, "%s", printed_options ? "|DT" : " DT"); +			seq_printf(m, "%s", printed_options ? "|DT" : " DT");  			printed_options++;  		}  		if ((tinfo->ppr_options & MSG_EXT_PPR_IU_REQ) != 0) { -			copy_info(info, "%s", printed_options ? "|IU" : " IU"); +			seq_printf(m, "%s", printed_options ? "|IU" : " IU");  			printed_options++;  		}  		if ((tinfo->ppr_options & MSG_EXT_PPR_RTI) != 0) { -			copy_info(info, "%s", +			seq_printf(m, "%s",  				  printed_options ? "|RTI" : " RTI");  			printed_options++;  		}  		if ((tinfo->ppr_options & MSG_EXT_PPR_QAS_REQ) != 0) { -			copy_info(info, "%s", +			seq_printf(m, "%s",  				  printed_options ? "|QAS" : " QAS");  			printed_options++;  		} @@ -191,19 +144,19 @@ ahd_format_transinfo(struct info_str *info, struct ahd_transinfo *tinfo)  	if (tinfo->width > 0) {  		if (freq != 0) { -			copy_info(info, ", "); +			seq_printf(m, ", ");  		} else { -			copy_info(info, " ("); +			seq_printf(m, " (");  		} -		copy_info(info, "%dbit)", 8 * (0x01 << tinfo->width)); +		seq_printf(m, "%dbit)", 8 * (0x01 << tinfo->width));  	} else if (freq != 0) { -		copy_info(info, ")"); +		seq_printf(m, ")");  	} -	copy_info(info, "\n"); +	seq_printf(m, "\n");  }  static void -ahd_dump_target_state(struct ahd_softc *ahd, struct info_str *info, +ahd_dump_target_state(struct ahd_softc *ahd, struct seq_file *m,  		      u_int our_id, char channel, u_int target_id)  {  	struct  scsi_target *starget; @@ -213,17 +166,17 @@ ahd_dump_target_state(struct ahd_softc *ahd, struct info_str *info,  	tinfo = ahd_fetch_transinfo(ahd, channel, our_id,  				    target_id, &tstate); -	copy_info(info, "Target %d Negotiation Settings\n", target_id); -	copy_info(info, "\tUser: "); -	ahd_format_transinfo(info, &tinfo->user); +	seq_printf(m, "Target %d Negotiation Settings\n", target_id); +	seq_printf(m, "\tUser: "); +	ahd_format_transinfo(m, &tinfo->user);  	starget = ahd->platform_data->starget[target_id];  	if (starget == NULL)  		return; -	copy_info(info, "\tGoal: "); -	ahd_format_transinfo(info, &tinfo->goal); -	copy_info(info, "\tCurr: "); -	ahd_format_transinfo(info, &tinfo->curr); +	seq_printf(m, "\tGoal: "); +	ahd_format_transinfo(m, &tinfo->goal); +	seq_printf(m, "\tCurr: "); +	ahd_format_transinfo(m, &tinfo->curr);  	for (lun = 0; lun < AHD_NUM_LUNS; lun++) {  		struct scsi_device *dev; @@ -233,29 +186,30 @@ ahd_dump_target_state(struct ahd_softc *ahd, struct info_str *info,  		if (dev == NULL)  			continue; -		ahd_dump_device_state(info, dev); +		ahd_dump_device_state(m, dev);  	}  }  static void -ahd_dump_device_state(struct info_str *info, struct scsi_device *sdev) +ahd_dump_device_state(struct seq_file *m, struct scsi_device *sdev)  {  	struct ahd_linux_device *dev = scsi_transport_device_data(sdev); -	copy_info(info, "\tChannel %c Target %d Lun %d Settings\n", +	seq_printf(m, "\tChannel %c Target %d Lun %d Settings\n",  		  sdev->sdev_target->channel + 'A',  		  sdev->sdev_target->id, sdev->lun); -	copy_info(info, "\t\tCommands Queued %ld\n", dev->commands_issued); -	copy_info(info, "\t\tCommands Active %d\n", dev->active); -	copy_info(info, "\t\tCommand Openings %d\n", dev->openings); -	copy_info(info, "\t\tMax Tagged Openings %d\n", dev->maxtags); -	copy_info(info, "\t\tDevice Queue Frozen Count %d\n", dev->qfrozen); +	seq_printf(m, "\t\tCommands Queued %ld\n", dev->commands_issued); +	seq_printf(m, "\t\tCommands Active %d\n", dev->active); +	seq_printf(m, "\t\tCommand Openings %d\n", dev->openings); +	seq_printf(m, "\t\tMax Tagged Openings %d\n", dev->maxtags); +	seq_printf(m, "\t\tDevice Queue Frozen Count %d\n", dev->qfrozen);  } -static int -ahd_proc_write_seeprom(struct ahd_softc *ahd, char *buffer, int length) +int +ahd_proc_write_seeprom(struct Scsi_Host *shost, char *buffer, int length)  { +	struct	ahd_softc *ahd = *(struct ahd_softc **)shost->hostdata;  	ahd_mode_state saved_modes;  	int have_seeprom;  	u_long s; @@ -319,64 +273,45 @@ done:   * Return information to handle /proc support for the driver.   */  int -ahd_linux_proc_info(struct Scsi_Host *shost, char *buffer, char **start, -		    off_t offset, int length, int inout) +ahd_linux_show_info(struct seq_file *m, struct Scsi_Host *shost)  {  	struct	ahd_softc *ahd = *(struct ahd_softc **)shost->hostdata; -	struct	info_str info;  	char	ahd_info[256];  	u_int	max_targ;  	u_int	i; -	int	retval; -	 /* Has data been written to the file? */  -	if (inout == TRUE) { -		retval = ahd_proc_write_seeprom(ahd, buffer, length); -		goto done; -	} - -	if (start) -		*start = buffer; - -	info.buffer	= buffer; -	info.length	= length; -	info.offset	= offset; -	info.pos	= 0; - -	copy_info(&info, "Adaptec AIC79xx driver version: %s\n", +	seq_printf(m, "Adaptec AIC79xx driver version: %s\n",  		  AIC79XX_DRIVER_VERSION); -	copy_info(&info, "%s\n", ahd->description); +	seq_printf(m, "%s\n", ahd->description);  	ahd_controller_info(ahd, ahd_info); -	copy_info(&info, "%s\n", ahd_info); -	copy_info(&info, "Allocated SCBs: %d, SG List Length: %d\n\n", +	seq_printf(m, "%s\n", ahd_info); +	seq_printf(m, "Allocated SCBs: %d, SG List Length: %d\n\n",  		  ahd->scb_data.numscbs, AHD_NSEG);  	max_targ = 16;  	if (ahd->seep_config == NULL) -		copy_info(&info, "No Serial EEPROM\n"); +		seq_printf(m, "No Serial EEPROM\n");  	else { -		copy_info(&info, "Serial EEPROM:\n"); +		seq_printf(m, "Serial EEPROM:\n");  		for (i = 0; i < sizeof(*ahd->seep_config)/2; i++) {  			if (((i % 8) == 0) && (i != 0)) { -				copy_info(&info, "\n"); +				seq_printf(m, "\n");  			} -			copy_info(&info, "0x%.4x ", +			seq_printf(m, "0x%.4x ",  				  ((uint16_t*)ahd->seep_config)[i]);  		} -		copy_info(&info, "\n"); +		seq_printf(m, "\n");  	} -	copy_info(&info, "\n"); +	seq_printf(m, "\n");  	if ((ahd->features & AHD_WIDE) == 0)  		max_targ = 8;  	for (i = 0; i < max_targ; i++) { -		ahd_dump_target_state(ahd, &info, ahd->our_id, 'A', +		ahd_dump_target_state(ahd, m, ahd->our_id, 'A',  				      /*target_id*/i);  	} -	retval = info.pos > info.offset ? info.pos - info.offset : 0; -done: -	return (retval); +	return 0;  } diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm.c b/drivers/scsi/aic7xxx/aic7xxx_osm.c index 5a477cdc780..c0c62583b54 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_osm.c +++ b/drivers/scsi/aic7xxx/aic7xxx_osm.c @@ -803,7 +803,8 @@ struct scsi_host_template aic7xxx_driver_template = {  	.module			= THIS_MODULE,  	.name			= "aic7xxx",  	.proc_name		= "aic7xxx", -	.proc_info		= ahc_linux_proc_info, +	.show_info		= ahc_linux_show_info, +	.write_info		= ahc_proc_write_seeprom,  	.info			= ahc_linux_info,  	.queuecommand		= ahc_linux_queue,  	.eh_abort_handler	= ahc_linux_abort, @@ -1631,10 +1632,8 @@ ahc_send_async(struct ahc_softc *ahc, char channel,  	switch (code) {  	case AC_TRANSFER_NEG:  	{ -		char	buf[80];  		struct	scsi_target *starget;  		struct	ahc_linux_target *targ; -		struct	info_str info;  		struct	ahc_initiator_tinfo *tinfo;  		struct	ahc_tmode_tstate *tstate;  		int	target_offset; @@ -1642,10 +1641,6 @@ ahc_send_async(struct ahc_softc *ahc, char channel,  		BUG_ON(target == CAM_TARGET_WILDCARD); -		info.buffer = buf; -		info.length = sizeof(buf); -		info.offset = 0; -		info.pos = 0;  		tinfo = ahc_fetch_transinfo(ahc, channel,  						channel == 'A' ? ahc->our_id  							       : ahc->our_id_b, diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm.h b/drivers/scsi/aic7xxx/aic7xxx_osm.h index bca0fb83f55..bc4cca92ff0 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_osm.h +++ b/drivers/scsi/aic7xxx/aic7xxx_osm.h @@ -383,14 +383,6 @@ void ahc_insb(struct ahc_softc * ahc, long port,  int		ahc_linux_register_host(struct ahc_softc *,  					struct scsi_host_template *); -/*************************** Pretty Printing **********************************/ -struct info_str { -	char *buffer; -	int length; -	off_t offset; -	int pos; -}; -  /******************************** Locking *************************************/  /* Lock protecting internal data structures */ @@ -523,8 +515,8 @@ ahc_flush_device_writes(struct ahc_softc *ahc)  }  /**************************** Proc FS Support *********************************/ -int	ahc_linux_proc_info(struct Scsi_Host *, char *, char **, -			    off_t, int, int); +int	ahc_proc_write_seeprom(struct Scsi_Host *, char *, int); +int	ahc_linux_show_info(struct seq_file *, struct Scsi_Host *);  /*************************** Domain Validation ********************************/  /*********************** Transaction Access Wrappers *************************/ diff --git a/drivers/scsi/aic7xxx/aic7xxx_proc.c b/drivers/scsi/aic7xxx/aic7xxx_proc.c index f2525f8ed1c..383a3d11652 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_proc.c +++ b/drivers/scsi/aic7xxx/aic7xxx_proc.c @@ -43,16 +43,12 @@  #include "aic7xxx_inline.h"  #include "aic7xxx_93cx6.h" -static void	copy_mem_info(struct info_str *info, char *data, int len); -static int	copy_info(struct info_str *info, char *fmt, ...);  static void	ahc_dump_target_state(struct ahc_softc *ahc, -				      struct info_str *info, +				      struct seq_file *m,  				      u_int our_id, char channel,  				      u_int target_id, u_int target_offset); -static void	ahc_dump_device_state(struct info_str *info, +static void	ahc_dump_device_state(struct seq_file *m,  				      struct scsi_device *dev); -static int	ahc_proc_write_seeprom(struct ahc_softc *ahc, -				       char *buffer, int length);  /*   * Table of syncrates that don't follow the "divisible by 4" @@ -94,51 +90,8 @@ ahc_calc_syncsrate(u_int period_factor)  	return (10000000 / (period_factor * 4 * 10));  } - -static void -copy_mem_info(struct info_str *info, char *data, int len) -{ -	if (info->pos + len > info->offset + info->length) -		len = info->offset + info->length - info->pos; - -	if (info->pos + len < info->offset) { -		info->pos += len; -		return; -	} - -	if (info->pos < info->offset) { -		off_t partial; - -		partial = info->offset - info->pos; -		data += partial; -		info->pos += partial; -		len  -= partial; -	} - -	if (len > 0) { -		memcpy(info->buffer, data, len); -		info->pos += len; -		info->buffer += len; -	} -} - -static int -copy_info(struct info_str *info, char *fmt, ...) -{ -	va_list args; -	char buf[256]; -	int len; - -	va_start(args, fmt); -	len = vsprintf(buf, fmt, args); -	va_end(args); - -	copy_mem_info(info, buf, len); -	return (len); -} -  static void -ahc_format_transinfo(struct info_str *info, struct ahc_transinfo *tinfo) +ahc_format_transinfo(struct seq_file *m, struct ahc_transinfo *tinfo)  {  	u_int speed;  	u_int freq; @@ -153,12 +106,12 @@ ahc_format_transinfo(struct info_str *info, struct ahc_transinfo *tinfo)  	speed *= (0x01 << tinfo->width);          mb = speed / 1000;          if (mb > 0) -		copy_info(info, "%d.%03dMB/s transfers", mb, speed % 1000); +		seq_printf(m, "%d.%03dMB/s transfers", mb, speed % 1000);          else -		copy_info(info, "%dKB/s transfers", speed); +		seq_printf(m, "%dKB/s transfers", speed);  	if (freq != 0) { -		copy_info(info, " (%d.%03dMHz%s, offset %d", +		seq_printf(m, " (%d.%03dMHz%s, offset %d",  			 freq / 1000, freq % 1000,  			 (tinfo->ppr_options & MSG_EXT_PPR_DT_REQ) != 0  			 ? " DT" : "", tinfo->offset); @@ -166,19 +119,19 @@ ahc_format_transinfo(struct info_str *info, struct ahc_transinfo *tinfo)  	if (tinfo->width > 0) {  		if (freq != 0) { -			copy_info(info, ", "); +			seq_printf(m, ", ");  		} else { -			copy_info(info, " ("); +			seq_printf(m, " (");  		} -		copy_info(info, "%dbit)", 8 * (0x01 << tinfo->width)); +		seq_printf(m, "%dbit)", 8 * (0x01 << tinfo->width));  	} else if (freq != 0) { -		copy_info(info, ")"); +		seq_printf(m, ")");  	} -	copy_info(info, "\n"); +	seq_printf(m, "\n");  }  static void -ahc_dump_target_state(struct ahc_softc *ahc, struct info_str *info, +ahc_dump_target_state(struct ahc_softc *ahc, struct seq_file *m,  		      u_int our_id, char channel, u_int target_id,  		      u_int target_offset)  { @@ -190,18 +143,18 @@ ahc_dump_target_state(struct ahc_softc *ahc, struct info_str *info,  	tinfo = ahc_fetch_transinfo(ahc, channel, our_id,  				    target_id, &tstate);  	if ((ahc->features & AHC_TWIN) != 0) -		copy_info(info, "Channel %c ", channel); -	copy_info(info, "Target %d Negotiation Settings\n", target_id); -	copy_info(info, "\tUser: "); -	ahc_format_transinfo(info, &tinfo->user); +		seq_printf(m, "Channel %c ", channel); +	seq_printf(m, "Target %d Negotiation Settings\n", target_id); +	seq_printf(m, "\tUser: "); +	ahc_format_transinfo(m, &tinfo->user);  	starget = ahc->platform_data->starget[target_offset];  	if (!starget)  		return; -	copy_info(info, "\tGoal: "); -	ahc_format_transinfo(info, &tinfo->goal); -	copy_info(info, "\tCurr: "); -	ahc_format_transinfo(info, &tinfo->curr); +	seq_printf(m, "\tGoal: "); +	ahc_format_transinfo(m, &tinfo->goal); +	seq_printf(m, "\tCurr: "); +	ahc_format_transinfo(m, &tinfo->curr);  	for (lun = 0; lun < AHC_NUM_LUNS; lun++) {  		struct scsi_device *sdev; @@ -211,29 +164,30 @@ ahc_dump_target_state(struct ahc_softc *ahc, struct info_str *info,  		if (sdev == NULL)  			continue; -		ahc_dump_device_state(info, sdev); +		ahc_dump_device_state(m, sdev);  	}  }  static void -ahc_dump_device_state(struct info_str *info, struct scsi_device *sdev) +ahc_dump_device_state(struct seq_file *m, struct scsi_device *sdev)  {  	struct ahc_linux_device *dev = scsi_transport_device_data(sdev); -	copy_info(info, "\tChannel %c Target %d Lun %d Settings\n", +	seq_printf(m, "\tChannel %c Target %d Lun %d Settings\n",  		  sdev->sdev_target->channel + 'A',  		  sdev->sdev_target->id, sdev->lun); -	copy_info(info, "\t\tCommands Queued %ld\n", dev->commands_issued); -	copy_info(info, "\t\tCommands Active %d\n", dev->active); -	copy_info(info, "\t\tCommand Openings %d\n", dev->openings); -	copy_info(info, "\t\tMax Tagged Openings %d\n", dev->maxtags); -	copy_info(info, "\t\tDevice Queue Frozen Count %d\n", dev->qfrozen); +	seq_printf(m, "\t\tCommands Queued %ld\n", dev->commands_issued); +	seq_printf(m, "\t\tCommands Active %d\n", dev->active); +	seq_printf(m, "\t\tCommand Openings %d\n", dev->openings); +	seq_printf(m, "\t\tMax Tagged Openings %d\n", dev->maxtags); +	seq_printf(m, "\t\tDevice Queue Frozen Count %d\n", dev->qfrozen);  } -static int -ahc_proc_write_seeprom(struct ahc_softc *ahc, char *buffer, int length) +int +ahc_proc_write_seeprom(struct Scsi_Host *shost, char *buffer, int length)  { +	struct	ahc_softc *ahc = *(struct ahc_softc **)shost->hostdata;  	struct seeprom_descriptor sd;  	int have_seeprom;  	u_long s; @@ -332,53 +286,36 @@ done:   * Return information to handle /proc support for the driver.   */  int -ahc_linux_proc_info(struct Scsi_Host *shost, char *buffer, char **start, -		    off_t offset, int length, int inout) +ahc_linux_show_info(struct seq_file *m, struct Scsi_Host *shost)  {  	struct	ahc_softc *ahc = *(struct ahc_softc **)shost->hostdata; -	struct	info_str info;  	char	ahc_info[256];  	u_int	max_targ;  	u_int	i; -	int	retval; -	 /* Has data been written to the file? */  -	if (inout == TRUE) { -		retval = ahc_proc_write_seeprom(ahc, buffer, length); -		goto done; -	} - -	if (start) -		*start = buffer; - -	info.buffer	= buffer; -	info.length	= length; -	info.offset	= offset; -	info.pos	= 0; - -	copy_info(&info, "Adaptec AIC7xxx driver version: %s\n", +	seq_printf(m, "Adaptec AIC7xxx driver version: %s\n",  		  AIC7XXX_DRIVER_VERSION); -	copy_info(&info, "%s\n", ahc->description); +	seq_printf(m, "%s\n", ahc->description);  	ahc_controller_info(ahc, ahc_info); -	copy_info(&info, "%s\n", ahc_info); -	copy_info(&info, "Allocated SCBs: %d, SG List Length: %d\n\n", +	seq_printf(m, "%s\n", ahc_info); +	seq_printf(m, "Allocated SCBs: %d, SG List Length: %d\n\n",  		  ahc->scb_data->numscbs, AHC_NSEG);  	if (ahc->seep_config == NULL) -		copy_info(&info, "No Serial EEPROM\n"); +		seq_printf(m, "No Serial EEPROM\n");  	else { -		copy_info(&info, "Serial EEPROM:\n"); +		seq_printf(m, "Serial EEPROM:\n");  		for (i = 0; i < sizeof(*ahc->seep_config)/2; i++) {  			if (((i % 8) == 0) && (i != 0)) { -				copy_info(&info, "\n"); +				seq_printf(m, "\n");  			} -			copy_info(&info, "0x%.4x ", +			seq_printf(m, "0x%.4x ",  				  ((uint16_t*)ahc->seep_config)[i]);  		} -		copy_info(&info, "\n"); +		seq_printf(m, "\n");  	} -	copy_info(&info, "\n"); +	seq_printf(m, "\n");  	max_targ = 16;  	if ((ahc->features & (AHC_WIDE|AHC_TWIN)) == 0) @@ -398,10 +335,8 @@ ahc_linux_proc_info(struct Scsi_Host *shost, char *buffer, char **start,  			target_id = i % 8;  		} -		ahc_dump_target_state(ahc, &info, our_id, +		ahc_dump_target_state(ahc, m, our_id,  				      channel, target_id, i);  	} -	retval = info.pos > info.offset ? info.pos - info.offset : 0; -done: -	return (retval); +	return 0;  } diff --git a/drivers/scsi/aic7xxx_old.c b/drivers/scsi/aic7xxx_old.c index 5b212f0df89..33ec9c64340 100644 --- a/drivers/scsi/aic7xxx_old.c +++ b/drivers/scsi/aic7xxx_old.c @@ -11108,7 +11108,7 @@ MODULE_VERSION(AIC7XXX_H_VERSION);  static struct scsi_host_template driver_template = { -	.proc_info		= aic7xxx_proc_info, +	.show_info		= aic7xxx_show_info,  	.detect			= aic7xxx_detect,  	.release		= aic7xxx_release,  	.info			= aic7xxx_info,	 diff --git a/drivers/scsi/aic7xxx_old/aic7xxx_proc.c b/drivers/scsi/aic7xxx_old/aic7xxx_proc.c index b07e4f04fd0..976f45ccf2c 100644 --- a/drivers/scsi/aic7xxx_old/aic7xxx_proc.c +++ b/drivers/scsi/aic7xxx_old/aic7xxx_proc.c @@ -30,62 +30,23 @@   *-M*************************************************************************/ -#define	BLS	(&aic7xxx_buffer[size])  #define HDRB \  "               0 - 4K   4 - 16K   16 - 64K  64 - 256K  256K - 1M        1M+" -#ifdef PROC_DEBUG -extern int vsprintf(char *, const char *, va_list); - -static void -proc_debug(const char *fmt, ...) -{ -  va_list ap; -  char buf[256]; - -  va_start(ap, fmt); -  vsprintf(buf, fmt, ap); -  printk(buf); -  va_end(ap); -} -#else /* PROC_DEBUG */ -#  define proc_debug(fmt, args...) -#endif /* PROC_DEBUG */ - -static int aic7xxx_buffer_size = 0; -static char *aic7xxx_buffer = NULL; -  /*+F*************************************************************************   * Function: - *   aic7xxx_set_info - * - * Description: - *   Set parameters for the driver from the /proc filesystem. - *-F*************************************************************************/ -static int -aic7xxx_set_info(char *buffer, int length, struct Scsi_Host *HBAptr) -{ -  proc_debug("aic7xxx_set_info(): %s\n", buffer); -  return (-ENOSYS);  /* Currently this is a no-op */ -} - - -/*+F************************************************************************* - * Function: - *   aic7xxx_proc_info + *   aic7xxx_show_info   *   * Description:   *   Return information to handle /proc support for the driver.   *-F*************************************************************************/  int -aic7xxx_proc_info ( struct Scsi_Host *HBAptr, char *buffer, char **start, off_t offset, int length,  -                    int inout) +aic7xxx_show_info(struct seq_file *m, struct Scsi_Host *HBAptr)  {    struct aic7xxx_host *p;    struct aic_dev_data *aic_dev;    struct scsi_device *sdptr; -  int    size = 0;    unsigned char i;    unsigned char tindex; @@ -94,66 +55,21 @@ aic7xxx_proc_info ( struct Scsi_Host *HBAptr, char *buffer, char **start, off_t    if (!p)    { -    size += sprintf(buffer, "Can't find adapter for host number %d\n", HBAptr->host_no); -    if (size > length) -    { -      return (size); -    } -    else -    { -      return (length); -    } -  } - -  if (inout == TRUE) /* Has data been written to the file? */  -  { -    return (aic7xxx_set_info(buffer, length, HBAptr)); +    seq_printf(m, "Can't find adapter for host number %d\n", HBAptr->host_no); +    return 0;    }    p = (struct aic7xxx_host *) HBAptr->hostdata; -  /* -   * It takes roughly 1K of space to hold all relevant card info, not -   * counting any proc stats, so we start out with a 1.5k buffer size and -   * if proc_stats is defined, then we sweep the stats structure to see -   * how many drives we will be printing out for and add 384 bytes per -   * device with active stats. -   * -   * Hmmmm...that 1.5k seems to keep growing as items get added so they -   * can be easily viewed for debugging purposes.  So, we bumped that -   * 1.5k to 4k so we can quit having to bump it all the time. -   */ - -  size = 4096; -  list_for_each_entry(aic_dev, &p->aic_devs, list) -    size += 512; -  if (aic7xxx_buffer_size != size) -  { -    if (aic7xxx_buffer != NULL)  -    { -      kfree(aic7xxx_buffer); -      aic7xxx_buffer_size = 0; -    } -    aic7xxx_buffer = kmalloc(size, GFP_KERNEL); -  } -  if (aic7xxx_buffer == NULL) -  { -    size = sprintf(buffer, "AIC7xxx - kmalloc error at line %d\n", -        __LINE__); -    return size; -  } -  aic7xxx_buffer_size = size; - -  size = 0; -  size += sprintf(BLS, "Adaptec AIC7xxx driver version: "); -  size += sprintf(BLS, "%s/", AIC7XXX_C_VERSION); -  size += sprintf(BLS, "%s", AIC7XXX_H_VERSION); -  size += sprintf(BLS, "\n"); -  size += sprintf(BLS, "Adapter Configuration:\n"); -  size += sprintf(BLS, "           SCSI Adapter: %s\n", +  seq_printf(m, "Adaptec AIC7xxx driver version: "); +  seq_printf(m, "%s/", AIC7XXX_C_VERSION); +  seq_printf(m, "%s", AIC7XXX_H_VERSION); +  seq_printf(m, "\n"); +  seq_printf(m, "Adapter Configuration:\n"); +  seq_printf(m, "           SCSI Adapter: %s\n",        board_names[p->board_name_index]);    if (p->flags & AHC_TWIN) -    size += sprintf(BLS, "                         Twin Channel Controller "); +    seq_printf(m, "                         Twin Channel Controller ");    else    {      char *channel = ""; @@ -184,86 +100,86 @@ aic7xxx_proc_info ( struct Scsi_Host *HBAptr, char *buffer, char **start, off_t        ultra = "Ultra-2 LVD/SE ";      else if (p->features & AHC_ULTRA)        ultra = "Ultra "; -    size += sprintf(BLS, "                           %s%sController%s ", +    seq_printf(m, "                           %s%sController%s ",        ultra, wide, channel);    }    switch(p->chip & ~AHC_CHIPID_MASK)    {      case AHC_VL: -      size += sprintf(BLS, "at VLB slot %d\n", p->pci_device_fn); +      seq_printf(m, "at VLB slot %d\n", p->pci_device_fn);        break;      case AHC_EISA: -      size += sprintf(BLS, "at EISA slot %d\n", p->pci_device_fn); +      seq_printf(m, "at EISA slot %d\n", p->pci_device_fn);        break;      default: -      size += sprintf(BLS, "at PCI %d/%d/%d\n", p->pci_bus, +      seq_printf(m, "at PCI %d/%d/%d\n", p->pci_bus,          PCI_SLOT(p->pci_device_fn), PCI_FUNC(p->pci_device_fn));        break;    }    if( !(p->maddr) )    { -    size += sprintf(BLS, "    Programmed I/O Base: %lx\n", p->base); +    seq_printf(m, "    Programmed I/O Base: %lx\n", p->base);    }    else    { -    size += sprintf(BLS, "    PCI MMAPed I/O Base: 0x%lx\n", p->mbase); +    seq_printf(m, "    PCI MMAPed I/O Base: 0x%lx\n", p->mbase);    }    if( (p->chip & (AHC_VL | AHC_EISA)) )    { -    size += sprintf(BLS, "    BIOS Memory Address: 0x%08x\n", p->bios_address); +    seq_printf(m, "    BIOS Memory Address: 0x%08x\n", p->bios_address);    } -  size += sprintf(BLS, " Adapter SEEPROM Config: %s\n", +  seq_printf(m, " Adapter SEEPROM Config: %s\n",            (p->flags & AHC_SEEPROM_FOUND) ? "SEEPROM found and used." :           ((p->flags & AHC_USEDEFAULTS) ? "SEEPROM not found, using defaults." :             "SEEPROM not found, using leftover BIOS values.") ); -  size += sprintf(BLS, "      Adaptec SCSI BIOS: %s\n", +  seq_printf(m, "      Adaptec SCSI BIOS: %s\n",            (p->flags & AHC_BIOS_ENABLED) ? "Enabled" : "Disabled"); -  size += sprintf(BLS, "                    IRQ: %d\n", HBAptr->irq); -  size += sprintf(BLS, "                   SCBs: Active %d, Max Active %d,\n", +  seq_printf(m, "                    IRQ: %d\n", HBAptr->irq); +  seq_printf(m, "                   SCBs: Active %d, Max Active %d,\n",              p->activescbs, p->max_activescbs); -  size += sprintf(BLS, "                         Allocated %d, HW %d, " +  seq_printf(m, "                         Allocated %d, HW %d, "              "Page %d\n", p->scb_data->numscbs, p->scb_data->maxhscbs,              p->scb_data->maxscbs);    if (p->flags & AHC_EXTERNAL_SRAM) -    size += sprintf(BLS, "                         Using External SCB SRAM\n"); -  size += sprintf(BLS, "             Interrupts: %ld", p->isr_count); +    seq_printf(m, "                         Using External SCB SRAM\n"); +  seq_printf(m, "             Interrupts: %ld", p->isr_count);    if (p->chip & AHC_EISA)    { -    size += sprintf(BLS, " %s\n", +    seq_printf(m, " %s\n",          (p->pause & IRQMS) ? "(Level Sensitive)" : "(Edge Triggered)");    }    else    { -    size += sprintf(BLS, "\n"); +    seq_printf(m, "\n");    } -  size += sprintf(BLS, "      BIOS Control Word: 0x%04x\n", +  seq_printf(m, "      BIOS Control Word: 0x%04x\n",              p->bios_control); -  size += sprintf(BLS, "   Adapter Control Word: 0x%04x\n", +  seq_printf(m, "   Adapter Control Word: 0x%04x\n",              p->adapter_control); -  size += sprintf(BLS, "   Extended Translation: %sabled\n", +  seq_printf(m, "   Extended Translation: %sabled\n",        (p->flags & AHC_EXTEND_TRANS_A) ? "En" : "Dis"); -  size += sprintf(BLS, "Disconnect Enable Flags: 0x%04x\n", p->discenable); +  seq_printf(m, "Disconnect Enable Flags: 0x%04x\n", p->discenable);    if (p->features & (AHC_ULTRA | AHC_ULTRA2))    { -    size += sprintf(BLS, "     Ultra Enable Flags: 0x%04x\n", p->ultraenb); +    seq_printf(m, "     Ultra Enable Flags: 0x%04x\n", p->ultraenb);    } -  size += sprintf(BLS, "Default Tag Queue Depth: %d\n", aic7xxx_default_queue_depth); -  size += sprintf(BLS, "    Tagged Queue By Device array for aic7xxx host " +  seq_printf(m, "Default Tag Queue Depth: %d\n", aic7xxx_default_queue_depth); +  seq_printf(m, "    Tagged Queue By Device array for aic7xxx host "                         "instance %d:\n", p->instance); -  size += sprintf(BLS, "      {"); +  seq_printf(m, "      {");    for(i=0; i < (MAX_TARGETS - 1); i++) -    size += sprintf(BLS, "%d,",aic7xxx_tag_info[p->instance].tag_commands[i]); -  size += sprintf(BLS, "%d}\n",aic7xxx_tag_info[p->instance].tag_commands[i]); +    seq_printf(m, "%d,",aic7xxx_tag_info[p->instance].tag_commands[i]); +  seq_printf(m, "%d}\n",aic7xxx_tag_info[p->instance].tag_commands[i]); -  size += sprintf(BLS, "\n"); -  size += sprintf(BLS, "Statistics:\n\n"); +  seq_printf(m, "\n"); +  seq_printf(m, "Statistics:\n\n");    list_for_each_entry(aic_dev, &p->aic_devs, list)    {      sdptr = aic_dev->SDptr;      tindex = sdptr->channel << 3 | sdptr->id; -    size += sprintf(BLS, "(scsi%d:%d:%d:%d)\n", +    seq_printf(m, "(scsi%d:%d:%d:%d)\n",          p->host_no, sdptr->channel, sdptr->id, sdptr->lun); -    size += sprintf(BLS, "  Device using %s/%s", +    seq_printf(m, "  Device using %s/%s",            (aic_dev->cur.width == MSG_EXT_WDTR_BUS_16_BIT) ?            "Wide" : "Narrow",            (aic_dev->cur.offset != 0) ? @@ -279,78 +195,59 @@ aic7xxx_proc_info ( struct Scsi_Host *HBAptr, char *buffer, char **start, off_t        sync_rate = aic7xxx_find_syncrate(p, &period, 0, &options);        if (sync_rate != NULL)        { -        size += sprintf(BLS, "%s MByte/sec, offset %d\n", +        seq_printf(m, "%s MByte/sec, offset %d\n",                          sync_rate->rate[rate],                          aic_dev->cur.offset );        }        else        { -        size += sprintf(BLS, "3.3 MByte/sec, offset %d\n", +        seq_printf(m, "3.3 MByte/sec, offset %d\n",                          aic_dev->cur.offset );        }      } -    size += sprintf(BLS, "  Transinfo settings: "); -    size += sprintf(BLS, "current(%d/%d/%d/%d), ", +    seq_printf(m, "  Transinfo settings: "); +    seq_printf(m, "current(%d/%d/%d/%d), ",                      aic_dev->cur.period,                      aic_dev->cur.offset,                      aic_dev->cur.width,                      aic_dev->cur.options); -    size += sprintf(BLS, "goal(%d/%d/%d/%d), ", +    seq_printf(m, "goal(%d/%d/%d/%d), ",                      aic_dev->goal.period,                      aic_dev->goal.offset,                      aic_dev->goal.width,                      aic_dev->goal.options); -    size += sprintf(BLS, "user(%d/%d/%d/%d)\n", +    seq_printf(m, "user(%d/%d/%d/%d)\n",                      p->user[tindex].period,                      p->user[tindex].offset,                      p->user[tindex].width,                      p->user[tindex].options);      if(sdptr->simple_tags)      { -      size += sprintf(BLS, "  Tagged Command Queueing Enabled, Ordered Tags %s, Depth %d/%d\n", sdptr->ordered_tags ? "Enabled" : "Disabled", sdptr->queue_depth, aic_dev->max_q_depth); +      seq_printf(m, "  Tagged Command Queueing Enabled, Ordered Tags %s, Depth %d/%d\n", sdptr->ordered_tags ? "Enabled" : "Disabled", sdptr->queue_depth, aic_dev->max_q_depth);      }      if(aic_dev->barrier_total) -      size += sprintf(BLS, "  Total transfers %ld:\n    (%ld/%ld/%ld/%ld reads/writes/REQ_BARRIER/Ordered Tags)\n", +      seq_printf(m, "  Total transfers %ld:\n    (%ld/%ld/%ld/%ld reads/writes/REQ_BARRIER/Ordered Tags)\n",          aic_dev->r_total+aic_dev->w_total, aic_dev->r_total, aic_dev->w_total,          aic_dev->barrier_total, aic_dev->ordered_total);      else -      size += sprintf(BLS, "  Total transfers %ld:\n    (%ld/%ld reads/writes)\n", +      seq_printf(m, "  Total transfers %ld:\n    (%ld/%ld reads/writes)\n",          aic_dev->r_total+aic_dev->w_total, aic_dev->r_total, aic_dev->w_total); -    size += sprintf(BLS, "%s\n", HDRB); -    size += sprintf(BLS, "   Reads:"); +    seq_printf(m, "%s\n", HDRB); +    seq_printf(m, "   Reads:");      for (i = 0; i < ARRAY_SIZE(aic_dev->r_bins); i++)      { -      size += sprintf(BLS, " %10ld", aic_dev->r_bins[i]); +      seq_printf(m, " %10ld", aic_dev->r_bins[i]);      } -    size += sprintf(BLS, "\n"); -    size += sprintf(BLS, "  Writes:"); +    seq_printf(m, "\n"); +    seq_printf(m, "  Writes:");      for (i = 0; i < ARRAY_SIZE(aic_dev->w_bins); i++)      { -      size += sprintf(BLS, " %10ld", aic_dev->w_bins[i]); +      seq_printf(m, " %10ld", aic_dev->w_bins[i]);      } -    size += sprintf(BLS, "\n"); -    size += sprintf(BLS, "\n\n"); -  } -  if (size >= aic7xxx_buffer_size) -  { -    printk(KERN_WARNING "aic7xxx: Overflow in aic7xxx_proc.c\n"); -  } - -  if (offset > size - 1) -  { -    kfree(aic7xxx_buffer); -    aic7xxx_buffer = NULL; -    aic7xxx_buffer_size = length = 0; -    *start = NULL; +    seq_printf(m, "\n"); +    seq_printf(m, "\n\n");    } -  else -  { -    *start = buffer; -    length = min_t(int, length, size - offset); -    memcpy(buffer, &aic7xxx_buffer[offset], length); -  } - -  return (length); +  return 0;  }  /* diff --git a/drivers/scsi/arm/acornscsi.c b/drivers/scsi/arm/acornscsi.c index 3e1172adb37..09ba1869d36 100644 --- a/drivers/scsi/arm/acornscsi.c +++ b/drivers/scsi/arm/acornscsi.c @@ -2836,20 +2836,15 @@ char *acornscsi_info(struct Scsi_Host *host)      return string;  } -int acornscsi_proc_info(struct Scsi_Host *instance, char *buffer, char **start, off_t offset, -			int length, int inout) +static int acornscsi_show_info(struct seq_file *m, struct Scsi_Host *instance)  { -    int pos, begin = 0, devidx; +    int devidx;      struct scsi_device *scd;      AS_Host *host; -    char *p = buffer; - -    if (inout == 1) -	return -EINVAL;      host  = (AS_Host *)instance->hostdata; -    p += sprintf(p, "AcornSCSI driver v%d.%d.%d" +    seq_printf(m, "AcornSCSI driver v%d.%d.%d"  #ifdef CONFIG_SCSI_ACORNSCSI_SYNC      " SYNC"  #endif @@ -2864,14 +2859,14 @@ int acornscsi_proc_info(struct Scsi_Host *instance, char *buffer, char **start,  #endif  		"\n\n", VER_MAJOR, VER_MINOR, VER_PATCH); -    p += sprintf(p,	"SBIC: WD33C93A  Address: %p    IRQ : %d\n", +    seq_printf(m,	"SBIC: WD33C93A  Address: %p    IRQ : %d\n",  			host->base + SBIC_REGIDX, host->scsi.irq);  #ifdef USE_DMAC -    p += sprintf(p,	"DMAC: uPC71071  Address: %p  IRQ : %d\n\n", +    seq_printf(m,	"DMAC: uPC71071  Address: %p  IRQ : %d\n\n",  			host->base + DMAC_OFFSET, host->scsi.irq);  #endif -    p += sprintf(p,	"Statistics:\n" +    seq_printf(m,	"Statistics:\n"  			"Queued commands: %-10u    Issued commands: %-10u\n"  			"Done commands  : %-10u    Reads          : %-10u\n"  			"Writes         : %-10u    Others         : %-10u\n" @@ -2886,7 +2881,7 @@ int acornscsi_proc_info(struct Scsi_Host *instance, char *buffer, char **start,      for (devidx = 0; devidx < 9; devidx ++) {  	unsigned int statptr, prev; -	p += sprintf(p, "\n%c:", devidx == 8 ? 'H' : ('0' + devidx)); +	seq_printf(m, "\n%c:", devidx == 8 ? 'H' : ('0' + devidx));  	statptr = host->status_ptr[devidx] - 10;  	if ((signed int)statptr < 0) @@ -2896,7 +2891,7 @@ int acornscsi_proc_info(struct Scsi_Host *instance, char *buffer, char **start,  	for (; statptr != host->status_ptr[devidx]; statptr = (statptr + 1) & (STATUS_BUFFER_SIZE - 1)) {  	    if (host->status[devidx][statptr].when) { -		p += sprintf(p, "%c%02X:%02X+%2ld", +		seq_printf(m, "%c%02X:%02X+%2ld",  			host->status[devidx][statptr].irq ? '-' : ' ',  			host->status[devidx][statptr].ph,  			host->status[devidx][statptr].ssr, @@ -2907,51 +2902,32 @@ int acornscsi_proc_info(struct Scsi_Host *instance, char *buffer, char **start,  	}      } -    p += sprintf(p, "\nAttached devices:\n"); +    seq_printf(m, "\nAttached devices:\n");      shost_for_each_device(scd, instance) { -	p += sprintf(p, "Device/Lun TaggedQ      Sync\n"); -	p += sprintf(p, "     %d/%d   ", scd->id, scd->lun); +	seq_printf(m, "Device/Lun TaggedQ      Sync\n"); +	seq_printf(m, "     %d/%d   ", scd->id, scd->lun);  	if (scd->tagged_supported) -		p += sprintf(p, "%3sabled(%3d) ", +		seq_printf(m, "%3sabled(%3d) ",  			     scd->simple_tags ? "en" : "dis",  			     scd->current_tag);  	else -		p += sprintf(p, "unsupported  "); +		seq_printf(m, "unsupported  ");  	if (host->device[scd->id].sync_xfer & 15) -		p += sprintf(p, "offset %d, %d ns\n", +		seq_printf(m, "offset %d, %d ns\n",  			     host->device[scd->id].sync_xfer & 15,  			     acornscsi_getperiod(host->device[scd->id].sync_xfer));  	else -		p += sprintf(p, "async\n"); +		seq_printf(m, "async\n"); -	pos = p - buffer; -	if (pos + begin < offset) { -	    begin += pos; -	    p = buffer; -	} -	pos = p - buffer; -	if (pos + begin > offset + length) { -	    scsi_device_put(scd); -	    break; -	}      } - -    pos = p - buffer; - -    *start = buffer + (offset - begin); -    pos -= offset - begin; - -    if (pos > length) -	pos = length; - -    return pos; +    return 0;  }  static struct scsi_host_template acornscsi_template = {  	.module			= THIS_MODULE, -	.proc_info		= acornscsi_proc_info, +	.show_info		= acornscsi_show_info,  	.name			= "AcornSCSI",  	.info			= acornscsi_info,  	.queuecommand		= acornscsi_queuecmd, diff --git a/drivers/scsi/arm/arxescsi.c b/drivers/scsi/arm/arxescsi.c index 9274510294a..32d23212de4 100644 --- a/drivers/scsi/arm/arxescsi.c +++ b/drivers/scsi/arm/arxescsi.c @@ -220,47 +220,21 @@ static const char *arxescsi_info(struct Scsi_Host *host)  	return string;  } -/* - * Function: int arxescsi_proc_info(char *buffer, char **start, off_t offset, - *					 int length, int host_no, int inout) - * Purpose : Return information about the driver to a user process accessing - *	     the /proc filesystem. - * Params  : buffer - a buffer to write information to - *	     start  - a pointer into this buffer set by this routine to the start - *		      of the required information. - *	     offset - offset into information that we have read up to. - *	     length - length of buffer - *	     host_no - host number to return information for - *	     inout  - 0 for reading, 1 for writing. - * Returns : length of data written to buffer. - */  static int -arxescsi_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset, int length, -		   int inout) +arxescsi_show_info(struct seq_file *m, struct Scsi_Host *host)  {  	struct arxescsi_info *info; -	char *p = buffer; -	int pos; -  	info = (struct arxescsi_info *)host->hostdata; -	if (inout == 1) -		return -EINVAL; - -	p += sprintf(p, "ARXE 16-bit SCSI driver v%s\n", VERSION); -	p += fas216_print_host(&info->info, p); -	p += fas216_print_stats(&info->info, p); -	p += fas216_print_devices(&info->info, p); - -	*start = buffer + offset; -	pos = p - buffer - offset; -	if (pos > length) -		pos = length; -	return pos; +	seq_printf(m, "ARXE 16-bit SCSI driver v%s\n", VERSION); +	fas216_print_host(&info->info, m); +	fas216_print_stats(&info->info, m); +	fas216_print_devices(&info->info, m); +	return 0;  }  static struct scsi_host_template arxescsi_template = { -	.proc_info			= arxescsi_proc_info, +	.show_info			= arxescsi_show_info,  	.name				= "ARXE SCSI card",  	.info				= arxescsi_info,  	.queuecommand			= fas216_noqueue_command, diff --git a/drivers/scsi/arm/cumana_1.c b/drivers/scsi/arm/cumana_1.c index c93938b246d..b679778376c 100644 --- a/drivers/scsi/arm/cumana_1.c +++ b/drivers/scsi/arm/cumana_1.c @@ -30,7 +30,6 @@  #define NCR5380_write(reg, value)	cumanascsi_write(_instance, reg, value)  #define NCR5380_intr			cumanascsi_intr  #define NCR5380_queue_command		cumanascsi_queue_command -#define NCR5380_proc_info		cumanascsi_proc_info  #define NCR5380_implementation_fields	\  	unsigned ctrl;			\ diff --git a/drivers/scsi/arm/cumana_2.c b/drivers/scsi/arm/cumana_2.c index e3bae93c3c2..58915f29055 100644 --- a/drivers/scsi/arm/cumana_2.c +++ b/drivers/scsi/arm/cumana_2.c @@ -337,50 +337,25 @@ cumanascsi_2_set_proc_info(struct Scsi_Host *host, char *buffer, int length)  	return ret;  } -/* Prototype: int cumanascsi_2_proc_info(char *buffer, char **start, off_t offset, - *					 int length, int host_no, int inout) - * Purpose  : Return information about the driver to a user process accessing - *	      the /proc filesystem. - * Params   : buffer - a buffer to write information to - *	      start  - a pointer into this buffer set by this routine to the start - *		       of the required information. - *	      offset - offset into information that we have read up to. - *	      length - length of buffer - *	      host_no - host number to return information for - *	      inout  - 0 for reading, 1 for writing. - * Returns  : length of data written to buffer. - */ -int cumanascsi_2_proc_info (struct Scsi_Host *host, char *buffer, char **start, off_t offset, -			    int length, int inout) +static int cumanascsi_2_show_info(struct seq_file *m, struct Scsi_Host *host)  {  	struct cumanascsi2_info *info; -	char *p = buffer; -	int pos; - -	if (inout == 1) -		return cumanascsi_2_set_proc_info(host, buffer, length); -  	info = (struct cumanascsi2_info *)host->hostdata; -	p += sprintf(p, "Cumana SCSI II driver v%s\n", VERSION); -	p += fas216_print_host(&info->info, p); -	p += sprintf(p, "Term    : o%s\n", +	seq_printf(m, "Cumana SCSI II driver v%s\n", VERSION); +	fas216_print_host(&info->info, m); +	seq_printf(m, "Term    : o%s\n",  			info->terms ? "n" : "ff"); -	p += fas216_print_stats(&info->info, p); -	p += fas216_print_devices(&info->info, p); - -	*start = buffer + offset; -	pos = p - buffer - offset; -	if (pos > length) -		pos = length; - -	return pos; +	fas216_print_stats(&info->info, m); +	fas216_print_devices(&info->info, m); +	return 0;  }  static struct scsi_host_template cumanascsi2_template = {  	.module				= THIS_MODULE, -	.proc_info			= cumanascsi_2_proc_info, +	.show_info			= cumanascsi_2_show_info, +	.write_info			= cumanascsi_2_set_proc_info,  	.name				= "Cumana SCSI II",  	.info				= cumanascsi_2_info,  	.queuecommand			= fas216_queue_command, diff --git a/drivers/scsi/arm/eesox.c b/drivers/scsi/arm/eesox.c index 8e36908415e..5bf3c0d134b 100644 --- a/drivers/scsi/arm/eesox.c +++ b/drivers/scsi/arm/eesox.c @@ -422,45 +422,20 @@ eesoxscsi_set_proc_info(struct Scsi_Host *host, char *buffer, int length)  	return ret;  } -/* Prototype: int eesoxscsi_proc_info(char *buffer, char **start, off_t offset, - *				      int length, int host_no, int inout) - * Purpose  : Return information about the driver to a user process accessing - *	      the /proc filesystem. - * Params   : buffer - a buffer to write information to - *	      start  - a pointer into this buffer set by this routine to the start - *		       of the required information. - *	      offset - offset into information that we have read up to. - *	      length - length of buffer - *	      host_no - host number to return information for - *	      inout  - 0 for reading, 1 for writing. - * Returns  : length of data written to buffer. - */ -int eesoxscsi_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset, -			    int length, int inout) +static int eesoxscsi_show_info(struct seq_file *m, struct Scsi_Host *host)  {  	struct eesoxscsi_info *info; -	char *p = buffer; -	int pos; - -	if (inout == 1) -		return eesoxscsi_set_proc_info(host, buffer, length);  	info = (struct eesoxscsi_info *)host->hostdata; -	p += sprintf(p, "EESOX SCSI driver v%s\n", VERSION); -	p += fas216_print_host(&info->info, p); -	p += sprintf(p, "Term    : o%s\n", +	seq_printf(m, "EESOX SCSI driver v%s\n", VERSION); +	fas216_print_host(&info->info, m); +	seq_printf(m, "Term    : o%s\n",  			info->control & EESOX_TERM_ENABLE ? "n" : "ff"); -	p += fas216_print_stats(&info->info, p); -	p += fas216_print_devices(&info->info, p); - -	*start = buffer + offset; -	pos = p - buffer - offset; -	if (pos > length) -		pos = length; - -	return pos; +	fas216_print_stats(&info->info, m); +	fas216_print_devices(&info->info, m); +	return 0;  }  static ssize_t eesoxscsi_show_term(struct device *dev, struct device_attribute *attr, char *buf) @@ -498,7 +473,8 @@ static DEVICE_ATTR(bus_term, S_IRUGO | S_IWUSR,  static struct scsi_host_template eesox_template = {  	.module				= THIS_MODULE, -	.proc_info			= eesoxscsi_proc_info, +	.show_info			= eesoxscsi_show_info, +	.write_info			= eesoxscsi_set_proc_info,  	.name				= "EESOX SCSI",  	.info				= eesoxscsi_info,  	.queuecommand			= fas216_queue_command, diff --git a/drivers/scsi/arm/fas216.c b/drivers/scsi/arm/fas216.c index 737554c37d9..b46a6f6c0eb 100644 --- a/drivers/scsi/arm/fas216.c +++ b/drivers/scsi/arm/fas216.c @@ -2958,9 +2958,9 @@ void fas216_release(struct Scsi_Host *host)  	queue_free(&info->queues.issue);  } -int fas216_print_host(FAS216_Info *info, char *buffer) +void fas216_print_host(FAS216_Info *info, struct seq_file *m)  { -	return sprintf(buffer, +	seq_printf(m,  			"\n"  			"Chip    : %s\n"  			" Address: 0x%p\n" @@ -2970,11 +2970,9 @@ int fas216_print_host(FAS216_Info *info, char *buffer)  			info->scsi.irq, info->scsi.dma);  } -int fas216_print_stats(FAS216_Info *info, char *buffer) +void fas216_print_stats(FAS216_Info *info, struct seq_file *m)  { -	char *p = buffer; - -	p += sprintf(p, "\n" +	seq_printf(m, "\n"  			"Command Statistics:\n"  			" Queued     : %u\n"  			" Issued     : %u\n" @@ -2991,38 +2989,33 @@ int fas216_print_stats(FAS216_Info *info, char *buffer)  			info->stats.writes,	 info->stats.miscs,  			info->stats.disconnects, info->stats.aborts,  			info->stats.bus_resets,	 info->stats.host_resets); - -	return p - buffer;  } -int fas216_print_devices(FAS216_Info *info, char *buffer) +void fas216_print_devices(FAS216_Info *info, struct seq_file *m)  {  	struct fas216_device *dev;  	struct scsi_device *scd; -	char *p = buffer; -	p += sprintf(p, "Device/Lun TaggedQ       Parity   Sync\n"); +	seq_printf(m, "Device/Lun TaggedQ       Parity   Sync\n");  	shost_for_each_device(scd, info->host) {  		dev = &info->device[scd->id]; -		p += sprintf(p, "     %d/%d   ", scd->id, scd->lun); +		seq_printf(m, "     %d/%d   ", scd->id, scd->lun);  		if (scd->tagged_supported) -			p += sprintf(p, "%3sabled(%3d) ", +			seq_printf(m, "%3sabled(%3d) ",  				     scd->simple_tags ? "en" : "dis",  				     scd->current_tag);  		else -			p += sprintf(p, "unsupported   "); +			seq_printf(m, "unsupported   "); -		p += sprintf(p, "%3sabled ", dev->parity_enabled ? "en" : "dis"); +		seq_printf(m, "%3sabled ", dev->parity_enabled ? "en" : "dis");  		if (dev->sof) -			p += sprintf(p, "offset %d, %d ns\n", +			seq_printf(m, "offset %d, %d ns\n",  				     dev->sof, dev->period * 4);  		else -			p += sprintf(p, "async\n"); +			seq_printf(m, "async\n");  	} - -	return p - buffer;  }  EXPORT_SYMBOL(fas216_init); diff --git a/drivers/scsi/arm/fas216.h b/drivers/scsi/arm/fas216.h index df2e1b3ddfe..c57c16ef819 100644 --- a/drivers/scsi/arm/fas216.h +++ b/drivers/scsi/arm/fas216.h @@ -358,9 +358,9 @@ extern void fas216_remove (struct Scsi_Host *instance);   */  extern void fas216_release (struct Scsi_Host *instance); -extern int fas216_print_host(FAS216_Info *info, char *buffer); -extern int fas216_print_stats(FAS216_Info *info, char *buffer); -extern int fas216_print_devices(FAS216_Info *info, char *buffer); +extern void fas216_print_host(FAS216_Info *info, struct seq_file *m); +extern void fas216_print_stats(FAS216_Info *info, struct seq_file *m); +extern void fas216_print_devices(FAS216_Info *info, struct seq_file *m);  /* Function: int fas216_eh_abort(struct scsi_cmnd *SCpnt)   * Purpose : abort this command diff --git a/drivers/scsi/arm/oak.c b/drivers/scsi/arm/oak.c index 48facdc1800..4266eef8aca 100644 --- a/drivers/scsi/arm/oak.c +++ b/drivers/scsi/arm/oak.c @@ -31,7 +31,8 @@  #define NCR5380_write(reg, value)	writeb(value, _base + ((reg) << 2))  #define NCR5380_intr			oakscsi_intr  #define NCR5380_queue_command		oakscsi_queue_command -#define NCR5380_proc_info		oakscsi_proc_info +#define NCR5380_show_info		oakscsi_show_info +#define NCR5380_write_info		oakscsi_write_info  #define NCR5380_implementation_fields	\  	void __iomem *base @@ -115,7 +116,8 @@ printk("reading %p len %d\n", addr, len);  static struct scsi_host_template oakscsi_template = {  	.module			= THIS_MODULE, -	.proc_info		= oakscsi_proc_info, +	.show_info		= oakscsi_show_info, +	.write_info		= oakscsi_write_info,  	.name			= "Oak 16-bit SCSI",  	.info			= oakscsi_info,  	.queuecommand		= oakscsi_queue_command, diff --git a/drivers/scsi/arm/powertec.c b/drivers/scsi/arm/powertec.c index 246600b9355..abc9593615e 100644 --- a/drivers/scsi/arm/powertec.c +++ b/drivers/scsi/arm/powertec.c @@ -237,32 +237,20 @@ powertecscsi_set_proc_info(struct Scsi_Host *host, char *buffer, int length)   *	      inout   - 0 for reading, 1 for writing.   * Returns  : length of data written to buffer.   */ -int powertecscsi_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset, -			    int length, int inout) +static int powertecscsi_show_info(struct seq_file *m, struct Scsi_Host *host)  {  	struct powertec_info *info; -	char *p = buffer; -	int pos; - -	if (inout == 1) -		return powertecscsi_set_proc_info(host, buffer, length);  	info = (struct powertec_info *)host->hostdata; -	p += sprintf(p, "PowerTec SCSI driver v%s\n", VERSION); -	p += fas216_print_host(&info->info, p); -	p += sprintf(p, "Term    : o%s\n", +	seq_printf(m, "PowerTec SCSI driver v%s\n", VERSION); +	fas216_print_host(&info->info, m); +	seq_printf(m, "Term    : o%s\n",  			info->term_ctl ? "n" : "ff"); -	p += fas216_print_stats(&info->info, p); -	p += fas216_print_devices(&info->info, p); - -	*start = buffer + offset; -	pos = p - buffer - offset; -	if (pos > length) -		pos = length; - -	return pos; +	fas216_print_stats(&info->info, m); +	fas216_print_devices(&info->info, m); +	return 0;  }  static ssize_t powertecscsi_show_term(struct device *dev, struct device_attribute *attr, char *buf) @@ -291,7 +279,8 @@ static DEVICE_ATTR(bus_term, S_IRUGO | S_IWUSR,  static struct scsi_host_template powertecscsi_template = {  	.module				= THIS_MODULE, -	.proc_info			= powertecscsi_proc_info, +	.show_info			= powertecscsi_show_info, +	.write_info			= powertecscsi_set_proc_info,  	.name				= "PowerTec SCSI",  	.info				= powertecscsi_info,  	.queuecommand			= fas216_queue_command, diff --git a/drivers/scsi/atari_NCR5380.c b/drivers/scsi/atari_NCR5380.c index 2db79b469d9..0f3cdbc80ba 100644 --- a/drivers/scsi/atari_NCR5380.c +++ b/drivers/scsi/atari_NCR5380.c @@ -719,119 +719,94 @@ static void __init NCR5380_print_options(struct Scsi_Host *instance)   * Inputs : instance, pointer to this instance.   */ -static void NCR5380_print_status(struct Scsi_Host *instance) +static void lprint_Scsi_Cmnd(Scsi_Cmnd *cmd)  { -	char *pr_bfr; -	char *start; -	int len; - -	NCR_PRINT(NDEBUG_ANY); -	NCR_PRINT_PHASE(NDEBUG_ANY); - -	pr_bfr = (char *)__get_free_page(GFP_ATOMIC); -	if (!pr_bfr) { -		printk("NCR5380_print_status: no memory for print buffer\n"); -		return; -	} -	len = NCR5380_proc_info(instance, pr_bfr, &start, 0, PAGE_SIZE, 0); -	pr_bfr[len] = 0; -	printk("\n%s\n", pr_bfr); -	free_page((unsigned long)pr_bfr); +	int i, s; +	unsigned char *command; +	printk("scsi%d: destination target %d, lun %d\n", +		H_NO(cmd), cmd->device->id, cmd->device->lun); +	printk(KERN_CONT "        command = "); +	command = cmd->cmnd; +	printk(KERN_CONT "%2d (0x%02x)", command[0], command[0]); +	for (i = 1, s = COMMAND_SIZE(command[0]); i < s; ++i) +		printk(KERN_CONT " %02x", command[i]); +	printk("\n");  } - -/******************************************/ -/* - * /proc/scsi/[dtc pas16 t128 generic]/[0-ASC_NUM_BOARD_SUPPORTED] - * - * *buffer: I/O buffer - * **start: if inout == FALSE pointer into buffer where user read should start - * offset: current offset - * length: length of buffer - * hostno: Scsi_Host host_no - * inout: TRUE - user is writing; FALSE - user is reading - * - * Return the number of bytes read from or written -*/ - -#undef SPRINTF -#define SPRINTF(fmt,args...)							\ -	do {									\ -		if (pos + strlen(fmt) + 20 /* slop */ < buffer + length)	\ -			pos += sprintf(pos, fmt , ## args);			\ -	} while(0) -static char *lprint_Scsi_Cmnd(Scsi_Cmnd *cmd, char *pos, char *buffer, int length); - -static int NCR5380_proc_info(struct Scsi_Host *instance, char *buffer, -			     char **start, off_t offset, int length, int inout) +static void NCR5380_print_status(struct Scsi_Host *instance)  { -	char *pos = buffer;  	struct NCR5380_hostdata *hostdata;  	Scsi_Cmnd *ptr;  	unsigned long flags; -	off_t begin = 0; -#define check_offset()					\ -	do {						\ -		if (pos - buffer < offset - begin) {	\ -			begin += pos - buffer;		\ -			pos = buffer;			\ -		}					\ -	} while (0) + +	NCR_PRINT(NDEBUG_ANY); +	NCR_PRINT_PHASE(NDEBUG_ANY);  	hostdata = (struct NCR5380_hostdata *)instance->hostdata; -	if (inout)			/* Has data been written to the file ? */ -		return -ENOSYS;		/* Currently this is a no-op */ -	SPRINTF("NCR5380 core release=%d.\n", NCR5380_PUBLIC_RELEASE); -	check_offset(); +	printk("\nNCR5380 core release=%d.\n", NCR5380_PUBLIC_RELEASE);  	local_irq_save(flags); -	SPRINTF("NCR5380: coroutine is%s running.\n", +	printk("NCR5380: coroutine is%s running.\n",  		main_running ? "" : "n't"); -	check_offset();  	if (!hostdata->connected) -		SPRINTF("scsi%d: no currently connected command\n", HOSTNO); +		printk("scsi%d: no currently connected command\n", HOSTNO);  	else -		pos = lprint_Scsi_Cmnd((Scsi_Cmnd *) hostdata->connected, -				       pos, buffer, length); -	SPRINTF("scsi%d: issue_queue\n", HOSTNO); -	check_offset(); -	for (ptr = (Scsi_Cmnd *)hostdata->issue_queue; ptr; ptr = NEXT(ptr)) { -		pos = lprint_Scsi_Cmnd(ptr, pos, buffer, length); -		check_offset(); -	} +		lprint_Scsi_Cmnd((Scsi_Cmnd *) hostdata->connected); +	printk("scsi%d: issue_queue\n", HOSTNO); +	for (ptr = (Scsi_Cmnd *)hostdata->issue_queue; ptr; ptr = NEXT(ptr)) +		lprint_Scsi_Cmnd(ptr); -	SPRINTF("scsi%d: disconnected_queue\n", HOSTNO); -	check_offset(); +	printk("scsi%d: disconnected_queue\n", HOSTNO);  	for (ptr = (Scsi_Cmnd *) hostdata->disconnected_queue; ptr; -	     ptr = NEXT(ptr)) { -		pos = lprint_Scsi_Cmnd(ptr, pos, buffer, length); -		check_offset(); -	} +	     ptr = NEXT(ptr)) +		lprint_Scsi_Cmnd(ptr);  	local_irq_restore(flags); -	*start = buffer + (offset - begin); -	if (pos - buffer < offset - begin) -		return 0; -	else if (pos - buffer - (offset - begin) < length) -		return pos - buffer - (offset - begin); -	return length; +	printk("\n");  } -static char *lprint_Scsi_Cmnd(Scsi_Cmnd *cmd, char *pos, char *buffer, int length) +static void show_Scsi_Cmnd(Scsi_Cmnd *cmd, struct seq_file *m)  {  	int i, s;  	unsigned char *command; -	SPRINTF("scsi%d: destination target %d, lun %d\n", +	seq_printf(m, "scsi%d: destination target %d, lun %d\n",  		H_NO(cmd), cmd->device->id, cmd->device->lun); -	SPRINTF("        command = "); +	seq_printf(m, "        command = ");  	command = cmd->cmnd; -	SPRINTF("%2d (0x%02x)", command[0], command[0]); +	seq_printf(m, "%2d (0x%02x)", command[0], command[0]);  	for (i = 1, s = COMMAND_SIZE(command[0]); i < s; ++i) -		SPRINTF(" %02x", command[i]); -	SPRINTF("\n"); -	return pos; +		seq_printf(m, " %02x", command[i]); +	seq_printf(m, "\n");  } +static int NCR5380_show_info(struct seq_file *m, struct Scsi_Host *instance) +{ +	struct NCR5380_hostdata *hostdata; +	Scsi_Cmnd *ptr; +	unsigned long flags; + +	hostdata = (struct NCR5380_hostdata *)instance->hostdata; + +	seq_printf(m, "NCR5380 core release=%d.\n", NCR5380_PUBLIC_RELEASE); +	local_irq_save(flags); +	seq_printf(m, "NCR5380: coroutine is%s running.\n", +		main_running ? "" : "n't"); +	if (!hostdata->connected) +		seq_printf(m, "scsi%d: no currently connected command\n", HOSTNO); +	else +		show_Scsi_Cmnd((Scsi_Cmnd *) hostdata->connected, m); +	seq_printf(m, "scsi%d: issue_queue\n", HOSTNO); +	for (ptr = (Scsi_Cmnd *)hostdata->issue_queue; ptr; ptr = NEXT(ptr)) +		show_Scsi_Cmnd(ptr, m); + +	seq_printf(m, "scsi%d: disconnected_queue\n", HOSTNO); +	for (ptr = (Scsi_Cmnd *) hostdata->disconnected_queue; ptr; +	     ptr = NEXT(ptr)) +		show_Scsi_Cmnd(ptr, m); + +	local_irq_restore(flags); +	return 0; +}  /*   * Function : void NCR5380_init (struct Scsi_Host *instance) diff --git a/drivers/scsi/atari_scsi.c b/drivers/scsi/atari_scsi.c index df740cbbaef..a3e6c8a3ff0 100644 --- a/drivers/scsi/atari_scsi.c +++ b/drivers/scsi/atari_scsi.c @@ -1100,7 +1100,7 @@ static void atari_scsi_falcon_reg_write(unsigned char reg, unsigned char value)  #include "atari_NCR5380.c"  static struct scsi_host_template driver_template = { -	.proc_info		= atari_scsi_proc_info, +	.show_info		= atari_scsi_show_info,  	.name			= "Atari native SCSI",  	.detect			= atari_scsi_detect,  	.release		= atari_scsi_release, diff --git a/drivers/scsi/atari_scsi.h b/drivers/scsi/atari_scsi.h index bd52df78b20..11c624bb122 100644 --- a/drivers/scsi/atari_scsi.h +++ b/drivers/scsi/atari_scsi.h @@ -47,7 +47,7 @@  #define NCR5380_intr atari_scsi_intr  #define NCR5380_queue_command atari_scsi_queue_command  #define NCR5380_abort atari_scsi_abort -#define NCR5380_proc_info atari_scsi_proc_info +#define NCR5380_show_info atari_scsi_show_info  #define NCR5380_dma_read_setup(inst,d,c) atari_scsi_dma_setup (inst, d, c, 0)  #define NCR5380_dma_write_setup(inst,d,c) atari_scsi_dma_setup (inst, d, c, 1)  #define NCR5380_dma_residual(inst) atari_scsi_dma_residual( inst ) diff --git a/drivers/scsi/atp870u.c b/drivers/scsi/atp870u.c index cfc73041f10..15a629d8ed0 100644 --- a/drivers/scsi/atp870u.c +++ b/drivers/scsi/atp870u.c @@ -3099,38 +3099,14 @@ static const char *atp870u_info(struct Scsi_Host *notused)  	return buffer;  } -#define BLS buffer + len + size -static int atp870u_proc_info(struct Scsi_Host *HBAptr, char *buffer,  -			     char **start, off_t offset, int length, int inout) +static int atp870u_show_info(struct seq_file *m, struct Scsi_Host *HBAptr)  { -	static u8 buff[512]; -	int size = 0; -	int len = 0; -	off_t begin = 0; -	off_t pos = 0; -	 -	if (inout) 	 -		return -EINVAL; -	if (offset == 0) -		memset(buff, 0, sizeof(buff)); -	size += sprintf(BLS, "ACARD AEC-671X Driver Version: 2.6+ac\n"); -	len += size; -	pos = begin + len; -	size = 0; - -	size += sprintf(BLS, "\n"); -	size += sprintf(BLS, "Adapter Configuration:\n"); -	size += sprintf(BLS, "               Base IO: %#.4lx\n", HBAptr->io_port); -	size += sprintf(BLS, "                   IRQ: %d\n", HBAptr->irq); -	len += size; -	pos = begin + len; -	 -	*start = buffer + (offset - begin);	/* Start of wanted data */ -	len -= (offset - begin);	/* Start slop */ -	if (len > length) { -		len = length;	/* Ending slop */ -	} -	return (len); +	seq_printf(m, "ACARD AEC-671X Driver Version: 2.6+ac\n"); +	seq_printf(m, "\n"); +	seq_printf(m, "Adapter Configuration:\n"); +	seq_printf(m, "               Base IO: %#.4lx\n", HBAptr->io_port); +	seq_printf(m, "                   IRQ: %d\n", HBAptr->irq); +	return 0;  } @@ -3177,7 +3153,7 @@ static struct scsi_host_template atp870u_template = {       .module			= THIS_MODULE,       .name              	= "atp870u"		/* name */,       .proc_name			= "atp870u", -     .proc_info			= atp870u_proc_info, +     .show_info			= atp870u_show_info,       .info              	= atp870u_info		/* info */,       .queuecommand      	= atp870u_queuecommand	/* queuecommand */,       .eh_abort_handler  	= atp870u_abort		/* abort */, diff --git a/drivers/scsi/dc395x.c b/drivers/scsi/dc395x.c index fed486bfd3f..694e13c45df 100644 --- a/drivers/scsi/dc395x.c +++ b/drivers/scsi/dc395x.c @@ -4616,26 +4616,21 @@ static void adapter_uninit(struct AdapterCtlBlk *acb)  #undef SPRINTF -#define SPRINTF(args...) pos += sprintf(pos, args) +#define SPRINTF(args...) seq_printf(m,##args)  #undef YESNO  #define YESNO(YN) \   if (YN) SPRINTF(" Yes ");\   else SPRINTF(" No  ") -static int dc395x_proc_info(struct Scsi_Host *host, char *buffer, -		char **start, off_t offset, int length, int inout) +static int dc395x_show_info(struct seq_file *m, struct Scsi_Host *host)  {  	struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)host->hostdata;  	int spd, spd1; -	char *pos = buffer;  	struct DeviceCtlBlk *dcb;  	unsigned long flags;  	int dev; -	if (inout)		/* Has data been written to the file ? */ -		return -EPERM; -  	SPRINTF(DC395X_BANNER " PCI SCSI Host Adapter\n");  	SPRINTF(" Driver Version " DC395X_VERSION "\n"); @@ -4735,22 +4730,15 @@ static int dc395x_proc_info(struct Scsi_Host *host, char *buffer,  		SPRINTF("END\n");  	} -	*start = buffer + offset;  	DC395x_UNLOCK_IO(acb->scsi_host, flags); - -	if (pos - buffer < offset) -		return 0; -	else if (pos - buffer - offset < length) -		return pos - buffer - offset; -	else -		return length; +	return 0;  }  static struct scsi_host_template dc395x_driver_template = {  	.module                 = THIS_MODULE,  	.proc_name              = DC395X_NAME, -	.proc_info              = dc395x_proc_info, +	.show_info              = dc395x_show_info,  	.name                   = DC395X_BANNER " " DC395X_VERSION,  	.queuecommand           = dc395x_queue_command,  	.bios_param             = dc395x_bios_param, diff --git a/drivers/scsi/dpt_i2o.c b/drivers/scsi/dpt_i2o.c index b6e2700ec1c..19e1b422260 100644 --- a/drivers/scsi/dpt_i2o.c +++ b/drivers/scsi/dpt_i2o.c @@ -553,36 +553,14 @@ static const char *adpt_info(struct Scsi_Host *host)  	return (char *) (pHba->detail);  } -static int adpt_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset, -		  int length, int inout) +static int adpt_show_info(struct seq_file *m, struct Scsi_Host *host)  {  	struct adpt_device* d;  	int id;  	int chan; -	int len = 0; -	int begin = 0; -	int pos = 0;  	adpt_hba* pHba;  	int unit; -	*start = buffer; -	if (inout == TRUE) { -		/* -		 * The user has done a write and wants us to take the -		 * data in the buffer and do something with it. -		 * proc_scsiwrite calls us with inout = 1 -		 * -		 * Read data from buffer (writing to us) - NOT SUPPORTED -		 */ -		return -EINVAL; -	} - -	/* -	 * inout = 0 means the user has done a read and wants information -	 * returned, so we write information about the cards into the buffer -	 * proc_scsiread() calls us with inout = 0 -	 */ -  	// Find HBA (host bus adapter) we are looking for  	mutex_lock(&adpt_configuration_lock);  	for (pHba = hba_chain; pHba; pHba = pHba->next) { @@ -596,86 +574,30 @@ static int adpt_proc_info(struct Scsi_Host *host, char *buffer, char **start, of  	}  	host = pHba->host; -	len  = sprintf(buffer    , "Adaptec I2O RAID Driver Version: %s\n\n", DPT_I2O_VERSION); -	len += sprintf(buffer+len, "%s\n", pHba->detail); -	len += sprintf(buffer+len, "SCSI Host=scsi%d  Control Node=/dev/%s  irq=%d\n",  +	seq_printf(m, "Adaptec I2O RAID Driver Version: %s\n\n", DPT_I2O_VERSION); +	seq_printf(m, "%s\n", pHba->detail); +	seq_printf(m, "SCSI Host=scsi%d  Control Node=/dev/%s  irq=%d\n",   			pHba->host->host_no, pHba->name, host->irq); -	len += sprintf(buffer+len, "\tpost fifo size  = %d\n\treply fifo size = %d\n\tsg table size   = %d\n\n", +	seq_printf(m, "\tpost fifo size  = %d\n\treply fifo size = %d\n\tsg table size   = %d\n\n",  			host->can_queue, (int) pHba->reply_fifo_size , host->sg_tablesize); -	pos = begin + len; - -	/* CHECKPOINT */ -	if(pos > offset + length) { -		goto stop_output; -	} -	if(pos <= offset) { -		/* -		 * If we haven't even written to where we last left -		 * off (the last time we were called), reset the  -		 * beginning pointer. -		 */ -		len = 0; -		begin = pos; -	} -	len +=  sprintf(buffer+len, "Devices:\n"); +	seq_printf(m, "Devices:\n");  	for(chan = 0; chan < MAX_CHANNEL; chan++) {  		for(id = 0; id < MAX_ID; id++) {  			d = pHba->channel[chan].device[id]; -			while(d){ -				len += sprintf(buffer+len,"\t%-24.24s", d->pScsi_dev->vendor); -				len += sprintf(buffer+len," Rev: %-8.8s\n", d->pScsi_dev->rev); -				pos = begin + len; - - -				/* CHECKPOINT */ -				if(pos > offset + length) { -					goto stop_output; -				} -				if(pos <= offset) { -					len = 0; -					begin = pos; -				} +			while(d) { +				seq_printf(m,"\t%-24.24s", d->pScsi_dev->vendor); +				seq_printf(m," Rev: %-8.8s\n", d->pScsi_dev->rev);  				unit = d->pI2o_dev->lct_data.tid; -				len += sprintf(buffer+len, "\tTID=%d, (Channel=%d, Target=%d, Lun=%d)  (%s)\n\n", +				seq_printf(m, "\tTID=%d, (Channel=%d, Target=%d, Lun=%d)  (%s)\n\n",  					       unit, (int)d->scsi_channel, (int)d->scsi_id, (int)d->scsi_lun,  					       scsi_device_online(d->pScsi_dev)? "online":"offline");  -				pos = begin + len; - -				/* CHECKPOINT */ -				if(pos > offset + length) { -					goto stop_output; -				} -				if(pos <= offset) { -					len = 0; -					begin = pos; -				} -  				d = d->next_lun;  			}  		}  	} - -	/* -	 * begin is where we last checked our position with regards to offset -	 * begin is always less than offset.  len is relative to begin.  It -	 * is the number of bytes written past begin -	 * -	 */ -stop_output: -	/* stop the output and calculate the correct length */ -	*(buffer + len) = '\0'; - -	*start = buffer + (offset - begin);	/* Start of wanted data */ -	len -= (offset - begin); -	if(len > length) { -		len = length; -	} else if(len < 0){ -		len = 0; -		**start = '\0'; -	} -	return len; +	return 0;  }  /* @@ -3639,7 +3561,7 @@ static struct scsi_host_template driver_template = {  	.module			= THIS_MODULE,  	.name			= "dpt_i2o",  	.proc_name		= "dpt_i2o", -	.proc_info		= adpt_proc_info, +	.show_info		= adpt_show_info,  	.info			= adpt_info,  	.queuecommand		= adpt_queue,  	.eh_abort_handler	= adpt_abort, diff --git a/drivers/scsi/dtc.c b/drivers/scsi/dtc.c index 4b11bb04f5c..d01f0160414 100644 --- a/drivers/scsi/dtc.c +++ b/drivers/scsi/dtc.c @@ -216,7 +216,8 @@ static int __init dtc_detect(struct scsi_host_template * tpnt)  	int sig, count;  	tpnt->proc_name = "dtc3x80"; -	tpnt->proc_info = &dtc_proc_info; +	tpnt->show_info = dtc_show_info; +	tpnt->write_info = dtc_write_info;  	for (count = 0; current_override < NO_OVERRIDES; ++current_override) {  		addr = 0; diff --git a/drivers/scsi/dtc.h b/drivers/scsi/dtc.h index cdc621204b6..92d7cfc3f4f 100644 --- a/drivers/scsi/dtc.h +++ b/drivers/scsi/dtc.h @@ -88,7 +88,8 @@ static int dtc_bus_reset(Scsi_Cmnd *);  #define NCR5380_queue_command		dtc_queue_command  #define NCR5380_abort			dtc_abort  #define NCR5380_bus_reset		dtc_bus_reset -#define NCR5380_proc_info		dtc_proc_info  +#define NCR5380_show_info		dtc_show_info  +#define NCR5380_write_info		dtc_write_info   /* 15 12 11 10     1001 1100 0000 0000 */ diff --git a/drivers/scsi/eata_pio.c b/drivers/scsi/eata_pio.c index d5f8362335d..356def44ce5 100644 --- a/drivers/scsi/eata_pio.c +++ b/drivers/scsi/eata_pio.c @@ -92,58 +92,22 @@ static unsigned long queue_counter;  static struct scsi_host_template driver_template; -/* - * eata_proc_info - * inout : decides on the direction of the dataflow and the meaning of the  - *         variables - * buffer: If inout==FALSE data is being written to it else read from it - * *start: If inout==FALSE start of the valid data in the buffer - * offset: If inout==FALSE offset from the beginning of the imaginary file  - *         from which we start writing into the buffer - * length: If inout==FALSE max number of bytes to be written into the buffer  - *         else number of bytes in the buffer - */ -static int eata_pio_proc_info(struct Scsi_Host *shost, char *buffer, char **start, off_t offset, -			      int length, int rw) +static int eata_pio_show_info(struct seq_file *m, struct Scsi_Host *shost)  { -	int len = 0; -	off_t begin = 0, pos = 0; - -	if (rw) -		return -ENOSYS; - -	len += sprintf(buffer+len, "EATA (Extended Attachment) PIO driver version: " +	seq_printf(m, "EATA (Extended Attachment) PIO driver version: "  		   "%d.%d%s\n",VER_MAJOR, VER_MINOR, VER_SUB); -	len += sprintf(buffer + len, "queued commands:     %10ld\n" +	seq_printf(m, "queued commands:     %10ld\n"  		   "processed interrupts:%10ld\n", queue_counter, int_counter); -	len += sprintf(buffer + len, "\nscsi%-2d: HBA %.10s\n", +	seq_printf(m, "\nscsi%-2d: HBA %.10s\n",  		   shost->host_no, SD(shost)->name); -	len += sprintf(buffer + len, "Firmware revision: v%s\n", +	seq_printf(m, "Firmware revision: v%s\n",  		   SD(shost)->revision); -	len += sprintf(buffer + len, "IO: PIO\n"); -	len += sprintf(buffer + len, "Base IO : %#.4x\n", (u32) shost->base); -	len += sprintf(buffer + len, "Host Bus: %s\n", +	seq_printf(m, "IO: PIO\n"); +	seq_printf(m, "Base IO : %#.4x\n", (u32) shost->base); +	seq_printf(m, "Host Bus: %s\n",  		   (SD(shost)->bustype == 'P')?"PCI ":  		   (SD(shost)->bustype == 'E')?"EISA":"ISA "); -     -	pos = begin + len; -     -	if (pos < offset) { -		len = 0; -		begin = pos; -	} -	if (pos > offset + length) -		goto stop_output; -     -stop_output: -	DBG(DBG_PROC, printk("2pos: %ld offset: %ld len: %d\n", pos, offset, len)); -	*start = buffer + (offset - begin);   /* Start of wanted data */ -	len -= (offset - begin);            /* Start slop */ -	if (len > length) -		len = length;               /* Ending slop */ -	DBG(DBG_PROC, printk("3pos: %ld offset: %ld len: %d\n", pos, offset, len)); -     -	return len; +	return 0;  }  static int eata_pio_release(struct Scsi_Host *sh) @@ -985,7 +949,7 @@ static int eata_pio_detect(struct scsi_host_template *tpnt)  static struct scsi_host_template driver_template = {  	.proc_name		= "eata_pio",  	.name              	= "EATA (Extended Attachment) PIO driver", -	.proc_info         	= eata_pio_proc_info, +	.show_info         	= eata_pio_show_info,  	.detect            	= eata_pio_detect,  	.release           	= eata_pio_release,  	.queuecommand      	= eata_pio_queue, diff --git a/drivers/scsi/g_NCR5380.c b/drivers/scsi/g_NCR5380.c index 5041f925c19..5cec6c60ca2 100644 --- a/drivers/scsi/g_NCR5380.c +++ b/drivers/scsi/g_NCR5380.c @@ -745,42 +745,36 @@ static inline int NCR5380_pwrite(struct Scsi_Host *instance, unsigned char *src,  #include "NCR5380.c" -#define PRINTP(x) len += sprintf(buffer+len, x) +#define PRINTP(x) seq_printf(m, x)  #define ANDP , -static int sprint_opcode(char *buffer, int len, int opcode) +static void sprint_opcode(struct seq_file *m, int opcode)  { -	int start = len;  	PRINTP("0x%02x " ANDP opcode); -	return len - start;  } -static int sprint_command(char *buffer, int len, unsigned char *command) +static void sprint_command(struct seq_file *m, unsigned char *command)  { -	int i, s, start = len; -	len += sprint_opcode(buffer, len, command[0]); +	int i, s; +	sprint_opcode(m, command[0]);  	for (i = 1, s = COMMAND_SIZE(command[0]); i < s; ++i)  		PRINTP("%02x " ANDP command[i]);  	PRINTP("\n"); -	return len - start;  }  /**   *	sprintf_Scsi_Cmnd	-	print a scsi command - *	@buffer: buffr to print into - *	@len: buffer length + *	@m: seq_fil to print into   *	@cmd: SCSI command block   *	   *	Print out the target and command data in hex   */ -static int sprint_Scsi_Cmnd(char *buffer, int len, Scsi_Cmnd * cmd) +static void sprint_Scsi_Cmnd(struct seq_file *m, Scsi_Cmnd * cmd)  { -	int start = len;  	PRINTP("host number %d destination target %d, lun %d\n" ANDP cmd->device->host->host_no ANDP cmd->device->id ANDP cmd->device->lun);  	PRINTP("        command = "); -	len += sprint_command(buffer, len, cmd->cmnd); -	return len - start; +	sprint_command(m, cmd->cmnd);  }  /** @@ -800,9 +794,8 @@ static int sprint_Scsi_Cmnd(char *buffer, int len, Scsi_Cmnd * cmd)   *	Locks: global cli/lock for queue walk   */ -static int generic_NCR5380_proc_info(struct Scsi_Host *scsi_ptr, char *buffer, char **start, off_t offset, int length, int inout) +static int generic_NCR5380_show_info(struct seq_file *m, struct Scsi_Host *scsi_ptr)  { -	int len = 0;  	NCR5380_local_declare();  	unsigned long flags;  	unsigned char status; @@ -853,16 +846,16 @@ static int generic_NCR5380_proc_info(struct Scsi_Host *scsi_ptr, char *buffer, c  		PRINTP("  T:%d %s " ANDP dev->id ANDP scsi_device_type(dev->type));  		for (i = 0; i < 8; i++)  			if (dev->vendor[i] >= 0x20) -				*(buffer + (len++)) = dev->vendor[i]; -		*(buffer + (len++)) = ' '; +				seq_putc(m, dev->vendor[i]); +		seq_putc(m, ' ');  		for (i = 0; i < 16; i++)  			if (dev->model[i] >= 0x20) -				*(buffer + (len++)) = dev->model[i]; -		*(buffer + (len++)) = ' '; +				seq_putc(m, dev->model[i]); +		seq_putc(m, ' ');  		for (i = 0; i < 4; i++)  			if (dev->rev[i] >= 0x20) -				*(buffer + (len++)) = dev->rev[i]; -		*(buffer + (len++)) = ' '; +				seq_putc(m, dev->rev[i]); +		seq_putc(m, ' ');  		PRINTP("\n%10ld kb read    in %5ld secs" ANDP br / 1024 ANDP tr);  		if (tr) @@ -886,32 +879,28 @@ static int generic_NCR5380_proc_info(struct Scsi_Host *scsi_ptr, char *buffer, c  	if (!hostdata->connected) {  		PRINTP("No currently connected command\n");  	} else { -		len += sprint_Scsi_Cmnd(buffer, len, (Scsi_Cmnd *) hostdata->connected); +		sprint_Scsi_Cmnd(m, (Scsi_Cmnd *) hostdata->connected);  	}  	PRINTP("issue_queue\n");  	for (ptr = (Scsi_Cmnd *) hostdata->issue_queue; ptr; ptr = (Scsi_Cmnd *) ptr->host_scribble) -		len += sprint_Scsi_Cmnd(buffer, len, ptr); +		sprint_Scsi_Cmnd(m, ptr);  	PRINTP("disconnected_queue\n");  	for (ptr = (Scsi_Cmnd *) hostdata->disconnected_queue; ptr; ptr = (Scsi_Cmnd *) ptr->host_scribble) -		len += sprint_Scsi_Cmnd(buffer, len, ptr); +		sprint_Scsi_Cmnd(m, ptr); -	*start = buffer + offset; -	len -= offset; -	if (len > length) -		len = length;  	spin_unlock_irqrestore(scsi_ptr->host_lock, flags); -	return len; +	return 0;  }  #undef PRINTP  #undef ANDP  static struct scsi_host_template driver_template = { -	.proc_info      	= generic_NCR5380_proc_info, +	.show_info      	= generic_NCR5380_show_info,  	.name           	= "Generic NCR5380/NCR53C400 Scsi Driver",  	.detect         	= generic_NCR5380_detect,  	.release        	= generic_NCR5380_release_resources, diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c index 59bceac51a4..6d55b4e7e79 100644 --- a/drivers/scsi/gdth.c +++ b/drivers/scsi/gdth.c @@ -4676,7 +4676,8 @@ static struct scsi_host_template gdth_template = {          .eh_bus_reset_handler   = gdth_eh_bus_reset,          .slave_configure        = gdth_slave_configure,          .bios_param             = gdth_bios_param, -        .proc_info              = gdth_proc_info, +        .show_info              = gdth_show_info, +        .write_info             = gdth_set_info,  	.eh_timed_out		= gdth_timed_out,          .proc_name              = "gdth",          .can_queue              = GDTH_MAXCMDS, diff --git a/drivers/scsi/gdth.h b/drivers/scsi/gdth.h index fbf6f0f4b0d..3fd8b83ffbf 100644 --- a/drivers/scsi/gdth.h +++ b/drivers/scsi/gdth.h @@ -1007,6 +1007,7 @@ typedef struct {  /* function prototyping */ -int gdth_proc_info(struct Scsi_Host *, char *,char **,off_t,int,int); +int gdth_show_info(struct seq_file *, struct Scsi_Host *); +int gdth_set_info(struct Scsi_Host *, char *, int);  #endif diff --git a/drivers/scsi/gdth_proc.c b/drivers/scsi/gdth_proc.c index 652754319a4..9fb63268486 100644 --- a/drivers/scsi/gdth_proc.c +++ b/drivers/scsi/gdth_proc.c @@ -5,23 +5,9 @@  #include <linux/completion.h>  #include <linux/slab.h> -int gdth_proc_info(struct Scsi_Host *host, char *buffer,char **start,off_t offset,int length,    -                   int inout) +int gdth_set_info(struct Scsi_Host *host, char *buffer, int length)  {      gdth_ha_str *ha = shost_priv(host); - -    TRACE2(("gdth_proc_info() length %d offs %d inout %d\n", -            length,(int)offset,inout)); - -    if (inout) -        return(gdth_set_info(buffer,length,host,ha)); -    else -        return(gdth_get_info(buffer,start,offset,length,host,ha)); -} - -static int gdth_set_info(char *buffer,int length,struct Scsi_Host *host, -                         gdth_ha_str *ha) -{      int ret_val = -EINVAL;      TRACE2(("gdth_set_info() ha %d\n",ha->hanum,)); @@ -149,12 +135,10 @@ static int gdth_set_asc_info(struct Scsi_Host *host, char *buffer,      return(-EINVAL);  } -static int gdth_get_info(char *buffer,char **start,off_t offset,int length, -                         struct Scsi_Host *host, gdth_ha_str *ha) +int gdth_show_info(struct seq_file *m, struct Scsi_Host *host)  { -    int size = 0,len = 0; +    gdth_ha_str *ha = shost_priv(host);      int hlen; -    off_t begin = 0,pos = 0;      int id, i, j, k, sec, flag;      int no_mdrv = 0, drv_no, is_mirr;      u32 cnt; @@ -189,8 +173,7 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length,      /* request is i.e. "cat /proc/scsi/gdth/0" */       /* format: %-15s\t%-10s\t%-15s\t%s */      /* driver parameters */ -    size = sprintf(buffer+len,"Driver Parameters:\n"); -    len += size;  pos = begin + len; +    seq_printf(m, "Driver Parameters:\n");      if (reserve_list[0] == 0xff)          strcpy(hrec, "--");      else { @@ -201,69 +184,50 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length,              hlen += snprintf(hrec + hlen , 161 - hlen, ",%d", reserve_list[i]);          }      } -    size = sprintf(buffer+len, +    seq_printf(m,                     " reserve_mode: \t%d         \treserve_list:  \t%s\n",                     reserve_mode, hrec); -    len += size;  pos = begin + len; -    size = sprintf(buffer+len, +    seq_printf(m,                     " max_ids:      \t%-3d       \thdr_channel:   \t%d\n",                     max_ids, hdr_channel); -    len += size;  pos = begin + len;      /* controller information */ -    size = sprintf(buffer+len,"\nDisk Array Controller Information:\n"); -    len += size;  pos = begin + len; -    strcpy(hrec, ha->binfo.type_string); -    size = sprintf(buffer+len, +    seq_printf(m,"\nDisk Array Controller Information:\n"); +    seq_printf(m,                     " Number:       \t%d         \tName:          \t%s\n", -                   ha->hanum, hrec); -    len += size;  pos = begin + len; +                   ha->hanum, ha->binfo.type_string); +    seq_printf(m, +                   " Driver Ver.:  \t%-10s\tFirmware Ver.: \t", +                   GDTH_VERSION_STR);      if (ha->more_proc) -        sprintf(hrec, "%d.%02d.%02d-%c%03X",  +        seq_printf(m, "%d.%02d.%02d-%c%03X\n",                   (u8)(ha->binfo.upd_fw_ver>>24),                  (u8)(ha->binfo.upd_fw_ver>>16),                  (u8)(ha->binfo.upd_fw_ver),                  ha->bfeat.raid ? 'R':'N',                  ha->binfo.upd_revision);      else -        sprintf(hrec, "%d.%02d", (u8)(ha->cpar.version>>8), +        seq_printf(m, "%d.%02d\n", (u8)(ha->cpar.version>>8),                  (u8)(ha->cpar.version)); - -    size = sprintf(buffer+len, -                   " Driver Ver.:  \t%-10s\tFirmware Ver.: \t%s\n", -                   GDTH_VERSION_STR, hrec); -    len += size;  pos = begin + len; -    if (ha->more_proc) { +    if (ha->more_proc)          /* more information: 1. about controller */ -        size = sprintf(buffer+len, +        seq_printf(m,                         " Serial No.:   \t0x%8X\tCache RAM size:\t%d KB\n",                         ha->binfo.ser_no, ha->binfo.memsize / 1024); -        len += size;  pos = begin + len; -    }  #ifdef GDTH_DMA_STATISTICS      /* controller statistics */ -    size = sprintf(buffer+len,"\nController Statistics:\n"); -    len += size;  pos = begin + len; -    size = sprintf(buffer+len, +    seq_printf(m,"\nController Statistics:\n"); +    seq_printf(m,                     " 32-bit DMA buffer:\t%lu\t64-bit DMA buffer:\t%lu\n",                     ha->dma32_cnt, ha->dma64_cnt); -    len += size;  pos = begin + len;  #endif -    if (pos < offset) { -        len = 0; -        begin = pos; -    } -    if (pos > offset + length) -        goto stop_output; -      if (ha->more_proc) {          /* more information: 2. about physical devices */ -        size = sprintf(buffer+len,"\nPhysical Devices:"); -        len += size;  pos = begin + len; +        seq_printf(m, "\nPhysical Devices:");          flag = FALSE;          buf = gdth_ioctl_alloc(ha, GDTH_SCRATCH, FALSE, &paddr); @@ -309,21 +273,19 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length,                      strncpy(hrec+8,pdi->product,16);                      strncpy(hrec+24,pdi->revision,4);                      hrec[28] = 0; -                    size = sprintf(buffer+len, +                    seq_printf(m,                                     "\n Chn/ID/LUN:   \t%c/%02d/%d    \tName:          \t%s\n",                                     'A'+i,pdi->target_id,pdi->lun,hrec); -                    len += size;  pos = begin + len;                      flag = TRUE;                      pdi->no_ldrive &= 0xffff;                      if (pdi->no_ldrive == 0xffff)                          strcpy(hrec,"--");                      else                          sprintf(hrec,"%d",pdi->no_ldrive); -                    size = sprintf(buffer+len, +                    seq_printf(m,                                     " Capacity [MB]:\t%-6d    \tTo Log. Drive: \t%s\n",                                     pdi->blkcnt/(1024*1024/pdi->blksize),                                     hrec); -                    len += size;  pos = begin + len;                  } else {                      pdi->devtype = 0xff;                  } @@ -333,11 +295,10 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length,                      for (k = 0; k < pds->count; ++k) {                          if (pds->list[k].tid == pdi->target_id &&                              pds->list[k].lun == pdi->lun) { -                            size = sprintf(buffer+len, +                            seq_printf(m,                                             " Retries:      \t%-6d    \tReassigns:     \t%d\n",                                             pds->list[k].retries,                                             pds->list[k].reassigns); -                            len += size;  pos = begin + len;                              break;                          }                      } @@ -355,32 +316,20 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length,                      pdef->sddc_type = 0x08;                      if (gdth_execute(host, gdtcmd, cmnd, 30, NULL) == S_OK) { -                        size = sprintf(buffer+len, +                        seq_printf(m,                                         " Grown Defects:\t%d\n",                                         pdef->sddc_cnt); -                        len += size;  pos = begin + len;                      }                  } -                if (pos < offset) { -                    len = 0; -                    begin = pos; -                } -		if (pos > offset + length) { -		    gdth_ioctl_free(ha, GDTH_SCRATCH, buf, paddr); -                    goto stop_output; -		}              }          }          gdth_ioctl_free(ha, GDTH_SCRATCH, buf, paddr); -        if (!flag) { -            size = sprintf(buffer+len, "\n --\n"); -            len += size;  pos = begin + len; -        } +        if (!flag) +            seq_printf(m, "\n --\n");          /* 3. about logical drives */ -        size = sprintf(buffer+len,"\nLogical Drives:"); -        len += size;  pos = begin + len; +        seq_printf(m,"\nLogical Drives:");          flag = FALSE;          buf = gdth_ioctl_alloc(ha, GDTH_SCRATCH, FALSE, &paddr); @@ -418,10 +367,9 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length,                  }                  if (drv_no == i) { -                    size = sprintf(buffer+len, +                    seq_printf(m,                                     "\n Number:       \t%-2d        \tStatus:        \t%s\n",                                     drv_no, hrec); -                    len += size;  pos = begin + len;                      flag = TRUE;                      no_mdrv = pcdi->cd_ldcnt;                      if (no_mdrv > 1 || pcdi->ld_slave != -1) { @@ -436,61 +384,37 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length,                      } else {                          strcpy(hrec, "???");                      } -                    size = sprintf(buffer+len, +                    seq_printf(m,                                     " Capacity [MB]:\t%-6d    \tType:          \t%s\n",                                     pcdi->ld_blkcnt/(1024*1024/pcdi->ld_blksize),                                     hrec); -                    len += size;  pos = begin + len;                  } else { -                    size = sprintf(buffer+len, +                    seq_printf(m,                                     " Slave Number: \t%-2d        \tStatus:        \t%s\n",                                     drv_no & 0x7fff, hrec); -                    len += size;  pos = begin + len;                  }                  drv_no = pcdi->ld_slave; -                if (pos < offset) { -                    len = 0; -                    begin = pos; -                } -		if (pos > offset + length) { -		    gdth_ioctl_free(ha, GDTH_SCRATCH, buf, paddr); -                    goto stop_output; -		}              } while (drv_no != -1); -            if (is_mirr) { -                size = sprintf(buffer+len, +            if (is_mirr) +                seq_printf(m,                                 " Missing Drv.: \t%-2d        \tInvalid Drv.:  \t%d\n",                                 no_mdrv - j - k, k); -                len += size;  pos = begin + len; -            } -               +              if (!ha->hdr[i].is_arraydrv)                  strcpy(hrec, "--");              else                  sprintf(hrec, "%d", ha->hdr[i].master_no); -            size = sprintf(buffer+len, +            seq_printf(m,                             " To Array Drv.:\t%s\n", hrec); -            len += size;  pos = begin + len; -            if (pos < offset) { -                len = 0; -                begin = pos; -            } -	    if (pos > offset + length) { -		gdth_ioctl_free(ha, GDTH_SCRATCH, buf, paddr); -                goto stop_output; -	    }          }                 gdth_ioctl_free(ha, GDTH_SCRATCH, buf, paddr); -        if (!flag) { -            size = sprintf(buffer+len, "\n --\n"); -            len += size;  pos = begin + len; -        }    +        if (!flag) +            seq_printf(m, "\n --\n");          /* 4. about array drives */ -        size = sprintf(buffer+len,"\nArray Drives:"); -        len += size;  pos = begin + len; +        seq_printf(m,"\nArray Drives:");          flag = FALSE;          buf = gdth_ioctl_alloc(ha, GDTH_SCRATCH, FALSE, &paddr); @@ -525,10 +449,9 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length,                      strcat(hrec, "/expand");                  else if (pai->ai_ext_state & 0x1)                      strcat(hrec, "/patch"); -                size = sprintf(buffer+len, +                seq_printf(m,                                 "\n Number:       \t%-2d        \tStatus:        \t%s\n",                                 i,hrec); -                len += size;  pos = begin + len;                  flag = TRUE;                  if (pai->ai_type == 0) @@ -539,31 +462,19 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length,                      strcpy(hrec, "RAID-5");                  else                       strcpy(hrec, "RAID-10"); -                size = sprintf(buffer+len, +                seq_printf(m,                                 " Capacity [MB]:\t%-6d    \tType:          \t%s\n",                                 pai->ai_size/(1024*1024/pai->ai_secsize),                                 hrec); -                len += size;  pos = begin + len; -                if (pos < offset) { -                    len = 0; -                    begin = pos; -                } -		if (pos > offset + length) { -		    gdth_ioctl_free(ha, GDTH_SCRATCH, buf, paddr); -                    goto stop_output; -		}              }          }          gdth_ioctl_free(ha, GDTH_SCRATCH, buf, paddr); -        if (!flag) { -            size = sprintf(buffer+len, "\n --\n"); -            len += size;  pos = begin + len; -        } +        if (!flag) +            seq_printf(m, "\n --\n");          /* 5. about host drives */ -        size = sprintf(buffer+len,"\nHost Drives:"); -        len += size;  pos = begin + len; +        seq_printf(m,"\nHost Drives:");          flag = FALSE;          buf = gdth_ioctl_alloc(ha, sizeof(gdth_hget_str), FALSE, &paddr); @@ -605,33 +516,22 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length,              if (!(ha->hdr[i].present))                  continue; -            size = sprintf(buffer+len, +            seq_printf(m,                             "\n Number:       \t%-2d        \tArr/Log. Drive:\t%d\n",                             i, ha->hdr[i].ldr_no); -            len += size;  pos = begin + len;              flag = TRUE; -            size = sprintf(buffer+len, +            seq_printf(m,                             " Capacity [MB]:\t%-6d    \tStart Sector:  \t%d\n",                             (u32)(ha->hdr[i].size/2048), ha->hdr[i].start_sec); -            len += size;  pos = begin + len; -            if (pos < offset) { -                len = 0; -                begin = pos; -            } -            if (pos > offset + length) -                goto stop_output;          } -        if (!flag) { -            size = sprintf(buffer+len, "\n --\n"); -            len += size;  pos = begin + len; -        } +        if (!flag) +            seq_printf(m, "\n --\n");      }      /* controller events */ -    size = sprintf(buffer+len,"\nController Events:\n"); -    len += size;  pos = begin + len; +    seq_printf(m,"\nController Events:\n");      for (id = -1;;) {          id = gdth_read_event(ha, id, estr); @@ -643,29 +543,14 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length,              do_gettimeofday(&tv);              sec = (int)(tv.tv_sec - estr->first_stamp);              if (sec < 0) sec = 0; -            size = sprintf(buffer+len," date- %02d:%02d:%02d\t%s\n", +            seq_printf(m," date- %02d:%02d:%02d\t%s\n",                             sec/3600, sec%3600/60, sec%60, hrec); -            len += size;  pos = begin + len; -            if (pos < offset) { -                len = 0; -                begin = pos; -            } -            if (pos > offset + length) -                goto stop_output;          }          if (id == -1)              break;      } -  stop_output: -    *start = buffer +(offset-begin); -    len -= (offset-begin); -    if (len > length) -        len = length; -    TRACE2(("get_info() len %d pos %d begin %d offset %d length %d size %d\n", -            len,(int)pos,(int)begin,(int)offset,length,size)); -    rc = len; - +    rc = 0;  free_fail:      kfree(gdtcmd);      kfree(estr); diff --git a/drivers/scsi/gdth_proc.h b/drivers/scsi/gdth_proc.h index dab15f59f2c..aaa61819897 100644 --- a/drivers/scsi/gdth_proc.h +++ b/drivers/scsi/gdth_proc.h @@ -8,11 +8,6 @@  int gdth_execute(struct Scsi_Host *shost, gdth_cmd_str *gdtcmd, char *cmnd,                   int timeout, u32 *info); -static int gdth_set_info(char *buffer,int length,struct Scsi_Host *host, -                         gdth_ha_str *ha); -static int gdth_get_info(char *buffer,char **start,off_t offset,int length, -                         struct Scsi_Host *host, gdth_ha_str *ha); -  static int gdth_set_asc_info(struct Scsi_Host *host, char *buffer,                               int length, gdth_ha_str *ha); diff --git a/drivers/scsi/gvp11.c b/drivers/scsi/gvp11.c index dbe4cc6b9f8..2203ac28110 100644 --- a/drivers/scsi/gvp11.c +++ b/drivers/scsi/gvp11.c @@ -191,7 +191,8 @@ static int gvp11_bus_reset(struct scsi_cmnd *cmd)  static struct scsi_host_template gvp11_scsi_template = {  	.module			= THIS_MODULE,  	.name			= "GVP Series II SCSI", -	.proc_info		= wd33c93_proc_info, +	.show_info		= wd33c93_show_info, +	.write_info		= wd33c93_write_info,  	.proc_name		= "GVP11",  	.queuecommand		= wd33c93_queuecommand,  	.eh_abort_handler	= wd33c93_abort, diff --git a/drivers/scsi/imm.c b/drivers/scsi/imm.c index 26cd9d1d757..89a8266560d 100644 --- a/drivers/scsi/imm.c +++ b/drivers/scsi/imm.c @@ -121,45 +121,26 @@ static inline void imm_pb_release(imm_struct *dev)   * testing...   * Also gives a method to use a script to obtain optimum timings (TODO)   */ -static inline int imm_proc_write(imm_struct *dev, char *buffer, int length) +static int imm_write_info(struct Scsi_Host *host, char *buffer, int length)  { -	unsigned long x; +	imm_struct *dev = imm_dev(host);  	if ((length > 5) && (strncmp(buffer, "mode=", 5) == 0)) { -		x = simple_strtoul(buffer + 5, NULL, 0); -		dev->mode = x; +		dev->mode = simple_strtoul(buffer + 5, NULL, 0);  		return length;  	}  	printk("imm /proc: invalid variable\n"); -	return (-EINVAL); +	return -EINVAL;  } -static int imm_proc_info(struct Scsi_Host *host, char *buffer, char **start, -			off_t offset, int length, int inout) +static int imm_show_info(struct seq_file *m, struct Scsi_Host *host)  {  	imm_struct *dev = imm_dev(host); -	int len = 0; - -	if (inout) -		return imm_proc_write(dev, buffer, length); - -	len += sprintf(buffer + len, "Version : %s\n", IMM_VERSION); -	len += -	    sprintf(buffer + len, "Parport : %s\n", -		    dev->dev->port->name); -	len += -	    sprintf(buffer + len, "Mode    : %s\n", -		    IMM_MODE_STRING[dev->mode]); -	/* Request for beyond end of buffer */ -	if (offset > len) -		return 0; - -	*start = buffer + offset; -	len -= offset; -	if (len > length) -		len = length; -	return len; +	seq_printf(m, "Version : %s\n", IMM_VERSION); +	seq_printf(m, "Parport : %s\n", dev->dev->port->name); +	seq_printf(m, "Mode    : %s\n", IMM_MODE_STRING[dev->mode]); +	return 0;  }  #if IMM_DEBUG > 0 @@ -1118,7 +1099,8 @@ static int imm_adjust_queue(struct scsi_device *device)  static struct scsi_host_template imm_template = {  	.module			= THIS_MODULE,  	.proc_name		= "imm", -	.proc_info		= imm_proc_info, +	.show_info		= imm_show_info, +	.write_info		= imm_write_info,  	.name			= "Iomega VPI2 (imm) interface",  	.queuecommand		= imm_queuecommand,  	.eh_abort_handler	= imm_abort, diff --git a/drivers/scsi/in2000.c b/drivers/scsi/in2000.c index deb5b6d8398..bf028218ac3 100644 --- a/drivers/scsi/in2000.c +++ b/drivers/scsi/in2000.c @@ -2166,152 +2166,117 @@ static int in2000_biosparam(struct scsi_device *sdev, struct block_device *bdev,  } -static int in2000_proc_info(struct Scsi_Host *instance, char *buf, char **start, off_t off, int len, int in) +static int in2000_write_info(struct Scsi_Host *instance, char *buf, int len)  {  #ifdef PROC_INTERFACE  	char *bp; -	char tbuf[128]; -	unsigned long flags;  	struct IN2000_hostdata *hd; -	Scsi_Cmnd *cmd;  	int x, i; -	static int stop = 0;  	hd = (struct IN2000_hostdata *) instance->hostdata; -/* If 'in' is TRUE we need to _read_ the proc file. We accept the following - * keywords (same format as command-line, but only ONE per read): - *    debug - *    disconnect - *    period - *    resync - *    proc - */ - -	if (in) { -		buf[len] = '\0'; -		bp = buf; -		if (!strncmp(bp, "debug:", 6)) { -			bp += 6; -			hd->args = simple_strtoul(bp, NULL, 0) & DB_MASK; -		} else if (!strncmp(bp, "disconnect:", 11)) { -			bp += 11; -			x = simple_strtoul(bp, NULL, 0); -			if (x < DIS_NEVER || x > DIS_ALWAYS) -				x = DIS_ADAPTIVE; -			hd->disconnect = x; -		} else if (!strncmp(bp, "period:", 7)) { -			bp += 7; -			x = simple_strtoul(bp, NULL, 0); -			hd->default_sx_per = sx_table[round_period((unsigned int) x)].period_ns; -		} else if (!strncmp(bp, "resync:", 7)) { -			bp += 7; -			x = simple_strtoul(bp, NULL, 0); -			for (i = 0; i < 7; i++) -				if (x & (1 << i)) -					hd->sync_stat[i] = SS_UNSET; -		} else if (!strncmp(bp, "proc:", 5)) { -			bp += 5; -			hd->proc = simple_strtoul(bp, NULL, 0); -		} else if (!strncmp(bp, "level2:", 7)) { -			bp += 7; -			hd->level2 = simple_strtoul(bp, NULL, 0); -		} -		return len; +	buf[len] = '\0'; +	bp = buf; +	if (!strncmp(bp, "debug:", 6)) { +		bp += 6; +		hd->args = simple_strtoul(bp, NULL, 0) & DB_MASK; +	} else if (!strncmp(bp, "disconnect:", 11)) { +		bp += 11; +		x = simple_strtoul(bp, NULL, 0); +		if (x < DIS_NEVER || x > DIS_ALWAYS) +			x = DIS_ADAPTIVE; +		hd->disconnect = x; +	} else if (!strncmp(bp, "period:", 7)) { +		bp += 7; +		x = simple_strtoul(bp, NULL, 0); +		hd->default_sx_per = sx_table[round_period((unsigned int) x)].period_ns; +	} else if (!strncmp(bp, "resync:", 7)) { +		bp += 7; +		x = simple_strtoul(bp, NULL, 0); +		for (i = 0; i < 7; i++) +			if (x & (1 << i)) +				hd->sync_stat[i] = SS_UNSET; +	} else if (!strncmp(bp, "proc:", 5)) { +		bp += 5; +		hd->proc = simple_strtoul(bp, NULL, 0); +	} else if (!strncmp(bp, "level2:", 7)) { +		bp += 7; +		hd->level2 = simple_strtoul(bp, NULL, 0);  	} +#endif +	return len; +} + +static int in2000_show_info(struct seq_file *m, struct Scsi_Host *instance) +{ + +#ifdef PROC_INTERFACE +	unsigned long flags; +	struct IN2000_hostdata *hd; +	Scsi_Cmnd *cmd; +	int x; + +	hd = (struct IN2000_hostdata *) instance->hostdata;  	spin_lock_irqsave(instance->host_lock, flags); -	bp = buf; -	*bp = '\0'; -	if (hd->proc & PR_VERSION) { -		sprintf(tbuf, "\nVersion %s - %s.", IN2000_VERSION, IN2000_DATE); -		strcat(bp, tbuf); -	} +	if (hd->proc & PR_VERSION) +		seq_printf(m, "\nVersion %s - %s.", IN2000_VERSION, IN2000_DATE); +  	if (hd->proc & PR_INFO) { -		sprintf(tbuf, "\ndip_switch=%02x: irq=%d io=%02x floppy=%s sync/DOS5=%s", (hd->dip_switch & 0x7f), instance->irq, hd->io_base, (hd->dip_switch & 0x40) ? "Yes" : "No", (hd->dip_switch & 0x20) ? "Yes" : "No"); -		strcat(bp, tbuf); -		strcat(bp, "\nsync_xfer[] =       "); -		for (x = 0; x < 7; x++) { -			sprintf(tbuf, "\t%02x", hd->sync_xfer[x]); -			strcat(bp, tbuf); -		} -		strcat(bp, "\nsync_stat[] =       "); -		for (x = 0; x < 7; x++) { -			sprintf(tbuf, "\t%02x", hd->sync_stat[x]); -			strcat(bp, tbuf); -		} +		seq_printf(m, "\ndip_switch=%02x: irq=%d io=%02x floppy=%s sync/DOS5=%s", (hd->dip_switch & 0x7f), instance->irq, hd->io_base, (hd->dip_switch & 0x40) ? "Yes" : "No", (hd->dip_switch & 0x20) ? "Yes" : "No"); +		seq_printf(m, "\nsync_xfer[] =       "); +		for (x = 0; x < 7; x++) +			seq_printf(m, "\t%02x", hd->sync_xfer[x]); +		seq_printf(m, "\nsync_stat[] =       "); +		for (x = 0; x < 7; x++) +			seq_printf(m, "\t%02x", hd->sync_stat[x]);  	}  #ifdef PROC_STATISTICS  	if (hd->proc & PR_STATISTICS) { -		strcat(bp, "\ncommands issued:    "); -		for (x = 0; x < 7; x++) { -			sprintf(tbuf, "\t%ld", hd->cmd_cnt[x]); -			strcat(bp, tbuf); -		} -		strcat(bp, "\ndisconnects allowed:"); -		for (x = 0; x < 7; x++) { -			sprintf(tbuf, "\t%ld", hd->disc_allowed_cnt[x]); -			strcat(bp, tbuf); -		} -		strcat(bp, "\ndisconnects done:   "); -		for (x = 0; x < 7; x++) { -			sprintf(tbuf, "\t%ld", hd->disc_done_cnt[x]); -			strcat(bp, tbuf); -		} -		sprintf(tbuf, "\ninterrupts:      \t%ld", hd->int_cnt); -		strcat(bp, tbuf); +		seq_printf(m, "\ncommands issued:    "); +		for (x = 0; x < 7; x++) +			seq_printf(m, "\t%ld", hd->cmd_cnt[x]); +		seq_printf(m, "\ndisconnects allowed:"); +		for (x = 0; x < 7; x++) +			seq_printf(m, "\t%ld", hd->disc_allowed_cnt[x]); +		seq_printf(m, "\ndisconnects done:   "); +		for (x = 0; x < 7; x++) +			seq_printf(m, "\t%ld", hd->disc_done_cnt[x]); +		seq_printf(m, "\ninterrupts:      \t%ld", hd->int_cnt);  	}  #endif  	if (hd->proc & PR_CONNECTED) { -		strcat(bp, "\nconnected:     "); +		seq_printf(m, "\nconnected:     ");  		if (hd->connected) {  			cmd = (Scsi_Cmnd *) hd->connected; -			sprintf(tbuf, " %d:%d(%02x)", cmd->device->id, cmd->device->lun, cmd->cmnd[0]); -			strcat(bp, tbuf); +			seq_printf(m, " %d:%d(%02x)", cmd->device->id, cmd->device->lun, cmd->cmnd[0]);  		}  	}  	if (hd->proc & PR_INPUTQ) { -		strcat(bp, "\ninput_Q:       "); +		seq_printf(m, "\ninput_Q:       ");  		cmd = (Scsi_Cmnd *) hd->input_Q;  		while (cmd) { -			sprintf(tbuf, " %d:%d(%02x)", cmd->device->id, cmd->device->lun, cmd->cmnd[0]); -			strcat(bp, tbuf); +			seq_printf(m, " %d:%d(%02x)", cmd->device->id, cmd->device->lun, cmd->cmnd[0]);  			cmd = (Scsi_Cmnd *) cmd->host_scribble;  		}  	}  	if (hd->proc & PR_DISCQ) { -		strcat(bp, "\ndisconnected_Q:"); +		seq_printf(m, "\ndisconnected_Q:");  		cmd = (Scsi_Cmnd *) hd->disconnected_Q;  		while (cmd) { -			sprintf(tbuf, " %d:%d(%02x)", cmd->device->id, cmd->device->lun, cmd->cmnd[0]); -			strcat(bp, tbuf); +			seq_printf(m, " %d:%d(%02x)", cmd->device->id, cmd->device->lun, cmd->cmnd[0]);  			cmd = (Scsi_Cmnd *) cmd->host_scribble;  		}  	}  	if (hd->proc & PR_TEST) {  		;		/* insert your own custom function here */  	} -	strcat(bp, "\n"); +	seq_printf(m, "\n");  	spin_unlock_irqrestore(instance->host_lock, flags); -	*start = buf; -	if (stop) { -		stop = 0; -		return 0;	/* return 0 to signal end-of-file */ -	} -	if (off > 0x40000)	/* ALWAYS stop after 256k bytes have been read */ -		stop = 1; -	if (hd->proc & PR_STOP)	/* stop every other time */ -		stop = 1; -	return strlen(bp); - -#else				/* PROC_INTERFACE */ - -	return 0; -  #endif				/* PROC_INTERFACE */ - +	return 0;  }  MODULE_LICENSE("GPL"); @@ -2319,7 +2284,8 @@ MODULE_LICENSE("GPL");  static struct scsi_host_template driver_template = {  	.proc_name       		= "in2000", -	.proc_info       		= in2000_proc_info, +	.write_info       		= in2000_write_info, +	.show_info       		= in2000_show_info,  	.name            		= "Always IN2000",  	.detect          		= in2000_detect,   	.release			= in2000_release, diff --git a/drivers/scsi/ips.c b/drivers/scsi/ips.c index 9aa86a315a0..8d5ea8a1e5a 100644 --- a/drivers/scsi/ips.c +++ b/drivers/scsi/ips.c @@ -326,10 +326,9 @@ static void ips_scmd_buf_write(struct scsi_cmnd * scmd, void *data,  static void ips_scmd_buf_read(struct scsi_cmnd * scmd, void *data,  			      unsigned int count); -static int ips_proc_info(struct Scsi_Host *, char *, char **, off_t, int, int); -static int ips_host_info(ips_ha_t *, char *, off_t, int); -static void copy_mem_info(IPS_INFOSTR *, char *, int); -static int copy_info(IPS_INFOSTR *, char *, ...); +static int ips_write_info(struct Scsi_Host *, char *, int); +static int ips_show_info(struct seq_file *, struct Scsi_Host *); +static int ips_host_info(ips_ha_t *, struct seq_file *);  static int ips_abort_init(ips_ha_t * ha, int index);  static int ips_init_phase2(int index); @@ -367,7 +366,8 @@ static struct scsi_host_template ips_driver_template = {  	.eh_abort_handler	= ips_eh_abort,  	.eh_host_reset_handler	= ips_eh_reset,  	.proc_name		= "ips", -	.proc_info		= ips_proc_info, +	.show_info		= ips_show_info, +	.write_info		= ips_write_info,  	.slave_configure	= ips_slave_configure,  	.bios_param		= ips_biosparam,  	.this_id		= -1, @@ -1433,25 +1433,12 @@ ips_info(struct Scsi_Host *SH)  	return (bp);  } -/****************************************************************************/ -/*                                                                          */ -/* Routine Name: ips_proc_info                                              */ -/*                                                                          */ -/* Routine Description:                                                     */ -/*                                                                          */ -/*   The passthru interface for the driver                                  */ -/*                                                                          */ -/****************************************************************************/  static int -ips_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset, -	      int length, int func) +ips_write_info(struct Scsi_Host *host, char *buffer, int length)  {  	int i; -	int ret;  	ips_ha_t *ha = NULL; -	METHOD_TRACE("ips_proc_info", 1); -  	/* Find our host structure */  	for (i = 0; i < ips_next_controller; i++) {  		if (ips_sh[i]) { @@ -1465,18 +1452,29 @@ ips_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset,  	if (!ha)  		return (-EINVAL); -	if (func) { -		/* write */ -		return (0); -	} else { -		/* read */ -		if (start) -			*start = buffer; +	return 0; +} -		ret = ips_host_info(ha, buffer, offset, length); +static int +ips_show_info(struct seq_file *m, struct Scsi_Host *host) +{ +	int i; +	ips_ha_t *ha = NULL; -		return (ret); +	/* Find our host structure */ +	for (i = 0; i < ips_next_controller; i++) { +		if (ips_sh[i]) { +			if (ips_sh[i] == host) { +				ha = (ips_ha_t *) ips_sh[i]->hostdata; +				break; +			} +		}  	} + +	if (!ha) +		return (-EINVAL); + +	return ips_host_info(ha, m);  }  /*--------------------------------------------------------------------------*/ @@ -2035,183 +2033,113 @@ ips_cleanup_passthru(ips_ha_t * ha, ips_scb_t * scb)  /*                                                                          */  /****************************************************************************/  static int -ips_host_info(ips_ha_t * ha, char *ptr, off_t offset, int len) +ips_host_info(ips_ha_t *ha, struct seq_file *m)  { -	IPS_INFOSTR info; -  	METHOD_TRACE("ips_host_info", 1); -	info.buffer = ptr; -	info.length = len; -	info.offset = offset; -	info.pos = 0; -	info.localpos = 0; - -	copy_info(&info, "\nIBM ServeRAID General Information:\n\n"); +	seq_printf(m, "\nIBM ServeRAID General Information:\n\n");  	if ((le32_to_cpu(ha->nvram->signature) == IPS_NVRAM_P5_SIG) &&  	    (le16_to_cpu(ha->nvram->adapter_type) != 0)) -		copy_info(&info, "\tController Type                   : %s\n", +		seq_printf(m, "\tController Type                   : %s\n",  			  ips_adapter_name[ha->ad_type - 1]);  	else -		copy_info(&info, +		seq_printf(m,  			  "\tController Type                   : Unknown\n");  	if (ha->io_addr) -		copy_info(&info, -			  "\tIO region                         : 0x%lx (%d bytes)\n", +		seq_printf(m, +			  "\tIO region                         : 0x%x (%d bytes)\n",  			  ha->io_addr, ha->io_len);  	if (ha->mem_addr) { -		copy_info(&info, -			  "\tMemory region                     : 0x%lx (%d bytes)\n", +		seq_printf(m, +			  "\tMemory region                     : 0x%x (%d bytes)\n",  			  ha->mem_addr, ha->mem_len); -		copy_info(&info, +		seq_printf(m,  			  "\tShared memory address             : 0x%lx\n", -			  ha->mem_ptr); +			  (unsigned long)ha->mem_ptr);  	} -	copy_info(&info, "\tIRQ number                        : %d\n", ha->pcidev->irq); +	seq_printf(m, "\tIRQ number                        : %d\n", ha->pcidev->irq);      /* For the Next 3 lines Check for Binary 0 at the end and don't include it if it's there. */      /* That keeps everything happy for "text" operations on the proc file.                    */  	if (le32_to_cpu(ha->nvram->signature) == IPS_NVRAM_P5_SIG) {  	if (ha->nvram->bios_low[3] == 0) { -            copy_info(&info, -			          "\tBIOS Version                      : %c%c%c%c%c%c%c\n", -			          ha->nvram->bios_high[0], ha->nvram->bios_high[1], -			          ha->nvram->bios_high[2], ha->nvram->bios_high[3], -			          ha->nvram->bios_low[0], ha->nvram->bios_low[1], -			          ha->nvram->bios_low[2]); +		seq_printf(m, +			  "\tBIOS Version                      : %c%c%c%c%c%c%c\n", +			  ha->nvram->bios_high[0], ha->nvram->bios_high[1], +			  ha->nvram->bios_high[2], ha->nvram->bios_high[3], +			  ha->nvram->bios_low[0], ha->nvram->bios_low[1], +			  ha->nvram->bios_low[2]);          } else { -		    copy_info(&info, -			          "\tBIOS Version                      : %c%c%c%c%c%c%c%c\n", -			          ha->nvram->bios_high[0], ha->nvram->bios_high[1], -			          ha->nvram->bios_high[2], ha->nvram->bios_high[3], -			          ha->nvram->bios_low[0], ha->nvram->bios_low[1], -			          ha->nvram->bios_low[2], ha->nvram->bios_low[3]); +		seq_printf(m, +			  "\tBIOS Version                      : %c%c%c%c%c%c%c%c\n", +			  ha->nvram->bios_high[0], ha->nvram->bios_high[1], +			  ha->nvram->bios_high[2], ha->nvram->bios_high[3], +			  ha->nvram->bios_low[0], ha->nvram->bios_low[1], +			  ha->nvram->bios_low[2], ha->nvram->bios_low[3]);          }      }      if (ha->enq->CodeBlkVersion[7] == 0) { -        copy_info(&info, -		          "\tFirmware Version                  : %c%c%c%c%c%c%c\n", -		          ha->enq->CodeBlkVersion[0], ha->enq->CodeBlkVersion[1], -		          ha->enq->CodeBlkVersion[2], ha->enq->CodeBlkVersion[3], -		          ha->enq->CodeBlkVersion[4], ha->enq->CodeBlkVersion[5], -		          ha->enq->CodeBlkVersion[6]); +        seq_printf(m, +		  "\tFirmware Version                  : %c%c%c%c%c%c%c\n", +		  ha->enq->CodeBlkVersion[0], ha->enq->CodeBlkVersion[1], +		  ha->enq->CodeBlkVersion[2], ha->enq->CodeBlkVersion[3], +		  ha->enq->CodeBlkVersion[4], ha->enq->CodeBlkVersion[5], +		  ha->enq->CodeBlkVersion[6]);      } else { -        copy_info(&info, -		          "\tFirmware Version                  : %c%c%c%c%c%c%c%c\n", -		          ha->enq->CodeBlkVersion[0], ha->enq->CodeBlkVersion[1], -		          ha->enq->CodeBlkVersion[2], ha->enq->CodeBlkVersion[3], -		          ha->enq->CodeBlkVersion[4], ha->enq->CodeBlkVersion[5], -		          ha->enq->CodeBlkVersion[6], ha->enq->CodeBlkVersion[7]); +	seq_printf(m, +		  "\tFirmware Version                  : %c%c%c%c%c%c%c%c\n", +		  ha->enq->CodeBlkVersion[0], ha->enq->CodeBlkVersion[1], +		  ha->enq->CodeBlkVersion[2], ha->enq->CodeBlkVersion[3], +		  ha->enq->CodeBlkVersion[4], ha->enq->CodeBlkVersion[5], +		  ha->enq->CodeBlkVersion[6], ha->enq->CodeBlkVersion[7]);      }      if (ha->enq->BootBlkVersion[7] == 0) { -        copy_info(&info, -		          "\tBoot Block Version                : %c%c%c%c%c%c%c\n", -		          ha->enq->BootBlkVersion[0], ha->enq->BootBlkVersion[1], -		          ha->enq->BootBlkVersion[2], ha->enq->BootBlkVersion[3], -		          ha->enq->BootBlkVersion[4], ha->enq->BootBlkVersion[5], -		          ha->enq->BootBlkVersion[6]); +        seq_printf(m, +		  "\tBoot Block Version                : %c%c%c%c%c%c%c\n", +		  ha->enq->BootBlkVersion[0], ha->enq->BootBlkVersion[1], +		  ha->enq->BootBlkVersion[2], ha->enq->BootBlkVersion[3], +		  ha->enq->BootBlkVersion[4], ha->enq->BootBlkVersion[5], +		  ha->enq->BootBlkVersion[6]);      } else { -        copy_info(&info, -		          "\tBoot Block Version                : %c%c%c%c%c%c%c%c\n", -		          ha->enq->BootBlkVersion[0], ha->enq->BootBlkVersion[1], -		          ha->enq->BootBlkVersion[2], ha->enq->BootBlkVersion[3], -		          ha->enq->BootBlkVersion[4], ha->enq->BootBlkVersion[5], -		          ha->enq->BootBlkVersion[6], ha->enq->BootBlkVersion[7]); +        seq_printf(m, +		  "\tBoot Block Version                : %c%c%c%c%c%c%c%c\n", +		  ha->enq->BootBlkVersion[0], ha->enq->BootBlkVersion[1], +		  ha->enq->BootBlkVersion[2], ha->enq->BootBlkVersion[3], +		  ha->enq->BootBlkVersion[4], ha->enq->BootBlkVersion[5], +		  ha->enq->BootBlkVersion[6], ha->enq->BootBlkVersion[7]);      } -	copy_info(&info, "\tDriver Version                    : %s%s\n", +	seq_printf(m, "\tDriver Version                    : %s%s\n",  		  IPS_VERSION_HIGH, IPS_VERSION_LOW); -	copy_info(&info, "\tDriver Build                      : %d\n", +	seq_printf(m, "\tDriver Build                      : %d\n",  		  IPS_BUILD_IDENT); -	copy_info(&info, "\tMax Physical Devices              : %d\n", +	seq_printf(m, "\tMax Physical Devices              : %d\n",  		  ha->enq->ucMaxPhysicalDevices); -	copy_info(&info, "\tMax Active Commands               : %d\n", +	seq_printf(m, "\tMax Active Commands               : %d\n",  		  ha->max_cmds); -	copy_info(&info, "\tCurrent Queued Commands           : %d\n", +	seq_printf(m, "\tCurrent Queued Commands           : %d\n",  		  ha->scb_waitlist.count); -	copy_info(&info, "\tCurrent Active Commands           : %d\n", +	seq_printf(m, "\tCurrent Active Commands           : %d\n",  		  ha->scb_activelist.count - ha->num_ioctl); -	copy_info(&info, "\tCurrent Queued PT Commands        : %d\n", +	seq_printf(m, "\tCurrent Queued PT Commands        : %d\n",  		  ha->copp_waitlist.count); -	copy_info(&info, "\tCurrent Active PT Commands        : %d\n", +	seq_printf(m, "\tCurrent Active PT Commands        : %d\n",  		  ha->num_ioctl); -	copy_info(&info, "\n"); - -	return (info.localpos); -} - -/****************************************************************************/ -/*                                                                          */ -/* Routine Name: copy_mem_info                                              */ -/*                                                                          */ -/* Routine Description:                                                     */ -/*                                                                          */ -/*   Copy data into an IPS_INFOSTR structure                                */ -/*                                                                          */ -/****************************************************************************/ -static void -copy_mem_info(IPS_INFOSTR * info, char *data, int len) -{ -	METHOD_TRACE("copy_mem_info", 1); - -	if (info->pos + len < info->offset) { -		info->pos += len; -		return; -	} - -	if (info->pos < info->offset) { -		data += (info->offset - info->pos); -		len -= (info->offset - info->pos); -		info->pos += (info->offset - info->pos); -	} - -	if (info->localpos + len > info->length) -		len = info->length - info->localpos; +	seq_printf(m, "\n"); -	if (len > 0) { -		memcpy(info->buffer + info->localpos, data, len); -		info->pos += len; -		info->localpos += len; -	} -} - -/****************************************************************************/ -/*                                                                          */ -/* Routine Name: copy_info                                                  */ -/*                                                                          */ -/* Routine Description:                                                     */ -/*                                                                          */ -/*   printf style wrapper for an info structure                             */ -/*                                                                          */ -/****************************************************************************/ -static int -copy_info(IPS_INFOSTR * info, char *fmt, ...) -{ -	va_list args; -	char buf[128]; -	int len; - -	METHOD_TRACE("copy_info", 1); - -	va_start(args, fmt); -	len = vsprintf(buf, fmt, args); -	va_end(args); - -	copy_mem_info(info, buf, len); - -	return (len); +	return 0;  }  /****************************************************************************/ diff --git a/drivers/scsi/ips.h b/drivers/scsi/ips.h index f2df0593332..45b9566b928 100644 --- a/drivers/scsi/ips.h +++ b/drivers/scsi/ips.h @@ -416,7 +416,6 @@     /*      * Scsi_Host Template      */ -   static int ips_proc_info(struct Scsi_Host *, char *, char **, off_t, int, int);     static int ips_biosparam(struct scsi_device *sdev, struct block_device *bdev,  		sector_t capacity, int geom[]);     static int ips_slave_configure(struct scsi_device *SDptr); @@ -959,14 +958,6 @@ typedef union {     IPS_ENH_SG_LIST  *enh_list;  } IPS_SG_LIST; -typedef struct _IPS_INFOSTR { -   char *buffer; -   int   length; -   int   offset; -   int   pos; -   int   localpos; -} IPS_INFOSTR; -  typedef struct {     char *option_name;     int  *option_flag; diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index 314b4f61b9e..8b9c191a701 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c @@ -10368,36 +10368,6 @@ lpfc_io_resume(struct pci_dev *pdev)  	return;  } -/** - * lpfc_mgmt_open - method called when 'lpfcmgmt' is opened from userspace - * @inode: pointer to the inode representing the lpfcmgmt device - * @filep: pointer to the file representing the open lpfcmgmt device - * - * This routine puts a reference count on the lpfc module whenever the - * character device is opened - **/ -static int -lpfc_mgmt_open(struct inode *inode, struct file *filep) -{ -	try_module_get(THIS_MODULE); -	return 0; -} - -/** - * lpfc_mgmt_release - method called when 'lpfcmgmt' is closed in userspace - * @inode: pointer to the inode representing the lpfcmgmt device - * @filep: pointer to the file representing the open lpfcmgmt device - * - * This routine removes a reference count from the lpfc module when the - * character device is closed - **/ -static int -lpfc_mgmt_release(struct inode *inode, struct file *filep) -{ -	module_put(THIS_MODULE); -	return 0; -} -  static struct pci_device_id lpfc_id_table[] = {  	{PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_VIPER,  		PCI_ANY_ID, PCI_ANY_ID, }, @@ -10515,8 +10485,7 @@ static struct pci_driver lpfc_driver = {  };  static const struct file_operations lpfc_mgmt_fop = { -	.open = lpfc_mgmt_open, -	.release = lpfc_mgmt_release, +	.owner = THIS_MODULE,  };  static struct miscdevice lpfc_mgmt_dev = { diff --git a/drivers/scsi/mac_scsi.c b/drivers/scsi/mac_scsi.c index 24828b54773..858075723c8 100644 --- a/drivers/scsi/mac_scsi.c +++ b/drivers/scsi/mac_scsi.c @@ -561,7 +561,8 @@ static int macscsi_pwrite (struct Scsi_Host *instance,  static struct scsi_host_template driver_template = {  	.proc_name			= "Mac5380", -	.proc_info			= macscsi_proc_info, +	.show_info			= macscsi_show_info, +	.write_info			= macscsi_write_info,  	.name				= "Macintosh NCR5380 SCSI",  	.detect				= macscsi_detect,  	.release			= macscsi_release, diff --git a/drivers/scsi/mac_scsi.h b/drivers/scsi/mac_scsi.h index d26e331c6c1..7dc62fce1c4 100644 --- a/drivers/scsi/mac_scsi.h +++ b/drivers/scsi/mac_scsi.h @@ -72,7 +72,8 @@  #define NCR5380_queue_command macscsi_queue_command  #define NCR5380_abort macscsi_abort  #define NCR5380_bus_reset macscsi_bus_reset -#define NCR5380_proc_info macscsi_proc_info +#define NCR5380_show_info macscsi_show_info +#define NCR5380_write_info macscsi_write_info  #define BOARD_NORMAL	0  #define BOARD_NCR53C400	1 diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c index 9504ec0ec68..7373255aa1e 100644 --- a/drivers/scsi/megaraid.c +++ b/drivers/scsi/megaraid.c @@ -39,6 +39,7 @@  #include <linux/completion.h>  #include <linux/delay.h>  #include <linux/proc_fs.h> +#include <linux/seq_file.h>  #include <linux/reboot.h>  #include <linux/module.h>  #include <linux/list.h> @@ -2069,385 +2070,201 @@ mega_free_inquiry(void *inquiry, dma_addr_t dma_handle, struct pci_dev *pdev)  #ifdef CONFIG_PROC_FS  /* Following code handles /proc fs  */ -#define CREATE_READ_PROC(string, func)	create_proc_read_entry(string,	\ -					S_IRUSR | S_IFREG,		\ -					controller_proc_dir_entry,	\ -					func, adapter) -  /** - * mega_create_proc_entry() - * @index - index in soft state array - * @parent - parent node for this /proc entry - * - * Creates /proc entries for our controllers. - */ -static void -mega_create_proc_entry(int index, struct proc_dir_entry *parent) -{ -	struct proc_dir_entry	*controller_proc_dir_entry = NULL; -	u8		string[64] = { 0 }; -	adapter_t	*adapter = hba_soft_state[index]; - -	sprintf(string, "hba%d", adapter->host->host_no); - -	controller_proc_dir_entry = -		adapter->controller_proc_dir_entry = proc_mkdir(string, parent); - -	if(!controller_proc_dir_entry) { -		printk(KERN_WARNING "\nmegaraid: proc_mkdir failed\n"); -		return; -	} -	adapter->proc_read = CREATE_READ_PROC("config", proc_read_config); -	adapter->proc_stat = CREATE_READ_PROC("stat", proc_read_stat); -	adapter->proc_mbox = CREATE_READ_PROC("mailbox", proc_read_mbox); -#if MEGA_HAVE_ENH_PROC -	adapter->proc_rr = CREATE_READ_PROC("rebuild-rate", proc_rebuild_rate); -	adapter->proc_battery = CREATE_READ_PROC("battery-status", -			proc_battery); - -	/* -	 * Display each physical drive on its channel -	 */ -	adapter->proc_pdrvstat[0] = CREATE_READ_PROC("diskdrives-ch0", -					proc_pdrv_ch0); -	adapter->proc_pdrvstat[1] = CREATE_READ_PROC("diskdrives-ch1", -					proc_pdrv_ch1); -	adapter->proc_pdrvstat[2] = CREATE_READ_PROC("diskdrives-ch2", -					proc_pdrv_ch2); -	adapter->proc_pdrvstat[3] = CREATE_READ_PROC("diskdrives-ch3", -					proc_pdrv_ch3); - -	/* -	 * Display a set of up to 10 logical drive through each of following -	 * /proc entries -	 */ -	adapter->proc_rdrvstat[0] = CREATE_READ_PROC("raiddrives-0-9", -					proc_rdrv_10); -	adapter->proc_rdrvstat[1] = CREATE_READ_PROC("raiddrives-10-19", -					proc_rdrv_20); -	adapter->proc_rdrvstat[2] = CREATE_READ_PROC("raiddrives-20-29", -					proc_rdrv_30); -	adapter->proc_rdrvstat[3] = CREATE_READ_PROC("raiddrives-30-39", -					proc_rdrv_40); -#endif -} - - -/** - * proc_read_config() - * @page - buffer to write the data in - * @start - where the actual data has been written in page - * @offset - same meaning as the read system call - * @count - same meaning as the read system call - * @eof - set if no more data needs to be returned - * @data - pointer to our soft state + * proc_show_config() + * @m - Synthetic file construction data + * @v - File iterator   *   * Display configuration information about the controller.   */  static int -proc_read_config(char *page, char **start, off_t offset, int count, int *eof, -		void *data) +proc_show_config(struct seq_file *m, void *v)  { -	adapter_t *adapter = (adapter_t *)data; -	int len = 0; - -	len += sprintf(page+len, "%s", MEGARAID_VERSION); +	adapter_t *adapter = m->private; +	seq_puts(m, MEGARAID_VERSION);  	if(adapter->product_info.product_name[0]) -		len += sprintf(page+len, "%s\n", -				adapter->product_info.product_name); - -	len += sprintf(page+len, "Controller Type: "); - -	if( adapter->flag & BOARD_MEMMAP ) { -		len += sprintf(page+len, -			"438/466/467/471/493/518/520/531/532\n"); -	} -	else { -		len += sprintf(page+len, -			"418/428/434\n"); -	} +		seq_printf(m, "%s\n", adapter->product_info.product_name); -	if(adapter->flag & BOARD_40LD) { -		len += sprintf(page+len, -				"Controller Supports 40 Logical Drives\n"); -	} +	seq_puts(m, "Controller Type: "); -	if(adapter->flag & BOARD_64BIT) { -		len += sprintf(page+len, -		"Controller capable of 64-bit memory addressing\n"); -	} -	if( adapter->has_64bit_addr ) { -		len += sprintf(page+len, -			"Controller using 64-bit memory addressing\n"); -	} -	else { -		len += sprintf(page+len, -			"Controller is not using 64-bit memory addressing\n"); -	} +	if( adapter->flag & BOARD_MEMMAP ) +		seq_puts(m, "438/466/467/471/493/518/520/531/532\n"); +	else +		seq_puts(m, "418/428/434\n"); -	len += sprintf(page+len, "Base = %08lx, Irq = %d, ", adapter->base, -			adapter->host->irq); +	if(adapter->flag & BOARD_40LD) +		seq_puts(m, "Controller Supports 40 Logical Drives\n"); -	len += sprintf(page+len, "Logical Drives = %d, Channels = %d\n", -			adapter->numldrv, adapter->product_info.nchannels); +	if(adapter->flag & BOARD_64BIT) +		seq_puts(m, "Controller capable of 64-bit memory addressing\n"); +	if( adapter->has_64bit_addr ) +		seq_puts(m, "Controller using 64-bit memory addressing\n"); +	else +		seq_puts(m, "Controller is not using 64-bit memory addressing\n"); -	len += sprintf(page+len, "Version =%s:%s, DRAM = %dMb\n", -			adapter->fw_version, adapter->bios_version, -			adapter->product_info.dram_size); +	seq_printf(m, "Base = %08lx, Irq = %d, ", +		   adapter->base, adapter->host->irq); -	len += sprintf(page+len, -		"Controller Queue Depth = %d, Driver Queue Depth = %d\n", -		adapter->product_info.max_commands, adapter->max_cmds); +	seq_printf(m, "Logical Drives = %d, Channels = %d\n", +		   adapter->numldrv, adapter->product_info.nchannels); -	len += sprintf(page+len, "support_ext_cdb    = %d\n", -			adapter->support_ext_cdb); -	len += sprintf(page+len, "support_random_del = %d\n", -			adapter->support_random_del); -	len += sprintf(page+len, "boot_ldrv_enabled  = %d\n", -			adapter->boot_ldrv_enabled); -	len += sprintf(page+len, "boot_ldrv          = %d\n", -			adapter->boot_ldrv); -	len += sprintf(page+len, "boot_pdrv_enabled  = %d\n", -			adapter->boot_pdrv_enabled); -	len += sprintf(page+len, "boot_pdrv_ch       = %d\n", -			adapter->boot_pdrv_ch); -	len += sprintf(page+len, "boot_pdrv_tgt      = %d\n", -			adapter->boot_pdrv_tgt); -	len += sprintf(page+len, "quiescent          = %d\n", -			atomic_read(&adapter->quiescent)); -	len += sprintf(page+len, "has_cluster        = %d\n", -			adapter->has_cluster); +	seq_printf(m, "Version =%s:%s, DRAM = %dMb\n", +		   adapter->fw_version, adapter->bios_version, +		   adapter->product_info.dram_size); -	len += sprintf(page+len, "\nModule Parameters:\n"); -	len += sprintf(page+len, "max_cmd_per_lun    = %d\n", -			max_cmd_per_lun); -	len += sprintf(page+len, "max_sectors_per_io = %d\n", -			max_sectors_per_io); +	seq_printf(m, "Controller Queue Depth = %d, Driver Queue Depth = %d\n", +		   adapter->product_info.max_commands, adapter->max_cmds); -	*eof = 1; +	seq_printf(m, "support_ext_cdb    = %d\n", adapter->support_ext_cdb); +	seq_printf(m, "support_random_del = %d\n", adapter->support_random_del); +	seq_printf(m, "boot_ldrv_enabled  = %d\n", adapter->boot_ldrv_enabled); +	seq_printf(m, "boot_ldrv          = %d\n", adapter->boot_ldrv); +	seq_printf(m, "boot_pdrv_enabled  = %d\n", adapter->boot_pdrv_enabled); +	seq_printf(m, "boot_pdrv_ch       = %d\n", adapter->boot_pdrv_ch); +	seq_printf(m, "boot_pdrv_tgt      = %d\n", adapter->boot_pdrv_tgt); +	seq_printf(m, "quiescent          = %d\n", +		   atomic_read(&adapter->quiescent)); +	seq_printf(m, "has_cluster        = %d\n", adapter->has_cluster); -	return len; +	seq_puts(m, "\nModule Parameters:\n"); +	seq_printf(m, "max_cmd_per_lun    = %d\n", max_cmd_per_lun); +	seq_printf(m, "max_sectors_per_io = %d\n", max_sectors_per_io); +	return 0;  } - -  /** - * proc_read_stat() - * @page - buffer to write the data in - * @start - where the actual data has been written in page - * @offset - same meaning as the read system call - * @count - same meaning as the read system call - * @eof - set if no more data needs to be returned - * @data - pointer to our soft state + * proc_show_stat() + * @m - Synthetic file construction data + * @v - File iterator   * - * Diaplay statistical information about the I/O activity. + * Display statistical information about the I/O activity.   */  static int -proc_read_stat(char *page, char **start, off_t offset, int count, int *eof, -		void *data) +proc_show_stat(struct seq_file *m, void *v)  { -	adapter_t	*adapter; -	int	len; +	adapter_t *adapter = m->private; +#if MEGA_HAVE_STATS  	int	i; +#endif -	i = 0;	/* avoid compilation warnings */ -	len = 0; -	adapter = (adapter_t *)data; - -	len = sprintf(page, "Statistical Information for this controller\n"); -	len += sprintf(page+len, "pend_cmds = %d\n", -			atomic_read(&adapter->pend_cmds)); +	seq_puts(m, "Statistical Information for this controller\n"); +	seq_printf(m, "pend_cmds = %d\n", atomic_read(&adapter->pend_cmds));  #if MEGA_HAVE_STATS  	for(i = 0; i < adapter->numldrv; i++) { -		len += sprintf(page+len, "Logical Drive %d:\n", i); - -		len += sprintf(page+len, -			"\tReads Issued = %lu, Writes Issued = %lu\n", -			adapter->nreads[i], adapter->nwrites[i]); - -		len += sprintf(page+len, -			"\tSectors Read = %lu, Sectors Written = %lu\n", -			adapter->nreadblocks[i], adapter->nwriteblocks[i]); - -		len += sprintf(page+len, -			"\tRead errors = %lu, Write errors = %lu\n\n", -			adapter->rd_errors[i], adapter->wr_errors[i]); +		seq_printf(m, "Logical Drive %d:\n", i); +		seq_printf(m, "\tReads Issued = %lu, Writes Issued = %lu\n", +			   adapter->nreads[i], adapter->nwrites[i]); +		seq_printf(m, "\tSectors Read = %lu, Sectors Written = %lu\n", +			   adapter->nreadblocks[i], adapter->nwriteblocks[i]); +		seq_printf(m, "\tRead errors = %lu, Write errors = %lu\n\n", +			   adapter->rd_errors[i], adapter->wr_errors[i]);  	}  #else -	len += sprintf(page+len, -			"IO and error counters not compiled in driver.\n"); +	seq_puts(m, "IO and error counters not compiled in driver.\n");  #endif - -	*eof = 1; - -	return len; +	return 0;  }  /** - * proc_read_mbox() - * @page - buffer to write the data in - * @start - where the actual data has been written in page - * @offset - same meaning as the read system call - * @count - same meaning as the read system call - * @eof - set if no more data needs to be returned - * @data - pointer to our soft state + * proc_show_mbox() + * @m - Synthetic file construction data + * @v - File iterator   *   * Display mailbox information for the last command issued. This information   * is good for debugging.   */  static int -proc_read_mbox(char *page, char **start, off_t offset, int count, int *eof, -		void *data) +proc_show_mbox(struct seq_file *m, void *v)  { - -	adapter_t	*adapter = (adapter_t *)data; +	adapter_t	*adapter = m->private;  	volatile mbox_t	*mbox = adapter->mbox; -	int	len = 0; - -	len = sprintf(page, "Contents of Mail Box Structure\n"); -	len += sprintf(page+len, "  Fw Command   = 0x%02x\n",  -			mbox->m_out.cmd); -	len += sprintf(page+len, "  Cmd Sequence = 0x%02x\n",  -			mbox->m_out.cmdid); -	len += sprintf(page+len, "  No of Sectors= %04d\n",  -			mbox->m_out.numsectors); -	len += sprintf(page+len, "  LBA          = 0x%02x\n",  -			mbox->m_out.lba); -	len += sprintf(page+len, "  DTA          = 0x%08x\n",  -			mbox->m_out.xferaddr); -	len += sprintf(page+len, "  Logical Drive= 0x%02x\n",  -			mbox->m_out.logdrv); -	len += sprintf(page+len, "  No of SG Elmt= 0x%02x\n", -			mbox->m_out.numsgelements); -	len += sprintf(page+len, "  Busy         = %01x\n",  -			mbox->m_in.busy); -	len += sprintf(page+len, "  Status       = 0x%02x\n",  -			mbox->m_in.status); - -	*eof = 1; -	return len; +	seq_puts(m, "Contents of Mail Box Structure\n"); +	seq_printf(m, "  Fw Command   = 0x%02x\n", mbox->m_out.cmd); +	seq_printf(m, "  Cmd Sequence = 0x%02x\n", mbox->m_out.cmdid); +	seq_printf(m, "  No of Sectors= %04d\n", mbox->m_out.numsectors); +	seq_printf(m, "  LBA          = 0x%02x\n", mbox->m_out.lba); +	seq_printf(m, "  DTA          = 0x%08x\n", mbox->m_out.xferaddr); +	seq_printf(m, "  Logical Drive= 0x%02x\n", mbox->m_out.logdrv); +	seq_printf(m, "  No of SG Elmt= 0x%02x\n", mbox->m_out.numsgelements); +	seq_printf(m, "  Busy         = %01x\n", mbox->m_in.busy); +	seq_printf(m, "  Status       = 0x%02x\n", mbox->m_in.status); +	return 0;  }  /** - * proc_rebuild_rate() - * @page - buffer to write the data in - * @start - where the actual data has been written in page - * @offset - same meaning as the read system call - * @count - same meaning as the read system call - * @eof - set if no more data needs to be returned - * @data - pointer to our soft state + * proc_show_rebuild_rate() + * @m - Synthetic file construction data + * @v - File iterator   *   * Display current rebuild rate   */  static int -proc_rebuild_rate(char *page, char **start, off_t offset, int count, int *eof, -		void *data) +proc_show_rebuild_rate(struct seq_file *m, void *v)  { -	adapter_t	*adapter = (adapter_t *)data; +	adapter_t	*adapter = m->private;  	dma_addr_t	dma_handle;  	caddr_t		inquiry;  	struct pci_dev	*pdev; -	int	len = 0; -	if( make_local_pdev(adapter, &pdev) != 0 ) { -		*eof = 1; -		return len; -	} +	if( make_local_pdev(adapter, &pdev) != 0 ) +		return 0; -	if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) == NULL ) { -		free_local_pdev(pdev); -		*eof = 1; -		return len; -	} +	if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) == NULL ) +		goto free_pdev;  	if( mega_adapinq(adapter, dma_handle) != 0 ) { - -		len = sprintf(page, "Adapter inquiry failed.\n"); - +		seq_puts(m, "Adapter inquiry failed.\n");  		printk(KERN_WARNING "megaraid: inquiry failed.\n"); - -		mega_free_inquiry(inquiry, dma_handle, pdev); - -		free_local_pdev(pdev); - -		*eof = 1; - -		return len; +		goto free_inquiry;  	} -	if( adapter->flag & BOARD_40LD ) { -		len = sprintf(page, "Rebuild Rate: [%d%%]\n", -			((mega_inquiry3 *)inquiry)->rebuild_rate); -	} -	else { -		len = sprintf(page, "Rebuild Rate: [%d%%]\n", +	if( adapter->flag & BOARD_40LD ) +		seq_printf(m, "Rebuild Rate: [%d%%]\n", +			   ((mega_inquiry3 *)inquiry)->rebuild_rate); +	else +		seq_printf(m, "Rebuild Rate: [%d%%]\n",  			((mraid_ext_inquiry *) -			inquiry)->raid_inq.adapter_info.rebuild_rate); -	} - +			 inquiry)->raid_inq.adapter_info.rebuild_rate); +free_inquiry:  	mega_free_inquiry(inquiry, dma_handle, pdev); - +free_pdev:  	free_local_pdev(pdev); - -	*eof = 1; - -	return len; +	return 0;  }  /** - * proc_battery() - * @page - buffer to write the data in - * @start - where the actual data has been written in page - * @offset - same meaning as the read system call - * @count - same meaning as the read system call - * @eof - set if no more data needs to be returned - * @data - pointer to our soft state + * proc_show_battery() + * @m - Synthetic file construction data + * @v - File iterator   *   * Display information about the battery module on the controller.   */  static int -proc_battery(char *page, char **start, off_t offset, int count, int *eof, -		void *data) +proc_show_battery(struct seq_file *m, void *v)  { -	adapter_t	*adapter = (adapter_t *)data; +	adapter_t	*adapter = m->private;  	dma_addr_t	dma_handle;  	caddr_t		inquiry;  	struct pci_dev	*pdev; -	u8	battery_status = 0; -	char	str[256]; -	int	len = 0; +	u8	battery_status; -	if( make_local_pdev(adapter, &pdev) != 0 ) { -		*eof = 1; -		return len; -	} +	if( make_local_pdev(adapter, &pdev) != 0 ) +		return 0; -	if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) == NULL ) { -		free_local_pdev(pdev); -		*eof = 1; -		return len; -	} +	if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) == NULL ) +		goto free_pdev;  	if( mega_adapinq(adapter, dma_handle) != 0 ) { - -		len = sprintf(page, "Adapter inquiry failed.\n"); - +		seq_printf(m, "Adapter inquiry failed.\n");  		printk(KERN_WARNING "megaraid: inquiry failed.\n"); - -		mega_free_inquiry(inquiry, dma_handle, pdev); - -		free_local_pdev(pdev); - -		*eof = 1; - -		return len; +		goto free_inquiry;  	}  	if( adapter->flag & BOARD_40LD ) { @@ -2461,146 +2278,80 @@ proc_battery(char *page, char **start, off_t offset, int count, int *eof,  	/*  	 * Decode the battery status  	 */ -	sprintf(str, "Battery Status:[%d]", battery_status); +	seq_printf(m, "Battery Status:[%d]", battery_status);  	if(battery_status == MEGA_BATT_CHARGE_DONE) -		strcat(str, " Charge Done"); +		seq_puts(m, " Charge Done");  	if(battery_status & MEGA_BATT_MODULE_MISSING) -		strcat(str, " Module Missing"); +		seq_puts(m, " Module Missing");  	if(battery_status & MEGA_BATT_LOW_VOLTAGE) -		strcat(str, " Low Voltage"); +		seq_puts(m, " Low Voltage");  	if(battery_status & MEGA_BATT_TEMP_HIGH) -		strcat(str, " Temperature High"); +		seq_puts(m, " Temperature High");  	if(battery_status & MEGA_BATT_PACK_MISSING) -		strcat(str, " Pack Missing"); +		seq_puts(m, " Pack Missing");  	if(battery_status & MEGA_BATT_CHARGE_INPROG) -		strcat(str, " Charge In-progress"); +		seq_puts(m, " Charge In-progress");  	if(battery_status & MEGA_BATT_CHARGE_FAIL) -		strcat(str, " Charge Fail"); +		seq_puts(m, " Charge Fail");  	if(battery_status & MEGA_BATT_CYCLES_EXCEEDED) -		strcat(str, " Cycles Exceeded"); - -	len = sprintf(page, "%s\n", str); +		seq_puts(m, " Cycles Exceeded"); +	seq_putc(m, '\n'); +free_inquiry:  	mega_free_inquiry(inquiry, dma_handle, pdev); - +free_pdev:  	free_local_pdev(pdev); - -	*eof = 1; - -	return len; -} - - -/** - * proc_pdrv_ch0() - * @page - buffer to write the data in - * @start - where the actual data has been written in page - * @offset - same meaning as the read system call - * @count - same meaning as the read system call - * @eof - set if no more data needs to be returned - * @data - pointer to our soft state - * - * Display information about the physical drives on physical channel 0. - */ -static int -proc_pdrv_ch0(char *page, char **start, off_t offset, int count, int *eof, -		void *data) -{ -	adapter_t *adapter = (adapter_t *)data; - -	*eof = 1; - -	return (proc_pdrv(adapter, page, 0)); -} - - -/** - * proc_pdrv_ch1() - * @page - buffer to write the data in - * @start - where the actual data has been written in page - * @offset - same meaning as the read system call - * @count - same meaning as the read system call - * @eof - set if no more data needs to be returned - * @data - pointer to our soft state - * - * Display information about the physical drives on physical channel 1. - */ -static int -proc_pdrv_ch1(char *page, char **start, off_t offset, int count, int *eof, -		void *data) -{ -	adapter_t *adapter = (adapter_t *)data; - -	*eof = 1; - -	return (proc_pdrv(adapter, page, 1)); +	return 0;  } -/** - * proc_pdrv_ch2() - * @page - buffer to write the data in - * @start - where the actual data has been written in page - * @offset - same meaning as the read system call - * @count - same meaning as the read system call - * @eof - set if no more data needs to be returned - * @data - pointer to our soft state - * - * Display information about the physical drives on physical channel 2. +/* + * Display scsi inquiry   */ -static int -proc_pdrv_ch2(char *page, char **start, off_t offset, int count, int *eof, -		void *data) +static void +mega_print_inquiry(struct seq_file *m, char *scsi_inq)  { -	adapter_t *adapter = (adapter_t *)data; - -	*eof = 1; - -	return (proc_pdrv(adapter, page, 2)); -} +	int	i; +	seq_puts(m, "  Vendor: "); +	seq_write(m, scsi_inq + 8, 8); +	seq_puts(m, "  Model: "); +	seq_write(m, scsi_inq + 16, 16); +	seq_puts(m, "  Rev: "); +	seq_write(m, scsi_inq + 32, 4); +	seq_putc(m, '\n'); -/** - * proc_pdrv_ch3() - * @page - buffer to write the data in - * @start - where the actual data has been written in page - * @offset - same meaning as the read system call - * @count - same meaning as the read system call - * @eof - set if no more data needs to be returned - * @data - pointer to our soft state - * - * Display information about the physical drives on physical channel 3. - */ -static int -proc_pdrv_ch3(char *page, char **start, off_t offset, int count, int *eof, -		void *data) -{ -	adapter_t *adapter = (adapter_t *)data; +	i = scsi_inq[0] & 0x1f; +	seq_printf(m, "  Type:   %s ", scsi_device_type(i)); -	*eof = 1; +	seq_printf(m, "                 ANSI SCSI revision: %02x", +		   scsi_inq[2] & 0x07); -	return (proc_pdrv(adapter, page, 3)); +	if( (scsi_inq[2] & 0x07) == 1 && (scsi_inq[3] & 0x0f) == 1 ) +		seq_puts(m, " CCS\n"); +	else +		seq_putc(m, '\n');  } -  /** - * proc_pdrv() + * proc_show_pdrv() + * @m - Synthetic file construction data   * @page - buffer to write the data in   * @adapter - pointer to our soft state   *   * Display information about the physical drives.   */  static int -proc_pdrv(adapter_t *adapter, char *page, int channel) +proc_show_pdrv(struct seq_file *m, adapter_t *adapter, int channel)  {  	dma_addr_t	dma_handle;  	char		*scsi_inq; @@ -2611,32 +2362,24 @@ proc_pdrv(adapter_t *adapter, char *page, int channel)  	u8	state;  	int	tgt;  	int	max_channels; -	int	len = 0; -	char	str[80];  	int	i; -	if( make_local_pdev(adapter, &pdev) != 0 ) { -		return len; -	} +	if( make_local_pdev(adapter, &pdev) != 0 ) +		return 0; -	if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) == NULL ) { +	if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) == NULL )  		goto free_pdev; -	}  	if( mega_adapinq(adapter, dma_handle) != 0 ) { -		len = sprintf(page, "Adapter inquiry failed.\n"); - +		seq_puts(m, "Adapter inquiry failed.\n");  		printk(KERN_WARNING "megaraid: inquiry failed.\n"); -  		goto free_inquiry;  	}  	scsi_inq = pci_alloc_consistent(pdev, 256, &scsi_inq_dma_handle); -  	if( scsi_inq == NULL ) { -		len = sprintf(page, "memory not available for scsi inq.\n"); - +		seq_puts(m, "memory not available for scsi inq.\n");  		goto free_inquiry;  	} @@ -2659,39 +2402,31 @@ proc_pdrv(adapter_t *adapter, char *page, int channel)  		i = channel*16 + tgt;  		state = *(pdrv_state + i); -  		switch( state & 0x0F ) { -  		case PDRV_ONLINE: -			sprintf(str, -			"Channel:%2d Id:%2d State: Online", -				channel, tgt); +			seq_printf(m, "Channel:%2d Id:%2d State: Online", +				   channel, tgt);  			break;  		case PDRV_FAILED: -			sprintf(str, -			"Channel:%2d Id:%2d State: Failed", -				channel, tgt); +			seq_printf(m, "Channel:%2d Id:%2d State: Failed", +				   channel, tgt);  			break;  		case PDRV_RBLD: -			sprintf(str, -			"Channel:%2d Id:%2d State: Rebuild", -				channel, tgt); +			seq_printf(m, "Channel:%2d Id:%2d State: Rebuild", +				   channel, tgt);  			break;  		case PDRV_HOTSPARE: -			sprintf(str, -			"Channel:%2d Id:%2d State: Hot spare", -				channel, tgt); +			seq_printf(m, "Channel:%2d Id:%2d State: Hot spare", +				   channel, tgt);  			break;  		default: -			sprintf(str, -			"Channel:%2d Id:%2d State: Un-configured", -				channel, tgt); +			seq_printf(m, "Channel:%2d Id:%2d State: Un-configured", +				   channel, tgt);  			break; -  		}  		/* @@ -2710,11 +2445,8 @@ proc_pdrv(adapter_t *adapter, char *page, int channel)  		 * Check for overflow. We print less than 240  		 * characters for inquiry  		 */ -		if( (len + 240) >= PAGE_SIZE ) break; - -		len += sprintf(page+len, "%s.\n", str); - -		len += mega_print_inquiry(page+len, scsi_inq); +		seq_puts(m, ".\n"); +		mega_print_inquiry(m, scsi_inq);  	}  free_pci: @@ -2723,150 +2455,68 @@ free_inquiry:  	mega_free_inquiry(inquiry, dma_handle, pdev);  free_pdev:  	free_local_pdev(pdev); - -	return len; -} - - -/* - * Display scsi inquiry - */ -static int -mega_print_inquiry(char *page, char *scsi_inq) -{ -	int	len = 0; -	int	i; - -	len = sprintf(page, "  Vendor: "); -	for( i = 8; i < 16; i++ ) { -		len += sprintf(page+len, "%c", scsi_inq[i]); -	} - -	len += sprintf(page+len, "  Model: "); - -	for( i = 16; i < 32; i++ ) { -		len += sprintf(page+len, "%c", scsi_inq[i]); -	} - -	len += sprintf(page+len, "  Rev: "); - -	for( i = 32; i < 36; i++ ) { -		len += sprintf(page+len, "%c", scsi_inq[i]); -	} - -	len += sprintf(page+len, "\n"); - -	i = scsi_inq[0] & 0x1f; - -	len += sprintf(page+len, "  Type:   %s ", scsi_device_type(i)); - -	len += sprintf(page+len, -	"                 ANSI SCSI revision: %02x", scsi_inq[2] & 0x07); - -	if( (scsi_inq[2] & 0x07) == 1 && (scsi_inq[3] & 0x0f) == 1 ) -		len += sprintf(page+len, " CCS\n"); -	else -		len += sprintf(page+len, "\n"); - -	return len; +	return 0;  } -  /** - * proc_rdrv_10() - * @page - buffer to write the data in - * @start - where the actual data has been written in page - * @offset - same meaning as the read system call - * @count - same meaning as the read system call - * @eof - set if no more data needs to be returned - * @data - pointer to our soft state + * proc_show_pdrv_ch0() + * @m - Synthetic file construction data + * @v - File iterator   * - * Display real time information about the logical drives 0 through 9. + * Display information about the physical drives on physical channel 0.   */  static int -proc_rdrv_10(char *page, char **start, off_t offset, int count, int *eof, -		void *data) +proc_show_pdrv_ch0(struct seq_file *m, void *v)  { -	adapter_t *adapter = (adapter_t *)data; - -	*eof = 1; - -	return (proc_rdrv(adapter, page, 0, 9)); +	return proc_show_pdrv(m, m->private, 0);  }  /** - * proc_rdrv_20() - * @page - buffer to write the data in - * @start - where the actual data has been written in page - * @offset - same meaning as the read system call - * @count - same meaning as the read system call - * @eof - set if no more data needs to be returned - * @data - pointer to our soft state + * proc_show_pdrv_ch1() + * @m - Synthetic file construction data + * @v - File iterator   * - * Display real time information about the logical drives 0 through 9. + * Display information about the physical drives on physical channel 1.   */  static int -proc_rdrv_20(char *page, char **start, off_t offset, int count, int *eof, -		void *data) +proc_show_pdrv_ch1(struct seq_file *m, void *v)  { -	adapter_t *adapter = (adapter_t *)data; - -	*eof = 1; - -	return (proc_rdrv(adapter, page, 10, 19)); +	return proc_show_pdrv(m, m->private, 1);  }  /** - * proc_rdrv_30() - * @page - buffer to write the data in - * @start - where the actual data has been written in page - * @offset - same meaning as the read system call - * @count - same meaning as the read system call - * @eof - set if no more data needs to be returned - * @data - pointer to our soft state + * proc_show_pdrv_ch2() + * @m - Synthetic file construction data + * @v - File iterator   * - * Display real time information about the logical drives 0 through 9. + * Display information about the physical drives on physical channel 2.   */  static int -proc_rdrv_30(char *page, char **start, off_t offset, int count, int *eof, -		void *data) +proc_show_pdrv_ch2(struct seq_file *m, void *v)  { -	adapter_t *adapter = (adapter_t *)data; - -	*eof = 1; - -	return (proc_rdrv(adapter, page, 20, 29)); +	return proc_show_pdrv(m, m->private, 2);  }  /** - * proc_rdrv_40() - * @page - buffer to write the data in - * @start - where the actual data has been written in page - * @offset - same meaning as the read system call - * @count - same meaning as the read system call - * @eof - set if no more data needs to be returned - * @data - pointer to our soft state + * proc_show_pdrv_ch3() + * @m - Synthetic file construction data + * @v - File iterator   * - * Display real time information about the logical drives 0 through 9. + * Display information about the physical drives on physical channel 3.   */  static int -proc_rdrv_40(char *page, char **start, off_t offset, int count, int *eof, -		void *data) +proc_show_pdrv_ch3(struct seq_file *m, void *v)  { -	adapter_t *adapter = (adapter_t *)data; - -	*eof = 1; - -	return (proc_rdrv(adapter, page, 30, 39)); +	return proc_show_pdrv(m, m->private, 3);  }  /** - * proc_rdrv() - * @page - buffer to write the data in + * proc_show_rdrv() + * @m - Synthetic file construction data   * @adapter - pointer to our soft state   * @start - starting logical drive to display   * @end - ending logical drive to display @@ -2875,7 +2525,7 @@ proc_rdrv_40(char *page, char **start, off_t offset, int count, int *eof,   * /proc/scsi/scsi interface   */  static int -proc_rdrv(adapter_t *adapter, char *page, int start, int end ) +proc_show_rdrv(struct seq_file *m, adapter_t *adapter, int start, int end )  {  	dma_addr_t	dma_handle;  	logdrv_param	*lparam; @@ -2887,29 +2537,18 @@ proc_rdrv(adapter_t *adapter, char *page, int start, int end )  	u8	*rdrv_state;  	int	num_ldrv;  	u32	array_sz; -	int	len = 0;  	int	i; -	if( make_local_pdev(adapter, &pdev) != 0 ) { -		return len; -	} +	if( make_local_pdev(adapter, &pdev) != 0 ) +		return 0; -	if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) == NULL ) { -		free_local_pdev(pdev); -		return len; -	} +	if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) == NULL ) +		goto free_pdev;  	if( mega_adapinq(adapter, dma_handle) != 0 ) { - -		len = sprintf(page, "Adapter inquiry failed.\n"); - +		seq_puts(m, "Adapter inquiry failed.\n");  		printk(KERN_WARNING "megaraid: inquiry failed.\n"); - -		mega_free_inquiry(inquiry, dma_handle, pdev); - -		free_local_pdev(pdev); - -		return len; +		goto free_inquiry;  	}  	memset(&mc, 0, sizeof(megacmd_t)); @@ -2935,13 +2574,8 @@ proc_rdrv(adapter_t *adapter, char *page, int start, int end )  			&disk_array_dma_handle);  	if( disk_array == NULL ) { -		len = sprintf(page, "memory not available.\n"); - -		mega_free_inquiry(inquiry, dma_handle, pdev); - -		free_local_pdev(pdev); - -		return len; +		seq_puts(m, "memory not available.\n"); +		goto free_inquiry;  	}  	mc.xferaddr = (u32)disk_array_dma_handle; @@ -2951,17 +2585,8 @@ proc_rdrv(adapter_t *adapter, char *page, int start, int end )  		mc.opcode = OP_DCMD_READ_CONFIG;  		if( mega_internal_command(adapter, &mc, NULL) ) { - -			len = sprintf(page, "40LD read config failed.\n"); - -			mega_free_inquiry(inquiry, dma_handle, pdev); - -			pci_free_consistent(pdev, array_sz, disk_array, -					disk_array_dma_handle); - -			free_local_pdev(pdev); - -			return len; +			seq_puts(m, "40LD read config failed.\n"); +			goto free_pci;  		}  	} @@ -2969,24 +2594,10 @@ proc_rdrv(adapter_t *adapter, char *page, int start, int end )  		mc.cmd = NEW_READ_CONFIG_8LD;  		if( mega_internal_command(adapter, &mc, NULL) ) { -  			mc.cmd = READ_CONFIG_8LD; - -			if( mega_internal_command(adapter, &mc, -						NULL) ){ - -				len = sprintf(page, -					"8LD read config failed.\n"); - -				mega_free_inquiry(inquiry, dma_handle, pdev); - -				pci_free_consistent(pdev, array_sz, -						disk_array, -						disk_array_dma_handle); - -				free_local_pdev(pdev); - -				return len; +			if( mega_internal_command(adapter, &mc, NULL) ) { +				seq_puts(m, "8LD read config failed.\n"); +				goto free_pci;  			}  		}  	} @@ -3006,29 +2617,23 @@ proc_rdrv(adapter_t *adapter, char *page, int start, int end )  		 * Check for overflow. We print less than 240 characters for  		 * information about each logical drive.  		 */ -		if( (len + 240) >= PAGE_SIZE ) break; - -		len += sprintf(page+len, "Logical drive:%2d:, ", i); +		seq_printf(m, "Logical drive:%2d:, ", i);  		switch( rdrv_state[i] & 0x0F ) {  		case RDRV_OFFLINE: -			len += sprintf(page+len, "state: offline"); +			seq_puts(m, "state: offline");  			break; -  		case RDRV_DEGRADED: -			len += sprintf(page+len, "state: degraded"); +			seq_puts(m, "state: degraded");  			break; -  		case RDRV_OPTIMAL: -			len += sprintf(page+len, "state: optimal"); +			seq_puts(m, "state: optimal");  			break; -  		case RDRV_DELETED: -			len += sprintf(page+len, "state: deleted"); +			seq_puts(m, "state: deleted");  			break; -  		default: -			len += sprintf(page+len, "state: unknown"); +			seq_puts(m, "state: unknown");  			break;  		} @@ -3036,84 +2641,203 @@ proc_rdrv(adapter_t *adapter, char *page, int start, int end )  		 * Check if check consistency or initialization is going on  		 * for this logical drive.  		 */ -		if( (rdrv_state[i] & 0xF0) == 0x20 ) { -			len += sprintf(page+len, -					", check-consistency in progress"); -		} -		else if( (rdrv_state[i] & 0xF0) == 0x10 ) { -			len += sprintf(page+len, -					", initialization in progress"); -		} +		if( (rdrv_state[i] & 0xF0) == 0x20 ) +			seq_puts(m, ", check-consistency in progress"); +		else if( (rdrv_state[i] & 0xF0) == 0x10 ) +			seq_puts(m, ", initialization in progress"); -		len += sprintf(page+len, "\n"); - -		len += sprintf(page+len, "Span depth:%3d, ", -				lparam->span_depth); - -		len += sprintf(page+len, "RAID level:%3d, ", -				lparam->level); - -		len += sprintf(page+len, "Stripe size:%3d, ", -				lparam->stripe_sz ? lparam->stripe_sz/2: 128); - -		len += sprintf(page+len, "Row size:%3d\n", -				lparam->row_size); +		seq_putc(m, '\n'); +		seq_printf(m, "Span depth:%3d, ", lparam->span_depth); +		seq_printf(m, "RAID level:%3d, ", lparam->level); +		seq_printf(m, "Stripe size:%3d, ", +			   lparam->stripe_sz ? lparam->stripe_sz/2: 128); +		seq_printf(m, "Row size:%3d\n", lparam->row_size); -		len += sprintf(page+len, "Read Policy: "); - +		seq_puts(m, "Read Policy: ");  		switch(lparam->read_ahead) { -  		case NO_READ_AHEAD: -			len += sprintf(page+len, "No read ahead, "); +			seq_puts(m, "No read ahead, ");  			break; -  		case READ_AHEAD: -			len += sprintf(page+len, "Read ahead, "); +			seq_puts(m, "Read ahead, ");  			break; -  		case ADAP_READ_AHEAD: -			len += sprintf(page+len, "Adaptive, "); +			seq_puts(m, "Adaptive, ");  			break;  		} -		len += sprintf(page+len, "Write Policy: "); - +		seq_puts(m, "Write Policy: ");  		switch(lparam->write_mode) { -  		case WRMODE_WRITE_THRU: -			len += sprintf(page+len, "Write thru, "); +			seq_puts(m, "Write thru, ");  			break; -  		case WRMODE_WRITE_BACK: -			len += sprintf(page+len, "Write back, "); +			seq_puts(m, "Write back, ");  			break;  		} -		len += sprintf(page+len, "Cache Policy: "); - +		seq_puts(m, "Cache Policy: ");  		switch(lparam->direct_io) { -  		case CACHED_IO: -			len += sprintf(page+len, "Cached IO\n\n"); +			seq_puts(m, "Cached IO\n\n");  			break; -  		case DIRECT_IO: -			len += sprintf(page+len, "Direct IO\n\n"); +			seq_puts(m, "Direct IO\n\n");  			break;  		}  	} -	mega_free_inquiry(inquiry, dma_handle, pdev); - +free_pci:  	pci_free_consistent(pdev, array_sz, disk_array,  			disk_array_dma_handle); - +free_inquiry: +	mega_free_inquiry(inquiry, dma_handle, pdev); +free_pdev:  	free_local_pdev(pdev); +	return 0; +} + +/** + * proc_show_rdrv_10() + * @m - Synthetic file construction data + * @v - File iterator + * + * Display real time information about the logical drives 0 through 9. + */ +static int +proc_show_rdrv_10(struct seq_file *m, void *v) +{ +	return proc_show_rdrv(m, m->private, 0, 9); +} + + +/** + * proc_show_rdrv_20() + * @m - Synthetic file construction data + * @v - File iterator + * + * Display real time information about the logical drives 0 through 9. + */ +static int +proc_show_rdrv_20(struct seq_file *m, void *v) +{ +	return proc_show_rdrv(m, m->private, 10, 19); +} + + +/** + * proc_show_rdrv_30() + * @m - Synthetic file construction data + * @v - File iterator + * + * Display real time information about the logical drives 0 through 9. + */ +static int +proc_show_rdrv_30(struct seq_file *m, void *v) +{ +	return proc_show_rdrv(m, m->private, 20, 29); +} + + +/** + * proc_show_rdrv_40() + * @m - Synthetic file construction data + * @v - File iterator + * + * Display real time information about the logical drives 0 through 9. + */ +static int +proc_show_rdrv_40(struct seq_file *m, void *v) +{ +	return proc_show_rdrv(m, m->private, 30, 39); +} + + +/* + * seq_file wrappers for procfile show routines. + */ +static int mega_proc_open(struct inode *inode, struct file *file) +{ +	adapter_t *adapter = proc_get_parent_data(inode); +	int (*show)(struct seq_file *, void *) = PDE_DATA(inode); + +	return single_open(file, show, adapter); +} + +static const struct file_operations mega_proc_fops = { +	.open		= mega_proc_open, +	.read		= seq_read, +	.llseek		= seq_lseek, +	.release	= seq_release, +}; + +/* + * Table of proc files we need to create. + */ +struct mega_proc_file { +	const char *name; +	unsigned short ptr_offset; +	int (*show) (struct seq_file *m, void *v); +}; + +static const struct mega_proc_file mega_proc_files[] = { +	{ "config",	      offsetof(adapter_t, proc_read), proc_show_config }, +	{ "stat",	      offsetof(adapter_t, proc_stat), proc_show_stat }, +	{ "mailbox",	      offsetof(adapter_t, proc_mbox), proc_show_mbox }, +#if MEGA_HAVE_ENH_PROC +	{ "rebuild-rate",     offsetof(adapter_t, proc_rr), proc_show_rebuild_rate }, +	{ "battery-status",   offsetof(adapter_t, proc_battery), proc_show_battery }, +	{ "diskdrives-ch0",   offsetof(adapter_t, proc_pdrvstat[0]), proc_show_pdrv_ch0 }, +	{ "diskdrives-ch1",   offsetof(adapter_t, proc_pdrvstat[1]), proc_show_pdrv_ch1 }, +	{ "diskdrives-ch2",   offsetof(adapter_t, proc_pdrvstat[2]), proc_show_pdrv_ch2 }, +	{ "diskdrives-ch3",   offsetof(adapter_t, proc_pdrvstat[3]), proc_show_pdrv_ch3 }, +	{ "raiddrives-0-9",   offsetof(adapter_t, proc_rdrvstat[0]), proc_show_rdrv_10 }, +	{ "raiddrives-10-19", offsetof(adapter_t, proc_rdrvstat[1]), proc_show_rdrv_20 }, +	{ "raiddrives-20-29", offsetof(adapter_t, proc_rdrvstat[2]), proc_show_rdrv_30 }, +	{ "raiddrives-30-39", offsetof(adapter_t, proc_rdrvstat[3]), proc_show_rdrv_40 }, +#endif +	{ NULL } +}; -	return len; +/** + * mega_create_proc_entry() + * @index - index in soft state array + * @parent - parent node for this /proc entry + * + * Creates /proc entries for our controllers. + */ +static void +mega_create_proc_entry(int index, struct proc_dir_entry *parent) +{ +	const struct mega_proc_file *f; +	adapter_t	*adapter = hba_soft_state[index]; +	struct proc_dir_entry	*dir, *de, **ppde; +	u8		string[16]; + +	sprintf(string, "hba%d", adapter->host->host_no); + +	dir = adapter->controller_proc_dir_entry = +		proc_mkdir_data(string, 0, parent, adapter); +	if(!dir) { +		printk(KERN_WARNING "\nmegaraid: proc_mkdir failed\n"); +		return; +	} + +	for (f = mega_proc_files; f->name; f++) { +		de = proc_create_data(f->name, S_IRUSR, dir, &mega_proc_fops, +				      f->show); +		if (!de) { +			printk(KERN_WARNING "\nmegaraid: proc_create failed\n"); +			return; +		} + +		ppde = (void *)adapter + f->ptr_offset; +		*ppde = de; +	}  } +  #else  static inline void mega_create_proc_entry(int index, struct proc_dir_entry *parent)  { diff --git a/drivers/scsi/megaraid.h b/drivers/scsi/megaraid.h index 4fb2adf6b80..4d0ce4e78df 100644 --- a/drivers/scsi/megaraid.h +++ b/drivers/scsi/megaraid.h @@ -987,24 +987,7 @@ static int mega_init_scb (adapter_t *);  static int mega_is_bios_enabled (adapter_t *);  #ifdef CONFIG_PROC_FS -static int mega_print_inquiry(char *, char *);  static void mega_create_proc_entry(int, struct proc_dir_entry *); -static int proc_read_config(char *, char **, off_t, int, int *, void *); -static int proc_read_stat(char *, char **, off_t, int, int *, void *); -static int proc_read_mbox(char *, char **, off_t, int, int *, void *); -static int proc_rebuild_rate(char *, char **, off_t, int, int *, void *); -static int proc_battery(char *, char **, off_t, int, int *, void *); -static int proc_pdrv_ch0(char *, char **, off_t, int, int *, void *); -static int proc_pdrv_ch1(char *, char **, off_t, int, int *, void *); -static int proc_pdrv_ch2(char *, char **, off_t, int, int *, void *); -static int proc_pdrv_ch3(char *, char **, off_t, int, int *, void *); -static int proc_pdrv(adapter_t *, char *, int); -static int proc_rdrv_10(char *, char **, off_t, int, int *, void *); -static int proc_rdrv_20(char *, char **, off_t, int, int *, void *); -static int proc_rdrv_30(char *, char **, off_t, int, int *, void *); -static int proc_rdrv_40(char *, char **, off_t, int, int *, void *); -static int proc_rdrv(adapter_t *, char *, int, int); -  static int mega_adapinq(adapter_t *, dma_addr_t);  static int mega_internal_dev_inquiry(adapter_t *, u8, u8, dma_addr_t);  #endif diff --git a/drivers/scsi/mpt2sas/mpt2sas_ctl.c b/drivers/scsi/mpt2sas/mpt2sas_ctl.c index 08685c4cf23..eec052c2670 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_ctl.c +++ b/drivers/scsi/mpt2sas/mpt2sas_ctl.c @@ -505,19 +505,6 @@ _ctl_fasync(int fd, struct file *filep, int mode)  }  /** - * _ctl_release - - * @inode - - * @filep - - * - * Called when application releases the fasyn callback handler. - */ -static int -_ctl_release(struct inode *inode, struct file *filep) -{ -	return fasync_helper(-1, filep, 0, &async_queue); -} - -/**   * _ctl_poll -   * @file -   * @wait - @@ -3027,7 +3014,6 @@ struct device_attribute *mpt2sas_dev_attrs[] = {  static const struct file_operations ctl_fops = {  	.owner = THIS_MODULE,  	.unlocked_ioctl = _ctl_ioctl, -	.release = _ctl_release,  	.poll = _ctl_poll,  	.fasync = _ctl_fasync,  #ifdef CONFIG_COMPAT diff --git a/drivers/scsi/mpt3sas/mpt3sas_ctl.c b/drivers/scsi/mpt3sas/mpt3sas_ctl.c index 054d5231c97..0b402b6f2d2 100644 --- a/drivers/scsi/mpt3sas/mpt3sas_ctl.c +++ b/drivers/scsi/mpt3sas/mpt3sas_ctl.c @@ -503,19 +503,6 @@ _ctl_fasync(int fd, struct file *filep, int mode)  }  /** - * _ctl_release - - * @inode - - * @filep - - * - * Called when application releases the fasyn callback handler. - */ -static int -_ctl_release(struct inode *inode, struct file *filep) -{ -	return fasync_helper(-1, filep, 0, &async_queue); -} - -/**   * _ctl_poll -   * @file -   * @wait - @@ -3233,7 +3220,6 @@ struct device_attribute *mpt3sas_dev_attrs[] = {  static const struct file_operations ctl_fops = {  	.owner = THIS_MODULE,  	.unlocked_ioctl = _ctl_ioctl, -	.release = _ctl_release,  	.poll = _ctl_poll,  	.fasync = _ctl_fasync,  #ifdef CONFIG_COMPAT diff --git a/drivers/scsi/mvme147.c b/drivers/scsi/mvme147.c index c29d0dbb966..e7f6661a886 100644 --- a/drivers/scsi/mvme147.c +++ b/drivers/scsi/mvme147.c @@ -76,7 +76,8 @@ int mvme147_detect(struct scsi_host_template *tpnt)  	called++;  	tpnt->proc_name = "MVME147"; -	tpnt->proc_info = &wd33c93_proc_info; +	tpnt->show_info = wd33c93_show_info, +	tpnt->write_info = wd33c93_write_info,  	instance = scsi_register(tpnt, sizeof(struct WD33C93_hostdata));  	if (!instance) diff --git a/drivers/scsi/nsp32.c b/drivers/scsi/nsp32.c index 1cc0c1c69c8..1e3879dcbdc 100644 --- a/drivers/scsi/nsp32.c +++ b/drivers/scsi/nsp32.c @@ -192,7 +192,7 @@ static int  __init init_nsp32  (void);  static void __exit exit_nsp32  (void);  /* struct struct scsi_host_template */ -static int         nsp32_proc_info   (struct Scsi_Host *, char *, char **, off_t, int, int); +static int         nsp32_show_info   (struct seq_file *, struct Scsi_Host *);  static int         nsp32_detect      (struct pci_dev *pdev);  static int         nsp32_queuecommand(struct Scsi_Host *, struct scsi_cmnd *); @@ -268,7 +268,7 @@ static void nsp32_dmessage(const char *, int, int,    char *, ...);  static struct scsi_host_template nsp32_template = {  	.proc_name			= "nsp32",  	.name				= "Workbit NinjaSCSI-32Bi/UDE", -	.proc_info			= nsp32_proc_info, +	.show_info			= nsp32_show_info,  	.info				= nsp32_info,  	.queuecommand			= nsp32_queuecommand,  	.can_queue			= 1, @@ -1442,19 +1442,10 @@ static irqreturn_t do_nsp32_isr(int irq, void *dev_id)  }  #undef SPRINTF -#define SPRINTF(args...) \ -	do { \ -		if(length > (pos - buffer)) { \ -			pos += snprintf(pos, length - (pos - buffer) + 1, ## args); \ -			nsp32_dbg(NSP32_DEBUG_PROC, "buffer=0x%p pos=0x%p length=%d %d\n", buffer, pos, length,  length - (pos - buffer));\ -		} \ -	} while(0) +#define SPRINTF(args...) seq_printf(m, ##args) -static int nsp32_proc_info(struct Scsi_Host *host, char *buffer, char **start, -			   off_t offset, int length, int inout) +static int nsp32_show_info(struct seq_file *m, struct Scsi_Host *host)  { -	char             *pos = buffer; -	int               thislength;  	unsigned long     flags;  	nsp32_hw_data    *data;  	int               hostno; @@ -1463,11 +1454,6 @@ static int nsp32_proc_info(struct Scsi_Host *host, char *buffer, char **start,  	int               id, speed;  	long              model; -	/* Write is not supported, just return. */ -	if (inout == TRUE) { -		return -EINVAL; -	} -  	hostno = host->host_no;  	data = (nsp32_hw_data *)host->hostdata;  	base = host->io_port; @@ -1527,20 +1513,7 @@ static int nsp32_proc_info(struct Scsi_Host *host, char *buffer, char **start,  		}  		SPRINTF("\n");  	} - - -	thislength = pos - (buffer + offset); - -	if(thislength < 0) { -		*start = NULL; -                return 0; -        } - - -	thislength = min(thislength, length); -	*start = buffer + offset; - -	return thislength; +	return 0;  }  #undef SPRINTF diff --git a/drivers/scsi/pas16.c b/drivers/scsi/pas16.c index 2f72c9807b1..62f1a603176 100644 --- a/drivers/scsi/pas16.c +++ b/drivers/scsi/pas16.c @@ -388,7 +388,8 @@ int __init pas16_detect(struct scsi_host_template * tpnt)      int  count;      tpnt->proc_name = "pas16"; -    tpnt->proc_info = &pas16_proc_info; +    tpnt->show_info = pas16_show_info; +    tpnt->write_info = pas16_write_info;      if (pas16_addr != 0) {  	overrides[0].io_port = pas16_addr; diff --git a/drivers/scsi/pas16.h b/drivers/scsi/pas16.h index a04281cace2..3721342835e 100644 --- a/drivers/scsi/pas16.h +++ b/drivers/scsi/pas16.h @@ -163,7 +163,8 @@ static int pas16_bus_reset(Scsi_Cmnd *);  #define NCR5380_queue_command pas16_queue_command  #define NCR5380_abort pas16_abort  #define NCR5380_bus_reset pas16_bus_reset -#define NCR5380_proc_info pas16_proc_info +#define NCR5380_show_info pas16_show_info +#define NCR5380_write_info pas16_write_info  /* 15 14 12 10 7 5 3      1101 0100 1010 1000 */ diff --git a/drivers/scsi/pcmcia/nsp_cs.c b/drivers/scsi/pcmcia/nsp_cs.c index b61a753eb89..987fbb1b244 100644 --- a/drivers/scsi/pcmcia/nsp_cs.c +++ b/drivers/scsi/pcmcia/nsp_cs.c @@ -76,7 +76,7 @@ MODULE_PARM_DESC(free_ports, "Release IO ports after configuration? (default: 0  static struct scsi_host_template nsp_driver_template = {  	.proc_name	         = "nsp_cs", -	.proc_info		 = nsp_proc_info, +	.show_info		 = nsp_show_info,  	.name			 = "WorkBit NinjaSCSI-3/32Bi(16bit)",  	.info			 = nsp_info,  	.queuecommand		 = nsp_queuecommand, @@ -1365,33 +1365,19 @@ static const char *nsp_info(struct Scsi_Host *shpnt)  }  #undef SPRINTF -#define SPRINTF(args...) \ -        do { \ -		if(length > (pos - buffer)) { \ -			pos += snprintf(pos, length - (pos - buffer) + 1, ## args); \ -			nsp_dbg(NSP_DEBUG_PROC, "buffer=0x%p pos=0x%p length=%d %d\n", buffer, pos, length,  length - (pos - buffer));\ -		} \ -	} while(0) +#define SPRINTF(args...) seq_printf(m, ##args) -static int nsp_proc_info(struct Scsi_Host *host, char *buffer, char **start, -			 off_t offset, int length, int inout) +static int nsp_show_info(struct seq_file *m, struct Scsi_Host *host)  {  	int id; -	char *pos = buffer; -	int thislength;  	int speed;  	unsigned long flags;  	nsp_hw_data *data;  	int hostno; -	if (inout) { -		return -EINVAL; -	} -  	hostno = host->host_no;  	data = (nsp_hw_data *)host->hostdata; -  	SPRINTF("NinjaSCSI status\n\n");  	SPRINTF("Driver version:        $Revision: 1.23 $\n");  	SPRINTF("SCSI host No.:         %d\n",          hostno); @@ -1458,19 +1444,7 @@ static int nsp_proc_info(struct Scsi_Host *host, char *buffer, char **start,  		}  		SPRINTF("\n");  	} - -	thislength = pos - (buffer + offset); - -	if(thislength < 0) { -		*start = NULL; -                return 0; -        } - - -	thislength = min(thislength, length); -	*start = buffer + offset; - -	return thislength; +	return 0;  }  #undef SPRINTF diff --git a/drivers/scsi/pcmcia/nsp_cs.h b/drivers/scsi/pcmcia/nsp_cs.h index 7fc9a9d0a44..afd64f0adc4 100644 --- a/drivers/scsi/pcmcia/nsp_cs.h +++ b/drivers/scsi/pcmcia/nsp_cs.h @@ -292,13 +292,8 @@ static int        nsp_cs_config (struct pcmcia_device *link);  /* Linux SCSI subsystem specific functions */  static struct Scsi_Host *nsp_detect     (struct scsi_host_template *sht);  static const  char      *nsp_info       (struct Scsi_Host *shpnt); -static        int        nsp_proc_info  ( -	                                 struct Scsi_Host *host, -					 char   *buffer, -					 char  **start, -					 off_t   offset, -					 int     length, -					 int     inout); +static        int        nsp_show_info  (struct seq_file *m, +	                                 struct Scsi_Host *host);  static int nsp_queuecommand(struct Scsi_Host *h, struct scsi_cmnd *SCpnt);  /* Error handler */ diff --git a/drivers/scsi/pmcraid.c b/drivers/scsi/pmcraid.c index b46f5e90683..8e1b7377506 100644 --- a/drivers/scsi/pmcraid.c +++ b/drivers/scsi/pmcraid.c @@ -3599,19 +3599,6 @@ static int pmcraid_chr_open(struct inode *inode, struct file *filep)  }  /** - * pmcraid_release - char node "release" entry point - */ -static int pmcraid_chr_release(struct inode *inode, struct file *filep) -{ -	struct pmcraid_instance *pinstance = filep->private_data; - -	filep->private_data = NULL; -	fasync_helper(-1, filep, 0, &pinstance->aen_queue); - -	return 0; -} - -/**   * pmcraid_fasync - Async notifier registration from applications   *   * This function adds the calling process to a driver global queue. When an @@ -4167,7 +4154,6 @@ static long pmcraid_chr_ioctl(  static const struct file_operations pmcraid_fops = {  	.owner = THIS_MODULE,  	.open = pmcraid_chr_open, -	.release = pmcraid_chr_release,  	.fasync = pmcraid_chr_fasync,  	.unlocked_ioctl = pmcraid_chr_ioctl,  #ifdef CONFIG_COMPAT diff --git a/drivers/scsi/ppa.c b/drivers/scsi/ppa.c index d164c963936..1db8b26063b 100644 --- a/drivers/scsi/ppa.c +++ b/drivers/scsi/ppa.c @@ -118,8 +118,9 @@ static inline void ppa_pb_release(ppa_struct *dev)   * Also gives a method to use a script to obtain optimum timings (TODO)   */ -static inline int ppa_proc_write(ppa_struct *dev, char *buffer, int length) +static inline int ppa_write_info(struct Scsi_Host *host, char *buffer, int length)  { +	ppa_struct *dev = ppa_dev(host);  	unsigned long x;  	if ((length > 5) && (strncmp(buffer, "mode=", 5) == 0)) { @@ -137,35 +138,17 @@ static inline int ppa_proc_write(ppa_struct *dev, char *buffer, int length)  	return -EINVAL;  } -static int ppa_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset, int length, int inout) +static int ppa_show_info(struct seq_file *m, struct Scsi_Host *host)  { -	int len = 0;  	ppa_struct *dev = ppa_dev(host); -	if (inout) -		return ppa_proc_write(dev, buffer, length); - -	len += sprintf(buffer + len, "Version : %s\n", PPA_VERSION); -	len += -	    sprintf(buffer + len, "Parport : %s\n", -		    dev->dev->port->name); -	len += -	    sprintf(buffer + len, "Mode    : %s\n", -		    PPA_MODE_STRING[dev->mode]); +	seq_printf(m, "Version : %s\n", PPA_VERSION); +	seq_printf(m, "Parport : %s\n", dev->dev->port->name); +	seq_printf(m, "Mode    : %s\n", PPA_MODE_STRING[dev->mode]);  #if PPA_DEBUG > 0 -	len += -	    sprintf(buffer + len, "recon_tmo : %lu\n", dev->recon_tmo); +	seq_printf(m, "recon_tmo : %lu\n", dev->recon_tmo);  #endif - -	/* Request for beyond end of buffer */ -	if (offset > length) -		return 0; - -	*start = buffer + offset; -	len -= offset; -	if (len > length) -		len = length; -	return len; +	return 0;  }  static int device_check(ppa_struct *dev); @@ -981,7 +964,8 @@ static int ppa_adjust_queue(struct scsi_device *device)  static struct scsi_host_template ppa_template = {  	.module			= THIS_MODULE,  	.proc_name		= "ppa", -	.proc_info		= ppa_proc_info, +	.show_info		= ppa_show_info, +	.write_info		= ppa_write_info,  	.name			= "Iomega VPI0 (ppa) interface",  	.queuecommand		= ppa_queuecommand,  	.eh_abort_handler	= ppa_abort, diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 2c6dd3dfe0f..ccb5e6404d0 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c @@ -5351,7 +5351,7 @@ static struct pci_driver qla2xxx_pci_driver = {  	.err_handler	= &qla2xxx_err_handler,  }; -static struct file_operations apidev_fops = { +static const struct file_operations apidev_fops = {  	.owner = THIS_MODULE,  	.llseek = noop_llseek,  }; diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c index 5cda11c07c6..5add6f4e792 100644 --- a/drivers/scsi/scsi_debug.c +++ b/drivers/scsi/scsi_debug.c @@ -2823,31 +2823,27 @@ static const char * scsi_debug_info(struct Scsi_Host * shp)  /* scsi_debug_proc_info   * Used if the driver currently has no own support for /proc/scsi   */ -static int scsi_debug_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset, -				int length, int inout) +static int scsi_debug_write_info(struct Scsi_Host *host, char *buffer, int length)  { -	int len, pos, begin; -	int orig_length; +	char arr[16]; +	int opts; +	int minLen = length > 15 ? 15 : length; -	orig_length = length; - -	if (inout == 1) { -		char arr[16]; -		int minLen = length > 15 ? 15 : length; +	if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO)) +		return -EACCES; +	memcpy(arr, buffer, minLen); +	arr[minLen] = '\0'; +	if (1 != sscanf(arr, "%d", &opts)) +		return -EINVAL; +	scsi_debug_opts = opts; +	if (scsi_debug_every_nth != 0) +		scsi_debug_cmnd_count = 0; +	return length; +} -		if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO)) -			return -EACCES; -		memcpy(arr, buffer, minLen); -		arr[minLen] = '\0'; -		if (1 != sscanf(arr, "%d", &pos)) -			return -EINVAL; -		scsi_debug_opts = pos; -		if (scsi_debug_every_nth != 0) -                        scsi_debug_cmnd_count = 0; -		return length; -	} -	begin = 0; -	pos = len = sprintf(buffer, "scsi_debug adapter driver, version " +static int scsi_debug_show_info(struct seq_file *m, struct Scsi_Host *host) +{ +	seq_printf(m, "scsi_debug adapter driver, version "  	    "%s [%s]\n"  	    "num_tgts=%d, shared (ram) size=%d MB, opts=0x%x, "  	    "every_nth=%d(curr:%d)\n" @@ -2862,15 +2858,7 @@ static int scsi_debug_proc_info(struct Scsi_Host *host, char *buffer, char **sta  	    scsi_debug_sector_size, sdebug_cylinders_per, sdebug_heads,  	    sdebug_sectors_per, num_aborts, num_dev_resets, num_bus_resets,  	    num_host_resets, dix_reads, dix_writes, dif_errors); -	if (pos < offset) { -		len = 0; -		begin = pos; -	} -	*start = buffer + (offset - begin);	/* Start of wanted data */ -	len -= (offset - begin); -	if (len > length) -		len = length; -	return len; +	return 0;  }  static ssize_t sdebug_delay_show(struct device_driver * ddp, char * buf) @@ -3957,7 +3945,8 @@ write:  static DEF_SCSI_QCMD(scsi_debug_queuecommand)  static struct scsi_host_template sdebug_driver_template = { -	.proc_info =		scsi_debug_proc_info, +	.show_info =		scsi_debug_show_info, +	.write_info =		scsi_debug_write_info,  	.proc_name =		sdebug_proc_name,  	.name =			"SCSI DEBUG",  	.info =			scsi_debug_info, diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 765398c063c..c31187d7934 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -71,9 +71,14 @@ struct kmem_cache *scsi_sdb_cache;  #ifdef CONFIG_ACPI  #include <acpi/acpi_bus.h> +static bool acpi_scsi_bus_match(struct device *dev) +{ +	return dev->bus == &scsi_bus_type; +} +  int scsi_register_acpi_bus_type(struct acpi_bus_type *bus)  { -        bus->bus = &scsi_bus_type; +        bus->match = acpi_scsi_bus_match;          return register_acpi_bus_type(bus);  }  EXPORT_SYMBOL_GPL(scsi_register_acpi_bus_type); diff --git a/drivers/scsi/scsi_proc.c b/drivers/scsi/scsi_proc.c index ad747dc337d..db66357211e 100644 --- a/drivers/scsi/scsi_proc.c +++ b/drivers/scsi/scsi_proc.c @@ -45,58 +45,50 @@ static struct proc_dir_entry *proc_scsi;  /* Protect sht->present and sht->proc_dir */  static DEFINE_MUTEX(global_host_template_mutex); -/** - * proc_scsi_read - handle read from /proc by calling host's proc_info() command - * @buffer: passed to proc_info - * @start: passed to proc_info - * @offset: passed to proc_info - * @length: passed to proc_info - * @eof: returns whether length read was less than requested - * @data: pointer to a &struct Scsi_Host - */ - -static int proc_scsi_read(char *buffer, char **start, off_t offset, -			  int length, int *eof, void *data) -{ -	struct Scsi_Host *shost = data; -	int n; - -	n = shost->hostt->proc_info(shost, buffer, start, offset, length, 0); -	*eof = (n < length); - -	return n; -} - -/** - * proc_scsi_write_proc - Handle write to /proc by calling host's proc_info() - * @file: not used - * @buf: source of data to write. - * @count: number of bytes (at most PROC_BLOCK_SIZE) to write. - * @data: pointer to &struct Scsi_Host - */ -static int proc_scsi_write_proc(struct file *file, const char __user *buf, -                           unsigned long count, void *data) +static ssize_t proc_scsi_host_write(struct file *file, const char __user *buf, +                           size_t count, loff_t *ppos)  { -	struct Scsi_Host *shost = data; +	struct Scsi_Host *shost = PDE_DATA(file_inode(file));  	ssize_t ret = -ENOMEM;  	char *page; -	char *start;  	if (count > PROC_BLOCK_SIZE)  		return -EOVERFLOW; +	if (!shost->hostt->write_info) +		return -EINVAL; +  	page = (char *)__get_free_page(GFP_KERNEL);  	if (page) {  		ret = -EFAULT;  		if (copy_from_user(page, buf, count))  			goto out; -		ret = shost->hostt->proc_info(shost, page, &start, 0, count, 1); +		ret = shost->hostt->write_info(shost, page, count);  	}  out:  	free_page((unsigned long)page);  	return ret;  } +static int proc_scsi_show(struct seq_file *m, void *v) +{ +	struct Scsi_Host *shost = m->private; +	return shost->hostt->show_info(m, shost); +} + +static int proc_scsi_host_open(struct inode *inode, struct file *file) +{ +	return single_open_size(file, proc_scsi_show, PDE_DATA(inode), +				4 * PAGE_SIZE); +} + +static const struct file_operations proc_scsi_fops = { +	.open = proc_scsi_host_open, +	.read = seq_read, +	.llseek = seq_lseek, +	.write = proc_scsi_host_write +}; +  /**   * scsi_proc_hostdir_add - Create directory in /proc for a scsi host   * @sht: owner of this directory @@ -106,7 +98,7 @@ out:  void scsi_proc_hostdir_add(struct scsi_host_template *sht)  { -	if (!sht->proc_info) +	if (!sht->show_info)  		return;  	mutex_lock(&global_host_template_mutex); @@ -125,7 +117,7 @@ void scsi_proc_hostdir_add(struct scsi_host_template *sht)   */  void scsi_proc_hostdir_rm(struct scsi_host_template *sht)  { -	if (!sht->proc_info) +	if (!sht->show_info)  		return;  	mutex_lock(&global_host_template_mutex); @@ -151,16 +143,12 @@ void scsi_proc_host_add(struct Scsi_Host *shost)  		return;  	sprintf(name,"%d", shost->host_no); -	p = create_proc_read_entry(name, S_IFREG | S_IRUGO | S_IWUSR, -			sht->proc_dir, proc_scsi_read, shost); -	if (!p) { +	p = proc_create_data(name, S_IRUGO | S_IWUSR, +		sht->proc_dir, &proc_scsi_fops, shost); +	if (!p)  		printk(KERN_ERR "%s: Failed to register host %d in"  		       "%s\n", __func__, shost->host_no,  		       sht->proc_name); -		return; -	}  - -	p->write_proc = proc_scsi_write_proc;  }  /** diff --git a/drivers/scsi/sym53c8xx_2/sym_glue.c b/drivers/scsi/sym53c8xx_2/sym_glue.c index 599568299fb..bac55f7f69f 100644 --- a/drivers/scsi/sym53c8xx_2/sym_glue.c +++ b/drivers/scsi/sym53c8xx_2/sym_glue.c @@ -1171,112 +1171,36 @@ printk("sym_user_command: data=%ld\n", uc->data);  #endif	/* SYM_LINUX_USER_COMMAND_SUPPORT */ -#ifdef SYM_LINUX_USER_INFO_SUPPORT -/* - *  Informations through the proc file system. - */ -struct info_str { -	char *buffer; -	int length; -	int offset; -	int pos; -}; - -static void copy_mem_info(struct info_str *info, char *data, int len) -{ -	if (info->pos + len > info->length) -		len = info->length - info->pos; - -	if (info->pos + len < info->offset) { -		info->pos += len; -		return; -	} -	if (info->pos < info->offset) { -		data += (info->offset - info->pos); -		len  -= (info->offset - info->pos); -	} - -	if (len > 0) { -		memcpy(info->buffer + info->pos, data, len); -		info->pos += len; -	} -} - -static int copy_info(struct info_str *info, char *fmt, ...) -{ -	va_list args; -	char buf[81]; -	int len; - -	va_start(args, fmt); -	len = vsprintf(buf, fmt, args); -	va_end(args); - -	copy_mem_info(info, buf, len); -	return len; -} -  /*   *  Copy formatted information into the input buffer.   */ -static int sym_host_info(struct Scsi_Host *shost, char *ptr, off_t offset, int len) +static int sym_show_info(struct seq_file *m, struct Scsi_Host *shost)  { +#ifdef SYM_LINUX_USER_INFO_SUPPORT  	struct sym_data *sym_data = shost_priv(shost);  	struct pci_dev *pdev = sym_data->pdev;  	struct sym_hcb *np = sym_data->ncb; -	struct info_str info; - -	info.buffer	= ptr; -	info.length	= len; -	info.offset	= offset; -	info.pos	= 0; -	copy_info(&info, "Chip " NAME53C "%s, device id 0x%x, " -			 "revision id 0x%x\n", np->s.chip_name, -			 pdev->device, pdev->revision); -	copy_info(&info, "At PCI address %s, IRQ %u\n", +	seq_printf(m, "Chip " NAME53C "%s, device id 0x%x, " +		 "revision id 0x%x\n", np->s.chip_name, +		 pdev->device, pdev->revision); +	seq_printf(m, "At PCI address %s, IRQ %u\n",  			 pci_name(pdev), pdev->irq); -	copy_info(&info, "Min. period factor %d, %s SCSI BUS%s\n", -			 (int) (np->minsync_dt ? np->minsync_dt : np->minsync), -			 np->maxwide ? "Wide" : "Narrow", -			 np->minsync_dt ? ", DT capable" : ""); +	seq_printf(m, "Min. period factor %d, %s SCSI BUS%s\n", +		 (int) (np->minsync_dt ? np->minsync_dt : np->minsync), +		 np->maxwide ? "Wide" : "Narrow", +		 np->minsync_dt ? ", DT capable" : ""); -	copy_info(&info, "Max. started commands %d, " -			 "max. commands per LUN %d\n", -			 SYM_CONF_MAX_START, SYM_CONF_MAX_TAG); +	seq_printf(m, "Max. started commands %d, " +		 "max. commands per LUN %d\n", +		 SYM_CONF_MAX_START, SYM_CONF_MAX_TAG); -	return info.pos > info.offset? info.pos - info.offset : 0; -} -#endif /* SYM_LINUX_USER_INFO_SUPPORT */ - -/* - *  Entry point of the scsi proc fs of the driver. - *  - func = 0 means read  (returns adapter infos) - *  - func = 1 means write (not yet merget from sym53c8xx) - */ -static int sym53c8xx_proc_info(struct Scsi_Host *shost, char *buffer, -			char **start, off_t offset, int length, int func) -{ -	int retv; - -	if (func) { -#ifdef	SYM_LINUX_USER_COMMAND_SUPPORT -		retv = sym_user_command(shost, buffer, length); -#else -		retv = -EINVAL; -#endif -	} else { -		if (start) -			*start = buffer; -#ifdef SYM_LINUX_USER_INFO_SUPPORT -		retv = sym_host_info(shost, buffer, offset, length); +	return 0;  #else -		retv = -EINVAL; -#endif -	} - -	return retv; +	return -EINVAL; +#endif /* SYM_LINUX_USER_INFO_SUPPORT */  } +  #endif /* SYM_LINUX_PROC_INFO_SUPPORT */  /* @@ -1742,7 +1666,10 @@ static struct scsi_host_template sym2_template = {  	.use_clustering		= ENABLE_CLUSTERING,  	.max_sectors		= 0xFFFF,  #ifdef SYM_LINUX_PROC_INFO_SUPPORT -	.proc_info		= sym53c8xx_proc_info, +	.show_info		= sym_show_info, +#ifdef	SYM_LINUX_USER_COMMAND_SUPPORT +	.write_info		= sym_user_command, +#endif  	.proc_name		= NAME53C8XX,  #endif  }; diff --git a/drivers/scsi/t128.c b/drivers/scsi/t128.c index d672d97fb84..f1e4b4148c7 100644 --- a/drivers/scsi/t128.c +++ b/drivers/scsi/t128.c @@ -201,7 +201,8 @@ int __init t128_detect(struct scsi_host_template * tpnt){      int sig, count;      tpnt->proc_name = "t128"; -    tpnt->proc_info = &t128_proc_info; +    tpnt->show_info = t128_show_info; +    tpnt->write_info = t128_write_info;      for (count = 0; current_override < NO_OVERRIDES; ++current_override) {  	base = 0; diff --git a/drivers/scsi/t128.h b/drivers/scsi/t128.h index ada1115079c..1df82c28e56 100644 --- a/drivers/scsi/t128.h +++ b/drivers/scsi/t128.h @@ -140,7 +140,8 @@ static int t128_bus_reset(struct scsi_cmnd *);  #define NCR5380_queue_command t128_queue_command  #define NCR5380_abort t128_abort  #define NCR5380_bus_reset t128_bus_reset -#define NCR5380_proc_info t128_proc_info +#define NCR5380_show_info t128_show_info +#define NCR5380_write_info t128_write_info  /* 15 14 12 10 7 5 3     1101 0100 1010 1000 */ diff --git a/drivers/scsi/wd33c93.c b/drivers/scsi/wd33c93.c index c0ee4ea28a1..41883a87931 100644 --- a/drivers/scsi/wd33c93.c +++ b/drivers/scsi/wd33c93.c @@ -2054,22 +2054,16 @@ wd33c93_init(struct Scsi_Host *instance, const wd33c93_regs regs,  	printk("           Version %s - %s\n", WD33C93_VERSION, WD33C93_DATE);  } -int -wd33c93_proc_info(struct Scsi_Host *instance, char *buf, char **start, off_t off, int len, int in) +int wd33c93_write_info(struct Scsi_Host *instance, char *buf, int len)  { -  #ifdef PROC_INTERFACE -  	char *bp; -	char tbuf[128];  	struct WD33C93_hostdata *hd; -	struct scsi_cmnd *cmd;  	int x; -	static int stop = 0;  	hd = (struct WD33C93_hostdata *) instance->hostdata; -/* If 'in' is TRUE we need to _read_ the proc file. We accept the following +/* We accept the following   * keywords (same format as command-line, but arguments are not optional):   *    debug   *    disconnect @@ -2083,145 +2077,124 @@ wd33c93_proc_info(struct Scsi_Host *instance, char *buf, char **start, off_t off   *    nosync   */ -	if (in) { -		buf[len] = '\0'; -		for (bp = buf; *bp; ) { -			while (',' == *bp || ' ' == *bp) -				++bp; -		if (!strncmp(bp, "debug:", 6)) { -				hd->args = simple_strtoul(bp+6, &bp, 0) & DB_MASK; -		} else if (!strncmp(bp, "disconnect:", 11)) { -				x = simple_strtoul(bp+11, &bp, 0); -			if (x < DIS_NEVER || x > DIS_ALWAYS) -				x = DIS_ADAPTIVE; -			hd->disconnect = x; -		} else if (!strncmp(bp, "period:", 7)) { +	buf[len] = '\0'; +	for (bp = buf; *bp; ) { +		while (',' == *bp || ' ' == *bp) +			++bp; +	if (!strncmp(bp, "debug:", 6)) { +			hd->args = simple_strtoul(bp+6, &bp, 0) & DB_MASK; +	} else if (!strncmp(bp, "disconnect:", 11)) { +			x = simple_strtoul(bp+11, &bp, 0); +		if (x < DIS_NEVER || x > DIS_ALWAYS) +			x = DIS_ADAPTIVE; +		hd->disconnect = x; +	} else if (!strncmp(bp, "period:", 7)) { +		x = simple_strtoul(bp+7, &bp, 0); +		hd->default_sx_per = +			hd->sx_table[round_period((unsigned int) x, +						  hd->sx_table)].period_ns; +	} else if (!strncmp(bp, "resync:", 7)) { +			set_resync(hd, (int)simple_strtoul(bp+7, &bp, 0)); +	} else if (!strncmp(bp, "proc:", 5)) { +			hd->proc = simple_strtoul(bp+5, &bp, 0); +	} else if (!strncmp(bp, "nodma:", 6)) { +			hd->no_dma = simple_strtoul(bp+6, &bp, 0); +	} else if (!strncmp(bp, "level2:", 7)) { +			hd->level2 = simple_strtoul(bp+7, &bp, 0); +		} else if (!strncmp(bp, "burst:", 6)) { +			hd->dma_mode = +				simple_strtol(bp+6, &bp, 0) ? CTRL_BURST:CTRL_DMA; +		} else if (!strncmp(bp, "fast:", 5)) { +			x = !!simple_strtol(bp+5, &bp, 0); +			if (x != hd->fast) +				set_resync(hd, 0xff); +			hd->fast = x; +		} else if (!strncmp(bp, "nosync:", 7)) {  			x = simple_strtoul(bp+7, &bp, 0); -			hd->default_sx_per = -				hd->sx_table[round_period((unsigned int) x, -							  hd->sx_table)].period_ns; -		} else if (!strncmp(bp, "resync:", 7)) { -				set_resync(hd, (int)simple_strtoul(bp+7, &bp, 0)); -		} else if (!strncmp(bp, "proc:", 5)) { -				hd->proc = simple_strtoul(bp+5, &bp, 0); -		} else if (!strncmp(bp, "nodma:", 6)) { -				hd->no_dma = simple_strtoul(bp+6, &bp, 0); -		} else if (!strncmp(bp, "level2:", 7)) { -				hd->level2 = simple_strtoul(bp+7, &bp, 0); -			} else if (!strncmp(bp, "burst:", 6)) { -				hd->dma_mode = -					simple_strtol(bp+6, &bp, 0) ? CTRL_BURST:CTRL_DMA; -			} else if (!strncmp(bp, "fast:", 5)) { -				x = !!simple_strtol(bp+5, &bp, 0); -				if (x != hd->fast) -					set_resync(hd, 0xff); -				hd->fast = x; -			} else if (!strncmp(bp, "nosync:", 7)) { -				x = simple_strtoul(bp+7, &bp, 0); -				set_resync(hd, x ^ hd->no_sync); -				hd->no_sync = x; -			} else { -				break; /* unknown keyword,syntax-error,... */ -			} +			set_resync(hd, x ^ hd->no_sync); +			hd->no_sync = x; +		} else { +			break; /* unknown keyword,syntax-error,... */  		} -		return len;  	} +	return len; +#else +	return 0; +#endif +} + +int +wd33c93_show_info(struct seq_file *m, struct Scsi_Host *instance) +{ +#ifdef PROC_INTERFACE +	struct WD33C93_hostdata *hd; +	struct scsi_cmnd *cmd; +	int x; + +	hd = (struct WD33C93_hostdata *) instance->hostdata;  	spin_lock_irq(&hd->lock); -	bp = buf; -	*bp = '\0'; -	if (hd->proc & PR_VERSION) { -		sprintf(tbuf, "\nVersion %s - %s.", +	if (hd->proc & PR_VERSION) +		seq_printf(m, "\nVersion %s - %s.",  			WD33C93_VERSION, WD33C93_DATE); -		strcat(bp, tbuf); -	} +  	if (hd->proc & PR_INFO) { -		sprintf(tbuf, "\nclock_freq=%02x no_sync=%02x no_dma=%d" +		seq_printf(m, "\nclock_freq=%02x no_sync=%02x no_dma=%d"  			" dma_mode=%02x fast=%d",  			hd->clock_freq, hd->no_sync, hd->no_dma, hd->dma_mode, hd->fast); -		strcat(bp, tbuf); -		strcat(bp, "\nsync_xfer[] =       "); -		for (x = 0; x < 7; x++) { -			sprintf(tbuf, "\t%02x", hd->sync_xfer[x]); -			strcat(bp, tbuf); -		} -		strcat(bp, "\nsync_stat[] =       "); -		for (x = 0; x < 7; x++) { -			sprintf(tbuf, "\t%02x", hd->sync_stat[x]); -			strcat(bp, tbuf); -		} +		seq_printf(m, "\nsync_xfer[] =       "); +		for (x = 0; x < 7; x++) +			seq_printf(m, "\t%02x", hd->sync_xfer[x]); +		seq_printf(m, "\nsync_stat[] =       "); +		for (x = 0; x < 7; x++) +			seq_printf(m, "\t%02x", hd->sync_stat[x]);  	}  #ifdef PROC_STATISTICS  	if (hd->proc & PR_STATISTICS) { -		strcat(bp, "\ncommands issued:    "); -		for (x = 0; x < 7; x++) { -			sprintf(tbuf, "\t%ld", hd->cmd_cnt[x]); -			strcat(bp, tbuf); -		} -		strcat(bp, "\ndisconnects allowed:"); -		for (x = 0; x < 7; x++) { -			sprintf(tbuf, "\t%ld", hd->disc_allowed_cnt[x]); -			strcat(bp, tbuf); -		} -		strcat(bp, "\ndisconnects done:   "); -		for (x = 0; x < 7; x++) { -			sprintf(tbuf, "\t%ld", hd->disc_done_cnt[x]); -			strcat(bp, tbuf); -		} -		sprintf(tbuf, +		seq_printf(m, "\ncommands issued:    "); +		for (x = 0; x < 7; x++) +			seq_printf(m, "\t%ld", hd->cmd_cnt[x]); +		seq_printf(m, "\ndisconnects allowed:"); +		for (x = 0; x < 7; x++) +			seq_printf(m, "\t%ld", hd->disc_allowed_cnt[x]); +		seq_printf(m, "\ndisconnects done:   "); +		for (x = 0; x < 7; x++) +			seq_printf(m, "\t%ld", hd->disc_done_cnt[x]); +		seq_printf(m,  			"\ninterrupts: %ld, DATA_PHASE ints: %ld DMA, %ld PIO",  			hd->int_cnt, hd->dma_cnt, hd->pio_cnt); -		strcat(bp, tbuf);  	}  #endif  	if (hd->proc & PR_CONNECTED) { -		strcat(bp, "\nconnected:     "); +		seq_printf(m, "\nconnected:     ");  		if (hd->connected) {  			cmd = (struct scsi_cmnd *) hd->connected; -			sprintf(tbuf, " %d:%d(%02x)", +			seq_printf(m, " %d:%d(%02x)",  				cmd->device->id, cmd->device->lun, cmd->cmnd[0]); -			strcat(bp, tbuf);  		}  	}  	if (hd->proc & PR_INPUTQ) { -		strcat(bp, "\ninput_Q:       "); +		seq_printf(m, "\ninput_Q:       ");  		cmd = (struct scsi_cmnd *) hd->input_Q;  		while (cmd) { -			sprintf(tbuf, " %d:%d(%02x)", +			seq_printf(m, " %d:%d(%02x)",  				cmd->device->id, cmd->device->lun, cmd->cmnd[0]); -			strcat(bp, tbuf);  			cmd = (struct scsi_cmnd *) cmd->host_scribble;  		}  	}  	if (hd->proc & PR_DISCQ) { -		strcat(bp, "\ndisconnected_Q:"); +		seq_printf(m, "\ndisconnected_Q:");  		cmd = (struct scsi_cmnd *) hd->disconnected_Q;  		while (cmd) { -			sprintf(tbuf, " %d:%d(%02x)", +			seq_printf(m, " %d:%d(%02x)",  				cmd->device->id, cmd->device->lun, cmd->cmnd[0]); -			strcat(bp, tbuf);  			cmd = (struct scsi_cmnd *) cmd->host_scribble;  		}  	} -	strcat(bp, "\n"); +	seq_printf(m, "\n");  	spin_unlock_irq(&hd->lock); -	*start = buf; -	if (stop) { -		stop = 0; -		return 0; -	} -	if (off > 0x40000)	/* ALWAYS stop after 256k bytes have been read */ -		stop = 1; -	if (hd->proc & PR_STOP)	/* stop every other time */ -		stop = 1; -	return strlen(bp); - -#else				/* PROC_INTERFACE */ - -	return 0; -  #endif				/* PROC_INTERFACE */ - +	return 0;  }  EXPORT_SYMBOL(wd33c93_host_reset); @@ -2229,4 +2202,5 @@ EXPORT_SYMBOL(wd33c93_init);  EXPORT_SYMBOL(wd33c93_abort);  EXPORT_SYMBOL(wd33c93_queuecommand);  EXPORT_SYMBOL(wd33c93_intr); -EXPORT_SYMBOL(wd33c93_proc_info); +EXPORT_SYMBOL(wd33c93_show_info); +EXPORT_SYMBOL(wd33c93_write_info); diff --git a/drivers/scsi/wd33c93.h b/drivers/scsi/wd33c93.h index 3b463d7304d..08abe508e9a 100644 --- a/drivers/scsi/wd33c93.h +++ b/drivers/scsi/wd33c93.h @@ -345,7 +345,8 @@ void wd33c93_init (struct Scsi_Host *instance, const wd33c93_regs regs,  int wd33c93_abort (struct scsi_cmnd *cmd);  int wd33c93_queuecommand (struct Scsi_Host *h, struct scsi_cmnd *cmd);  void wd33c93_intr (struct Scsi_Host *instance); -int wd33c93_proc_info(struct Scsi_Host *, char *, char **, off_t, int, int); +int wd33c93_show_info(struct seq_file *, struct Scsi_Host *); +int wd33c93_write_info(struct Scsi_Host *, char *, int);  int wd33c93_host_reset (struct scsi_cmnd *);  #endif /* WD33C93_H */ diff --git a/drivers/scsi/wd7000.c b/drivers/scsi/wd7000.c index d89a5dfd3ad..f9a6e4b0aff 100644 --- a/drivers/scsi/wd7000.c +++ b/drivers/scsi/wd7000.c @@ -1296,9 +1296,9 @@ static void wd7000_revision(Adapter * host)  #undef SPRINTF -#define SPRINTF(args...) { if (pos < (buffer + length)) pos += sprintf (pos, ## args); } +#define SPRINTF(args...) { seq_printf(m, ## args); } -static int wd7000_set_info(char *buffer, int length, struct Scsi_Host *host) +static int wd7000_set_info(struct Scsi_Host *host, char *buffer, int length)  {  	dprintk("Buffer = <%.*s>, length = %d\n", length, buffer, length); @@ -1310,22 +1310,15 @@ static int wd7000_set_info(char *buffer, int length, struct Scsi_Host *host)  } -static int wd7000_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset, int length,  int inout) +static int wd7000_show_info(struct seq_file *m, struct Scsi_Host *host)  {  	Adapter *adapter = (Adapter *)host->hostdata;  	unsigned long flags; -	char *pos = buffer;  #ifdef WD7000_DEBUG  	Mailbox *ogmbs, *icmbs;  	short count;  #endif -	/* -	 * Has data been written to the file ? -	 */ -	if (inout) -		return (wd7000_set_info(buffer, length, host)); -  	spin_lock_irqsave(host->host_lock, flags);  	SPRINTF("Host scsi%d: Western Digital WD-7000 (rev %d.%d)\n", host->host_no, adapter->rev1, adapter->rev2);  	SPRINTF("  IO base:      0x%x\n", adapter->iobase); @@ -1368,17 +1361,7 @@ static int wd7000_proc_info(struct Scsi_Host *host, char *buffer, char **start,  	spin_unlock_irqrestore(host->host_lock, flags); -	/* -	 * Calculate start of next buffer, and return value. -	 */ -	*start = buffer + offset; - -	if ((pos - buffer) < offset) -		return (0); -	else if ((pos - buffer - offset) < length) -		return (pos - buffer - offset); -	else -		return (length); +	return 0;  } @@ -1413,7 +1396,8 @@ static __init int wd7000_detect(struct scsi_host_template *tpnt)  	for (i = 0; i < NUM_CONFIGS; biosptr[i++] = -1);  	tpnt->proc_name = "wd7000"; -	tpnt->proc_info = &wd7000_proc_info; +	tpnt->show_info = &wd7000_show_info; +	tpnt->write_info = wd7000_set_info;  	/*  	 * Set up SCB free list, which is shared by all adapters @@ -1658,7 +1642,8 @@ MODULE_LICENSE("GPL");  static struct scsi_host_template driver_template = {  	.proc_name		= "wd7000", -	.proc_info		= wd7000_proc_info, +	.show_info		= wd7000_show_info, +	.write_info		= wd7000_set_info,  	.name			= "Western Digital WD-7000",  	.detect			= wd7000_detect,  	.release		= wd7000_release,  |