1229997Sken/*- 2229997Sken * Copyright (c) 2003 Silicon Graphics International Corp. 3229997Sken * All rights reserved. 4229997Sken * 5229997Sken * Redistribution and use in source and binary forms, with or without 6229997Sken * modification, are permitted provided that the following conditions 7229997Sken * are met: 8229997Sken * 1. Redistributions of source code must retain the above copyright 9229997Sken * notice, this list of conditions, and the following disclaimer, 10229997Sken * without modification. 11229997Sken * 2. Redistributions in binary form must reproduce at minimum a disclaimer 12229997Sken * substantially similar to the "NO WARRANTY" disclaimer below 13229997Sken * ("Disclaimer") and any redistribution must be conditioned upon 14229997Sken * including a substantially similar Disclaimer requirement for further 15229997Sken * binary redistribution. 16229997Sken * 17229997Sken * NO WARRANTY 18229997Sken * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19229997Sken * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20229997Sken * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 21229997Sken * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22229997Sken * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23229997Sken * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24229997Sken * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25229997Sken * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 26229997Sken * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 27229997Sken * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28229997Sken * POSSIBILITY OF SUCH DAMAGES. 29229997Sken * 30229997Sken * $Id: //depot/users/kenm/FreeBSD-test2/sys/cam/ctl/ctl.h#5 $ 31229997Sken * $FreeBSD: releng/11.0/sys/cam/ctl/ctl.h 289881 2015-10-24 17:24:19Z mav $ 32229997Sken */ 33229997Sken/* 34229997Sken * Function definitions used both within CTL and potentially in various CTL 35229997Sken * clients. 36229997Sken * 37229997Sken * Author: Ken Merry <ken@FreeBSD.org> 38229997Sken */ 39229997Sken 40229997Sken#ifndef _CTL_H_ 41229997Sken#define _CTL_H_ 42229997Sken 43229997Sken#define CTL_RETVAL_COMPLETE 0 44229997Sken#define CTL_RETVAL_QUEUED 1 45229997Sken#define CTL_RETVAL_ALLOCATED 2 46229997Sken#define CTL_RETVAL_ERROR 3 47229997Sken 48229997Skentypedef enum { 49229997Sken CTL_PORT_NONE = 0x00, 50229997Sken CTL_PORT_FC = 0x01, 51229997Sken CTL_PORT_SCSI = 0x02, 52229997Sken CTL_PORT_IOCTL = 0x04, 53229997Sken CTL_PORT_INTERNAL = 0x08, 54254759Strasz CTL_PORT_ISCSI = 0x10, 55268363Smav CTL_PORT_SAS = 0x20, 56229997Sken CTL_PORT_ALL = 0xff, 57229997Sken CTL_PORT_ISC = 0x100 // FC port for inter-shelf communication 58229997Sken} ctl_port_type; 59229997Sken 60229997Skenstruct ctl_port_entry { 61229997Sken ctl_port_type port_type; 62229997Sken char port_name[64]; 63229997Sken int32_t targ_port; 64229997Sken int physical_port; 65229997Sken int virtual_port; 66229997Sken u_int flags; 67229997Sken#define CTL_PORT_WWNN_VALID 0x01 68229997Sken#define CTL_PORT_WWPN_VALID 0x02 69229997Sken uint64_t wwnn; 70229997Sken uint64_t wwpn; 71229997Sken int online; 72229997Sken}; 73229997Sken 74229997Skenstruct ctl_modepage_header { 75229997Sken uint8_t page_code; 76229997Sken uint8_t subpage; 77229997Sken int32_t len_used; 78229997Sken int32_t len_left; 79229997Sken}; 80229997Sken 81229997Skenstruct ctl_modepage_aps { 82229997Sken struct ctl_modepage_header header; 83229997Sken uint8_t lock_active; 84229997Sken}; 85229997Sken 86229997Skenunion ctl_modepage_info { 87229997Sken struct ctl_modepage_header header; 88229997Sken struct ctl_modepage_aps aps; 89229997Sken}; 90229997Sken 91229997Sken/* 92229997Sken * Serial number length, for VPD page 0x80. 93229997Sken */ 94229997Sken#define CTL_SN_LEN 16 95229997Sken 96229997Sken/* 97229997Sken * Device ID length, for VPD page 0x83. 98229997Sken */ 99267639Smav#define CTL_DEVID_LEN 64 100267639Smav#define CTL_DEVID_MIN_LEN 16 101229997Sken/* 102229997Sken * WWPN length, for VPD page 0x83. 103229997Sken */ 104229997Sken#define CTL_WWPN_LEN 8 105229997Sken 106268291Smav#define CTL_DRIVER_NAME_LEN 32 107268291Smav 108229997Sken/* 109229997Sken * Unit attention types. ASC/ASCQ values for these should be placed in 110229997Sken * ctl_build_ua. These are also listed in order of reporting priority. 111229997Sken * i.e. a poweron UA is reported first, bus reset second, etc. 112229997Sken */ 113229997Skentypedef enum { 114229997Sken CTL_UA_NONE = 0x0000, 115229997Sken CTL_UA_POWERON = 0x0001, 116229997Sken CTL_UA_BUS_RESET = 0x0002, 117229997Sken CTL_UA_TARG_RESET = 0x0004, 118268353Smav CTL_UA_I_T_NEXUS_LOSS = 0x0008, 119268353Smav CTL_UA_LUN_RESET = 0x0010, 120268353Smav CTL_UA_LUN_CHANGE = 0x0020, 121272040Smav CTL_UA_MODE_CHANGE = 0x0040, 122268353Smav CTL_UA_LOG_CHANGE = 0x0080, 123287756Smav CTL_UA_INQ_CHANGE = 0x0100, 124268353Smav CTL_UA_RES_PREEMPT = 0x0400, 125268353Smav CTL_UA_RES_RELEASE = 0x0800, 126288348Smav CTL_UA_REG_PREEMPT = 0x1000, 127288348Smav CTL_UA_ASYM_ACC_CHANGE = 0x2000, 128288348Smav CTL_UA_CAPACITY_CHANGE = 0x4000, 129288348Smav CTL_UA_THIN_PROV_THRES = 0x8000, 130288348Smav CTL_UA_MEDIUM_CHANGE = 0x10000 131229997Sken} ctl_ua_type; 132229997Sken 133229997Sken#ifdef _KERNEL 134229997Sken 135229997SkenMALLOC_DECLARE(M_CTL); 136229997Sken 137229997Skenstruct ctl_page_index; 138229997Sken 139229997Sken#ifdef SYSCTL_DECL /* from sysctl.h */ 140229997SkenSYSCTL_DECL(_kern_cam_ctl); 141229997Sken#endif 142229997Sken 143287756Smavstruct ctl_lun; 144287756Smavstruct ctl_port; 145287756Smavstruct ctl_softc; 146287756Smav 147229997Sken/* 148229997Sken * Put a string into an sbuf, escaping characters that are illegal or not 149229997Sken * recommended in XML. Note this doesn't escape everything, just > < and &. 150229997Sken */ 151273693Smavint ctl_sbuf_printf_esc(struct sbuf *sb, char *str, int size); 152229997Sken 153287621Smavint ctl_ffz(uint32_t *mask, uint32_t first, uint32_t last); 154229997Skenint ctl_set_mask(uint32_t *mask, uint32_t bit); 155229997Skenint ctl_clear_mask(uint32_t *mask, uint32_t bit); 156229997Skenint ctl_is_set(uint32_t *mask, uint32_t bit); 157271309Smavint ctl_caching_sp_handler(struct ctl_scsiio *ctsio, 158271309Smav struct ctl_page_index *page_index, uint8_t *page_ptr); 159229997Skenint ctl_control_page_handler(struct ctl_scsiio *ctsio, 160229997Sken struct ctl_page_index *page_index, 161229997Sken uint8_t *page_ptr); 162229997Skenint ctl_debugconf_sp_sense_handler(struct ctl_scsiio *ctsio, 163229997Sken struct ctl_page_index *page_index, 164229997Sken int pc); 165229997Skenint ctl_debugconf_sp_select_handler(struct ctl_scsiio *ctsio, 166229997Sken struct ctl_page_index *page_index, 167229997Sken uint8_t *page_ptr); 168274154Smavint ctl_lbp_log_sense_handler(struct ctl_scsiio *ctsio, 169274154Smav struct ctl_page_index *page_index, 170274154Smav int pc); 171278584Smavint ctl_sap_log_sense_handler(struct ctl_scsiio *ctsio, 172278584Smav struct ctl_page_index *page_index, 173278584Smav int pc); 174229997Skenint ctl_config_move_done(union ctl_io *io); 175229997Skenvoid ctl_datamove(union ctl_io *io); 176287967Smavvoid ctl_serseq_done(union ctl_io *io); 177229997Skenvoid ctl_done(union ctl_io *io); 178267537Smavvoid ctl_data_submit_done(union ctl_io *io); 179275474Smavvoid ctl_config_read_done(union ctl_io *io); 180229997Skenvoid ctl_config_write_done(union ctl_io *io); 181229997Skenvoid ctl_portDB_changed(int portnum); 182286807Smavint ctl_ioctl_io(struct cdev *dev, u_long cmd, caddr_t addr, int flag, 183286807Smav struct thread *td); 184287756Smav 185287756Smavvoid ctl_est_ua(struct ctl_lun *lun, uint32_t initidx, ctl_ua_type ua); 186287756Smavvoid ctl_est_ua_port(struct ctl_lun *lun, int port, uint32_t except, 187287756Smav ctl_ua_type ua); 188287756Smavvoid ctl_est_ua_all(struct ctl_lun *lun, uint32_t except, ctl_ua_type ua); 189287756Smavvoid ctl_clr_ua(struct ctl_lun *lun, uint32_t initidx, ctl_ua_type ua); 190287756Smavvoid ctl_clr_ua_all(struct ctl_lun *lun, uint32_t except, ctl_ua_type ua); 191287756Smavvoid ctl_clr_ua_allluns(struct ctl_softc *ctl_softc, uint32_t initidx, 192287756Smav ctl_ua_type ua_type); 193287756Smav 194289881Smavuint32_t ctl_decode_lun(uint64_t encoded); 195289881Smavuint64_t ctl_encode_lun(uint32_t decoded); 196289881Smav 197287621Smavvoid ctl_isc_announce_lun(struct ctl_lun *lun); 198287621Smavvoid ctl_isc_announce_port(struct ctl_port *port); 199287940Smavvoid ctl_isc_announce_iid(struct ctl_port *port, int iid); 200288148Smavvoid ctl_isc_announce_mode(struct ctl_lun *lun, uint32_t initidx, 201288148Smav uint8_t page, uint8_t subpage); 202229997Sken 203268280Smav/* 204268280Smav * KPI to manipulate LUN/port options 205268280Smav */ 206268280Smav 207268280Smavstruct ctl_option { 208268280Smav STAILQ_ENTRY(ctl_option) links; 209268280Smav char *name; 210268280Smav char *value; 211268280Smav}; 212268280Smavtypedef STAILQ_HEAD(ctl_options, ctl_option) ctl_options_t; 213268280Smav 214268280Smavstruct ctl_be_arg; 215268280Smavvoid ctl_init_opts(ctl_options_t *opts, int num_args, struct ctl_be_arg *args); 216287500Smavvoid ctl_update_opts(ctl_options_t *opts, int num_args, 217287500Smav struct ctl_be_arg *args); 218268280Smavvoid ctl_free_opts(ctl_options_t *opts); 219268280Smavchar * ctl_get_opt(ctl_options_t *opts, const char *name); 220275865Smavint ctl_expand_number(const char *buf, uint64_t *num); 221268280Smav 222229997Sken#endif /* _KERNEL */ 223229997Sken 224229997Sken#endif /* _CTL_H_ */ 225229997Sken 226229997Sken/* 227229997Sken * vim: ts=8 228229997Sken */ 229