skproc.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:11k
- /******************************************************************************
- *
- * Name: skproc.c
- * Project: GEnesis, PCI Gigabit Ethernet Adapter
- * Version: $Revision: 1.2.2.2 $
- * Date: $Date: 2001/03/15 12:50:13 $
- * Purpose: Funktions to display statictic data
- *
- ******************************************************************************/
-
- /******************************************************************************
- *
- * (C)Copyright 1998-2001 SysKonnect GmbH.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * Created 22-Nov-2000
- * Author: Mirko Lindner (mlindner@syskonnect.de)
- *
- * The information in this file is provided "AS IS" without warranty.
- *
- ******************************************************************************/
- /******************************************************************************
- *
- * History:
- *
- * $Log: skproc.c,v $
- * Revision 1.2.2.2 2001/03/15 12:50:13 mlindner
- * fix: ProcFS owner protection
- *
- * Revision 1.2.2.1 2001/03/12 16:43:48 mlindner
- * chg: 2.4 requirements for procfs
- *
- * Revision 1.1 2001/01/22 14:15:31 mlindner
- * added ProcFs functionality
- * Dual Net functionality integrated
- * Rlmt networks added
- *
- *
- ******************************************************************************/
- #include <linux/proc_fs.h>
- #include "h/skdrv1st.h"
- #include "h/skdrv2nd.h"
- #define ZEROPAD 1 /* pad with zero */
- #define SIGN 2 /* unsigned/signed long */
- #define PLUS 4 /* show plus */
- #define SPACE 8 /* space if plus */
- #define LEFT 16 /* left justified */
- //#define SPECIAL 32 /* 0x */
- #define LARGE 64
- extern void proc_fill_inode(struct inode *inode, int fill);
- extern char * SkNumber(char * str, long long num, int base, int size,
- int precision ,int type);
- int proc_read(char *buffer,
- char **buffer_location,
- off_t offset,
- int buffer_length,
- int *eof,
- void *data);
- static const char SK_Root_Dir_entry[] = "sk98lin";
- extern struct net_device *sk98lin_root_dev;
- struct proc_dir_entry pSkRootDir = {
- 0,
- sizeof(SK_Root_Dir_entry)-1,
- (const char*)SK_Root_Dir_entry,
- S_IFDIR | S_IRUGO,
- 2, 0, 0, 0, NULL,
- NULL
- };
- /*****************************************************************************
- *
- * 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 proc_read(char *buffer,
- char **buffer_location,
- off_t offset,
- int buffer_length,
- int *eof,
- void *data)
- {
- int len = 0;
- int t;
- int i;
- DEV_NET *pNet;
- SK_AC *pAC;
- char test_buf[100];
- unsigned long Flags;
- unsigned int Size;
- struct net_device *next;
- struct net_device *SkgeProcDev = sk98lin_root_dev;
- 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 %sn",
- pAC->dev[t-1]->name);
- len += sprintf(buffer + len,
- "==================================n");
-
- /* Board statistics */
- len += sprintf(buffer + len,
- "nBoard statisticsnn");
- len += sprintf(buffer + len,
- "Active Port %cn",
- 'A' + pAC->Rlmt.Net[t-1].Port[pAC->Rlmt.
- Net[t-1].PrefPort]->PortNumber);
- len += sprintf(buffer + len,
- "Preferred Port %cn",
- 'A' + pAC->Rlmt.Net[t-1].Port[pAC->Rlmt.
- Net[t-1].PrefPort]->PortNumber);
- len += sprintf(buffer + len,
- "Bus speed (Mhz) %dn",
- pPnmiStruct->BusSpeed);
- len += sprintf(buffer + len,
- "Bus width (Bit) %dn",
- pPnmiStruct->BusWidth);
- for (i=0; i < SK_MAX_SENSORS; i ++) {
- if (strcmp(pAC->I2c.SenTable[i].SenDesc,
- "Temperature") == 0 ) {
- len += sprintf(buffer + len,
- "Temperature (C) %d.%dn",
- pAC->I2c.SenTable[i].SenValue / 10,
- pAC->I2c.SenTable[i].SenValue % 10);
- len += sprintf(buffer + len,
- "Temperature (F) %d.%dn",
- ((((pAC->I2c.SenTable[i].SenValue)
- *10)*9)/5 + 3200)/100,
- ((((pAC->I2c.SenTable[i].SenValue)
- *10)*9)/5 + 3200) % 10);
- } else if (strcmp(pAC->I2c.SenTable[i].SenDesc,
- "Speed Fan") == 0 ) {
- len += sprintf(buffer + len,
- "Speed Fan %dn",
- pAC->I2c.SenTable[i].SenValue);
- } else {
- len += sprintf(buffer + len,
- "%-20s %d.%dn",
- pAC->I2c.SenTable[i].SenDesc,
- pAC->I2c.SenTable[i].SenValue / 1000,
- pAC->I2c.SenTable[i].SenValue % 1000);
- }
- }
-
- /*Receive statistics */
-
- len += sprintf(buffer + len,
- "nReceive statisticsnn");
- len += sprintf(buffer + len,
- "Received bytes %sn",
- SkNumber(test_buf, pPnmiStat->StatRxOctetsOkCts,
- 10,0,-1,0));
- len += sprintf(buffer + len,
- "Received packets %sn",
- SkNumber(test_buf, pPnmiStat->StatRxOkCts,
- 10,0,-1,0));
- len += sprintf(buffer + len,
- "Received errors %sn",
- SkNumber(test_buf, pPnmiStat->StatRxFcsCts,
- 10,0,-1,0));
- len += sprintf(buffer + len,
- "Received dropped %sn",
- SkNumber(test_buf, pPnmiStruct->RxNoBufCts,
- 10,0,-1,0));
- len += sprintf(buffer + len,
- "Received multicast %sn",
- SkNumber(test_buf, pPnmiStat->StatRxMulticastOkCts,
- 10,0,-1,0));
- len += sprintf(buffer + len,
- "Received errors typesn");
- len += sprintf(buffer + len,
- " length errors %sn",
- SkNumber(test_buf, pPnmiStat->StatRxRuntCts,
- 10, 0, -1, 0));
- len += sprintf(buffer + len,
- " over errors %sn",
- SkNumber(test_buf, pPnmiStat->StatRxFifoOverflowCts,
- 10, 0, -1, 0));
- len += sprintf(buffer + len,
- " crc errors %sn",
- SkNumber(test_buf, pPnmiStat->StatRxFcsCts,
- 10, 0, -1, 0));
- len += sprintf(buffer + len,
- " frame errors %sn",
- SkNumber(test_buf, pPnmiStat->StatRxFramingCts,
- 10, 0, -1, 0));
- len += sprintf(buffer + len,
- " fifo errors %sn",
- SkNumber(test_buf, pPnmiStat->StatRxFifoOverflowCts,
- 10, 0, -1, 0));
- len += sprintf(buffer + len,
- " missed errors %sn",
- SkNumber(test_buf, pPnmiStat->StatRxMissedCts,
- 10, 0, -1, 0));
-
- /*Transmit statistics */
- len += sprintf(buffer + len,
- "nTransmit statisticsnn");
-
- len += sprintf(buffer + len,
- "Transmit bytes %sn",
- SkNumber(test_buf, pPnmiStat->StatTxOctetsOkCts,
- 10,0,-1,0));
- len += sprintf(buffer + len,
- "Transmit packets %sn",
- SkNumber(test_buf, pPnmiStat->StatTxOkCts,
- 10,0,-1,0));
- len += sprintf(buffer + len,
- "Transmit errors %sn",
- SkNumber(test_buf, pPnmiStat->StatTxSingleCollisionCts,
- 10,0,-1,0));
- len += sprintf(buffer + len,
- "Transmit dropped %sn",
- SkNumber(test_buf, pPnmiStruct->TxNoBufCts,
- 10,0,-1,0));
- len += sprintf(buffer + len,
- "Transmit collisions %sn",
- SkNumber(test_buf, pPnmiStat->StatTxSingleCollisionCts,
- 10,0,-1,0));
- len += sprintf(buffer + len,
- "Transmited errors typesn");
- len += sprintf(buffer + len,
- " aborted errors %ldn",
- pAC->stats.tx_aborted_errors);
- len += sprintf(buffer + len,
- " carrier errors %sn",
- SkNumber(test_buf, pPnmiStat->StatTxCarrierCts,
- 10, 0, -1, 0));
- len += sprintf(buffer + len,
- " fifo errors %sn",
- SkNumber(test_buf, pPnmiStat->StatTxFifoUnderrunCts,
- 10, 0, -1, 0));
- len += sprintf(buffer + len,
- " heartbeat errors %sn",
- SkNumber(test_buf, pPnmiStat->StatTxCarrierCts,
- 10, 0, -1, 0));
- len += sprintf(buffer + len,
- " window errors %ldn",
- 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));
- }
- /*****************************************************************************
- *
- * SkDoDiv - convert 64bit number
- *
- * Description:
- * This function "converts" a long long number.
- *
- * Returns:
- * remainder of division
- */
- static long SkDoDiv (long long Dividend, int Divisor, long long *pErg)
- {
- long Rest;
- long long Ergebnis;
- long Akku;
- Akku = Dividend >> 32;
- Ergebnis = ((long long) (Akku / Divisor)) << 32;
- Rest = Akku % Divisor ;
- Akku = Rest << 16;
- Akku |= ((Dividend & 0xFFFF0000) >> 16);
- Ergebnis += ((long long) (Akku / Divisor)) << 16;
- Rest = Akku % Divisor ;
- Akku = Rest << 16;
- Akku |= (Dividend & 0xFFFF);
- Ergebnis += (Akku / Divisor);
- Rest = Akku % Divisor ;
- *pErg = Ergebnis;
- return (Rest);
- }
- #if 0
- #define do_div(n,base) ({
- long long __res;
- __res = ((unsigned long long) n) % (unsigned) base;
- n = ((unsigned long long) n) / (unsigned) base;
- __res; })
- #endif
- /*****************************************************************************
- *
- * SkNumber - Print results
- *
- * Description:
- * This function converts a long long number into a string.
- *
- * Returns:
- * number as string
- */
- char * SkNumber(char * str, long long num, int base, int size, int precision
- ,int type)
- {
- char c,sign,tmp[66], *strorg = str;
- const char *digits="0123456789abcdefghijklmnopqrstuvwxyz";
- int i;
- if (type & LARGE)
- digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- if (type & LEFT)
- type &= ~ZEROPAD;
- if (base < 2 || base > 36)
- return 0;
- c = (type & ZEROPAD) ? '0' : ' ';
- sign = 0;
- if (type & SIGN) {
- if (num < 0) {
- sign = '-';
- num = -num;
- size--;
- } else if (type & PLUS) {
- sign = '+';
- size--;
- } else if (type & SPACE) {
- sign = ' ';
- size--;
- }
- }
- if (type & SPECIAL) {
- if (base == 16)
- size -= 2;
- else if (base == 8)
- size--;
- }
- i = 0;
- if (num == 0)
- tmp[i++]='0';
- else while (num != 0)
- tmp[i++] = digits[SkDoDiv(num,base, &num)];
- if (i > precision)
- precision = i;
- size -= precision;
- if (!(type&(ZEROPAD+LEFT)))
- while(size-->0)
- *str++ = ' ';
- if (sign)
- *str++ = sign;
- if (type & SPECIAL) {
- if (base==8)
- *str++ = '0';
- else if (base==16) {
- *str++ = '0';
- *str++ = digits[33];
- }
- }
- if (!(type & LEFT))
- while (size-- > 0)
- *str++ = c;
- while (i < precision--)
- *str++ = '0';
- while (i-- > 0)
- *str++ = tmp[i];
- while (size-- > 0)
- *str++ = ' ';
-
- str[0] = ' ';
-
- return strorg;
- }