* Now uses different base addresses for mapping the registers depending on the

chipset. This should now finally fix bug #1853.
* Instead of reading values directly from the PCI config space, we now just use
  the pci_info structure to retrieve them (interrupt, and base address).
* Renamed alloc_mem() to alloc_contiguous() to make clearer what it does.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26886 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2008-08-09 09:43:19 +00:00
parent 4d2724ae1a
commit 46b2c7efd3
3 changed files with 22 additions and 18 deletions
@@ -281,13 +281,13 @@ init_buf_desc(rtl8169_device *device)
void *rx_buf_virt, *rx_buf_phy; void *rx_buf_virt, *rx_buf_phy;
int i; int i;
device->txBufArea = alloc_mem(&tx_buf_virt, &tx_buf_phy, device->txBufArea = alloc_contiguous(&tx_buf_virt, &tx_buf_phy,
device->txBufferCount * FRAME_SIZE, 0, "rtl8169 tx buf"); device->txBufferCount * FRAME_SIZE, 0, "rtl8169 tx buf");
device->rxBufArea = alloc_mem(&rx_buf_virt, &rx_buf_phy, device->rxBufArea = alloc_contiguous(&rx_buf_virt, &rx_buf_phy,
device->rxBufferCount * FRAME_SIZE, 0, "rtl8169 rx buf"); device->rxBufferCount * FRAME_SIZE, 0, "rtl8169 rx buf");
device->txDescArea = alloc_mem(&tx_buf_desc_virt, &tx_buf_desc_phy, device->txDescArea = alloc_contiguous(&tx_buf_desc_virt, &tx_buf_desc_phy,
device->txBufferCount * sizeof(buf_desc), 0, "rtl8169 tx desc"); device->txBufferCount * sizeof(buf_desc), 0, "rtl8169 tx desc");
device->rxDescArea = alloc_mem(&rx_buf_desc_virt, &rx_buf_desc_phy, device->rxDescArea = alloc_contiguous(&rx_buf_desc_virt, &rx_buf_desc_phy,
device->rxBufferCount * sizeof(buf_desc), 0, "rtl8169 rx desc"); device->rxBufferCount * sizeof(buf_desc), 0, "rtl8169 rx desc");
if (device->txBufArea < B_OK || device->rxBufArea < B_OK if (device->txBufArea < B_OK || device->rxBufArea < B_OK
|| device->txDescArea < B_OK || device->rxDescArea < B_OK) || device->txDescArea < B_OK || device->rxDescArea < B_OK)
@@ -433,6 +433,7 @@ rtl8169_open(const char *name, uint32 flags, void** cookie)
{ {
rtl8169_device *device; rtl8169_device *device;
char *deviceName; char *deviceName;
int mmioIndex;
uint32 val; uint32 val;
int dev_id; int dev_id;
int mask; int mask;
@@ -480,7 +481,6 @@ rtl8169_open(const char *name, uint32 flags, void** cookie)
device->rxIntIndex = 0; device->rxIntIndex = 0;
device->rxFree = device->rxBufferCount; device->rxFree = device->rxBufferCount;
device->rxReadySem = create_sem(0, "rtl8169 rx ready"); device->rxReadySem = create_sem(0, "rtl8169 rx ready");
set_sem_owner(device->rxReadySem, B_SYSTEM_TEAM);
device->txBuf = (void **)malloc(sizeof(void *) * device->txBufferCount); device->txBuf = (void **)malloc(sizeof(void *) * device->txBufferCount);
B_INITIALIZE_SPINLOCK(&device->txSpinlock); B_INITIALIZE_SPINLOCK(&device->txSpinlock);
@@ -488,7 +488,6 @@ rtl8169_open(const char *name, uint32 flags, void** cookie)
device->txIntIndex = 0; device->txIntIndex = 0;
device->txUsed = 0; device->txUsed = 0;
device->txFreeSem = create_sem(device->txBufferCount, "rtl8169 tx free"); device->txFreeSem = create_sem(device->txBufferCount, "rtl8169 tx free");
set_sem_owner(device->txFreeSem, B_SYSTEM_TEAM);
// enable busmaster and memory mapped access, disable io port access // enable busmaster and memory mapped access, disable io port access
val = gPci->read_pci_config(device->pciInfo->bus, device->pciInfo->device, val = gPci->read_pci_config(device->pciInfo->bus, device->pciInfo->device,
@@ -503,9 +502,7 @@ rtl8169_open(const char *name, uint32 flags, void** cookie)
device->pciInfo->function, PCI_latency, 1, 0x40); device->pciInfo->function, PCI_latency, 1, 0x40);
// get IRQ // get IRQ
device->irq = gPci->read_pci_config(device->pciInfo->bus, device->irq = device->pciInfo->u.h0.interrupt_line;
device->pciInfo->device, device->pciInfo->function, PCI_interrupt_line,
1);
if (device->irq == 0 || device->irq == 0xff) { if (device->irq == 0 || device->irq == 0xff) {
ERROR("no IRQ assigned\n"); ERROR("no IRQ assigned\n");
goto err; goto err;
@@ -514,11 +511,17 @@ rtl8169_open(const char *name, uint32 flags, void** cookie)
TRACE("IRQ %d\n", device->irq); TRACE("IRQ %d\n", device->irq);
// map registers into memory // map registers into memory
val = gPci->read_pci_config(device->pciInfo->bus, device->pciInfo->device,
device->pciInfo->function, 0x14, 4); if (device->pciInfo->device == 0x8168)
val &= PCI_address_memory_32_mask; mmioIndex = 0;
TRACE("hardware register address %p\n", (void *) val); else
device->regArea = map_mem(&device->regAddr, (void *)val, 256, 0, mmioIndex = 1;
TRACE("hardware register address %p\n",
(void *)device->pciInfo->u.h0.base_registers[mmioIndex]);
device->regArea = map_mem(&device->regAddr,
(void *)device->pciInfo->u.h0.base_registers[mmioIndex], 256, 0,
"rtl8169 register"); "rtl8169 register");
if (device->regArea < B_OK) { if (device->regArea < B_OK) {
ERROR("can't map hardware registers\n"); ERROR("can't map hardware registers\n");
@@ -34,7 +34,7 @@ round_to_pagesize(uint32 size)
area_id area_id
alloc_mem(void **virt, void **phy, size_t size, uint32 protection, alloc_contiguous(void **virt, void **phy, size_t size, uint32 protection,
const char *name) const char *name)
{ {
physical_entry pe; physical_entry pe;
@@ -81,7 +81,7 @@ map_mem(void **virt, void *phy, size_t size, uint32 protection,
offset = (uint32)phy & (B_PAGE_SIZE - 1); offset = (uint32)phy & (B_PAGE_SIZE - 1);
phyadr = (char *)phy - offset; phyadr = (char *)phy - offset;
size = round_to_pagesize(size + offset); size = round_to_pagesize(size + offset);
area = map_physical_memory(name, phyadr, size, B_ANY_KERNEL_BLOCK_ADDRESS, area = map_physical_memory(name, phyadr, size, B_ANY_KERNEL_ADDRESS,
protection, &mapadr); protection, &mapadr);
if (area < B_OK) { if (area < B_OK) {
ERROR("mapping '%s' failed, error 0x%lx (%s)\n", name, area, strerror(area)); ERROR("mapping '%s' failed, error 0x%lx (%s)\n", name, area, strerror(area));
@@ -1,7 +1,7 @@
/* Realtek RTL8169 Family Driver /* Realtek RTL8169 Family Driver
* Copyright (C) 2004 Marcus Overhagen <[email protected]>. All rights reserved. * Copyright (C) 2004 Marcus Overhagen <[email protected]>. All rights reserved.
* *
* Permission to use, copy, modify and distribute this software and its * Permission to use, copy, modify and distribute this software and its
* documentation for any purpose and without fee is hereby granted, provided * documentation for any purpose and without fee is hereby granted, provided
* that the above copyright notice appear in all copies, and that both the * that the above copyright notice appear in all copies, and that both the
* copyright notice and this permission notice appear in supporting documentation. * copyright notice and this permission notice appear in supporting documentation.
@@ -21,7 +21,8 @@
#include <OS.h> #include <OS.h>
area_id alloc_mem(void **virt, void **phy, size_t size, uint32 protection, const char *name); area_id alloc_contiguous(void **virt, void **phy, size_t size,
uint32 protection, const char *name);
area_id map_mem(void **virt, void *phy, size_t size, uint32 protection, const char *name); area_id map_mem(void **virt, void *phy, size_t size, uint32 protection, const char *name);
#endif #endif