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