Annotation of Gnu-Mach/scsi/mapped_scsi.c, revision 1.1

1.1     ! root        1: /* 
        !             2:  * Mach Operating System
        !             3:  * Copyright (c) 1991,1990 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:  *     File: mapped_scsi.c
        !            28:  *     Author: Alessandro Forin, Carnegie Mellon University
        !            29:  *     Date:   9/90
        !            30:  *
        !            31:  *     In-kernel side of the user-mapped SCSI driver.
        !            32:  */
        !            33: 
        !            34: #include <asc.h>
        !            35: #include <sii.h>
        !            36: #define NRZ    (NASC+NSII)
        !            37: #if    NRZ > 0
        !            38: #include <platforms.h>
        !            39: 
        !            40: #include <machine/machspl.h>           /* spl definitions */
        !            41: 
        !            42: #include <device/device_types.h>
        !            43: #include <device/io_req.h>
        !            44: #include <chips/busses.h>
        !            45: 
        !            46: #include <vm/vm_kern.h>
        !            47: #include <kern/eventcount.h>
        !            48: 
        !            49: #include <scsi/mapped_scsi.h>
        !            50: 
        !            51: #include <machine/machspl.h>
        !            52: 
        !            53: #ifdef DECSTATION
        !            54: 
        !            55: #define        machine_btop    mips_btop
        !            56: 
        !            57: #define        kvctophys(v)    K0SEG_TO_PHYS((v))      /* kernel virtual cached */
        !            58: #define        phystokvc(p)    PHYS_TO_K0SEG((p))      /* and back */
        !            59: #define        kvutophys(v)    K1SEG_TO_PHYS((v))      /* kernel virtual uncached */
        !            60: #define        phystokvu(p)    PHYS_TO_K1SEG((p))      /* and back */
        !            61: 
        !            62: #include <mips/mips_cpu.h>
        !            63: #include <mips/PMAX/kn01.h>
        !            64: #include <mips/PMAX/pmaz_aa.h>
        !            65: 
        !            66: #define SII_REG_PHYS(self)     kvutophys(self->registers.any)
        !            67: #define        SII_RAM_PHYS(self)      (SII_REG_PHYS((self))+(KN01_SYS_SII_B_START-KN01_SYS_SII))
        !            68: #define        SII_RAM_SIZE            (KN01_SYS_SII_B_END-KN01_SYS_SII_B_START)
        !            69: 
        !            70: #define ASC_REG_PHYS(self)     kvutophys(self->registers.any)
        !            71: #define ASC_DMAR_PHYS(self)    (ASC_REG_PHYS((self))+ ASC_OFFSET_DMAR)
        !            72: #define ASC_RAM_PHYS(self)     (ASC_REG_PHYS((self))+ ASC_OFFSET_RAM)
        !            73: 
        !            74: #define        PAD_7061(n)             short n
        !            75: #define PAD_53C94(n)           char n[3]
        !            76: 
        !            77: #endif /*DECSTATION*/
        !            78: 
        !            79: #ifdef VAXSTATION
        !            80: #define        machine_btop    vax_btop
        !            81: #endif /*VAXSTATION*/
        !            82: 
        !            83: #ifdef P40
        !            84: 
        !            85: #define        machine_btop    mips_btop
        !            86: 
        !            87: #define        kvctophys(v)    K0SEG_TO_PHYS((v))      /* kernel virtual cached */
        !            88: #define        phystokvc(p)    PHYS_TO_K0SEG((p))      /* and back */
        !            89: #define        kvutophys(v)    K1SEG_TO_PHYS((v))      /* kernel virtual uncached */
        !            90: #define        phystokvu(p)    PHYS_TO_K1SEG((p))      /* and back */
        !            91: 
        !            92: #include <mips/mips_cpu.h>
        !            93: 
        !            94: #define ASC_RAM_SIZE           0
        !            95: #define ASC_OFFSET_DMAR                0
        !            96: #define ASC_OFFSET_RAM         0
        !            97: 
        !            98: #define ASC_REG_PHYS(self)     kvutophys(self->registers.any)
        !            99: #define ASC_DMAR_PHYS(self)    (ASC_REG_PHYS((self))+ ASC_OFFSET_DMAR)
        !           100: #define ASC_RAM_PHYS(self)     (ASC_REG_PHYS((self))+ ASC_OFFSET_RAM)
        !           101: #endif  /* P40 */
        !           102: 
        !           103: /*
        !           104:  * Phys defines for the various supported HBAs
        !           105:  */
        !           106: 
        !           107: /* DEC7061     */
        !           108: #include <scsi/adapters/scsi_7061.h>
        !           109: 
        !           110: #ifdef PAD_7061
        !           111: 
        !           112: typedef struct {
        !           113:        volatile unsigned short sii_sdb;        /* rw: Data bus and parity */
        !           114:        PAD_7061(pad0);
        !           115:        volatile unsigned short sii_sc1;        /* rw: scsi signals 1 */
        !           116:        PAD_7061(pad1);
        !           117:        volatile unsigned short sii_sc2;        /* rw: scsi signals 2 */
        !           118:        PAD_7061(pad2);
        !           119:        volatile unsigned short sii_csr;        /* rw: control and status */
        !           120:        PAD_7061(pad3);
        !           121:        volatile unsigned short sii_id;         /* rw: scsi bus ID */
        !           122:        PAD_7061(pad4);
        !           123:        volatile unsigned short sii_sel_csr;    /* rw: selection status */
        !           124:        PAD_7061(pad5);
        !           125:        volatile unsigned short sii_destat;     /* ro: selection detector status */
        !           126:        PAD_7061(pad6);
        !           127:        volatile unsigned short sii_dstmo;      /* unsupp: dssi timeout */
        !           128:        PAD_7061(pad7);
        !           129:        volatile unsigned short sii_data;       /* rw: data register */
        !           130:        PAD_7061(pad8);
        !           131:        volatile unsigned short sii_dma_ctrl;   /* rw: dma control reg */
        !           132:        PAD_7061(pad9);
        !           133:        volatile unsigned short sii_dma_len;    /* rw: length of transfer */
        !           134:        PAD_7061(pad10);
        !           135:        volatile unsigned short sii_dma_adr_low;/* rw: low address */
        !           136:        PAD_7061(pad11);
        !           137:        volatile unsigned short sii_dma_adr_hi; /* rw: high address */
        !           138:        PAD_7061(pad12);
        !           139:        volatile unsigned short sii_dma_1st_byte;/* rw: initial byte */
        !           140:        PAD_7061(pad13);
        !           141:        volatile unsigned short sii_stlp;       /* unsupp: dssi short trgt list ptr */
        !           142:        PAD_7061(pad14);
        !           143:        volatile unsigned short sii_ltlp;       /* unsupp: dssi long " " " */
        !           144:        PAD_7061(pad15);
        !           145:        volatile unsigned short sii_ilp;        /* unsupp: dssi initiator list ptr */
        !           146:        PAD_7061(pad16);
        !           147:        volatile unsigned short sii_dssi_csr;   /* unsupp: dssi control */
        !           148:        PAD_7061(pad17);
        !           149:        volatile unsigned short sii_conn_csr;   /* rc: connection interrupt control */
        !           150:        PAD_7061(pad18);
        !           151:        volatile unsigned short sii_data_csr;   /* rc: data interrupt control */
        !           152:        PAD_7061(pad19);
        !           153:        volatile unsigned short sii_cmd;        /* rw: command register */
        !           154:        PAD_7061(pad20);
        !           155:        volatile unsigned short sii_diag_csr;   /* rw: disgnostic status */
        !           156:        PAD_7061(pad21);
        !           157: } sii_padded_regmap_t;
        !           158: 
        !           159: #else  /*!PAD_7061*/
        !           160: 
        !           161: typedef sii_regmap_t   sii_padded_regmap_t;
        !           162: 
        !           163: #endif /*!PAD_7061*/
        !           164: 
        !           165: /* NCR 53C94   */
        !           166: #include <scsi/adapters/scsi_53C94.h>
        !           167: 
        !           168: #ifdef PAD_53C94
        !           169: typedef struct {
        !           170:        volatile unsigned char  asc_tc_lsb;     /* rw: Transfer Counter LSB */
        !           171:        PAD_53C94(pad0);
        !           172:        volatile unsigned char  asc_tc_msb;     /* rw: Transfer Counter MSB */
        !           173:        PAD_53C94(pad1);
        !           174:        volatile unsigned char  asc_fifo;       /* rw: FIFO top */
        !           175:        PAD_53C94(pad2);
        !           176:        volatile unsigned char  asc_cmd;        /* rw: Command */
        !           177:        PAD_53C94(pad3);
        !           178:        volatile unsigned char  asc_csr;        /* r:  Status */
        !           179: /*#define              asc_dbus_id asc_csr     /* w: Destination Bus ID */
        !           180:        PAD_53C94(pad4);
        !           181:        volatile unsigned char  asc_intr;       /* r:  Interrupt */
        !           182: /*#define              asc_sel_timo asc_intr   /* w: (re)select timeout */
        !           183:        PAD_53C94(pad5);
        !           184:        volatile unsigned char  asc_ss;         /* r:  Sequence Step */
        !           185: /*#define              asc_syn_p asc_ss        /* w: synchronous period */
        !           186:        PAD_53C94(pad6);
        !           187:        volatile unsigned char  asc_flags;      /* r:  FIFO flags + seq step */
        !           188: /*#define              asc_syn_o asc_flags     /* w: synchronous offset */
        !           189:        PAD_53C94(pad7);
        !           190:        volatile unsigned char  asc_cnfg1;      /* rw: Configuration 1 */
        !           191:        PAD_53C94(pad8);
        !           192:        volatile unsigned char  asc_ccf;        /* w:  Clock Conv. Factor */
        !           193:        PAD_53C94(pad9);
        !           194:        volatile unsigned char  asc_test;       /* w:  Test Mode */
        !           195:        PAD_53C94(pad10);
        !           196:        volatile unsigned char  asc_cnfg2;      /* rw: Configuration 2 */
        !           197:        PAD_53C94(pad11);
        !           198:        volatile unsigned char  asc_cnfg3;      /* rw: Configuration 3 */
        !           199:        PAD_53C94(pad12);
        !           200:        volatile unsigned char  asc_rfb;        /* w:  Reserve FIFO byte */
        !           201:        PAD_53C94(pad13);
        !           202: } asc_padded_regmap_t;
        !           203: 
        !           204: #else  /* !PAD_53C94 */
        !           205: 
        !           206: typedef asc_regmap_t   asc_padded_regmap_t;
        !           207: 
        !           208: #endif /* !PAD_53C94 */
        !           209: 
        !           210: /*
        !           211:  * Co-existency with in-kernel drivers
        !           212:  */
        !           213: boolean_t      rz_use_mapped_interface = FALSE;
        !           214: 
        !           215: /*
        !           216:  * Status information for all HBAs
        !           217:  */
        !           218: /*static*/ struct RZ_status {
        !           219:        union {
        !           220:                unsigned long           any;
        !           221:                asc_padded_regmap_t     *asc;
        !           222:                sii_padded_regmap_t     *sii;
        !           223:        } registers;
        !           224:        int                             (*stop)();
        !           225:        vm_offset_t                     (*mmap)();
        !           226:        mapped_scsi_info_t              info;
        !           227:        struct evc                      eventcounter;
        !           228: } RZ_statii[NRZ];
        !           229: 
        !           230: typedef struct RZ_status       *RZ_status_t;
        !           231: 
        !           232: 
        !           233: /*
        !           234:  * Probe routine for all HBAs
        !           235:  */
        !           236: RZ_probe(regbase, ui, hba)
        !           237:        unsigned long                   regbase;
        !           238:        register struct bus_device      *ui;
        !           239: {
        !           240:        int                     unit = ui->unit;
        !           241:        vm_offset_t             addr;
        !           242:        mapped_scsi_info_t      info;
        !           243:        struct RZ_status        *self;
        !           244: 
        !           245:        printf("[mappable] ");
        !           246: 
        !           247:        self = &RZ_statii[unit];
        !           248: 
        !           249:        self->registers.any = regbase;
        !           250: 
        !           251:        /*
        !           252:         * Grab a page to be mapped later to users 
        !           253:         */
        !           254:        (void) kmem_alloc_wired(kernel_map, &addr, PAGE_SIZE);  /* kseg2 */
        !           255:        bzero(addr, PAGE_SIZE);
        !           256:        addr = pmap_extract(pmap_kernel(), addr);       /* phys */
        !           257:        info = (mapped_scsi_info_t) (phystokvc(addr));
        !           258:        self->info = info;
        !           259: 
        !           260:        /*
        !           261:         * Set permanent info
        !           262:         */
        !           263:        info->interrupt_count   =       0;
        !           264: /*XXX*/        info->ram_size          =       ASC_RAM_SIZE;
        !           265:        info->hba_type          =       hba;
        !           266: 
        !           267:        evc_init(&self->eventcounter);
        !           268:        info->wait_event        =       self->eventcounter.ev_id;
        !           269: 
        !           270:        return 1;
        !           271: }
        !           272: 
        !           273: /*
        !           274:  * Device open procedure
        !           275:  */
        !           276: RZ_open(dev, flag, ior)
        !           277:        io_req_t ior;
        !           278: {
        !           279:        int                     unit = dev;
        !           280:        register RZ_status_t    self = &RZ_statii[unit];
        !           281: 
        !           282: 
        !           283:        if (unit >= NRZ)
        !           284:                return D_NO_SUCH_DEVICE;
        !           285: 
        !           286:        /*
        !           287:         * Silence interface, just in case 
        !           288:         */
        !           289:        (*self->stop)(unit);
        !           290: 
        !           291:        /*
        !           292:         * Reset eventcounter
        !           293:         */
        !           294:        evc_signal(&self->eventcounter);
        !           295: 
        !           296:        rz_use_mapped_interface = TRUE;
        !           297: 
        !           298:        /*
        !           299:         * Do not turn interrupts on.  The user can do it when ready
        !           300:         * to take them. 
        !           301:         */
        !           302: 
        !           303:        return 0;
        !           304: }
        !           305: 
        !           306: /*
        !           307:  * Device close procedure
        !           308:  */
        !           309: RZ_close(dev, flag)
        !           310: {
        !           311:        int                     unit = dev;
        !           312:        register RZ_status_t    self = &RZ_statii[unit];
        !           313: 
        !           314:        if (unit >= NRZ)
        !           315:                return D_NO_SUCH_DEVICE;
        !           316: 
        !           317:        /*
        !           318:         * Silence interface, in case user forgot
        !           319:         */
        !           320:        (*self->stop)(unit);
        !           321: 
        !           322:        evc_signal(&self->eventcounter);
        !           323: 
        !           324:        rz_use_mapped_interface = FALSE;
        !           325: 
        !           326:        /* XXX  rz_kernel_mode(); XXX */
        !           327: 
        !           328:        return 0;
        !           329: }
        !           330: 
        !           331: 
        !           332: /*
        !           333:  * Get status procedure.
        !           334:  * We need to tell that we are mappable.
        !           335:  */
        !           336: io_return_t
        !           337: RZ_get_status(dev, flavor, status, status_count)
        !           338:        int             dev;
        !           339:        int             flavor;
        !           340:        dev_status_t    status;
        !           341:        unsigned int    status_count;
        !           342: {
        !           343:        return (D_SUCCESS);
        !           344: }
        !           345: 
        !           346: /*
        !           347:  * Should not refuse this either
        !           348:  */
        !           349: RZ_set_status(dev, flavor, status, status_count)
        !           350:        int             dev;
        !           351:        int             flavor;
        !           352:        dev_status_t    status;
        !           353:        unsigned int    status_count;
        !           354: {
        !           355:        return (D_SUCCESS);
        !           356: }
        !           357: 
        !           358: /*
        !           359:  * Port death notification routine
        !           360:  */
        !           361: RZ_portdeath(dev, dead_port)
        !           362: {
        !           363: }
        !           364: 
        !           365: /*
        !           366:  * Page mapping, switch off to HBA-specific for regs&ram
        !           367:  */
        !           368: vm_offset_t
        !           369: RZ_mmap(dev, off, prot)
        !           370:        int             dev;
        !           371: {
        !           372:        int                     unit = dev;
        !           373:        register RZ_status_t    self = &RZ_statii[unit];
        !           374:        vm_offset_t             page;
        !           375:        vm_offset_t             addr;
        !           376:        io_return_t             ret;
        !           377: 
        !           378:        if (off < SCSI_INFO_SIZE) {
        !           379:                addr = kvctophys (self->info) + off;
        !           380:                ret = D_SUCCESS;
        !           381:        } else
        !           382:                ret = (*self->mmap)(self, off, prot, &addr);
        !           383: 
        !           384:        if (ret != D_SUCCESS)
        !           385:                return ret;
        !           386: 
        !           387:        page = machine_btop(addr);
        !           388: 
        !           389:        return (page);  
        !           390: }
        !           391: 
        !           392: 
        !           393: /*
        !           394:  *---------------------------------------------------------------
        !           395:  *     The rest of the file contains HBA-specific routines
        !           396:  *---------------------------------------------------------------
        !           397:  */
        !           398: 
        !           399: #if    NASC > 0
        !           400: /*
        !           401:  * Routines for the NCR 53C94
        !           402:  */
        !           403: static
        !           404: ASC_stop(unit)
        !           405: {
        !           406:        register RZ_status_t       self = &RZ_statii[unit];
        !           407:        register asc_padded_regmap_t *regs = self->registers.asc;
        !           408:        int                        ack;
        !           409: 
        !           410:        ack = regs->asc_intr;   /* Just acknowledge pending interrupts */
        !           411: }
        !           412: 
        !           413: ASC_probe(reg, ui)
        !           414:        unsigned long                   reg;
        !           415:        register struct bus_device      *ui;
        !           416: {
        !           417:        register RZ_status_t    self = &RZ_statii[ui->unit];
        !           418:        static vm_offset_t      ASC_mmap();
        !           419: 
        !           420:        self->stop = ASC_stop;
        !           421:        self->mmap = ASC_mmap;
        !           422:        return RZ_probe(reg, ui, HBA_NCR_53c94);
        !           423: }
        !           424: 
        !           425: 
        !           426: ASC_intr(unit,spllevel)
        !           427:        spl_t   spllevel;
        !           428: {
        !           429:        register RZ_status_t       self = &RZ_statii[unit];
        !           430:        register asc_padded_regmap_t *regs = self->registers.asc;
        !           431:        register                   csr, intr, seq_step, cmd;
        !           432: 
        !           433:        /*
        !           434:         * Acknowledge interrupt request
        !           435:         *
        !           436:         * This clobbers some two other registers, therefore
        !           437:         * we read them beforehand.  It also clears the intr
        !           438:         * request bit, silencing the interface for now.
        !           439:         */
        !           440:        csr = regs->asc_csr;
        !           441: 
        !           442:        /* drop spurious interrupts */
        !           443:        if ((csr & ASC_CSR_INT) == 0)
        !           444:                return;
        !           445:        seq_step = regs->asc_ss;
        !           446:        cmd = regs->asc_cmd;
        !           447: 
        !           448:        intr = regs->asc_intr;  /* ack */
        !           449: 
        !           450:        splx(spllevel); /* drop priority */
        !           451: 
        !           452:        if (self->info) {
        !           453:                self->info->interrupt_count++;  /* total interrupts */
        !           454:                self->info->saved_regs.asc.csr = csr;
        !           455:                self->info->saved_regs.asc.isr = intr;
        !           456:                self->info->saved_regs.asc.seq = seq_step;
        !           457:                self->info->saved_regs.asc.cmd = cmd;
        !           458:        }
        !           459: 
        !           460:        /* Awake user thread */
        !           461:        evc_signal(&self->eventcounter);
        !           462: }
        !           463: 
        !           464: /*
        !           465:  * Virtual->physical mapping routine for PMAZ-AA
        !           466:  */
        !           467: static vm_offset_t
        !           468: ASC_mmap(self, off, prot, addr)
        !           469:        RZ_status_t     self;
        !           470:        vm_offset_t     off;
        !           471:        vm_prot_t       prot;
        !           472:        vm_offset_t     *addr;
        !           473: {
        !           474:        /*
        !           475:         * The offset (into the VM object) defines the following layout
        !           476:         *
        !           477:         *      off     size    what
        !           478:         *      0       1pg     mapping information (csr & #interrupts)
        !           479:         *      1pg     1pg     ASC registers
        !           480:         *      2pg     1pg     ASC dma
        !           481:         *      3pg     128k    ASC ram buffers
        !           482:         */
        !           483: 
        !           484: #define        ASC_END (ASC_RAM_BASE+ASC_RAM_SIZE)
        !           485: 
        !           486:        if (off < ASC_DMAR_BASE)
        !           487:                *addr = (vm_offset_t) ASC_REG_PHYS(self) + (off - SCSI_INFO_SIZE);
        !           488:        else if (off < ASC_RAM_BASE)
        !           489:                *addr = (vm_offset_t) ASC_DMAR_PHYS(self) + (off - ASC_REGS_BASE);
        !           490:        else if (off < ASC_END)
        !           491:                *addr = (vm_offset_t) ASC_RAM_PHYS(self) + (off - ASC_RAM_BASE);
        !           492:        else
        !           493:                return D_INVALID_SIZE;
        !           494: 
        !           495:        return D_SUCCESS;
        !           496: }
        !           497: #endif NASC > 0
        !           498: 
        !           499: #if    NSII > 0
        !           500: SII_stop(unit)
        !           501: {
        !           502:        register RZ_status_t       self = &RZ_statii[unit];
        !           503:        register sii_padded_regmap_t *regs = self->registers.sii;
        !           504: 
        !           505:        regs->sii_csr &= ~SII_CSR_IE;   /* disable interrupts */
        !           506:                                        /* clear all wtc bits */
        !           507:        regs->sii_conn_csr = regs->sii_conn_csr;
        !           508:        regs->sii_data_csr = regs->sii_data_csr;
        !           509: }
        !           510: 
        !           511: SII_probe(reg, ui)
        !           512:        unsigned long                   reg;
        !           513:        register struct bus_device      *ui;
        !           514: {
        !           515:        register RZ_status_t    self = &RZ_statii[ui->unit];
        !           516:        static vm_offset_t      SII_mmap();
        !           517: 
        !           518:        self->stop = SII_stop;
        !           519:        self->mmap = SII_mmap;
        !           520:        return RZ_probe(reg, ui, HBA_DEC_7061);
        !           521: }
        !           522: 
        !           523: SII_intr(unit,spllevel)
        !           524:        spl_t   spllevel;
        !           525: {
        !           526:        register RZ_status_t       self = &RZ_statii[unit];
        !           527:        register sii_padded_regmap_t *regs = self->registers.sii;
        !           528:        register unsigned short    conn, data;
        !           529: 
        !           530:        /*
        !           531:         * Disable interrupts, saving cause(s) first.
        !           532:         */
        !           533:        conn = regs->sii_conn_csr;
        !           534:        data = regs->sii_data_csr;
        !           535: 
        !           536:        /* drop spurious calls */
        !           537:        if (((conn|data) & (SII_DTR_DI|SII_DTR_CI)) == 0)
        !           538:                return;
        !           539: 
        !           540:        regs->sii_csr &= ~SII_CSR_IE;
        !           541: 
        !           542:        regs->sii_conn_csr = conn;
        !           543:        regs->sii_data_csr = data;
        !           544: 
        !           545:        splx(spllevel);
        !           546: 
        !           547:        if (self->info) {
        !           548:                self->info->interrupt_count++;  /* total interrupts */
        !           549:                self->info->saved_regs.sii.sii_conn_csr = conn;
        !           550:                self->info->saved_regs.sii.sii_data_csr = data;
        !           551:        }
        !           552: 
        !           553:        /* Awake user thread */
        !           554:        evc_signal(&self->eventcounter);
        !           555: }
        !           556: 
        !           557: static vm_offset_t
        !           558: SII_mmap(self, off, prot, addr)
        !           559:        RZ_status_t     self;
        !           560:        vm_offset_t     off;
        !           561:        vm_prot_t       prot;
        !           562:        vm_offset_t     *addr;
        !           563: {
        !           564:        /*
        !           565:         * The offset (into the VM object) defines the following layout
        !           566:         *
        !           567:         *      off     size    what
        !           568:         *      0       1pg     mapping information (csr & #interrupts)
        !           569:         *      1pg     1pg     SII registers
        !           570:         *      2pg     128k    SII ram buffer
        !           571:         */
        !           572: 
        !           573: #define        SII_END (SII_RAM_BASE+SII_RAM_SIZE)
        !           574: 
        !           575:        if (off < SII_RAM_BASE)
        !           576:                *addr = (vm_offset_t) SII_REG_PHYS(self) + (off - SCSI_INFO_SIZE);
        !           577:        else if (off < SII_END)
        !           578:                *addr = (vm_offset_t) SII_RAM_PHYS(self) + (off - SII_RAM_BASE);
        !           579:        else
        !           580:                return D_INVALID_SIZE;
        !           581: 
        !           582:        return D_SUCCESS;
        !           583: }
        !           584: #endif NSII > 0
        !           585: 
        !           586: #endif NRZ > 0

unix.superglobalmegacorp.com

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