]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/scsi/lpfc/lpfc_sli.h
ibmveth: Remove use of bitfields
[linux-2.6-omap-h63xx.git] / drivers / scsi / lpfc / lpfc_sli.h
index a43549959dc7bb45bd9ebabcd8121afdcf201a00..51b2b6b949be498fa710b2cecee55a3be5b9b3f6 100644 (file)
@@ -1,7 +1,7 @@
 /*******************************************************************
  * This file is part of the Emulex Linux Device Driver for         *
  * Fibre Channel Host Bus Adapters.                                *
- * Copyright (C) 2004-2006 Emulex.  All rights reserved.           *
+ * Copyright (C) 2004-2007 Emulex.  All rights reserved.           *
  * EMULEX and SLI are trademarks of Emulex.                        *
  * www.emulex.com                                                  *
  *                                                                 *
 
 /* forward declaration for LPFC_IOCB_t's use */
 struct lpfc_hba;
+struct lpfc_vport;
 
 /* Define the context types that SLI handles for abort and sums. */
 typedef enum _lpfc_ctx_cmd {
        LPFC_CTX_LUN,
        LPFC_CTX_TGT,
-       LPFC_CTX_CTX,
        LPFC_CTX_HOST
 } lpfc_ctx_cmd;
 
@@ -39,22 +39,28 @@ struct lpfc_iocbq {
        IOCB_t iocb;            /* IOCB cmd */
        uint8_t retry;          /* retry counter for IOCB cmd - if needed */
        uint8_t iocb_flag;
-#define LPFC_IO_LIBDFC 1       /* libdfc iocb */
-#define LPFC_IO_WAKE   2       /* High Priority Queue signal flag */
-#define LPFC_IO_FCP    4       /* FCP command -- iocbq in scsi_buf */
+#define LPFC_IO_LIBDFC         1       /* libdfc iocb */
+#define LPFC_IO_WAKE           2       /* High Priority Queue signal flag */
+#define LPFC_IO_FCP            4       /* FCP command -- iocbq in scsi_buf */
+#define LPFC_DRIVER_ABORTED    8       /* driver aborted this request */
+#define LPFC_IO_FABRIC         0x10    /* Iocb send using fabric scheduler */
 
        uint8_t abort_count;
        uint8_t rsvd2;
        uint32_t drvrTimeout;   /* driver timeout in seconds */
+       struct lpfc_vport *vport;/* virtual port pointer */
        void *context1;         /* caller context information */
        void *context2;         /* caller context information */
        void *context3;         /* caller context information */
        union {
-               wait_queue_head_t  *wait_queue;
-               struct lpfc_iocbq  *rsp_iocb;
-               struct lpfcMboxq   *mbox;
+               wait_queue_head_t    *wait_queue;
+               struct lpfc_iocbq    *rsp_iocb;
+               struct lpfcMboxq     *mbox;
+               struct lpfc_nodelist *ndlp;
        } context_un;
 
+       void (*fabric_iocb_cmpl) (struct lpfc_hba *, struct lpfc_iocbq *,
+                          struct lpfc_iocbq *);
        void (*iocb_cmpl) (struct lpfc_hba *, struct lpfc_iocbq *,
                           struct lpfc_iocbq *);
 
@@ -67,14 +73,19 @@ struct lpfc_iocbq {
 #define IOCB_ERROR          2
 #define IOCB_TIMEDOUT       3
 
+#define LPFC_MBX_WAKE          1
+#define LPFC_MBX_IMED_UNREG    2
+
 typedef struct lpfcMboxq {
        /* MBOXQs are used in single linked lists */
        struct list_head list;  /* ptr to next mailbox command */
        MAILBOX_t mb;           /* Mailbox cmd */
+       struct lpfc_vport *vport;/* virutal port pointer */
        void *context1;         /* caller context information */
        void *context2;         /* caller context information */
 
        void (*mbox_cmpl) (struct lpfc_hba *, struct lpfcMboxq *);
+       uint8_t mbox_flag;
 
 } LPFC_MBOXQ_t;
 
@@ -131,6 +142,8 @@ struct lpfc_sli_ring {
        uint8_t ringno;         /* ring number */
        uint16_t numCiocb;      /* number of command iocb's per ring */
        uint16_t numRiocb;      /* number of rsp iocb's per ring */
+       uint16_t sizeCiocb;     /* Size of command iocb's in this ring */
+       uint16_t sizeRiocb;     /* Size of response iocb's in this ring */
 
        uint32_t fast_iotag;    /* max fastlookup based iotag           */
        uint32_t iotag_ctr;     /* keeps track of the next iotag to use */
@@ -161,6 +174,34 @@ struct lpfc_sli_ring {
                                        struct lpfc_sli_ring *);
 };
 
+/* Structure used for configuring rings to a specific profile or rctl / type */
+struct lpfc_hbq_init {
+       uint32_t rn;            /* Receive buffer notification */
+       uint32_t entry_count;   /* max # of entries in HBQ */
+       uint32_t headerLen;     /* 0 if not profile 4 or 5 */
+       uint32_t logEntry;      /* Set to 1 if this HBQ used for LogEntry */
+       uint32_t profile;       /* Selection profile 0=all, 7=logentry */
+       uint32_t ring_mask;     /* Binds HBQ to a ring e.g. Ring0=b0001,
+                                * ring2=b0100 */
+       uint32_t hbq_index;     /* index of this hbq in ring .HBQs[] */
+
+       uint32_t seqlenoff;
+       uint32_t maxlen;
+       uint32_t seqlenbcnt;
+       uint32_t cmdcodeoff;
+       uint32_t cmdmatch[8];
+       uint32_t mask_count;    /* number of mask entries in prt array */
+       struct hbq_mask hbqMasks[6];
+
+       /* Non-config rings fields to keep track of buffer allocations */
+       uint32_t buffer_count;  /* number of buffers allocated */
+       uint32_t init_count;    /* number to allocate when initialized */
+       uint32_t add_count;     /* number to allocate when starved */
+} ;
+
+#define LPFC_MAX_HBQ 16
+
+
 /* Structure used to hold SLI statistical counters and info */
 struct lpfc_sli_stat {
        uint64_t mbox_stat_err;  /* Mbox cmds completed status error */
@@ -193,6 +234,7 @@ struct lpfc_sli {
 #define LPFC_SLI_MBOX_ACTIVE      0x100        /* HBA mailbox is currently active */
 #define LPFC_SLI2_ACTIVE          0x200        /* SLI2 overlay in firmware is active */
 #define LPFC_PROCESS_LA           0x400        /* Able to process link attention */
+#define LPFC_BLOCK_MGMT_IO        0x800        /* Don't allow mgmt mbx or iocb cmds */
 
        struct lpfc_sli_ring ring[LPFC_MAX_RING];
        int fcp_ring;           /* ring used for FCP initiator commands */
@@ -205,6 +247,7 @@ struct lpfc_sli {
        uint16_t mboxq_cnt;     /* current length of queue */
        uint16_t mboxq_max;     /* max length */
        LPFC_MBOXQ_t *mbox_active;      /* active mboxq information */
+       struct list_head mboxq_cmpl;
 
        struct timer_list mbox_tmo;     /* Hold clk to timeout active mbox
                                           cmd */
@@ -217,12 +260,6 @@ struct lpfc_sli {
        struct lpfc_lnk_stat lnk_stat_offsets;
 };
 
-/* Given a pointer to the start of the ring, and the slot number of
- * the desired iocb entry, calc a pointer to that entry.
- * (assume iocb entry size is 32 bytes, or 8 words)
- */
-#define IOCB_ENTRY(ring,slot) ((IOCB_t *)(((char *)(ring)) + ((slot) * 32)))
-
 #define LPFC_MBOX_TMO           30     /* Sec tmo for outstanding mbox
                                           command */
 #define LPFC_MBOX_TMO_FLASH_CMD 300     /* Sec tmo for outstanding FLASH write