196c4a178SChris Horne /* 296c4a178SChris Horne * CDDL HEADER START 396c4a178SChris Horne * 496c4a178SChris Horne * The contents of this file are subject to the terms of the 596c4a178SChris Horne * Common Development and Distribution License (the "License"). 696c4a178SChris Horne * You may not use this file except in compliance with the License. 796c4a178SChris Horne * 896c4a178SChris Horne * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 996c4a178SChris Horne * or http://www.opensolaris.org/os/licensing. 1096c4a178SChris Horne * See the License for the specific language governing permissions 1196c4a178SChris Horne * and limitations under the License. 1296c4a178SChris Horne * 1396c4a178SChris Horne * When distributing Covered Code, include this CDDL HEADER in each 1496c4a178SChris Horne * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1596c4a178SChris Horne * If applicable, add the following below this CDDL HEADER, with the 1696c4a178SChris Horne * fields enclosed by brackets "[]" replaced with your own identifying 1796c4a178SChris Horne * information: Portions Copyright [yyyy] [name of copyright owner] 1896c4a178SChris Horne * 1996c4a178SChris Horne * CDDL HEADER END 2096c4a178SChris Horne */ 2196c4a178SChris Horne 2296c4a178SChris Horne /* 2396c4a178SChris Horne * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 2496c4a178SChris Horne * Use is subject to license terms. 2596c4a178SChris Horne */ 2696c4a178SChris Horne 2796c4a178SChris Horne #ifndef _SYS_SCSI_IMPL_SMP_TRANSPORT_H 2896c4a178SChris Horne #define _SYS_SCSI_IMPL_SMP_TRANSPORT_H 2996c4a178SChris Horne 3096c4a178SChris Horne #include <sys/types.h> 3196c4a178SChris Horne #include <sys/scsi/impl/usmp.h> 3296c4a178SChris Horne 3396c4a178SChris Horne #ifdef __cplusplus 3496c4a178SChris Horne extern "C" { 3596c4a178SChris Horne #endif 3696c4a178SChris Horne 3796c4a178SChris Horne #if defined(_KERNEL) 3896c4a178SChris Horne 3996c4a178SChris Horne /* 4096c4a178SChris Horne * Properties for smp device 4196c4a178SChris Horne */ 4296c4a178SChris Horne #define SMP_PROP "smp-device" 4396c4a178SChris Horne #define SMP_WWN "smp-wwn" 4496c4a178SChris Horne #define SMP_PROP_REPORT_MANUFACTURER "report-manufacturer" 4596c4a178SChris Horne 4696c4a178SChris Horne typedef struct smp_hba_tran smp_hba_tran_t; 4796c4a178SChris Horne 4896c4a178SChris Horne typedef struct smp_address { 4996c4a178SChris Horne uint8_t smp_a_wwn[SAS_WWN_BYTE_SIZE]; /* expander wwn */ 5096c4a178SChris Horne smp_hba_tran_t *smp_a_hba_tran; /* Transport vector */ 5196c4a178SChris Horne } smp_address_t; 5296c4a178SChris Horne 5396c4a178SChris Horne typedef struct smp_device { 5496c4a178SChris Horne smp_address_t smp_sd_address; 5596c4a178SChris Horne dev_info_t *smp_sd_dev; 5696c4a178SChris Horne void *smp_sd_hba_private; 5796c4a178SChris Horne void *smp_sd_private; 5896c4a178SChris Horne } smp_device_t; 5996c4a178SChris Horne 6096c4a178SChris Horne typedef struct smp_pkt { 6196c4a178SChris Horne smp_address_t *smp_pkt_address; 6296c4a178SChris Horne caddr_t smp_pkt_req; 6396c4a178SChris Horne caddr_t smp_pkt_rsp; 6496c4a178SChris Horne size_t smp_pkt_reqsize; 6596c4a178SChris Horne size_t smp_pkt_rspsize; 6696c4a178SChris Horne int smp_pkt_timeout; 6796c4a178SChris Horne uchar_t smp_pkt_reason; /* code from errno.h */ 6896c4a178SChris Horne uchar_t smp_pkt_will_retry; /* will retry on EAGAIN */ 6996c4a178SChris Horne } smp_pkt_t; 7096c4a178SChris Horne 7196c4a178SChris Horne struct smp_hba_tran { 7296c4a178SChris Horne void *smp_tran_hba_private; 7396c4a178SChris Horne 7496c4a178SChris Horne int (*smp_tran_init)( 7596c4a178SChris Horne dev_info_t *self, 7696c4a178SChris Horne dev_info_t *child, 7796c4a178SChris Horne smp_hba_tran_t *tran, 7896c4a178SChris Horne smp_device_t *smp); 7996c4a178SChris Horne 8096c4a178SChris Horne void (*smp_tran_free)( 8196c4a178SChris Horne dev_info_t *self, 8296c4a178SChris Horne dev_info_t *child, 8396c4a178SChris Horne smp_hba_tran_t *tran, 8496c4a178SChris Horne smp_device_t *smp); 8596c4a178SChris Horne 8696c4a178SChris Horne int (*smp_tran_start)( 8796c4a178SChris Horne struct smp_pkt *pkt); 8896c4a178SChris Horne 8996c4a178SChris Horne }; 9096c4a178SChris Horne 9196c4a178SChris Horne /* interfaces for hba/iport driver */ 9296c4a178SChris Horne extern smp_hba_tran_t *smp_hba_tran_alloc(dev_info_t *dip); 9396c4a178SChris Horne extern int smp_hba_attach_setup(dev_info_t *dip, 9496c4a178SChris Horne smp_hba_tran_t *smp); 9596c4a178SChris Horne extern int smp_hba_detach(dev_info_t *self); 9696c4a178SChris Horne extern void smp_hba_tran_free(smp_hba_tran_t *smp); 9796c4a178SChris Horne 9896c4a178SChris Horne /* interfaces target driver (and framework) */ 9996c4a178SChris Horne extern int smp_probe(struct smp_device *smp_devp); 10096c4a178SChris Horne extern int smp_transport(struct smp_pkt *pkt); 10196c4a178SChris Horne 102*499cfd15SDavid Hollister /* ==== The following interfaces are private (currently) ==== */ 103*499cfd15SDavid Hollister 104*499cfd15SDavid Hollister /* 105*499cfd15SDavid Hollister * smp_device_prop_*() property interfaces: flags 106*499cfd15SDavid Hollister * 107*499cfd15SDavid Hollister * SMP_DEVICE_PROP_DEVICE: property of device. 108*499cfd15SDavid Hollister * The property is always associated with the smp_sd_dev devinfo 109*499cfd15SDavid Hollister * node. Implementation uses ndi_prop_*() interfaces applied 110*499cfd15SDavid Hollister * dev_info_t (smp_sd_dev) nodes. 111*499cfd15SDavid Hollister */ 112*499cfd15SDavid Hollister #define SMP_DEVICE_PROP_DEVICE 0x2 /* type is property-of-device */ 113*499cfd15SDavid Hollister #define SMP_DEVICE_PROP_TYPE_MSK 0xF 114*499cfd15SDavid Hollister 115*499cfd15SDavid Hollister int smp_device_prop_get_int(struct smp_device *smp_sd, char *name, 116*499cfd15SDavid Hollister int defvalue); 117*499cfd15SDavid Hollister int64_t smp_device_prop_get_int64(struct smp_device *, char *name, 118*499cfd15SDavid Hollister int64_t defvalue); 119*499cfd15SDavid Hollister 120*499cfd15SDavid Hollister int smp_device_prop_lookup_byte_array(struct smp_device *smp_sd, char *name, 121*499cfd15SDavid Hollister uchar_t **, uint_t *); 122*499cfd15SDavid Hollister int smp_device_prop_lookup_int_array(struct smp_device *smp_sd, char *name, 123*499cfd15SDavid Hollister int **, uint_t *); 124*499cfd15SDavid Hollister int smp_device_prop_lookup_string(struct smp_device *smp_sd, char *name, 125*499cfd15SDavid Hollister char **); 126*499cfd15SDavid Hollister int smp_device_prop_lookup_string_array(struct smp_device *smp_sd, 127*499cfd15SDavid Hollister char *name, char ***, uint_t *); 128*499cfd15SDavid Hollister 129*499cfd15SDavid Hollister int smp_device_prop_update_byte_array(struct smp_device *smp_sd, char *name, 130*499cfd15SDavid Hollister uchar_t *, uint_t); 131*499cfd15SDavid Hollister int smp_device_prop_update_int(struct smp_device *smp_sd, char *name, int); 132*499cfd15SDavid Hollister int smp_device_prop_update_int64(struct smp_device *smp_sd, char *name, 133*499cfd15SDavid Hollister int64_t); 134*499cfd15SDavid Hollister int smp_device_prop_update_int_array(struct smp_device *smp_sd, char *name, 135*499cfd15SDavid Hollister int *, uint_t); 136*499cfd15SDavid Hollister int smp_device_prop_update_string(struct smp_device *smp_sd, char *name, 137*499cfd15SDavid Hollister char *); 138*499cfd15SDavid Hollister int smp_device_prop_update_string_array(struct smp_device *smp_sd, 139*499cfd15SDavid Hollister char *name, char **, uint_t); 140*499cfd15SDavid Hollister 141*499cfd15SDavid Hollister int smp_device_prop_remove(struct smp_device *smp_sd, char *name); 142*499cfd15SDavid Hollister void smp_device_prop_free(struct smp_device *smp_sd, void *data); 143*499cfd15SDavid Hollister 14496c4a178SChris Horne #endif /* defined(_KERNEL) */ 14596c4a178SChris Horne 14696c4a178SChris Horne #ifdef __cplusplus 14796c4a178SChris Horne } 14896c4a178SChris Horne #endif 14996c4a178SChris Horne 15096c4a178SChris Horne #endif /* _SYS_SCSI_IMPL_SMP_TRANSPORT_H */ 151