/*
 * Copyright (C) 2004 Intracom S.A.
 * Pantelis Antoniou <panto@intracom.gr>
 */

#include <stdio.h>
#include <stdint.h>
#include <stddef.h>

#include "internal.h"

struct fec {
	uint32_t	addr_low;	/* lower 32 bits of station address	*/
	uint32_t	addr_high;	/* upper 16 bits of station address||0  */
	uint32_t	hash_table_high;/* upper 32-bits of hash table		*/
	uint32_t	hash_table_low;	/* lower 32-bits of hash table		*/
	uint32_t	r_des_start;	/* beginning of Rx descriptor ring	*/
	uint32_t	x_des_start;	/* beginning of Tx descriptor ring	*/
	uint32_t	r_buff_size;	/* Rx buffer size			*/
	uint32_t	res2[9];	/* reserved				*/
	uint32_t	ecntrl;		/* ethernet control register		*/
	uint32_t	ievent;		/* interrupt event register		*/
	uint32_t	imask;		/* interrupt mask register		*/
	uint32_t	ivec;		/* interrupt level and vector status	*/
	uint32_t	r_des_active;	/* Rx ring updated flag			*/
	uint32_t	x_des_active;	/* Tx ring updated flag			*/
	uint32_t	res3[10];	/* reserved				*/
	uint32_t	mii_data;	/* MII data register			*/
	uint32_t	mii_speed;	/* MII speed control register		*/
	uint32_t	res4[17];	/* reserved				*/
	uint32_t	r_bound;	/* end of RAM (read-only)		*/
	uint32_t	r_fstart;	/* Rx FIFO start address		*/
	uint32_t	res5[6];	/* reserved				*/
	uint32_t	x_fstart;	/* Tx FIFO start address		*/
	uint32_t	res6[17];	/* reserved				*/
	uint32_t	fun_code;	/* fec SDMA function code		*/
	uint32_t	res7[3];	/* reserved				*/
	uint32_t	r_cntrl;	/* Rx control register			*/
	uint32_t	r_hash;		/* Rx hash register			*/
	uint32_t	res8[14];	/* reserved				*/
	uint32_t	x_cntrl;	/* Tx control register			*/
	uint32_t	res9[0x1e];	/* reserved				*/
};

#define DUMP_REG(f, x)	fprintf(stdout, \
			"0x%04lx: %-16s 0x%08x\n", \
				(unsigned long)(offsetof(struct fec, x)), \
				#x, f->x)

int fec_8xx_dump_regs(struct ethtool_drvinfo *info maybe_unused,
		      struct ethtool_regs *regs)
{
	struct fec *f = (struct fec *)regs->data;

	fprintf(stdout, "Descriptor Registers\n");
	fprintf(stdout, "---------------------\n");

	DUMP_REG(f, addr_low);
	DUMP_REG(f, addr_high);
	DUMP_REG(f, hash_table_high);
	DUMP_REG(f, hash_table_low);
	DUMP_REG(f, r_des_start);
	DUMP_REG(f, x_des_start);
	DUMP_REG(f, r_buff_size);
	DUMP_REG(f, ecntrl);
	DUMP_REG(f, ievent);
	DUMP_REG(f, imask);
	DUMP_REG(f, ivec);
	DUMP_REG(f, r_des_active);
	DUMP_REG(f, x_des_active);
	DUMP_REG(f, mii_data);
	DUMP_REG(f, mii_speed);
	DUMP_REG(f, r_bound);
	DUMP_REG(f, r_fstart);
	DUMP_REG(f, x_fstart);
	DUMP_REG(f, fun_code);
	DUMP_REG(f, r_cntrl);
	DUMP_REG(f, r_hash);
	DUMP_REG(f, x_cntrl);

	return 0;
}
