1*ef270ab1SKenneth D. Merry /*- 2*ef270ab1SKenneth D. Merry * Copyright (c) 2017 Broadcom. All rights reserved. 3*ef270ab1SKenneth D. Merry * The term "Broadcom" refers to Broadcom Limited and/or its subsidiaries. 4*ef270ab1SKenneth D. Merry * 5*ef270ab1SKenneth D. Merry * Redistribution and use in source and binary forms, with or without 6*ef270ab1SKenneth D. Merry * modification, are permitted provided that the following conditions are met: 7*ef270ab1SKenneth D. Merry * 8*ef270ab1SKenneth D. Merry * 1. Redistributions of source code must retain the above copyright notice, 9*ef270ab1SKenneth D. Merry * this list of conditions and the following disclaimer. 10*ef270ab1SKenneth D. Merry * 11*ef270ab1SKenneth D. Merry * 2. Redistributions in binary form must reproduce the above copyright notice, 12*ef270ab1SKenneth D. Merry * this list of conditions and the following disclaimer in the documentation 13*ef270ab1SKenneth D. Merry * and/or other materials provided with the distribution. 14*ef270ab1SKenneth D. Merry * 15*ef270ab1SKenneth D. Merry * 3. Neither the name of the copyright holder nor the names of its contributors 16*ef270ab1SKenneth D. Merry * may be used to endorse or promote products derived from this software 17*ef270ab1SKenneth D. Merry * without specific prior written permission. 18*ef270ab1SKenneth D. Merry * 19*ef270ab1SKenneth D. Merry * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20*ef270ab1SKenneth D. Merry * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21*ef270ab1SKenneth D. Merry * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22*ef270ab1SKenneth D. Merry * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 23*ef270ab1SKenneth D. Merry * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24*ef270ab1SKenneth D. Merry * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25*ef270ab1SKenneth D. Merry * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26*ef270ab1SKenneth D. Merry * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27*ef270ab1SKenneth D. Merry * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28*ef270ab1SKenneth D. Merry * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29*ef270ab1SKenneth D. Merry * POSSIBILITY OF SUCH DAMAGE. 30*ef270ab1SKenneth D. Merry * 31*ef270ab1SKenneth D. Merry * $FreeBSD$ 32*ef270ab1SKenneth D. Merry */ 33*ef270ab1SKenneth D. Merry 34*ef270ab1SKenneth D. Merry /** 35*ef270ab1SKenneth D. Merry * @file 36*ef270ab1SKenneth D. Merry * Common declartaions for the driver's IOCTL interface 37*ef270ab1SKenneth D. Merry */ 38*ef270ab1SKenneth D. Merry 39*ef270ab1SKenneth D. Merry #if !defined(__OCS_IOCTL_H__) 40*ef270ab1SKenneth D. Merry #define __OCS_IOCTL_H__ 41*ef270ab1SKenneth D. Merry 42*ef270ab1SKenneth D. Merry /** 43*ef270ab1SKenneth D. Merry * @brief OCS test ioctl 44*ef270ab1SKenneth D. Merry * 45*ef270ab1SKenneth D. Merry * Simple structure for testing the IOCTL interface 46*ef270ab1SKenneth D. Merry */ 47*ef270ab1SKenneth D. Merry 48*ef270ab1SKenneth D. Merry typedef struct { 49*ef270ab1SKenneth D. Merry char string[32]; /**< fixed string buffer */ 50*ef270ab1SKenneth D. Merry } ocs_ioctl_test_t; 51*ef270ab1SKenneth D. Merry 52*ef270ab1SKenneth D. Merry /** 53*ef270ab1SKenneth D. Merry * @brief DRIVER_INFO ioctl structure 54*ef270ab1SKenneth D. Merry * 55*ef270ab1SKenneth D. Merry * Structure is returned whtn the OCS_IOCTL_CMD_DRIVER_INFO is issued by a user space program. 56*ef270ab1SKenneth D. Merry */ 57*ef270ab1SKenneth D. Merry 58*ef270ab1SKenneth D. Merry typedef struct { 59*ef270ab1SKenneth D. Merry uint16_t pci_vendor; /**< PCI vender ID value (binary) */ 60*ef270ab1SKenneth D. Merry uint16_t pci_device; /**< PCI device ID value (binary) */ 61*ef270ab1SKenneth D. Merry char businfo[16]; /**< Bus information (text) */ 62*ef270ab1SKenneth D. Merry uint32_t sli_intf; /**< SLI_INTF register value (binary) */ 63*ef270ab1SKenneth D. Merry char desc[64]; /**< description (text) */ 64*ef270ab1SKenneth D. Merry char fw_rev[32]; /**< firmware revision (text) */ 65*ef270ab1SKenneth D. Merry union { 66*ef270ab1SKenneth D. Merry struct { 67*ef270ab1SKenneth D. Merry uint8_t wwnn[8]; /**< WWNN (binary) */ 68*ef270ab1SKenneth D. Merry uint8_t wwpn[8]; /**< WWPN (binary) */ 69*ef270ab1SKenneth D. Merry } fc; 70*ef270ab1SKenneth D. Merry struct { 71*ef270ab1SKenneth D. Merry uint8_t mac_addr[6]; /**< MAC address (binary) */ 72*ef270ab1SKenneth D. Merry uint8_t reserved[10]; 73*ef270ab1SKenneth D. Merry } iscsi; 74*ef270ab1SKenneth D. Merry } hw_addr; 75*ef270ab1SKenneth D. Merry char serialnum[32]; /**< board serial number (text) */ 76*ef270ab1SKenneth D. Merry } ocs_ioctl_driver_info_t; 77*ef270ab1SKenneth D. Merry 78*ef270ab1SKenneth D. Merry #define ELXU_BSD_MAGIC 0x30584c45 79*ef270ab1SKenneth D. Merry 80*ef270ab1SKenneth D. Merry /** 81*ef270ab1SKenneth D. Merry * @brief IOCTL_CMD_IOCTL_ELXU_MBOX ioctl structure 82*ef270ab1SKenneth D. Merry * 83*ef270ab1SKenneth D. Merry * Structure used to submit elxsdkutil mailbox requests for firmware download and 84*ef270ab1SKenneth D. Merry * dump file retrieveal. 85*ef270ab1SKenneth D. Merry */ 86*ef270ab1SKenneth D. Merry 87*ef270ab1SKenneth D. Merry typedef struct { 88*ef270ab1SKenneth D. Merry uint32_t magic; /**< magic number */ 89*ef270ab1SKenneth D. Merry uint32_t size; /**< size of MBX command */ 90*ef270ab1SKenneth D. Merry uint8_t payload[256]; /**< MBX command in/out payload buffer */ 91*ef270ab1SKenneth D. Merry uint64_t in_addr; /**< user space address of input buffer */ 92*ef270ab1SKenneth D. Merry uint64_t in_bytes; /**< length of user space input buffer in bytes */ 93*ef270ab1SKenneth D. Merry uint64_t out_addr; /**< user space address of output buffer */ 94*ef270ab1SKenneth D. Merry uint64_t out_bytes; /**< length of user space output buffer in bytes */ 95*ef270ab1SKenneth D. Merry } ocs_ioctl_elxu_mbox_t; 96*ef270ab1SKenneth D. Merry 97*ef270ab1SKenneth D. Merry enum { 98*ef270ab1SKenneth D. Merry ocs_ioctl_scsi_cmd_loop, /**< Start command loop */ 99*ef270ab1SKenneth D. Merry ocs_ioctl_scsi_cmd_loop_wait, /**< Start command loop and wait for completion */ 100*ef270ab1SKenneth D. Merry ocs_ioctl_scsi_cmd_stop, /**< Stop command loop */ 101*ef270ab1SKenneth D. Merry ocs_ioctl_scsi_cmd, /**< Start one command */ 102*ef270ab1SKenneth D. Merry ocs_ioctl_scsi_cmd_wait, /**< Wait for a command to complete */ 103*ef270ab1SKenneth D. Merry ocs_ioctl_scsi_cmd_abort, /**< Start an abort */ 104*ef270ab1SKenneth D. Merry ocs_ioctl_scsi_cmd_tmf, /**< Start a tmf */ 105*ef270ab1SKenneth D. Merry ocs_ioctl_els_send, /**< Start an ELS */ 106*ef270ab1SKenneth D. Merry ocs_ioctl_tgt_logout, /**< logout of a target */ 107*ef270ab1SKenneth D. Merry ocs_ioctl_scsi_cmd_wait_any, /**< Wait for any command to complete */ 108*ef270ab1SKenneth D. Merry }; 109*ef270ab1SKenneth D. Merry 110*ef270ab1SKenneth D. Merry enum { 111*ef270ab1SKenneth D. Merry ocs_ioctl_scsi_cmd_rd = (1U << 0), /**< direction is read */ 112*ef270ab1SKenneth D. Merry ocs_ioctl_scsi_cmd_wr = (1U << 1), /**< direction is write */ 113*ef270ab1SKenneth D. Merry }; 114*ef270ab1SKenneth D. Merry 115*ef270ab1SKenneth D. Merry /** 116*ef270ab1SKenneth D. Merry * @brief OCS_IOCTL_CMD_SCSI_CMD ioctl command structure 117*ef270ab1SKenneth D. Merry */ 118*ef270ab1SKenneth D. Merry 119*ef270ab1SKenneth D. Merry typedef enum { 120*ef270ab1SKenneth D. Merry DIF_OP_DISABLE = 0, 121*ef270ab1SKenneth D. Merry DIF_OP_IN_NODIF_OUT_CRC, 122*ef270ab1SKenneth D. Merry DIF_OP_IN_CRC_OUT_NODIF, 123*ef270ab1SKenneth D. Merry DIF_OP_IN_NODIF_OUT_CHKSUM, 124*ef270ab1SKenneth D. Merry DIF_OP_IN_CHKSUM_OUT_NODIF, 125*ef270ab1SKenneth D. Merry DIF_OP_IN_CRC_OUT_CRC, 126*ef270ab1SKenneth D. Merry DIF_OP_IN_CHKSUM_OUT_CHKSUM, 127*ef270ab1SKenneth D. Merry DIF_OP_IN_CRC_OUT_CHKSUM, 128*ef270ab1SKenneth D. Merry DIF_OP_IN_CHKSUM_OUT_CRC, 129*ef270ab1SKenneth D. Merry DIF_OP_IN_RAW_OUT_RAW, 130*ef270ab1SKenneth D. Merry } dif_op_t; 131*ef270ab1SKenneth D. Merry 132*ef270ab1SKenneth D. Merry #define DIF_OP_PASS_THRU DIF_OP_IN_CRC_OUT_CRC 133*ef270ab1SKenneth D. Merry #define DIF_OP_STRIP DIF_OP_IN_CRC_OUT_NODIF 134*ef270ab1SKenneth D. Merry #define DIF_OP_INSERT DIF_OP_IN_NODIF_OUT_CRC 135*ef270ab1SKenneth D. Merry 136*ef270ab1SKenneth D. Merry typedef struct { 137*ef270ab1SKenneth D. Merry dif_op_t dif_op; 138*ef270ab1SKenneth D. Merry uint32_t 139*ef270ab1SKenneth D. Merry check_ref_tag:1, /* check reference tag on initiator writes */ 140*ef270ab1SKenneth D. Merry check_app_tag:1, /* check application tag on initiator writes */ 141*ef270ab1SKenneth D. Merry check_guard:1, /* check CRC on initiator writes */ 142*ef270ab1SKenneth D. Merry dif_separate:1; /* use DIF separate transfers */ 143*ef270ab1SKenneth D. Merry uint32_t ref_tag; /* DIF reference tag */ 144*ef270ab1SKenneth D. Merry uint16_t app_tag; /* DIF application tag */ 145*ef270ab1SKenneth D. Merry uint32_t blocksize; /* DIF blocksize */ 146*ef270ab1SKenneth D. Merry } dif_info_t; 147*ef270ab1SKenneth D. Merry 148*ef270ab1SKenneth D. Merry typedef struct { 149*ef270ab1SKenneth D. Merry int command; /**< SCSI command request command */ 150*ef270ab1SKenneth D. Merry uint32_t target_idx; /**< Target device index */ 151*ef270ab1SKenneth D. Merry uint32_t dir; /**< rd or wr */ 152*ef270ab1SKenneth D. Merry uint32_t lun; /**< lun value */ 153*ef270ab1SKenneth D. Merry int32_t tmf; /**< TMF */ 154*ef270ab1SKenneth D. Merry uint8_t cdb[32]; /**< SCSI CDB */ 155*ef270ab1SKenneth D. Merry uint32_t cdb_len; /**< SCSI CDB length in bytes */ 156*ef270ab1SKenneth D. Merry uint32_t els_cmd; /**< ELS command */ 157*ef270ab1SKenneth D. Merry uint32_t flags; /**< command flags */ 158*ef270ab1SKenneth D. Merry uint32_t queue_depth; /**< queue depth for command looping */ 159*ef270ab1SKenneth D. Merry uint32_t payload_length; /**< payload length for command */ 160*ef270ab1SKenneth D. Merry uint32_t dif_payload_length; /**< DIF payload length for command if separate */ 161*ef270ab1SKenneth D. Merry uint32_t io_count; /**< command count for looping */ 162*ef270ab1SKenneth D. Merry uint32_t io_timeout; /**< IO timeout in seconds (0 = no timeout) */ 163*ef270ab1SKenneth D. Merry 164*ef270ab1SKenneth D. Merry uint32_t directio; /**< If set, DMA to and from user buffers */ 165*ef270ab1SKenneth D. Merry 166*ef270ab1SKenneth D. Merry uint32_t first_burst:1; /**< If true send IO writes with first burst */ 167*ef270ab1SKenneth D. Merry uint32_t first_burst_size; /**< If first burst is enabled, then this size */ 168*ef270ab1SKenneth D. Merry 169*ef270ab1SKenneth D. Merry int32_t wait_timeout_usec; /**< Wait timeout (usec) for wait, wait_any */ 170*ef270ab1SKenneth D. Merry 171*ef270ab1SKenneth D. Merry /* T10-PI */ 172*ef270ab1SKenneth D. Merry dif_info_t dif; /* DIF info */ 173*ef270ab1SKenneth D. Merry 174*ef270ab1SKenneth D. Merry /* user space buffers */ 175*ef270ab1SKenneth D. Merry void *payload; /**< pointer to user space payload buffer */ 176*ef270ab1SKenneth D. Merry void *dif_payload; /**< pointer to DIF block data if separate */ 177*ef270ab1SKenneth D. Merry uint8_t scsi_status; /**< SCSI status */ 178*ef270ab1SKenneth D. Merry uint16_t scsi_status_qualifier; /**< SCSI status qualifier */ 179*ef270ab1SKenneth D. Merry void *sense_data; /**< pointer to sense data buffer */ 180*ef270ab1SKenneth D. Merry uint32_t sense_data_length; /**< length of sense data buffer (call=buffer leng, return=data written) */ 181*ef270ab1SKenneth D. Merry int32_t residual; /**< residual */ 182*ef270ab1SKenneth D. Merry uint32_t tag_to_abort; /**< tag to abort for an abort task request */ 183*ef270ab1SKenneth D. Merry 184*ef270ab1SKenneth D. Merry /* return value */ 185*ef270ab1SKenneth D. Merry int32_t status; /**< returned status */ 186*ef270ab1SKenneth D. Merry uint32_t data_transferred; /**< updated with data transferred */ 187*ef270ab1SKenneth D. Merry uint32_t tag; /**< returned unique I/O context tag */ 188*ef270ab1SKenneth D. Merry 189*ef270ab1SKenneth D. Merry /* for scsi loop */ 190*ef270ab1SKenneth D. Merry uint32_t submit_count; /**< count of submitted IOs */ 191*ef270ab1SKenneth D. Merry uint32_t complete_count; /**< count of completed IOs */ 192*ef270ab1SKenneth D. Merry } ocs_ioctl_scsi_cmd_t; 193*ef270ab1SKenneth D. Merry 194*ef270ab1SKenneth D. Merry /** 195*ef270ab1SKenneth D. Merry * @brief coredump helper function command values 196*ef270ab1SKenneth D. Merry */ 197*ef270ab1SKenneth D. Merry 198*ef270ab1SKenneth D. Merry typedef enum { 199*ef270ab1SKenneth D. Merry OCS_ECD_HELPER_CFG_READ8, 200*ef270ab1SKenneth D. Merry OCS_ECD_HELPER_CFG_READ16, 201*ef270ab1SKenneth D. Merry OCS_ECD_HELPER_CFG_READ32, 202*ef270ab1SKenneth D. Merry OCS_ECD_HELPER_CFG_WRITE8, 203*ef270ab1SKenneth D. Merry OCS_ECD_HELPER_CFG_WRITE16, 204*ef270ab1SKenneth D. Merry OCS_ECD_HELPER_CFG_WRITE32, 205*ef270ab1SKenneth D. Merry OCS_ECD_HELPER_BAR_READ8, 206*ef270ab1SKenneth D. Merry OCS_ECD_HELPER_BAR_READ16, 207*ef270ab1SKenneth D. Merry OCS_ECD_HELPER_BAR_READ32, 208*ef270ab1SKenneth D. Merry OCS_ECD_HELPER_BAR_WRITE8, 209*ef270ab1SKenneth D. Merry OCS_ECD_HELPER_BAR_WRITE16, 210*ef270ab1SKenneth D. Merry OCS_ECD_HELPER_BAR_WRITE32, 211*ef270ab1SKenneth D. Merry } ocs_ecd_helper_cmd_t; 212*ef270ab1SKenneth D. Merry 213*ef270ab1SKenneth D. Merry /** 214*ef270ab1SKenneth D. Merry * @brief OCS_IOCTL_CMD_ECD_HELPER ioctl structure 215*ef270ab1SKenneth D. Merry */ 216*ef270ab1SKenneth D. Merry 217*ef270ab1SKenneth D. Merry typedef struct { 218*ef270ab1SKenneth D. Merry ocs_ecd_helper_cmd_t cmd; /*<< coredump helper function command */ 219*ef270ab1SKenneth D. Merry uint32_t bar; /*<< BAR value to use */ 220*ef270ab1SKenneth D. Merry uint32_t offset; /*<< offset value to use */ 221*ef270ab1SKenneth D. Merry uint32_t data; /*<< 32 bit data value to write or return read data in */ 222*ef270ab1SKenneth D. Merry int status; /*<< status of helper function request */ 223*ef270ab1SKenneth D. Merry } ocs_ioctl_ecd_helper_t; 224*ef270ab1SKenneth D. Merry 225*ef270ab1SKenneth D. Merry /** 226*ef270ab1SKenneth D. Merry * @brief OCS_IOCTL_CMD_VPORT ioctl structure 227*ef270ab1SKenneth D. Merry */ 228*ef270ab1SKenneth D. Merry 229*ef270ab1SKenneth D. Merry typedef struct { 230*ef270ab1SKenneth D. Merry uint32_t domain_index; /*<< domain instance index */ 231*ef270ab1SKenneth D. Merry uint32_t req_create:1, /*<< 1 = create vport, zero = remove vport */ 232*ef270ab1SKenneth D. Merry enable_ini:1, /*<< 1 = enable vport as an initiator */ 233*ef270ab1SKenneth D. Merry enable_tgt:1; /*<< 1 = enable vport as a target */ 234*ef270ab1SKenneth D. Merry uint64_t wwpn; /*<< wwpn to create or delete */ 235*ef270ab1SKenneth D. Merry uint64_t wwnn; /*<< wwnn to create or delete */ 236*ef270ab1SKenneth D. Merry int status; /*<< status of helper function request */ 237*ef270ab1SKenneth D. Merry } ocs_ioctl_vport_t; 238*ef270ab1SKenneth D. Merry 239*ef270ab1SKenneth D. Merry /** 240*ef270ab1SKenneth D. Merry * @brief connection info ioctl structure 241*ef270ab1SKenneth D. Merry * 242*ef270ab1SKenneth D. Merry * Structure is returned when the OCS_IOCTL_CMD_CONNECTION_INFO is issued by a user space program. 243*ef270ab1SKenneth D. Merry */ 244*ef270ab1SKenneth D. Merry typedef struct { 245*ef270ab1SKenneth D. Merry uint32_t connection_handle; 246*ef270ab1SKenneth D. Merry uint16_t connection_id; 247*ef270ab1SKenneth D. Merry uint8_t source_ip_type; 248*ef270ab1SKenneth D. Merry uint8_t source_ip[16]; 249*ef270ab1SKenneth D. Merry uint16_t source_port; 250*ef270ab1SKenneth D. Merry uint8_t dest_ip_type; 251*ef270ab1SKenneth D. Merry uint8_t dest_ip[16]; 252*ef270ab1SKenneth D. Merry uint16_t dest_port; 253*ef270ab1SKenneth D. Merry } ocs_ioctl_connection_info_t; 254*ef270ab1SKenneth D. Merry 255*ef270ab1SKenneth D. Merry typedef struct { 256*ef270ab1SKenneth D. Merry uint32_t max_connections; 257*ef270ab1SKenneth D. Merry uint32_t num_connections; 258*ef270ab1SKenneth D. Merry ocs_ioctl_connection_info_t *connections; 259*ef270ab1SKenneth D. Merry } ocs_ioctl_connections_t; 260*ef270ab1SKenneth D. Merry 261*ef270ab1SKenneth D. Merry /** 262*ef270ab1SKenneth D. Merry * @brief driver-dump actions 263*ef270ab1SKenneth D. Merry */ 264*ef270ab1SKenneth D. Merry 265*ef270ab1SKenneth D. Merry typedef enum { 266*ef270ab1SKenneth D. Merry OCS_IOCTL_DDUMP_GET, 267*ef270ab1SKenneth D. Merry OCS_IOCTL_DDUMP_GET_SAVED, 268*ef270ab1SKenneth D. Merry OCS_IOCTL_DDUMP_CLR_SAVED, 269*ef270ab1SKenneth D. Merry } ocs_ddump_action_t; 270*ef270ab1SKenneth D. Merry 271*ef270ab1SKenneth D. Merry #define OCS_IOCTL_DDUMP_FLAGS_WQES (1U << 0) 272*ef270ab1SKenneth D. Merry #define OCS_IOCTL_DDUMP_FLAGS_CQES (1U << 1) 273*ef270ab1SKenneth D. Merry #define OCS_IOCTL_DDUMP_FLAGS_MQES (1U << 2) 274*ef270ab1SKenneth D. Merry #define OCS_IOCTL_DDUMP_FLAGS_RQES (1U << 3) 275*ef270ab1SKenneth D. Merry #define OCS_IOCTL_DDUMP_FLAGS_EQES (1U << 4) 276*ef270ab1SKenneth D. Merry 277*ef270ab1SKenneth D. Merry typedef struct { 278*ef270ab1SKenneth D. Merry ocs_ddump_action_t action; 279*ef270ab1SKenneth D. Merry uint32_t flags; 280*ef270ab1SKenneth D. Merry uint32_t q_entries; 281*ef270ab1SKenneth D. Merry } ocs_ioctl_ddump_arg_t; 282*ef270ab1SKenneth D. Merry 283*ef270ab1SKenneth D. Merry /** 284*ef270ab1SKenneth D. Merry * @brief OCS_CTL_CMD_GET_DDUMP ioctl structure 285*ef270ab1SKenneth D. Merry */ 286*ef270ab1SKenneth D. Merry 287*ef270ab1SKenneth D. Merry typedef struct { 288*ef270ab1SKenneth D. Merry ocs_ioctl_ddump_arg_t args; /*<< arguments for ddump */ 289*ef270ab1SKenneth D. Merry uint8_t *user_buffer; /*<< pointer to user space buffer */ 290*ef270ab1SKenneth D. Merry uint32_t user_buffer_len; /*<< length in bytes of user space buffer */ 291*ef270ab1SKenneth D. Merry uint32_t bytes_written; /*<< number of bytes written */ 292*ef270ab1SKenneth D. Merry } ocs_ioctl_ddump_t; 293*ef270ab1SKenneth D. Merry 294*ef270ab1SKenneth D. Merry /** 295*ef270ab1SKenneth D. Merry * @brief OCS_CTL_CMD_GET_STATUS, OCS_CTL_CMD_GET_CONFIG 296*ef270ab1SKenneth D. Merry */ 297*ef270ab1SKenneth D. Merry 298*ef270ab1SKenneth D. Merry typedef struct { 299*ef270ab1SKenneth D. Merry uint8_t *user_buffer; /*<< pointer to user space buffer */ 300*ef270ab1SKenneth D. Merry uint32_t user_buffer_len; /*<< length in bytes of user space buffer */ 301*ef270ab1SKenneth D. Merry uint32_t bytes_written; /*<< number of bytes written */ 302*ef270ab1SKenneth D. Merry } ocs_ioctl_mgmt_buffer_t; 303*ef270ab1SKenneth D. Merry 304*ef270ab1SKenneth D. Merry typedef struct { 305*ef270ab1SKenneth D. Merry uint8_t *name; /*<< Input: name of property to retrieve */ 306*ef270ab1SKenneth D. Merry uint8_t *value; /*<< Output: user space buffer in which to place the response */ 307*ef270ab1SKenneth D. Merry uint32_t value_length; /*<< Input: size of the user space buffer */ 308*ef270ab1SKenneth D. Merry } ocs_ioctl_cmd_get_t; 309*ef270ab1SKenneth D. Merry 310*ef270ab1SKenneth D. Merry typedef struct { 311*ef270ab1SKenneth D. Merry uint8_t *name; /*<< Input: name of property to set */ 312*ef270ab1SKenneth D. Merry uint8_t *value; /*<< Input: user space buffer which contains the new value */ 313*ef270ab1SKenneth D. Merry int32_t result; /*<< Output: result */ 314*ef270ab1SKenneth D. Merry } ocs_ioctl_cmd_set_t; 315*ef270ab1SKenneth D. Merry 316*ef270ab1SKenneth D. Merry typedef struct { 317*ef270ab1SKenneth D. Merry uint8_t *name; /*<< Input: name of action to execute */ 318*ef270ab1SKenneth D. Merry void *arg_in; /*<< Input: pointer to argument in user space */ 319*ef270ab1SKenneth D. Merry uint32_t arg_in_length; /*<< Input: size of arg_in in bytes */ 320*ef270ab1SKenneth D. Merry void *arg_out; /*<< Output: pointer to argument from kernel to user */ 321*ef270ab1SKenneth D. Merry uint32_t arg_out_length; /*<< Input: size of arg_out in bytes */ 322*ef270ab1SKenneth D. Merry int32_t result; /*<< Output: result */ 323*ef270ab1SKenneth D. Merry } ocs_ioctl_action_t; 324*ef270ab1SKenneth D. Merry 325*ef270ab1SKenneth D. Merry #define FC_HEADER_LEN 24 326*ef270ab1SKenneth D. Merry typedef struct { 327*ef270ab1SKenneth D. Merry uint8_t fc_header[FC_HEADER_LEN]; /*<< FC Header to send */ 328*ef270ab1SKenneth D. Merry uint8_t *payload; /*<< payload */ 329*ef270ab1SKenneth D. Merry uint32_t payload_len; /*<< payload length (bytes) */ 330*ef270ab1SKenneth D. Merry uint8_t sof; /*<< SOF value */ 331*ef270ab1SKenneth D. Merry uint8_t eof; /*<< EOF Value */ 332*ef270ab1SKenneth D. Merry } ocs_ioctl_send_frame_t; 333*ef270ab1SKenneth D. Merry 334*ef270ab1SKenneth D. Merry /** 335*ef270ab1SKenneth D. Merry * @brief linkcfg strings 336*ef270ab1SKenneth D. Merry */ 337*ef270ab1SKenneth D. Merry #define OCS_CONFIG_LINKCFG_4X10G "ETH_4x10G" 338*ef270ab1SKenneth D. Merry #define OCS_CONFIG_LINKCFG_1X40G "ETH_1x40G" 339*ef270ab1SKenneth D. Merry #define OCS_CONFIG_LINKCFG_2X16G "FC_2x16G" 340*ef270ab1SKenneth D. Merry #define OCS_CONFIG_LINKCFG_4X8G "FC_4x8G" 341*ef270ab1SKenneth D. Merry #define OCS_CONFIG_LINKCFG_4X1G "FC_4x1G" 342*ef270ab1SKenneth D. Merry #define OCS_CONFIG_LINKCFG_2X10G "ETH_2x10G" 343*ef270ab1SKenneth D. Merry #define OCS_CONFIG_LINKCFG_2X10G_2X8G "ETH_2x10G_FC_2x8G" 344*ef270ab1SKenneth D. Merry #define OCS_CONFIG_LINKCFG_UNKNOWN "UNKNOWN" 345*ef270ab1SKenneth D. Merry 346*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_BASE 'o' 347*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_TEST _IOWR(OCS_IOCTL_CMD_BASE, 1, ocs_ioctl_test_t) 348*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_ELXU_MBOX _IOWR(OCS_IOCTL_CMD_BASE, 2, ocs_ioctl_elxu_mbox_t) 349*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_SCSI_CMD _IOWR(OCS_IOCTL_CMD_BASE, 3, ocs_ioctl_scsi_cmd_t) 350*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_DRIVER_INFO _IOWR(OCS_IOCTL_CMD_BASE, 4, ocs_ioctl_driver_info_t) 351*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_ECD_HELPER _IOWR(OCS_IOCTL_CMD_BASE, 5, ocs_ioctl_ecd_helper_t) 352*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_CONNECTION_INFO _IOWR(OCS_IOCTL_CMD_BASE, 6, ocs_ioctl_connection_info_t) 353*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_VPORT _IOWR(OCS_IOCTL_CMD_BASE, 7, ocs_ioctl_vport_t) 354*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_GET_DDUMP _IOWR(OCS_IOCTL_CMD_BASE, 8, ocs_ioctl_ddump_t) 355*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_MGMT_GET _IOWR(OCS_IOCTL_CMD_BASE, 9, ocs_ioctl_cmd_get_t) 356*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_MGMT_GET_ALL _IOWR(OCS_IOCTL_CMD_BASE, 10, ocs_ioctl_mgmt_buffer_t) 357*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_MGMT_SET _IOWR(OCS_IOCTL_CMD_BASE, 11, ocs_ioctl_cmd_set_t) 358*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_MGMT_LIST _IOWR(OCS_IOCTL_CMD_BASE, 12, ocs_ioctl_mgmt_buffer_t) 359*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_MGMT_EXEC _IOWR(OCS_IOCTL_CMD_BASE, 13, ocs_ioctl_action_t) 360*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_LINK_ONLINE _IOWR(OCS_IOCTL_CMD_BASE, 16, int) 361*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_GEN_DUMP _IOWR(OCS_IOCTL_CMD_BASE, 17, int) 362*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_UNLOAD _IO(OCS_IOCTL_CMD_BASE, 18) 363*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_SEND_FRAME _IOWR(OCS_IOCTL_CMD_BASE, 19, ocs_ioctl_send_frame_t) 364*ef270ab1SKenneth D. Merry 365*ef270ab1SKenneth D. Merry 366*ef270ab1SKenneth D. Merry extern void ocs_info_get_xport_address(ocs_t *ocs, ocs_ioctl_driver_info_t *info); 367*ef270ab1SKenneth D. Merry extern int32_t ocs_device_ioctl_xport(ocs_t *ocs, unsigned int cmd, unsigned long arg); 368*ef270ab1SKenneth D. Merry #endif 369