xref: /onnv-gate/usr/src/lib/libsmedia/plugins/blkdev/common/b_generic.c (revision 12426:cdff5d2ea989)
1*12426Sgdamore@opensolaris.org /*
2*12426Sgdamore@opensolaris.org  * CDDL HEADER START
3*12426Sgdamore@opensolaris.org  *
4*12426Sgdamore@opensolaris.org  * The contents of this file are subject to the terms of the
5*12426Sgdamore@opensolaris.org  * Common Development and Distribution License (the "License").
6*12426Sgdamore@opensolaris.org  * You may not use this file except in compliance with the License.
7*12426Sgdamore@opensolaris.org  *
8*12426Sgdamore@opensolaris.org  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*12426Sgdamore@opensolaris.org  * or http://www.opensolaris.org/os/licensing.
10*12426Sgdamore@opensolaris.org  * See the License for the specific language governing permissions
11*12426Sgdamore@opensolaris.org  * and limitations under the License.
12*12426Sgdamore@opensolaris.org  *
13*12426Sgdamore@opensolaris.org  * When distributing Covered Code, include this CDDL HEADER in each
14*12426Sgdamore@opensolaris.org  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*12426Sgdamore@opensolaris.org  * If applicable, add the following below this CDDL HEADER, with the
16*12426Sgdamore@opensolaris.org  * fields enclosed by brackets "[]" replaced with your own identifying
17*12426Sgdamore@opensolaris.org  * information: Portions Copyright [yyyy] [name of copyright owner]
18*12426Sgdamore@opensolaris.org  *
19*12426Sgdamore@opensolaris.org  * CDDL HEADER END
20*12426Sgdamore@opensolaris.org  */
21*12426Sgdamore@opensolaris.org /*
22*12426Sgdamore@opensolaris.org  * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
23*12426Sgdamore@opensolaris.org  */
24*12426Sgdamore@opensolaris.org 
25*12426Sgdamore@opensolaris.org /*
26*12426Sgdamore@opensolaris.org  * b_generic.c :
27*12426Sgdamore@opensolaris.org  *      This file contains the functions for generic block devices
28*12426Sgdamore@opensolaris.org  * 	for libsmedia.
29*12426Sgdamore@opensolaris.org  */
30*12426Sgdamore@opensolaris.org 
31*12426Sgdamore@opensolaris.org #include <stdio.h>
32*12426Sgdamore@opensolaris.org #include <unistd.h>
33*12426Sgdamore@opensolaris.org #include <locale.h>
34*12426Sgdamore@opensolaris.org #include <sys/types.h>
35*12426Sgdamore@opensolaris.org #include <sys/param.h>
36*12426Sgdamore@opensolaris.org #include <sys/dkio.h>
37*12426Sgdamore@opensolaris.org #include <string.h>
38*12426Sgdamore@opensolaris.org #include "../../../library/inc/smedia.h"
39*12426Sgdamore@opensolaris.org #include "../../../library/inc/rmedia.h"
40*12426Sgdamore@opensolaris.org #include "../../../library/common/l_defines.h"
41*12426Sgdamore@opensolaris.org 
42*12426Sgdamore@opensolaris.org #define	PERROR(string)	my_perror(gettext(string))
43*12426Sgdamore@opensolaris.org 
44*12426Sgdamore@opensolaris.org static void
my_perror(char * err_string)45*12426Sgdamore@opensolaris.org my_perror(char *err_string)
46*12426Sgdamore@opensolaris.org {
47*12426Sgdamore@opensolaris.org 
48*12426Sgdamore@opensolaris.org 	int error_no;
49*12426Sgdamore@opensolaris.org 	if (errno == 0)
50*12426Sgdamore@opensolaris.org 		return;
51*12426Sgdamore@opensolaris.org 
52*12426Sgdamore@opensolaris.org 	error_no = errno;
53*12426Sgdamore@opensolaris.org 	(void) fprintf(stderr, gettext(err_string));
54*12426Sgdamore@opensolaris.org 	(void) fprintf(stderr, gettext(" : "));
55*12426Sgdamore@opensolaris.org 	errno = error_no;
56*12426Sgdamore@opensolaris.org 	perror("");
57*12426Sgdamore@opensolaris.org }
58*12426Sgdamore@opensolaris.org 
59*12426Sgdamore@opensolaris.org int32_t
_m_version_no(void)60*12426Sgdamore@opensolaris.org _m_version_no(void)
61*12426Sgdamore@opensolaris.org {
62*12426Sgdamore@opensolaris.org 	return (SM_BLKDEV_VERSION_1);
63*12426Sgdamore@opensolaris.org }
64*12426Sgdamore@opensolaris.org 
65*12426Sgdamore@opensolaris.org int32_t
_m_device_type(ushort_t ctype,ushort_t mtype)66*12426Sgdamore@opensolaris.org _m_device_type(ushort_t ctype, ushort_t mtype)
67*12426Sgdamore@opensolaris.org {
68*12426Sgdamore@opensolaris.org 	if (ctype == DKC_BLKDEV) {
69*12426Sgdamore@opensolaris.org 		if (mtype == 0)
70*12426Sgdamore@opensolaris.org 			return (0);
71*12426Sgdamore@opensolaris.org 	}
72*12426Sgdamore@opensolaris.org 	return (-1);
73*12426Sgdamore@opensolaris.org }
74*12426Sgdamore@opensolaris.org 
75*12426Sgdamore@opensolaris.org 
76*12426Sgdamore@opensolaris.org int32_t
_m_get_media_info(rmedia_handle_t * handle,void * ip)77*12426Sgdamore@opensolaris.org _m_get_media_info(rmedia_handle_t *handle, void *ip)
78*12426Sgdamore@opensolaris.org {
79*12426Sgdamore@opensolaris.org 	smmedium_prop_t *mp = (smmedium_prop_t *)ip;
80*12426Sgdamore@opensolaris.org 	struct dk_geom		dkg;
81*12426Sgdamore@opensolaris.org 	struct dk_minfo		minfo;
82*12426Sgdamore@opensolaris.org 	enum dkio_state		state = DKIO_NONE;
83*12426Sgdamore@opensolaris.org 	int			ret_val;
84*12426Sgdamore@opensolaris.org 
85*12426Sgdamore@opensolaris.org 	if (handle == NULL) {
86*12426Sgdamore@opensolaris.org 		DPRINTF("Null Handle\n");
87*12426Sgdamore@opensolaris.org 		errno = EINVAL;
88*12426Sgdamore@opensolaris.org 		return (-1);
89*12426Sgdamore@opensolaris.org 	}
90*12426Sgdamore@opensolaris.org 	if (handle->sm_signature != (int32_t)LIBSMEDIA_SIGNATURE) {
91*12426Sgdamore@opensolaris.org 		DPRINTF2("Signature expected=0x%x, found=0x%x\n",
92*12426Sgdamore@opensolaris.org 		    LIBSMEDIA_SIGNATURE, handle->sm_signature);
93*12426Sgdamore@opensolaris.org 		errno = EINVAL;
94*12426Sgdamore@opensolaris.org 		return (-1);
95*12426Sgdamore@opensolaris.org 	}
96*12426Sgdamore@opensolaris.org 
97*12426Sgdamore@opensolaris.org 	if (ioctl(handle->sm_fd, DKIOCSTATE, &state) < 0) {
98*12426Sgdamore@opensolaris.org 		PERROR("DKIOCSTATE failed");
99*12426Sgdamore@opensolaris.org 		return (-1);
100*12426Sgdamore@opensolaris.org 	}
101*12426Sgdamore@opensolaris.org 
102*12426Sgdamore@opensolaris.org 	if (state != DKIO_INSERTED) {
103*12426Sgdamore@opensolaris.org 		DPRINTF("No media.\n");
104*12426Sgdamore@opensolaris.org 		mp->sm_media_type = SM_NOT_PRESENT;
105*12426Sgdamore@opensolaris.org 		mp->sm_version = SMMEDIA_PROP_V_1;
106*12426Sgdamore@opensolaris.org 		return (0);
107*12426Sgdamore@opensolaris.org 
108*12426Sgdamore@opensolaris.org 	}
109*12426Sgdamore@opensolaris.org 
110*12426Sgdamore@opensolaris.org 	ret_val = ioctl(handle->sm_fd, DKIOCGMEDIAINFO, &minfo);
111*12426Sgdamore@opensolaris.org 	if (ret_val < 0) {
112*12426Sgdamore@opensolaris.org 		DPRINTF("DKIOCGMEDIAINFO ioctl failed");
113*12426Sgdamore@opensolaris.org 		return (ret_val);
114*12426Sgdamore@opensolaris.org 	}
115*12426Sgdamore@opensolaris.org 	ret_val = ioctl(handle->sm_fd, DKIOCGGEOM, &dkg);
116*12426Sgdamore@opensolaris.org 	if (ret_val < 0) {
117*12426Sgdamore@opensolaris.org 		DPRINTF("DKIOCGGEOM ioctl failed");
118*12426Sgdamore@opensolaris.org 		return (ret_val);
119*12426Sgdamore@opensolaris.org 	}
120*12426Sgdamore@opensolaris.org 
121*12426Sgdamore@opensolaris.org 	mp->sm_media_type = SM_BLOCK;
122*12426Sgdamore@opensolaris.org 	mp->sm_blocksize = minfo.dki_lbsize;
123*12426Sgdamore@opensolaris.org 	mp->sm_capacity = minfo.dki_capacity;
124*12426Sgdamore@opensolaris.org 	mp->sm_pcyl = dkg.dkg_pcyl;
125*12426Sgdamore@opensolaris.org 	mp->sm_nhead = dkg.dkg_nhead;
126*12426Sgdamore@opensolaris.org 	mp->sm_nsect = dkg.dkg_nsect;
127*12426Sgdamore@opensolaris.org 	return (0);
128*12426Sgdamore@opensolaris.org }
129*12426Sgdamore@opensolaris.org 
130*12426Sgdamore@opensolaris.org 
131*12426Sgdamore@opensolaris.org 
132*12426Sgdamore@opensolaris.org /* ARGSUSED0 */
133*12426Sgdamore@opensolaris.org 
134*12426Sgdamore@opensolaris.org int32_t
_m_get_device_info(rmedia_handle_t * handle,void * ip)135*12426Sgdamore@opensolaris.org _m_get_device_info(rmedia_handle_t *handle, void *ip)
136*12426Sgdamore@opensolaris.org {
137*12426Sgdamore@opensolaris.org 	smdevice_info_t *mp = (smdevice_info_t *)ip;
138*12426Sgdamore@opensolaris.org 	char *vendor_name, *product_name, *fw_version;
139*12426Sgdamore@opensolaris.org 
140*12426Sgdamore@opensolaris.org 	if (handle == NULL) {
141*12426Sgdamore@opensolaris.org 		DPRINTF("Null Handle\n");
142*12426Sgdamore@opensolaris.org 		errno = EINVAL;
143*12426Sgdamore@opensolaris.org 		return (-1);
144*12426Sgdamore@opensolaris.org 	}
145*12426Sgdamore@opensolaris.org 	if (handle->sm_signature != (int32_t)LIBSMEDIA_SIGNATURE) {
146*12426Sgdamore@opensolaris.org 		DPRINTF2("Signature expected=0x%x, found=0x%x\n",
147*12426Sgdamore@opensolaris.org 		    LIBSMEDIA_SIGNATURE, handle->sm_signature);
148*12426Sgdamore@opensolaris.org 		errno = EINVAL;
149*12426Sgdamore@opensolaris.org 		return (-1);
150*12426Sgdamore@opensolaris.org 	}
151*12426Sgdamore@opensolaris.org 	vendor_name = (char *)malloc(1);
152*12426Sgdamore@opensolaris.org 	if (vendor_name == NULL) {
153*12426Sgdamore@opensolaris.org 	if (!errno)
154*12426Sgdamore@opensolaris.org 		errno = ENOMEM;
155*12426Sgdamore@opensolaris.org 		return (-1);
156*12426Sgdamore@opensolaris.org 	}
157*12426Sgdamore@opensolaris.org 	product_name = (char *)malloc(1);
158*12426Sgdamore@opensolaris.org 	if (product_name == NULL) {
159*12426Sgdamore@opensolaris.org 		free(vendor_name);
160*12426Sgdamore@opensolaris.org 		if (!errno)
161*12426Sgdamore@opensolaris.org 			errno = ENOMEM;
162*12426Sgdamore@opensolaris.org 		return (-1);
163*12426Sgdamore@opensolaris.org 	}
164*12426Sgdamore@opensolaris.org 
165*12426Sgdamore@opensolaris.org 	fw_version = (char *)malloc(1);
166*12426Sgdamore@opensolaris.org 	if (fw_version == NULL) {
167*12426Sgdamore@opensolaris.org 		free(vendor_name);
168*12426Sgdamore@opensolaris.org 		free(product_name);
169*12426Sgdamore@opensolaris.org 			if (!errno)
170*12426Sgdamore@opensolaris.org 		errno = ENOMEM;
171*12426Sgdamore@opensolaris.org 		return (-1);
172*12426Sgdamore@opensolaris.org 	}
173*12426Sgdamore@opensolaris.org 
174*12426Sgdamore@opensolaris.org 	/* Note: we could potentially offer more here */
175*12426Sgdamore@opensolaris.org 	vendor_name[0] = 0;
176*12426Sgdamore@opensolaris.org 	product_name[0] = 0;
177*12426Sgdamore@opensolaris.org 	fw_version[0] = 0;
178*12426Sgdamore@opensolaris.org 	mp->sm_interface_type = IF_BLOCK;
179*12426Sgdamore@opensolaris.org 	mp->sm_vendor_name = vendor_name;
180*12426Sgdamore@opensolaris.org 	mp->sm_product_name = product_name;
181*12426Sgdamore@opensolaris.org 	mp->sm_firmware_version = fw_version;
182*12426Sgdamore@opensolaris.org 	return (0);
183*12426Sgdamore@opensolaris.org }
184*12426Sgdamore@opensolaris.org 
185*12426Sgdamore@opensolaris.org int32_t
_m_free_device_info(rmedia_handle_t * handle,void * ip)186*12426Sgdamore@opensolaris.org _m_free_device_info(rmedia_handle_t *handle, void *ip)
187*12426Sgdamore@opensolaris.org {
188*12426Sgdamore@opensolaris.org 	struct smdevice_info *dev_info = ip;
189*12426Sgdamore@opensolaris.org 
190*12426Sgdamore@opensolaris.org 	/* Check for valid handle */
191*12426Sgdamore@opensolaris.org 	if (handle == NULL) {
192*12426Sgdamore@opensolaris.org 		DPRINTF("Null Handle\n");
193*12426Sgdamore@opensolaris.org 		errno = EINVAL;
194*12426Sgdamore@opensolaris.org 		return (-1);
195*12426Sgdamore@opensolaris.org 	}
196*12426Sgdamore@opensolaris.org 	if (handle->sm_signature != LIBSMEDIA_SIGNATURE) {
197*12426Sgdamore@opensolaris.org 		DPRINTF("Invalid signature in handle.\n");
198*12426Sgdamore@opensolaris.org 		errno = EINVAL;
199*12426Sgdamore@opensolaris.org 		return (-1);
200*12426Sgdamore@opensolaris.org 	}
201*12426Sgdamore@opensolaris.org 
202*12426Sgdamore@opensolaris.org 	free(dev_info->sm_vendor_name);
203*12426Sgdamore@opensolaris.org 	free(dev_info->sm_product_name);
204*12426Sgdamore@opensolaris.org 	free(dev_info->sm_firmware_version);
205*12426Sgdamore@opensolaris.org 	return (0);
206*12426Sgdamore@opensolaris.org }
207