linux/drivers/scsi/mpt2sas/mpt2sas_ctl.h
<<
>>
Prefs
   1/*
   2 * Management Module Support for MPT (Message Passing Technology) based
   3 * controllers
   4 *
   5 * This code is based on drivers/scsi/mpt2sas/mpt2_ctl.h
   6 * Copyright (C) 2007-2010  LSI Corporation
   7 *  (mailto:DL-MPTFusionLinux@lsi.com)
   8 *
   9 * This program is free software; you can redistribute it and/or
  10 * modify it under the terms of the GNU General Public License
  11 * as published by the Free Software Foundation; either version 2
  12 * of the License, or (at your option) any later version.
  13 *
  14 * This program is distributed in the hope that it will be useful,
  15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17 * GNU General Public License for more details.
  18 *
  19 * NO WARRANTY
  20 * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
  21 * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
  22 * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
  23 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
  24 * solely responsible for determining the appropriateness of using and
  25 * distributing the Program and assumes all risks associated with its
  26 * exercise of rights under this Agreement, including but not limited to
  27 * the risks and costs of program errors, damage to or loss of data,
  28 * programs or equipment, and unavailability or interruption of operations.
  29
  30 * DISCLAIMER OF LIABILITY
  31 * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
  32 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  33 * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
  34 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
  35 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  36 * USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
  37 * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
  38
  39 * You should have received a copy of the GNU General Public License
  40 * along with this program; if not, write to the Free Software
  41 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
  42 * USA.
  43 */
  44
  45#ifndef MPT2SAS_CTL_H_INCLUDED
  46#define MPT2SAS_CTL_H_INCLUDED
  47
  48#ifdef __KERNEL__
  49#include <linux/miscdevice.h>
  50#endif
  51
  52#define MPT2SAS_DEV_NAME        "mpt2ctl"
  53#define MPT2_MAGIC_NUMBER       'L'
  54#define MPT2_IOCTL_DEFAULT_TIMEOUT (10) /* in seconds */
  55
  56/**
  57 * IOCTL opcodes
  58 */
  59#define MPT2IOCINFO     _IOWR(MPT2_MAGIC_NUMBER, 17, \
  60    struct mpt2_ioctl_iocinfo)
  61#define MPT2COMMAND     _IOWR(MPT2_MAGIC_NUMBER, 20, \
  62    struct mpt2_ioctl_command)
  63#ifdef CONFIG_COMPAT
  64#define MPT2COMMAND32   _IOWR(MPT2_MAGIC_NUMBER, 20, \
  65    struct mpt2_ioctl_command32)
  66#endif
  67#define MPT2EVENTQUERY  _IOWR(MPT2_MAGIC_NUMBER, 21, \
  68    struct mpt2_ioctl_eventquery)
  69#define MPT2EVENTENABLE _IOWR(MPT2_MAGIC_NUMBER, 22, \
  70    struct mpt2_ioctl_eventenable)
  71#define MPT2EVENTREPORT _IOWR(MPT2_MAGIC_NUMBER, 23, \
  72    struct mpt2_ioctl_eventreport)
  73#define MPT2HARDRESET   _IOWR(MPT2_MAGIC_NUMBER, 24, \
  74    struct mpt2_ioctl_diag_reset)
  75#define MPT2BTDHMAPPING _IOWR(MPT2_MAGIC_NUMBER, 31, \
  76    struct mpt2_ioctl_btdh_mapping)
  77
  78/* diag buffer support */
  79#define MPT2DIAGREGISTER _IOWR(MPT2_MAGIC_NUMBER, 26, \
  80    struct mpt2_diag_register)
  81#define MPT2DIAGRELEASE _IOWR(MPT2_MAGIC_NUMBER, 27, \
  82    struct mpt2_diag_release)
  83#define MPT2DIAGUNREGISTER _IOWR(MPT2_MAGIC_NUMBER, 28, \
  84    struct mpt2_diag_unregister)
  85#define MPT2DIAGQUERY   _IOWR(MPT2_MAGIC_NUMBER, 29, \
  86    struct mpt2_diag_query)
  87#define MPT2DIAGREADBUFFER _IOWR(MPT2_MAGIC_NUMBER, 30, \
  88    struct mpt2_diag_read_buffer)
  89
  90/**
  91 * struct mpt2_ioctl_header - main header structure
  92 * @ioc_number -  IOC unit number
  93 * @port_number - IOC port number
  94 * @max_data_size - maximum number bytes to transfer on read
  95 */
  96struct mpt2_ioctl_header {
  97        uint32_t ioc_number;
  98        uint32_t port_number;
  99        uint32_t max_data_size;
 100};
 101
 102/**
 103 * struct mpt2_ioctl_diag_reset - diagnostic reset
 104 * @hdr - generic header
 105 */
 106struct mpt2_ioctl_diag_reset {
 107        struct mpt2_ioctl_header hdr;
 108};
 109
 110
 111/**
 112 * struct mpt2_ioctl_pci_info - pci device info
 113 * @device - pci device id
 114 * @function - pci function id
 115 * @bus - pci bus id
 116 * @segment_id - pci segment id
 117 */
 118struct mpt2_ioctl_pci_info {
 119        union {
 120                struct {
 121                        uint32_t device:5;
 122                        uint32_t function:3;
 123                        uint32_t bus:24;
 124                } bits;
 125                uint32_t  word;
 126        } u;
 127        uint32_t segment_id;
 128};
 129
 130
 131#define MPT2_IOCTL_INTERFACE_SCSI       (0x00)
 132#define MPT2_IOCTL_INTERFACE_FC         (0x01)
 133#define MPT2_IOCTL_INTERFACE_FC_IP      (0x02)
 134#define MPT2_IOCTL_INTERFACE_SAS        (0x03)
 135#define MPT2_IOCTL_INTERFACE_SAS2       (0x04)
 136#define MPT2_IOCTL_INTERFACE_SAS2_SSS6200       (0x05)
 137#define MPT2_IOCTL_VERSION_LENGTH       (32)
 138
 139/**
 140 * struct mpt2_ioctl_iocinfo - generic controller info
 141 * @hdr - generic header
 142 * @adapter_type - type of adapter (spi, fc, sas)
 143 * @port_number - port number
 144 * @pci_id - PCI Id
 145 * @hw_rev - hardware revision
 146 * @sub_system_device - PCI subsystem Device ID
 147 * @sub_system_vendor - PCI subsystem Vendor ID
 148 * @rsvd0 - reserved
 149 * @firmware_version - firmware version
 150 * @bios_version - BIOS version
 151 * @driver_version - driver version - 32 ASCII characters
 152 * @rsvd1 - reserved
 153 * @scsi_id - scsi id of adapter 0
 154 * @rsvd2 - reserved
 155 * @pci_information - pci info (2nd revision)
 156 */
 157struct mpt2_ioctl_iocinfo {
 158        struct mpt2_ioctl_header hdr;
 159        uint32_t adapter_type;
 160        uint32_t port_number;
 161        uint32_t pci_id;
 162        uint32_t hw_rev;
 163        uint32_t subsystem_device;
 164        uint32_t subsystem_vendor;
 165        uint32_t rsvd0;
 166        uint32_t firmware_version;
 167        uint32_t bios_version;
 168        uint8_t driver_version[MPT2_IOCTL_VERSION_LENGTH];
 169        uint8_t rsvd1;
 170        uint8_t scsi_id;
 171        uint16_t rsvd2;
 172        struct mpt2_ioctl_pci_info pci_information;
 173};
 174
 175
 176/* number of event log entries */
 177#define MPT2SAS_CTL_EVENT_LOG_SIZE (50)
 178
 179/**
 180 * struct mpt2_ioctl_eventquery - query event count and type
 181 * @hdr - generic header
 182 * @event_entries - number of events returned by get_event_report
 183 * @rsvd - reserved
 184 * @event_types - type of events currently being captured
 185 */
 186struct mpt2_ioctl_eventquery {
 187        struct mpt2_ioctl_header hdr;
 188        uint16_t event_entries;
 189        uint16_t rsvd;
 190        uint32_t event_types[MPI2_EVENT_NOTIFY_EVENTMASK_WORDS];
 191};
 192
 193/**
 194 * struct mpt2_ioctl_eventenable - enable/disable event capturing
 195 * @hdr - generic header
 196 * @event_types - toggle off/on type of events to be captured
 197 */
 198struct mpt2_ioctl_eventenable {
 199        struct mpt2_ioctl_header hdr;
 200        uint32_t event_types[4];
 201};
 202
 203#define MPT2_EVENT_DATA_SIZE (192)
 204/**
 205 * struct MPT2_IOCTL_EVENTS -
 206 * @event - the event that was reported
 207 * @context - unique value for each event assigned by driver
 208 * @data - event data returned in fw reply message
 209 */
 210struct MPT2_IOCTL_EVENTS {
 211        uint32_t event;
 212        uint32_t context;
 213        uint8_t data[MPT2_EVENT_DATA_SIZE];
 214};
 215
 216/**
 217 * struct mpt2_ioctl_eventreport - returing event log
 218 * @hdr - generic header
 219 * @event_data - (see struct MPT2_IOCTL_EVENTS)
 220 */
 221struct mpt2_ioctl_eventreport {
 222        struct mpt2_ioctl_header hdr;
 223        struct MPT2_IOCTL_EVENTS event_data[1];
 224};
 225
 226/**
 227 * struct mpt2_ioctl_command - generic mpt firmware passthru ioclt
 228 * @hdr - generic header
 229 * @timeout - command timeout in seconds. (if zero then use driver default
 230 *  value).
 231 * @reply_frame_buf_ptr - reply location
 232 * @data_in_buf_ptr - destination for read
 233 * @data_out_buf_ptr - data source for write
 234 * @sense_data_ptr - sense data location
 235 * @max_reply_bytes - maximum number of reply bytes to be sent to app.
 236 * @data_in_size - number bytes for data transfer in (read)
 237 * @data_out_size - number bytes for data transfer out (write)
 238 * @max_sense_bytes - maximum number of bytes for auto sense buffers
 239 * @data_sge_offset - offset in words from the start of the request message to
 240 * the first SGL
 241 * @mf[1];
 242 */
 243struct mpt2_ioctl_command {
 244        struct mpt2_ioctl_header hdr;
 245        uint32_t timeout;
 246        void __user *reply_frame_buf_ptr;
 247        void __user *data_in_buf_ptr;
 248        void __user *data_out_buf_ptr;
 249        void __user *sense_data_ptr;
 250        uint32_t max_reply_bytes;
 251        uint32_t data_in_size;
 252        uint32_t data_out_size;
 253        uint32_t max_sense_bytes;
 254        uint32_t data_sge_offset;
 255        uint8_t mf[1];
 256};
 257
 258#ifdef CONFIG_COMPAT
 259struct mpt2_ioctl_command32 {
 260        struct mpt2_ioctl_header hdr;
 261        uint32_t timeout;
 262        uint32_t reply_frame_buf_ptr;
 263        uint32_t data_in_buf_ptr;
 264        uint32_t data_out_buf_ptr;
 265        uint32_t sense_data_ptr;
 266        uint32_t max_reply_bytes;
 267        uint32_t data_in_size;
 268        uint32_t data_out_size;
 269        uint32_t max_sense_bytes;
 270        uint32_t data_sge_offset;
 271        uint8_t mf[1];
 272};
 273#endif
 274
 275/**
 276 * struct mpt2_ioctl_btdh_mapping - mapping info
 277 * @hdr - generic header
 278 * @id - target device identification number
 279 * @bus - SCSI bus number that the target device exists on
 280 * @handle - device handle for the target device
 281 * @rsvd - reserved
 282 *
 283 * To obtain a bus/id the application sets
 284 * handle to valid handle, and bus/id to 0xFFFF.
 285 *
 286 * To obtain the device handle the application sets
 287 * bus/id valid value, and the handle to 0xFFFF.
 288 */
 289struct mpt2_ioctl_btdh_mapping {
 290        struct mpt2_ioctl_header hdr;
 291        uint32_t id;
 292        uint32_t bus;
 293        uint16_t handle;
 294        uint16_t rsvd;
 295};
 296
 297
 298/* status bits for ioc->diag_buffer_status */
 299#define MPT2_DIAG_BUFFER_IS_REGISTERED  (0x01)
 300#define MPT2_DIAG_BUFFER_IS_RELEASED    (0x02)
 301#define MPT2_DIAG_BUFFER_IS_DIAG_RESET  (0x04)
 302
 303/* application flags for mpt2_diag_register, mpt2_diag_query */
 304#define MPT2_APP_FLAGS_APP_OWNED        (0x0001)
 305#define MPT2_APP_FLAGS_BUFFER_VALID     (0x0002)
 306#define MPT2_APP_FLAGS_FW_BUFFER_ACCESS (0x0004)
 307
 308/* flags for mpt2_diag_read_buffer */
 309#define MPT2_FLAGS_REREGISTER           (0x0001)
 310
 311#define MPT2_PRODUCT_SPECIFIC_DWORDS            23
 312
 313/**
 314 * struct mpt2_diag_register - application register with driver
 315 * @hdr - generic header
 316 * @reserved -
 317 * @buffer_type - specifies either TRACE, SNAPSHOT, or EXTENDED
 318 * @application_flags - misc flags
 319 * @diagnostic_flags - specifies flags affecting command processing
 320 * @product_specific - product specific information
 321 * @requested_buffer_size - buffers size in bytes
 322 * @unique_id - tag specified by application that is used to signal ownership
 323 *  of the buffer.
 324 *
 325 * This will allow the driver to setup any required buffers that will be
 326 * needed by firmware to communicate with the driver.
 327 */
 328struct mpt2_diag_register {
 329        struct mpt2_ioctl_header hdr;
 330        uint8_t reserved;
 331        uint8_t buffer_type;
 332        uint16_t application_flags;
 333        uint32_t diagnostic_flags;
 334        uint32_t product_specific[MPT2_PRODUCT_SPECIFIC_DWORDS];
 335        uint32_t requested_buffer_size;
 336        uint32_t unique_id;
 337};
 338
 339/**
 340 * struct mpt2_diag_unregister - application unregister with driver
 341 * @hdr - generic header
 342 * @unique_id - tag uniquely identifies the buffer to be unregistered
 343 *
 344 * This will allow the driver to cleanup any memory allocated for diag
 345 * messages and to free up any resources.
 346 */
 347struct mpt2_diag_unregister {
 348        struct mpt2_ioctl_header hdr;
 349        uint32_t unique_id;
 350};
 351
 352/**
 353 * struct mpt2_diag_query - query relevant info associated with diag buffers
 354 * @hdr - generic header
 355 * @reserved -
 356 * @buffer_type - specifies either TRACE, SNAPSHOT, or EXTENDED
 357 * @application_flags - misc flags
 358 * @diagnostic_flags - specifies flags affecting command processing
 359 * @product_specific - product specific information
 360 * @total_buffer_size - diag buffer size in bytes
 361 * @driver_added_buffer_size - size of extra space appended to end of buffer
 362 * @unique_id - unique id associated with this buffer.
 363 *
 364 * The application will send only buffer_type and unique_id.  Driver will
 365 * inspect unique_id first, if valid, fill in all the info.  If unique_id is
 366 * 0x00, the driver will return info specified by Buffer Type.
 367 */
 368struct mpt2_diag_query {
 369        struct mpt2_ioctl_header hdr;
 370        uint8_t reserved;
 371        uint8_t buffer_type;
 372        uint16_t application_flags;
 373        uint32_t diagnostic_flags;
 374        uint32_t product_specific[MPT2_PRODUCT_SPECIFIC_DWORDS];
 375        uint32_t total_buffer_size;
 376        uint32_t driver_added_buffer_size;
 377        uint32_t unique_id;
 378};
 379
 380/**
 381 * struct mpt2_diag_release -  request to send Diag Release Message to firmware
 382 * @hdr - generic header
 383 * @unique_id - tag uniquely identifies the buffer to be released
 384 *
 385 * This allows ownership of the specified buffer to returned to the driver,
 386 * allowing an application to read the buffer without fear that firmware is
 387 * overwritting information in the buffer.
 388 */
 389struct mpt2_diag_release {
 390        struct mpt2_ioctl_header hdr;
 391        uint32_t unique_id;
 392};
 393
 394/**
 395 * struct mpt2_diag_read_buffer - request for copy of the diag buffer
 396 * @hdr - generic header
 397 * @status -
 398 * @reserved -
 399 * @flags - misc flags
 400 * @starting_offset - starting offset within drivers buffer where to start
 401 *  reading data at into the specified application buffer
 402 * @bytes_to_read - number of bytes to copy from the drivers buffer into the
 403 *  application buffer starting at starting_offset.
 404 * @unique_id - unique id associated with this buffer.
 405 * @diagnostic_data - data payload
 406 */
 407struct mpt2_diag_read_buffer {
 408        struct mpt2_ioctl_header hdr;
 409        uint8_t status;
 410        uint8_t reserved;
 411        uint16_t flags;
 412        uint32_t starting_offset;
 413        uint32_t bytes_to_read;
 414        uint32_t unique_id;
 415        uint32_t diagnostic_data[1];
 416};
 417
 418#endif /* MPT2SAS_CTL_H_INCLUDED */
 419