patch-2.4.19 linux-2.4.19/drivers/net/wan/8253x/amcc5920.c

Next file: linux-2.4.19/drivers/net/wan/8253x/crc32.c
Previous file: linux-2.4.19/drivers/net/wan/8253x/Reg9050.h
Back to the patch index
Back to the overall index

diff -urN linux-2.4.18/drivers/net/wan/8253x/amcc5920.c linux-2.4.19/drivers/net/wan/8253x/amcc5920.c
@@ -0,0 +1,92 @@
+/* -*- linux-c -*- */
+/*
+ * Copyright (C) 2001 By Joachim Martillo, Telford Tools, Inc.
+ *
+ * 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.
+ *
+ */
+				/* This file is linked in, but I am
+				   not sure there is ever any
+				   reason directly to read the
+				   serial eprom on the multichannel
+				   server host card. */
+
+/* We handle PCI devices */
+#include <linux/pci.h>      
+
+/* We need to use ioremap */ 
+#include <asm/io.h>
+
+#include <linux/delay.h>
+
+#include "8253xmcs.h"
+#include "8253xctl.h"
+
+/* read a byte out of the serial eeprom/nvram by means of
+ * 16 short commands */
+
+static unsigned int amcc_nvram_breadw(unsigned char *bridge_space, 
+				      unsigned short address,
+				      unsigned char *value)
+{
+	unsigned int count;
+	unsigned rhr;
+	
+	for(count = 0; count < 20000; ++count)
+	{
+		rhr = readl(bridge_space + AMCC_RCR);
+		if((rhr & AMCC_NVRBUSY) == 0)
+		{
+			break;
+		}
+		udelay(1);
+	}
+	if(count >= 20000)
+	{
+		return FALSE;
+	}
+	rhr = AMCC_NVRWRLA | ((address & 0x00FF) << 16);
+	writel(rhr, bridge_space + AMCC_RCR);
+	rhr = AMCC_NVRWRHA | ((address & 0xFF00) << 8);
+	writel(rhr, bridge_space + AMCC_RCR);
+	writel(AMCC_NVRRDDB, bridge_space + AMCC_RCR);
+	for(count = 0; count < 20000; ++count)
+	{
+		rhr = readl(bridge_space + AMCC_RCR);
+		if((rhr & AMCC_NVRBUSY) == 0)
+		{
+			break;
+		}
+		udelay(1);
+	}
+	if(count >= 20000)
+	{
+		return FALSE;
+	}
+	if(rhr & AMCC_NVRACCFAIL)
+	{
+		return FALSE;
+	}
+	*value = (unsigned char) (rhr >> 16);
+	return TRUE;
+}
+
+/* read the whole serial eeprom from the host card */
+
+unsigned int amcc_read_nvram(unsigned char* buffer, unsigned length, unsigned char *bridge_space)
+{
+	unsigned int count;
+	length <<= 1;			/* covert words to bytes */
+	
+	for(count = 0; count < length; ++count)
+	{
+		if(amcc_nvram_breadw(bridge_space, count, &buffer[count]) == FALSE)
+		{
+			return FALSE;
+		}
+	}
+	return TRUE;
+}

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)