Annotation of qemu/roms/ipxe/src/drivers/bus/eisa.c, revision 1.1

1.1     ! root        1: #include <stdint.h>
        !             2: #include <string.h>
        !             3: #include <stdlib.h>
        !             4: #include <stdio.h>
        !             5: #include <errno.h>
        !             6: #include <ipxe/io.h>
        !             7: #include <unistd.h>
        !             8: #include <ipxe/eisa.h>
        !             9: 
        !            10: FILE_LICENCE ( GPL2_OR_LATER );
        !            11: 
        !            12: static void eisabus_remove ( struct root_device *rootdev );
        !            13: 
        !            14: /**
        !            15:  * Reset and enable/disable an EISA device
        !            16:  *
        !            17:  * @v eisa             EISA device
        !            18:  * @v enabled          1=enable, 0=disable
        !            19:  */
        !            20: void eisa_device_enabled ( struct eisa_device *eisa, int enabled ) {
        !            21:        /* Set reset line high for 1000 �s.  Spec says 500 �s, but
        !            22:         * this doesn't work for all cards, so we are conservative.
        !            23:         */
        !            24:        outb ( EISA_CMD_RESET, eisa->ioaddr + EISA_GLOBAL_CONFIG );
        !            25:        udelay ( 1000 ); /* Must wait 800 */
        !            26: 
        !            27:        /* Set reset low and write a 1 to ENABLE.  Delay again, in
        !            28:         * case the card takes a while to wake up.
        !            29:         */
        !            30:        outb ( enabled ? EISA_CMD_ENABLE : 0,
        !            31:               eisa->ioaddr + EISA_GLOBAL_CONFIG );
        !            32:        udelay ( 1000 ); /* Must wait 800 */
        !            33: 
        !            34:        DBG ( "EISA %s device %02x\n", ( enabled ? "enabled" : "disabled" ),
        !            35:              eisa->slot );
        !            36: }
        !            37: 
        !            38: /**
        !            39:  * Probe an EISA device
        !            40:  *
        !            41:  * @v eisa             EISA device
        !            42:  * @ret rc             Return status code
        !            43:  *
        !            44:  * Searches for a driver for the EISA device.  If a driver is found,
        !            45:  * its probe() routine is called.
        !            46:  */
        !            47: static int eisa_probe ( struct eisa_device *eisa ) {
        !            48:        struct eisa_driver *driver;
        !            49:        struct eisa_device_id *id;
        !            50:        unsigned int i;
        !            51:        int rc;
        !            52: 
        !            53:        DBG ( "Adding EISA device %02x (%04x:%04x (\"%s\") io %x)\n",
        !            54:              eisa->slot, eisa->vendor_id, eisa->prod_id,
        !            55:              isa_id_string ( eisa->vendor_id, eisa->prod_id ), eisa->ioaddr );
        !            56: 
        !            57:        for_each_table_entry ( driver, EISA_DRIVERS ) {
        !            58:                for ( i = 0 ; i < driver->id_count ; i++ ) {
        !            59:                        id = &driver->ids[i];
        !            60:                        if ( id->vendor_id != eisa->vendor_id )
        !            61:                                continue;
        !            62:                        if ( ISA_PROD_ID ( id->prod_id ) !=
        !            63:                             ISA_PROD_ID ( eisa->prod_id ) )
        !            64:                                continue;
        !            65:                        eisa->driver = driver;
        !            66:                        eisa->dev.driver_name = id->name;
        !            67:                        DBG ( "...using driver %s\n", eisa->dev.driver_name );
        !            68:                        if ( ( rc = driver->probe ( eisa, id ) ) != 0 ) {
        !            69:                                DBG ( "......probe failed\n" );
        !            70:                                continue;
        !            71:                        }
        !            72:                        return 0;
        !            73:                }
        !            74:        }
        !            75: 
        !            76:        DBG ( "...no driver found\n" );
        !            77:        return -ENOTTY;
        !            78: }
        !            79: 
        !            80: /**
        !            81:  * Remove an EISA device
        !            82:  *
        !            83:  * @v eisa             EISA device
        !            84:  */
        !            85: static void eisa_remove ( struct eisa_device *eisa ) {
        !            86:        eisa->driver->remove ( eisa );
        !            87:        DBG ( "Removed EISA device %02x\n", eisa->slot );
        !            88: }
        !            89: 
        !            90: /**
        !            91:  * Probe EISA root bus
        !            92:  *
        !            93:  * @v rootdev          EISA bus root device
        !            94:  *
        !            95:  * Scans the EISA bus for devices and registers all devices it can
        !            96:  * find.
        !            97:  */
        !            98: static int eisabus_probe ( struct root_device *rootdev ) {
        !            99:        struct eisa_device *eisa = NULL;
        !           100:        unsigned int slot;
        !           101:        int rc;
        !           102: 
        !           103:        for ( slot = EISA_MIN_SLOT ; slot <= EISA_MAX_SLOT ; slot++ ) {
        !           104:                /* Allocate struct eisa_device */
        !           105:                if ( ! eisa )
        !           106:                        eisa = malloc ( sizeof ( *eisa ) );
        !           107:                if ( ! eisa ) {
        !           108:                        rc = -ENOMEM;
        !           109:                        goto err;
        !           110:                }
        !           111:                memset ( eisa, 0, sizeof ( *eisa ) );
        !           112:                eisa->slot = slot;
        !           113:                eisa->ioaddr = EISA_SLOT_BASE ( eisa->slot );
        !           114: 
        !           115:                /* Test for board present */
        !           116:                outb ( 0xff, eisa->ioaddr + EISA_VENDOR_ID );
        !           117:                eisa->vendor_id =
        !           118:                        le16_to_cpu ( inw ( eisa->ioaddr + EISA_VENDOR_ID ) );
        !           119:                eisa->prod_id =
        !           120:                        le16_to_cpu ( inw ( eisa->ioaddr + EISA_PROD_ID ) );
        !           121:                if ( eisa->vendor_id & 0x80 ) {
        !           122:                        /* No board present */
        !           123:                        continue;
        !           124:                }
        !           125: 
        !           126:                /* Add to device hierarchy */
        !           127:                snprintf ( eisa->dev.name, sizeof ( eisa->dev.name ),
        !           128:                           "EISA%02x", slot );
        !           129:                eisa->dev.desc.bus_type = BUS_TYPE_EISA;
        !           130:                eisa->dev.desc.vendor = eisa->vendor_id;
        !           131:                eisa->dev.desc.device = eisa->prod_id;
        !           132:                eisa->dev.parent = &rootdev->dev;
        !           133:                list_add ( &eisa->dev.siblings, &rootdev->dev.children );
        !           134:                INIT_LIST_HEAD ( &eisa->dev.children );
        !           135: 
        !           136:                /* Look for a driver */
        !           137:                if ( eisa_probe ( eisa ) == 0 ) {
        !           138:                        /* eisadev registered, we can drop our ref */
        !           139:                        eisa = NULL;
        !           140:                } else {
        !           141:                        /* Not registered; re-use struct */
        !           142:                        list_del ( &eisa->dev.siblings );
        !           143:                }
        !           144:        }
        !           145: 
        !           146:        free ( eisa );
        !           147:        return 0;
        !           148: 
        !           149:  err:
        !           150:        free ( eisa );
        !           151:        eisabus_remove ( rootdev );
        !           152:        return rc;
        !           153: }
        !           154: 
        !           155: /**
        !           156:  * Remove EISA root bus
        !           157:  *
        !           158:  * @v rootdev          EISA bus root device
        !           159:  */
        !           160: static void eisabus_remove ( struct root_device *rootdev ) {
        !           161:        struct eisa_device *eisa;
        !           162:        struct eisa_device *tmp;
        !           163: 
        !           164:        list_for_each_entry_safe ( eisa, tmp, &rootdev->dev.children,
        !           165:                                   dev.siblings ) {
        !           166:                eisa_remove ( eisa );
        !           167:                list_del ( &eisa->dev.siblings );
        !           168:                free ( eisa );
        !           169:        }
        !           170: }
        !           171: 
        !           172: /** EISA bus root device driver */
        !           173: static struct root_driver eisa_root_driver = {
        !           174:        .probe = eisabus_probe,
        !           175:        .remove = eisabus_remove,
        !           176: };
        !           177: 
        !           178: /** EISA bus root device */
        !           179: struct root_device eisa_root_device __root_device = {
        !           180:        .dev = { .name = "EISA" },
        !           181:        .driver = &eisa_root_driver,
        !           182: };

unix.superglobalmegacorp.com

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