2 * Copyright (c) 2002-2007 Neterion, Inc.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 /******************************************
31 * To get the Tx, Rx, PCI, Interrupt statistics,
32 * PCI configuration space and bar0 register
34 ******************************************/
38 main( int argc, char *argv[] )
41 if(!((strcmp(argv[2], "-r") == 0) ||
42 (strcmp(argv[2], "-w") == 0) ||
43 (strcmp(argv[2], "chgbufmode") == 0)))
48 if(argc != 3) { goto out; }
52 if(!((strcmp(argv[2], "stats") == 0) ||
53 (strcmp(argv[2], "pciconf") == 0) ||
54 (strcmp(argv[2], "devconf") == 0) ||
55 (strcmp(argv[2], "reginfo") == 0) ||
56 (strcmp(argv[2], "driverversion") == 0) ||
57 (strcmp(argv[2], "swstats") == 0) ||
58 (strcmp(argv[2], "getbufmode") == 0) ||
59 (strcmp(argv[2], "intr") == 0)))
64 if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
66 printf("Creating socket failed\n");
70 ifreqp.ifr_addr.sa_family = AF_INET;
71 strcpy(ifreqp.ifr_name, argv[1]);
73 if (strcmp(argv[2], "pciconf") == 0) return getPciConf();
74 else if(strcmp(argv[2], "devconf") == 0) return getDevConf();
75 else if(strcmp(argv[2], "stats") == 0) return getStats();
76 else if(strcmp(argv[2], "reginfo") == 0) return getRegInfo();
77 else if(strcmp(argv[2], "intr") == 0) return getIntrStats();
78 else if(strcmp(argv[2], "swstats") == 0) return getTcodeStats();
79 else if(strcmp(argv[2], "driverversion") == 0) return getDriverVer();
80 else if(strcmp(argv[2], "-r") == 0) return getReadReg(argv[2],
82 else if(strcmp(argv[2], "-w") == 0) return getWriteReg(argv[2],
84 else if(strcmp(argv[2], "chgbufmode") == 0) return changeBufMode(argv[3]);
85 else if(strcmp(argv[2], "getbufmode") == 0) return getBufMode();
86 else return EXIT_FAILURE;
90 printf("%s <INTERFACE> [-r] [-w] [chgbufmode]\n", argv[0]);
91 printf("\t -r <offset> : Read register \n");
92 printf("\t -w <offset> -v <value> : Write register \n");
93 printf("\t chgbufmode <Buffer mode> : Changes buffer mode \n");
98 printf("%s <INTERFACE> <[stats] [reginfo] [pciconf] [devconf] ", argv[0]);
99 printf("[intr] [swstats] [driverversion] ");
100 printf("[getbufmode] [chgbufmode] [-r] [-w] >\n");
101 printf("\tINTERFACE : Interface (xge0, xge1, xge2, ..)\n");
102 printf("\tstats : Prints statistics \n");
103 printf("\treginfo : Prints register values \n");
104 printf("\tpciconf : Prints PCI configuration space \n");
105 printf("\tdevconf : Prints device configuration \n");
106 printf("\tintr : Prints interrupt statistics \n");
107 printf("\tswstats : Prints sw statistics \n");
108 printf("\tdriverversion : Prints driver version \n");
109 printf("\tgetbufmode : Prints Buffer Mode \n");
110 printf("\tchgbufmode : Changes buffer mode \n");
111 printf("\t -r <offset> : Read register \n");
112 printf("\t -w <offset> -v <value> : Write register \n");
121 unsigned short device_id;
123 bufferSize = GET_OFFSET_STATS(XGE_COUNT_STATS - 1) + 8;
125 hw_stats = (void *) malloc(bufferSize);
128 printf("Allocating memory for hw_stats failed\n");
131 pAccess = (char *)hw_stats;
132 *pAccess = XGE_QUERY_STATS;
133 ifreqp.ifr_data = (caddr_t) hw_stats;
135 if(ioctl(sockfd, SIOCGPRIVATE_0, &ifreqp) < 0)
137 printf("Getting hardware statistics failed\n");
141 bufferSize = GET_OFFSET_PCICONF(XGE_COUNT_PCICONF -1) + 8;
143 pci_cfg = (void *) malloc(bufferSize);
146 printf("Allocating memory for pci_cfg failed\n");
150 pAccess = (char *)pci_cfg;
151 *pAccess = XGE_QUERY_PCICONF;
152 ifreqp.ifr_data = (caddr_t)pci_cfg;
154 if(ioctl(sockfd, SIOCGPRIVATE_0, &ifreqp) < 0)
156 printf("Getting pci configuration space failed\n");
160 device_id = *( ( u16 * )( ( unsigned char * )pci_cfg +
161 GET_OFFSET_PCICONF(index) ) );
163 logStats( hw_stats,device_id );
175 bufferSize = GET_OFFSET_PCICONF(XGE_COUNT_PCICONF -1) + 8;
177 pci_cfg = (void *) malloc(bufferSize);
180 printf("Allocating memory for pci_cfg failed\n");
184 pAccess = (char *)pci_cfg;
185 *pAccess = XGE_QUERY_PCICONF;
186 ifreqp.ifr_data = (caddr_t)pci_cfg;
188 if(ioctl(sockfd, SIOCGPRIVATE_0, &ifreqp) < 0)
190 printf("Getting pci configuration space failed\n");
195 logPciConf( pci_cfg );
206 bufferSize = XGE_COUNT_DEVCONF * sizeof(int);
208 device_cfg = (void *) malloc(bufferSize);
211 printf("Allocating memory for device_cfg failed\n");
214 pAccess = (char *)device_cfg;
215 *pAccess = XGE_QUERY_DEVCONF;
216 ifreqp.ifr_data = (caddr_t)device_cfg;
218 if(ioctl(sockfd, SIOCGPRIVATE_0, &ifreqp) < 0)
220 printf("Getting Device Configuration failed\n");
225 logDevConf( device_cfg );
235 buf_mode = (void *) malloc(sizeof(int));
238 printf("Allocating memory for Buffer mode parameter failed\n");
242 pAccess = (char *)buf_mode;
243 *pAccess = XGE_QUERY_BUFFER_MODE;
244 ifreqp.ifr_data = (void *)buf_mode;
246 if(ioctl(sockfd, SIOCGPRIVATE_0, &ifreqp) < 0)
248 printf("Getting Buffer Mode failed\n");
252 printf("Buffer Mode is %d\n", *ifreqp.ifr_data);
259 changeBufMode(char *bufmode)
263 pAccess = (char *)malloc(sizeof(char));
266 *pAccess = XGE_SET_BUFFER_MODE_1;
267 }else if (*bufmode == '2'){
268 *pAccess = XGE_SET_BUFFER_MODE_2;
269 }else if (*bufmode == '3'){
270 *pAccess = XGE_SET_BUFFER_MODE_3;
271 }else if (*bufmode == '5'){
272 *pAccess = XGE_SET_BUFFER_MODE_5;
274 printf("Invalid Buffer mode\n");
278 ifreqp.ifr_data = (char *)pAccess;
279 if( ioctl( sockfd, SIOCGPRIVATE_0, &ifreqp ) < 0 )
281 printf( "Changing Buffer Mode Failed\n" );
284 print_msg = (char *)ifreqp.ifr_data;
285 if(*print_msg == 'Y')
286 printf("Requested buffer mode was already enabled\n");
287 else if(*print_msg == 'N')
288 printf("Requested buffer mode is not implemented OR\nDynamic buffer changing is not supported in this driver\n");
289 else if(*print_msg == 'C')
290 printf("Buffer mode changed to %c\n", *bufmode);
302 bufferSize = regInfo[XGE_COUNT_REGS - 1].offset + 8;
304 regBuffer = ( void * ) malloc ( bufferSize );
307 printf( "Allocating memory for register dump failed\n" );
311 ifreqp.ifr_data = ( caddr_t )regBuffer;
312 if( ioctl( sockfd, SIOCGPRIVATE_1, &ifreqp ) < 0 )
314 printf( "Getting register dump failed\n" );
319 logRegInfo( regBuffer );
325 getReadReg(char *opt,char *offst)
329 reg = ( bar0reg_t * ) malloc (sizeof(bar0reg_t));
332 printf( "Allocating memory for reading register failed\n" );
335 strcpy(reg->option, opt);
336 sscanf(offst,"%x",®->offset);
337 ifreqp.ifr_data = ( caddr_t )reg;
338 if( ioctl( sockfd, SIOCGPRIVATE_1, &ifreqp ) < 0 )
340 printf( "Reading register failed\n" );
344 logReadReg ( reg->offset,reg->value );
351 getWriteReg(char *opt,char *offst,char *val)
355 reg = ( bar0reg_t * ) malloc (sizeof(bar0reg_t));
358 printf( "Allocating memory for writing register failed\n" );
361 strcpy(reg->option, opt);
362 sscanf(offst,"%x",®->offset);
363 sscanf(val,"%llx",®->value);
364 ifreqp.ifr_data = ( caddr_t )reg;
365 if( ioctl( sockfd, SIOCGPRIVATE_1, &ifreqp ) < 0 )
367 printf( "Writing register failed\n" );
381 bufferSize = XGE_COUNT_INTRSTAT * sizeof(u32);
383 intr_stat = (void *) malloc(bufferSize);
386 printf("Allocating memory for intr_stat failed\n");
389 pAccess = (char *)intr_stat;
390 *pAccess = XGE_QUERY_INTRSTATS ;
391 ifreqp.ifr_data = (caddr_t)intr_stat;
393 if(ioctl(sockfd, SIOCGPRIVATE_0, &ifreqp) < 0)
395 printf("Getting interrupt statistics failed\n");
399 intr_stat = (char *)ifreqp.ifr_data;
401 logIntrStats( intr_stat );
411 bufferSize = XGE_COUNT_TCODESTAT * sizeof(u32);
413 tcode_stat = (void *) malloc(bufferSize);
416 printf("Allocating memory for tcode_stat failed\n");
419 pAccess = (char *)tcode_stat;
420 *pAccess = XGE_QUERY_TCODE ;
421 ifreqp.ifr_data = (caddr_t)tcode_stat;
422 if(ioctl(sockfd, SIOCGPRIVATE_0, &ifreqp) < 0)
424 printf("Getting tcode statistics failed\n");
428 tcode_stat = (char *)ifreqp.ifr_data;
430 logTcodeStats( tcode_stat );
440 version = ( char * ) malloc ( bufferSize );
443 printf( "Allocating memory for getting driver version failed\n" );
447 *pAccess = XGE_READ_VERSION;
449 ifreqp.ifr_data = ( caddr_t )version;
450 if( ioctl( sockfd, SIOCGPRIVATE_0, &ifreqp ) < 0 )
452 printf( "Getting driver version failed\n" );
456 logDriverInfo(version);