xref: /netbsd-src/sys/arch/sbmips/stand/netboot/if_cfe.c (revision e2cb85904d2be7c36d140a4498b1cc12b3338cbd)
1*e2cb8590Scegger /* $NetBSD: if_cfe.c,v 1.5 2009/03/18 17:06:46 cegger Exp $ */
2c188bc0cScgd 
3c188bc0cScgd /*
4c188bc0cScgd  * Copyright (c) 1997 Christopher G. Demetriou.  All rights reserved.
5c188bc0cScgd  * Copyright (c) 1993 Adam Glass
6c188bc0cScgd  * All rights reserved.
7c188bc0cScgd  *
8c188bc0cScgd  * Redistribution and use in source and binary forms, with or without
9c188bc0cScgd  * modification, are permitted provided that the following conditions
10c188bc0cScgd  * are met:
11c188bc0cScgd  * 1. Redistributions of source code must retain the above copyright
12c188bc0cScgd  *    notice, this list of conditions and the following disclaimer.
13c188bc0cScgd  * 2. Redistributions in binary form must reproduce the above copyright
14c188bc0cScgd  *    notice, this list of conditions and the following disclaimer in the
15c188bc0cScgd  *    documentation and/or other materials provided with the distribution.
16c188bc0cScgd  * 3. All advertising materials mentioning features or use of this software
17c188bc0cScgd  *    must display the following acknowledgement:
18c188bc0cScgd  *	This product includes software developed by Adam Glass.
19c188bc0cScgd  * 4. The name of the Author may not be used to endorse or promote products
20c188bc0cScgd  *    derived from this software without specific prior written permission.
21c188bc0cScgd  *
22c188bc0cScgd  * THIS SOFTWARE IS PROVIDED BY Adam Glass ``AS IS'' AND
23c188bc0cScgd  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24c188bc0cScgd  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25c188bc0cScgd  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26c188bc0cScgd  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27c188bc0cScgd  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28c188bc0cScgd  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29c188bc0cScgd  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30c188bc0cScgd  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31c188bc0cScgd  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32c188bc0cScgd  * SUCH DAMAGE.
33c188bc0cScgd  */
34c188bc0cScgd 
35c188bc0cScgd #include <sys/param.h>
36c188bc0cScgd #include <sys/types.h>
37c188bc0cScgd 
38c188bc0cScgd #include <netinet/in.h>
39c188bc0cScgd #include <netinet/in_systm.h>
40c188bc0cScgd 
41c188bc0cScgd #include <lib/libsa/stand.h>
42c188bc0cScgd #include <lib/libsa/net.h>
43c188bc0cScgd #include <lib/libsa/netif.h>
44c188bc0cScgd #include <lib/libkern/libkern.h>
45c188bc0cScgd 
46c188bc0cScgd #include "stand/common/common.h"
47c188bc0cScgd #include "stand/common/bbinfo.h"
48c188bc0cScgd #include "stand/common/cfe_api.h"
49c188bc0cScgd #include "stand/common/cfe_ioctl.h"
50c188bc0cScgd 
51c188bc0cScgd int cfenet_probe(struct netif *, void *);
52c188bc0cScgd int cfenet_match(struct netif *, void *);
53c188bc0cScgd void cfenet_init(struct iodesc *, void *);
5469cf32a7Stsutsui int cfenet_get(struct iodesc *, void *, size_t, saseconds_t);
55c188bc0cScgd int cfenet_put(struct iodesc *, void *, size_t);
56c188bc0cScgd void cfenet_end(struct netif *);
57c188bc0cScgd 
58c188bc0cScgd extern struct netif_stats	cfenet_stats[];
59c188bc0cScgd 
60c188bc0cScgd struct netif_dif cfenet_ifs[] = {
61c188bc0cScgd /*	dif_unit	dif_nsel	dif_stats	dif_private	*/
62c188bc0cScgd {	0,		1,		&cfenet_stats[0],	0,		},
63c188bc0cScgd };
6420b89526Sdrochner #define NCFENET_IFS (sizeof(cfenet_ifs) / sizeof(cfenet_ifs[0]))
65c188bc0cScgd 
6620b89526Sdrochner struct netif_stats cfenet_stats[NCFENET_IFS];
67c188bc0cScgd 
68c188bc0cScgd struct netif_driver prom_netif_driver = {
69c188bc0cScgd 	"cfe",			/* netif_bname */
70c188bc0cScgd 	cfenet_match,		/* netif_match */
71c188bc0cScgd 	cfenet_probe,		/* netif_probe */
72c188bc0cScgd 	cfenet_init,		/* netif_init */
73c188bc0cScgd 	cfenet_get,		/* netif_get */
74c188bc0cScgd 	cfenet_put,		/* netif_put */
75c188bc0cScgd 	cfenet_end,		/* netif_end */
76c188bc0cScgd 	cfenet_ifs,		/* netif_ifs */
7720b89526Sdrochner 	NCFENET_IFS		/* netif_nifs */
78c188bc0cScgd };
79c188bc0cScgd 
80c188bc0cScgd int
cfenet_match(struct netif * nif,void * machdep_hint)81454af1c0Sdsl cfenet_match(struct netif *nif, void *machdep_hint)
82c188bc0cScgd {
83c188bc0cScgd 
84c188bc0cScgd 	return (1);
85c188bc0cScgd }
86c188bc0cScgd 
87c188bc0cScgd int
cfenet_probe(struct netif * nif,void * machdep_hint)88454af1c0Sdsl cfenet_probe(struct netif *nif, void *machdep_hint)
89c188bc0cScgd {
90c188bc0cScgd 
91c188bc0cScgd 	return 0;
92c188bc0cScgd }
93c188bc0cScgd 
94c188bc0cScgd int
cfenet_put(struct iodesc * desc,void * pkt,size_t len)95454af1c0Sdsl cfenet_put(struct iodesc *desc, void *pkt, size_t len)
96c188bc0cScgd {
97c188bc0cScgd 
98c188bc0cScgd     cfe_write(booted_dev_fd,pkt,len);
99c188bc0cScgd 
100c188bc0cScgd     return len;
101c188bc0cScgd }
102c188bc0cScgd 
103c188bc0cScgd 
104c188bc0cScgd int
cfenet_get(struct iodesc * desc,void * pkt,size_t len,saseconds_t timeout)105454af1c0Sdsl cfenet_get(struct iodesc *desc, void *pkt, size_t len, saseconds_t timeout)
106c188bc0cScgd {
10769cf32a7Stsutsui 	satime_t t;
108c188bc0cScgd 	int cc;
109c188bc0cScgd 
110c188bc0cScgd 	t = getsecs();
111c188bc0cScgd 	cc = 0;
112c188bc0cScgd 	while (((getsecs() - t) < timeout) && !cc) {
113c188bc0cScgd 	    cc = cfe_read(booted_dev_fd,pkt,len);
114c188bc0cScgd 	    if (cc < 0) break;
115c188bc0cScgd 	    break;
116c188bc0cScgd 	}
117c188bc0cScgd 
118c188bc0cScgd 	return cc;
119c188bc0cScgd }
120c188bc0cScgd 
121c188bc0cScgd void
cfenet_init(struct iodesc * desc,void * machdep_hint)122454af1c0Sdsl cfenet_init(struct iodesc *desc, void *machdep_hint)
123c188bc0cScgd {
124c188bc0cScgd 	u_int8_t eaddr[6];
125c188bc0cScgd 	int res;
126c188bc0cScgd 
127c188bc0cScgd 	res = cfe_ioctl(booted_dev_fd,IOCTL_ETHER_GETHWADDR,eaddr,sizeof(eaddr),NULL,0);
128c188bc0cScgd 
129c188bc0cScgd 	if (res < 0) {
130c188bc0cScgd 	    printf("boot: boot device name does not contain ethernet address.\n");
131c188bc0cScgd 	    goto punt;
132c188bc0cScgd 	    }
133c188bc0cScgd 
134*e2cb8590Scegger 	memcpy(desc->myea, eaddr,6);
135c188bc0cScgd 
136c188bc0cScgd 	printf("boot: ethernet address: %s\n", ether_sprintf(desc->myea));
137c188bc0cScgd 	return;
138c188bc0cScgd 
139c188bc0cScgd punt:
140c188bc0cScgd 	halt();
141c188bc0cScgd 
142c188bc0cScgd }
143c188bc0cScgd 
144c188bc0cScgd void
cfenet_end(struct netif * nif)145454af1c0Sdsl cfenet_end(struct netif *nif)
146c188bc0cScgd {
147c188bc0cScgd 
148c188bc0cScgd 	/* nothing to do */
149c188bc0cScgd }
150