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