1*7f0b8309SEdward Pilatowicz /*
2*7f0b8309SEdward Pilatowicz * CDDL HEADER START
3*7f0b8309SEdward Pilatowicz *
4*7f0b8309SEdward Pilatowicz * The contents of this file are subject to the terms of the
5*7f0b8309SEdward Pilatowicz * Common Development and Distribution License (the "License").
6*7f0b8309SEdward Pilatowicz * You may not use this file except in compliance with the License.
7*7f0b8309SEdward Pilatowicz *
8*7f0b8309SEdward Pilatowicz * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*7f0b8309SEdward Pilatowicz * or http://www.opensolaris.org/os/licensing.
10*7f0b8309SEdward Pilatowicz * See the License for the specific language governing permissions
11*7f0b8309SEdward Pilatowicz * and limitations under the License.
12*7f0b8309SEdward Pilatowicz *
13*7f0b8309SEdward Pilatowicz * When distributing Covered Code, include this CDDL HEADER in each
14*7f0b8309SEdward Pilatowicz * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*7f0b8309SEdward Pilatowicz * If applicable, add the following below this CDDL HEADER, with the
16*7f0b8309SEdward Pilatowicz * fields enclosed by brackets "[]" replaced with your own identifying
17*7f0b8309SEdward Pilatowicz * information: Portions Copyright [yyyy] [name of copyright owner]
18*7f0b8309SEdward Pilatowicz *
19*7f0b8309SEdward Pilatowicz * CDDL HEADER END
20*7f0b8309SEdward Pilatowicz */
21*7f0b8309SEdward Pilatowicz /*
22*7f0b8309SEdward Pilatowicz * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
23*7f0b8309SEdward Pilatowicz * Use is subject to license terms.
24*7f0b8309SEdward Pilatowicz */
25*7f0b8309SEdward Pilatowicz
26*7f0b8309SEdward Pilatowicz #include <io/xdf_shell.h>
27*7f0b8309SEdward Pilatowicz
28*7f0b8309SEdward Pilatowicz #include <sys/scsi/targets/sddef.h>
29*7f0b8309SEdward Pilatowicz
30*7f0b8309SEdward Pilatowicz /*
31*7f0b8309SEdward Pilatowicz * We're emulating (and possibly layering on top of) sd devices, so xdf
32*7f0b8309SEdward Pilatowicz * disk unit mappings must match up with sd disk unit mappings'.
33*7f0b8309SEdward Pilatowicz */
34*7f0b8309SEdward Pilatowicz #if !defined(XDF_PSHIFT)
35*7f0b8309SEdward Pilatowicz #error "can't find definition for xdf unit mappings - XDF_PSHIFT"
36*7f0b8309SEdward Pilatowicz #endif /* XDF_PSHIFT */
37*7f0b8309SEdward Pilatowicz
38*7f0b8309SEdward Pilatowicz #if !defined(SDUNIT_SHIFT)
39*7f0b8309SEdward Pilatowicz #error "can't find definition for cmdk unit mappings - SDUNIT_SHIFT"
40*7f0b8309SEdward Pilatowicz #endif /* SDUNIT_SHIFT */
41*7f0b8309SEdward Pilatowicz
42*7f0b8309SEdward Pilatowicz #if ((XDF_PSHIFT - SDUNIT_SHIFT) != 0)
43*7f0b8309SEdward Pilatowicz #error "sd and xdf unit mappings don't match."
44*7f0b8309SEdward Pilatowicz #endif /* ((XDF_PSHIFT - SDUNIT_SHIFT) != 0) */
45*7f0b8309SEdward Pilatowicz
46*7f0b8309SEdward Pilatowicz extern const struct dev_ops sd_ops;
47*7f0b8309SEdward Pilatowicz extern void *sd_state;
48*7f0b8309SEdward Pilatowicz
49*7f0b8309SEdward Pilatowicz /*
50*7f0b8309SEdward Pilatowicz * Globals required by xdf_shell.c
51*7f0b8309SEdward Pilatowicz */
52*7f0b8309SEdward Pilatowicz const char *xdfs_c_name = "sd";
53*7f0b8309SEdward Pilatowicz const char *xdfs_c_linkinfo = "PV SCSI Disk Driver";
54*7f0b8309SEdward Pilatowicz void **xdfs_c_hvm_ss = &sd_state;
55*7f0b8309SEdward Pilatowicz const size_t xdfs_c_hvm_ss_size = sizeof (struct sd_lun);
56*7f0b8309SEdward Pilatowicz const struct dev_ops *xdfs_c_hvm_dev_ops = &sd_ops;
57*7f0b8309SEdward Pilatowicz
58*7f0b8309SEdward Pilatowicz const xdfs_h2p_map_t xdfs_c_h2p_map[] = {
59*7f0b8309SEdward Pilatowicz { "/pci@0,0/pci-ide@1,1/ide@0/sd@0,0", "/xpvd/xdf@768" },
60*7f0b8309SEdward Pilatowicz { "/pci@0,0/pci-ide@1,1/ide@0/sd@1,0", "/xpvd/xdf@832" },
61*7f0b8309SEdward Pilatowicz { "/pci@0,0/pci-ide@1,1/ide@1/sd@0,0", "/xpvd/xdf@5632" },
62*7f0b8309SEdward Pilatowicz { "/pci@0,0/pci-ide@1,1/ide@1/sd@1,0", "/xpvd/xdf@5696" },
63*7f0b8309SEdward Pilatowicz { NULL, 0 }
64*7f0b8309SEdward Pilatowicz };
65*7f0b8309SEdward Pilatowicz
66*7f0b8309SEdward Pilatowicz /*ARGSUSED*/
67*7f0b8309SEdward Pilatowicz int
xdfs_c_ioctl(xdfs_state_t * xsp,dev_t dev,int part,int cmd,intptr_t arg,int flag,cred_t * credp,int * rvalp,boolean_t * done)68*7f0b8309SEdward Pilatowicz xdfs_c_ioctl(xdfs_state_t *xsp, dev_t dev, int part,
69*7f0b8309SEdward Pilatowicz int cmd, intptr_t arg, int flag, cred_t *credp, int *rvalp, boolean_t *done)
70*7f0b8309SEdward Pilatowicz {
71*7f0b8309SEdward Pilatowicz dev_info_t *dip = xsp->xdfss_dip;
72*7f0b8309SEdward Pilatowicz int instance = ddi_get_instance(dip);
73*7f0b8309SEdward Pilatowicz int rv;
74*7f0b8309SEdward Pilatowicz
75*7f0b8309SEdward Pilatowicz *done = B_TRUE;
76*7f0b8309SEdward Pilatowicz switch (cmd) {
77*7f0b8309SEdward Pilatowicz case DKIOCINFO: {
78*7f0b8309SEdward Pilatowicz struct dk_cinfo info;
79*7f0b8309SEdward Pilatowicz
80*7f0b8309SEdward Pilatowicz /* Pass on the ioctl request, save the response */
81*7f0b8309SEdward Pilatowicz if ((rv = ldi_ioctl(xsp->xdfss_tgt_lh[part],
82*7f0b8309SEdward Pilatowicz cmd, (intptr_t)&info, FKIOCTL, credp, rvalp)) != 0)
83*7f0b8309SEdward Pilatowicz return (rv);
84*7f0b8309SEdward Pilatowicz
85*7f0b8309SEdward Pilatowicz /* Update controller info */
86*7f0b8309SEdward Pilatowicz info.dki_cnum = ddi_get_instance(ddi_get_parent(dip));
87*7f0b8309SEdward Pilatowicz (void) strlcpy(info.dki_cname,
88*7f0b8309SEdward Pilatowicz ddi_get_name(ddi_get_parent(dip)), sizeof (info.dki_cname));
89*7f0b8309SEdward Pilatowicz
90*7f0b8309SEdward Pilatowicz /* Update unit info. */
91*7f0b8309SEdward Pilatowicz if (info.dki_ctype == DKC_VBD) {
92*7f0b8309SEdward Pilatowicz /*
93*7f0b8309SEdward Pilatowicz * Normally a real scsi device would report the
94*7f0b8309SEdward Pilatowicz * controller type as DKC_SCSI_CCS. But we don't
95*7f0b8309SEdward Pilatowicz * emulate a real scsi controller. (Which becomes
96*7f0b8309SEdward Pilatowicz * apparent if anyone tries to issue us a uscsi(7i)
97*7f0b8309SEdward Pilatowicz * command.) So instead of reporting DKC_SCSI_CCS,
98*7f0b8309SEdward Pilatowicz * we report DKC_UNKNOWN.
99*7f0b8309SEdward Pilatowicz */
100*7f0b8309SEdward Pilatowicz info.dki_ctype = DKC_UNKNOWN;
101*7f0b8309SEdward Pilatowicz }
102*7f0b8309SEdward Pilatowicz info.dki_unit = instance;
103*7f0b8309SEdward Pilatowicz (void) strlcpy(info.dki_dname,
104*7f0b8309SEdward Pilatowicz ddi_driver_name(dip), sizeof (info.dki_dname));
105*7f0b8309SEdward Pilatowicz info.dki_addr = 1;
106*7f0b8309SEdward Pilatowicz
107*7f0b8309SEdward Pilatowicz if (ddi_copyout(&info, (void *)arg, sizeof (info), flag))
108*7f0b8309SEdward Pilatowicz return (EFAULT);
109*7f0b8309SEdward Pilatowicz
110*7f0b8309SEdward Pilatowicz return (0);
111*7f0b8309SEdward Pilatowicz }
112*7f0b8309SEdward Pilatowicz default:
113*7f0b8309SEdward Pilatowicz *done = B_FALSE;
114*7f0b8309SEdward Pilatowicz return (0);
115*7f0b8309SEdward Pilatowicz } /* switch (cmd) */
116*7f0b8309SEdward Pilatowicz /*NOTREACHED*/
117*7f0b8309SEdward Pilatowicz }
118*7f0b8309SEdward Pilatowicz
119*7f0b8309SEdward Pilatowicz /*ARGSUSED*/
120*7f0b8309SEdward Pilatowicz void
xdfs_c_devid_setup(xdfs_state_t * xsp)121*7f0b8309SEdward Pilatowicz xdfs_c_devid_setup(xdfs_state_t *xsp)
122*7f0b8309SEdward Pilatowicz {
123*7f0b8309SEdward Pilatowicz /*
124*7f0b8309SEdward Pilatowicz * Currently we only support cdrom devices, which don't have
125*7f0b8309SEdward Pilatowicz * devids associated with them.
126*7f0b8309SEdward Pilatowicz */
127*7f0b8309SEdward Pilatowicz ASSERT("cdrom devices don't have a devid");
128*7f0b8309SEdward Pilatowicz }
129*7f0b8309SEdward Pilatowicz
130*7f0b8309SEdward Pilatowicz /*ARGSUSED*/
131*7f0b8309SEdward Pilatowicz int
xdfs_c_getpgeom(dev_info_t * dip,cmlb_geom_t * pgeom)132*7f0b8309SEdward Pilatowicz xdfs_c_getpgeom(dev_info_t *dip, cmlb_geom_t *pgeom)
133*7f0b8309SEdward Pilatowicz {
134*7f0b8309SEdward Pilatowicz /*
135*7f0b8309SEdward Pilatowicz * Currently we only support cdrom devices, which don't have
136*7f0b8309SEdward Pilatowicz * a physical geometry, so this routine should never get
137*7f0b8309SEdward Pilatowicz * invoked.
138*7f0b8309SEdward Pilatowicz */
139*7f0b8309SEdward Pilatowicz ASSERT("cdrom devices don't have any physical geometry");
140*7f0b8309SEdward Pilatowicz return (-1);
141*7f0b8309SEdward Pilatowicz }
142*7f0b8309SEdward Pilatowicz
143*7f0b8309SEdward Pilatowicz /*ARGSUSED*/
144*7f0b8309SEdward Pilatowicz boolean_t
xdfs_c_bb_check(xdfs_state_t * xsp)145*7f0b8309SEdward Pilatowicz xdfs_c_bb_check(xdfs_state_t *xsp)
146*7f0b8309SEdward Pilatowicz {
147*7f0b8309SEdward Pilatowicz /*
148*7f0b8309SEdward Pilatowicz * Currently we only support cdrom devices, which don't have
149*7f0b8309SEdward Pilatowicz * bad blocks, so this routine should never get invoked.
150*7f0b8309SEdward Pilatowicz */
151*7f0b8309SEdward Pilatowicz ASSERT("cdrom devices don't support bad block mappings");
152*7f0b8309SEdward Pilatowicz return (B_TRUE);
153*7f0b8309SEdward Pilatowicz }
154*7f0b8309SEdward Pilatowicz
155*7f0b8309SEdward Pilatowicz char *
xdfs_c_cmlb_node_type(xdfs_state_t * xsp)156*7f0b8309SEdward Pilatowicz xdfs_c_cmlb_node_type(xdfs_state_t *xsp)
157*7f0b8309SEdward Pilatowicz {
158*7f0b8309SEdward Pilatowicz return (xsp->xdfss_tgt_is_cd ? DDI_NT_CD_CHAN : DDI_NT_BLOCK_CHAN);
159*7f0b8309SEdward Pilatowicz }
160*7f0b8309SEdward Pilatowicz
161*7f0b8309SEdward Pilatowicz /*ARGSUSED*/
162*7f0b8309SEdward Pilatowicz int
xdfs_c_cmlb_alter_behavior(xdfs_state_t * xsp)163*7f0b8309SEdward Pilatowicz xdfs_c_cmlb_alter_behavior(xdfs_state_t *xsp)
164*7f0b8309SEdward Pilatowicz {
165*7f0b8309SEdward Pilatowicz return (0);
166*7f0b8309SEdward Pilatowicz }
167*7f0b8309SEdward Pilatowicz
168*7f0b8309SEdward Pilatowicz void
xdfs_c_attach(xdfs_state_t * xsp)169*7f0b8309SEdward Pilatowicz xdfs_c_attach(xdfs_state_t *xsp)
170*7f0b8309SEdward Pilatowicz {
171*7f0b8309SEdward Pilatowicz dev_info_t *dip = xsp->xdfss_dip;
172*7f0b8309SEdward Pilatowicz int dtype = DTYPE_DIRECT;
173*7f0b8309SEdward Pilatowicz
174*7f0b8309SEdward Pilatowicz if (xsp->xdfss_tgt_is_cd) {
175*7f0b8309SEdward Pilatowicz dtype = DTYPE_RODIRECT;
176*7f0b8309SEdward Pilatowicz (void) ddi_prop_create(DDI_DEV_T_NONE, dip,
177*7f0b8309SEdward Pilatowicz DDI_PROP_CANSLEEP, "removable-media", NULL, 0);
178*7f0b8309SEdward Pilatowicz }
179*7f0b8309SEdward Pilatowicz
180*7f0b8309SEdward Pilatowicz /*
181*7f0b8309SEdward Pilatowicz * We use ndi_* instead of ddi_* because it will result in
182*7f0b8309SEdward Pilatowicz * INQUIRY_DEVICE_TYPE being a hardware property instead
183*7f0b8309SEdward Pilatowicz * or a driver property
184*7f0b8309SEdward Pilatowicz */
185*7f0b8309SEdward Pilatowicz (void) ndi_prop_update_int(DDI_DEV_T_NONE, dip,
186*7f0b8309SEdward Pilatowicz INQUIRY_DEVICE_TYPE, dtype);
187*7f0b8309SEdward Pilatowicz }
188