xref: /dpdk/drivers/net/sfc/sfc_intr.c (revision 7be78d027918dbc846e502780faf94d5acdf5f75)
144c0947bSAndrew Rybchenko /* SPDX-License-Identifier: BSD-3-Clause
2244cfa79SAndrew Rybchenko  *
398d26ef7SAndrew Rybchenko  * Copyright(c) 2019-2021 Xilinx, Inc.
4a0147be5SAndrew Rybchenko  * Copyright(c) 2016-2019 Solarflare Communications Inc.
506bc1977SAndrew Rybchenko  *
606bc1977SAndrew Rybchenko  * This software was jointly developed between OKTET Labs (under contract
706bc1977SAndrew Rybchenko  * for Solarflare) and Solarflare Communications, Inc.
806bc1977SAndrew Rybchenko  */
906bc1977SAndrew Rybchenko 
103b809c27SAndrew Rybchenko /*
11*7be78d02SJosh Soref  * At the moment of writing DPDK v16.07 has notion of two types of
123b809c27SAndrew Rybchenko  * interrupts: LSC (link status change) and RXQ (receive indication).
133b809c27SAndrew Rybchenko  * It allows to register interrupt callback for entire device which is
143b809c27SAndrew Rybchenko  * not intended to be used for receive indication (i.e. link status
153b809c27SAndrew Rybchenko  * change indication only). The handler has no information which HW
163b809c27SAndrew Rybchenko  * interrupt has triggered it, so we don't know which event queue should
173b809c27SAndrew Rybchenko  * be polled/reprimed (except qmask in the case of legacy line interrupt).
183b809c27SAndrew Rybchenko  */
193b809c27SAndrew Rybchenko 
203b809c27SAndrew Rybchenko #include <rte_common.h>
213b809c27SAndrew Rybchenko #include <rte_interrupts.h>
223b809c27SAndrew Rybchenko 
2306bc1977SAndrew Rybchenko #include "efx.h"
2406bc1977SAndrew Rybchenko 
2506bc1977SAndrew Rybchenko #include "sfc.h"
2606bc1977SAndrew Rybchenko #include "sfc_log.h"
273b809c27SAndrew Rybchenko #include "sfc_ev.h"
283b809c27SAndrew Rybchenko 
293b809c27SAndrew Rybchenko static void
sfc_intr_handle_mgmt_evq(struct sfc_adapter * sa)303b809c27SAndrew Rybchenko sfc_intr_handle_mgmt_evq(struct sfc_adapter *sa)
313b809c27SAndrew Rybchenko {
323b809c27SAndrew Rybchenko 	struct sfc_evq *evq;
333b809c27SAndrew Rybchenko 
343b809c27SAndrew Rybchenko 	rte_spinlock_lock(&sa->mgmt_evq_lock);
353b809c27SAndrew Rybchenko 
366caeec47SAndrew Rybchenko 	evq = sa->mgmt_evq;
373b809c27SAndrew Rybchenko 
38f042136eSAndrew Rybchenko 	if (!sa->mgmt_evq_running) {
39f042136eSAndrew Rybchenko 		sfc_log_init(sa, "interrupt on not running management EVQ %u",
40f042136eSAndrew Rybchenko 			     evq->evq_index);
413b809c27SAndrew Rybchenko 	} else {
423b809c27SAndrew Rybchenko 		sfc_ev_qpoll(evq);
433b809c27SAndrew Rybchenko 
443b809c27SAndrew Rybchenko 		if (sfc_ev_qprime(evq) != 0)
453b809c27SAndrew Rybchenko 			sfc_err(sa, "cannot prime EVQ %u", evq->evq_index);
463b809c27SAndrew Rybchenko 	}
473b809c27SAndrew Rybchenko 
483b809c27SAndrew Rybchenko 	rte_spinlock_unlock(&sa->mgmt_evq_lock);
493b809c27SAndrew Rybchenko }
503b809c27SAndrew Rybchenko 
513b809c27SAndrew Rybchenko static void
sfc_intr_line_handler(void * cb_arg)52c23a1a30SQi Zhang sfc_intr_line_handler(void *cb_arg)
533b809c27SAndrew Rybchenko {
543b809c27SAndrew Rybchenko 	struct sfc_adapter *sa = (struct sfc_adapter *)cb_arg;
553b809c27SAndrew Rybchenko 	efx_nic_t *enp = sa->nic;
563b809c27SAndrew Rybchenko 	boolean_t fatal;
573b809c27SAndrew Rybchenko 	uint32_t qmask;
583b809c27SAndrew Rybchenko 	unsigned int lsc_seq = sa->port.lsc_seq;
59c0802544SFerruh Yigit 	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(sa->eth_dev);
603b809c27SAndrew Rybchenko 
613b809c27SAndrew Rybchenko 	sfc_log_init(sa, "entry");
623b809c27SAndrew Rybchenko 
63ac478689SIgor Romanov 	if (sa->state != SFC_ETHDEV_STARTED &&
64ac478689SIgor Romanov 	    sa->state != SFC_ETHDEV_STARTING &&
65ac478689SIgor Romanov 	    sa->state != SFC_ETHDEV_STOPPING) {
663b809c27SAndrew Rybchenko 		sfc_log_init(sa,
673b809c27SAndrew Rybchenko 			     "interrupt on stopped adapter, don't reenable");
683b809c27SAndrew Rybchenko 		goto exit;
693b809c27SAndrew Rybchenko 	}
703b809c27SAndrew Rybchenko 
713b809c27SAndrew Rybchenko 	efx_intr_status_line(enp, &fatal, &qmask);
723b809c27SAndrew Rybchenko 	if (fatal) {
733b809c27SAndrew Rybchenko 		(void)efx_intr_disable(enp);
743b809c27SAndrew Rybchenko 		(void)efx_intr_fatal(enp);
753b809c27SAndrew Rybchenko 		sfc_err(sa, "fatal, interrupts disabled");
763b809c27SAndrew Rybchenko 		goto exit;
773b809c27SAndrew Rybchenko 	}
783b809c27SAndrew Rybchenko 
793b809c27SAndrew Rybchenko 	if (qmask & (1 << sa->mgmt_evq_index))
803b809c27SAndrew Rybchenko 		sfc_intr_handle_mgmt_evq(sa);
813b809c27SAndrew Rybchenko 
82d61138d4SHarman Kalra 	if (rte_intr_ack(pci_dev->intr_handle) != 0)
833b809c27SAndrew Rybchenko 		sfc_err(sa, "cannot reenable interrupts");
843b809c27SAndrew Rybchenko 
853b809c27SAndrew Rybchenko 	sfc_log_init(sa, "done");
863b809c27SAndrew Rybchenko 
873b809c27SAndrew Rybchenko exit:
883b809c27SAndrew Rybchenko 	if (lsc_seq != sa->port.lsc_seq) {
8991d16276SIvan Malov 		sfc_notice(sa, "link status change event: link %s",
903b809c27SAndrew Rybchenko 			 sa->eth_dev->data->dev_link.link_status ?
913b809c27SAndrew Rybchenko 			 "UP" : "DOWN");
925723fbedSFerruh Yigit 		rte_eth_dev_callback_process(sa->eth_dev,
93d6af1a13SBernard Iremonger 					     RTE_ETH_EVENT_INTR_LSC,
94cebe3d7bSThomas Monjalon 					     NULL);
953b809c27SAndrew Rybchenko 	}
963b809c27SAndrew Rybchenko }
973b809c27SAndrew Rybchenko 
983b809c27SAndrew Rybchenko static void
sfc_intr_message_handler(void * cb_arg)99c23a1a30SQi Zhang sfc_intr_message_handler(void *cb_arg)
1003b809c27SAndrew Rybchenko {
1013b809c27SAndrew Rybchenko 	struct sfc_adapter *sa = (struct sfc_adapter *)cb_arg;
1023b809c27SAndrew Rybchenko 	efx_nic_t *enp = sa->nic;
1033b809c27SAndrew Rybchenko 	boolean_t fatal;
1043b809c27SAndrew Rybchenko 	unsigned int lsc_seq = sa->port.lsc_seq;
105c0802544SFerruh Yigit 	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(sa->eth_dev);
1063b809c27SAndrew Rybchenko 
1073b809c27SAndrew Rybchenko 	sfc_log_init(sa, "entry");
1083b809c27SAndrew Rybchenko 
109ac478689SIgor Romanov 	if (sa->state != SFC_ETHDEV_STARTED &&
110ac478689SIgor Romanov 	    sa->state != SFC_ETHDEV_STARTING &&
111ac478689SIgor Romanov 	    sa->state != SFC_ETHDEV_STOPPING) {
1123b809c27SAndrew Rybchenko 		sfc_log_init(sa, "adapter not-started, don't reenable");
1133b809c27SAndrew Rybchenko 		goto exit;
1143b809c27SAndrew Rybchenko 	}
1153b809c27SAndrew Rybchenko 
1163b809c27SAndrew Rybchenko 	efx_intr_status_message(enp, sa->mgmt_evq_index, &fatal);
1173b809c27SAndrew Rybchenko 	if (fatal) {
1183b809c27SAndrew Rybchenko 		(void)efx_intr_disable(enp);
1193b809c27SAndrew Rybchenko 		(void)efx_intr_fatal(enp);
1203b809c27SAndrew Rybchenko 		sfc_err(sa, "fatal, interrupts disabled");
1213b809c27SAndrew Rybchenko 		goto exit;
1223b809c27SAndrew Rybchenko 	}
1233b809c27SAndrew Rybchenko 
1243b809c27SAndrew Rybchenko 	sfc_intr_handle_mgmt_evq(sa);
1253b809c27SAndrew Rybchenko 
126d61138d4SHarman Kalra 	if (rte_intr_ack(pci_dev->intr_handle) != 0)
1273b809c27SAndrew Rybchenko 		sfc_err(sa, "cannot reenable interrupts");
1283b809c27SAndrew Rybchenko 
1293b809c27SAndrew Rybchenko 	sfc_log_init(sa, "done");
1303b809c27SAndrew Rybchenko 
1313b809c27SAndrew Rybchenko exit:
1323b809c27SAndrew Rybchenko 	if (lsc_seq != sa->port.lsc_seq) {
13391d16276SIvan Malov 		sfc_notice(sa, "link status change event");
1345723fbedSFerruh Yigit 		rte_eth_dev_callback_process(sa->eth_dev,
135d6af1a13SBernard Iremonger 					     RTE_ETH_EVENT_INTR_LSC,
136cebe3d7bSThomas Monjalon 					     NULL);
1373b809c27SAndrew Rybchenko 	}
1383b809c27SAndrew Rybchenko }
13906bc1977SAndrew Rybchenko 
14006bc1977SAndrew Rybchenko int
sfc_intr_start(struct sfc_adapter * sa)14106bc1977SAndrew Rybchenko sfc_intr_start(struct sfc_adapter *sa)
14206bc1977SAndrew Rybchenko {
14306bc1977SAndrew Rybchenko 	struct sfc_intr *intr = &sa->intr;
14406bc1977SAndrew Rybchenko 	struct rte_intr_handle *intr_handle;
14506bc1977SAndrew Rybchenko 	struct rte_pci_device *pci_dev;
14606bc1977SAndrew Rybchenko 	int rc;
14706bc1977SAndrew Rybchenko 
14806bc1977SAndrew Rybchenko 	sfc_log_init(sa, "entry");
14906bc1977SAndrew Rybchenko 
15006bc1977SAndrew Rybchenko 	/*
15106bc1977SAndrew Rybchenko 	 * The EFX common code event queue module depends on the interrupt
15206bc1977SAndrew Rybchenko 	 * module. Ensure that the interrupt module is always initialized
15306bc1977SAndrew Rybchenko 	 * (even if interrupts are not used).  Status memory is required
15406bc1977SAndrew Rybchenko 	 * for Siena only and may be NULL for EF10.
15506bc1977SAndrew Rybchenko 	 */
15606bc1977SAndrew Rybchenko 	sfc_log_init(sa, "efx_intr_init");
15706bc1977SAndrew Rybchenko 	rc = efx_intr_init(sa->nic, intr->type, NULL);
15806bc1977SAndrew Rybchenko 	if (rc != 0)
15906bc1977SAndrew Rybchenko 		goto fail_intr_init;
16006bc1977SAndrew Rybchenko 
161c0802544SFerruh Yigit 	pci_dev = RTE_ETH_DEV_TO_PCI(sa->eth_dev);
162d61138d4SHarman Kalra 	intr_handle = pci_dev->intr_handle;
16306bc1977SAndrew Rybchenko 
1643b809c27SAndrew Rybchenko 	if (intr->handler != NULL) {
1654279b54eSGeorgiy Levashov 		if (intr->rxq_intr && rte_intr_cap_multiple(intr_handle)) {
1664279b54eSGeorgiy Levashov 			uint32_t intr_vector;
1674279b54eSGeorgiy Levashov 
1684279b54eSGeorgiy Levashov 			intr_vector = sa->eth_dev->data->nb_rx_queues;
1694279b54eSGeorgiy Levashov 			rc = rte_intr_efd_enable(intr_handle, intr_vector);
1704279b54eSGeorgiy Levashov 			if (rc != 0)
1714279b54eSGeorgiy Levashov 				goto fail_rte_intr_efd_enable;
1724279b54eSGeorgiy Levashov 		}
1734279b54eSGeorgiy Levashov 		if (rte_intr_dp_is_en(intr_handle)) {
174d61138d4SHarman Kalra 			if (rte_intr_vec_list_alloc(intr_handle,
175d61138d4SHarman Kalra 					"intr_vec",
176d61138d4SHarman Kalra 					sa->eth_dev->data->nb_rx_queues)) {
1774279b54eSGeorgiy Levashov 				sfc_err(sa,
1784279b54eSGeorgiy Levashov 					"Failed to allocate %d rx_queues intr_vec",
1794279b54eSGeorgiy Levashov 					sa->eth_dev->data->nb_rx_queues);
1804279b54eSGeorgiy Levashov 				goto fail_intr_vector_alloc;
1814279b54eSGeorgiy Levashov 			}
182d61138d4SHarman Kalra 
1834279b54eSGeorgiy Levashov 		}
1844279b54eSGeorgiy Levashov 
1853b809c27SAndrew Rybchenko 		sfc_log_init(sa, "rte_intr_callback_register");
1863b809c27SAndrew Rybchenko 		rc = rte_intr_callback_register(intr_handle, intr->handler,
1873b809c27SAndrew Rybchenko 						(void *)sa);
1883b809c27SAndrew Rybchenko 		if (rc != 0) {
1893b809c27SAndrew Rybchenko 			sfc_err(sa,
1903b809c27SAndrew Rybchenko 				"cannot register interrupt handler (rc=%d)",
1913b809c27SAndrew Rybchenko 				rc);
1923b809c27SAndrew Rybchenko 			/*
1933b809c27SAndrew Rybchenko 			 * Convert error code from negative returned by RTE API
1943b809c27SAndrew Rybchenko 			 * to positive used in the driver.
1953b809c27SAndrew Rybchenko 			 */
1963b809c27SAndrew Rybchenko 			rc = -rc;
1973b809c27SAndrew Rybchenko 			goto fail_rte_intr_cb_reg;
1983b809c27SAndrew Rybchenko 		}
1993b809c27SAndrew Rybchenko 
2003b809c27SAndrew Rybchenko 		sfc_log_init(sa, "rte_intr_enable");
2013b809c27SAndrew Rybchenko 		rc = rte_intr_enable(intr_handle);
2023b809c27SAndrew Rybchenko 		if (rc != 0) {
2033b809c27SAndrew Rybchenko 			sfc_err(sa, "cannot enable interrupts (rc=%d)", rc);
2043b809c27SAndrew Rybchenko 			/*
2053b809c27SAndrew Rybchenko 			 * Convert error code from negative returned by RTE API
2063b809c27SAndrew Rybchenko 			 * to positive used in the driver.
2073b809c27SAndrew Rybchenko 			 */
2083b809c27SAndrew Rybchenko 			rc = -rc;
2093b809c27SAndrew Rybchenko 			goto fail_rte_intr_enable;
2103b809c27SAndrew Rybchenko 		}
2113b809c27SAndrew Rybchenko 
2123b809c27SAndrew Rybchenko 		sfc_log_init(sa, "efx_intr_enable");
2133b809c27SAndrew Rybchenko 		efx_intr_enable(sa->nic);
2143b809c27SAndrew Rybchenko 	}
2153b809c27SAndrew Rybchenko 
216d61138d4SHarman Kalra 	sfc_log_init(sa, "done type=%u max_intr=%d nb_efd=%u",
217d61138d4SHarman Kalra 		     rte_intr_type_get(intr_handle),
218d61138d4SHarman Kalra 		     rte_intr_max_intr_get(intr_handle),
219d61138d4SHarman Kalra 		     rte_intr_nb_efd_get(intr_handle));
22006bc1977SAndrew Rybchenko 	return 0;
22106bc1977SAndrew Rybchenko 
2223b809c27SAndrew Rybchenko fail_rte_intr_enable:
2233b809c27SAndrew Rybchenko 	rte_intr_callback_unregister(intr_handle, intr->handler, (void *)sa);
2243b809c27SAndrew Rybchenko 
2253b809c27SAndrew Rybchenko fail_rte_intr_cb_reg:
226d61138d4SHarman Kalra 	rte_intr_vec_list_free(intr_handle);
2274279b54eSGeorgiy Levashov 
2284279b54eSGeorgiy Levashov fail_intr_vector_alloc:
2294279b54eSGeorgiy Levashov 	rte_intr_efd_disable(intr_handle);
2304279b54eSGeorgiy Levashov 
2314279b54eSGeorgiy Levashov fail_rte_intr_efd_enable:
2323b809c27SAndrew Rybchenko 	efx_intr_fini(sa->nic);
2333b809c27SAndrew Rybchenko 
23406bc1977SAndrew Rybchenko fail_intr_init:
23506bc1977SAndrew Rybchenko 	sfc_log_init(sa, "failed %d", rc);
23606bc1977SAndrew Rybchenko 	return rc;
23706bc1977SAndrew Rybchenko }
23806bc1977SAndrew Rybchenko 
23906bc1977SAndrew Rybchenko void
sfc_intr_stop(struct sfc_adapter * sa)24006bc1977SAndrew Rybchenko sfc_intr_stop(struct sfc_adapter *sa)
24106bc1977SAndrew Rybchenko {
2423b809c27SAndrew Rybchenko 	struct sfc_intr *intr = &sa->intr;
243c0802544SFerruh Yigit 	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(sa->eth_dev);
2443b809c27SAndrew Rybchenko 
24506bc1977SAndrew Rybchenko 	sfc_log_init(sa, "entry");
24606bc1977SAndrew Rybchenko 
2473b809c27SAndrew Rybchenko 	if (intr->handler != NULL) {
2483b809c27SAndrew Rybchenko 		struct rte_intr_handle *intr_handle;
2493b809c27SAndrew Rybchenko 		int rc;
2503b809c27SAndrew Rybchenko 
2513b809c27SAndrew Rybchenko 		efx_intr_disable(sa->nic);
2523b809c27SAndrew Rybchenko 
253d61138d4SHarman Kalra 		intr_handle = pci_dev->intr_handle;
2544279b54eSGeorgiy Levashov 
255d61138d4SHarman Kalra 		rte_intr_vec_list_free(intr_handle);
2564279b54eSGeorgiy Levashov 		rte_intr_efd_disable(intr_handle);
2574279b54eSGeorgiy Levashov 
2583b809c27SAndrew Rybchenko 		if (rte_intr_disable(intr_handle) != 0)
2593b809c27SAndrew Rybchenko 			sfc_err(sa, "cannot disable interrupts");
2603b809c27SAndrew Rybchenko 
2613b809c27SAndrew Rybchenko 		while ((rc = rte_intr_callback_unregister(intr_handle,
2623b809c27SAndrew Rybchenko 				intr->handler, (void *)sa)) == -EAGAIN)
2633b809c27SAndrew Rybchenko 			;
2643b809c27SAndrew Rybchenko 		if (rc != 1)
2653b809c27SAndrew Rybchenko 			sfc_err(sa,
2663b809c27SAndrew Rybchenko 				"cannot unregister interrupt handler %d",
2673b809c27SAndrew Rybchenko 				rc);
2683b809c27SAndrew Rybchenko 	}
2693b809c27SAndrew Rybchenko 
27006bc1977SAndrew Rybchenko 	efx_intr_fini(sa->nic);
27106bc1977SAndrew Rybchenko 
27206bc1977SAndrew Rybchenko 	sfc_log_init(sa, "done");
27306bc1977SAndrew Rybchenko }
27406bc1977SAndrew Rybchenko 
27506bc1977SAndrew Rybchenko int
sfc_intr_configure(struct sfc_adapter * sa)27652597396SAndrew Rybchenko sfc_intr_configure(struct sfc_adapter *sa)
27706bc1977SAndrew Rybchenko {
2783b809c27SAndrew Rybchenko 	struct sfc_intr *intr = &sa->intr;
2793b809c27SAndrew Rybchenko 
28006bc1977SAndrew Rybchenko 	sfc_log_init(sa, "entry");
28106bc1977SAndrew Rybchenko 
2823b809c27SAndrew Rybchenko 	intr->handler = NULL;
2833b809c27SAndrew Rybchenko 	intr->lsc_intr = (sa->eth_dev->data->dev_conf.intr_conf.lsc != 0);
2844279b54eSGeorgiy Levashov 	intr->rxq_intr = (sa->eth_dev->data->dev_conf.intr_conf.rxq != 0);
2854279b54eSGeorgiy Levashov 
2864279b54eSGeorgiy Levashov 	if (!intr->lsc_intr && !intr->rxq_intr)
2873b809c27SAndrew Rybchenko 		goto done;
2883b809c27SAndrew Rybchenko 
2893b809c27SAndrew Rybchenko 	switch (intr->type) {
2903b809c27SAndrew Rybchenko 	case EFX_INTR_MESSAGE:
2913b809c27SAndrew Rybchenko 		intr->handler = sfc_intr_message_handler;
2923b809c27SAndrew Rybchenko 		break;
2933b809c27SAndrew Rybchenko 	case EFX_INTR_LINE:
2943b809c27SAndrew Rybchenko 		intr->handler = sfc_intr_line_handler;
2953b809c27SAndrew Rybchenko 		break;
2963b809c27SAndrew Rybchenko 	case EFX_INTR_INVALID:
2973b809c27SAndrew Rybchenko 		sfc_warn(sa, "interrupts are not supported");
2983b809c27SAndrew Rybchenko 		break;
2993b809c27SAndrew Rybchenko 	default:
3003b809c27SAndrew Rybchenko 		sfc_panic(sa, "unexpected EFX interrupt type %u\n", intr->type);
3013b809c27SAndrew Rybchenko 		break;
3023b809c27SAndrew Rybchenko 	}
3033b809c27SAndrew Rybchenko 
3043b809c27SAndrew Rybchenko done:
30506bc1977SAndrew Rybchenko 	sfc_log_init(sa, "done");
30606bc1977SAndrew Rybchenko 	return 0;
30706bc1977SAndrew Rybchenko }
30806bc1977SAndrew Rybchenko 
30906bc1977SAndrew Rybchenko void
sfc_intr_close(struct sfc_adapter * sa)31052597396SAndrew Rybchenko sfc_intr_close(struct sfc_adapter *sa)
31106bc1977SAndrew Rybchenko {
31206bc1977SAndrew Rybchenko 	sfc_log_init(sa, "entry");
31306bc1977SAndrew Rybchenko 
31406bc1977SAndrew Rybchenko 	sfc_log_init(sa, "done");
31506bc1977SAndrew Rybchenko }
31606bc1977SAndrew Rybchenko 
31706bc1977SAndrew Rybchenko int
sfc_intr_attach(struct sfc_adapter * sa)31806bc1977SAndrew Rybchenko sfc_intr_attach(struct sfc_adapter *sa)
31906bc1977SAndrew Rybchenko {
32006bc1977SAndrew Rybchenko 	struct sfc_intr *intr = &sa->intr;
321c0802544SFerruh Yigit 	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(sa->eth_dev);
32206bc1977SAndrew Rybchenko 
32306bc1977SAndrew Rybchenko 	sfc_log_init(sa, "entry");
32406bc1977SAndrew Rybchenko 
325d61138d4SHarman Kalra 	switch (rte_intr_type_get(pci_dev->intr_handle)) {
326742bde12SBruce Richardson #ifdef RTE_EXEC_ENV_LINUX
327edd69f7cSAndrew Rybchenko 	case RTE_INTR_HANDLE_UIO_INTX:
32806bc1977SAndrew Rybchenko 	case RTE_INTR_HANDLE_VFIO_LEGACY:
32906bc1977SAndrew Rybchenko 		intr->type = EFX_INTR_LINE;
33006bc1977SAndrew Rybchenko 		break;
331edd69f7cSAndrew Rybchenko 	case RTE_INTR_HANDLE_UIO:
33206bc1977SAndrew Rybchenko 	case RTE_INTR_HANDLE_VFIO_MSI:
33306bc1977SAndrew Rybchenko 	case RTE_INTR_HANDLE_VFIO_MSIX:
33406bc1977SAndrew Rybchenko 		intr->type = EFX_INTR_MESSAGE;
33506bc1977SAndrew Rybchenko 		break;
33606bc1977SAndrew Rybchenko #endif
33706bc1977SAndrew Rybchenko 	default:
33806bc1977SAndrew Rybchenko 		intr->type = EFX_INTR_INVALID;
33906bc1977SAndrew Rybchenko 		break;
34006bc1977SAndrew Rybchenko 	}
34106bc1977SAndrew Rybchenko 
34206bc1977SAndrew Rybchenko 	sfc_log_init(sa, "done");
34306bc1977SAndrew Rybchenko 	return 0;
34406bc1977SAndrew Rybchenko }
34506bc1977SAndrew Rybchenko 
34606bc1977SAndrew Rybchenko void
sfc_intr_detach(struct sfc_adapter * sa)34706bc1977SAndrew Rybchenko sfc_intr_detach(struct sfc_adapter *sa)
34806bc1977SAndrew Rybchenko {
34906bc1977SAndrew Rybchenko 	sfc_log_init(sa, "entry");
35006bc1977SAndrew Rybchenko 
35106bc1977SAndrew Rybchenko 	sa->intr.type = EFX_INTR_INVALID;
35206bc1977SAndrew Rybchenko 
35306bc1977SAndrew Rybchenko 	sfc_log_init(sa, "done");
35406bc1977SAndrew Rybchenko }
355