diff options
Diffstat (limited to 'drivers/scsi/lpfc/lpfc.h')
-rw-r--r-- | drivers/scsi/lpfc/lpfc.h | 123 |
1 files changed, 114 insertions, 9 deletions
diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h index 1105f9a111ba..540569849099 100644 --- a/drivers/scsi/lpfc/lpfc.h +++ b/drivers/scsi/lpfc/lpfc.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************* | 1 | /******************************************************************* |
2 | * This file is part of the Emulex Linux Device Driver for * | 2 | * This file is part of the Emulex Linux Device Driver for * |
3 | * Fibre Channel Host Bus Adapters. * | 3 | * Fibre Channel Host Bus Adapters. * |
4 | * Copyright (C) 2004-2008 Emulex. All rights reserved. * | 4 | * Copyright (C) 2004-2009 Emulex. All rights reserved. * |
5 | * EMULEX and SLI are trademarks of Emulex. * | 5 | * EMULEX and SLI are trademarks of Emulex. * |
6 | * www.emulex.com * | 6 | * www.emulex.com * |
7 | * Portions Copyright (C) 2004-2005 Christoph Hellwig * | 7 | * Portions Copyright (C) 2004-2005 Christoph Hellwig * |
@@ -23,6 +23,13 @@ | |||
23 | 23 | ||
24 | struct lpfc_sli2_slim; | 24 | struct lpfc_sli2_slim; |
25 | 25 | ||
26 | #define LPFC_PCI_DEV_LP 0x1 | ||
27 | #define LPFC_PCI_DEV_OC 0x2 | ||
28 | |||
29 | #define LPFC_SLI_REV2 2 | ||
30 | #define LPFC_SLI_REV3 3 | ||
31 | #define LPFC_SLI_REV4 4 | ||
32 | |||
26 | #define LPFC_MAX_TARGET 4096 /* max number of targets supported */ | 33 | #define LPFC_MAX_TARGET 4096 /* max number of targets supported */ |
27 | #define LPFC_MAX_DISC_THREADS 64 /* max outstanding discovery els | 34 | #define LPFC_MAX_DISC_THREADS 64 /* max outstanding discovery els |
28 | requests */ | 35 | requests */ |
@@ -98,9 +105,11 @@ struct lpfc_dma_pool { | |||
98 | }; | 105 | }; |
99 | 106 | ||
100 | struct hbq_dmabuf { | 107 | struct hbq_dmabuf { |
108 | struct lpfc_dmabuf hbuf; | ||
101 | struct lpfc_dmabuf dbuf; | 109 | struct lpfc_dmabuf dbuf; |
102 | uint32_t size; | 110 | uint32_t size; |
103 | uint32_t tag; | 111 | uint32_t tag; |
112 | struct lpfc_rcqe rcqe; | ||
104 | }; | 113 | }; |
105 | 114 | ||
106 | /* Priority bit. Set value to exceed low water mark in lpfc_mem. */ | 115 | /* Priority bit. Set value to exceed low water mark in lpfc_mem. */ |
@@ -134,7 +143,10 @@ typedef struct lpfc_vpd { | |||
134 | } rev; | 143 | } rev; |
135 | struct { | 144 | struct { |
136 | #ifdef __BIG_ENDIAN_BITFIELD | 145 | #ifdef __BIG_ENDIAN_BITFIELD |
137 | uint32_t rsvd2 :24; /* Reserved */ | 146 | uint32_t rsvd3 :19; /* Reserved */ |
147 | uint32_t cdss : 1; /* Configure Data Security SLI */ | ||
148 | uint32_t rsvd2 : 3; /* Reserved */ | ||
149 | uint32_t cbg : 1; /* Configure BlockGuard */ | ||
138 | uint32_t cmv : 1; /* Configure Max VPIs */ | 150 | uint32_t cmv : 1; /* Configure Max VPIs */ |
139 | uint32_t ccrp : 1; /* Config Command Ring Polling */ | 151 | uint32_t ccrp : 1; /* Config Command Ring Polling */ |
140 | uint32_t csah : 1; /* Configure Synchronous Abort Handling */ | 152 | uint32_t csah : 1; /* Configure Synchronous Abort Handling */ |
@@ -152,7 +164,10 @@ typedef struct lpfc_vpd { | |||
152 | uint32_t csah : 1; /* Configure Synchronous Abort Handling */ | 164 | uint32_t csah : 1; /* Configure Synchronous Abort Handling */ |
153 | uint32_t ccrp : 1; /* Config Command Ring Polling */ | 165 | uint32_t ccrp : 1; /* Config Command Ring Polling */ |
154 | uint32_t cmv : 1; /* Configure Max VPIs */ | 166 | uint32_t cmv : 1; /* Configure Max VPIs */ |
155 | uint32_t rsvd2 :24; /* Reserved */ | 167 | uint32_t cbg : 1; /* Configure BlockGuard */ |
168 | uint32_t rsvd2 : 3; /* Reserved */ | ||
169 | uint32_t cdss : 1; /* Configure Data Security SLI */ | ||
170 | uint32_t rsvd3 :19; /* Reserved */ | ||
156 | #endif | 171 | #endif |
157 | } sli3Feat; | 172 | } sli3Feat; |
158 | } lpfc_vpd_t; | 173 | } lpfc_vpd_t; |
@@ -264,8 +279,8 @@ enum hba_state { | |||
264 | }; | 279 | }; |
265 | 280 | ||
266 | struct lpfc_vport { | 281 | struct lpfc_vport { |
267 | struct list_head listentry; | ||
268 | struct lpfc_hba *phba; | 282 | struct lpfc_hba *phba; |
283 | struct list_head listentry; | ||
269 | uint8_t port_type; | 284 | uint8_t port_type; |
270 | #define LPFC_PHYSICAL_PORT 1 | 285 | #define LPFC_PHYSICAL_PORT 1 |
271 | #define LPFC_NPIV_PORT 2 | 286 | #define LPFC_NPIV_PORT 2 |
@@ -273,6 +288,9 @@ struct lpfc_vport { | |||
273 | enum discovery_state port_state; | 288 | enum discovery_state port_state; |
274 | 289 | ||
275 | uint16_t vpi; | 290 | uint16_t vpi; |
291 | uint16_t vfi; | ||
292 | uint8_t vfi_state; | ||
293 | #define LPFC_VFI_REGISTERED 0x1 | ||
276 | 294 | ||
277 | uint32_t fc_flag; /* FC flags */ | 295 | uint32_t fc_flag; /* FC flags */ |
278 | /* Several of these flags are HBA centric and should be moved to | 296 | /* Several of these flags are HBA centric and should be moved to |
@@ -385,6 +403,9 @@ struct lpfc_vport { | |||
385 | #endif | 403 | #endif |
386 | uint8_t stat_data_enabled; | 404 | uint8_t stat_data_enabled; |
387 | uint8_t stat_data_blocked; | 405 | uint8_t stat_data_blocked; |
406 | struct list_head rcv_buffer_list; | ||
407 | uint32_t vport_flag; | ||
408 | #define STATIC_VPORT 1 | ||
388 | }; | 409 | }; |
389 | 410 | ||
390 | struct hbq_s { | 411 | struct hbq_s { |
@@ -420,8 +441,66 @@ enum intr_type_t { | |||
420 | }; | 441 | }; |
421 | 442 | ||
422 | struct lpfc_hba { | 443 | struct lpfc_hba { |
444 | /* SCSI interface function jump table entries */ | ||
445 | int (*lpfc_new_scsi_buf) | ||
446 | (struct lpfc_vport *, int); | ||
447 | struct lpfc_scsi_buf * (*lpfc_get_scsi_buf) | ||
448 | (struct lpfc_hba *); | ||
449 | int (*lpfc_scsi_prep_dma_buf) | ||
450 | (struct lpfc_hba *, struct lpfc_scsi_buf *); | ||
451 | void (*lpfc_scsi_unprep_dma_buf) | ||
452 | (struct lpfc_hba *, struct lpfc_scsi_buf *); | ||
453 | void (*lpfc_release_scsi_buf) | ||
454 | (struct lpfc_hba *, struct lpfc_scsi_buf *); | ||
455 | void (*lpfc_rampdown_queue_depth) | ||
456 | (struct lpfc_hba *); | ||
457 | void (*lpfc_scsi_prep_cmnd) | ||
458 | (struct lpfc_vport *, struct lpfc_scsi_buf *, | ||
459 | struct lpfc_nodelist *); | ||
460 | int (*lpfc_scsi_prep_task_mgmt_cmd) | ||
461 | (struct lpfc_vport *, struct lpfc_scsi_buf *, | ||
462 | unsigned int, uint8_t); | ||
463 | |||
464 | /* IOCB interface function jump table entries */ | ||
465 | int (*__lpfc_sli_issue_iocb) | ||
466 | (struct lpfc_hba *, uint32_t, | ||
467 | struct lpfc_iocbq *, uint32_t); | ||
468 | void (*__lpfc_sli_release_iocbq)(struct lpfc_hba *, | ||
469 | struct lpfc_iocbq *); | ||
470 | int (*lpfc_hba_down_post)(struct lpfc_hba *phba); | ||
471 | |||
472 | |||
473 | IOCB_t * (*lpfc_get_iocb_from_iocbq) | ||
474 | (struct lpfc_iocbq *); | ||
475 | void (*lpfc_scsi_cmd_iocb_cmpl) | ||
476 | (struct lpfc_hba *, struct lpfc_iocbq *, struct lpfc_iocbq *); | ||
477 | |||
478 | /* MBOX interface function jump table entries */ | ||
479 | int (*lpfc_sli_issue_mbox) | ||
480 | (struct lpfc_hba *, LPFC_MBOXQ_t *, uint32_t); | ||
481 | /* Slow-path IOCB process function jump table entries */ | ||
482 | void (*lpfc_sli_handle_slow_ring_event) | ||
483 | (struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | ||
484 | uint32_t mask); | ||
485 | /* INIT device interface function jump table entries */ | ||
486 | int (*lpfc_sli_hbq_to_firmware) | ||
487 | (struct lpfc_hba *, uint32_t, struct hbq_dmabuf *); | ||
488 | int (*lpfc_sli_brdrestart) | ||
489 | (struct lpfc_hba *); | ||
490 | int (*lpfc_sli_brdready) | ||
491 | (struct lpfc_hba *, uint32_t); | ||
492 | void (*lpfc_handle_eratt) | ||
493 | (struct lpfc_hba *); | ||
494 | void (*lpfc_stop_port) | ||
495 | (struct lpfc_hba *); | ||
496 | |||
497 | |||
498 | /* SLI4 specific HBA data structure */ | ||
499 | struct lpfc_sli4_hba sli4_hba; | ||
500 | |||
423 | struct lpfc_sli sli; | 501 | struct lpfc_sli sli; |
424 | uint32_t sli_rev; /* SLI2 or SLI3 */ | 502 | uint8_t pci_dev_grp; /* lpfc PCI dev group: 0x0, 0x1, 0x2,... */ |
503 | uint32_t sli_rev; /* SLI2, SLI3, or SLI4 */ | ||
425 | uint32_t sli3_options; /* Mask of enabled SLI3 options */ | 504 | uint32_t sli3_options; /* Mask of enabled SLI3 options */ |
426 | #define LPFC_SLI3_HBQ_ENABLED 0x01 | 505 | #define LPFC_SLI3_HBQ_ENABLED 0x01 |
427 | #define LPFC_SLI3_NPIV_ENABLED 0x02 | 506 | #define LPFC_SLI3_NPIV_ENABLED 0x02 |
@@ -429,6 +508,7 @@ struct lpfc_hba { | |||
429 | #define LPFC_SLI3_CRP_ENABLED 0x08 | 508 | #define LPFC_SLI3_CRP_ENABLED 0x08 |
430 | #define LPFC_SLI3_INB_ENABLED 0x10 | 509 | #define LPFC_SLI3_INB_ENABLED 0x10 |
431 | #define LPFC_SLI3_BG_ENABLED 0x20 | 510 | #define LPFC_SLI3_BG_ENABLED 0x20 |
511 | #define LPFC_SLI3_DSS_ENABLED 0x40 | ||
432 | uint32_t iocb_cmd_size; | 512 | uint32_t iocb_cmd_size; |
433 | uint32_t iocb_rsp_size; | 513 | uint32_t iocb_rsp_size; |
434 | 514 | ||
@@ -442,8 +522,13 @@ struct lpfc_hba { | |||
442 | 522 | ||
443 | uint32_t hba_flag; /* hba generic flags */ | 523 | uint32_t hba_flag; /* hba generic flags */ |
444 | #define HBA_ERATT_HANDLED 0x1 /* This flag is set when eratt handled */ | 524 | #define HBA_ERATT_HANDLED 0x1 /* This flag is set when eratt handled */ |
445 | 525 | #define DEFER_ERATT 0x2 /* Deferred error attention in progress */ | |
446 | #define DEFER_ERATT 0x4 /* Deferred error attention in progress */ | 526 | #define HBA_FCOE_SUPPORT 0x4 /* HBA function supports FCOE */ |
527 | #define HBA_RECEIVE_BUFFER 0x8 /* Rcv buffer posted to worker thread */ | ||
528 | #define HBA_POST_RECEIVE_BUFFER 0x10 /* Rcv buffers need to be posted */ | ||
529 | #define FCP_XRI_ABORT_EVENT 0x20 | ||
530 | #define ELS_XRI_ABORT_EVENT 0x40 | ||
531 | #define ASYNC_EVENT 0x80 | ||
447 | struct lpfc_dmabuf slim2p; | 532 | struct lpfc_dmabuf slim2p; |
448 | 533 | ||
449 | MAILBOX_t *mbox; | 534 | MAILBOX_t *mbox; |
@@ -502,6 +587,9 @@ struct lpfc_hba { | |||
502 | uint32_t cfg_poll; | 587 | uint32_t cfg_poll; |
503 | uint32_t cfg_poll_tmo; | 588 | uint32_t cfg_poll_tmo; |
504 | uint32_t cfg_use_msi; | 589 | uint32_t cfg_use_msi; |
590 | uint32_t cfg_fcp_imax; | ||
591 | uint32_t cfg_fcp_wq_count; | ||
592 | uint32_t cfg_fcp_eq_count; | ||
505 | uint32_t cfg_sg_seg_cnt; | 593 | uint32_t cfg_sg_seg_cnt; |
506 | uint32_t cfg_prot_sg_seg_cnt; | 594 | uint32_t cfg_prot_sg_seg_cnt; |
507 | uint32_t cfg_sg_dma_buf_size; | 595 | uint32_t cfg_sg_dma_buf_size; |
@@ -511,6 +599,8 @@ struct lpfc_hba { | |||
511 | uint32_t cfg_enable_hba_reset; | 599 | uint32_t cfg_enable_hba_reset; |
512 | uint32_t cfg_enable_hba_heartbeat; | 600 | uint32_t cfg_enable_hba_heartbeat; |
513 | uint32_t cfg_enable_bg; | 601 | uint32_t cfg_enable_bg; |
602 | uint32_t cfg_enable_fip; | ||
603 | uint32_t cfg_log_verbose; | ||
514 | 604 | ||
515 | lpfc_vpd_t vpd; /* vital product data */ | 605 | lpfc_vpd_t vpd; /* vital product data */ |
516 | 606 | ||
@@ -526,11 +616,12 @@ struct lpfc_hba { | |||
526 | unsigned long data_flags; | 616 | unsigned long data_flags; |
527 | 617 | ||
528 | uint32_t hbq_in_use; /* HBQs in use flag */ | 618 | uint32_t hbq_in_use; /* HBQs in use flag */ |
529 | struct list_head hbqbuf_in_list; /* in-fly hbq buffer list */ | 619 | struct list_head rb_pend_list; /* Received buffers to be processed */ |
530 | uint32_t hbq_count; /* Count of configured HBQs */ | 620 | uint32_t hbq_count; /* Count of configured HBQs */ |
531 | struct hbq_s hbqs[LPFC_MAX_HBQS]; /* local copy of hbq indicies */ | 621 | struct hbq_s hbqs[LPFC_MAX_HBQS]; /* local copy of hbq indicies */ |
532 | 622 | ||
533 | unsigned long pci_bar0_map; /* Physical address for PCI BAR0 */ | 623 | unsigned long pci_bar0_map; /* Physical address for PCI BAR0 */ |
624 | unsigned long pci_bar1_map; /* Physical address for PCI BAR1 */ | ||
534 | unsigned long pci_bar2_map; /* Physical address for PCI BAR2 */ | 625 | unsigned long pci_bar2_map; /* Physical address for PCI BAR2 */ |
535 | void __iomem *slim_memmap_p; /* Kernel memory mapped address for | 626 | void __iomem *slim_memmap_p; /* Kernel memory mapped address for |
536 | PCI BAR0 */ | 627 | PCI BAR0 */ |
@@ -593,7 +684,8 @@ struct lpfc_hba { | |||
593 | /* pci_mem_pools */ | 684 | /* pci_mem_pools */ |
594 | struct pci_pool *lpfc_scsi_dma_buf_pool; | 685 | struct pci_pool *lpfc_scsi_dma_buf_pool; |
595 | struct pci_pool *lpfc_mbuf_pool; | 686 | struct pci_pool *lpfc_mbuf_pool; |
596 | struct pci_pool *lpfc_hbq_pool; | 687 | struct pci_pool *lpfc_hrb_pool; /* header receive buffer pool */ |
688 | struct pci_pool *lpfc_drb_pool; /* data receive buffer pool */ | ||
597 | struct lpfc_dma_pool lpfc_mbuf_safety_pool; | 689 | struct lpfc_dma_pool lpfc_mbuf_safety_pool; |
598 | 690 | ||
599 | mempool_t *mbox_mem_pool; | 691 | mempool_t *mbox_mem_pool; |
@@ -609,6 +701,14 @@ struct lpfc_hba { | |||
609 | struct lpfc_vport *pport; /* physical lpfc_vport pointer */ | 701 | struct lpfc_vport *pport; /* physical lpfc_vport pointer */ |
610 | uint16_t max_vpi; /* Maximum virtual nports */ | 702 | uint16_t max_vpi; /* Maximum virtual nports */ |
611 | #define LPFC_MAX_VPI 0xFFFF /* Max number of VPI supported */ | 703 | #define LPFC_MAX_VPI 0xFFFF /* Max number of VPI supported */ |
704 | uint16_t max_vports; /* | ||
705 | * For IOV HBAs max_vpi can change | ||
706 | * after a reset. max_vports is max | ||
707 | * number of vports present. This can | ||
708 | * be greater than max_vpi. | ||
709 | */ | ||
710 | uint16_t vpi_base; | ||
711 | uint16_t vfi_base; | ||
612 | unsigned long *vpi_bmask; /* vpi allocation table */ | 712 | unsigned long *vpi_bmask; /* vpi allocation table */ |
613 | 713 | ||
614 | /* Data structure used by fabric iocb scheduler */ | 714 | /* Data structure used by fabric iocb scheduler */ |
@@ -667,6 +767,11 @@ struct lpfc_hba { | |||
667 | /* Maximum number of events that can be outstanding at any time*/ | 767 | /* Maximum number of events that can be outstanding at any time*/ |
668 | #define LPFC_MAX_EVT_COUNT 512 | 768 | #define LPFC_MAX_EVT_COUNT 512 |
669 | atomic_t fast_event_count; | 769 | atomic_t fast_event_count; |
770 | struct lpfc_fcf fcf; | ||
771 | uint8_t fc_map[3]; | ||
772 | uint8_t valid_vlan; | ||
773 | uint16_t vlan_id; | ||
774 | struct list_head fcf_conn_rec_list; | ||
670 | }; | 775 | }; |
671 | 776 | ||
672 | static inline struct Scsi_Host * | 777 | static inline struct Scsi_Host * |