drivers/network: Remove dp83815.

Never included in the build, and superseded by the sis900 driver from FreeBSD.
This commit is contained in:
Augustin Cavalier 2018-12-21 14:25:57 -05:00
parent 2dd61eb019
commit c1917899cd
6 changed files with 0 additions and 1111 deletions

View File

@ -14,7 +14,6 @@ SubInclude HAIKU_TOP src add-ons kernel drivers network usb_davicom ;
SubInclude HAIKU_TOP src add-ons kernel drivers network usb_ecm ;
SubInclude HAIKU_TOP src add-ons kernel drivers network vlance ;
SubInclude HAIKU_TOP src add-ons kernel drivers network wb840 ;
#SubInclude HAIKU_TOP src add-ons kernel drivers network dp83815
# FreeBSD 11.1 drivers
SubInclude HAIKU_TOP src add-ons kernel drivers network 3com ;

View File

@ -1,35 +0,0 @@
SubDir HAIKU_TOP src add-ons kernel drivers network dp83815 ;
SetSubDirSupportedPlatformsBeOSCompatible ;
# For ether_driver.h
UsePrivateHeaders net ;
KernelAddon dp83815 :
driver.c
util.c
;
rule Installdp83815
{
Depends $(<) : $(>) ;
}
actions ignore Installdp83815
{
cp $(>) /boot/home/config/add-ons/kernel/drivers/bin/
}
#Installdp83815 install : dp83815 ;
# Installation
HaikuInstall install-networking : /boot/home/config/add-ons/kernel/drivers/bin :
dp83815
;
HaikuInstallRelSymLink install-networking : /boot/home/config/add-ons/kernel/drivers/dev/net :
<installed>dp83815 :
installed-symlink
;

View File

@ -1,141 +0,0 @@
/*
* DP83815 Register #defines
*
* Created: 12/10/02
* By: Antonio Carpio
* E-Mail: BolivianTONE@nc.rr.com
*
* This file is free to be used for anything by anyone at anytime
*
*/
#ifndef _DP83815_REGISTER_DEFINITIONS_H_
#define _DP83815_REGISTER_DEFINITIONS_H_
#define REG_PMSCR 0x0044
#define REG_CR 0x0000
#define REG_CFG 0x0004
#define REG_MEAR 0x0008
#define REG_ISR 0x0010
#define REG_IMR 0x0014
#define REG_IER 0x0018
#define REG_TXDP 0x0020
#define REG_TXCFG 0x0024
#define REG_RXDP 0x0030
#define REG_RXCFG 0x0034
#define REG_CCSR 0x003c
#define REG_WCSR 0x0040
#define REG_RFCR 0x0048
#define REG_RFDR 0x004c
#define REG_MIBC 0x005c
#define REG_SRR 0x0058
#define REG_BMCR 0x0080
#define CR_RST 0x00000100
#define CR_SWI 0x00000080
#define CR_RXR 0x00000020
#define CR_TXR 0x00000010
#define CR_RXD 0x00000008
#define CR_RXE 0x00000004
#define CR_TXD 0x00000002
#define CR_TXE 0x00000001
#define TXCFG_CSI 0x80000000
#define TXCFG_HBI 0x40000000
#define TXCFG_MLB 0x20000000
#define TXCFG_ATP 0x10000000
#define TXCFG_MXDMA_256 0x00700000
#define TXCFG_MXDMA_128 0x00600000
#define TXCFG_MXDMA_64 0x00500000
#define TXCFG_MXDMA_32 0x00400000
#define TXCFG_MXDMA_16 0x00300000
#define TXCFG_MXDMA_8 0x00200000
#define TXCFG_MXDMA_4 0x00100000
#define TXCFG_MXDMA_512 0x00000000
#define TXCFG_FLTH(a) ((a&0x0000001F)<<8)
#define TXCFG_DRTH(a) ((a&0x0000001F)<<0)
#define RXCFG_AEP 0x80000000
#define RXCFG_ARP 0x40000000
#define RXCFG_ATP 0x10000000
#define RXCFG_ALP 0x08000000
#define RXCFG_DRTH(a) ((a&0x0000001F)<<1)
#define DESC_OWN 0x80000000
#define DESC_MORE 0x40000000
#define DESC_INTR 0x20000000
#define DESC_CRC 0x10000000
#define DESC_OK 0x08000000
#define DESC_LENGTH 0x00000FFF
#define DESC_TXA 0x04000000
#define DESC_TFU 0x02000000
#define DESC_CRS 0x01000000
#define DESC_TD 0x00800000
#define DESC_ED 0x00400000
#define DESC_OWC 0x00200000
#define DESC_EC 0x00100000
#define DESC_CCNT 0x000F0000
#define DESC_RXA 0x04000000
#define DESC_RXO 0x02000000
#define DESC_DEST 0x01800000
#define DESC_LONG 0x00400000
#define DESC_RUNT 0x00200000
#define DESC_ISE 0x00100000
#define DESC_CRCE 0x00080000
#define DESC_FAE 0x00040000
#define DESC_LBP 0x00020000
#define DESC_COL 0x00010000
#define ISR_TXRCMP 0x02000000
#define ISR_RXRCMP 0x01000000
#define ISR_DPERR 0x00800000
#define ISR_SSERR 0x00400000
#define ISR_RMABT 0x00200000
#define ISR_RTABT 0x00100000
#define ISR_RXSOVR 0x00010000
#define ISR_HIBERR 0x00008000
#define ISR_PHY 0x00004000
#define ISR_PME 0x00002000
#define ISR_SWI 0x00001000
#define ISR_MIB 0x00000800
#define ISR_TXURN 0x00000400
#define ISR_TXIDLE 0x00000200
#define ISR_TXERR 0x00000100
#define ISR_TXDESC 0x00000080
#define ISR_TXOK 0x00000040
#define ISR_RXORN 0x00000020
#define ISR_RXIDLE 0x00000010
#define ISR_RXEARLY 0x00000008
#define ISR_RXERR 0x00000004
#define ISR_RXDESC 0x00000002
#define ISR_RXOK 0x00000001
#define RFCR_RFEN 0x80000000
#define RFCR_AAB 0x40000000
#define RFCR_AAM 0x20000000
#define RFCR_AAU 0x10000000
#define RFCR_AARP 0x00400000
#define BMCR_ANE 0x1000
#define BMCR_ANR 0x0200
#endif

