1291a2b48SSukumar Swaminathan /* 2291a2b48SSukumar Swaminathan * CDDL HEADER START 3291a2b48SSukumar Swaminathan * 4291a2b48SSukumar Swaminathan * The contents of this file are subject to the terms of the 5291a2b48SSukumar Swaminathan * Common Development and Distribution License (the "License"). 6291a2b48SSukumar Swaminathan * You may not use this file except in compliance with the License. 7291a2b48SSukumar Swaminathan * 8*8f23e9faSHans Rosenfeld * You can obtain a copy of the license at 9*8f23e9faSHans Rosenfeld * http://www.opensource.org/licenses/cddl1.txt. 10291a2b48SSukumar Swaminathan * See the License for the specific language governing permissions 11291a2b48SSukumar Swaminathan * and limitations under the License. 12291a2b48SSukumar Swaminathan * 13291a2b48SSukumar Swaminathan * When distributing Covered Code, include this CDDL HEADER in each 14291a2b48SSukumar Swaminathan * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15291a2b48SSukumar Swaminathan * If applicable, add the following below this CDDL HEADER, with the 16291a2b48SSukumar Swaminathan * fields enclosed by brackets "[]" replaced with your own identifying 17291a2b48SSukumar Swaminathan * information: Portions Copyright [yyyy] [name of copyright owner] 18291a2b48SSukumar Swaminathan * 19291a2b48SSukumar Swaminathan * CDDL HEADER END 20291a2b48SSukumar Swaminathan */ 21291a2b48SSukumar Swaminathan 22291a2b48SSukumar Swaminathan /* 23*8f23e9faSHans Rosenfeld * Copyright (c) 2004-2012 Emulex. All rights reserved. 2482527734SSukumar Swaminathan * Use is subject to license terms. 25291a2b48SSukumar Swaminathan */ 26291a2b48SSukumar Swaminathan 27*8f23e9faSHans Rosenfeld #define DRIVER_NAME "emlxs" 28291a2b48SSukumar Swaminathan #define EMLXS_FW_TABLE_DEF 29291a2b48SSukumar Swaminathan 30291a2b48SSukumar Swaminathan #include <sys/types.h> 31291a2b48SSukumar Swaminathan #include <sys/modctl.h> 32291a2b48SSukumar Swaminathan #include <emlxs_version.h> 33291a2b48SSukumar Swaminathan #include <emlxs_fw.h> 34291a2b48SSukumar Swaminathan 3582527734SSukumar Swaminathan emlxs_firmware_t emlxs_fw_mod_table[] = EMLXS_FW_TABLE; 3682527734SSukumar Swaminathan int emlxs_fw_mod_count = sizeof (emlxs_fw_mod_table) / 3782527734SSukumar Swaminathan sizeof (emlxs_firmware_t); 3882527734SSukumar Swaminathan char emlxs_fw_mod_name[] = EMLXS_FW_NAME; 39291a2b48SSukumar Swaminathan 40291a2b48SSukumar Swaminathan static struct modlmisc emlxs_modlmisc = { 41291a2b48SSukumar Swaminathan &mod_miscops, 4282527734SSukumar Swaminathan emlxs_fw_mod_name 43291a2b48SSukumar Swaminathan }; 44291a2b48SSukumar Swaminathan 45291a2b48SSukumar Swaminathan static struct modlinkage emlxs_modlinkage = { 46291a2b48SSukumar Swaminathan MODREV_1, 47291a2b48SSukumar Swaminathan (void *)&emlxs_modlmisc, 48291a2b48SSukumar Swaminathan NULL 49291a2b48SSukumar Swaminathan }; 50291a2b48SSukumar Swaminathan 51291a2b48SSukumar Swaminathan int _init(void)52291a2b48SSukumar Swaminathan_init(void) 53291a2b48SSukumar Swaminathan { 54291a2b48SSukumar Swaminathan int rval; 55291a2b48SSukumar Swaminathan 56291a2b48SSukumar Swaminathan rval = mod_install(&emlxs_modlinkage); 57291a2b48SSukumar Swaminathan 58291a2b48SSukumar Swaminathan return (rval); 59291a2b48SSukumar Swaminathan 60291a2b48SSukumar Swaminathan } /* _init() */ 61291a2b48SSukumar Swaminathan 62291a2b48SSukumar Swaminathan int _fini()63291a2b48SSukumar Swaminathan_fini() 64291a2b48SSukumar Swaminathan { 65291a2b48SSukumar Swaminathan int rval; 66291a2b48SSukumar Swaminathan 67291a2b48SSukumar Swaminathan rval = mod_remove(&emlxs_modlinkage); 68291a2b48SSukumar Swaminathan 69291a2b48SSukumar Swaminathan return (rval); 70291a2b48SSukumar Swaminathan 71291a2b48SSukumar Swaminathan } /* _fini() */ 72291a2b48SSukumar Swaminathan 73291a2b48SSukumar Swaminathan int _info(struct modinfo * modinfop)74291a2b48SSukumar Swaminathan_info(struct modinfo *modinfop) 75291a2b48SSukumar Swaminathan { 76291a2b48SSukumar Swaminathan int rval; 77291a2b48SSukumar Swaminathan 78291a2b48SSukumar Swaminathan rval = mod_info(&emlxs_modlinkage, modinfop); 79291a2b48SSukumar Swaminathan 80291a2b48SSukumar Swaminathan return (rval); 81291a2b48SSukumar Swaminathan 82291a2b48SSukumar Swaminathan } /* _fini() */ 83291a2b48SSukumar Swaminathan 84291a2b48SSukumar Swaminathan int emlxs_fw_get(emlxs_firmware_t * fw)85291a2b48SSukumar Swaminathanemlxs_fw_get(emlxs_firmware_t *fw) 86291a2b48SSukumar Swaminathan { 87291a2b48SSukumar Swaminathan uint32_t i; 88291a2b48SSukumar Swaminathan emlxs_firmware_t *fw_table; 89291a2b48SSukumar Swaminathan 90291a2b48SSukumar Swaminathan /* Find matching firmware table entry */ 9182527734SSukumar Swaminathan fw_table = emlxs_fw_mod_table; 9282527734SSukumar Swaminathan for (i = 0; i < emlxs_fw_mod_count; i++, fw_table++) { 93291a2b48SSukumar Swaminathan /* Validate requested fw image */ 94291a2b48SSukumar Swaminathan if ((fw_table->id == fw->id) && 95291a2b48SSukumar Swaminathan (fw_table->kern == fw->kern) && 96291a2b48SSukumar Swaminathan (fw_table->stub == fw->stub) && 97291a2b48SSukumar Swaminathan (fw_table->sli1 == fw->sli1) && 98291a2b48SSukumar Swaminathan (fw_table->sli2 == fw->sli2) && 99291a2b48SSukumar Swaminathan (fw_table->sli3 == fw->sli3) && 100291a2b48SSukumar Swaminathan (fw_table->sli4 == fw->sli4)) { 101291a2b48SSukumar Swaminathan /* Return image data and size */ 102291a2b48SSukumar Swaminathan fw->image = fw_table->image; 103291a2b48SSukumar Swaminathan fw->size = fw_table->size; 104291a2b48SSukumar Swaminathan 105291a2b48SSukumar Swaminathan return (0); 106291a2b48SSukumar Swaminathan } 107291a2b48SSukumar Swaminathan } 108291a2b48SSukumar Swaminathan 109291a2b48SSukumar Swaminathan fw->image = NULL; 110291a2b48SSukumar Swaminathan fw->size = 0; 111291a2b48SSukumar Swaminathan 112291a2b48SSukumar Swaminathan return (1); 113291a2b48SSukumar Swaminathan 114291a2b48SSukumar Swaminathan } /* emlxs_fw_get() */ 115