1 /* $NetBSD: netif_sun.c,v 1.11 2009/03/18 16:00:15 cegger Exp $ */
4 * Copyright (c) 1995 Gordon W. Ross
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 * The Sun PROM has a fairly general set of network drivers,
30 * so it is easiest to just replace the netif module with
31 * this adaptation to the PROM network interface.
34 #include <sys/param.h>
35 #include <sys/socket.h>
38 #include <net/if_ether.h>
40 #include <netinet/in.h>
41 #include <netinet/in_systm.h>
43 #include <lib/libsa/stand.h>
44 #include <lib/libsa/net.h>
45 #include <lib/libsa/netif.h>
46 #include <lib/libkern/libkern.h>
48 #include <machine/promlib.h>
49 #include <sparc/stand/common/promdev.h>
51 static struct netif netif_prom
;
57 struct iodesc sockets
[SOPEN_MAX
];
70 netif_open(void *machdep_hint
)
72 struct promdata
*pd
= machdep_hint
;
76 /* find a free socket */
80 printf("netif_open: device busy\n");
85 memset(io
, 0, sizeof(*io
));
87 netif_prom
.nif_devdata
= pd
;
88 io
->io_netif
= &netif_prom
;
90 /* Put our ethernet address in io->myea */
91 switch (prom_version()) {
95 node
= prom_instance_to_package(pd
->fd
);
100 prom_getether(node
, io
->myea
);
119 ni
->nif_devdata
= NULL
;
126 * Send a packet. The ether header is already there.
127 * Return the length sent (or -1 on error).
130 netif_put(struct iodesc
*desc
, void *pkt
, size_t len
)
136 pd
= (struct promdata
*)((struct netif
*)desc
->io_netif
)->nif_devdata
;
140 struct ether_header
*eh
;
142 printf("netif_put: desc=0x%x pkt=0x%x len=%d\n",
145 printf("dst: %s ", ether_sprintf(eh
->ether_dhost
));
146 printf("src: %s ", ether_sprintf(eh
->ether_shost
));
147 printf("type: 0x%x\n", eh
->ether_type
& 0xFFFF);
155 printf("netif_put: length padded to %d\n", sendlen
);
159 rv
= (*pd
->xmit
)(pd
, pkt
, sendlen
);
163 printf("netif_put: xmit returned %d\n", rv
);
170 * Receive a packet, including the ether header.
171 * Return the total length received (or -1 on error).
174 netif_get(struct iodesc
*desc
, void *pkt
, size_t maxlen
, saseconds_t timo
)
180 pd
= (struct promdata
*)((struct netif
*)desc
->io_netif
)->nif_devdata
;
184 printf("netif_get: pkt=0x%x, maxlen=%d, tmo=%d\n",
191 len
= (*pd
->recv
)(pd
, pkt
, maxlen
);
192 } while ((len
== 0) && ((getsecs() - tick0
) < timo
));
196 printf("netif_get: received len=%d\n", len
);
204 struct ether_header
*eh
= pkt
;
206 printf("dst: %s ", ether_sprintf(eh
->ether_dhost
));
207 printf("src: %s ", ether_sprintf(eh
->ether_shost
));
208 printf("type: 0x%x\n", eh
->ether_type
& 0xFFFF);