Replace proc_read with seq_file interface which is much cleaner.
Also, instead of searching the list of devices looking for the
name which is slow and would break if interface name changes;
store a pointer to device in the proc entry, and retrieve
it from the information saved by single_open.
Formatting and other behaviours are retained.
diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c
--- a/drivers/net/sk98lin/skge.c Fri Sep 26 11:10:48 2003
+++ b/drivers/net/sk98lin/skge.c Fri Sep 26 11:10:48 2003
@@ -577,13 +577,7 @@
#ifdef CONFIG_PROC_FS
static const char SK_Root_Dir_entry[] = "sk98lin";
static struct proc_dir_entry *pSkRootDir;
-
-extern int sk_proc_read( char *buffer,
- char **buffer_location,
- off_t offset,
- int buffer_length,
- int *eof,
- void *data);
+extern struct file_operations sk_proc_fops;
#endif
extern void SkDimEnableModerationIfNeeded(SK_AC *pAC);
@@ -762,16 +756,11 @@
}
/* Create proc file */
- if (pSkRootDir &&
- (pProcFile = create_proc_entry(dev->name,
- S_IFREG | S_IXUSR | S_IWGRP |
S_IROTH,
- pSkRootDir))) {
- pProcFile->read_proc = sk_proc_read;
- pProcFile->write_proc = NULL;
- pProcFile->nlink = 1;
- pProcFile->size = sizeof(dev->name + 1);
- pProcFile->data = (void *)pProcFile;
- pProcFile->owner = THIS_MODULE;
+ if (pSkRootDir
+ && (pProcFile = create_proc_entry(dev->name, S_IRUGO,
+ pSkRootDir))) {
+ pProcFile->proc_fops = &sk_proc_fops;
+ pProcFile->data = dev;
}
#endif
@@ -827,16 +816,11 @@
#ifdef CONFIG_PROC_FS
if (pSkRootDir
- && (pProcFile = create_proc_entry(dev->name,
- S_IFREG | S_IXUSR
| S_IWGRP | S_IROTH,
+ && (pProcFile = create_proc_entry(dev->name,
+ S_IRUGO,
pSkRootDir))) {
-
- pProcFile->read_proc = sk_proc_read;
- pProcFile->write_proc = NULL;
- pProcFile->nlink = 1;
- pProcFile->size = sizeof(dev->name + 1);
- pProcFile->data = (void *)pProcFile;
- pProcFile->owner = THIS_MODULE;
+ pProcFile->proc_fops = &sk_proc_fops;
+ pProcFile->data = dev;
}
#endif
diff -Nru a/drivers/net/sk98lin/skproc.c b/drivers/net/sk98lin/skproc.c
--- a/drivers/net/sk98lin/skproc.c Fri Sep 26 11:10:48 2003
+++ b/drivers/net/sk98lin/skproc.c Fri Sep 26 11:10:48 2003
@@ -90,276 +90,227 @@
******************************************************************************/
#include <linux/proc_fs.h>
+#include <linux/seq_file.h>
#include "h/skdrv1st.h"
#include "h/skdrv2nd.h"
- extern struct net_device *SkGeRootDev;
+#ifdef CONFIG_PROC_FS
+extern struct net_device *SkGeRootDev;
-int sk_proc_read(char *buffer,
- char **buffer_location,
- off_t offset,
- int buffer_length,
- int *eof,
- void *data);
-
-
-
-/*****************************************************************************
- *
- * sk_proc_read - print "summaries" entry
- *
- * Description:
- * This function fills the proc entry with statistic data about
- * the ethernet device.
- *
- *
- * Returns: buffer with statistic data
- *
- */
-int sk_proc_read(char *buffer,
-char **buffer_location,
-off_t offset,
-int buffer_length,
-int *eof,
-void *data)
+static int sk_seq_show(struct seq_file *seq, void *v)
{
- int len = 0;
- int t;
+ struct net_device *dev = seq->private;
+ DEV_NET *pNet = dev->priv;
+ SK_AC *pAC = pNet->pAC;
+ SK_PNMI_STRUCT_DATA *pPnmiStruct = &pAC->PnmiStruct;
+ SK_PNMI_STAT *pPnmiStat = &pPnmiStruct->Stat[0];
+ int unit = !(pAC->dev[0] == dev);
int i;
- DEV_NET *pNet;
- SK_AC *pAC;
- char sens_msg[50];
- unsigned long Flags;
- unsigned int Size;
- struct SK_NET_DEVICE *next;
- struct SK_NET_DEVICE *SkgeProcDev = SkGeRootDev;
-
- SK_PNMI_STRUCT_DATA *pPnmiStruct;
- SK_PNMI_STAT *pPnmiStat;
- struct proc_dir_entry *file = (struct proc_dir_entry*) data;
-
- while (SkgeProcDev) {
- pNet = (DEV_NET*) SkgeProcDev->priv;
- pAC = pNet->pAC;
- next = pAC->Next;
- pPnmiStruct = &pAC->PnmiStruct;
- /* NetIndex in GetStruct is now required, zero is only dummy */
-
- for (t=pAC->GIni.GIMacsFound; t > 0; t--) {
- if ((pAC->GIni.GIMacsFound == 2) && pAC->RlmtNets == 1)
- t--;
-
- spin_lock_irqsave(&pAC->SlowPathLock, Flags);
- Size = SK_PNMI_STRUCT_SIZE;
- SkPnmiGetStruct(pAC, pAC->IoBase,
- pPnmiStruct, &Size, t-1);
- spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
-
- if (strcmp(pAC->dev[t-1]->name, file->name) == 0) {
- pPnmiStat = &pPnmiStruct->Stat[0];
- len = sprintf(buffer,
- "\nDetailed statistic for device %s\n",
- pAC->dev[t-1]->name);
- len += sprintf(buffer + len,
-
"=======================================\n");
+ char sens_msg[50];
+
+ seq_printf(seq,
+ "\nDetailed statistic for device %s\n",
+ dev->name);
+ seq_printf(seq,
+ "=======================================\n");
- /* Board statistics */
- len += sprintf(buffer + len,
- "\nBoard statistics\n\n");
- len += sprintf(buffer + len,
- "Active Port %c\n",
- 'A' + pAC->Rlmt.Net[t-1].Port[pAC->Rlmt.
- Net[t-1].PrefPort]->PortNumber);
- len += sprintf(buffer + len,
- "Preferred Port %c\n",
- 'A' + pAC->Rlmt.Net[t-1].Port[pAC->Rlmt.
- Net[t-1].PrefPort]->PortNumber);
-
- len += sprintf(buffer + len,
- "Bus speed (MHz) %d\n",
- pPnmiStruct->BusSpeed);
-
- len += sprintf(buffer + len,
- "Bus width (Bit) %d\n",
- pPnmiStruct->BusWidth);
- len += sprintf(buffer + len,
- "Hardware revision
v%d.%d\n",
- (pAC->GIni.GIPciHwRev >> 4) & 0x0F,
- pAC->GIni.GIPciHwRev & 0x0F);
-
- /* Print sensor informations */
- for (i=0; i < pAC->I2c.MaxSens; i ++) {
- /* Check type */
- switch (pAC->I2c.SenTable[i].SenType) {
- case 1:
- strcpy(sens_msg,
pAC->I2c.SenTable[i].SenDesc);
- strcat(sens_msg, " (C)");
- len += sprintf(buffer + len,
- "%-25s %d.%02d\n",
- sens_msg,
-
pAC->I2c.SenTable[i].SenValue / 10,
-
pAC->I2c.SenTable[i].SenValue % 10);
-
- strcpy(sens_msg,
pAC->I2c.SenTable[i].SenDesc);
- strcat(sens_msg, " (F)");
- len += sprintf(buffer + len,
- "%-25s %d.%02d\n",
- sens_msg,
-
((((pAC->I2c.SenTable[i].SenValue)
- *10)*9)/5 + 3200)/100,
-
((((pAC->I2c.SenTable[i].SenValue)
- *10)*9)/5 + 3200) % 10);
- break;
- case 2:
- strcpy(sens_msg,
pAC->I2c.SenTable[i].SenDesc);
- strcat(sens_msg, " (V)");
- len += sprintf(buffer + len,
- "%-25s %d.%03d\n",
- sens_msg,
-
pAC->I2c.SenTable[i].SenValue / 1000,
-
pAC->I2c.SenTable[i].SenValue % 1000);
- break;
- case 3:
- strcpy(sens_msg,
pAC->I2c.SenTable[i].SenDesc);
- strcat(sens_msg, " (rpm)");
- len += sprintf(buffer + len,
- "%-25s %d\n",
- sens_msg,
-
pAC->I2c.SenTable[i].SenValue);
- break;
- default:
- break;
- }
- }
+ /* Board statistics */
+ seq_printf(seq,
+ "\nBoard statistics\n\n");
+ seq_printf(seq,
+ "Active Port %c\n",
+ 'A' + pAC->Rlmt.Net[unit].Port[pAC->Rlmt.
+
Net[unit].PrefPort]->PortNumber);
+ seq_printf(seq,
+ "Preferred Port %c\n",
+ 'A' + pAC->Rlmt.Net[unit].Port[pAC->Rlmt.
+
Net[unit].PrefPort]->PortNumber);
+
+ seq_printf(seq,
+ "Bus speed (MHz) %d\n",
+ pPnmiStruct->BusSpeed);
+
+ seq_printf(seq,
+ "Bus width (Bit) %d\n",
+ pPnmiStruct->BusWidth);
+ seq_printf(seq,
+ "Hardware revision v%d.%d\n",
+ (pAC->GIni.GIPciHwRev >> 4) & 0x0F,
+ pAC->GIni.GIPciHwRev & 0x0F);
+
+ /* Print sensor informations */
+ for (i=0; i < pAC->I2c.MaxSens; i ++) {
+ /* Check type */
+ switch (pAC->I2c.SenTable[i].SenType) {
+ case 1:
+ strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc);
+ strcat(sens_msg, " (C)");
+ seq_printf(seq,
+ "%-25s %d.%02d\n",
+ sens_msg,
+ pAC->I2c.SenTable[i].SenValue / 10,
+ pAC->I2c.SenTable[i].SenValue % 10);
+
+ strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc);
+ strcat(sens_msg, " (F)");
+ seq_printf(seq,
+ "%-25s %d.%02d\n",
+ sens_msg,
+ ((((pAC->I2c.SenTable[i].SenValue)
+ *10)*9)/5 + 3200)/100,
+ ((((pAC->I2c.SenTable[i].SenValue)
+ *10)*9)/5 + 3200) % 10);
+ break;
+ case 2:
+ strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc);
+ strcat(sens_msg, " (V)");
+ seq_printf(seq,
+ "%-25s %d.%03d\n",
+ sens_msg,
+ pAC->I2c.SenTable[i].SenValue / 1000,
+ pAC->I2c.SenTable[i].SenValue % 1000);
+ break;
+ case 3:
+ strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc);
+ strcat(sens_msg, " (rpm)");
+ seq_printf(seq,
+ "%-25s %d\n",
+ sens_msg,
+ pAC->I2c.SenTable[i].SenValue);
+ break;
+ default:
+ break;
+ }
+ }
- /*Receive statistics */
- len += sprintf(buffer + len,
- "\nReceive statistics\n\n");
-
- len += sprintf(buffer + len,
- "Received bytes %Ld\n",
- (unsigned long long)
pPnmiStat->StatRxOctetsOkCts);
- len += sprintf(buffer + len,
- "Received packets %Ld\n",
- (unsigned long long)
pPnmiStat->StatRxOkCts);
+ /*Receive statistics */
+ seq_printf(seq,
+ "\nReceive statistics\n\n");
+
+ seq_printf(seq,
+ "Received bytes %Ld\n",
+ (unsigned long long) pPnmiStat->StatRxOctetsOkCts);
+ seq_printf(seq,
+ "Received packets %Ld\n",
+ (unsigned long long) pPnmiStat->StatRxOkCts);
#if 0
- if (pAC->GIni.GP[0].PhyType == SK_PHY_XMAC &&
- pAC->HWRevision < 12) {
- pPnmiStruct->InErrorsCts =
pPnmiStruct->InErrorsCts -
- pPnmiStat->StatRxShortsCts;
- pPnmiStat->StatRxShortsCts = 0;
- }
+ if (pAC->GIni.GP[0].PhyType == SK_PHY_XMAC &&
+ pAC->HWRevision < 12) {
+ pPnmiStruct->InErrorsCts = pPnmiStruct->InErrorsCts -
+ pPnmiStat->StatRxShortsCts;
+ pPnmiStat->StatRxShortsCts = 0;
+ }
#endif
- if (pNet->Mtu > 1500)
- pPnmiStruct->InErrorsCts =
pPnmiStruct->InErrorsCts -
- pPnmiStat->StatRxTooLongCts;
-
- len += sprintf(buffer + len,
- "Receive errors %Ld\n",
- (unsigned long long)
pPnmiStruct->InErrorsCts);
- len += sprintf(buffer + len,
- "Receive dropped %Ld\n",
- (unsigned long long)
pPnmiStruct->RxNoBufCts);
- len += sprintf(buffer + len,
- "Received multicast %Ld\n",
- (unsigned long long)
pPnmiStat->StatRxMulticastOkCts);
- len += sprintf(buffer + len,
- "Receive error types\n");
- len += sprintf(buffer + len,
- " length %Ld\n",
- (unsigned long long)
pPnmiStat->StatRxRuntCts);
- len += sprintf(buffer + len,
- " buffer overflow %Ld\n",
- (unsigned long long)
pPnmiStat->StatRxFifoOverflowCts);
- len += sprintf(buffer + len,
- " bad crc %Ld\n",
- (unsigned long long)
pPnmiStat->StatRxFcsCts);
- len += sprintf(buffer + len,
- " framing %Ld\n",
- (unsigned long long)
pPnmiStat->StatRxFramingCts);
- len += sprintf(buffer + len,
- " missed frames %Ld\n",
- (unsigned long long)
pPnmiStat->StatRxMissedCts);
-
- if (pNet->Mtu > 1500)
- pPnmiStat->StatRxTooLongCts = 0;
-
- len += sprintf(buffer + len,
- " too long %Ld\n",
- (unsigned long long)
pPnmiStat->StatRxTooLongCts);
- len += sprintf(buffer + len,
- " carrier extension %Ld\n",
- (unsigned long long)
pPnmiStat->StatRxCextCts);
- len += sprintf(buffer + len,
- " too short %Ld\n",
- (unsigned long long)
pPnmiStat->StatRxShortsCts);
- len += sprintf(buffer + len,
- " symbol %Ld\n",
- (unsigned long long)
pPnmiStat->StatRxSymbolCts);
- len += sprintf(buffer + len,
- " LLC MAC size %Ld\n",
- (unsigned long long)
pPnmiStat->StatRxIRLengthCts);
- len += sprintf(buffer + len,
- " carrier event %Ld\n",
- (unsigned long long)
pPnmiStat->StatRxCarrierCts);
- len += sprintf(buffer + len,
- " jabber %Ld\n",
- (unsigned long long)
pPnmiStat->StatRxJabberCts);
-
-
- /*Transmit statistics */
- len += sprintf(buffer + len,
- "\nTransmit statistics\n\n");
+ if (pNet->Mtu > 1500)
+ pPnmiStruct->InErrorsCts = pPnmiStruct->InErrorsCts -
+ pPnmiStat->StatRxTooLongCts;
+
+ seq_printf(seq,
+ "Receive errors %Ld\n",
+ (unsigned long long) pPnmiStruct->InErrorsCts);
+ seq_printf(seq,
+ "Receive dropped %Ld\n",
+ (unsigned long long) pPnmiStruct->RxNoBufCts);
+ seq_printf(seq,
+ "Received multicast %Ld\n",
+ (unsigned long long) pPnmiStat->StatRxMulticastOkCts);
+ seq_printf(seq,
+ "Receive error types\n");
+ seq_printf(seq,
+ " length %Ld\n",
+ (unsigned long long) pPnmiStat->StatRxRuntCts);
+ seq_printf(seq,
+ " buffer overflow %Ld\n",
+ (unsigned long long) pPnmiStat->StatRxFifoOverflowCts);
+ seq_printf(seq,
+ " bad crc %Ld\n",
+ (unsigned long long) pPnmiStat->StatRxFcsCts);
+ seq_printf(seq,
+ " framing %Ld\n",
+ (unsigned long long) pPnmiStat->StatRxFramingCts);
+ seq_printf(seq,
+ " missed frames %Ld\n",
+ (unsigned long long) pPnmiStat->StatRxMissedCts);
+
+ if (pNet->Mtu > 1500)
+ pPnmiStat->StatRxTooLongCts = 0;
+
+ seq_printf(seq,
+ " too long %Ld\n",
+ (unsigned long long) pPnmiStat->StatRxTooLongCts);
+ seq_printf(seq,
+ " carrier extension %Ld\n",
+ (unsigned long long) pPnmiStat->StatRxCextCts);
+ seq_printf(seq,
+ " too short %Ld\n",
+ (unsigned long long) pPnmiStat->StatRxShortsCts);
+ seq_printf(seq,
+ " symbol %Ld\n",
+ (unsigned long long) pPnmiStat->StatRxSymbolCts);
+ seq_printf(seq,
+ " LLC MAC size %Ld\n",
+ (unsigned long long) pPnmiStat->StatRxIRLengthCts);
+ seq_printf(seq,
+ " carrier event %Ld\n",
+ (unsigned long long) pPnmiStat->StatRxCarrierCts);
+ seq_printf(seq,
+ " jabber %Ld\n",
+ (unsigned long long) pPnmiStat->StatRxJabberCts);
+
+
+ /*Transmit statistics */
+ seq_printf(seq,
+ "\nTransmit statistics\n\n");
- len += sprintf(buffer + len,
- "Transmited bytes %Ld\n",
- (unsigned long long)
pPnmiStat->StatTxOctetsOkCts);
- len += sprintf(buffer + len,
- "Transmited packets %Ld\n",
- (unsigned long long)
pPnmiStat->StatTxOkCts);
- len += sprintf(buffer + len,
- "Transmit errors %Ld\n",
- (unsigned long long)
pPnmiStat->StatTxSingleCollisionCts);
- len += sprintf(buffer + len,
- "Transmit dropped %Ld\n",
- (unsigned long long)
pPnmiStruct->TxNoBufCts);
- len += sprintf(buffer + len,
- "Transmit collisions %Ld\n",
- (unsigned long long)
pPnmiStat->StatTxSingleCollisionCts);
- len += sprintf(buffer + len,
- "Transmit error types\n");
- len += sprintf(buffer + len,
- " excessive collision %ld\n",
- pAC->stats.tx_aborted_errors);
- len += sprintf(buffer + len,
- " carrier %Ld\n",
- (unsigned long long)
pPnmiStat->StatTxCarrierCts);
- len += sprintf(buffer + len,
- " fifo underrun %Ld\n",
- (unsigned long long)
pPnmiStat->StatTxFifoUnderrunCts);
- len += sprintf(buffer + len,
- " heartbeat %Ld\n",
- (unsigned long long)
pPnmiStat->StatTxCarrierCts);
- len += sprintf(buffer + len,
- " window %ld\n",
- pAC->stats.tx_window_errors);
+ seq_printf(seq,
+ "Transmited bytes %Ld\n",
+ (unsigned long long) pPnmiStat->StatTxOctetsOkCts);
+ seq_printf(seq,
+ "Transmited packets %Ld\n",
+ (unsigned long long) pPnmiStat->StatTxOkCts);
+ seq_printf(seq,
+ "Transmit errors %Ld\n",
+ (unsigned long long) pPnmiStat->StatTxSingleCollisionCts);
+ seq_printf(seq,
+ "Transmit dropped %Ld\n",
+ (unsigned long long) pPnmiStruct->TxNoBufCts);
+ seq_printf(seq,
+ "Transmit collisions %Ld\n",
+ (unsigned long long) pPnmiStat->StatTxSingleCollisionCts);
+ seq_printf(seq,
+ "Transmit error types\n");
+ seq_printf(seq,
+ " excessive collision %ld\n",
+ pAC->stats.tx_aborted_errors);
+ seq_printf(seq,
+ " carrier %Ld\n",
+ (unsigned long long) pPnmiStat->StatTxCarrierCts);
+ seq_printf(seq,
+ " fifo underrun %Ld\n",
+ (unsigned long long) pPnmiStat->StatTxFifoUnderrunCts);
+ seq_printf(seq,
+ " heartbeat %Ld\n",
+ (unsigned long long) pPnmiStat->StatTxCarrierCts);
+ seq_printf(seq,
+ " window %ld\n",
+ pAC->stats.tx_window_errors);
- }
- }
- SkgeProcDev = next;
- }
- if (offset >= len) {
- *eof = 1;
- return 0;
- }
-
- *buffer_location = buffer + offset;
- if (buffer_length >= len - offset) {
- *eof = 1;
- }
- return (min_t(int, buffer_length, len - offset));
+ return 0;
}
+static int sk_proc_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, sk_seq_show, PDE(inode)->data);
+}
+
+struct file_operations sk_proc_fops = {
+ .owner = THIS_MODULE,
+ .open = sk_proc_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+};
+#endif
|