Annotation of qemu/roms/ipxe/src/drivers/net/efi/snponly.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (C) 2010 VMware, Inc.  All Rights Reserved.
        !             3:  *
        !             4:  * This program is free software; you can redistribute it and/or
        !             5:  * modify it under the terms of the GNU General Public License as
        !             6:  * published by the Free Software Foundation; either version 2 of the
        !             7:  * License, or any later version.
        !             8:  *
        !             9:  * This program is distributed in the hope that it will be useful, but
        !            10:  * WITHOUT ANY WARRANTY; without even the implied warranty of
        !            11:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
        !            12:  * General Public License for more details.
        !            13:  *
        !            14:  * You should have received a copy of the GNU General Public License
        !            15:  * along with this program; if not, write to the Free Software
        !            16:  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
        !            17:  */
        !            18: 
        !            19: FILE_LICENCE ( GPL2_OR_LATER );
        !            20: 
        !            21: #include <string.h>
        !            22: #include <errno.h>
        !            23: #include <ipxe/device.h>
        !            24: #include <ipxe/init.h>
        !            25: #include <ipxe/efi/efi.h>
        !            26: #include <ipxe/efi/Protocol/SimpleNetwork.h>
        !            27: #include "snp.h"
        !            28: #include "snpnet.h"
        !            29: 
        !            30: /** @file
        !            31:  *
        !            32:  * Chain-loading Simple Network Protocol Bus Driver
        !            33:  *
        !            34:  * This bus driver allows iPXE to use the EFI Simple Network Protocol provided
        !            35:  * by the platform to transmit and receive packets. It attaches to only the
        !            36:  * device handle that iPXE was loaded from, that is, it will only use the
        !            37:  * Simple Network Protocol on the current loaded image's device handle.
        !            38:  *
        !            39:  * Eseentially, this driver provides the EFI equivalent of the "undionly"
        !            40:  * driver.
        !            41:  */
        !            42: 
        !            43: /** The one and only SNP network device */
        !            44: static struct snp_device snponly_dev;
        !            45: 
        !            46: /** EFI simple network protocol GUID */
        !            47: static EFI_GUID efi_simple_network_protocol_guid
        !            48:        = EFI_SIMPLE_NETWORK_PROTOCOL_GUID;
        !            49: 
        !            50: /**
        !            51:  * Probe SNP root bus
        !            52:  *
        !            53:  * @v rootdev          SNP bus root device
        !            54:  *
        !            55:  * Look at the loaded image's device handle and see if the simple network
        !            56:  * protocol exists. If so, register a driver for it.
        !            57:  */
        !            58: static int snpbus_probe ( struct root_device *rootdev ) {
        !            59:        EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
        !            60:        EFI_STATUS efirc;
        !            61:        int rc;
        !            62:        void *snp;
        !            63: 
        !            64:        efirc = bs->OpenProtocol ( efi_loaded_image->DeviceHandle,
        !            65:                                   &efi_simple_network_protocol_guid,
        !            66:                                   &snp, efi_image_handle, NULL,
        !            67:                                   EFI_OPEN_PROTOCOL_GET_PROTOCOL );
        !            68:        if ( efirc ) {
        !            69:                DBG ( "Could not find Simple Network Protocol!\n" );
        !            70:                return -ENODEV;
        !            71:        }
        !            72:        snponly_dev.snp = snp;
        !            73: 
        !            74:        /* Add to device hierarchy */
        !            75:        strncpy ( snponly_dev.dev.name, "EFI SNP",
        !            76:                  ( sizeof ( snponly_dev.dev.name ) - 1 ) );
        !            77:        snponly_dev.dev.parent = &rootdev->dev;
        !            78:        list_add ( &snponly_dev.dev.siblings, &rootdev->dev.children);
        !            79:        INIT_LIST_HEAD ( &snponly_dev.dev.children );
        !            80: 
        !            81:        /* Create network device */
        !            82:        if ( ( rc = snpnet_probe ( &snponly_dev ) ) != 0 )
        !            83:                goto err;
        !            84: 
        !            85:        return 0;
        !            86: 
        !            87: err:
        !            88:        list_del ( &snponly_dev.dev.siblings );
        !            89:        return rc;
        !            90: }
        !            91: 
        !            92: /**
        !            93:  * Remove SNP root bus
        !            94:  *
        !            95:  * @v rootdev          SNP bus root device
        !            96:  */
        !            97: static void snpbus_remove ( struct root_device *rootdev __unused ) {
        !            98:        snpnet_remove ( &snponly_dev );
        !            99:        list_del ( &snponly_dev.dev.siblings );
        !           100: }
        !           101: 
        !           102: /** SNP bus root device driver */
        !           103: static struct root_driver snp_root_driver = {
        !           104:        .probe = snpbus_probe,
        !           105:        .remove = snpbus_remove,
        !           106: };
        !           107: 
        !           108: /** SNP bus root device */
        !           109: struct root_device snp_root_device __root_device = {
        !           110:        .dev = { .name = "EFI SNP" },
        !           111:        .driver = &snp_root_driver,
        !           112: };
        !           113: 
        !           114: /**
        !           115:  * Prepare for exit
        !           116:  *
        !           117:  * @v booting          System is shutting down for OS boot
        !           118:  */
        !           119: static void snponly_shutdown ( int booting ) {
        !           120:        /* If we are shutting down to boot an OS, make sure the SNP does not
        !           121:         * stay active.
        !           122:         */
        !           123:        if ( booting )
        !           124:                snponly_dev.removal_state = EfiSimpleNetworkStopped;
        !           125: }
        !           126: 
        !           127: struct startup_fn startup_snponly __startup_fn ( STARTUP_LATE ) = {
        !           128:        .shutdown = snponly_shutdown,
        !           129: };

unix.superglobalmegacorp.com

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