⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rfgain.c

📁 Atheros wifi driver source code
💻 C
字号:
/* * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting * Copyright (c) 2002-2005 Atheros Communications, Inc. * All rights reserved. * * $Id: rfgain.c,v 1.1.1.1 2006/09/12 03:45:22 steven Exp $ */#include "diag.h"#include <getopt.h>#include "ah.h"#include "ah_devid.h"#include "ah_internal.h"#undef AH_PRIVATE		/* XXX twist defs in ar5212.h to suit */#define	AH_PRIVATE(ah)	(ah)#include "ar5212/ar5212.h"#include "ar5212/ar5212reg.h"struct rfstats {	GAIN_VALUES gv;	GAIN_OPTIMIZATION_STEP step;};struct rfhandler {	struct statshandler sh;		/* base class */	int	s;	struct ath_diag atd;	struct rfstats cur;	HAL_REVS revs;};static voidrf_getstats(struct statshandler *sh, void *arg){	struct rfhandler *rh = (struct rfhandler *)sh;	struct rfstats *stats = arg;	rh->atd.ad_id = HAL_DIAG_RFGAIN;	rh->atd.ad_out_data = (caddr_t) &stats->gv;	rh->atd.ad_out_size = sizeof(stats->gv);	if (ioctl(rh->s, SIOCGATHDIAG, &rh->atd) < 0)		err(1, rh->atd.ad_name);	rh->atd.ad_id = HAL_DIAG_RFGAIN_CURSTEP;	rh->atd.ad_out_data = (caddr_t) &stats->step;	rh->atd.ad_out_size = sizeof(stats->step);	if (ioctl(rh->s, SIOCGATHDIAG, &rh->atd) < 0)		err(1, rh->atd.ad_name);	/* XXX override kernel address */	stats->gv.currStep = &stats->step;}static voidrf_update(struct statshandler *sh){}static voidrfDumpRfgain(struct statshandler *sh, FILE *fd){	struct rfhandler *rh = (struct rfhandler *)sh;	GAIN_VALUES *gv = sh->cur;	fprintf(fd, "currStepNum %d currGain %d targetGain %d\n",		gv->currStepNum , gv->currGain , gv->targetGain);	fprintf(fd, "gainFCorrection %d loTrig %d hiTrig %d\n",		gv->gainFCorrection, gv->loTrig, gv->hiTrig);	fprintf(fd, "[Cur] StepName: %s StepGain: %2d ",		gv->currStep->stepName , gv->currStep->stepGain);	if ((rh->revs.ah_analog5GhzRev&0xf0) >= AR_RAD5112_SREV_MAJOR) {		fprintf(fd, "rf_mixgain_ovr %d rf_pwd138 %d "			"rf_pwd137 %d rf_pwd136 %d\n\t"			"rf_pwd132 %d rf_pwd131 %d rf_pwd130 %d\n"			, gv->currStep->paramVal[0]			, gv->currStep->paramVal[1]			, gv->currStep->paramVal[2]			, gv->currStep->paramVal[3]			, gv->currStep->paramVal[4]			, gv->currStep->paramVal[5]			, gv->currStep->paramVal[6]		);	} else {		fprintf(fd, "bb_tx_clip %d  rf_pwd_90 %d  "			"rf_pwd_84 %d  rf_rfgainsel %d\n"			, gv->currStep->paramVal[0]			, gv->currStep->paramVal[1]			, gv->currStep->paramVal[2]			, gv->currStep->paramVal[3]		);	}}static voidrf_printbanner(struct statshandler *sh, FILE *fd){	struct rfhandler *rh = (struct rfhandler *)sh;	fprintf(fd, "S# NAME CGN TGN SGN FCOR LO HI");	if ((rh->revs.ah_analog5GhzRev&0xf0) >= AR_RAD5112_SREV_MAJOR) {		fprintf(fd, " MIX P138 P137 P136 P132 P131 P130\n");	} else {		fprintf(fd, " TXCLIP P90 P84 GAINSEL\n");	}}static voidrf_reportcur(struct statshandler *sh, FILE *fd){	struct rfhandler *rh = (struct rfhandler *)sh;	GAIN_VALUES *gv = sh->cur;	fprintf(fd, "%2d %4s %3d %3d %3d %4d %2d %2d"		, gv->currStepNum		, gv->currStep->stepName		, gv->currGain		, gv->currStep->stepGain		, gv->targetGain		, gv->gainFCorrection		, gv->loTrig		, gv->hiTrig	);	if ((rh->revs.ah_analog5GhzRev&0xf0) >= AR_RAD5112_SREV_MAJOR) {		fprintf(fd, " %3d %4d %4d %4d %4d %4d %4d"			, gv->currStep->paramVal[0]			, gv->currStep->paramVal[1]			, gv->currStep->paramVal[2]			, gv->currStep->paramVal[3]			, gv->currStep->paramVal[4]			, gv->currStep->paramVal[5]			, gv->currStep->paramVal[6]		);	} else {		fprintf(fd, " %6d %3d %3d %7d"			, gv->currStep->paramVal[0]			, gv->currStep->paramVal[1]			, gv->currStep->paramVal[2]			, gv->currStep->paramVal[3]		);	}}static voidprintRevs(FILE *fd, const HAL_REVS *revs){	const char *rfbackend;	fprintf(fd, "PCI device id 0x%x subvendor id 0x%x\n",		revs->ah_devid, revs->ah_subvendorid);	fprintf(fd, "mac %d.%d phy %d.%d"		, revs->ah_macVersion, revs->ah_macRev		, revs->ah_phyRev >> 4, revs->ah_phyRev & 0xf	);	rfbackend = IS_2413(revs) ? "2413" : IS_5112(revs) ? "5112" : "5111";	if (revs->ah_analog5GhzRev && revs->ah_analog2GhzRev)		fprintf(fd, " 5ghz radio %d.%d 2ghz radio %d.%d (%s)\n"			, revs->ah_analog5GhzRev >> 4			, revs->ah_analog5GhzRev & 0xf			, revs->ah_analog2GhzRev >> 4			, revs->ah_analog2GhzRev & 0xf			, rfbackend		);	else		fprintf(fd, " radio %d.%d (%s)\n"			, revs->ah_analog5GhzRev >> 4			, revs->ah_analog5GhzRev & 0xf			, rfbackend		);}static voidusage(const char *progname){	fprintf(stderr, "usage: %s [-v] [-i dev]\n", progname);	exit(1);}intmain(int argc, char *argv[]){	struct rfhandler rf;	int verbose = 0, c;	memset(&rf, 0, sizeof(rf));	rf.s = socket(AF_INET, SOCK_DGRAM, 0);	if (rf.s < 0)		err(1, "socket");	strncpy(rf.atd.ad_name, ATH_DEFAULT, sizeof (rf.atd.ad_name));	while ((c = getopt(argc, argv, "i:v")) != -1)		switch (c) {		case 'i':			strncpy(rf.atd.ad_name, optarg, sizeof(rf.atd.ad_name));			break;		case 'v':			verbose++;			break;		default:			usage(argv[0]);		}	argc -= optind, argv += optind;	rf.atd.ad_id = HAL_DIAG_REVS;	rf.atd.ad_out_data = (caddr_t) &rf.revs;	rf.atd.ad_out_size = sizeof(rf.revs);	if (ioctl(rf.s, SIOCGATHDIAG, &rf.atd) < 0)		err(1, rf.atd.ad_name);	if (verbose)		printRevs(stdout, &rf.revs);	switch (rf.revs.ah_devid) {	case AR5210_PROD:	case AR5210_DEFAULT:		printf("No RFGAIN settings for a 5210\n");		exit(0);	}	rf.sh.total = &rf.cur.gv;	rf.sh.cur = &rf.cur.gv;	rf.sh.getstats = rf_getstats;	rf.sh.update = rf_update;	rf.sh.printbanner = rf_printbanner;	rf.sh.reportdelta = rf_reportcur;	rf.sh.reporttotal = rf_reportcur;	rf.sh.reportverbose = rfDumpRfgain;	if (argc > 1) {		rf.sh.interval = strtoul(argv[1], NULL, 0);		runstats(stdout, &rf.sh);		/*NOTREACHED*/	} else {		reportstats(stdout, &rf.sh);	}	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -