1 |
/* |
/* |
2 |
* Copyright (C) 2004-2005 Anders Gavare. All rights reserved. |
* Copyright (C) 2004-2007 Anders Gavare. All rights reserved. |
3 |
* |
* |
4 |
* Redistribution and use in source and binary forms, with or without |
* Redistribution and use in source and binary forms, with or without |
5 |
* modification, are permitted provided that the following conditions are met: |
* modification, are permitted provided that the following conditions are met: |
25 |
* SUCH DAMAGE. |
* SUCH DAMAGE. |
26 |
* |
* |
27 |
* |
* |
28 |
* $Id: dev_sn.c,v 1.11 2005/06/26 11:43:48 debug Exp $ |
* $Id: dev_sn.c,v 1.18 2007/04/21 06:13:53 debug Exp $ |
29 |
* |
* |
30 |
* National Semiconductor SONIC ("sn") DP83932 ethernet. |
* National Semiconductor SONIC ("sn") DP83932 ethernet. |
31 |
* |
* |
51 |
#define DEV_SN_LENGTH 0x1000 |
#define DEV_SN_LENGTH 0x1000 |
52 |
|
|
53 |
struct sn_data { |
struct sn_data { |
54 |
int irq_nr; |
struct interrupt irq; |
55 |
unsigned char macaddr[6]; |
unsigned char macaddr[6]; |
56 |
uint32_t reg[SONIC_NREGS]; |
uint32_t reg[SONIC_NREGS]; |
57 |
}; |
}; |
58 |
|
|
59 |
|
|
60 |
/* |
DEVICE_ACCESS(sn) |
|
* dev_sn_access(): |
|
|
*/ |
|
|
int dev_sn_access(struct cpu *cpu, struct memory *mem, |
|
|
uint64_t relative_addr, unsigned char *data, size_t len, |
|
|
int writeflag, void *extra) |
|
61 |
{ |
{ |
62 |
struct sn_data *d = (struct sn_data *) extra; |
struct sn_data *d = (struct sn_data *) extra; |
63 |
uint64_t idata = 0, odata = 0; |
uint64_t idata = 0, odata = 0; |
64 |
int regnr; |
int regnr; |
65 |
|
|
66 |
idata = memory_readmax64(cpu, data, len); |
if (writeflag == MEM_WRITE) |
67 |
|
idata = memory_readmax64(cpu, data, len); |
68 |
|
|
69 |
regnr = relative_addr / sizeof(uint32_t); |
regnr = relative_addr / sizeof(uint32_t); |
70 |
|
|
71 |
if (regnr < SONIC_NREGS) { |
if (regnr < SONIC_NREGS) { |
76 |
} |
} |
77 |
|
|
78 |
switch (regnr) { |
switch (regnr) { |
79 |
|
|
80 |
default: |
default: |
81 |
if (writeflag == MEM_WRITE) { |
if (writeflag == MEM_WRITE) { |
82 |
fatal("[ sn: unimplemented write to address 0x%x" |
fatal("[ sn: unimplemented write to address 0x%x" |
86 |
fatal("[ sn: unimplemented read from address 0x%x " |
fatal("[ sn: unimplemented read from address 0x%x " |
87 |
"(regnr %i) ]\n", (int)relative_addr, regnr); |
"(regnr %i) ]\n", (int)relative_addr, regnr); |
88 |
} |
} |
89 |
|
/* exit(1); */ |
90 |
} |
} |
91 |
|
|
92 |
if (writeflag == MEM_READ) |
if (writeflag == MEM_READ) |
96 |
} |
} |
97 |
|
|
98 |
|
|
99 |
/* |
DEVINIT(sn) |
|
* devinit_sn(): |
|
|
*/ |
|
|
int devinit_sn(struct devinit *devinit) |
|
100 |
{ |
{ |
101 |
char *name2; |
char *name2; |
102 |
size_t nlen = 55; |
size_t nlen = 55; |
107 |
exit(1); |
exit(1); |
108 |
} |
} |
109 |
memset(d, 0, sizeof(struct sn_data)); |
memset(d, 0, sizeof(struct sn_data)); |
110 |
d->irq_nr = devinit->irq_nr; |
|
111 |
|
INTERRUPT_CONNECT(devinit->interrupt_path, d->irq); |
112 |
|
|
113 |
net_generate_unique_mac(devinit->machine, d->macaddr); |
net_generate_unique_mac(devinit->machine, d->macaddr); |
114 |
|
|
123 |
|
|
124 |
memory_device_register(devinit->machine->memory, name2, |
memory_device_register(devinit->machine->memory, name2, |
125 |
devinit->addr, DEV_SN_LENGTH, |
devinit->addr, DEV_SN_LENGTH, |
126 |
dev_sn_access, (void *)d, MEM_DEFAULT, NULL); |
dev_sn_access, (void *)d, DM_DEFAULT, NULL); |
127 |
|
|
128 |
net_add_nic(devinit->machine->emul->net, d, d->macaddr); |
net_add_nic(devinit->machine->emul->net, d, d->macaddr); |
129 |
|
|