View File

@ -1,768 +0,0 @@
/* National Semiconductor dp83815 driver
* Copyright (c) 2006 Urias McCullough (umccullough@gmail.com)
* Portions of code Copyright (c) 2003-2004, Niels Sascha Reedijk
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
/*
* Portions of code based on dp83815 driver by: Antonio Carpio (BolivianTONE@nc.rr.com)
* Portions of code may be: Copyright (c) 1998, 1999 Be, Inc. All Rights Reserved under terms of Be Sample Code License.
*/
#include <KernelExport.h>
#include <Drivers.h>
#include <Errors.h>
#include <PCI.h>
#include <malloc.h>
#include <stdio.h>
#include <string.h>
#include "ether_driver.h"
#include "util.h"
#include "dp83815_regs.h"
#define kDevName "dp83815"
#define kDevDir "net/" kDevName "/"
#define MAX_CARDS 4
#define MAX_DESC 128 /* eventually going into config file */
#define BUFFER_SIZE 2048 /* make it easy to do math and whatnot */
#define MAX_PACKET_SIZE 1518 /* can be 2046 if RXCFG has ALP set */
#define NONBLOCK_WAIT 1000
//#define DEBUG
#ifdef DEBUG
# define TRACE(x) dprintf x
#else
# define TRACE(x) ;
#endif
typedef struct supported_device {
uint16 vendor_id;
uint16 device_id;
char * name;
} supported_device_t;
static supported_device_t m_supported_devices[] = {
{ 0x100B, 0x0020, "National Semiconductor dp83815 (Netgear 311/312)" },
{ 0, 0, NULL } /* End of list */
};
int32 api_version = B_CUR_DRIVER_API_VERSION; //Procedure
typedef struct descriptor {
uint32 link; /* Physical address of next descriptor */
volatile uint32 cmd; /* info to/from NIC */
volatile uint32 ptr; /* Physical address of the buffer */
struct descriptor *virt_next; /* virtual address of next descriptor */
void *virt_buff; /* virtual address of the buffer */
} descriptor_t;
typedef struct desc_ring {
descriptor_t *Curr; /* Current descriptor to be accessed */
sem_id Sem; /* Queue for outstanding reads/writes */
spinlock Lock; /* Spinlock used to grab a descriptor */
descriptor_t *CurrInt; /* Interrupt Hook's Current Descriptor */
} desc_ring_t;
typedef struct stats {
uint32 rx_ok,
tx_ok,
tx_err,
rx_err,
rx_overrun,
tx_underrun,
collisions,
rx_att,
tx_att;
} stats_t;
typedef struct dp83815_properties
{
pci_info *pcii; /* Pointer to PCI Info for the device */
uint32 reg_base; /* Base address for registers */
area_id ioarea; /* PPC: Area where the mmaped registers are */
area_id reg_area,
mem_area;
uint8 device_id; /* Which device id this is... */
ether_address_t address; /* holds the MAC address */
sem_id lock; /* lock this structure: still interrupt */
int32 blockFlag; /* for blocking or nonblocking reads */
stats_t stats;
desc_ring_t Rx, Tx;
} dp83815_properties_t;
static pci_info *m_devices[MAX_CARDS];
static pci_module_info *m_pcimodule = 0; //To call methods of pci
static char *dp83815_names[MAX_CARDS + 1];
static int32 m_openmask = 0; //Is the thing already opened?
static uint32 pages_needed(uint32 mem_size);
static int32 dp83815_interrupt_hook(void *data); /* interrupt handler */
static status_t allocate_resources(dp83815_properties_t *data); /* allocate semaphores & spinlocks */
static void free_resources(dp83815_properties_t *data); /* deallocate semaphores & spinlocks */
static status_t init_ring_buffers(dp83815_properties_t *data); /* allocate and initialize frame buffer rings */
static status_t domulti(dp83815_properties_t *data, uint8 *addr); /* add multicast address to hardware filter list */
static status_t free_hook(void *cookie);
static status_t close_hook(void *);
#ifdef __INTEL__
#define write8( offset , value) (m_pcimodule->write_io_8 ((data->reg_base + (offset)), (value) ) )
#define write16( offset , value) (m_pcimodule->write_io_16((data->reg_base + (offset)), (value) ) )
#define write32( offset , value) (m_pcimodule->write_io_32((data->reg_base + (offset)), (value) ) )
#define read8( offset ) (m_pcimodule->read_io_8 ((data->reg_base + offset)))
#define read16( offset ) (m_pcimodule->read_io_16((data->reg_base + offset)))
#define read32( offset ) (m_pcimodule->read_io_32((data->reg_base + offset)))
static void
dp83815_init_registers(dp83815_properties_t *data)
{
data->reg_base = data->pcii->u.h0.base_registers[0];
}
#else /* PPC */
#include <ByteOrder.h>
#define write8( offset , value) (*((volatile uint8 *)(data->reg_base + (offset))) = (value))
#define write16( offset , value) (*((volatile uint8 *)(data->reg_base + (offset))) = B_HOST_TO_LENDIAN_INT16(value))
#define write32( offset , value) (*((volatile uint8 *)(data->reg_base + (offset))) = B_HOST_TO_LENDIAN_INT32(value))
#define read8( offset ) (*((volatile uint8*)(data->reg_base + (offset))))
#define read16( offset ) B_LENDIAN_TO_HOST_INT16(*((volatile uint16*)(data->reg_base + (offset))))
#define read32( offset ) B_LENDIAN_TO_HOST_INT32(*((volatile uint32*)(data->reg_base + (offset))))
static void
dp83815_init_registers(rtl8139_properties_t *data)
{
int32 base, size, offset;
base = data->pcii->u.h0.base_registers[0];
size = data->pcii->u.h0.base_register_sizes[0];
/* Round down to nearest page boundary */
base = base & ~(B_PAGE_SIZE - 1);
/* Adjust the size */
offset = data->pcii->u.h0.base_registers[0] - base;
size += offset;
size = (size + (B_PAGE_SIZE - 1)) & ~(B_PAGE_SIZE - 1);
TRACE(( kDevName " _open_hook(): PCI base=%lx size=%lx offset=%lx\n",
base, size, offset));
data->ioarea = map_physical_memory(kDevName " Regs", base, size,
B_ANY_KERNEL_ADDRESS, B_READ_AREA | B_WRITE_AREA,
(void **)&data->reg_base);
data->reg_base = data->reg_base + offset;
}
#endif
uint32
pages_needed(uint32 mem_size)
{
uint32 pages = mem_size / B_PAGE_SIZE;
if (pages % B_PAGE_SIZE != 0)
pages += 1;
return pages;
}
status_t
init_hardware(void)
{
// Nielx: no special requirements here...
TRACE(( kDevName ": init_hardware\n" ));
return B_OK;
}
status_t
init_driver(void)
{
status_t status; //Storage for statuses
pci_info *item; //Storage used while looking through pci
int32 i, found; //Counter
TRACE(( kDevName ": init_driver()\n" ));
// Try if the PCI module is loaded (it would be weird if it wouldn't,
// but alas)
if ((status = get_module(B_PCI_MODULE_NAME, (module_info **)&m_pcimodule))
!= B_OK) {
TRACE((kDevName " init_driver(): Get PCI module failed! %lu \n",
status));
return status;
}
i = 0;
item = (pci_info *)malloc(sizeof(pci_info));
for (i = found = 0; m_pcimodule->get_nth_pci_info(i, item) == B_OK; i++) {
supported_device_t *supported;
for (supported = m_supported_devices; supported->name; supported++) {
if ((item->vendor_id == supported->vendor_id)
&& (item->device_id == supported->device_id)) {
//Also done in etherpci sample code
if ((item->u.h0.interrupt_line == 0)
|| (item->u.h0.interrupt_line == 0xFF)) {
TRACE(( kDevName " init_driver(): found %s with invalid IRQ"
" - check IRQ assignement\n", supported->name));
continue;
}
TRACE(( kDevName " init_driver(): found %s at IRQ %u \n",
supported->name, item->u.h0.interrupt_line));
m_devices[found] = item;
item = (pci_info *)malloc(sizeof(pci_info));
found++;
}
}
}
free(item);
//Check if we have found any devices:
if (found == 0) {
TRACE(( kDevName " init_driver(): no device found\n" ));
put_module(B_PCI_MODULE_NAME); //dereference module
return ENODEV;
}
//Create the devices list
{
char name[32];
for (i = 0; i < found; i++) {
snprintf(name, 32, "%s%ld", kDevDir, i);
dp83815_names[i] = strdup(name);
}
dp83815_names[i] = NULL;
}
return B_OK;
}
/* ----------
uninit_driver - optional function - called every time the driver
is unloaded
----- */
void
uninit_driver(void)
{
int index;
void *item;
TRACE(( kDevName ": uninit_driver()\n" ));
for (index = 0; (item = dp83815_names[index]) != NULL; index++)
{
free(item);
free(m_devices[index]);
}
put_module(B_PCI_MODULE_NAME);
}
static status_t
open_hook(const char *name, uint32 flags, void** cookie)
{
dp83815_properties_t *data;
uint8 temp8;
// uint16 temp16;
uint32 temp32;
unsigned char cmd;
TRACE(( kDevName " open_hook()\n" ));
// verify device access
{
char *thisName;
int32 mask;
// search for device name
for (temp8 = 0; (thisName = dp83815_names[temp8]) != NULL; temp8++) {
if (!strcmp(name, thisName))
break;
}
if (!thisName)
return EINVAL;
// check if device is already open
mask = 1L << temp8;
if (atomic_or(&m_openmask, mask) & mask)
return B_BUSY;
}
//Create a structure that contains the internals
if (!(*cookie = data =
(dp83815_properties_t *)malloc(sizeof(dp83815_properties_t)))) {
TRACE(( kDevName " open_hook(): Out of memory\n" ));
return B_NO_MEMORY;
}
//Set status to open:
m_openmask &= ~(1L << temp8);
//Clear memory
memset(data, 0, sizeof(dp83815_properties_t));
//Set the ID
data->device_id = temp8;
// Create lock
data->lock = create_sem(1, kDevName " data protect");
set_sem_owner(data->lock, B_SYSTEM_TEAM);
data->Rx.Sem = create_sem(0, kDevName " read wait");
set_sem_owner(data->Rx.Sem, B_SYSTEM_TEAM);
data->Tx.Sem = create_sem(1, kDevName " write wait");
set_sem_owner(data->Tx.Sem, B_SYSTEM_TEAM);
//Set up the cookie
data->pcii = m_devices[data->device_id];
//Enable the registers
dp83815_init_registers(data);
/* enable pci address access */
cmd = m_pcimodule->read_pci_config(data->pcii->bus, data->pcii->device,
data->pcii->function, PCI_command, 2);
cmd = cmd | PCI_command_io | PCI_command_master | PCI_command_memory;
m_pcimodule->write_pci_config(data->pcii->bus, data->pcii->device,
data->pcii->function, PCI_command, 2, cmd);
if (allocate_resources(data) != B_OK)
goto err1;
/* We want interrupts! */
if (install_io_interrupt_handler(data->pcii->u.h0.interrupt_line,
dp83815_interrupt_hook, data, 0) != B_OK) {
TRACE((kDevName " open_hook(): Error installing interrupt handler\n"));
return B_ERROR;
}
{
temp32 = read32(REG_SRR);
TRACE(( "SRR: %x\n", temp32));
}
write32(REG_CR, CR_RXR|CR_TXR); /* Reset Tx & Rx */
if (init_ring_buffers(data) != B_OK) /* Init ring buffers */
goto err1;
write32(REG_RFCR, RFCR_RFEN | RFCR_AAB | RFCR_AAM | RFCR_AAU);
write32(REG_RXCFG, RXCFG_ATP | RXCFG_DRTH(31)); /* Set the drth */
write32(REG_TXCFG, TXCFG_CSI |
TXCFG_HBI |
TXCFG_ATP |
TXCFG_MXDMA_256 |
TXCFG_FLTH(16) |
TXCFG_DRTH(16));
write32(REG_IMR, ISR_RXIDLE | ISR_TXOK | ISR_RXOK );
write32(REG_CR, CR_RXE); /* Enable Rx */
write32(REG_IER, 1); /* Enable interrupts */
return B_OK;
err1:
free_resources(data);
free(data);
return B_ERROR;
}
static status_t
read_hook (void* cookie, off_t position, void *buf, size_t* num_bytes)
{
dp83815_properties_t *data = cookie;
cpu_status former;
descriptor_t* desc;
size_t length = 0;
TRACE(( kDevName ": read_hook()\n" ));
//if( !data->nonblocking )
acquire_sem_etc(data->Rx.Sem, 1, B_CAN_INTERRUPT | data->blockFlag,
NONBLOCK_WAIT);
{
former = disable_interrupts();
acquire_spinlock(&data->Rx.Lock);
desc = data->Rx.Curr;
data->Rx.Curr = desc->virt_next;
release_spinlock(&data->Rx.Lock);
restore_interrupts(former);
}
length = DESC_LENGTH&desc->cmd;
if (desc->cmd & (DESC_RXA | DESC_RXO | DESC_LONG | DESC_RUNT | DESC_ISE
| DESC_CRCE | DESC_FAE | DESC_LBP | DESC_COL))
TRACE(( "desc cmd: %x\n", desc->cmd ));
if (length < 64) {
*num_bytes = 0;
return B_ERROR;
}
if (*num_bytes < length)
length = *num_bytes;
memcpy(buf, desc->virt_buff, length);
desc->cmd = DESC_LENGTH&MAX_PACKET_SIZE;
*num_bytes = length;
atomic_add(&data->stats.rx_att, 1);
if (length == 0)
return B_ERROR;
return B_OK;
}
static status_t
write_hook(void* cookie, off_t position, const void* buffer, size_t* num_bytes)
{
dp83815_properties_t *data = cookie;
cpu_status former;
descriptor_t* desc;
TRACE(( kDevName " write_hook()\n" ));
acquire_sem(data->lock);
acquire_sem_etc(data->Tx.Sem, 1, B_CAN_INTERRUPT | data->blockFlag,
NONBLOCK_WAIT);
{
former = disable_interrupts();
acquire_spinlock(&data->Tx.Lock);
desc = data->Tx.Curr;
data->Tx.Curr = desc->virt_next;
release_spinlock(&data->Tx.Lock);
restore_interrupts(former);
}
if (*num_bytes > MAX_PACKET_SIZE) { /* if needed */
TRACE(( "Had to truncate the packet from %d to %d\n", *num_bytes,
MAX_PACKET_SIZE));
*num_bytes = MAX_PACKET_SIZE; /* truncate the packet */
}
while (desc->cmd & DESC_OWN) { /* make sure a buffer is available */
TRACE(( "spinning in the write hook\n"));
spin(1000); /* wait a while if not */
}
memcpy(desc->virt_buff, buffer, *num_bytes); /* now copy the data */
desc->cmd = DESC_OWN | *num_bytes; /* update the cmd bits */
write32(REG_CR, CR_TXE); /* tell the card to start tx */
atomic_add(&data->stats.tx_att, 1);
release_sem_etc(data->lock, 1, B_DO_NOT_RESCHEDULE);
return B_OK;
}
static status_t
control_hook (void* cookie, uint32 op, void* arg, size_t len)
{
dp83815_properties_t *data = (dp83815_properties_t *)cookie;
TRACE(( kDevName " control_hook()\n" ));
switch (op) {
case ETHER_INIT:
TRACE((kDevName " control_hook(): Wants us to init... ;-)\n"));
return B_NO_ERROR;
case ETHER_GETADDR:
if (data == NULL)
return B_ERROR;
TRACE((kDevName " control_hook(): Wants our address...\n"));
memcpy(arg, (void *) &(data->address), sizeof(ether_address_t));
return B_OK;
case ETHER_ADDMULTI:
return domulti(data, (unsigned char *)arg);
case ETHER_NONBLOCK:
if (data == NULL)
return B_ERROR;
TRACE((kDevName " control_hook(): Wants to set block/nonblock\n"));
if (*((int32 *)arg))
data->blockFlag = B_RELATIVE_TIMEOUT;
else
data->blockFlag = 0;
return B_NO_ERROR;
case ETHER_REMMULTI:
TRACE((kDevName " control_hook(): Wants REMMULTI\n"));
return B_OK;
case ETHER_SETPROMISC:
TRACE((kDevName " control_hook(): Wants PROMISC\n"));
return B_OK;
case ETHER_GETFRAMESIZE:
TRACE((kDevName " control_hook(): Wants GETFRAMESIZE\n"));
*((unsigned int *)arg) = 1514;
return B_OK;
}
return B_BAD_VALUE;
}
static int32
dp83815_interrupt_hook(void *cookie)
{
dp83815_properties_t *data = (dp83815_properties_t *) cookie;
uint32 isr;
isr = read32(REG_ISR);
if (isr == 0)
return B_UNHANDLED_INTERRUPT;
if (isr & ISR_RXOK) {
int num_packets = 0;
descriptor_t *curr = data->Rx.CurrInt;
while (curr->cmd & DESC_OWN) {
curr = curr->virt_next;
num_packets++;
}
data->Rx.CurrInt = curr;
data->stats.rx_ok += num_packets;
if (num_packets > 1)
TRACE(( "received %d descriptors\n", num_packets));
if (num_packets)
release_sem_etc(data->Rx.Sem, num_packets, B_DO_NOT_RESCHEDULE);
}
if (isr & ISR_TXOK) {
data->stats.tx_ok++;
release_sem_etc(data->Tx.Sem, 1, B_DO_NOT_RESCHEDULE);
}
if (isr & ISR_RXIDLE)
TRACE(("RX IS IDLE!\n"));
if (isr & ~(ISR_TXIDLE | ISR_TXOK | ISR_RXOK | ISR_RXIDLE | ISR_RXEARLY))
TRACE(("ISR: %x\n", isr));
return B_INVOKE_SCHEDULER;
}
static status_t
close_hook(void* cookie)
{
dp83815_properties_t * data = (dp83815_properties_t *) cookie;
write32(REG_IER, 0); /* Disable interrupts */
write32(REG_CR, CR_RXD | CR_TXD); /* Disable Rx & Tx */
return B_OK;
}
static status_t
free_hook(void* cookie)
{
dp83815_properties_t *data = (dp83815_properties_t *) cookie;
TRACE(( kDevName " free_hook()\n" ));
while (data->Tx.Lock); /* wait for any current writes to finish */
while (data->Rx.Lock); /* wait for any current reads to finish */
//Remove interrupt handler
remove_io_interrupt_handler(data->pcii->u.h0.interrupt_line,
dp83815_interrupt_hook, cookie);
m_openmask &= ~(1L << data->device_id);
free_resources(data); /* unblock waiting threads */
//Finally, free the cookie
free(data);
//Put the pci module
put_module(B_PCI_MODULE_NAME);
return B_OK;
}
device_hooks dp83815_hooks = {
open_hook, /* -> open entry point */
close_hook, /* -> close entry point */
free_hook, /* -> free cookie */
control_hook, /* -> control entry point */
read_hook, /* -> read entry point */
write_hook /* -> write entry point */
};
const char**
publish_devices()
{
return (const char **)dp83815_names;
}
device_hooks*
find_device(const char* name)
{
return &dp83815_hooks;
}
static status_t
init_ring_buffers(dp83815_properties_t *data)
{
uint32 i;
area_info info;
physical_entry map[2];
uint32 pages;
descriptor_t *RxDescRing = NULL;
descriptor_t *TxDescRing = NULL;
descriptor_t *desc_base_virt_addr;
uint32 desc_base_phys_addr;
void *buff_base_virt_addr;
uint32 buff_base_phys_addr;
data->mem_area = 0;
#define NUM_BUFFS 2*MAX_DESC
pages = pages_needed(2 * MAX_DESC * sizeof(descriptor_t)
+ NUM_BUFFS * BUFFER_SIZE);
data->mem_area = create_area(kDevName " desc buffer", (void**)&RxDescRing,
B_ANY_KERNEL_ADDRESS, pages * B_PAGE_SIZE, B_32_BIT_CONTIGUOUS,
B_READ_AREA | B_WRITE_AREA);
if (data->mem_area < 0)
return B_ERROR;
get_area_info(data->mem_area, &info);
get_memory_map(info.address, info.size, map, 4);
desc_base_phys_addr = map[0].address + NUM_BUFFS * BUFFER_SIZE;
desc_base_virt_addr = info.address + NUM_BUFFS * BUFFER_SIZE;
buff_base_phys_addr = map[0].address;
buff_base_virt_addr = info.address;
RxDescRing = desc_base_virt_addr;
for (i = 0; i < MAX_DESC; i++) {
RxDescRing[i].link = desc_base_phys_addr
+ ((i + 1) % MAX_DESC) * sizeof(descriptor_t);
RxDescRing[i].cmd = MAX_PACKET_SIZE;
RxDescRing[i].ptr = buff_base_phys_addr + i * BUFFER_SIZE;
RxDescRing[i].virt_next = &RxDescRing[(i + 1) % MAX_DESC];
RxDescRing[i].virt_buff = buff_base_virt_addr + i * BUFFER_SIZE;
}
TxDescRing = desc_base_virt_addr + MAX_DESC;
for (i = 0; i < MAX_DESC; i++) {
TxDescRing[i].link = desc_base_phys_addr
+ MAX_DESC * sizeof(descriptor_t)
+ ((i + 1) % MAX_DESC) * sizeof(descriptor_t);
TxDescRing[i].cmd = MAX_PACKET_SIZE;
TxDescRing[i].ptr = buff_base_phys_addr
+ ((i + MAX_DESC) * BUFFER_SIZE);
TxDescRing[i].virt_next = &TxDescRing[(i + 1) % MAX_DESC];
TxDescRing[i].virt_buff = buff_base_virt_addr
+ ((i + MAX_DESC) * BUFFER_SIZE);
}
data->Rx.Curr = RxDescRing;
data->Tx.Curr = TxDescRing;
data->Rx.CurrInt = RxDescRing;
data->Tx.CurrInt = TxDescRing;
write32(REG_RXDP, desc_base_phys_addr); /* set the initial rx descriptor */
i = desc_base_phys_addr + MAX_DESC * sizeof(descriptor_t);
write32(REG_TXDP, i); /* set the initial tx descriptor */
return B_OK;
}
static status_t
allocate_resources(dp83815_properties_t *data)
{
/* intialize rx semaphore with zero received packets */
if ((data->Rx.Sem = create_sem(0, kDevName " rx")) < 0) {
TRACE(( kDevName " create rx sem failed %x \n", data->Rx.Sem));
return (data->Rx.Sem);
}
set_sem_owner(data->Rx.Sem, B_SYSTEM_TEAM);
/* intialize tx semaphore with the number of free tx buffers */
if ((data->Tx.Sem = create_sem(MAX_DESC, kDevName " tx")) < 0) {
delete_sem(data->Rx.Sem);
TRACE(( kDevName " create read sem failed %x \n", data->Tx.Sem));
return (data->Tx.Sem);
}
set_sem_owner(data->Tx.Sem, B_SYSTEM_TEAM);
data->blockFlag = 0;
return (B_OK);
}
static void free_resources(dp83815_properties_t *data)
{
delete_sem(data->Rx.Sem);
delete_sem(data->Tx.Sem);
}
static status_t domulti(dp83815_properties_t *data, uint8 *addr)
{
TRACE(( "Set up multicast filter here\n"));
return (B_ERROR);
}

