1*6b664a71Sisaki /* $NetBSD: if_ne.c,v 1.3 2024/01/07 07:58:33 isaki Exp $ */
2548d4f2dStsutsui
3548d4f2dStsutsui /*
4548d4f2dStsutsui * Copyright (c) 2003 Tetsuya Isaki. All rights reserved.
5548d4f2dStsutsui *
6548d4f2dStsutsui * Redistribution and use in source and binary forms, with or without
7548d4f2dStsutsui * modification, are permitted provided that the following conditions
8548d4f2dStsutsui * are met:
9548d4f2dStsutsui * 1. Redistributions of source code must retain the above copyright
10548d4f2dStsutsui * notice, this list of conditions and the following disclaimer.
11548d4f2dStsutsui * 2. Redistributions in binary form must reproduce the above copyright
12548d4f2dStsutsui * notice, this list of conditions and the following disclaimer in the
13548d4f2dStsutsui * documentation and/or other materials provided with the distribution.
14548d4f2dStsutsui *
15548d4f2dStsutsui * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16548d4f2dStsutsui * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17548d4f2dStsutsui * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18548d4f2dStsutsui * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19548d4f2dStsutsui * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
20548d4f2dStsutsui * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21548d4f2dStsutsui * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
22548d4f2dStsutsui * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
23548d4f2dStsutsui * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24548d4f2dStsutsui * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25548d4f2dStsutsui * SUCH DAMAGE.
26548d4f2dStsutsui */
27548d4f2dStsutsui
28548d4f2dStsutsui #include <sys/param.h>
29548d4f2dStsutsui #include <sys/systm.h>
30548d4f2dStsutsui
31548d4f2dStsutsui #include <net/if.h>
32548d4f2dStsutsui #include <net/if_ether.h>
33548d4f2dStsutsui #include <netinet/in.h>
34548d4f2dStsutsui #include <netinet/in_systm.h>
35548d4f2dStsutsui
36548d4f2dStsutsui #include <lib/libsa/stand.h>
37548d4f2dStsutsui #include <lib/libsa/net.h>
38548d4f2dStsutsui #include <lib/libsa/netif.h>
39548d4f2dStsutsui
40548d4f2dStsutsui #include "ne.h"
41548d4f2dStsutsui #include "dp8390.h"
42548d4f2dStsutsui
43548d4f2dStsutsui extern int badbaddr(void *);
44548d4f2dStsutsui
45548d4f2dStsutsui static int ne_match(struct netif *, void *);
46548d4f2dStsutsui static int ne_probe(struct netif *, void *);
47548d4f2dStsutsui static void ne_init(struct iodesc *, void *);
48548d4f2dStsutsui static int ne_get(struct iodesc *, void *, size_t, saseconds_t);
49548d4f2dStsutsui static int ne_put(struct iodesc *, void *, size_t);
50548d4f2dStsutsui static void ne_end(struct netif *);
51548d4f2dStsutsui
52548d4f2dStsutsui uint neaddr_conf[] = {
53548d4f2dStsutsui 0xece200, /* Neptune-X at ISA addr 0x300 */
54548d4f2dStsutsui 0xece300, /* Nereid #1 */
55548d4f2dStsutsui 0xeceb00, /* Nereid #2 */
56548d4f2dStsutsui };
57548d4f2dStsutsui uint neaddr;
58548d4f2dStsutsui
59548d4f2dStsutsui
60548d4f2dStsutsui static int
ne_match(struct netif * nif,void * machdep_hint)61548d4f2dStsutsui ne_match(struct netif *nif, void *machdep_hint)
62548d4f2dStsutsui {
63548d4f2dStsutsui int i;
64548d4f2dStsutsui
65548d4f2dStsutsui for (i = 0; i < sizeof(neaddr_conf) / sizeof(neaddr_conf[0]); i++) {
66548d4f2dStsutsui if (!badbaddr((void *)neaddr_conf[i])) {
67548d4f2dStsutsui neaddr = neaddr_conf[i];
68548d4f2dStsutsui return 1;
69548d4f2dStsutsui }
70548d4f2dStsutsui }
71548d4f2dStsutsui printf("ne_match: no match\n");
72548d4f2dStsutsui return 0;
73548d4f2dStsutsui }
74548d4f2dStsutsui
75548d4f2dStsutsui static int
ne_probe(struct netif * nif,void * machdep_hint)76548d4f2dStsutsui ne_probe(struct netif *nif, void *machdep_hint)
77548d4f2dStsutsui {
78548d4f2dStsutsui
79548d4f2dStsutsui return 0;
80548d4f2dStsutsui }
81548d4f2dStsutsui
82548d4f2dStsutsui static void
ne_init(struct iodesc * desc,void * machdep_hint)83548d4f2dStsutsui ne_init(struct iodesc *desc, void *machdep_hint)
84548d4f2dStsutsui {
85548d4f2dStsutsui
86548d4f2dStsutsui #ifdef DEBUG
87548d4f2dStsutsui printf("ne_init\n");
88548d4f2dStsutsui #endif
89548d4f2dStsutsui if (EtherInit(desc->myea) == 0) {
90548d4f2dStsutsui printf("EtherInit failed?\n");
91548d4f2dStsutsui exit(1);
92548d4f2dStsutsui }
93548d4f2dStsutsui
94548d4f2dStsutsui printf("ethernet address = %s\n", ether_sprintf(desc->myea));
95548d4f2dStsutsui }
96548d4f2dStsutsui
97548d4f2dStsutsui static int
ne_get(struct iodesc * desc,void * pkt,size_t maxlen,saseconds_t timeout)98548d4f2dStsutsui ne_get(struct iodesc *desc, void *pkt, size_t maxlen, saseconds_t timeout)
99548d4f2dStsutsui {
100548d4f2dStsutsui int len = 0;
101548d4f2dStsutsui saseconds_t t;
102548d4f2dStsutsui
103548d4f2dStsutsui t = getsecs() + timeout;
104548d4f2dStsutsui while (getsecs() < t) {
105548d4f2dStsutsui len = EtherReceive(pkt, maxlen);
106548d4f2dStsutsui if (len)
107548d4f2dStsutsui break;
108548d4f2dStsutsui }
109548d4f2dStsutsui
110548d4f2dStsutsui return len;
111548d4f2dStsutsui }
112548d4f2dStsutsui
113548d4f2dStsutsui static int
ne_put(struct iodesc * desc,void * pkt,size_t len)114548d4f2dStsutsui ne_put(struct iodesc *desc, void *pkt, size_t len)
115548d4f2dStsutsui {
116548d4f2dStsutsui #ifdef DEBUG
117548d4f2dStsutsui struct ether_header *eh;
118548d4f2dStsutsui
119548d4f2dStsutsui eh = pkt;
120548d4f2dStsutsui printf("dst: %s\n", ether_sprintf(eh->ether_dhost));
121548d4f2dStsutsui printf("src: %s\n", ether_sprintf(eh->ether_shost));
122548d4f2dStsutsui printf("type: 0x%x\n", eh->ether_type & 0xffff);
123548d4f2dStsutsui #endif
124548d4f2dStsutsui
125548d4f2dStsutsui return EtherSend(pkt, len);
126548d4f2dStsutsui }
127548d4f2dStsutsui
128548d4f2dStsutsui static void
ne_end(struct netif * nif)129548d4f2dStsutsui ne_end(struct netif *nif)
130548d4f2dStsutsui {
131548d4f2dStsutsui
132548d4f2dStsutsui #ifdef DEBUG
133548d4f2dStsutsui printf("ne_end\n");
134548d4f2dStsutsui #endif
135548d4f2dStsutsui
136548d4f2dStsutsui EtherStop();
137548d4f2dStsutsui }
138548d4f2dStsutsui
139548d4f2dStsutsui
140548d4f2dStsutsui struct netif_stats ne_stats;
141548d4f2dStsutsui struct netif_dif ne_ifs[] = {
142548d4f2dStsutsui { 0, 1, &ne_stats, 0, 0, },
143548d4f2dStsutsui };
144548d4f2dStsutsui
145548d4f2dStsutsui struct netif_driver ne_netif_driver = {
146548d4f2dStsutsui "ne",
147548d4f2dStsutsui ne_match,
148548d4f2dStsutsui ne_probe,
149548d4f2dStsutsui ne_init,
150548d4f2dStsutsui ne_get,
151548d4f2dStsutsui ne_put,
152548d4f2dStsutsui ne_end,
153548d4f2dStsutsui ne_ifs,
154548d4f2dStsutsui sizeof(ne_ifs) / sizeof(ne_ifs[0]),
155548d4f2dStsutsui };
156