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 Swaminathan emlxs_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