#include <asm/bitops.h>
#include "/usr/src/linux/net/inet/dev.h"
#include "pocket.h"

#ifndef __KERNEL__
#define printk printf
#endif

static char version[] =
"ATP RAM test for Linux, written 1993 by Donald Becker.\n";
static unsigned short *ram_test_pattern = (unsigned short*) version;

int ram_test_0(short ioaddr, int num_words)
{
	int i;
	int failedp = 0;

	write_nibble(ioaddr, CMR2, CMR2_RAMTEST);
	/* Disable then re-enable Tx and Rx to reset pointers. */
	write_nibble(ioaddr, CMR1_h, HNib);
	write_nibble(ioaddr, CMR1_h, HNib+3);
	outb(EOC+MAR, ioaddr + DATA);
	outb(WrAddr+MAR, ioaddr + DATA);
	
	for (i = 0; i < num_words; i++) {
		write_word_to_DRAM(ioaddr, ram_test_pattern[i % sizeof(version)]);
	}
	outb(WrAddr+MAR+EOC, ioaddr);

	/* Disable then re-enable Tx and Rx to reset pointers. */
	write_nibble(ioaddr, CMR1_h, HNib);
	write_nibble(ioaddr, CMR1_h, HNib+3);
	outb(Ctrl_LNibRead, ioaddr + CONTROL);
	outb(EOC+MAR, ioaddr + DATA);
	outb(RdAddr+MAR+HNib, ioaddr + DATA);
	
	printf(" Status  is %02x.\n", inb(ioaddr + STATUS));
	for (i = -1; i < num_words; i++) {
		ushort result = read_byteA1(ioaddr, MAR);
		result |= read_byteA1(ioaddr, MAR) << 8;
		if (i >= 0  &&  result != ram_test_pattern[i % sizeof(version)]) {
			printk("RAM test failed at location %d, %04x vs. %04x (read vs. wrote).\n",
				   i, result, ram_test_pattern[i % sizeof(version)]);
			failedp++;
			if (failedp > 10)
				break;
		}
	}
	read_end(ioaddr + CONTROL, MAR+HNib);
	outb(Ctrl_SelData, ioaddr + CONTROL);
	write_nibble(ioaddr, CMR1_h, HNib);
	write_nibble(ioaddr, CMR2, CMR2_NULL);
	printk("RAM test 0 %s.\n", failedp ? "failed" : "passed!");

	return failedp;
}

/*
 * Local variables:
 * tab-width: 4
 * End:
 */
