root/drivers/scsi/fnic/fcpio.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. fcpio_tag_id_enc
  2. fcpio_tag_id_dec
  3. fcpio_tag_exid_enc
  4. fcpio_tag_exid_dec
  5. fcpio_header_enc
  6. fcpio_header_dec
  7. fcpio_color_enc
  8. fcpio_color_dec

   1 /*
   2  * Copyright 2008 Cisco Systems, Inc.  All rights reserved.
   3  * Copyright 2007 Nuova Systems, Inc.  All rights reserved.
   4  *
   5  * This program is free software; you may redistribute it and/or modify
   6  * it under the terms of the GNU General Public License as published by
   7  * the Free Software Foundation; version 2 of the License.
   8  *
   9  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  10  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  11  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  12  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  13  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  14  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  15  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  16  * SOFTWARE.
  17  */
  18 #ifndef _FCPIO_H_
  19 #define _FCPIO_H_
  20 
  21 #include <linux/if_ether.h>
  22 
  23 /*
  24  * This header file includes all of the data structures used for
  25  * communication by the host driver to the fcp firmware.
  26  */
  27 
  28 /*
  29  * Exchange and sequence id space allocated to the host driver
  30  */
  31 #define FCPIO_HOST_EXCH_RANGE_START         0x1000
  32 #define FCPIO_HOST_EXCH_RANGE_END           0x1fff
  33 #define FCPIO_HOST_SEQ_ID_RANGE_START       0x80
  34 #define FCPIO_HOST_SEQ_ID_RANGE_END         0xff
  35 
  36 /*
  37  * Command entry type
  38  */
  39 enum fcpio_type {
  40         /*
  41          * Initiator request types
  42          */
  43         FCPIO_ICMND_16 = 0x1,
  44         FCPIO_ICMND_32,
  45         FCPIO_ICMND_CMPL,
  46         FCPIO_ITMF,
  47         FCPIO_ITMF_CMPL,
  48 
  49         /*
  50          * Target request types
  51          */
  52         FCPIO_TCMND_16 = 0x11,
  53         FCPIO_TCMND_32,
  54         FCPIO_TDATA,
  55         FCPIO_TXRDY,
  56         FCPIO_TRSP,
  57         FCPIO_TDRSP_CMPL,
  58         FCPIO_TTMF,
  59         FCPIO_TTMF_ACK,
  60         FCPIO_TABORT,
  61         FCPIO_TABORT_CMPL,
  62 
  63         /*
  64          * Misc request types
  65          */
  66         FCPIO_ACK = 0x20,
  67         FCPIO_RESET,
  68         FCPIO_RESET_CMPL,
  69         FCPIO_FLOGI_REG,
  70         FCPIO_FLOGI_REG_CMPL,
  71         FCPIO_ECHO,
  72         FCPIO_ECHO_CMPL,
  73         FCPIO_LUNMAP_CHNG,
  74         FCPIO_LUNMAP_REQ,
  75         FCPIO_LUNMAP_REQ_CMPL,
  76         FCPIO_FLOGI_FIP_REG,
  77         FCPIO_FLOGI_FIP_REG_CMPL,
  78 };
  79 
  80 /*
  81  * Header status codes from the firmware
  82  */
  83 enum fcpio_status {
  84         FCPIO_SUCCESS = 0,              /* request was successful */
  85 
  86         /*
  87          * If a request to the firmware is rejected, the original request
  88          * header will be returned with the status set to one of the following:
  89          */
  90         FCPIO_INVALID_HEADER,    /* header contains invalid data */
  91         FCPIO_OUT_OF_RESOURCE,   /* out of resources to complete request */
  92         FCPIO_INVALID_PARAM,     /* some parameter in request is invalid */
  93         FCPIO_REQ_NOT_SUPPORTED, /* request type is not supported */
  94         FCPIO_IO_NOT_FOUND,      /* requested I/O was not found */
  95 
  96         /*
  97          * Once a request is processed, the firmware will usually return
  98          * a cmpl message type.  In cases where errors occurred,
  99          * the header status field would be filled in with one of the following:
 100          */
 101         FCPIO_ABORTED = 0x41,     /* request was aborted */
 102         FCPIO_TIMEOUT,            /* request was timed out */
 103         FCPIO_SGL_INVALID,        /* request was aborted due to sgl error */
 104         FCPIO_MSS_INVALID,        /* request was aborted due to mss error */
 105         FCPIO_DATA_CNT_MISMATCH,  /* recv/sent more/less data than exp. */
 106         FCPIO_FW_ERR,             /* request was terminated due to fw error */
 107         FCPIO_ITMF_REJECTED,      /* itmf req was rejected by remote node */
 108         FCPIO_ITMF_FAILED,        /* itmf req was failed by remote node */
 109         FCPIO_ITMF_INCORRECT_LUN, /* itmf req targeted incorrect LUN */
 110         FCPIO_CMND_REJECTED,      /* request was invalid and rejected */
 111         FCPIO_NO_PATH_AVAIL,      /* no paths to the lun was available */
 112         FCPIO_PATH_FAILED,        /* i/o sent to current path failed */
 113         FCPIO_LUNMAP_CHNG_PEND,   /* i/o rejected due to lunmap change */
 114 };
 115 
 116 /*
 117  * The header command tag.  All host requests will use the "tag" field
 118  * to mark commands with a unique tag.  When the firmware responds to
 119  * a host request, it will copy the tag field into the response.
 120  *
 121  * The only firmware requests that will use the rx_id/ox_id fields instead
 122  * of the tag field will be the target command and target task management
 123  * requests.  These two requests do not have corresponding host requests
 124  * since they come directly from the FC initiator on the network.
 125  */
 126 struct fcpio_tag {
 127         union {
 128                 u32 req_id;
 129                 struct {
 130                         u16 rx_id;
 131                         u16 ox_id;
 132                 } ex_id;
 133         } u;
 134 };
 135 
 136 static inline void
 137 fcpio_tag_id_enc(struct fcpio_tag *tag, u32 id)
 138 {
 139         tag->u.req_id = id;
 140 }
 141 
 142 static inline void
 143 fcpio_tag_id_dec(struct fcpio_tag *tag, u32 *id)
 144 {
 145         *id = tag->u.req_id;
 146 }
 147 
 148 static inline void
 149 fcpio_tag_exid_enc(struct fcpio_tag *tag, u16 ox_id, u16 rx_id)
 150 {
 151         tag->u.ex_id.rx_id = rx_id;
 152         tag->u.ex_id.ox_id = ox_id;
 153 }
 154 
 155 static inline void
 156 fcpio_tag_exid_dec(struct fcpio_tag *tag, u16 *ox_id, u16 *rx_id)
 157 {
 158         *rx_id = tag->u.ex_id.rx_id;
 159         *ox_id = tag->u.ex_id.ox_id;
 160 }
 161 
 162 /*
 163  * The header for an fcpio request, whether from the firmware or from the
 164  * host driver
 165  */
 166 struct fcpio_header {
 167         u8            type;           /* enum fcpio_type */
 168         u8            status;         /* header status entry */
 169         u16           _resvd;         /* reserved */
 170         struct fcpio_tag    tag;      /* header tag */
 171 };
 172 
 173 static inline void
 174 fcpio_header_enc(struct fcpio_header *hdr,
 175                  u8 type, u8 status,
 176                  struct fcpio_tag tag)
 177 {
 178         hdr->type = type;
 179         hdr->status = status;
 180         hdr->_resvd = 0;
 181         hdr->tag = tag;
 182 }
 183 
 184 static inline void
 185 fcpio_header_dec(struct fcpio_header *hdr,
 186                  u8 *type, u8 *status,
 187                  struct fcpio_tag *tag)
 188 {
 189         *type = hdr->type;
 190         *status = hdr->status;
 191         *tag = hdr->tag;
 192 }
 193 
 194 #define CDB_16      16
 195 #define CDB_32      32
 196 #define LUN_ADDRESS 8
 197 
 198 /*
 199  * fcpio_icmnd_16: host -> firmware request
 200  *
 201  * used for sending out an initiator SCSI 16-byte command
 202  */
 203 struct fcpio_icmnd_16 {
 204         u32       lunmap_id;            /* index into lunmap table */
 205         u8        special_req_flags;    /* special exchange request flags */
 206         u8        _resvd0[3];           /* reserved */
 207         u32       sgl_cnt;              /* scatter-gather list count */
 208         u32       sense_len;            /* sense buffer length */
 209         u64       sgl_addr;             /* scatter-gather list addr */
 210         u64       sense_addr;           /* sense buffer address */
 211         u8        crn;                  /* SCSI Command Reference No. */
 212         u8        pri_ta;               /* SCSI Priority and Task attribute */
 213         u8        _resvd1;              /* reserved: should be 0 */
 214         u8        flags;                /* command flags */
 215         u8        scsi_cdb[CDB_16];     /* SCSI Cmnd Descriptor Block */
 216         u32       data_len;             /* length of data expected */
 217         u8        lun[LUN_ADDRESS];     /* FC vNIC only: LUN address */
 218         u8        _resvd2;              /* reserved */
 219         u8        d_id[3];              /* FC vNIC only: Target D_ID */
 220         u16       mss;                  /* FC vNIC only: max burst */
 221         u16       _resvd3;              /* reserved */
 222         u32       r_a_tov;              /* FC vNIC only: Res. Alloc Timeout */
 223         u32       e_d_tov;              /* FC vNIC only: Err Detect Timeout */
 224 };
 225 
 226 /*
 227  * Special request flags
 228  */
 229 #define FCPIO_ICMND_SRFLAG_RETRY 0x01   /* Enable Retry handling on exchange */
 230 
 231 /*
 232  * Priority/Task Attribute settings
 233  */
 234 #define FCPIO_ICMND_PTA_SIMPLE      0   /* simple task attribute */
 235 #define FCPIO_ICMND_PTA_HEADQ       1   /* head of queue task attribute */
 236 #define FCPIO_ICMND_PTA_ORDERED     2   /* ordered task attribute */
 237 #define FCPIO_ICMND_PTA_ACA         4   /* auto contingent allegiance */
 238 #define FCPIO_ICMND_PRI_SHIFT       3   /* priority field starts in bit 3 */
 239 
 240 /*
 241  * Command flags
 242  */
 243 #define FCPIO_ICMND_RDDATA      0x02    /* read data */
 244 #define FCPIO_ICMND_WRDATA      0x01    /* write data */
 245 
 246 /*
 247  * fcpio_icmnd_32: host -> firmware request
 248  *
 249  * used for sending out an initiator SCSI 32-byte command
 250  */
 251 struct fcpio_icmnd_32 {
 252         u32   lunmap_id;              /* index into lunmap table */
 253         u8    special_req_flags;      /* special exchange request flags */
 254         u8    _resvd0[3];             /* reserved */
 255         u32   sgl_cnt;                /* scatter-gather list count */
 256         u32   sense_len;              /* sense buffer length */
 257         u64   sgl_addr;               /* scatter-gather list addr */
 258         u64   sense_addr;             /* sense buffer address */
 259         u8    crn;                    /* SCSI Command Reference No. */
 260         u8    pri_ta;                 /* SCSI Priority and Task attribute */
 261         u8    _resvd1;                /* reserved: should be 0 */
 262         u8    flags;                  /* command flags */
 263         u8    scsi_cdb[CDB_32];       /* SCSI Cmnd Descriptor Block */
 264         u32   data_len;               /* length of data expected */
 265         u8    lun[LUN_ADDRESS];       /* FC vNIC only: LUN address */
 266         u8    _resvd2;                /* reserved */
 267         u8    d_id[3];                /* FC vNIC only: Target D_ID */
 268         u16   mss;                    /* FC vNIC only: max burst */
 269         u16   _resvd3;                /* reserved */
 270         u32   r_a_tov;                /* FC vNIC only: Res. Alloc Timeout */
 271         u32   e_d_tov;                /* FC vNIC only: Error Detect Timeout */
 272 };
 273 
 274 /*
 275  * fcpio_itmf: host -> firmware request
 276  *
 277  * used for requesting the firmware to abort a request and/or send out
 278  * a task management function
 279  *
 280  * The t_tag field is only needed when the request type is ABT_TASK.
 281  */
 282 struct fcpio_itmf {
 283         u32   lunmap_id;              /* index into lunmap table */
 284         u32   tm_req;                 /* SCSI Task Management request */
 285         u32   t_tag;                  /* header tag of fcpio to be aborted */
 286         u32   _resvd;                 /* _reserved */
 287         u8    lun[LUN_ADDRESS];       /* FC vNIC only: LUN address */
 288         u8    _resvd1;                /* reserved */
 289         u8    d_id[3];                /* FC vNIC only: Target D_ID */
 290         u32   r_a_tov;                /* FC vNIC only: R_A_TOV in msec */
 291         u32   e_d_tov;                /* FC vNIC only: E_D_TOV in msec */
 292 };
 293 
 294 /*
 295  * Task Management request
 296  */
 297 enum fcpio_itmf_tm_req_type {
 298         FCPIO_ITMF_ABT_TASK_TERM = 0x01,    /* abort task and terminate */
 299         FCPIO_ITMF_ABT_TASK,                /* abort task and issue abts */
 300         FCPIO_ITMF_ABT_TASK_SET,            /* abort task set */
 301         FCPIO_ITMF_CLR_TASK_SET,            /* clear task set */
 302         FCPIO_ITMF_LUN_RESET,               /* logical unit reset task mgmt */
 303         FCPIO_ITMF_CLR_ACA,                 /* Clear ACA condition */
 304 };
 305 
 306 /*
 307  * fcpio_tdata: host -> firmware request
 308  *
 309  * used for requesting the firmware to send out a read data transfer for a
 310  * target command
 311  */
 312 struct fcpio_tdata {
 313         u16   rx_id;                  /* FC rx_id of target command */
 314         u16   flags;                  /* command flags */
 315         u32   rel_offset;             /* data sequence relative offset */
 316         u32   sgl_cnt;                /* scatter-gather list count */
 317         u32   data_len;               /* length of data expected to send */
 318         u64   sgl_addr;               /* scatter-gather list address */
 319 };
 320 
 321 /*
 322  * Command flags
 323  */
 324 #define FCPIO_TDATA_SCSI_RSP    0x01    /* send a scsi resp. after last frame */
 325 
 326 /*
 327  * fcpio_txrdy: host -> firmware request
 328  *
 329  * used for requesting the firmware to send out a write data transfer for a
 330  * target command
 331  */
 332 struct fcpio_txrdy {
 333         u16   rx_id;                  /* FC rx_id of target command */
 334         u16   _resvd0;                /* reserved */
 335         u32   rel_offset;             /* data sequence relative offset */
 336         u32   sgl_cnt;                /* scatter-gather list count */
 337         u32   data_len;               /* length of data expected to send */
 338         u64   sgl_addr;               /* scatter-gather list address */
 339 };
 340 
 341 /*
 342  * fcpio_trsp: host -> firmware request
 343  *
 344  * used for requesting the firmware to send out a response for a target
 345  * command
 346  */
 347 struct fcpio_trsp {
 348         u16   rx_id;                  /* FC rx_id of target command */
 349         u16   _resvd0;                /* reserved */
 350         u32   sense_len;              /* sense data buffer length */
 351         u64   sense_addr;             /* sense data buffer address */
 352         u16   _resvd1;                /* reserved */
 353         u8    flags;                  /* response request flags */
 354         u8    scsi_status;            /* SCSI status */
 355         u32   residual;               /* SCSI data residual value of I/O */
 356 };
 357 
 358 /*
 359  * resposnse request flags
 360  */
 361 #define FCPIO_TRSP_RESID_UNDER  0x08   /* residual is valid and is underflow */
 362 #define FCPIO_TRSP_RESID_OVER   0x04   /* residual is valid and is overflow */
 363 
 364 /*
 365  * fcpio_ttmf_ack: host -> firmware response
 366  *
 367  * used by the host to indicate to the firmware it has received and processed
 368  * the target tmf request
 369  */
 370 struct fcpio_ttmf_ack {
 371         u16   rx_id;                  /* FC rx_id of target command */
 372         u16   _resvd0;                /* reserved */
 373         u32   tmf_status;             /* SCSI task management status */
 374 };
 375 
 376 /*
 377  * fcpio_tabort: host -> firmware request
 378  *
 379  * used by the host to request the firmware to abort a target request that was
 380  * received by the firmware
 381  */
 382 struct fcpio_tabort {
 383         u16   rx_id;                  /* rx_id of the target request */
 384 };
 385 
 386 /*
 387  * fcpio_reset: host -> firmware request
 388  *
 389  * used by the host to signal a reset of the driver to the firmware
 390  * and to request firmware to clean up all outstanding I/O
 391  */
 392 struct fcpio_reset {
 393         u32   _resvd;
 394 };
 395 
 396 enum fcpio_flogi_reg_format_type {
 397         FCPIO_FLOGI_REG_DEF_DEST = 0,    /* Use the oui | s_id mac format */
 398         FCPIO_FLOGI_REG_GW_DEST,         /* Use the fixed gateway mac */
 399 };
 400 
 401 /*
 402  * fcpio_flogi_reg: host -> firmware request
 403  *
 404  * fc vnic only
 405  * used by the host to notify the firmware of the lif's s_id
 406  * and destination mac address format
 407  */
 408 struct fcpio_flogi_reg {
 409         u8 format;
 410         u8 s_id[3];                     /* FC vNIC only: Source S_ID */
 411         u8 gateway_mac[ETH_ALEN];       /* Destination gateway mac */
 412         u16 _resvd;
 413         u32 r_a_tov;                    /* R_A_TOV in msec */
 414         u32 e_d_tov;                    /* E_D_TOV in msec */
 415 };
 416 
 417 /*
 418  * fcpio_echo: host -> firmware request
 419  *
 420  * sends a heartbeat echo request to the firmware
 421  */
 422 struct fcpio_echo {
 423         u32 _resvd;
 424 };
 425 
 426 /*
 427  * fcpio_lunmap_req: host -> firmware request
 428  *
 429  * scsi vnic only
 430  * sends a request to retrieve the lunmap table for scsi vnics
 431  */
 432 struct fcpio_lunmap_req {
 433         u64 addr;                     /* address of the buffer */
 434         u32 len;                      /* len of the buffer */
 435 };
 436 
 437 /*
 438  * fcpio_flogi_fip_reg: host -> firmware request
 439  *
 440  * fc vnic only
 441  * used by the host to notify the firmware of the lif's s_id
 442  * and destination mac address format
 443  */
 444 struct fcpio_flogi_fip_reg {
 445         u8    _resvd0;
 446         u8     s_id[3];               /* FC vNIC only: Source S_ID */
 447         u8     fcf_mac[ETH_ALEN];     /* FCF Target destination mac */
 448         u16   _resvd1;
 449         u32   r_a_tov;                /* R_A_TOV in msec */
 450         u32   e_d_tov;                /* E_D_TOV in msec */
 451         u8    ha_mac[ETH_ALEN];       /* Host adapter source mac */
 452         u16   _resvd2;
 453 };
 454 
 455 /*
 456  * Basic structure for all fcpio structures that are sent from the host to the
 457  * firmware.  They are 128 bytes per structure.
 458  */
 459 #define FCPIO_HOST_REQ_LEN      128     /* expected length of host requests */
 460 
 461 struct fcpio_host_req {
 462         struct fcpio_header hdr;
 463 
 464         union {
 465                 /*
 466                  * Defines space needed for request
 467                  */
 468                 u8 buf[FCPIO_HOST_REQ_LEN - sizeof(struct fcpio_header)];
 469 
 470                 /*
 471                  * Initiator host requests
 472                  */
 473                 struct fcpio_icmnd_16               icmnd_16;
 474                 struct fcpio_icmnd_32               icmnd_32;
 475                 struct fcpio_itmf                   itmf;
 476 
 477                 /*
 478                  * Target host requests
 479                  */
 480                 struct fcpio_tdata                  tdata;
 481                 struct fcpio_txrdy                  txrdy;
 482                 struct fcpio_trsp                   trsp;
 483                 struct fcpio_ttmf_ack               ttmf_ack;
 484                 struct fcpio_tabort                 tabort;
 485 
 486                 /*
 487                  * Misc requests
 488                  */
 489                 struct fcpio_reset                  reset;
 490                 struct fcpio_flogi_reg              flogi_reg;
 491                 struct fcpio_echo                   echo;
 492                 struct fcpio_lunmap_req             lunmap_req;
 493                 struct fcpio_flogi_fip_reg          flogi_fip_reg;
 494         } u;
 495 };
 496 
 497 /*
 498  * fcpio_icmnd_cmpl: firmware -> host response
 499  *
 500  * used for sending the host a response to an initiator command
 501  */
 502 struct fcpio_icmnd_cmpl {
 503         u8    _resvd0[6];             /* reserved */
 504         u8    flags;                  /* response flags */
 505         u8    scsi_status;            /* SCSI status */
 506         u32   residual;               /* SCSI data residual length */
 507         u32   sense_len;              /* SCSI sense length */
 508 };
 509 
 510 /*
 511  * response flags
 512  */
 513 #define FCPIO_ICMND_CMPL_RESID_UNDER    0x08    /* resid under and valid */
 514 #define FCPIO_ICMND_CMPL_RESID_OVER     0x04    /* resid over and valid */
 515 
 516 /*
 517  * fcpio_itmf_cmpl: firmware -> host response
 518  *
 519  * used for sending the host a response for a itmf request
 520  */
 521 struct fcpio_itmf_cmpl {
 522         u32    _resvd;                /* reserved */
 523 };
 524 
 525 /*
 526  * fcpio_tcmnd_16: firmware -> host request
 527  *
 528  * used by the firmware to notify the host of an incoming target SCSI 16-Byte
 529  * request
 530  */
 531 struct fcpio_tcmnd_16 {
 532         u8    lun[LUN_ADDRESS];       /* FC vNIC only: LUN address */
 533         u8    crn;                    /* SCSI Command Reference No. */
 534         u8    pri_ta;                 /* SCSI Priority and Task attribute */
 535         u8    _resvd2;                /* reserved: should be 0 */
 536         u8    flags;                  /* command flags */
 537         u8    scsi_cdb[CDB_16];       /* SCSI Cmnd Descriptor Block */
 538         u32   data_len;               /* length of data expected */
 539         u8    _resvd1;                /* reserved */
 540         u8    s_id[3];                /* FC vNIC only: Source S_ID */
 541 };
 542 
 543 /*
 544  * Priority/Task Attribute settings
 545  */
 546 #define FCPIO_TCMND_PTA_SIMPLE      0   /* simple task attribute */
 547 #define FCPIO_TCMND_PTA_HEADQ       1   /* head of queue task attribute */
 548 #define FCPIO_TCMND_PTA_ORDERED     2   /* ordered task attribute */
 549 #define FCPIO_TCMND_PTA_ACA         4   /* auto contingent allegiance */
 550 #define FCPIO_TCMND_PRI_SHIFT       3   /* priority field starts in bit 3 */
 551 
 552 /*
 553  * Command flags
 554  */
 555 #define FCPIO_TCMND_RDDATA      0x02    /* read data */
 556 #define FCPIO_TCMND_WRDATA      0x01    /* write data */
 557 
 558 /*
 559  * fcpio_tcmnd_32: firmware -> host request
 560  *
 561  * used by the firmware to notify the host of an incoming target SCSI 32-Byte
 562  * request
 563  */
 564 struct fcpio_tcmnd_32 {
 565         u8    lun[LUN_ADDRESS];       /* FC vNIC only: LUN address */
 566         u8    crn;                    /* SCSI Command Reference No. */
 567         u8    pri_ta;                 /* SCSI Priority and Task attribute */
 568         u8    _resvd2;                /* reserved: should be 0 */
 569         u8    flags;                  /* command flags */
 570         u8    scsi_cdb[CDB_32];       /* SCSI Cmnd Descriptor Block */
 571         u32   data_len;               /* length of data expected */
 572         u8    _resvd0;                /* reserved */
 573         u8    s_id[3];                /* FC vNIC only: Source S_ID */
 574 };
 575 
 576 /*
 577  * fcpio_tdrsp_cmpl: firmware -> host response
 578  *
 579  * used by the firmware to notify the host of a response to a host target
 580  * command
 581  */
 582 struct fcpio_tdrsp_cmpl {
 583         u16   rx_id;                  /* rx_id of the target request */
 584         u16   _resvd0;                /* reserved */
 585 };
 586 
 587 /*
 588  * fcpio_ttmf: firmware -> host request
 589  *
 590  * used by the firmware to notify the host of an incoming task management
 591  * function request
 592  */
 593 struct fcpio_ttmf {
 594         u8    _resvd0;                /* reserved */
 595         u8    s_id[3];                /* FC vNIC only: Source S_ID */
 596         u8    lun[LUN_ADDRESS];       /* FC vNIC only: LUN address */
 597         u8    crn;                    /* SCSI Command Reference No. */
 598         u8    _resvd2[3];             /* reserved */
 599         u32   tmf_type;               /* task management request type */
 600 };
 601 
 602 /*
 603  * Task Management request
 604  */
 605 #define FCPIO_TTMF_CLR_ACA      0x40    /* Clear ACA condition */
 606 #define FCPIO_TTMF_LUN_RESET    0x10    /* logical unit reset task mgmt */
 607 #define FCPIO_TTMF_CLR_TASK_SET 0x04    /* clear task set */
 608 #define FCPIO_TTMF_ABT_TASK_SET 0x02    /* abort task set */
 609 #define FCPIO_TTMF_ABT_TASK     0x01    /* abort task */
 610 
 611 /*
 612  * fcpio_tabort_cmpl: firmware -> host response
 613  *
 614  * used by the firmware to respond to a host's tabort request
 615  */
 616 struct fcpio_tabort_cmpl {
 617         u16   rx_id;                  /* rx_id of the target request */
 618         u16   _resvd0;                /* reserved */
 619 };
 620 
 621 /*
 622  * fcpio_ack: firmware -> host response
 623  *
 624  * used by firmware to notify the host of the last work request received
 625  */
 626 struct fcpio_ack {
 627         u16  request_out;             /* last host entry received */
 628         u16  _resvd;
 629 };
 630 
 631 /*
 632  * fcpio_reset_cmpl: firmware -> host response
 633  *
 634  * use by firmware to respond to the host's reset request
 635  */
 636 struct fcpio_reset_cmpl {
 637         u16   vnic_id;
 638 };
 639 
 640 /*
 641  * fcpio_flogi_reg_cmpl: firmware -> host response
 642  *
 643  * fc vnic only
 644  * response to the fcpio_flogi_reg request
 645  */
 646 struct fcpio_flogi_reg_cmpl {
 647         u32 _resvd;
 648 };
 649 
 650 /*
 651  * fcpio_echo_cmpl: firmware -> host response
 652  *
 653  * response to the fcpio_echo request
 654  */
 655 struct fcpio_echo_cmpl {
 656         u32 _resvd;
 657 };
 658 
 659 /*
 660  * fcpio_lunmap_chng: firmware -> host notification
 661  *
 662  * scsi vnic only
 663  * notifies the host that the lunmap tables have changed
 664  */
 665 struct fcpio_lunmap_chng {
 666         u32 _resvd;
 667 };
 668 
 669 /*
 670  * fcpio_lunmap_req_cmpl: firmware -> host response
 671  *
 672  * scsi vnic only
 673  * response for lunmap table request from the host
 674  */
 675 struct fcpio_lunmap_req_cmpl {
 676         u32 _resvd;
 677 };
 678 
 679 /*
 680  * Basic structure for all fcpio structures that are sent from the firmware to
 681  * the host.  They are 64 bytes per structure.
 682  */
 683 #define FCPIO_FW_REQ_LEN        64      /* expected length of fw requests */
 684 struct fcpio_fw_req {
 685         struct fcpio_header hdr;
 686 
 687         union {
 688                 /*
 689                  * Defines space needed for request
 690                  */
 691                 u8 buf[FCPIO_FW_REQ_LEN - sizeof(struct fcpio_header)];
 692 
 693                 /*
 694                  * Initiator firmware responses
 695                  */
 696                 struct fcpio_icmnd_cmpl         icmnd_cmpl;
 697                 struct fcpio_itmf_cmpl          itmf_cmpl;
 698 
 699                 /*
 700                  * Target firmware new requests
 701                  */
 702                 struct fcpio_tcmnd_16           tcmnd_16;
 703                 struct fcpio_tcmnd_32           tcmnd_32;
 704 
 705                 /*
 706                  * Target firmware responses
 707                  */
 708                 struct fcpio_tdrsp_cmpl         tdrsp_cmpl;
 709                 struct fcpio_ttmf               ttmf;
 710                 struct fcpio_tabort_cmpl        tabort_cmpl;
 711 
 712                 /*
 713                  * Firmware response to work received
 714                  */
 715                 struct fcpio_ack                ack;
 716 
 717                 /*
 718                  * Misc requests
 719                  */
 720                 struct fcpio_reset_cmpl         reset_cmpl;
 721                 struct fcpio_flogi_reg_cmpl     flogi_reg_cmpl;
 722                 struct fcpio_echo_cmpl          echo_cmpl;
 723                 struct fcpio_lunmap_chng        lunmap_chng;
 724                 struct fcpio_lunmap_req_cmpl    lunmap_req_cmpl;
 725         } u;
 726 };
 727 
 728 /*
 729  * Access routines to encode and decode the color bit, which is the most
 730  * significant bit of the MSB of the structure
 731  */
 732 static inline void fcpio_color_enc(struct fcpio_fw_req *fw_req, u8 color)
 733 {
 734         u8 *c = ((u8 *) fw_req) + sizeof(struct fcpio_fw_req) - 1;
 735 
 736         if (color)
 737                 *c |= 0x80;
 738         else
 739                 *c &= ~0x80;
 740 }
 741 
 742 static inline void fcpio_color_dec(struct fcpio_fw_req *fw_req, u8 *color)
 743 {
 744         u8 *c = ((u8 *) fw_req) + sizeof(struct fcpio_fw_req) - 1;
 745 
 746         *color = *c >> 7;
 747 
 748         /*
 749          * Make sure color bit is read from desc *before* other fields
 750          * are read from desc.  Hardware guarantees color bit is last
 751          * bit (byte) written.  Adding the rmb() prevents the compiler
 752          * and/or CPU from reordering the reads which would potentially
 753          * result in reading stale values.
 754          */
 755 
 756         rmb();
 757 
 758 }
 759 
 760 /*
 761  * Lunmap table entry for scsi vnics
 762  */
 763 #define FCPIO_LUNMAP_TABLE_SIZE     256
 764 #define FCPIO_FLAGS_LUNMAP_VALID    0x80
 765 #define FCPIO_FLAGS_BOOT            0x01
 766 struct fcpio_lunmap_entry {
 767         u8    bus;
 768         u8    target;
 769         u8    lun;
 770         u8    path_cnt;
 771         u16   flags;
 772         u16   update_cnt;
 773 };
 774 
 775 struct fcpio_lunmap_tbl {
 776         u32                   update_cnt;
 777         struct fcpio_lunmap_entry   lunmaps[FCPIO_LUNMAP_TABLE_SIZE];
 778 };
 779 
 780 #endif /* _FCPIO_H_ */

/* [<][>][^][v][top][bottom][index][help] */