dev_sn.cc Source File
Back to the index.
src
devices
dev_sn.cc
Go to the documentation of this file.
1
/*
2
* Copyright (C) 2004-2009 Anders Gavare. All rights reserved.
3
*
4
* Redistribution and use in source and binary forms, with or without
5
* modification, are permitted provided that the following conditions are met:
6
*
7
* 1. Redistributions of source code must retain the above copyright
8
* notice, this list of conditions and the following disclaimer.
9
* 2. Redistributions in binary form must reproduce the above copyright
10
* notice, this list of conditions and the following disclaimer in the
11
* documentation and/or other materials provided with the distribution.
12
* 3. The name of the author may not be used to endorse or promote products
13
* derived from this software without specific prior written permission.
14
*
15
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25
* SUCH DAMAGE.
26
*
27
*
28
* COMMENT: National Semiconductor SONIC ("sn") DP83932 ethernet controller
29
*
30
* TODO
31
*/
32
33
#include <stdio.h>
34
#include <stdlib.h>
35
#include <string.h>
36
37
#include "
cpu.h
"
38
#include "
device.h
"
39
#include "
emul.h
"
40
#include "
machine.h
"
41
#include "
memory.h
"
42
#include "
misc.h
"
43
#include "
net.h
"
44
45
#include "
thirdparty/dp83932reg.h
"
46
47
48
#define DEV_SN_LENGTH 0x1000
49
50
struct
sn_data
{
51
struct
interrupt
irq
;
52
unsigned
char
macaddr
[6];
53
uint32_t
reg
[
SONIC_NREGS
];
54
};
55
56
57
DEVICE_ACCESS
(sn)
58
{
59
struct
sn_data
*d = (
struct
sn_data
*) extra;
60
uint64_t idata = 0, odata = 0;
61
int
regnr;
62
63
if
(writeflag ==
MEM_WRITE
)
64
idata =
memory_readmax64
(
cpu
,
data
, len);
65
66
regnr = relative_addr /
sizeof
(uint32_t);
67
68
if
(regnr <
SONIC_NREGS
) {
69
if
(writeflag ==
MEM_WRITE
)
70
d->
reg
[regnr] = idata;
71
else
72
odata = d->
reg
[regnr];
73
}
74
75
switch
(regnr) {
76
77
default
:
78
if
(writeflag ==
MEM_WRITE
) {
79
fatal
(
"[ sn: unimplemented write to address 0x%x"
80
" (regnr %i), data=0x%02x ]\n"
,
81
(
int
)relative_addr, regnr, (
int
)idata);
82
}
else
{
83
fatal
(
"[ sn: unimplemented read from address 0x%x "
84
"(regnr %i) ]\n"
, (
int
)relative_addr, regnr);
85
}
86
/* exit(1); */
87
}
88
89
if
(writeflag ==
MEM_READ
)
90
memory_writemax64
(
cpu
,
data
, len, odata);
91
92
return
1;
93
}
94
95
96
DEVINIT
(sn)
97
{
98
char
*name2;
99
size_t
nlen = 55;
100
struct
sn_data
*d;
101
102
CHECK_ALLOCATION
(d = (
struct
sn_data
*) malloc(
sizeof
(
struct
sn_data
)));
103
memset(d, 0,
sizeof
(
struct
sn_data
));
104
105
INTERRUPT_CONNECT
(
devinit
->
interrupt_path
, d->
irq
);
106
107
net_generate_unique_mac
(
devinit
->
machine
, d->
macaddr
);
108
109
CHECK_ALLOCATION
(name2 = (
char
*) malloc(nlen));
110
snprintf(name2, nlen,
"%s [%02x:%02x:%02x:%02x:%02x:%02x]"
,
111
devinit
->
name
, d->
macaddr
[0], d->
macaddr
[1], d->
macaddr
[2],
112
d->
macaddr
[3], d->
macaddr
[4], d->
macaddr
[5]);
113
114
memory_device_register
(
devinit
->
machine
->
memory
, name2,
115
devinit
->
addr
,
DEV_SN_LENGTH
,
116
dev_sn_access, (
void
*)d,
DM_DEFAULT
, NULL);
117
118
net_add_nic
(
devinit
->
machine
->
emul
->
net
, d, d->macaddr);
119
120
return
1;
121
}
122
sn_data
Definition:
dev_sn.cc:50
data
u_short data
Definition:
siireg.h:79
INTERRUPT_CONNECT
#define INTERRUPT_CONNECT(name, istruct)
Definition:
interrupt.h:77
machine::emul
struct emul * emul
Definition:
machine.h:99
devinit::addr
uint64_t addr
Definition:
device.h:46
memory_device_register
void memory_device_register(struct memory *mem, const char *, uint64_t baseaddr, uint64_t len, int(*f)(struct cpu *, struct memory *, uint64_t, unsigned char *, size_t, int, void *), void *extra, int flags, unsigned char *dyntrans_data)
Definition:
memory.cc:339
MEM_READ
#define MEM_READ
Definition:
memory.h:116
DM_DEFAULT
#define DM_DEFAULT
Definition:
memory.h:130
devinit::machine
struct machine * machine
Definition:
device.h:41
device.h
MEM_WRITE
#define MEM_WRITE
Definition:
memory.h:117
DEV_SN_LENGTH
#define DEV_SN_LENGTH
Definition:
dev_sn.cc:48
devinit::interrupt_path
char * interrupt_path
Definition:
device.h:50
sn_data::irq
struct interrupt irq
Definition:
dev_sn.cc:51
fatal
void fatal(const char *fmt,...)
Definition:
main.cc:152
misc.h
memory_readmax64
uint64_t memory_readmax64(struct cpu *cpu, unsigned char *buf, int len)
Definition:
memory.cc:55
machine.h
net_generate_unique_mac
void net_generate_unique_mac(struct machine *, unsigned char *macbuf)
Definition:
net_misc.cc:88
devinit::name
char * name
Definition:
device.h:43
emul.h
net_add_nic
void net_add_nic(struct net *net, void *extra, unsigned char *macaddr)
Definition:
net.cc:598
devinit
Definition:
device.h:40
cpu.h
emul::net
struct net * net
Definition:
emul.h:43
machine::memory
struct memory * memory
Definition:
machine.h:126
DEVINIT
DEVINIT(sn)
Definition:
dev_sn.cc:96
sn_data::reg
uint32_t reg[SONIC_NREGS]
Definition:
dev_sn.cc:53
SONIC_NREGS
#define SONIC_NREGS
Definition:
dp83932reg.h:357
interrupt
Definition:
interrupt.h:36
memory_writemax64
void memory_writemax64(struct cpu *cpu, unsigned char *buf, int len, uint64_t data)
Definition:
memory.cc:89
cpu
Definition:
cpu.h:326
dp83932reg.h
net.h
sn_data::macaddr
unsigned char macaddr[6]
Definition:
dev_sn.cc:52
memory.h
DEVICE_ACCESS
DEVICE_ACCESS(sn)
Definition:
dev_sn.cc:57
CHECK_ALLOCATION
#define CHECK_ALLOCATION(ptr)
Definition:
misc.h:239
Generated on Tue Mar 24 2020 14:04:48 for GXemul by
1.8.17