Annotation of Gnu-Mach/chips/tca100.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: #ifndef STUB
        !            28: #include <atm.h>
        !            29: #else
        !            30: #include "atm.h"
        !            31: #endif
        !            32: 
        !            33: #if NATM > 0
        !            34: 
        !            35: #ifndef STUB
        !            36: #include <sys/types.h>
        !            37: #include <kern/thread.h>
        !            38: #include <kern/lock.h>
        !            39: #include <kern/eventcount.h>
        !            40: #include <machine/machspl.h>           /* spl definitions */
        !            41: #include <mips/mips_cpu.h>
        !            42: #include <vm/vm_kern.h>
        !            43: #include <device/io_req.h>
        !            44: #include <device/device_types.h>
        !            45: #include <device/net_status.h>
        !            46: #include <chips/busses.h>
        !            47: #include <chips/nc.h>
        !            48: #include <chips/tca100.h>
        !            49: #include <chips/tca100_if.h>
        !            50: 
        !            51: decl_simple_lock_data(, atm_simple_lock);
        !            52: 
        !            53: #else
        !            54: #include "stub.h"
        !            55: #include "nc.h"
        !            56: #include "tca100_if.h"
        !            57: #include "tca100.h"
        !            58: 
        !            59: int atm_simple_lock;
        !            60: 
        !            61: #endif
        !            62: 
        !            63: struct bus_device *atm_info[NATM];
        !            64: 
        !            65: int atm_probe();
        !            66: void atm_attach();
        !            67: struct bus_driver atm_driver =
        !            68:        { atm_probe, 0, atm_attach, 0, /* csr */ 0, "atm", atm_info,
        !            69:                 "", 0, /* flags */ 0 };               
        !            70: 
        !            71: atm_device_t atmp[NATM] = {NULL};
        !            72: u_int atm_open_count[NATM];
        !            73: u_int atm_mapped[NATM];
        !            74: u_int atm_control_mask[NATM];
        !            75: struct evc atm_event_counter[NATM];
        !            76: 
        !            77: #define DEVICE(unit) ((unit == 0) ? NW_TCA100_1 : NW_TCA100_2)
        !            78: 
        !            79: void atm_initialize(int unit) {
        !            80: 
        !            81:   atmp[unit]->creg = (CR_RX_RESET | CR_TX_RESET);
        !            82:   atmp[unit]->creg = 0;
        !            83:   atmp[unit]->rxtimerv = 0;
        !            84:   atmp[unit]->rxthresh = 1;
        !            85:   atmp[unit]->txthresh = 0;
        !            86:   atmp[unit]->sreg = 0;
        !            87:   atmp[unit]->creg = atm_control_mask[unit] = (CR_RX_ENABLE | CR_TX_ENABLE);
        !            88:   atm_open_count[unit] = 0;
        !            89:   atm_mapped[unit] = 0;
        !            90: }
        !            91: 
        !            92: /*** Device entry points ***/
        !            93: 
        !            94: int atm_probe(vm_offset_t reg, struct bus_device *ui) {
        !            95:   int un;
        !            96: 
        !            97:   un = ui->unit;
        !            98:   if (un >= NATM || check_memory(reg, 0))  {
        !            99:     return 0;
        !           100:   }
        !           101: 
        !           102:   atm_info[un] = ui;
        !           103:   atmp[un] = (atm_device_t) reg;
        !           104:   nc_initialize();
        !           105:   if (nc_device_register(DEVICE(un), NW_CONNECTION_ORIENTED, (char *) reg,
        !           106:                         &tca100_entry_table) == NW_SUCCESS &&
        !           107:       tca100_initialize(DEVICE(un)) == NW_SUCCESS) {
        !           108:     atm_initialize(un);
        !           109:     evc_init(&atm_event_counter[un]);
        !           110:     return 1;
        !           111:   } else {
        !           112:     atmp[un] = NULL;
        !           113:     (void) nc_device_unregister(DEVICE(un), NW_FAILURE);
        !           114:     return 0;
        !           115:   }
        !           116: }
        !           117: 
        !           118: void atm_attach(struct bus_device *ui) {
        !           119:   int un;
        !           120: 
        !           121:   un = ui->unit;
        !           122:   if (un >= NATM) {
        !           123:     printf("atm: stray attach\n");
        !           124:   } else {
        !           125:     atmp[un]->creg = 
        !           126:       atm_control_mask[un] = CR_TX_ENABLE | CR_RX_ENABLE | RX_COUNT_INTR;
        !           127:                                               /*Enable ATM interrupts*/
        !           128:   }
        !           129: }
        !           130: 
        !           131: void atm_intr(int unit, int spl_level) {
        !           132: 
        !           133:   if (unit >= NATM || atmp[unit] == NULL) {
        !           134:     printf("atm: stray interrupt\n");
        !           135:   } else {
        !           136:     atmp[unit]->creg = CR_TX_ENABLE | CR_RX_ENABLE;  /*Disable ATM interrupts*/
        !           137:     wbflush();
        !           138:     if (atm_mapped[unit]) {
        !           139:       splx(spl_level);
        !           140:       evc_signal(&atm_event_counter[unit]);
        !           141:     } else {
        !           142:       simple_lock(&atm_simple_lock);
        !           143:       tca100_poll(DEVICE(unit));
        !           144:       atmp[unit]->creg = atm_control_mask[unit];
        !           145:       simple_unlock(&atm_simple_lock);
        !           146:       splx(spl_level);
        !           147:     }
        !           148:   }
        !           149: }
        !           150: 
        !           151: io_return_t atm_open(dev_t dev, int mode, io_req_t ior) {
        !           152:   int un;
        !           153:        
        !           154:   un = minor(dev);
        !           155:   if (un >= NATM || atmp[un] == NULL) {
        !           156:     return D_NO_SUCH_DEVICE;
        !           157: /*
        !           158:   } else if (atm_open_count[un] > 0 && (atm_mapped[un] || (mode & D_WRITE))) {
        !           159:     return D_ALREADY_OPEN;
        !           160: */
        !           161:   } else {
        !           162:     atm_open_count[un]++;
        !           163:     atm_mapped[un] = ((mode & D_WRITE) != 0);
        !           164:     if (atm_mapped[un])
        !           165:       (void) nc_device_unregister(DEVICE(un), NW_NOT_SERVER);
        !           166:     return D_SUCCESS;
        !           167:   }
        !           168: }
        !           169: 
        !           170: io_return_t atm_close(dev_t dev) {
        !           171:   int un;
        !           172: 
        !           173:   un = minor(dev);
        !           174:   if (un >= NATM || atmp[un] == NULL) {
        !           175:     return D_NO_SUCH_DEVICE;
        !           176:   } else if (atm_open_count[un] == 0) {
        !           177:     return D_INVALID_OPERATION;
        !           178:   } else {
        !           179:     if (atm_mapped[un]) {
        !           180:       (void) nc_device_register(DEVICE(un), NW_CONNECTION_ORIENTED,
        !           181:                                (char *) atmp[un],
        !           182:                                &tca100_entry_table);
        !           183:       atm_mapped[un] = 0;
        !           184:     }
        !           185:     atm_open_count[un]--;
        !           186:     return D_SUCCESS;
        !           187:   }
        !           188: }
        !           189: 
        !           190: unsigned int *frc = 0xbe801000;
        !           191: char data[66000];
        !           192: 
        !           193: io_return_t atm_read(dev_t dev, io_req_t ior) {
        !           194:   unsigned int ck1, ck2;
        !           195:   int i, j;
        !           196:   char c[16];
        !           197: 
        !           198:   ck1 = *frc;
        !           199:   device_read_alloc(ior, ior->io_count);
        !           200:   for (i = 0, j = 0; i < ior->io_count; i += 4096, j++)
        !           201:     c[j] = (ior->io_data)[i];
        !           202:   ck2 = *frc;
        !           203:   ((int *) ior->io_data)[0] = ck1;
        !           204:   ((int *) ior->io_data)[1] = ck2;
        !           205:   return D_SUCCESS;
        !           206: }
        !           207: 
        !           208: io_return_t atm_write(dev_t dev, io_req_t ior) {
        !           209:   int i, j;
        !           210:   char c[16];
        !           211:   boolean_t wait;
        !           212: 
        !           213:   device_write_get(ior, &wait);
        !           214:   for (i = 0, j = 0; i < ior->io_total; i += 4096, j++)
        !           215:     c[j] = (ior->io_data)[i];
        !           216:   ior->io_residual = ior->io_total - *frc;
        !           217:   return D_SUCCESS;
        !           218: }
        !           219: 
        !           220: io_return_t atm_get_status(dev_t dev, int flavor, dev_status_t status,
        !           221:                           u_int *status_count) {
        !           222:   int un;
        !           223: 
        !           224:   un = minor(dev);
        !           225:   if (un >= NATM || atmp[un] == NULL) {
        !           226:     return D_NO_SUCH_DEVICE;
        !           227:   } else {
        !           228:     switch ((atm_status) flavor) {
        !           229:     case ATM_MAP_SIZE:
        !           230:       status[0] = sizeof(atm_device_s);
        !           231:       *status_count = sizeof(int);
        !           232:       return D_SUCCESS;
        !           233:     case ATM_MTU_SIZE:
        !           234:       status[0] = 65535;   /*MTU size*/
        !           235:       *status_count = sizeof(int);
        !           236:       return D_SUCCESS;
        !           237:     case ATM_EVC_ID:
        !           238:       status[0] = atm_event_counter[un].ev_id;
        !           239:       *status_count = sizeof(int);
        !           240:       return D_SUCCESS;
        !           241:     case ATM_ASSIGNMENT:
        !           242:       status[0] = atm_mapped[un];
        !           243:       status[1] = atm_open_count[un];
        !           244:       *status_count = 2 * sizeof(int);
        !           245:       return D_SUCCESS;
        !           246:     default:
        !           247:       return D_INVALID_OPERATION;
        !           248:     }
        !           249:   }
        !           250: }
        !           251: 
        !           252: io_return_t atm_set_status(dev_t dev, int flavor, dev_status_t status,
        !           253:                           u_int status_count) {
        !           254:   io_return_t rc;
        !           255:   int un, s;
        !           256:   nw_pvc_t pvcp;
        !           257:   nw_plist_t pel;
        !           258:   nw_ep lep;
        !           259: 
        !           260:   un = minor(dev);
        !           261:   if (un >= NATM || atmp[un] == NULL) {
        !           262:     return D_NO_SUCH_DEVICE;
        !           263:   } else switch ((atm_status) flavor) {
        !           264:   case ATM_INITIALIZE:
        !           265:     if (status_count != 0) {
        !           266:       return D_INVALID_OPERATION;
        !           267:     } else {
        !           268:       s = splsched();
        !           269:       if (nc_device_register(DEVICE(un), NW_CONNECTION_ORIENTED,
        !           270:                             (char *) atmp[un],
        !           271:                             &tca100_entry_table) == NW_SUCCESS &&
        !           272:          tca100_initialize(DEVICE(un)) == NW_SUCCESS) {
        !           273:        atm_initialize(un);
        !           274:        rc = D_SUCCESS;
        !           275:       } else {
        !           276:        atmp[un] = NULL;
        !           277:        (void) nc_device_unregister(DEVICE(un), NW_FAILURE);
        !           278:        rc = D_INVALID_OPERATION;
        !           279:       }
        !           280:       splx(s);
        !           281:       return rc;
        !           282:     }
        !           283:     break;
        !           284: 
        !           285: #if PERMANENT_VIRTUAL_CONNECTIONS
        !           286:   case ATM_PVC_SET:
        !           287:     pvcp = (nw_pvc_t) status;
        !           288:     if (status_count != sizeof(nw_pvc_s) || pvcp->pvc.local_ep >= MAX_EP) {
        !           289:       rc = D_INVALID_OPERATION;
        !           290:     } else if ((pel = nc_peer_allocate()) == NULL) {
        !           291:       rc = D_INVALID_OPERATION;
        !           292:     } else {
        !           293:       lep = pvcp->pvc.local_ep;
        !           294:       tct[lep].rx_sar_header = SSM | 1;
        !           295:       tct[lep].tx_atm_header = pvcp->tx_vp << ATM_VPVC_SHIFT;
        !           296:       tct[lep].tx_sar_header = 1;
        !           297:       ect[lep].state = NW_DUPLEX_ACCEPTED;
        !           298:       pel->peer = pvcp->pvc;
        !           299:       pel->next = NULL;
        !           300:       ect[lep].conn = pel;
        !           301:       if (pvcp->protocol == NW_LINE) {
        !           302:        if (nc_line_update(&pel->peer, lep) == NW_SUCCESS) {
        !           303:          ect[lep].protocol = pvcp->protocol;
        !           304:          if (nw_free_line_last == 0)
        !           305:            nw_free_line_first = lep;
        !           306:          else
        !           307:            ect[nw_free_line_last].next = lep;
        !           308:          ect[lep].previous = nw_free_line_last;
        !           309:          ect[lep].next = 0;
        !           310:          nw_free_line_last = lep;
        !           311:          rc = D_SUCCESS;
        !           312:        } else {
        !           313:          rc = D_INVALID_OPERATION;
        !           314:        }
        !           315:       } else {
        !           316:        rc = D_SUCCESS;
        !           317:       }
        !           318:     }
        !           319:     return rc;
        !           320: #endif
        !           321: 
        !           322:   default:
        !           323:     return D_INVALID_OPERATION;
        !           324:   }
        !           325: }
        !           326: 
        !           327: int atm_mmap(dev_t dev, vm_offset_t off, int prot) {
        !           328:   int un;
        !           329:   vm_offset_t addr;
        !           330: 
        !           331:   un = minor(dev);
        !           332:   if (un >= NATM || atmp[un] == NULL || !atm_mapped[un] ||
        !           333:       off >= sizeof(atm_device_s)) {
        !           334:     return -1;
        !           335:   } else {
        !           336:     return mips_btop(K1SEG_TO_PHYS( (vm_offset_t) atmp[un] ) + off );
        !           337:   }
        !           338: }
        !           339: 
        !           340: io_return_t atm_restart(int u) {
        !           341: 
        !           342:   return D_INVALID_OPERATION;
        !           343: }
        !           344: 
        !           345: io_return_t atm_setinput(dev_t dev, ipc_port_t receive_port, int priority,
        !           346:                         filter_array_t *filter, u_int filter_count) {
        !           347: 
        !           348:   return D_INVALID_OPERATION;
        !           349: }
        !           350: 
        !           351: int atm_portdeath(dev_t dev, mach_port_t port) {
        !           352: 
        !           353:   return D_INVALID_OPERATION;
        !           354: }
        !           355: 
        !           356: 
        !           357: #endif NATM > 0
        !           358: 
        !           359: 
        !           360: 

unix.superglobalmegacorp.com

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