The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/cam/ctl/ctl_io.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
    3  *
    4  * Copyright (c) 2003 Silicon Graphics International Corp.
    5  * Copyright (c) 2014-2015 Alexander Motin <mav@FreeBSD.org>
    6  * All rights reserved.
    7  *
    8  * Redistribution and use in source and binary forms, with or without
    9  * modification, are permitted provided that the following conditions
   10  * are met:
   11  * 1. Redistributions of source code must retain the above copyright
   12  *    notice, this list of conditions, and the following disclaimer,
   13  *    without modification.
   14  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
   15  *    substantially similar to the "NO WARRANTY" disclaimer below
   16  *    ("Disclaimer") and any redistribution must be conditioned upon
   17  *    including a substantially similar Disclaimer requirement for further
   18  *    binary redistribution.
   19  *
   20  * NO WARRANTY
   21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
   22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
   23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
   24  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
   25  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   29  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
   30  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   31  * POSSIBILITY OF SUCH DAMAGES.
   32  *
   33  * $Id: //depot/users/kenm/FreeBSD-test2/sys/cam/ctl/ctl_io.h#5 $
   34  * $FreeBSD$
   35  */
   36 /*
   37  * CAM Target Layer data movement structures/interface.
   38  *
   39  * Author: Ken Merry <ken@FreeBSD.org>
   40  */
   41 
   42 #ifndef _CTL_IO_H_
   43 #define _CTL_IO_H_
   44 
   45 #ifndef _KERNEL
   46 #include <stdbool.h>
   47 #endif
   48 
   49 #define CTL_MAX_CDBLEN  32
   50 /*
   51  * Uncomment this next line to enable printing out times for I/Os
   52  * that take longer than CTL_TIME_IO_SECS seconds to get to the datamove
   53  * and/or done stage.
   54  */
   55 #define CTL_TIME_IO
   56 #ifdef  CTL_TIME_IO
   57 #define CTL_TIME_IO_DEFAULT_SECS        90
   58 #endif
   59 
   60 /*
   61  * Uncomment this next line to enable the CTL I/O delay feature.  You
   62  * can delay I/O at two different points -- datamove and done.  This is
   63  * useful for diagnosing abort conditions (for hosts that send an abort on a
   64  * timeout), and for determining how long a host's timeout is.
   65  */
   66 //#define       CTL_IO_DELAY
   67 
   68 typedef enum {
   69         CTL_STATUS_NONE,        /* No status */
   70         CTL_SUCCESS,            /* Transaction completed successfully */
   71         CTL_CMD_TIMEOUT,        /* Command timed out, shouldn't happen here */
   72         CTL_SEL_TIMEOUT,        /* Selection timeout, shouldn't happen here */
   73         CTL_ERROR,              /* General CTL error XXX expand on this? */
   74         CTL_SCSI_ERROR,         /* SCSI error, look at status byte/sense data */
   75         CTL_CMD_ABORTED,        /* Command aborted, don't return status */
   76         CTL_STATUS_MASK = 0xfff,/* Mask off any status flags */
   77         CTL_AUTOSENSE = 0x1000  /* Autosense performed */
   78 } ctl_io_status;
   79 
   80 /*
   81  * WARNING:  Keep the data in/out/none flags where they are.  They're used
   82  * in conjunction with ctl_cmd_flags.  See comment above ctl_cmd_flags
   83  * definition in ctl_private.h.
   84  */
   85 typedef enum {
   86         CTL_FLAG_NONE           = 0x00000000,   /* no flags */
   87         CTL_FLAG_DATA_IN        = 0x00000001,   /* DATA IN */
   88         CTL_FLAG_DATA_OUT       = 0x00000002,   /* DATA OUT */
   89         CTL_FLAG_DATA_NONE      = 0x00000003,   /* no data */
   90         CTL_FLAG_DATA_MASK      = 0x00000003,
   91         CTL_FLAG_USER_TAG       = 0x00000020,   /* userland provides tag */
   92         CTL_FLAG_USER_REQ       = 0x00000040,   /* request came from userland */
   93         CTL_FLAG_ALLOCATED      = 0x00000100,   /* data space allocated */
   94         CTL_FLAG_ABORT_STATUS   = 0x00000400,   /* return TASK ABORTED status */
   95         CTL_FLAG_ABORT          = 0x00000800,   /* this I/O should be aborted */
   96         CTL_FLAG_DMA_INPROG     = 0x00001000,   /* DMA in progress */
   97         CTL_FLAG_DELAY_DONE     = 0x00004000,   /* delay injection done */
   98         CTL_FLAG_INT_COPY       = 0x00008000,   /* internal copy, no done call*/
   99         CTL_FLAG_SENT_2OTHER_SC = 0x00010000,
  100         CTL_FLAG_FROM_OTHER_SC  = 0x00020000,
  101         CTL_FLAG_IS_WAS_ON_RTR  = 0x00040000,   /* Don't rerun cmd on failover*/
  102         CTL_FLAG_BUS_ADDR       = 0x00080000,   /* ctl_sglist contains BUS
  103                                                    addresses, not virtual ones*/
  104         CTL_FLAG_IO_CONT        = 0x00100000,   /* Continue I/O instead of
  105                                                    completing */
  106 #if 0
  107         CTL_FLAG_ALREADY_DONE   = 0x00200000    /* I/O already completed */
  108 #endif
  109         CTL_FLAG_NO_DATAMOVE    = 0x00400000,
  110         CTL_FLAG_DMA_QUEUED     = 0x00800000,   /* DMA queued but not started*/
  111         CTL_FLAG_STATUS_QUEUED  = 0x01000000,   /* Status queued but not sent*/
  112 
  113         CTL_FLAG_FAILOVER       = 0x04000000,   /* Killed by a failover */
  114         CTL_FLAG_IO_ACTIVE      = 0x08000000,   /* I/O active on this SC */
  115         CTL_FLAG_STATUS_SENT    = 0x10000000,   /* Status sent by datamove */
  116         CTL_FLAG_SERSEQ_DONE    = 0x20000000    /* All storage I/O started */
  117 } ctl_io_flags;
  118 
  119 struct ctl_lba_len {
  120         uint64_t lba;
  121         uint32_t len;
  122 };
  123 
  124 struct ctl_lba_len_flags {
  125         uint64_t lba;
  126         uint32_t len;
  127         uint32_t flags;
  128 #define CTL_LLF_FUA     0x04000000
  129 #define CTL_LLF_DPO     0x08000000
  130 #define CTL_LLF_READ    0x10000000
  131 #define CTL_LLF_WRITE   0x20000000
  132 #define CTL_LLF_VERIFY  0x40000000
  133 #define CTL_LLF_COMPARE 0x80000000
  134 };
  135 
  136 struct ctl_ptr_len_flags {
  137         uint8_t         *ptr;
  138         uint32_t        len;
  139         uint32_t        flags;
  140 };
  141 
  142 union ctl_priv {
  143         uint8_t         bytes[sizeof(uint64_t) * 2];
  144         uint64_t        integer;
  145         uint64_t        integers[2];
  146         void            *ptr;
  147         void            *ptrs[2];
  148 };
  149 
  150 /*
  151  * Number of CTL private areas.
  152  */
  153 #define CTL_NUM_PRIV    6
  154 
  155 /*
  156  * Which private area are we using for a particular piece of data?
  157  */
  158 #define CTL_PRIV_LUN            0       /* CTL LUN pointer goes here */
  159 #define CTL_PRIV_LBA_LEN        1       /* Decoded LBA/len for read/write*/
  160 #define CTL_PRIV_MODEPAGE       1       /* Modepage info for config write */
  161 #define CTL_PRIV_BACKEND        2       /* Reserved for block, RAIDCore */
  162 #define CTL_PRIV_BACKEND_LUN    3       /* Backend LUN pointer */
  163 #define CTL_PRIV_FRONTEND       4       /* Frontend storage */
  164 #define CTL_PRIV_FRONTEND2      5       /* Another frontend storage */
  165 
  166 #define CTL_LUN(io)     ((io)->io_hdr.ctl_private[CTL_PRIV_LUN].ptrs[0])
  167 #define CTL_SOFTC(io)   ((io)->io_hdr.ctl_private[CTL_PRIV_LUN].ptrs[1])
  168 #define CTL_BACKEND_LUN(io)     ((io)->io_hdr.ctl_private[CTL_PRIV_BACKEND_LUN].ptrs[0])
  169 #define CTL_PORT(io)    (((struct ctl_softc *)CTL_SOFTC(io))->  \
  170     ctl_ports[(io)->io_hdr.nexus.targ_port])
  171 
  172 /*
  173  * These are used only on Originating SC in XFER mode, where requests don't
  174  * ever reach backends, so we can reuse backend's private storage.
  175  */
  176 #define CTL_RSGL(io)    ((io)->io_hdr.ctl_private[CTL_PRIV_BACKEND].ptrs[0])
  177 #define CTL_LSGL(io)    ((io)->io_hdr.ctl_private[CTL_PRIV_BACKEND].ptrs[1])
  178 #define CTL_RSGLT(io)   ((struct ctl_sg_entry *)CTL_RSGL(io))
  179 #define CTL_LSGLT(io)   ((struct ctl_sg_entry *)CTL_LSGL(io))
  180 
  181 #define CTL_INVALID_PORTNAME 0xFF
  182 #define CTL_UNMAPPED_IID     0xFF
  183 
  184 struct ctl_sg_entry {
  185         void    *addr;
  186         size_t  len;
  187 };
  188 
  189 typedef enum {
  190         CTL_IO_NONE,
  191         CTL_IO_SCSI,
  192         CTL_IO_TASK,
  193 } ctl_io_type;
  194 
  195 struct ctl_nexus {
  196         uint32_t initid;                /* Initiator ID */
  197         uint32_t targ_port;             /* Target port, filled in by PORT */
  198         uint32_t targ_lun;              /* Destination lun */
  199         uint32_t targ_mapped_lun;       /* Destination lun CTL-wide */
  200 };
  201 
  202 typedef enum {
  203         CTL_MSG_SERIALIZE,
  204         CTL_MSG_R2R,
  205         CTL_MSG_FINISH_IO,
  206         CTL_MSG_BAD_JUJU,
  207         CTL_MSG_MANAGE_TASKS,
  208         CTL_MSG_PERS_ACTION,
  209         CTL_MSG_DATAMOVE,
  210         CTL_MSG_DATAMOVE_DONE,
  211         CTL_MSG_UA,                     /* Set/clear UA on secondary. */
  212         CTL_MSG_PORT_SYNC,              /* Information about port. */
  213         CTL_MSG_LUN_SYNC,               /* Information about LUN. */
  214         CTL_MSG_IID_SYNC,               /* Information about initiator. */
  215         CTL_MSG_LOGIN,                  /* Information about HA peer. */
  216         CTL_MSG_MODE_SYNC,              /* Mode page current content. */
  217         CTL_MSG_FAILOVER                /* Fake, never sent though the wire */
  218 } ctl_msg_type;
  219 
  220 struct ctl_scsiio;
  221 
  222 struct ctl_io_hdr {
  223         uint32_t          version;      /* interface version XXX */
  224         ctl_io_type       io_type;      /* task I/O, SCSI I/O, etc. */
  225         ctl_msg_type      msg_type;
  226         struct ctl_nexus  nexus;        /* Initiator, port, target, lun */
  227         uint32_t          iid_indx;     /* the index into the iid mapping */
  228         uint32_t          flags;        /* transaction flags */
  229         uint32_t          status;       /* transaction status */
  230         uint32_t          port_status;  /* trans status, set by PORT, 0 = good*/
  231         uint32_t          timeout;      /* timeout in ms */
  232         uint32_t          retries;      /* retry count */
  233 #ifdef CTL_IO_DELAY
  234         struct callout    delay_callout;
  235 #endif /* CTL_IO_DELAY */
  236 #ifdef CTL_TIME_IO
  237         time_t            start_time;   /* I/O start time */
  238         struct bintime    start_bt;     /* Timer start ticks */
  239         struct bintime    dma_start_bt; /* DMA start ticks */
  240         struct bintime    dma_bt;       /* DMA total ticks */
  241 #endif /* CTL_TIME_IO */
  242         uint32_t          num_dmas;     /* Number of DMAs */
  243         union ctl_io      *remote_io;   /* I/O counterpart on remote HA side */
  244         union ctl_io      *blocker;     /* I/O blocking this one */
  245         void              *pool;        /* I/O pool */
  246         union ctl_priv    ctl_private[CTL_NUM_PRIV];/* CTL private area */
  247         TAILQ_HEAD(, ctl_io_hdr) blocked_queue; /* I/Os blocked by this one */
  248         STAILQ_ENTRY(ctl_io_hdr) links; /* linked list pointer */
  249         LIST_ENTRY(ctl_io_hdr) ooa_links;       /* ooa_queue links */
  250         TAILQ_ENTRY(ctl_io_hdr) blocked_links;  /* blocked_queue links */
  251 };
  252 
  253 typedef enum {
  254         CTL_TAG_UNTAGGED,
  255         CTL_TAG_SIMPLE,
  256         CTL_TAG_ORDERED,
  257         CTL_TAG_HEAD_OF_QUEUE,
  258         CTL_TAG_ACA
  259 } ctl_tag_type;
  260 
  261 union ctl_io;
  262 
  263 typedef void (*ctl_ref)(void *arg, int diff);
  264 
  265 /*
  266  * SCSI passthrough I/O structure for the CAM Target Layer.  Note
  267  * that some of these fields are here for completeness, but they aren't
  268  * used in the CTL implementation.  e.g., timeout and retries won't be
  269  * used.
  270  *
  271  * Note:  Make sure the io_hdr is *always* the first element in this
  272  * structure.
  273  */
  274 struct ctl_scsiio {
  275         struct ctl_io_hdr io_hdr;       /* common to all I/O types */
  276 
  277         /*
  278          * The ext_* fields are generally intended for frontend use; CTL itself
  279          * doesn't modify or use them.
  280          */
  281         uint32_t   ext_sg_entries;      /* 0 = no S/G list, > 0 = num entries */
  282         uint8_t    *ext_data_ptr;       /* data buffer or S/G list */
  283         uint32_t   ext_data_len;        /* Data transfer length */
  284         uint32_t   ext_data_filled;     /* Amount of data filled so far */
  285 
  286         /*
  287          * The number of scatter/gather entries in the list pointed to
  288          * by kern_data_ptr.  0 means there is no list, just a data pointer.
  289          */
  290         uint32_t   kern_sg_entries;
  291 
  292         uint32_t   rem_sg_entries;      /* Unused. */
  293 
  294         /*
  295          * The data pointer or a pointer to the scatter/gather list.
  296          */
  297         uint8_t    *kern_data_ptr;
  298 
  299         /*
  300          * Length of the data buffer or scatter/gather list.  It's also
  301          * the length of this particular piece of the data transfer,
  302          * ie. number of bytes expected to be transferred by the current
  303          * invocation of frontend's datamove() callback.  It's always
  304          * less than or equal to kern_total_len.
  305          */
  306         uint32_t   kern_data_len;
  307 
  308         /*
  309          * Total length of data to be transferred during this particular
  310          * SCSI command, as decoded from SCSI CDB.
  311          */
  312         uint32_t   kern_total_len;
  313 
  314         /*
  315          * Amount of data left after the current data transfer.
  316          */
  317         uint32_t   kern_data_resid;
  318 
  319         /*
  320          * Byte offset of this transfer, equal to the amount of data
  321          * already transferred for this SCSI command during previous
  322          * datamove() invocations.
  323          */
  324         uint32_t   kern_rel_offset;
  325 
  326         struct     scsi_sense_data sense_data;  /* sense data */
  327         uint8_t    sense_len;           /* Returned sense length */
  328         uint8_t    scsi_status;         /* SCSI status byte */
  329         uint8_t    seridx;              /* Serialization index. */
  330         uint8_t    priority;            /* Command priority */
  331         uint64_t   tag_num;             /* tag number */
  332         ctl_tag_type tag_type;          /* simple, ordered, head of queue,etc.*/
  333         uint8_t    cdb_len;             /* CDB length */
  334         uint8_t    cdb[CTL_MAX_CDBLEN]; /* CDB */
  335         int        (*be_move_done)(union ctl_io *io, bool samethr); /* called by fe */
  336         int        (*io_cont)(union ctl_io *io); /* to continue processing */
  337         ctl_ref     kern_data_ref;      /* Method to reference/release data */
  338         void       *kern_data_arg;      /* Opaque argument for kern_data_ref() */
  339 };
  340 
  341 typedef enum {
  342         CTL_TASK_ABORT_TASK,
  343         CTL_TASK_ABORT_TASK_SET,
  344         CTL_TASK_CLEAR_ACA,
  345         CTL_TASK_CLEAR_TASK_SET,
  346         CTL_TASK_I_T_NEXUS_RESET,
  347         CTL_TASK_LUN_RESET,
  348         CTL_TASK_TARGET_RESET,
  349         CTL_TASK_BUS_RESET,
  350         CTL_TASK_PORT_LOGIN,
  351         CTL_TASK_PORT_LOGOUT,
  352         CTL_TASK_QUERY_TASK,
  353         CTL_TASK_QUERY_TASK_SET,
  354         CTL_TASK_QUERY_ASYNC_EVENT
  355 } ctl_task_type;
  356 
  357 typedef enum {
  358         CTL_TASK_FUNCTION_COMPLETE,
  359         CTL_TASK_FUNCTION_SUCCEEDED,
  360         CTL_TASK_FUNCTION_REJECTED,
  361         CTL_TASK_LUN_DOES_NOT_EXIST,
  362         CTL_TASK_FUNCTION_NOT_SUPPORTED
  363 } ctl_task_status;
  364 
  365 /*
  366  * Task management I/O structure.  Aborts, bus resets, etc., are sent using
  367  * this structure.
  368  *
  369  * Note:  Make sure the io_hdr is *always* the first element in this
  370  * structure.
  371  */
  372 struct ctl_taskio {
  373         struct ctl_io_hdr       io_hdr;      /* common to all I/O types */
  374         ctl_task_type           task_action; /* Target Reset, Abort, etc.  */
  375         uint64_t                tag_num;     /* tag number */
  376         ctl_tag_type            tag_type;    /* simple, ordered, etc. */
  377         uint8_t                 task_status; /* Complete, Succeeded, etc. */
  378         uint8_t                 task_resp[3];/* Response information */
  379 };
  380 
  381 /*
  382  * HA link messages.
  383  */
  384 #define CTL_HA_VERSION          4
  385 
  386 /*
  387  * Used for CTL_MSG_LOGIN.
  388  */
  389 struct ctl_ha_msg_login {
  390         ctl_msg_type            msg_type;
  391         int                     version;
  392         int                     ha_mode;
  393         int                     ha_id;
  394         int                     max_luns;
  395         int                     max_ports;
  396         int                     max_init_per_port;
  397 };
  398 
  399 typedef enum {
  400         CTL_PR_REG_KEY,
  401         CTL_PR_UNREG_KEY,
  402         CTL_PR_PREEMPT,
  403         CTL_PR_CLEAR,
  404         CTL_PR_RESERVE,
  405         CTL_PR_RELEASE
  406 } ctl_pr_action;
  407 
  408 /*
  409  * The PR info is specifically for sending Persistent Reserve actions
  410  * to the other SC which it must also act on.
  411  *
  412  * Note:  Make sure the io_hdr is *always* the first element in this
  413  * structure.
  414  */
  415 struct ctl_pr_info {
  416         ctl_pr_action           action;
  417         uint8_t                 sa_res_key[8];
  418         uint8_t                 res_type;
  419         uint32_t                residx;
  420 };
  421 
  422 struct ctl_ha_msg_hdr {
  423         ctl_msg_type            msg_type;
  424         uint32_t                status;      /* transaction status */
  425         union ctl_io            *original_sc;
  426         union ctl_io            *serializing_sc;
  427         struct ctl_nexus        nexus;       /* Initiator, port, target, lun */
  428 };
  429 
  430 #define CTL_HA_MAX_SG_ENTRIES   16
  431 #define CTL_HA_DATAMOVE_SEGMENT 131072
  432 
  433 /*
  434  * Used for CTL_MSG_PERS_ACTION.
  435  */
  436 struct ctl_ha_msg_pr {
  437         struct ctl_ha_msg_hdr   hdr;
  438         struct ctl_pr_info      pr_info;
  439 };
  440 
  441 /*
  442  * Used for CTL_MSG_UA.
  443  */
  444 struct ctl_ha_msg_ua {
  445         struct ctl_ha_msg_hdr   hdr;
  446         int                     ua_all;
  447         int                     ua_set;
  448         int                     ua_type;
  449         uint8_t                 ua_info[8];
  450 };
  451 
  452 /*
  453  * The S/G handling here is a little different than the standard ctl_scsiio
  454  * structure, because we can't pass data by reference in between controllers.
  455  * The S/G list in the ctl_scsiio struct is normally passed in the
  456  * kern_data_ptr field.  So kern_sg_entries here will always be non-zero,
  457  * even if there is only one entry.
  458  *
  459  * Used for CTL_MSG_DATAMOVE.
  460  */
  461 struct ctl_ha_msg_dt {
  462         struct ctl_ha_msg_hdr   hdr;
  463         ctl_io_flags            flags;  /* Only I/O flags are used here */
  464         uint32_t                sg_sequence;     /* S/G portion number  */
  465         uint8_t                 sg_last;         /* last S/G batch = 1 */
  466         uint32_t                sent_sg_entries; /* previous S/G count */
  467         uint32_t                cur_sg_entries;  /* current S/G entries */
  468         uint32_t                kern_sg_entries; /* total S/G entries */
  469         uint32_t                kern_data_len;   /* Length of this S/G list */
  470         uint32_t                kern_total_len;  /* Total length of this
  471                                                     transaction */
  472         uint32_t                kern_data_resid; /* Length left to transfer
  473                                                     after this*/
  474         uint32_t                kern_rel_offset; /* Byte Offset of this
  475                                                     transfer */
  476         struct ctl_sg_entry     sg_list[CTL_HA_MAX_SG_ENTRIES];
  477 };
  478 
  479 /*
  480  * Used for CTL_MSG_SERIALIZE, CTL_MSG_FINISH_IO, CTL_MSG_BAD_JUJU,
  481  * and CTL_MSG_DATAMOVE_DONE.
  482  */
  483 struct ctl_ha_msg_scsi {
  484         struct ctl_ha_msg_hdr   hdr;
  485         uint64_t                tag_num;     /* tag number */
  486         ctl_tag_type            tag_type;    /* simple, ordered, etc. */
  487         uint8_t                 cdb[CTL_MAX_CDBLEN];    /* CDB */
  488         uint8_t                 cdb_len;        /* CDB length */
  489         uint8_t                 scsi_status; /* SCSI status byte */
  490         uint8_t                 sense_len;   /* Returned sense length */
  491         uint8_t                 priority;    /* Command priority */
  492         uint32_t                port_status; /* trans status, set by FETD,
  493                                                 0 = good*/
  494         uint32_t                kern_data_resid; /* for DATAMOVE_DONE */
  495         struct scsi_sense_data  sense_data;  /* sense data */
  496 };
  497 
  498 /* 
  499  * Used for CTL_MSG_MANAGE_TASKS.
  500  */
  501 struct ctl_ha_msg_task {
  502         struct ctl_ha_msg_hdr   hdr;
  503         ctl_task_type           task_action; /* Target Reset, Abort, etc.  */
  504         uint64_t                tag_num;     /* tag number */
  505         ctl_tag_type            tag_type;    /* simple, ordered, etc. */
  506 };
  507 
  508 /*
  509  * Used for CTL_MSG_PORT_SYNC.
  510  */
  511 struct ctl_ha_msg_port {
  512         struct ctl_ha_msg_hdr   hdr;
  513         int                     port_type;
  514         int                     physical_port;
  515         int                     virtual_port;
  516         int                     status;
  517         int                     name_len;
  518         int                     lun_map_len;
  519         int                     port_devid_len;
  520         int                     target_devid_len;
  521         int                     init_devid_len;
  522         uint8_t                 data[];
  523 };
  524 
  525 /*
  526  * Used for CTL_MSG_LUN_SYNC.
  527  */
  528 struct ctl_ha_msg_lun {
  529         struct ctl_ha_msg_hdr   hdr;
  530         int                     flags;
  531         unsigned int            pr_generation;
  532         uint32_t                pr_res_idx;
  533         uint8_t                 pr_res_type;
  534         int                     lun_devid_len;
  535         int                     pr_key_count;
  536         uint8_t                 data[];
  537 };
  538 
  539 struct ctl_ha_msg_lun_pr_key {
  540         uint32_t                pr_iid;
  541         uint64_t                pr_key;
  542 };
  543 
  544 /*
  545  * Used for CTL_MSG_IID_SYNC.
  546  */
  547 struct ctl_ha_msg_iid {
  548         struct ctl_ha_msg_hdr   hdr;
  549         int                     in_use;
  550         int                     name_len;
  551         uint64_t                wwpn;
  552         uint8_t                 data[];
  553 };
  554 
  555 /*
  556  * Used for CTL_MSG_MODE_SYNC.
  557  */
  558 struct ctl_ha_msg_mode {
  559         struct ctl_ha_msg_hdr   hdr;
  560         uint8_t                 page_code;
  561         uint8_t                 subpage;
  562         uint16_t                page_len;
  563         uint8_t                 data[];
  564 };
  565 
  566 union ctl_ha_msg {
  567         struct ctl_ha_msg_hdr   hdr;
  568         struct ctl_ha_msg_task  task;
  569         struct ctl_ha_msg_scsi  scsi;
  570         struct ctl_ha_msg_dt    dt;
  571         struct ctl_ha_msg_pr    pr;
  572         struct ctl_ha_msg_ua    ua;
  573         struct ctl_ha_msg_port  port;
  574         struct ctl_ha_msg_lun   lun;
  575         struct ctl_ha_msg_iid   iid;
  576         struct ctl_ha_msg_login login;
  577         struct ctl_ha_msg_mode  mode;
  578 };
  579 
  580 struct ctl_prio {
  581         struct ctl_io_hdr       io_hdr;
  582         struct ctl_ha_msg_pr    pr_msg;
  583 };
  584 
  585 union ctl_io {
  586         struct ctl_io_hdr       io_hdr; /* common to all I/O types */
  587         struct ctl_scsiio       scsiio; /* Normal SCSI commands */
  588         struct ctl_taskio       taskio; /* SCSI task management/reset */
  589         struct ctl_prio         presio; /* update per. res info on other SC */
  590 };
  591 
  592 #ifdef _KERNEL
  593 
  594 union ctl_io *ctl_alloc_io(void *pool_ref);
  595 union ctl_io *ctl_alloc_io_nowait(void *pool_ref);
  596 void ctl_free_io(union ctl_io *io);
  597 void ctl_zero_io(union ctl_io *io);
  598 
  599 #endif /* _KERNEL */
  600 
  601 #endif  /* _CTL_IO_H_ */
  602 
  603 /*
  604  * vim: ts=8
  605  */

Cache object: 7f01d02473cba078770e6daabf271d0d


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.