Annotation of Gnu-Mach/chips/atm.c, revision 1.1

1.1     ! root        1: /* 
        !             2:  * Mach Operating System
        !             3:  * Copyright (c) 1992 Carnegie Mellon University
        !             4:  * All Rights Reserved.
        !             5:  * 
        !             6:  * Permission to use, copy, modify and distribute this software and its
        !             7:  * documentation is hereby granted, provided that both the copyright
        !             8:  * notice and this permission notice appear in all copies of the
        !             9:  * software, derivative works or modified versions, and any portions
        !            10:  * thereof, and that both notices appear in supporting documentation.
        !            11:  * 
        !            12:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
        !            13:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
        !            14:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
        !            15:  * 
        !            16:  * Carnegie Mellon requests users of this software to return to
        !            17:  * 
        !            18:  *  Software Distribution Coordinator  or  [email protected]
        !            19:  *  School of Computer Science
        !            20:  *  Carnegie Mellon University
        !            21:  *  Pittsburgh PA 15213-3890
        !            22:  * 
        !            23:  * any improvements or extensions that they make and grant Carnegie Mellon
        !            24:  * the rights to redistribute these changes.
        !            25:  */
        !            26: 
        !            27: #include <atm.h>
        !            28: 
        !            29: #if    NATM > 0
        !            30: 
        !            31: #include <vm/vm_kern.h>
        !            32: #include <machine/machspl.h>           /* spl definitions */
        !            33: #include <kern/time_out.h>             /* ? maybe */
        !            34: #include <device/errno.h>
        !            35: #include <device/io_req.h>
        !            36: #include <device/net_status.h>
        !            37: 
        !            38: #include <chips/busses.h>
        !            39: #include <chips/atmreg.h>
        !            40: 
        !            41: #include <kern/eventcount.h>
        !            42: 
        !            43: #include <mips/mips_cpu.h>
        !            44: 
        !            45: 
        !            46: struct bus_device *atm_info[NATM];
        !            47: int atm_probe();
        !            48: static void atm_attach();
        !            49: 
        !            50: struct bus_driver atm_driver =
        !            51:        { atm_probe, 0, atm_attach, 0, /* csr */ 0, "atm", atm_info,
        !            52:                 "", 0, /* flags */ 0 };                /* ENABLED BUS INTR? */
        !            53: 
        !            54: /* XX           "", 0,  BUS_INTR_DISABLED}; */
        !            55: 
        !            56: typedef struct atm_softc {
        !            57:        struct atm_device        *atm_dev;              
        !            58:        struct evc              atm_eventcounter;
        !            59:        mapped_atm_info_t       atm_mapped_info;
        !            60: } atm_softc_t;
        !            61: 
        !            62: 
        !            63: natural_t atm_nintrs = 0;
        !            64: 
        !            65: atm_softc_t atm_softc[NATM];
        !            66: 
        !            67: atm_probe(reg, ui)
        !            68:        vm_offset_t reg;
        !            69:        register struct bus_device *ui;
        !            70: {
        !            71:     register atm_softc_t *atm;
        !            72:     mapped_atm_info_t info; /* info struct to hand to users */ 
        !            73:     vm_offset_t        addr;
        !            74:     int             unit = ui->unit;
        !            75: 
        !            76:     if (check_memory(reg, 0))  {
        !            77:        return 0;
        !            78:     }
        !            79: 
        !            80:     atm_info[unit] = ui;
        !            81:     atm = &atm_softc[unit];
        !            82:     atm->atm_dev = (struct atm_device *) reg; /* k1 address */
        !            83: 
        !            84:     evc_init(&atm->atm_eventcounter);
        !            85:     
        !            86: printf("evc_init of atm: event counter id is %d\n", atm->atm_eventcounter.ev_id);
        !            87:     
        !            88:     /* initialize the interface to deliver. No interrupts by default */
        !            89:     atm->atm_dev->sreg = 0;
        !            90:     atm->atm_dev->creg = (CR_RX_RESET | CR_TX_RESET);
        !            91:     atm->atm_dev->creg = 0;
        !            92:     atm->atm_dev->creg_set = (CR_RX_ENABLE | CR_TX_ENABLE);
        !            93: #ifdef notdef  
        !            94:     atm->atm_dev->rxthresh = 0;
        !            95:     atm->atm_dev->rxtimerv = 0;
        !            96:     atm->atm_dev->creg_s = RX_EOM_INTR; /* enable interrupt on end of message */
        !            97: #endif 
        !            98: 
        !            99:     /*
        !           100:      * Grab a page to be mapped later to users 
        !           101:      */
        !           102:     (void) kmem_alloc_wired(kernel_map, &addr, PAGE_SIZE); /* kseg2 */
        !           103:     bzero(addr, PAGE_SIZE);
        !           104:     addr = pmap_extract(pmap_kernel(), addr); /* phys */
        !           105:     info = (mapped_atm_info_t) PHYS_TO_K0SEG(addr);
        !           106:     atm->atm_mapped_info = info;
        !           107: 
        !           108:     /*
        !           109:      * Set some permanent info
        !           110:      */
        !           111:     info->hello_world = 0xdeadbeef;
        !           112:     info->interrupt_count = 0;
        !           113:     info->wait_event = atm->atm_eventcounter.ev_id;
        !           114:     info->saved_status_reg = 0;
        !           115: 
        !           116:     return 1;
        !           117: }
        !           118: 
        !           119: static void
        !           120: atm_attach(ui)
        !           121: register struct bus_device *ui;
        !           122: {
        !           123: }
        !           124: 
        !           125: int atm_disable_interrupts_after_each = 1;
        !           126: 
        !           127: 
        !           128: #define ATM_INTERRUPTS (RX_COUNT_INTR | RX_EOM_INTR | RX_TIME_INTR)
        !           129: 
        !           130: atm_intr(unit, spllevel)
        !           131: int unit;
        !           132: int spllevel;
        !           133: {
        !           134:     register struct atm_softc  *atm = &atm_softc[unit];
        !           135:     struct atm_device *atm_dev = atm->atm_dev;
        !           136:     unsigned int intr;
        !           137: 
        !           138:     if (atm_dev == 0)  {
        !           139:        printf("atm: stray interrupt\n");
        !           140:        return;
        !           141:     }
        !           142: 
        !           143:     /* Acknowledge interrupt request */
        !           144:     intr = ATM_READ_REG(atm_dev->sreg);
        !           145:     atm_dev->sreg = ~(intr & ATM_INTERRUPTS);
        !           146: 
        !           147:     /* clear the reason for the interrupt */
        !           148:     if (atm_disable_interrupts_after_each)
        !           149:            atm_dev->creg &= ~intr;
        !           150: 
        !           151:     splx(spllevel); /* drop priority now */
        !           152: 
        !           153:     atm_intr_occurred();
        !           154: 
        !           155: 
        !           156:     /* Pass status info up to user */
        !           157:     if (atm->atm_mapped_info)  {
        !           158:        atm->atm_mapped_info->interrupt_count++;
        !           159:        atm->atm_mapped_info->saved_status_reg = intr;
        !           160:     }
        !           161: 
        !           162:     /* Awake user thread */    
        !           163: 
        !           164:     evc_signal(&atm->atm_eventcounter);
        !           165: 
        !           166:     /* NOTE: INTERRUPTS ARE DISABLED. */
        !           167: }
        !           168: 
        !           169: atm_intr_occurred()
        !           170: {
        !           171:     atm_nintrs++;
        !           172: }
        !           173: 
        !           174: 
        !           175: atm_output(dev, ior)
        !           176: int            dev;
        !           177: io_req_t       ior;
        !           178: {
        !           179: }
        !           180: 
        !           181: atm_start(unit)
        !           182: int unit;
        !           183: {
        !           184: }
        !           185: 
        !           186: atm_open(dev, flag, ior)
        !           187:        int             dev;
        !           188:        int             flag;
        !           189:        io_req_t        ior;
        !           190: {
        !           191:        register int            unit = dev;
        !           192:        register atm_softc_t    *atm = &atm_softc[unit];
        !           193:        
        !           194:        if (unit >= NATM)
        !           195:                return EINVAL;
        !           196:        if (!atm->atm_dev)
        !           197:                return ENXIO;
        !           198: 
        !           199:        return KERN_SUCCESS;
        !           200: }
        !           201: 
        !           202: atm_close(dev, flag)
        !           203: int    dev;
        !           204: {
        !           205: }
        !           206: 
        !           207: atm_read(dev, ior)
        !           208: int            dev;
        !           209: io_req_t       ior;
        !           210: {
        !           211: }
        !           212: 
        !           213: atm_write(dev, ior)
        !           214: int            dev;
        !           215: io_req_t       ior;
        !           216: {
        !           217: }
        !           218: 
        !           219: atm_get_status(dev, flavor, status, status_count)
        !           220:        int              dev;
        !           221:        int              flavor;
        !           222:        dev_status_t     status;        /* pointer to OUT array */
        !           223:        natural_t       *status_count;          /* out */
        !           224: {
        !           225:     switch (flavor) {
        !           226:     case NET_STATUS:
        !           227:     {
        !           228:        register struct net_status *ns = (struct net_status *)status;
        !           229: 
        !           230:        ns->min_packet_size = sizeof(struct sar_data);
        !           231:        ns->max_packet_size = sizeof(struct sar_data);
        !           232:        ns->header_format   = 999; /* XX */
        !           233:        ns->header_size     = sizeof(int); /* XX */
        !           234:        ns->address_size    = 0;
        !           235:        ns->flags           = 0;
        !           236:        ns->mapped_size     = sizeof(struct atm_device) + PAGE_SIZE;
        !           237:        *status_count = NET_STATUS_COUNT;
        !           238:        break;
        !           239:     }
        !           240:     case NET_ADDRESS:
        !           241:        /* This would be a good place for it */
        !           242:     default:
        !           243:        return (D_INVALID_OPERATION);
        !           244:     }
        !           245:     return (D_SUCCESS);    
        !           246: }
        !           247: 
        !           248: atm_set_status(dev, flavor, status, status_count)
        !           249:        int             dev;
        !           250:        int             flavor;
        !           251:        dev_status_t    status;
        !           252:        natural_t       status_count;
        !           253: {
        !           254: }
        !           255: 
        !           256: atm_mmap(dev, off, prot)
        !           257:        int             dev;
        !           258:        vm_offset_t     off;
        !           259:        int             prot;
        !           260: {
        !           261:        int             unit = dev;
        !           262:        vm_offset_t     addr;
        !           263: 
        !           264:        /*
        !           265:         * Layout of mapped area is:
        !           266:         * 000 -- FA_END:                       DEVICE
        !           267:         * FA_END -- FA_END + PAGE_SIZE:        SHARED STATE
        !           268:         */
        !           269:        if (off < sizeof(struct atm_device))     {
        !           270:            addr = K1SEG_TO_PHYS((vm_offset_t)(atm_softc[unit].atm_dev)) + off;
        !           271:        } else if (off < sizeof(struct atm_device) + PAGE_SIZE) {
        !           272:            addr = K0SEG_TO_PHYS(atm_softc[unit].atm_mapped_info);
        !           273:        } else return -1;
        !           274:        return mips_btop(addr);
        !           275: }
        !           276: 
        !           277: atm_setinput(dev, receive_port, priority, filter, filter_count)
        !           278:        int             dev;
        !           279:        ipc_port_t      receive_port;
        !           280:        int             priority;
        !           281:        /*filter_t      *filter;*/
        !           282:        natural_t       filter_count;
        !           283: {
        !           284: }
        !           285: 
        !           286: atm_restart(ifp)
        !           287: /*     register struct ifnet *ifp;     */
        !           288: {
        !           289: }
        !           290: 
        !           291: atm_portdeath(dev, port)
        !           292:        int             dev;
        !           293:        mach_port_t     port;
        !           294: {
        !           295: }
        !           296: 
        !           297: #endif NATM > 0
        !           298: 
        !           299: 
        !           300: 
        !           301: 
        !           302: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.