[BACK]Return to netif_of.c CVS log [TXT][DIR] Up to [local] / sys / arch / sparc64 / stand / ofwboot

Annotation of sys/arch/sparc64/stand/ofwboot/netif_of.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: netif_of.c,v 1.4 2001/08/22 10:44:02 art Exp $        */
                      2: /*     $NetBSD: netif_of.c,v 1.1 2000/08/20 14:58:39 mrg Exp $ */
                      3:
                      4: /*
                      5:  * Copyright (C) 1995 Wolfgang Solfrank.
                      6:  * Copyright (C) 1995 TooLs GmbH.
                      7:  * All rights reserved.
                      8:  *
                      9:  * Redistribution and use in source and binary forms, with or without
                     10:  * modification, are permitted provided that the following conditions
                     11:  * are met:
                     12:  * 1. Redistributions of source code must retain the above copyright
                     13:  *    notice, this list of conditions and the following disclaimer.
                     14:  * 2. Redistributions in binary form must reproduce the above copyright
                     15:  *    notice, this list of conditions and the following disclaimer in the
                     16:  *    documentation and/or other materials provided with the distribution.
                     17:  * 3. All advertising materials mentioning features or use of this software
                     18:  *    must display the following acknowledgement:
                     19:  *     This product includes software developed by TooLs GmbH.
                     20:  * 4. The name of TooLs GmbH may not be used to endorse or promote products
                     21:  *    derived from this software without specific prior written permission.
                     22:  *
                     23:  * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
                     24:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     25:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     26:  * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
                     27:  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
                     28:  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
                     29:  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
                     30:  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
                     31:  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
                     32:  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     33:  */
                     34:
                     35: /*
                     36:  * Open Firmware does most of the job for interfacing to the hardware,
                     37:  * so it is easiest to just replace the netif module with
                     38:  * this adaptation to the PROM network interface.
                     39:  *
                     40:  * Note: this is based in part on sys/arch/sparc/stand/netif_sun.c
                     41:  */
                     42:
                     43: #include <sys/param.h>
                     44: #include <sys/socket.h>
                     45:
                     46: #include <net/if.h>
                     47:
                     48: #include <netinet/in.h>
                     49: #include <netinet/in_systm.h>
                     50: #include <netinet/if_ether.h>
                     51:
                     52: #include <lib/libsa/stand.h>
                     53: #include <lib/libsa/net.h>
                     54: #include <lib/libsa/netif.h>
                     55:
                     56: #include "ofdev.h"
                     57: #include "openfirm.h"
                     58:
                     59: static struct netif netif_of;
                     60:
                     61: struct iodesc sockets[SOPEN_MAX];
                     62:
                     63: struct iodesc *
                     64: socktodesc(sock)
                     65:        int sock;
                     66: {
                     67:        if (sock != 0)
                     68:                return NULL;
                     69:        return sockets;
                     70: }
                     71:
                     72: int
                     73: netif_open(machdep_hint)
                     74:        void *machdep_hint;
                     75: {
                     76:        struct of_dev *op = machdep_hint;
                     77:        struct iodesc *io;
                     78:        int fd, error;
                     79:        char addr[32];
                     80:
                     81: #ifdef NETIF_DEBUG
                     82:        printf("netif_open...");
                     83: #endif
                     84:        /* find a free socket */
                     85:        io = sockets;
                     86:        if (io->io_netif) {
                     87: #ifdef NETIF_DEBUG
                     88:                printf("device busy\n");
                     89: #endif
                     90:                errno = ENFILE;
                     91:                return -1;
                     92:        }
                     93:        bzero(io, sizeof *io);
                     94:
                     95:        netif_of.nif_devdata = op;
                     96:        io->io_netif = &netif_of;
                     97:
                     98:        /* Put our ethernet address in io->myea */
                     99:        OF_getprop(OF_instance_to_package(op->handle),
                    100:                   "mac-address", io->myea, sizeof io->myea);
                    101:
                    102: #ifdef NETIF_DEBUG
                    103:        printf("OK\n");
                    104: #endif
                    105:        return 0;
                    106: }
                    107:
                    108: int
                    109: netif_close(fd)
                    110:        int fd;
                    111: {
                    112:        struct iodesc *io;
                    113:        struct netif *ni;
                    114:
                    115: #ifdef NETIF_DEBUG
                    116:        printf("netif_close(%x)...", fd);
                    117: #endif
                    118:        if (fd != 0) {
                    119: #ifdef NETIF_DEBUG
                    120:                printf("EBADF\n");
                    121: #endif
                    122:                errno = EBADF;
                    123:                return -1;
                    124:        }
                    125:
                    126:        io = &sockets[fd];
                    127:        ni = io->io_netif;
                    128:        if (ni != NULL) {
                    129:                ni->nif_devdata = NULL;
                    130:                io->io_netif = NULL;
                    131:        }
                    132: #ifdef NETIF_DEBUG
                    133:        printf("OK\n");
                    134: #endif
                    135:        return 0;
                    136: }
                    137:
                    138: /*
                    139:  * Send a packet.  The ether header is already there.
                    140:  * Return the length sent (or -1 on error).
                    141:  */
                    142: ssize_t
                    143: netif_put(desc, pkt, len)
                    144:        struct iodesc *desc;
                    145:        void *pkt;
                    146:        size_t len;
                    147: {
                    148:        struct of_dev *op;
                    149:        ssize_t rv;
                    150:        size_t sendlen;
                    151:
                    152:        op = desc->io_netif->nif_devdata;
                    153:
                    154: #ifdef NETIF_DEBUG
                    155:        {
                    156:                struct ether_header *eh;
                    157:
                    158:                printf("netif_put: desc=0x%x pkt=0x%x len=%d\n",
                    159:                       desc, pkt, len);
                    160:                eh = pkt;
                    161:                printf("dst: %s ", ether_sprintf(eh->ether_dhost));
                    162:                printf("src: %s ", ether_sprintf(eh->ether_shost));
                    163:                printf("type: 0x%x\n", eh->ether_type & 0xFFFF);
                    164:        }
                    165: #endif
                    166:
                    167:        sendlen = len;
                    168:        if (sendlen < 60) {
                    169:                sendlen = 60;
                    170: #ifdef NETIF_DEBUG
                    171:                printf("netif_put: length padded to %d\n", sendlen);
                    172: #endif
                    173:        }
                    174:
                    175:        rv = OF_write(op->handle, pkt, sendlen);
                    176:
                    177: #ifdef NETIF_DEBUG
                    178:        printf("netif_put: xmit returned %d\n", rv);
                    179: #endif
                    180:
                    181:        return rv;
                    182: }
                    183:
                    184: /*
                    185:  * Receive a packet, including the ether header.
                    186:  * Return the total length received (or -1 on error).
                    187:  */
                    188: ssize_t
                    189: netif_get(desc, pkt, maxlen, timo)
                    190:        struct iodesc *desc;
                    191:        void *pkt;
                    192:        size_t maxlen;
                    193:        time_t timo;
                    194: {
                    195:        struct of_dev *op;
                    196:        int tick0, tmo_ms;
                    197:        int len;
                    198:
                    199:        op = desc->io_netif->nif_devdata;
                    200:
                    201: #ifdef NETIF_DEBUG
                    202:        printf("netif_get: pkt=0x%x, maxlen=%d, tmo=%d\n",
                    203:               pkt, maxlen, timo);
                    204: #endif
                    205:
                    206:        tmo_ms = timo * 1000;
                    207:        tick0 = OF_milliseconds();
                    208:
                    209:        do {
                    210:                len = OF_read(op->handle, pkt, maxlen);
                    211:        } while ((len == -2 || len == 0) &&
                    212:                 (OF_milliseconds() - tick0 < tmo_ms));
                    213:
                    214: #ifdef NETIF_DEBUG
                    215:        printf("netif_get: received len=%d\n", len);
                    216: #endif
                    217:
                    218:        if (len < 12)
                    219:                return -1;
                    220:
                    221: #ifdef NETIF_DEBUG
                    222:        {
                    223:                struct ether_header *eh = pkt;
                    224:
                    225:                printf("dst: %s ", ether_sprintf(eh->ether_dhost));
                    226:                printf("src: %s ", ether_sprintf(eh->ether_shost));
                    227:                printf("type: 0x%x\n", eh->ether_type & 0xFFFF);
                    228:        }
                    229: #endif
                    230:
                    231:        return len;
                    232: }
                    233:
                    234: /*
                    235:  * Shouldn't really be here, but is used solely for networking, so...
                    236:  */
                    237: time_t
                    238: getsecs()
                    239: {
                    240:        return OF_milliseconds() / 1000;
                    241: }

CVSweb