added profiling code, can be enabled in debug.h

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@7595 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
beveloper 2004-05-16 00:41:22 +00:00
parent 4e729ddc16
commit 9bdea9ec06
3 changed files with 81 additions and 2 deletions

View File

@ -21,6 +21,8 @@
#include <KernelExport.h>
// #define PROFILING
#ifdef DEBUG
#define TRACE(a...) dprintf("rtl8169: " a)
#define ASSERT(a) if (a) ; else panic("rtl8169: ASSERT failed, " #a)
@ -29,6 +31,12 @@
#define ASSERT(a...)
#endif
#ifdef PROFILING
#define PROFILING_ONLY(a) a
#else
#define PROFILING_ONLY(a)
#endif
#define ERROR(a...) dprintf("rtl8169: ERROR " a)
#define PRINT(a...) dprintf("rtl8169: " a)

View File

@ -205,6 +205,35 @@ print_link_status(rtl8169_device *device)
}
#ifdef PROFILING
static void
print_debug_info(void *cookie)
{
rtl8169_device *device = (rtl8169_device *)cookie;
// only print if interrupt count changed
if (device->intTotalCount == device->intTotalCountOld)
return;
PRINT("Int %10d, %6d/s Rx: %10d, %6d/s Tx: %10d, %6d/s Tmr %10d, %6d/s\n",
device->intTotalCount,
device->intCurrentCount,
device->intRxTotalCount,
device->intRxCurrentCount,
device->intTxTotalCount,
device->intTxCurrentCount,
device->intTimerTotalCount,
device->intTimerCurrentCount);
device->intTotalCountOld = device->intTotalCount;
device->intCurrentCount = 0;
device->intRxCurrentCount = 0;
device->intTxCurrentCount = 0;
device->intTimerCurrentCount = 0;
}
#endif // PROFILING
static status_t
init_buf_desc(rtl8169_device *device)
{
@ -319,23 +348,34 @@ rtl8169_int(void *data)
write16(REG_INT_STAT, stat);
ret = B_HANDLED_INTERRUPT;
PROFILING_ONLY(device->intTotalCount++);
PROFILING_ONLY(device->intCurrentCount++);
if (stat & INT_FOVW) {
TRACE("INT_FOVW\n");
}
if (stat & INT_TimeOut) {
PROFILING_ONLY(device->intTimerTotalCount++);
PROFILING_ONLY(device->intTimerCurrentCount++);
}
if (stat & INT_PUN) {
TRACE("INT_PUN\n");
dump_phy_stat(device);
print_link_status(device);
}
if (stat & (INT_TOK | INT_TER)) {
rtl8169_tx_int(device);
PROFILING_ONLY(device->intTxTotalCount++);
PROFILING_ONLY(device->intTxCurrentCount++);
ret = B_INVOKE_SCHEDULER;
}
if (stat & (INT_ROK | INT_RER)) {
rtl8169_rx_int(device);
PROFILING_ONLY(device->intRxTotalCount++);
PROFILING_ONLY(device->intRxCurrentCount++);
ret = B_INVOKE_SCHEDULER;
}
@ -381,7 +421,7 @@ rtl8169_open(const char *name, uint32 flags, void** cookie)
device->pciInfo = gDevList[dev_id];
device->nonblocking = (flags & O_NONBLOCK) ? true : false;
device->closed = false;
device->rxSpinlock = 0;
device->rxNextIndex = 0;
device->rxIntIndex = 0;
@ -481,6 +521,19 @@ rtl8169_open(const char *name, uint32 flags, void** cookie)
goto err;
}
#ifdef PROFILING
device->intTotalCount = 0;
device->intTotalCountOld = 0;
device->intRxTotalCount = 0;
device->intTxTotalCount = 0;
device->intTimerTotalCount = 0;
device->intCurrentCount = 0;
device->intRxCurrentCount = 0;
device->intTxCurrentCount = 0;
device->intTimerCurrentCount = 0;
device->timer = create_timer(print_debug_info, device, 1000000, B_PERIODIC_TIMER);
#endif // PROFILING
write16(0xe0, read16(0xe0)); // write CR+ command
write16(0xe0, read16(0xe0) | 0x0003); // don't know what this does, BSD says "enable C+ Tx/Rx"
@ -573,6 +626,8 @@ rtl8169_free(void* cookie)
// disable interrupts
write16(REG_INT_MASK, 0);
PROFILING_ONLY(delete_timer(device->timer));
// well...
remove_io_interrupt_handler (device->irq, rtl8169_int, device);

View File

@ -20,7 +20,9 @@
#define __DEVICE_H
#include <PCI.h>
#include "debug.h"
#include "hardware.h"
#include "timer.h"
#define TX_TIMEOUT 6000000 // 6 seconds
#define FRAME_SIZE 1536 // must be multiple of 8
@ -42,6 +44,20 @@ typedef struct {
volatile bool nonblocking;
volatile bool closed;
#ifdef PROFILING
volatile int intTotalCount;
volatile int intTotalCountOld;
volatile int intRxTotalCount;
volatile int intTxTotalCount;
volatile int intTimerTotalCount;
volatile int intCurrentCount;
volatile int intRxCurrentCount;
volatile int intTxCurrentCount;
volatile int intTimerCurrentCount;
#endif // PROFILING
timer_id timer;
spinlock txSpinlock;
sem_id txFreeSem;