xref: /netbsd-src/sys/arch/x68k/stand/boot/if_ne.c (revision 6b664a713479c31d4f17b38b42182a5d5fa21802)
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