/[gxemul]/upstream/0.3.3.1/src/devices/dev_sn.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /upstream/0.3.3.1/src/devices/dev_sn.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 7 - (hide annotations)
Mon Oct 8 16:18:14 2007 UTC (16 years, 8 months ago) by dpavlin
File MIME type: text/plain
File size: 3746 byte(s)
0.3.3.1
1 dpavlin 4 /*
2     * Copyright (C) 2004-2005 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     * $Id: dev_sn.c,v 1.10 2005/03/14 19:14:02 debug Exp $
29     *
30     * National Semiconductor SONIC ("sn") DP83932 ethernet.
31     *
32     *
33     * TODO
34     */
35    
36     #include <stdio.h>
37     #include <stdlib.h>
38     #include <string.h>
39    
40     #include "cpu.h"
41     #include "device.h"
42     #include "emul.h"
43     #include "machine.h"
44     #include "memory.h"
45     #include "misc.h"
46     #include "net.h"
47    
48     #include "dp83932reg.h"
49    
50    
51     #define DEV_SN_LENGTH 0x1000
52    
53     struct sn_data {
54     int irq_nr;
55     unsigned char macaddr[6];
56     uint32_t reg[SONIC_NREGS];
57     };
58    
59    
60     /*
61     * dev_sn_access():
62     */
63     int dev_sn_access(struct cpu *cpu, struct memory *mem,
64     uint64_t relative_addr, unsigned char *data, size_t len,
65     int writeflag, void *extra)
66     {
67     struct sn_data *d = (struct sn_data *) extra;
68     uint64_t idata = 0, odata = 0;
69     int regnr;
70    
71     idata = memory_readmax64(cpu, data, len);
72     regnr = relative_addr / sizeof(uint32_t);
73    
74     if (regnr < SONIC_NREGS) {
75     if (writeflag == MEM_WRITE)
76     d->reg[regnr] = idata;
77     else
78     odata = d->reg[regnr];
79     }
80    
81     switch (regnr) {
82     default:
83     if (writeflag == MEM_WRITE) {
84     fatal("[ sn: unimplemented write to address 0x%x"
85     " (regnr %i), data=0x%02x ]\n",
86     (int)relative_addr, regnr, (int)idata);
87     } else {
88     fatal("[ sn: unimplemented read from address 0x%x "
89     "(regnr %i) ]\n", (int)relative_addr, regnr);
90     }
91     }
92    
93     if (writeflag == MEM_READ)
94     memory_writemax64(cpu, data, len, odata);
95    
96     return 1;
97     }
98    
99    
100     /*
101     * devinit_sn():
102     */
103     int devinit_sn(struct devinit *devinit)
104     {
105     char *name2;
106     struct sn_data *d = malloc(sizeof(struct sn_data));
107    
108     if (d == NULL) {
109     fprintf(stderr, "out of memory\n");
110     exit(1);
111     }
112     memset(d, 0, sizeof(struct sn_data));
113     d->irq_nr = devinit->irq_nr;
114    
115     net_generate_unique_mac(devinit->machine, d->macaddr);
116    
117     name2 = malloc(50);
118     if (name2 == NULL) {
119     fprintf(stderr, "out of memory in dev_sn_init()\n");
120     exit(1);
121     }
122     sprintf(name2, "%s [%02x:%02x:%02x:%02x:%02x:%02x]",
123     devinit->name,
124     d->macaddr[0], d->macaddr[1], d->macaddr[2],
125     d->macaddr[3], d->macaddr[4], d->macaddr[5]);
126    
127     memory_device_register(devinit->machine->memory, name2,
128     devinit->addr, DEV_SN_LENGTH,
129     dev_sn_access, (void *)d, MEM_DEFAULT, NULL);
130    
131     net_add_nic(devinit->machine->emul->net, d, d->macaddr);
132    
133     return 1;
134     }
135    

  ViewVC Help
Powered by ViewVC 1.1.26