1 /*- 2 * Copyright (c) 2016 Solarflare Communications Inc. 3 * All rights reserved. 4 * 5 * This software was jointly developed between OKTET Labs (under contract 6 * for Solarflare) and Solarflare Communications, Inc. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions are met: 10 * 11 * 1. Redistributions of source code must retain the above copyright notice, 12 * this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright notice, 14 * this list of conditions and the following disclaimer in the documentation 15 * and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 19 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 20 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 21 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 22 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 23 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 24 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 26 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 27 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30 #include "efx.h" 31 32 #include "sfc.h" 33 #include "sfc_log.h" 34 35 int 36 sfc_intr_start(struct sfc_adapter *sa) 37 { 38 struct sfc_intr *intr = &sa->intr; 39 struct rte_intr_handle *intr_handle; 40 struct rte_pci_device *pci_dev; 41 int rc; 42 43 sfc_log_init(sa, "entry"); 44 45 /* 46 * The EFX common code event queue module depends on the interrupt 47 * module. Ensure that the interrupt module is always initialized 48 * (even if interrupts are not used). Status memory is required 49 * for Siena only and may be NULL for EF10. 50 */ 51 sfc_log_init(sa, "efx_intr_init"); 52 rc = efx_intr_init(sa->nic, intr->type, NULL); 53 if (rc != 0) 54 goto fail_intr_init; 55 56 pci_dev = SFC_DEV_TO_PCI(sa->eth_dev); 57 intr_handle = &pci_dev->intr_handle; 58 59 sfc_log_init(sa, "done type=%u max_intr=%d nb_efd=%u vec=%p", 60 intr_handle->type, intr_handle->max_intr, 61 intr_handle->nb_efd, intr_handle->intr_vec); 62 return 0; 63 64 fail_intr_init: 65 sfc_log_init(sa, "failed %d", rc); 66 return rc; 67 } 68 69 void 70 sfc_intr_stop(struct sfc_adapter *sa) 71 { 72 sfc_log_init(sa, "entry"); 73 74 efx_intr_fini(sa->nic); 75 76 sfc_log_init(sa, "done"); 77 } 78 79 int 80 sfc_intr_init(struct sfc_adapter *sa) 81 { 82 sfc_log_init(sa, "entry"); 83 84 sfc_log_init(sa, "done"); 85 return 0; 86 } 87 88 void 89 sfc_intr_fini(struct sfc_adapter *sa) 90 { 91 sfc_log_init(sa, "entry"); 92 93 sfc_log_init(sa, "done"); 94 } 95 96 int 97 sfc_intr_attach(struct sfc_adapter *sa) 98 { 99 struct sfc_intr *intr = &sa->intr; 100 struct rte_pci_device *pci_dev = SFC_DEV_TO_PCI(sa->eth_dev); 101 102 sfc_log_init(sa, "entry"); 103 104 switch (pci_dev->intr_handle.type) { 105 #ifdef RTE_EXEC_ENV_LINUXAPP 106 case RTE_INTR_HANDLE_VFIO_LEGACY: 107 intr->type = EFX_INTR_LINE; 108 break; 109 case RTE_INTR_HANDLE_VFIO_MSI: 110 case RTE_INTR_HANDLE_VFIO_MSIX: 111 intr->type = EFX_INTR_MESSAGE; 112 break; 113 #endif 114 default: 115 intr->type = EFX_INTR_INVALID; 116 break; 117 } 118 119 sfc_log_init(sa, "done"); 120 return 0; 121 } 122 123 void 124 sfc_intr_detach(struct sfc_adapter *sa) 125 { 126 sfc_log_init(sa, "entry"); 127 128 sa->intr.type = EFX_INTR_INVALID; 129 130 sfc_log_init(sa, "done"); 131 } 132