View File

@ -1,125 +0,0 @@
/*
* BeOS Driver for Intel ICH AC'97 Link interface
*
* Copyright (c) 2002, Marcus Overhagen <marcus@overhagen.de>
*
* All rights reserved.
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#include <Errors.h>
#include <OS.h>
#include <string.h>
#include "util.h"
spinlock slock = 0;
uint32 round_to_pagesize(uint32 size);
cpu_status
lock(void)
{
cpu_status status = disable_interrupts();
acquire_spinlock(&slock);
return status;
}
void
unlock(cpu_status status)
{
release_spinlock(&slock);
restore_interrupts(status);
}
uint32
round_to_pagesize(uint32 size)
{
return (size + B_PAGE_SIZE - 1) & ~(B_PAGE_SIZE - 1);
}
area_id
alloc_mem(void **log, void **phy, size_t size, const char *name)
{
// TODO: phy should be phys_addr_t*!
physical_entry pe;
void * logadr;
area_id areaid;
status_t rv;
dprintf("dp83815: allocating %ld bytes for %s\n",size,name);
size = round_to_pagesize(size);
areaid = create_area(name, &logadr, B_ANY_KERNEL_ADDRESS, size,
B_32_BIT_CONTIGUOUS, B_READ_AREA | B_WRITE_AREA);
// TODO: The rest of the code doesn't deal correctly with physical
// addresses > 4 GB, so we have to force 32 bit addresses here.
if (areaid < B_OK) {
dprintf("couldn't allocate area %s\n",name);
return B_ERROR;
}
rv = get_memory_map(logadr,size,&pe,1);
if (rv < B_OK) {
delete_area(areaid);
dprintf("couldn't map %s\n",name);
return B_ERROR;
}
memset(logadr,0,size);
if (log)
*log = logadr;
if (phy)
*phy = (void*)(addr_t)pe.address;
dprintf("area = %ld, size = %ld, log = %p, phy = %p\n",areaid,size,logadr,pe.address);
return areaid;
}
/* This is not the most advanced method to map physical memory for io access.
* Perhaps using B_ANY_KERNEL_ADDRESS instead of B_ANY_KERNEL_BLOCK_ADDRESS
* makes the whole offset calculation and relocation obsolete. But the code
* below does work, and I can't test if using B_ANY_KERNEL_ADDRESS also works.
*/
area_id
map_mem(void **log, void *phy, size_t size, const char *name)
{
uint32 offset;
void *phyadr;
void *mapadr;
area_id area;
dprintf("mapping physical address %p with %#lx bytes for %s\n",phy,size,name);
offset = (uint32)phy & (B_PAGE_SIZE - 1);
phyadr = (void *) ( (uint32)phy - offset );
size = round_to_pagesize(size + offset);
area = map_physical_memory(name, (addr_t)phyadr, size,
B_ANY_KERNEL_BLOCK_ADDRESS, B_READ_AREA | B_WRITE_AREA, &mapadr);
*log = (void *) ( (uint32)mapadr + offset );
dprintf("physical = %p, logical = %p, offset = %#lx, phyadr = %p, mapadr = %p, size = %#lx, area = %#lx\n",
phy, *log, offset, phyadr, mapadr, size, area);
return area;
}

View File

@ -1,41 +0,0 @@
/*
* BeOS Driver for Intel ICH AC'97 Link interface
*
* Copyright (c) 2002, Marcus Overhagen <marcus@overhagen.de>
*
* All rights reserved.
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef _UTIL_H_
#define _UTIL_H_
#include <KernelExport.h>
area_id alloc_mem(void **log, void **phy, size_t size, const char *name);
area_id map_mem(void **log, void *phy, size_t size, const char *name);
cpu_status lock(void);
void unlock(cpu_status status);
extern spinlock slock;
#endif