96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne/*
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne * CDDL HEADER START
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne *
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne * The contents of this file are subject to the terms of the
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne * Common Development and Distribution License (the "License").
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne * You may not use this file except in compliance with the License.
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne *
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne * or http://www.opensolaris.org/os/licensing.
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne * See the License for the specific language governing permissions
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne * and limitations under the License.
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne *
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne * When distributing Covered Code, include this CDDL HEADER in each
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne * If applicable, add the following below this CDDL HEADER, with the
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne * fields enclosed by brackets "[]" replaced with your own identifying
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne * information: Portions Copyright [yyyy] [name of copyright owner]
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne *
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne * CDDL HEADER END
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne */
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne/*
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne * Use is subject to license terms.
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne */
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne#ifndef _SYS_SCSI_IMPL_SMP_TRANSPORT_H
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne#define _SYS_SCSI_IMPL_SMP_TRANSPORT_H
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne#include <sys/types.h>
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne#include <sys/scsi/impl/usmp.h>
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne#ifdef __cplusplus
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horneextern "C" {
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne#endif
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne#if defined(_KERNEL)
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne/*
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne * Properties for smp device
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne */
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne#define SMP_PROP "smp-device"
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne#define SMP_WWN "smp-wwn"
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne#define SMP_PROP_REPORT_MANUFACTURER "report-manufacturer"
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Hornetypedef struct smp_hba_tran smp_hba_tran_t;
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Hornetypedef struct smp_address {
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne uint8_t smp_a_wwn[SAS_WWN_BYTE_SIZE]; /* expander wwn */
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne smp_hba_tran_t *smp_a_hba_tran; /* Transport vector */
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne} smp_address_t;
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Hornetypedef struct smp_device {
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne smp_address_t smp_sd_address;
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne dev_info_t *smp_sd_dev;
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne void *smp_sd_hba_private;
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne void *smp_sd_private;
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne} smp_device_t;
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Hornetypedef struct smp_pkt {
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne smp_address_t *smp_pkt_address;
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne caddr_t smp_pkt_req;
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne caddr_t smp_pkt_rsp;
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne size_t smp_pkt_reqsize;
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne size_t smp_pkt_rspsize;
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne int smp_pkt_timeout;
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne uchar_t smp_pkt_reason; /* code from errno.h */
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne uchar_t smp_pkt_will_retry; /* will retry on EAGAIN */
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne} smp_pkt_t;
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Hornestruct smp_hba_tran {
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne void *smp_tran_hba_private;
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne int (*smp_tran_init)(
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne dev_info_t *self,
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne dev_info_t *child,
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne smp_hba_tran_t *tran,
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne smp_device_t *smp);
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne void (*smp_tran_free)(
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne dev_info_t *self,
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne dev_info_t *child,
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne smp_hba_tran_t *tran,
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne smp_device_t *smp);
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne int (*smp_tran_start)(
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne struct smp_pkt *pkt);
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne};
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne/* interfaces for hba/iport driver */
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horneextern smp_hba_tran_t *smp_hba_tran_alloc(dev_info_t *dip);
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horneextern int smp_hba_attach_setup(dev_info_t *dip,
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne smp_hba_tran_t *smp);
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horneextern int smp_hba_detach(dev_info_t *self);
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horneextern void smp_hba_tran_free(smp_hba_tran_t *smp);
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne/* interfaces target driver (and framework) */
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horneextern int smp_probe(struct smp_device *smp_devp);
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horneextern int smp_transport(struct smp_pkt *pkt);
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne
499cfd156ad653fc27397c5f021047c091dd12c5David Hollister/* ==== The following interfaces are private (currently) ==== */
499cfd156ad653fc27397c5f021047c091dd12c5David Hollister
499cfd156ad653fc27397c5f021047c091dd12c5David Hollister/*
499cfd156ad653fc27397c5f021047c091dd12c5David Hollister * smp_device_prop_*() property interfaces: flags
499cfd156ad653fc27397c5f021047c091dd12c5David Hollister *
499cfd156ad653fc27397c5f021047c091dd12c5David Hollister * SMP_DEVICE_PROP_DEVICE: property of device.
499cfd156ad653fc27397c5f021047c091dd12c5David Hollister * The property is always associated with the smp_sd_dev devinfo
499cfd156ad653fc27397c5f021047c091dd12c5David Hollister * node. Implementation uses ndi_prop_*() interfaces applied
499cfd156ad653fc27397c5f021047c091dd12c5David Hollister * dev_info_t (smp_sd_dev) nodes.
499cfd156ad653fc27397c5f021047c091dd12c5David Hollister */
499cfd156ad653fc27397c5f021047c091dd12c5David Hollister#define SMP_DEVICE_PROP_DEVICE 0x2 /* type is property-of-device */
499cfd156ad653fc27397c5f021047c091dd12c5David Hollister#define SMP_DEVICE_PROP_TYPE_MSK 0xF
499cfd156ad653fc27397c5f021047c091dd12c5David Hollister
499cfd156ad653fc27397c5f021047c091dd12c5David Hollisterint smp_device_prop_get_int(struct smp_device *smp_sd, char *name,
499cfd156ad653fc27397c5f021047c091dd12c5David Hollister int defvalue);
499cfd156ad653fc27397c5f021047c091dd12c5David Hollisterint64_t smp_device_prop_get_int64(struct smp_device *, char *name,
499cfd156ad653fc27397c5f021047c091dd12c5David Hollister int64_t defvalue);
499cfd156ad653fc27397c5f021047c091dd12c5David Hollister
499cfd156ad653fc27397c5f021047c091dd12c5David Hollisterint smp_device_prop_lookup_byte_array(struct smp_device *smp_sd, char *name,
499cfd156ad653fc27397c5f021047c091dd12c5David Hollister uchar_t **, uint_t *);
499cfd156ad653fc27397c5f021047c091dd12c5David Hollisterint smp_device_prop_lookup_int_array(struct smp_device *smp_sd, char *name,
499cfd156ad653fc27397c5f021047c091dd12c5David Hollister int **, uint_t *);
499cfd156ad653fc27397c5f021047c091dd12c5David Hollisterint smp_device_prop_lookup_string(struct smp_device *smp_sd, char *name,
499cfd156ad653fc27397c5f021047c091dd12c5David Hollister char **);
499cfd156ad653fc27397c5f021047c091dd12c5David Hollisterint smp_device_prop_lookup_string_array(struct smp_device *smp_sd,
499cfd156ad653fc27397c5f021047c091dd12c5David Hollister char *name, char ***, uint_t *);
499cfd156ad653fc27397c5f021047c091dd12c5David Hollister
499cfd156ad653fc27397c5f021047c091dd12c5David Hollisterint smp_device_prop_update_byte_array(struct smp_device *smp_sd, char *name,
499cfd156ad653fc27397c5f021047c091dd12c5David Hollister uchar_t *, uint_t);
499cfd156ad653fc27397c5f021047c091dd12c5David Hollisterint smp_device_prop_update_int(struct smp_device *smp_sd, char *name, int);
499cfd156ad653fc27397c5f021047c091dd12c5David Hollisterint smp_device_prop_update_int64(struct smp_device *smp_sd, char *name,
499cfd156ad653fc27397c5f021047c091dd12c5David Hollister int64_t);
499cfd156ad653fc27397c5f021047c091dd12c5David Hollisterint smp_device_prop_update_int_array(struct smp_device *smp_sd, char *name,
499cfd156ad653fc27397c5f021047c091dd12c5David Hollister int *, uint_t);
499cfd156ad653fc27397c5f021047c091dd12c5David Hollisterint smp_device_prop_update_string(struct smp_device *smp_sd, char *name,
499cfd156ad653fc27397c5f021047c091dd12c5David Hollister char *);
499cfd156ad653fc27397c5f021047c091dd12c5David Hollisterint smp_device_prop_update_string_array(struct smp_device *smp_sd,
499cfd156ad653fc27397c5f021047c091dd12c5David Hollister char *name, char **, uint_t);
499cfd156ad653fc27397c5f021047c091dd12c5David Hollister
499cfd156ad653fc27397c5f021047c091dd12c5David Hollisterint smp_device_prop_remove(struct smp_device *smp_sd, char *name);
499cfd156ad653fc27397c5f021047c091dd12c5David Hollistervoid smp_device_prop_free(struct smp_device *smp_sd, void *data);
499cfd156ad653fc27397c5f021047c091dd12c5David Hollister
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne#endif /* defined(_KERNEL) */
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne#ifdef __cplusplus
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne}
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne#endif
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne
96c4a178a18cd52ee5001195f1552d9cef0c38f0Chris Horne#endif /* _SYS_SCSI_IMPL_SMP_TRANSPORT_H */