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

📄 arlan-proc.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <linux/config.h>#include "arlan.h"#include <linux/sysctl.h>#ifdef CONFIG_PROC_FS/* void enableReceive(struct net_device* dev);*/#define ARLAN_STR_SIZE 	0x2ff0#define DEV_ARLAN_INFO 	1#define DEV_ARLAN 	1#define SARLG(type,var) {\	pos += sprintf(arlan_drive_info+pos, "%s\t=\t0x%x\n", #var, READSHMB(priva->card->var));	\	}#define SARLBN(type,var,nn) {\	pos += sprintf(arlan_drive_info+pos, "%s\t=\t0x",#var);\	for (i=0; i < nn; i++ ) pos += sprintf(arlan_drive_info+pos, "%02x",READSHMB(priva->card->var[i]));\	pos += sprintf(arlan_drive_info+pos, "\n");	\	}#define SARLBNpln(type,var,nn) {\	for (i=0; i < nn; i++ ) pos += sprintf(arlan_drive_info+pos, "%02x",READSHMB(priva->card->var[i]));\	}#define SARLSTR(var,nn) {\	char tmpStr[400];\	int  tmpLn = nn;\	if (nn > 399 ) tmpLn = 399; \	memcpy(tmpStr,(char *) priva->conf->var,tmpLn);\	tmpStr[tmpLn] = 0; \	pos += sprintf(arlan_drive_info+pos, "%s\t=\t%s \n",#var,priva->conf->var);\	}#define SARLUC(var)  	SARLG(u_char, var)#define SARLUCN(var,nn) SARLBN(u_char,var, nn)#define SARLUS(var)	SARLG(u_short, var)#define SARLUSN(var,nn)	SARLBN(u_short,var, nn)#define SARLUI(var)	SARLG(u_int, var)#define SARLUSA(var) {\	u_short tmpVar;\	memcpy(&tmpVar, (short *) priva->conf->var,2); \	pos += sprintf(arlan_drive_info+pos, "%s\t=\t0x%x\n",#var, tmpVar);\}#define SARLUIA(var) {\	u_int tmpVar;\	memcpy(&tmpVar, (int* )priva->conf->var,4); \	pos += sprintf(arlan_drive_info+pos, "%s\t=\t0x%x\n",#var, tmpVar);\}static const char *arlan_diagnostic_info_string(struct net_device *dev){	struct arlan_private *priv = netdev_priv(dev);	volatile struct arlan_shmem __iomem *arlan = priv->card;	u_char diagnosticInfo;	READSHM(diagnosticInfo, arlan->diagnosticInfo, u_char);	switch (diagnosticInfo)	{		case 0xFF:			return "Diagnostic info is OK";		case 0xFE:			return "ERROR EPROM Checksum error ";		case 0xFD:			return "ERROR Local Ram Test Failed ";		case 0xFC:			return "ERROR SCC failure ";		case 0xFB:			return "ERROR BackBone failure ";		case 0xFA:			return "ERROR transceiver not found ";		case 0xF9:			return "ERROR no more address space ";		case 0xF8:			return "ERROR Checksum error  ";		case 0xF7:			return "ERROR Missing SS Code";		case 0xF6:			return "ERROR Invalid config format";		case 0xF5:			return "ERROR Reserved errorcode F5";		case 0xF4:			return "ERROR Invalid spreading code/channel number";		case 0xF3:			return "ERROR Load Code Error";		case 0xF2:			return "ERROR Reserver errorcode F2 ";		case 0xF1:			return "ERROR Invalid command receivec by LAN card ";		case 0xF0:			return "ERROR Invalid parameter found in command ";		case 0xEF:			return "ERROR On-chip timer failure ";		case 0xEE:			return "ERROR T410 timer failure ";		case 0xED:			return "ERROR Too Many TxEnable commands ";		case 0xEC:			return "ERROR EEPROM error on radio module ";		default:			return "ERROR unknown Diagnostic info reply code ";	  }}static const char *arlan_hardware_type_string(struct net_device *dev){	u_char hardwareType;	struct arlan_private *priv = netdev_priv(dev);	volatile struct arlan_shmem __iomem *arlan = priv->card;	READSHM(hardwareType, arlan->hardwareType, u_char);	switch (hardwareType)	{		case 0x00:			return "type A450";		case 0x01:			return "type A650 ";		case 0x04:			return "type TMA coproc";		case 0x0D:			return "type A650E ";		case 0x18:			return "type TMA coproc Australian";		case 0x19:			return "type A650A ";		case 0x26:			return "type TMA coproc European";		case 0x2E:			return "type A655 ";		case 0x2F:			return "type A655A ";		case 0x30:			return "type A655E ";		case 0x0B:			return "type A670 ";		case 0x0C:			return "type A670E ";		case 0x2D:			return "type A670A ";		case 0x0F:			return "type A411T";		case 0x16:			return "type A411TA";		case 0x1B:			return "type A440T";		case 0x1C:			return "type A412T";		case 0x1E:			return "type A412TA";		case 0x22:			return "type A411TE";		case 0x24:			return "type A412TE";		case 0x27:			return "type A671T ";		case 0x29:			return "type A671TA ";		case 0x2B:			return "type A671TE ";		case 0x31:			return "type A415T ";		case 0x33:			return "type A415TA ";		case 0x35:			return "type A415TE ";		case 0x37:			return "type A672";		case 0x39:			return "type A672A ";		case 0x3B:			return "type A672T";		case 0x6B:			return "type IC2200";		default:			return "type A672T";	}}#ifdef ARLAN_DEBUGGINGstatic void arlan_print_diagnostic_info(struct net_device *dev){	int i;	u_char diagnosticInfo;	u_short diagnosticOffset;	u_char hardwareType;	struct arlan_private *priv = netdev_priv(dev);	volatile struct arlan_shmem __iomem *arlan = priv->card;	//  ARLAN_DEBUG_ENTRY("arlan_print_diagnostic_info");	if (READSHMB(arlan->configuredStatusFlag) == 0)		printk("Arlan: Card NOT configured\n");	else		printk("Arlan: Card is configured\n");	READSHM(diagnosticInfo, arlan->diagnosticInfo, u_char);	READSHM(diagnosticOffset, arlan->diagnosticOffset, u_short);	printk(KERN_INFO "%s\n", arlan_diagnostic_info_string(dev));	if (diagnosticInfo != 0xff)		printk("%s arlan: Diagnostic Offset %d \n", dev->name, diagnosticOffset);	printk("arlan: LAN CODE ID = ");	for (i = 0; i < 6; i++)		DEBUGSHM(1, "%03d:", arlan->lanCardNodeId[i], u_char);	printk("\n");	printk("arlan: Arlan BroadCast address  = ");	for (i = 0; i < 6; i++)		DEBUGSHM(1, "%03d:", arlan->broadcastAddress[i], u_char);	printk("\n");	READSHM(hardwareType, arlan->hardwareType, u_char);	printk(KERN_INFO "%s\n", arlan_hardware_type_string(dev));	DEBUGSHM(1, "arlan: channelNumber=%d\n", arlan->channelNumber, u_char);	DEBUGSHM(1, "arlan: channelSet=%d\n", arlan->channelSet, u_char);	DEBUGSHM(1, "arlan: spreadingCode=%d\n", arlan->spreadingCode, u_char);	DEBUGSHM(1, "arlan: radioNodeId=%d\n", arlan->radioNodeId, u_short);	DEBUGSHM(1, "arlan: SID	=%d\n", arlan->SID, u_short);	DEBUGSHM(1, "arlan: rxOffset=%d\n", arlan->rxOffset, u_short);	DEBUGSHM(1, "arlan: registration mode is %d\n", arlan->registrationMode, u_char);	printk("arlan: name= ");	IFDEBUG(1)		for (i = 0; i < 16; i++)	{		char c;		READSHM(c, arlan->name[i], char);		if (c)			printk("%c", c);	}	printk("\n");//   ARLAN_DEBUG_EXIT("arlan_print_diagnostic_info");}/******************************		TEST 	MEMORY	**************/static int arlan_hw_test_memory(struct net_device *dev){	u_char *ptr;	int i;	int memlen = sizeof(struct arlan_shmem) - 0xF;	/* avoid control register */	volatile char *arlan_mem = (char *) (dev->mem_start);	struct arlan_private *priv = netdev_priv(dev);	volatile struct arlan_shmem __iomem *arlan = priv->card;	char pattern;	ptr = NULL;	/* hold card in reset state */	setHardwareReset(dev);	/* test memory */	pattern = 0;	for (i = 0; i < memlen; i++)		WRITESHM(arlan_mem[i], ((u_char) pattern++), u_char);	pattern = 0;	for (i = 0; i < memlen; i++)	{		char res;		READSHM(res, arlan_mem[i], char);		if (res != pattern++)		{			printk(KERN_ERR "Arlan driver memory test 1 failed \n");			return -1;		}	}	pattern = 0;	for (i = 0; i < memlen; i++)		WRITESHM(arlan_mem[i], ~(pattern++), char);	pattern = 0;	for (i = 0; i < memlen; i++)	{		char res;		READSHM(res, arlan_mem[i], char);		if (res != ~(pattern++))		{			printk(KERN_ERR "Arlan driver memory test 2 failed \n");			return -1;		}	}	/* zero memory */	for (i = 0; i < memlen; i++)		WRITESHM(arlan_mem[i], 0x00, char);	IFDEBUG(1) printk(KERN_INFO "Arlan: memory tests ok\n");	/* set reset flag and then release reset */	WRITESHM(arlan->resetFlag, 0xff, u_char);	clearChannelAttention(dev);	clearHardwareReset(dev);	/* wait for reset flag to become zero, we'll wait for two seconds */	if (arlan_command(dev, ARLAN_COMMAND_LONG_WAIT_NOW))	{		printk(KERN_ERR "%s arlan: failed to come back from memory test\n", dev->name);		return -1;	}	return 0;}static int arlan_setup_card_by_book(struct net_device *dev){	u_char irqLevel, configuredStatusFlag;	struct arlan_private *priv = netdev_priv(dev);	volatile struct arlan_shmem __iomem *arlan = priv->card;//	ARLAN_DEBUG_ENTRY("arlan_setup_card");	READSHM(configuredStatusFlag, arlan->configuredStatusFlag, u_char);	IFDEBUG(10)	if (configuredStatusFlag != 0)		IFDEBUG(10) printk("arlan: CARD IS CONFIGURED\n");	else		IFDEBUG(10) printk("arlan: card is NOT configured\n");	if (testMemory || (READSHMB(arlan->diagnosticInfo) != 0xff))		if (arlan_hw_test_memory(dev))			return -1;	DEBUGSHM(4, "arlan configuredStatus = %d \n", arlan->configuredStatusFlag, u_char);	DEBUGSHM(4, "arlan driver diagnostic: 0x%2x\n", arlan->diagnosticInfo, u_char);	/* issue nop command - no interrupt */	arlan_command(dev, ARLAN_COMMAND_NOOP);	if (arlan_command(dev, ARLAN_COMMAND_WAIT_NOW) != 0)		return -1;	IFDEBUG(50) printk("1st Noop successfully executed !!\n");	/* try to turn on the arlan interrupts */	clearClearInterrupt(dev);	setClearInterrupt(dev);	setInterruptEnable(dev);	/* issue nop command - with interrupt */	arlan_command(dev, ARLAN_COMMAND_NOOPINT);	if (arlan_command(dev, ARLAN_COMMAND_WAIT_NOW) != 0)		return -1;	IFDEBUG(50) printk("2nd Noop successfully executed !!\n");	READSHM(irqLevel, arlan->irqLevel, u_char)		if (irqLevel != dev->irq)	{		IFDEBUG(1) printk(KERN_WARNING "arlan dip switches set irq to %d\n", irqLevel);		printk(KERN_WARNING "device driver irq set to %d - does not match\n", dev->irq);		dev->irq = irqLevel;	}	else		IFDEBUG(2) printk("irq level is OK\n");	IFDEBUG(3) arlan_print_diagnostic_info(dev);	arlan_command(dev, ARLAN_COMMAND_CONF);	READSHM(configuredStatusFlag, arlan->configuredStatusFlag, u_char);	if (configuredStatusFlag == 0)	{		printk(KERN_WARNING "arlan configure failed\n");		return -1;	}	arlan_command(dev, ARLAN_COMMAND_LONG_WAIT_NOW);	arlan_command(dev, ARLAN_COMMAND_RX);	arlan_command(dev, ARLAN_COMMAND_LONG_WAIT_NOW);	printk(KERN_NOTICE "%s: arlan driver version %s loaded\n",	       dev->name, arlan_version);//	ARLAN_DEBUG_EXIT("arlan_setup_card");	return 0;		/* no errors */}#endif#ifdef ARLAN_PROC_INTERFACE#ifdef ARLAN_PROC_SHM_DUMPstatic char arlan_drive_info[ARLAN_STR_SIZE] = "A655\n\0";static int arlan_sysctl_info(ctl_table * ctl, int write, struct file *filp,		      void __user *buffer, size_t * lenp, loff_t *ppos){	int i;	int retv, pos, devnum;	struct arlan_private *priva = NULL;	struct net_device *dev;	pos = 0;	if (write)	{		printk("wrirte: ");		for (i = 0; i < 100; i++)			printk("adi %x \n", arlan_drive_info[i]);	}	if (ctl->procname == NULL || arlan_drive_info == NULL)	{		printk(KERN_WARNING " procname is NULL in sysctl_table or arlan_drive_info is NULL \n at arlan module\n ");		return -1;	}	devnum = ctl->procname[5] - '0';	if (devnum < 0 || devnum > MAX_ARLANS - 1)	{		printk(KERN_WARNING "too strange devnum in procfs parse\n ");		return -1;	}	else if (arlan_device[devnum] == NULL)	{		if (ctl->procname)			pos += sprintf(arlan_drive_info + pos, "\t%s\n\n", ctl->procname);		pos += sprintf(arlan_drive_info + pos, "No device found here \n");		goto final;	}	else		priva = arlan_device[devnum]->priv;	if (priva == NULL)	{		printk(KERN_WARNING " Could not find the device private in arlan procsys, bad\n ");		return -1;	}	dev = arlan_device[devnum];	memcpy_fromio(priva->conf, priva->card, sizeof(struct arlan_shmem));	pos = sprintf(arlan_drive_info, "Arlan  info \n");	/* Header Signature */	SARLSTR(textRegion, 48);	SARLUC(resetFlag);	pos += sprintf(arlan_drive_info + pos, "diagnosticInfo\t=\t%s \n", arlan_diagnostic_info_string(dev));	SARLUC(diagnosticInfo);	SARLUS(diagnosticOffset);	SARLUCN(_1, 12);	SARLUCN(lanCardNodeId, 6);	SARLUCN(broadcastAddress, 6);	pos += sprintf(arlan_drive_info + pos, "hardwareType =\t  %s \n", arlan_hardware_type_string(dev));	SARLUC(hardwareType);	SARLUC(majorHardwareVersion);	SARLUC(minorHardwareVersion);	SARLUC(radioModule);	SARLUC(defaultChannelSet);	SARLUCN(_2, 47);	/* Control/Status Block - 0x0080 */	SARLUC(interruptInProgress);	SARLUC(cntrlRegImage);	SARLUCN(_3, 14);	SARLUC(commandByte);	SARLUCN(commandParameter, 15);	/* Receive Status - 0x00a0 */	SARLUC(rxStatus);	SARLUC(rxFrmType);	SARLUS(rxOffset);	SARLUS(rxLength);	SARLUCN(rxSrc, 6);	SARLUC(rxBroadcastFlag);	SARLUC(rxQuality);	SARLUC(scrambled);	SARLUCN(_4, 1);	/* Transmit Status - 0x00b0 */	SARLUC(txStatus);	SARLUC(txAckQuality);	SARLUC(numRetries);	SARLUCN(_5, 14);	SARLUCN(registeredRouter, 6);	SARLUCN(backboneRouter, 6);	SARLUC(registrationStatus);	SARLUC(configuredStatusFlag);	SARLUCN(_6, 1);	SARLUCN(ultimateDestAddress, 6);	SARLUCN(immedDestAddress, 6);	SARLUCN(immedSrcAddress, 6);	SARLUS(rxSequenceNumber);	SARLUC(assignedLocaltalkAddress);	SARLUCN(_7, 27);	/* System Parameter Block */	/* - Driver Parameters (Novell Specific) */	SARLUS(txTimeout);	SARLUS(transportTime);	SARLUCN(_8, 4);	/* - Configuration Parameters */	SARLUC(irqLevel);	SARLUC(spreadingCode);	SARLUC(channelSet);	SARLUC(channelNumber);	SARLUS(radioNodeId);	SARLUCN(_9, 2);	SARLUC(scramblingDisable);	SARLUC(radioType);	SARLUS(routerId);	SARLUCN(_10, 9);	SARLUC(txAttenuation);	SARLUIA(systemId);	SARLUS(globalChecksum);	SARLUCN(_11, 4);	SARLUS(maxDatagramSize);	SARLUS(maxFrameSize);	SARLUC(maxRetries);	SARLUC(receiveMode);	SARLUC(priority);	SARLUC(rootOrRepeater);	SARLUCN(specifiedRouter, 6);	SARLUS(fastPollPeriod);	SARLUC(pollDecay);	SARLUSA(fastPollDelay);	SARLUC(arlThreshold);	SARLUC(arlDecay);	SARLUCN(_12, 1);	SARLUS(specRouterTimeout);	SARLUCN(_13, 5);	/* Scrambled Area */	SARLUIA(SID);	SARLUCN(encryptionKey, 12);	SARLUIA(_14);	SARLUSA(waitTime);	SARLUSA(lParameter);	SARLUCN(_15, 3);	SARLUS(headerSize);	SARLUS(sectionChecksum);	SARLUC(registrationMode);	SARLUC(registrationFill);	SARLUS(pollPeriod);	SARLUS(refreshPeriod);	SARLSTR(name, 16);	SARLUCN(NID, 6);	SARLUC(localTalkAddress);	SARLUC(codeFormat);	SARLUC(numChannels);	SARLUC(channel1);	SARLUC(channel2);	SARLUC(channel3);	SARLUC(channel4);	SARLUCN(SSCode, 59);/*      SARLUCN( _16, 0x140); */	/* Statistics Block - 0x0300 */	SARLUC(hostcpuLock);	SARLUC(lancpuLock);	SARLUCN(resetTime, 18);	SARLUIA(numDatagramsTransmitted);	SARLUIA(numReTransmissions);	SARLUIA(numFramesDiscarded);	SARLUIA(numDatagramsReceived);	SARLUIA(numDuplicateReceivedFrames);	SARLUIA(numDatagramsDiscarded);	SARLUS(maxNumReTransmitDatagram);	SARLUS(maxNumReTransmitFrames);	SARLUS(maxNumConsecutiveDuplicateFrames);	/* misaligned here so we have to go to characters */	SARLUIA(numBytesTransmitted);	SARLUIA(numBytesReceived);	SARLUIA(numCRCErrors);	SARLUIA(numLengthErrors);	SARLUIA(numAbortErrors);	SARLUIA(numTXUnderruns);	SARLUIA(numRXOverruns);	SARLUIA(numHoldOffs);	SARLUIA(numFramesTransmitted);	SARLUIA(numFramesReceived);	SARLUIA(numReceiveFramesLost);	SARLUIA(numRXBufferOverflows);	SARLUIA(numFramesDiscardedAddrMismatch);	SARLUIA(numFramesDiscardedSIDMismatch);	SARLUIA(numPollsTransmistted);	SARLUIA(numPollAcknowledges);	SARLUIA(numStatusTimeouts);	SARLUIA(numNACKReceived);	SARLUS(auxCmd);	SARLUCN(dumpPtr, 4);	SARLUC(dumpVal);	SARLUC(wireTest);		/* next 4 seems too long for procfs, over single page ?	SARLUCN( _17, 0x86);	SARLUCN( txBuffer, 0x800);	SARLUCN( rxBuffer,  0x800); 	SARLUCN( _18, 0x0bff);	 */	pos += sprintf(arlan_drive_info + pos, "rxRing\t=\t0x");	for (i = 0; i < 0x50; i++)		pos += sprintf(arlan_drive_info + pos, "%02x", ((char *) priva->conf)[priva->conf->rxOffset + i]);	pos += sprintf(arlan_drive_info + pos, "\n");	SARLUC(configStatus);	SARLUC(_22);	SARLUC(progIOCtrl);	SARLUC(shareMBase);	SARLUC(controlRegister);	pos += sprintf(arlan_drive_info + pos, " total %d chars\n", pos);	if (ctl)		if (ctl->procname)			pos += sprintf(arlan_drive_info + pos, " driver name : %s\n", ctl->procname);final:	*lenp = pos;	if (!write)

⌨️ 快捷键说明

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