aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/lpfc/lpfc_init.c
diff options
context:
space:
mode:
authorJames Smart <james.smart@emulex.com>2014-02-20 09:56:45 -0500
committerJames Bottomley <JBottomley@Parallels.com>2014-03-15 13:18:56 -0400
commit1ba981fd3ad1f91b8bb205ce6aac6aad45f2fa7a (patch)
treec5638d855f177a4be300a2df71d8d621a2cfc0ca /drivers/scsi/lpfc/lpfc_init.c
parent2a2719d370b2ec31451462f2775986e42cbeb39f (diff)
[SCSI] lpfc 8.3.45: Incorporated support of a low-latency io path
Signed-off-by: James Smart <james.smart@emulex.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_init.c')
-rw-r--r--drivers/scsi/lpfc/lpfc_init.c241
1 files changed, 235 insertions, 6 deletions
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c
index aa29ea099188..157ad1ceceae 100644
--- a/drivers/scsi/lpfc/lpfc_init.c
+++ b/drivers/scsi/lpfc/lpfc_init.c
@@ -80,6 +80,7 @@ static void lpfc_sli4_cq_event_pool_destroy(struct lpfc_hba *);
80static void lpfc_sli4_cq_event_release_all(struct lpfc_hba *); 80static void lpfc_sli4_cq_event_release_all(struct lpfc_hba *);
81static void lpfc_sli4_disable_intr(struct lpfc_hba *); 81static void lpfc_sli4_disable_intr(struct lpfc_hba *);
82static uint32_t lpfc_sli4_enable_intr(struct lpfc_hba *, uint32_t); 82static uint32_t lpfc_sli4_enable_intr(struct lpfc_hba *, uint32_t);
83static void lpfc_sli4_oas_verify(struct lpfc_hba *phba);
83 84
84static struct scsi_transport_template *lpfc_transport_template = NULL; 85static struct scsi_transport_template *lpfc_transport_template = NULL;
85static struct scsi_transport_template *lpfc_vport_transport_template = NULL; 86static struct scsi_transport_template *lpfc_vport_transport_template = NULL;
@@ -4856,6 +4857,7 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
4856 uint8_t pn_page[LPFC_MAX_SUPPORTED_PAGES] = {0}; 4857 uint8_t pn_page[LPFC_MAX_SUPPORTED_PAGES] = {0};
4857 struct lpfc_mqe *mqe; 4858 struct lpfc_mqe *mqe;
4858 int longs; 4859 int longs;
4860 int fof_vectors = 0;
4859 4861
4860 /* Get all the module params for configuring this host */ 4862 /* Get all the module params for configuring this host */
4861 lpfc_get_cfgparam(phba); 4863 lpfc_get_cfgparam(phba);
@@ -5121,6 +5123,12 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
5121 } 5123 }
5122 } 5124 }
5123 mempool_free(mboxq, phba->mbox_mem_pool); 5125 mempool_free(mboxq, phba->mbox_mem_pool);
5126
5127 /* Verify OAS is supported */
5128 lpfc_sli4_oas_verify(phba);
5129 if (phba->cfg_fof)
5130 fof_vectors = 1;
5131
5124 /* Verify all the SLI4 queues */ 5132 /* Verify all the SLI4 queues */
5125 rc = lpfc_sli4_queue_verify(phba); 5133 rc = lpfc_sli4_queue_verify(phba);
5126 if (rc) 5134 if (rc)
@@ -5162,7 +5170,8 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
5162 5170
5163 phba->sli4_hba.fcp_eq_hdl = 5171 phba->sli4_hba.fcp_eq_hdl =
5164 kzalloc((sizeof(struct lpfc_fcp_eq_hdl) * 5172 kzalloc((sizeof(struct lpfc_fcp_eq_hdl) *
5165 phba->cfg_fcp_io_channel), GFP_KERNEL); 5173 (fof_vectors + phba->cfg_fcp_io_channel)),
5174 GFP_KERNEL);
5166 if (!phba->sli4_hba.fcp_eq_hdl) { 5175 if (!phba->sli4_hba.fcp_eq_hdl) {
5167 lpfc_printf_log(phba, KERN_ERR, LOG_INIT, 5176 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
5168 "2572 Failed allocate memory for " 5177 "2572 Failed allocate memory for "
@@ -5172,7 +5181,8 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
5172 } 5181 }
5173 5182
5174 phba->sli4_hba.msix_entries = kzalloc((sizeof(struct msix_entry) * 5183 phba->sli4_hba.msix_entries = kzalloc((sizeof(struct msix_entry) *
5175 phba->cfg_fcp_io_channel), GFP_KERNEL); 5184 (fof_vectors +
5185 phba->cfg_fcp_io_channel)), GFP_KERNEL);
5176 if (!phba->sli4_hba.msix_entries) { 5186 if (!phba->sli4_hba.msix_entries) {
5177 lpfc_printf_log(phba, KERN_ERR, LOG_INIT, 5187 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
5178 "2573 Failed allocate memory for msi-x " 5188 "2573 Failed allocate memory for msi-x "
@@ -5393,6 +5403,10 @@ lpfc_setup_driver_resource_phase1(struct lpfc_hba *phba)
5393 /* Initialize FCF connection rec list */ 5403 /* Initialize FCF connection rec list */
5394 INIT_LIST_HEAD(&phba->fcf_conn_rec_list); 5404 INIT_LIST_HEAD(&phba->fcf_conn_rec_list);
5395 5405
5406 /* Initialize OAS configuration list */
5407 spin_lock_init(&phba->devicelock);
5408 INIT_LIST_HEAD(&phba->luns);
5409
5396 return 0; 5410 return 0;
5397} 5411}
5398 5412
@@ -6819,6 +6833,7 @@ lpfc_sli4_queue_verify(struct lpfc_hba *phba)
6819 int cfg_fcp_io_channel; 6833 int cfg_fcp_io_channel;
6820 uint32_t cpu; 6834 uint32_t cpu;
6821 uint32_t i = 0; 6835 uint32_t i = 0;
6836 int fof_vectors = phba->cfg_fof ? 1 : 0;
6822 6837
6823 /* 6838 /*
6824 * Sanity check for configured queue parameters against the run-time 6839 * Sanity check for configured queue parameters against the run-time
@@ -6845,7 +6860,7 @@ lpfc_sli4_queue_verify(struct lpfc_hba *phba)
6845 cfg_fcp_io_channel = i; 6860 cfg_fcp_io_channel = i;
6846 } 6861 }
6847 6862
6848 if (cfg_fcp_io_channel > 6863 if (cfg_fcp_io_channel + fof_vectors >
6849 phba->sli4_hba.max_cfg_param.max_eq) { 6864 phba->sli4_hba.max_cfg_param.max_eq) {
6850 if (phba->sli4_hba.max_cfg_param.max_eq < 6865 if (phba->sli4_hba.max_cfg_param.max_eq <
6851 LPFC_FCP_IO_CHAN_MIN) { 6866 LPFC_FCP_IO_CHAN_MIN) {
@@ -6862,7 +6877,8 @@ lpfc_sli4_queue_verify(struct lpfc_hba *phba)
6862 "available EQs: from %d to %d\n", 6877 "available EQs: from %d to %d\n",
6863 cfg_fcp_io_channel, 6878 cfg_fcp_io_channel,
6864 phba->sli4_hba.max_cfg_param.max_eq); 6879 phba->sli4_hba.max_cfg_param.max_eq);
6865 cfg_fcp_io_channel = phba->sli4_hba.max_cfg_param.max_eq; 6880 cfg_fcp_io_channel = phba->sli4_hba.max_cfg_param.max_eq -
6881 fof_vectors;
6866 } 6882 }
6867 6883
6868 /* The actual number of FCP event queues adopted */ 6884 /* The actual number of FCP event queues adopted */
@@ -7073,6 +7089,9 @@ lpfc_sli4_queue_create(struct lpfc_hba *phba)
7073 } 7089 }
7074 phba->sli4_hba.dat_rq = qdesc; 7090 phba->sli4_hba.dat_rq = qdesc;
7075 7091
7092 /* Create the Queues needed for Flash Optimized Fabric operations */
7093 if (phba->cfg_fof)
7094 lpfc_fof_queue_create(phba);
7076 return 0; 7095 return 0;
7077 7096
7078out_error: 7097out_error:
@@ -7097,6 +7116,9 @@ lpfc_sli4_queue_destroy(struct lpfc_hba *phba)
7097{ 7116{
7098 int idx; 7117 int idx;
7099 7118
7119 if (phba->cfg_fof)
7120 lpfc_fof_queue_destroy(phba);
7121
7100 if (phba->sli4_hba.hba_eq != NULL) { 7122 if (phba->sli4_hba.hba_eq != NULL) {
7101 /* Release HBA event queue */ 7123 /* Release HBA event queue */
7102 for (idx = 0; idx < phba->cfg_fcp_io_channel; idx++) { 7124 for (idx = 0; idx < phba->cfg_fcp_io_channel; idx++) {
@@ -7481,8 +7503,20 @@ lpfc_sli4_queue_setup(struct lpfc_hba *phba)
7481 phba->sli4_hba.hdr_rq->queue_id, 7503 phba->sli4_hba.hdr_rq->queue_id,
7482 phba->sli4_hba.dat_rq->queue_id, 7504 phba->sli4_hba.dat_rq->queue_id,
7483 phba->sli4_hba.els_cq->queue_id); 7505 phba->sli4_hba.els_cq->queue_id);
7506
7507 if (phba->cfg_fof) {
7508 rc = lpfc_fof_queue_setup(phba);
7509 if (rc) {
7510 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
7511 "0549 Failed setup of FOF Queues: "
7512 "rc = 0x%x\n", rc);
7513 goto out_destroy_els_rq;
7514 }
7515 }
7484 return 0; 7516 return 0;
7485 7517
7518out_destroy_els_rq:
7519 lpfc_rq_destroy(phba, phba->sli4_hba.hdr_rq, phba->sli4_hba.dat_rq);
7486out_destroy_els_wq: 7520out_destroy_els_wq:
7487 lpfc_wq_destroy(phba, phba->sli4_hba.els_wq); 7521 lpfc_wq_destroy(phba, phba->sli4_hba.els_wq);
7488out_destroy_mbx_wq: 7522out_destroy_mbx_wq:
@@ -7521,6 +7555,9 @@ lpfc_sli4_queue_unset(struct lpfc_hba *phba)
7521{ 7555{
7522 int fcp_qidx; 7556 int fcp_qidx;
7523 7557
7558 /* Unset the queues created for Flash Optimized Fabric operations */
7559 if (phba->cfg_fof)
7560 lpfc_fof_queue_destroy(phba);
7524 /* Unset mailbox command work queue */ 7561 /* Unset mailbox command work queue */
7525 lpfc_mq_destroy(phba, phba->sli4_hba.mbx_wq); 7562 lpfc_mq_destroy(phba, phba->sli4_hba.mbx_wq);
7526 /* Unset ELS work queue */ 7563 /* Unset ELS work queue */
@@ -8638,6 +8675,10 @@ lpfc_sli4_enable_msix(struct lpfc_hba *phba)
8638 8675
8639 /* Configure MSI-X capability structure */ 8676 /* Configure MSI-X capability structure */
8640 vectors = phba->cfg_fcp_io_channel; 8677 vectors = phba->cfg_fcp_io_channel;
8678 if (phba->cfg_fof) {
8679 phba->sli4_hba.msix_entries[index].entry = index;
8680 vectors++;
8681 }
8641enable_msix_vectors: 8682enable_msix_vectors:
8642 rc = pci_enable_msix(phba->pcidev, phba->sli4_hba.msix_entries, 8683 rc = pci_enable_msix(phba->pcidev, phba->sli4_hba.msix_entries,
8643 vectors); 8684 vectors);
@@ -8667,7 +8708,15 @@ enable_msix_vectors:
8667 phba->sli4_hba.fcp_eq_hdl[index].idx = index; 8708 phba->sli4_hba.fcp_eq_hdl[index].idx = index;
8668 phba->sli4_hba.fcp_eq_hdl[index].phba = phba; 8709 phba->sli4_hba.fcp_eq_hdl[index].phba = phba;
8669 atomic_set(&phba->sli4_hba.fcp_eq_hdl[index].fcp_eq_in_use, 1); 8710 atomic_set(&phba->sli4_hba.fcp_eq_hdl[index].fcp_eq_in_use, 1);
8670 rc = request_irq(phba->sli4_hba.msix_entries[index].vector, 8711 if (phba->cfg_fof && (index == (vectors - 1)))
8712 rc = request_irq(
8713 phba->sli4_hba.msix_entries[index].vector,
8714 &lpfc_sli4_fof_intr_handler, IRQF_SHARED,
8715 (char *)&phba->sli4_hba.handler_name[index],
8716 &phba->sli4_hba.fcp_eq_hdl[index]);
8717 else
8718 rc = request_irq(
8719 phba->sli4_hba.msix_entries[index].vector,
8671 &lpfc_sli4_hba_intr_handler, IRQF_SHARED, 8720 &lpfc_sli4_hba_intr_handler, IRQF_SHARED,
8672 (char *)&phba->sli4_hba.handler_name[index], 8721 (char *)&phba->sli4_hba.handler_name[index],
8673 &phba->sli4_hba.fcp_eq_hdl[index]); 8722 &phba->sli4_hba.fcp_eq_hdl[index]);
@@ -8679,6 +8728,9 @@ enable_msix_vectors:
8679 } 8728 }
8680 } 8729 }
8681 8730
8731 if (phba->cfg_fof)
8732 vectors--;
8733
8682 if (vectors != phba->cfg_fcp_io_channel) { 8734 if (vectors != phba->cfg_fcp_io_channel) {
8683 lpfc_printf_log(phba, KERN_ERR, LOG_INIT, 8735 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
8684 "3238 Reducing IO channels to match number of " 8736 "3238 Reducing IO channels to match number of "
@@ -8724,7 +8776,10 @@ lpfc_sli4_disable_msix(struct lpfc_hba *phba)
8724 free_irq(phba->sli4_hba.msix_entries[index].vector, 8776 free_irq(phba->sli4_hba.msix_entries[index].vector,
8725 &phba->sli4_hba.fcp_eq_hdl[index]); 8777 &phba->sli4_hba.fcp_eq_hdl[index]);
8726 } 8778 }
8727 8779 if (phba->cfg_fof) {
8780 free_irq(phba->sli4_hba.msix_entries[index].vector,
8781 &phba->sli4_hba.fcp_eq_hdl[index]);
8782 }
8728 /* Disable MSI-X */ 8783 /* Disable MSI-X */
8729 pci_disable_msix(phba->pcidev); 8784 pci_disable_msix(phba->pcidev);
8730 8785
@@ -8774,6 +8829,10 @@ lpfc_sli4_enable_msi(struct lpfc_hba *phba)
8774 phba->sli4_hba.fcp_eq_hdl[index].phba = phba; 8829 phba->sli4_hba.fcp_eq_hdl[index].phba = phba;
8775 } 8830 }
8776 8831
8832 if (phba->cfg_fof) {
8833 phba->sli4_hba.fcp_eq_hdl[index].idx = index;
8834 phba->sli4_hba.fcp_eq_hdl[index].phba = phba;
8835 }
8777 return 0; 8836 return 0;
8778} 8837}
8779 8838
@@ -8856,6 +8915,12 @@ lpfc_sli4_enable_intr(struct lpfc_hba *phba, uint32_t cfg_mode)
8856 atomic_set(&phba->sli4_hba.fcp_eq_hdl[index]. 8915 atomic_set(&phba->sli4_hba.fcp_eq_hdl[index].
8857 fcp_eq_in_use, 1); 8916 fcp_eq_in_use, 1);
8858 } 8917 }
8918 if (phba->cfg_fof) {
8919 phba->sli4_hba.fcp_eq_hdl[index].idx = index;
8920 phba->sli4_hba.fcp_eq_hdl[index].phba = phba;
8921 atomic_set(&phba->sli4_hba.fcp_eq_hdl[index].
8922 fcp_eq_in_use, 1);
8923 }
8859 } 8924 }
8860 } 8925 }
8861 return intr_mode; 8926 return intr_mode;
@@ -9166,6 +9231,7 @@ lpfc_get_sli4_parameters(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
9166 phba->sli3_options &= ~LPFC_SLI4_PHWQ_ENABLED; 9231 phba->sli3_options &= ~LPFC_SLI4_PHWQ_ENABLED;
9167 sli4_params->sge_supp_len = mbx_sli4_parameters->sge_supp_len; 9232 sli4_params->sge_supp_len = mbx_sli4_parameters->sge_supp_len;
9168 sli4_params->loopbk_scope = bf_get(loopbk_scope, mbx_sli4_parameters); 9233 sli4_params->loopbk_scope = bf_get(loopbk_scope, mbx_sli4_parameters);
9234 sli4_params->oas_supported = bf_get(cfg_oas, mbx_sli4_parameters);
9169 sli4_params->cqv = bf_get(cfg_cqv, mbx_sli4_parameters); 9235 sli4_params->cqv = bf_get(cfg_cqv, mbx_sli4_parameters);
9170 sli4_params->mqv = bf_get(cfg_mqv, mbx_sli4_parameters); 9236 sli4_params->mqv = bf_get(cfg_mqv, mbx_sli4_parameters);
9171 sli4_params->wqv = bf_get(cfg_wqv, mbx_sli4_parameters); 9237 sli4_params->wqv = bf_get(cfg_wqv, mbx_sli4_parameters);
@@ -10799,6 +10865,169 @@ lpfc_io_resume(struct pci_dev *pdev)
10799 return; 10865 return;
10800} 10866}
10801 10867
10868/**
10869 * lpfc_sli4_oas_verify - Verify OAS is supported by this adapter
10870 * @phba: pointer to lpfc hba data structure.
10871 *
10872 * This routine checks to see if OAS is supported for this adapter. If
10873 * supported, the configure Flash Optimized Fabric flag is set. Otherwise,
10874 * the enable oas flag is cleared and the pool created for OAS device data
10875 * is destroyed.
10876 *
10877 **/
10878void
10879lpfc_sli4_oas_verify(struct lpfc_hba *phba)
10880{
10881
10882 if (!phba->cfg_EnableXLane)
10883 return;
10884
10885 if (phba->sli4_hba.pc_sli4_params.oas_supported) {
10886 phba->cfg_fof = 1;
10887 } else {
10888 phba->cfg_EnableXLane = 0;
10889 if (phba->device_data_mem_pool)
10890 mempool_destroy(phba->device_data_mem_pool);
10891 phba->device_data_mem_pool = NULL;
10892 }
10893
10894 return;
10895}
10896
10897/**
10898 * lpfc_fof_queue_setup - Set up all the fof queues
10899 * @phba: pointer to lpfc hba data structure.
10900 *
10901 * This routine is invoked to set up all the fof queues for the FC HBA
10902 * operation.
10903 *
10904 * Return codes
10905 * 0 - successful
10906 * -ENOMEM - No available memory
10907 **/
10908int
10909lpfc_fof_queue_setup(struct lpfc_hba *phba)
10910{
10911 struct lpfc_sli *psli = &phba->sli;
10912 int rc;
10913
10914 rc = lpfc_eq_create(phba, phba->sli4_hba.fof_eq, LPFC_MAX_IMAX);
10915 if (rc)
10916 return -ENOMEM;
10917
10918 if (phba->cfg_EnableXLane) {
10919
10920 rc = lpfc_cq_create(phba, phba->sli4_hba.oas_cq,
10921 phba->sli4_hba.fof_eq, LPFC_WCQ, LPFC_FCP);
10922 if (rc)
10923 goto out_oas_cq;
10924
10925 rc = lpfc_wq_create(phba, phba->sli4_hba.oas_wq,
10926 phba->sli4_hba.oas_cq, LPFC_FCP);
10927 if (rc)
10928 goto out_oas_wq;
10929
10930 phba->sli4_hba.oas_cq->pring = &psli->ring[LPFC_FCP_OAS_RING];
10931 phba->sli4_hba.oas_ring = &psli->ring[LPFC_FCP_OAS_RING];
10932 }
10933
10934 return 0;
10935
10936out_oas_wq:
10937 if (phba->cfg_EnableXLane)
10938 lpfc_cq_destroy(phba, phba->sli4_hba.oas_cq);
10939out_oas_cq:
10940 lpfc_eq_destroy(phba, phba->sli4_hba.fof_eq);
10941 return rc;
10942
10943}
10944
10945/**
10946 * lpfc_fof_queue_create - Create all the fof queues
10947 * @phba: pointer to lpfc hba data structure.
10948 *
10949 * This routine is invoked to allocate all the fof queues for the FC HBA
10950 * operation. For each SLI4 queue type, the parameters such as queue entry
10951 * count (queue depth) shall be taken from the module parameter. For now,
10952 * we just use some constant number as place holder.
10953 *
10954 * Return codes
10955 * 0 - successful
10956 * -ENOMEM - No availble memory
10957 * -EIO - The mailbox failed to complete successfully.
10958 **/
10959int
10960lpfc_fof_queue_create(struct lpfc_hba *phba)
10961{
10962 struct lpfc_queue *qdesc;
10963
10964 /* Create FOF EQ */
10965 qdesc = lpfc_sli4_queue_alloc(phba, phba->sli4_hba.eq_esize,
10966 phba->sli4_hba.eq_ecount);
10967 if (!qdesc)
10968 goto out_error;
10969
10970 phba->sli4_hba.fof_eq = qdesc;
10971
10972 if (phba->cfg_EnableXLane) {
10973
10974 /* Create OAS CQ */
10975 qdesc = lpfc_sli4_queue_alloc(phba, phba->sli4_hba.cq_esize,
10976 phba->sli4_hba.cq_ecount);
10977 if (!qdesc)
10978 goto out_error;
10979
10980 phba->sli4_hba.oas_cq = qdesc;
10981
10982 /* Create OAS WQ */
10983 qdesc = lpfc_sli4_queue_alloc(phba, phba->sli4_hba.wq_esize,
10984 phba->sli4_hba.wq_ecount);
10985 if (!qdesc)
10986 goto out_error;
10987
10988 phba->sli4_hba.oas_wq = qdesc;
10989
10990 }
10991 return 0;
10992
10993out_error:
10994 lpfc_fof_queue_destroy(phba);
10995 return -ENOMEM;
10996}
10997
10998/**
10999 * lpfc_fof_queue_destroy - Destroy all the fof queues
11000 * @phba: pointer to lpfc hba data structure.
11001 *
11002 * This routine is invoked to release all the SLI4 queues with the FC HBA
11003 * operation.
11004 *
11005 * Return codes
11006 * 0 - successful
11007 **/
11008int
11009lpfc_fof_queue_destroy(struct lpfc_hba *phba)
11010{
11011 /* Release FOF Event queue */
11012 if (phba->sli4_hba.fof_eq != NULL) {
11013 lpfc_sli4_queue_free(phba->sli4_hba.fof_eq);
11014 phba->sli4_hba.fof_eq = NULL;
11015 }
11016
11017 /* Release OAS Completion queue */
11018 if (phba->sli4_hba.oas_cq != NULL) {
11019 lpfc_sli4_queue_free(phba->sli4_hba.oas_cq);
11020 phba->sli4_hba.oas_cq = NULL;
11021 }
11022
11023 /* Release OAS Work queue */
11024 if (phba->sli4_hba.oas_wq != NULL) {
11025 lpfc_sli4_queue_free(phba->sli4_hba.oas_wq);
11026 phba->sli4_hba.oas_wq = NULL;
11027 }
11028 return 0;
11029}
11030
10802static struct pci_device_id lpfc_id_table[] = { 11031static struct pci_device_id lpfc_id_table[] = {
10803 {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_VIPER, 11032 {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_VIPER,
10804 PCI_ANY_ID, PCI_ANY_ID, }, 11033 PCI_ANY_ID, PCI_ANY_ID, },