skproc.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:11k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  *
  3.  * Name:    skproc.c
  4.  * Project: GEnesis, PCI Gigabit Ethernet Adapter
  5.  * Version: $Revision: 1.2.2.2 $
  6.  * Date:    $Date: 2001/03/15 12:50:13 $
  7.  * Purpose: Funktions to display statictic data
  8.  *
  9.  ******************************************************************************/
  10.  
  11. /******************************************************************************
  12.  *
  13.  * (C)Copyright 1998-2001 SysKonnect GmbH.
  14.  *
  15.  * This program is free software; you can redistribute it and/or modify
  16.  * it under the terms of the GNU General Public License as published by
  17.  * the Free Software Foundation; either version 2 of the License, or
  18.  * (at your option) any later version.
  19.  *
  20.  * Created 22-Nov-2000
  21.  * Author: Mirko Lindner (mlindner@syskonnect.de)
  22.  *
  23.  * The information in this file is provided "AS IS" without warranty.
  24.  *
  25.  ******************************************************************************/
  26. /******************************************************************************
  27.  *
  28.  * History:
  29.  *
  30.  * $Log: skproc.c,v $
  31.  * Revision 1.2.2.2  2001/03/15 12:50:13  mlindner
  32.  * fix: ProcFS owner protection
  33.  *
  34.  * Revision 1.2.2.1  2001/03/12 16:43:48  mlindner
  35.  * chg: 2.4 requirements for procfs
  36.  *
  37.  * Revision 1.1  2001/01/22 14:15:31  mlindner
  38.  * added ProcFs functionality
  39.  * Dual Net functionality integrated
  40.  * Rlmt networks added
  41.  *
  42.  *
  43.  ******************************************************************************/
  44. #include <linux/proc_fs.h>
  45. #include "h/skdrv1st.h"
  46. #include "h/skdrv2nd.h"
  47. #define ZEROPAD 1 /* pad with zero */
  48. #define SIGN 2 /* unsigned/signed long */
  49. #define PLUS 4 /* show plus */
  50. #define SPACE 8 /* space if plus */
  51. #define LEFT 16 /* left justified */
  52. //#define SPECIAL 32 /* 0x */
  53. #define LARGE 64
  54. extern void proc_fill_inode(struct inode *inode, int fill);
  55. extern char * SkNumber(char * str, long long num, int base, int size, 
  56. int precision ,int type);
  57. int proc_read(char *buffer,
  58. char **buffer_location,
  59. off_t offset,
  60. int buffer_length,
  61. int *eof,
  62. void *data);
  63. static const char SK_Root_Dir_entry[] = "sk98lin";
  64. extern struct net_device *sk98lin_root_dev;
  65. struct proc_dir_entry pSkRootDir = { 
  66. 0,
  67. sizeof(SK_Root_Dir_entry)-1,
  68. (const char*)SK_Root_Dir_entry,
  69. S_IFDIR | S_IRUGO,
  70. 2, 0, 0, 0, NULL,
  71. NULL
  72. };
  73. /*****************************************************************************
  74.  *
  75.  *  proc_read - print "summaries" entry 
  76.  *
  77.  * Description:
  78.  *  This function fills the proc entry with statistic data about 
  79.  *  the ethernet device.
  80.  *  
  81.  *
  82.  * Returns: buffer with statistic data
  83.  *
  84.  */
  85. int proc_read(char *buffer,
  86. char **buffer_location,
  87. off_t offset,
  88. int buffer_length,
  89. int *eof,
  90. void *data)
  91. {
  92. int len = 0;
  93. int t;
  94. int i;
  95. DEV_NET *pNet;
  96. SK_AC *pAC;
  97. char  test_buf[100];
  98. unsigned long Flags;
  99. unsigned int Size;
  100. struct net_device  *next;
  101. struct net_device  *SkgeProcDev = sk98lin_root_dev;
  102. SK_PNMI_STRUCT_DATA  *pPnmiStruct;
  103. SK_PNMI_STAT *pPnmiStat;
  104. struct proc_dir_entry *file = (struct proc_dir_entry*) data;
  105. while (SkgeProcDev) {
  106. pNet = (DEV_NET*) SkgeProcDev->priv;
  107. pAC = pNet->pAC;
  108. next = pAC->Next;
  109. pPnmiStruct = &pAC->PnmiStruct;
  110. /* NetIndex in GetStruct is now required, zero is only dummy */
  111. for (t=pAC->GIni.GIMacsFound; t > 0; t--) {
  112. if ((pAC->GIni.GIMacsFound == 2) && pAC->RlmtNets == 1)
  113. t--;
  114. spin_lock_irqsave(&pAC->SlowPathLock, Flags);
  115. Size = SK_PNMI_STRUCT_SIZE;
  116. SkPnmiGetStruct(pAC, pAC->IoBase, 
  117. pPnmiStruct, &Size, t-1);
  118. spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
  119. if (strcmp(pAC->dev[t-1]->name, file->name) == 0) {
  120. pPnmiStat = &pPnmiStruct->Stat[0];
  121. len = sprintf(buffer, 
  122. "nDetailed statistic for device %sn",
  123. pAC->dev[t-1]->name);
  124. len += sprintf(buffer + len,
  125. "==================================n");
  126. /* Board statistics */
  127. len += sprintf(buffer + len, 
  128. "nBoard statisticsnn");
  129. len += sprintf(buffer + len,
  130. "Active Port               %cn",
  131. 'A' + pAC->Rlmt.Net[t-1].Port[pAC->Rlmt.
  132. Net[t-1].PrefPort]->PortNumber);
  133. len += sprintf(buffer + len,
  134. "Preferred Port            %cn",
  135. 'A' + pAC->Rlmt.Net[t-1].Port[pAC->Rlmt.
  136. Net[t-1].PrefPort]->PortNumber);
  137. len += sprintf(buffer + len,
  138. "Bus speed (Mhz)           %dn",
  139. pPnmiStruct->BusSpeed);
  140. len += sprintf(buffer + len,
  141. "Bus width (Bit)           %dn",
  142. pPnmiStruct->BusWidth);
  143. for (i=0; i < SK_MAX_SENSORS; i ++) {
  144. if (strcmp(pAC->I2c.SenTable[i].SenDesc,
  145. "Temperature") == 0 ) {
  146. len += sprintf(buffer + len,
  147. "Temperature (C)           %d.%dn",
  148. pAC->I2c.SenTable[i].SenValue / 10,
  149. pAC->I2c.SenTable[i].SenValue % 10);
  150. len += sprintf(buffer + len,
  151. "Temperature (F)           %d.%dn",
  152. ((((pAC->I2c.SenTable[i].SenValue)
  153. *10)*9)/5 + 3200)/100,
  154. ((((pAC->I2c.SenTable[i].SenValue)
  155. *10)*9)/5 + 3200) % 10);
  156. } else if (strcmp(pAC->I2c.SenTable[i].SenDesc,
  157. "Speed Fan") == 0 ) {
  158. len += sprintf(buffer + len,
  159. "Speed Fan                 %dn",
  160. pAC->I2c.SenTable[i].SenValue);
  161. } else {
  162. len += sprintf(buffer + len,
  163. "%-20s      %d.%dn",
  164. pAC->I2c.SenTable[i].SenDesc,
  165. pAC->I2c.SenTable[i].SenValue / 1000,
  166. pAC->I2c.SenTable[i].SenValue % 1000);
  167. }
  168. }
  169. /*Receive statistics */
  170. len += sprintf(buffer + len, 
  171. "nReceive statisticsnn");
  172. len += sprintf(buffer + len,
  173. "Received bytes            %sn",
  174. SkNumber(test_buf, pPnmiStat->StatRxOctetsOkCts,
  175. 10,0,-1,0));
  176. len += sprintf(buffer + len,
  177. "Received packets          %sn",
  178. SkNumber(test_buf, pPnmiStat->StatRxOkCts,
  179. 10,0,-1,0));
  180. len += sprintf(buffer + len,
  181. "Received errors           %sn",
  182. SkNumber(test_buf, pPnmiStat->StatRxFcsCts,
  183. 10,0,-1,0));
  184. len += sprintf(buffer + len,
  185. "Received dropped          %sn",
  186. SkNumber(test_buf, pPnmiStruct->RxNoBufCts,
  187. 10,0,-1,0));
  188. len += sprintf(buffer + len,
  189. "Received multicast        %sn",
  190. SkNumber(test_buf, pPnmiStat->StatRxMulticastOkCts,
  191. 10,0,-1,0));
  192. len += sprintf(buffer + len,
  193. "Received errors typesn");
  194. len += sprintf(buffer + len,
  195. "   length errors          %sn",
  196. SkNumber(test_buf, pPnmiStat->StatRxRuntCts,
  197. 10, 0, -1, 0));
  198. len += sprintf(buffer + len,
  199. "   over errors            %sn",
  200. SkNumber(test_buf, pPnmiStat->StatRxFifoOverflowCts,
  201. 10, 0, -1, 0));
  202. len += sprintf(buffer + len,
  203. "   crc errors             %sn",
  204. SkNumber(test_buf, pPnmiStat->StatRxFcsCts,
  205. 10, 0, -1, 0));
  206. len += sprintf(buffer + len,
  207. "   frame errors           %sn",
  208. SkNumber(test_buf, pPnmiStat->StatRxFramingCts,
  209. 10, 0, -1, 0));
  210. len += sprintf(buffer + len,
  211. "   fifo errors            %sn",
  212. SkNumber(test_buf, pPnmiStat->StatRxFifoOverflowCts,
  213. 10, 0, -1, 0));
  214. len += sprintf(buffer + len,
  215. "   missed errors          %sn",
  216. SkNumber(test_buf, pPnmiStat->StatRxMissedCts,
  217. 10, 0, -1, 0));
  218. /*Transmit statistics */
  219. len += sprintf(buffer + len, 
  220. "nTransmit statisticsnn");
  221. len += sprintf(buffer + len,
  222. "Transmit bytes            %sn",
  223. SkNumber(test_buf, pPnmiStat->StatTxOctetsOkCts,
  224. 10,0,-1,0));
  225. len += sprintf(buffer + len,
  226. "Transmit packets          %sn",
  227. SkNumber(test_buf, pPnmiStat->StatTxOkCts,
  228. 10,0,-1,0));
  229. len += sprintf(buffer + len,
  230. "Transmit errors           %sn",
  231. SkNumber(test_buf, pPnmiStat->StatTxSingleCollisionCts,
  232. 10,0,-1,0));
  233. len += sprintf(buffer + len,
  234. "Transmit dropped          %sn",
  235. SkNumber(test_buf, pPnmiStruct->TxNoBufCts,
  236. 10,0,-1,0));
  237. len += sprintf(buffer + len,
  238. "Transmit collisions       %sn",
  239. SkNumber(test_buf, pPnmiStat->StatTxSingleCollisionCts,
  240. 10,0,-1,0));
  241. len += sprintf(buffer + len,
  242. "Transmited errors typesn");
  243. len += sprintf(buffer + len,
  244. "   aborted errors         %ldn",
  245. pAC->stats.tx_aborted_errors);
  246. len += sprintf(buffer + len,
  247. "   carrier errors         %sn",
  248. SkNumber(test_buf, pPnmiStat->StatTxCarrierCts,
  249. 10, 0, -1, 0));
  250. len += sprintf(buffer + len,
  251. "   fifo errors            %sn",
  252. SkNumber(test_buf, pPnmiStat->StatTxFifoUnderrunCts,
  253. 10, 0, -1, 0));
  254. len += sprintf(buffer + len,
  255. "   heartbeat errors       %sn",
  256. SkNumber(test_buf, pPnmiStat->StatTxCarrierCts,
  257. 10, 0, -1, 0));
  258. len += sprintf(buffer + len,
  259. "   window errors          %ldn",
  260. pAC->stats.tx_window_errors);
  261. }
  262. }
  263. SkgeProcDev = next;
  264. }
  265. if (offset >= len) {
  266. *eof = 1;
  267. return 0;
  268. }
  269. *buffer_location = buffer + offset;
  270. if (buffer_length >= len - offset) {
  271. *eof = 1;
  272. }
  273. return (min_t(int, buffer_length, len - offset));
  274. }
  275. /*****************************************************************************
  276.  *
  277.  * SkDoDiv - convert 64bit number
  278.  *
  279.  * Description:
  280.  * This function "converts" a long long number.
  281.  *
  282.  * Returns:
  283.  * remainder of division
  284.  */
  285. static long SkDoDiv (long long Dividend, int Divisor, long long *pErg)
  286. {
  287.  long    Rest;
  288.  long long  Ergebnis;
  289.  long    Akku;
  290.  Akku  = Dividend >> 32;
  291.  Ergebnis = ((long long) (Akku / Divisor)) << 32;
  292.  Rest = Akku % Divisor ;
  293.  Akku = Rest << 16;
  294.  Akku |= ((Dividend & 0xFFFF0000) >> 16);
  295.  Ergebnis += ((long long) (Akku / Divisor)) << 16;
  296.  Rest = Akku % Divisor ;
  297.  Akku = Rest << 16;
  298.  Akku |= (Dividend & 0xFFFF);
  299.  Ergebnis += (Akku / Divisor);
  300.  Rest = Akku % Divisor ;
  301.  *pErg = Ergebnis;
  302.  return (Rest);
  303. }
  304. #if 0
  305. #define do_div(n,base) ({ 
  306. long long __res; 
  307. __res = ((unsigned long long) n) % (unsigned) base; 
  308. n = ((unsigned long long) n) / (unsigned) base; 
  309. __res; })
  310. #endif
  311. /*****************************************************************************
  312.  *
  313.  * SkNumber - Print results
  314.  *
  315.  * Description:
  316.  * This function converts a long long number into a string.
  317.  *
  318.  * Returns:
  319.  * number as string
  320.  */
  321. char * SkNumber(char * str, long long num, int base, int size, int precision
  322. ,int type)
  323. {
  324. char c,sign,tmp[66], *strorg = str;
  325. const char *digits="0123456789abcdefghijklmnopqrstuvwxyz";
  326. int i;
  327. if (type & LARGE)
  328. digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  329. if (type & LEFT)
  330. type &= ~ZEROPAD;
  331. if (base < 2 || base > 36)
  332. return 0;
  333. c = (type & ZEROPAD) ? '0' : ' ';
  334. sign = 0;
  335. if (type & SIGN) {
  336. if (num < 0) {
  337. sign = '-';
  338. num = -num;
  339. size--;
  340. } else if (type & PLUS) {
  341. sign = '+';
  342. size--;
  343. } else if (type & SPACE) {
  344. sign = ' ';
  345. size--;
  346. }
  347. }
  348. if (type & SPECIAL) {
  349. if (base == 16)
  350. size -= 2;
  351. else if (base == 8)
  352. size--;
  353. }
  354. i = 0;
  355. if (num == 0)
  356. tmp[i++]='0';
  357. else while (num != 0)
  358. tmp[i++] = digits[SkDoDiv(num,base, &num)];
  359. if (i > precision)
  360. precision = i;
  361. size -= precision;
  362. if (!(type&(ZEROPAD+LEFT)))
  363. while(size-->0)
  364. *str++ = ' ';
  365. if (sign)
  366. *str++ = sign;
  367. if (type & SPECIAL) {
  368. if (base==8)
  369. *str++ = '0';
  370. else if (base==16) {
  371. *str++ = '0';
  372. *str++ = digits[33];
  373. }
  374. }
  375. if (!(type & LEFT))
  376. while (size-- > 0)
  377. *str++ = c;
  378. while (i < precision--)
  379. *str++ = '0';
  380. while (i-- > 0)
  381. *str++ = tmp[i];
  382. while (size-- > 0)
  383. *str++ = ' ';
  384. str[0] = '';
  385. return strorg;
  386. }