200 lines
5.8 KiB
C
200 lines
5.8 KiB
C
/* Copyright (c) 2015 VMware Inc.*/
|
|
#include <stdio.h>
|
|
#include "internal.h"
|
|
|
|
int
|
|
vmxnet3_dump_regs(struct ethtool_drvinfo *info maybe_unused,
|
|
struct ethtool_regs *regs)
|
|
{
|
|
u32 *regs_buff = (u32 *)regs->data;
|
|
u32 version = regs->version;
|
|
int i = 0, j = 0, cnt;
|
|
|
|
if (version != 2)
|
|
return -1;
|
|
|
|
fprintf(stdout, "Control Registers\n");
|
|
fprintf(stdout, "=================\n");
|
|
|
|
fprintf(stdout,
|
|
" VRRS (Vmxnet3 Revision Report and Selection) 0x%x\n",
|
|
regs_buff[j++]);
|
|
fprintf(stdout,
|
|
" UVRS (UPT Version Report and Selection) 0x%x\n",
|
|
regs_buff[j++]);
|
|
fprintf(stdout,
|
|
" DSA (Driver Shared Address) 0x%08x%08x\n",
|
|
regs_buff[j+1], regs_buff[j]);
|
|
j += 2;
|
|
fprintf(stdout,
|
|
" CMD (Command Register) 0x%x\n",
|
|
regs_buff[j++]);
|
|
fprintf(stdout,
|
|
" MAC (Media Access Control address) %02x:%02x:%02x:%02x:%02x:%02x\n",
|
|
regs_buff[j] & 0xff,
|
|
(regs_buff[j] >> 8) & 0xff,
|
|
(regs_buff[j] >> 16) & 0xff,
|
|
(regs_buff[j] >> 24) & 0xff,
|
|
regs_buff[j + 1] & 0xff,
|
|
(regs_buff[j + 1] >> 8) & 0xff);
|
|
j += 2;
|
|
fprintf(stdout,
|
|
" ICR (Interrupt Cause Register) 0x%x\n",
|
|
regs_buff[j++]);
|
|
fprintf(stdout,
|
|
" ECR (Event Cause Register) 0x%x\n",
|
|
regs_buff[j++]);
|
|
|
|
fprintf(stdout, "Datapath Registers\n");
|
|
fprintf(stdout, "==================\n");
|
|
|
|
/* Interrupt Mask Registers */
|
|
cnt = regs_buff[j++];
|
|
for (i = 0; i < cnt; i++) {
|
|
fprintf(stdout,
|
|
" IMR (Interrupt Mask Register) %d 0x%x\n",
|
|
i, regs_buff[j++]);
|
|
}
|
|
|
|
/* Transmit Queue Registers */
|
|
cnt = regs_buff[j++];
|
|
for (i = 0; i < cnt; i++) {
|
|
fprintf(stdout, " Transmit Queue %d\n", i);
|
|
fprintf(stdout, " ----------------\n");
|
|
fprintf(stdout,
|
|
" TXPROD (Transmit Ring Producer Register) 0x%x\n",
|
|
regs_buff[j++]);
|
|
fprintf(stdout,
|
|
" Transmit Ring\n");
|
|
fprintf(stdout,
|
|
" Base Address 0x%08x%08x\n",
|
|
regs_buff[j+1], regs_buff[j]);
|
|
j += 2;
|
|
fprintf(stdout,
|
|
" Size %u\n",
|
|
regs_buff[j++]);
|
|
fprintf(stdout,
|
|
" next2fill %u\n",
|
|
regs_buff[j++]);
|
|
fprintf(stdout,
|
|
" next2comp %u\n",
|
|
regs_buff[j++]);
|
|
fprintf(stdout,
|
|
" gen %u\n",
|
|
regs_buff[j++]);
|
|
|
|
fprintf(stdout,
|
|
" Transmit Data Ring\n");
|
|
fprintf(stdout,
|
|
" Base Address 0x%08x%08x\n",
|
|
regs_buff[j+1], regs_buff[j]);
|
|
j += 2;
|
|
fprintf(stdout,
|
|
" Size %u\n",
|
|
regs_buff[j++]);
|
|
fprintf(stdout,
|
|
" Buffer Size %u\n",
|
|
regs_buff[j++]);
|
|
|
|
fprintf(stdout,
|
|
" Transmit Completion Ring\n");
|
|
fprintf(stdout,
|
|
" Base Address 0x%08x%08x\n",
|
|
regs_buff[j+1], regs_buff[j]);
|
|
j += 2;
|
|
fprintf(stdout,
|
|
" size %u\n",
|
|
regs_buff[j++]);
|
|
fprintf(stdout,
|
|
" next2proc %u\n",
|
|
regs_buff[j++]);
|
|
fprintf(stdout,
|
|
" gen %u\n",
|
|
regs_buff[j++]);
|
|
fprintf(stdout,
|
|
" stopped %u\n",
|
|
regs_buff[j++]);
|
|
}
|
|
|
|
/* Receive Queue Registers */
|
|
cnt = regs_buff[j++];
|
|
for (i = 0; i < cnt; i++) {
|
|
fprintf(stdout, " Receive Queue %d\n", i);
|
|
fprintf(stdout, " ----------------\n");
|
|
fprintf(stdout,
|
|
" RXPROD1 (Receive Ring Producer Register) 1 0x%x\n",
|
|
regs_buff[j++]);
|
|
fprintf(stdout,
|
|
" RXPROD2 (Receive Ring Producer Register) 2 0x%x\n",
|
|
regs_buff[j++]);
|
|
fprintf(stdout,
|
|
" Receive Ring 0\n");
|
|
fprintf(stdout,
|
|
" Base Address 0x%08x%08x\n",
|
|
regs_buff[j+1], regs_buff[j]);
|
|
j += 2;
|
|
fprintf(stdout,
|
|
" Size %u\n",
|
|
regs_buff[j++]);
|
|
fprintf(stdout,
|
|
" next2fill %u\n",
|
|
regs_buff[j++]);
|
|
fprintf(stdout,
|
|
" next2comp %u\n",
|
|
regs_buff[j++]);
|
|
fprintf(stdout,
|
|
" gen %u\n",
|
|
regs_buff[j++]);
|
|
|
|
fprintf(stdout,
|
|
" Receive Ring 1\n");
|
|
fprintf(stdout,
|
|
" Base Address 0x%08x%08x\n",
|
|
regs_buff[j+1], regs_buff[j]);
|
|
j += 2;
|
|
fprintf(stdout,
|
|
" Size %u\n",
|
|
regs_buff[j++]);
|
|
fprintf(stdout,
|
|
" next2fill %u\n",
|
|
regs_buff[j++]);
|
|
fprintf(stdout,
|
|
" next2comp %u\n",
|
|
regs_buff[j++]);
|
|
fprintf(stdout,
|
|
" gen %u\n",
|
|
regs_buff[j++]);
|
|
|
|
fprintf(stdout,
|
|
" Receive Data Ring\n");
|
|
fprintf(stdout,
|
|
" Base Address 0x%08x%08x\n",
|
|
regs_buff[j+1], regs_buff[j]);
|
|
j += 2;
|
|
fprintf(stdout,
|
|
" Size %u\n",
|
|
regs_buff[j++]);
|
|
fprintf(stdout,
|
|
" Buffer Size %u\n",
|
|
regs_buff[j++]);
|
|
|
|
fprintf(stdout,
|
|
" Receive Completion Ring\n");
|
|
fprintf(stdout,
|
|
" Base Address 0x%08x%08x\n",
|
|
regs_buff[j+1], regs_buff[j]);
|
|
j += 2;
|
|
fprintf(stdout,
|
|
" size %u\n",
|
|
regs_buff[j++]);
|
|
fprintf(stdout,
|
|
" next2proc %u\n",
|
|
regs_buff[j++]);
|
|
fprintf(stdout,
|
|
" gen %u\n",
|
|
regs_buff[j++]);
|
|
}
|
|
|
|
return 0;
|
|
}
|