ef10_intr.c revision 293751
1283514Sarybchik/*- 2283514Sarybchik * Copyright (c) 2012-2015 Solarflare Communications Inc. 3283514Sarybchik * All rights reserved. 4283514Sarybchik * 5283514Sarybchik * Redistribution and use in source and binary forms, with or without 6283514Sarybchik * modification, are permitted provided that the following conditions are met: 7283514Sarybchik * 8283514Sarybchik * 1. Redistributions of source code must retain the above copyright notice, 9283514Sarybchik * this list of conditions and the following disclaimer. 10283514Sarybchik * 2. Redistributions in binary form must reproduce the above copyright notice, 11283514Sarybchik * this list of conditions and the following disclaimer in the documentation 12283514Sarybchik * and/or other materials provided with the distribution. 13283514Sarybchik * 14283514Sarybchik * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 15283514Sarybchik * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 16283514Sarybchik * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17283514Sarybchik * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 18283514Sarybchik * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19283514Sarybchik * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20283514Sarybchik * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 21283514Sarybchik * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 22283514Sarybchik * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 23283514Sarybchik * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 24283514Sarybchik * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25283514Sarybchik * 26283514Sarybchik * The views and conclusions contained in the software and documentation are 27283514Sarybchik * those of the authors and should not be interpreted as representing official 28283514Sarybchik * policies, either expressed or implied, of the FreeBSD Project. 29283514Sarybchik */ 30283514Sarybchik 31283514Sarybchik#include <sys/cdefs.h> 32283514Sarybchik__FBSDID("$FreeBSD: head/sys/dev/sfxge/common/hunt_intr.c 293751 2016-01-12 13:30:42Z arybchik $"); 33283514Sarybchik 34283514Sarybchik#include "efsys.h" 35283514Sarybchik#include "efx.h" 36283514Sarybchik#include "efx_impl.h" 37283514Sarybchik 38283514Sarybchik 39283514Sarybchik#if EFSYS_OPT_HUNTINGTON 40283514Sarybchik 41291436Sarybchik __checkReturn efx_rc_t 42293751Sarybchikef10_intr_init( 43283514Sarybchik __in efx_nic_t *enp, 44283514Sarybchik __in efx_intr_type_t type, 45283514Sarybchik __in efsys_mem_t *esmp) 46283514Sarybchik{ 47283514Sarybchik _NOTE(ARGUNUSED(enp, type, esmp)) 48283514Sarybchik return (0); 49283514Sarybchik} 50283514Sarybchik 51283514Sarybchik 52283514Sarybchik void 53293751Sarybchikef10_intr_enable( 54283514Sarybchik __in efx_nic_t *enp) 55283514Sarybchik{ 56283514Sarybchik _NOTE(ARGUNUSED(enp)) 57283514Sarybchik} 58283514Sarybchik 59283514Sarybchik 60283514Sarybchik void 61293751Sarybchikef10_intr_disable( 62283514Sarybchik __in efx_nic_t *enp) 63283514Sarybchik{ 64283514Sarybchik _NOTE(ARGUNUSED(enp)) 65283514Sarybchik} 66283514Sarybchik 67283514Sarybchik 68283514Sarybchik void 69293751Sarybchikef10_intr_disable_unlocked( 70283514Sarybchik __in efx_nic_t *enp) 71283514Sarybchik{ 72283514Sarybchik _NOTE(ARGUNUSED(enp)) 73283514Sarybchik} 74283514Sarybchik 75283514Sarybchik 76291436Sarybchikstatic __checkReturn efx_rc_t 77283514Sarybchikefx_mcdi_trigger_interrupt( 78283514Sarybchik __in efx_nic_t *enp, 79283514Sarybchik __in unsigned int level) 80283514Sarybchik{ 81283514Sarybchik efx_mcdi_req_t req; 82283514Sarybchik uint8_t payload[MAX(MC_CMD_TRIGGER_INTERRUPT_IN_LEN, 83283514Sarybchik MC_CMD_TRIGGER_INTERRUPT_OUT_LEN)]; 84291436Sarybchik efx_rc_t rc; 85283514Sarybchik 86293751Sarybchik EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON || 87293751Sarybchik enp->en_family == EFX_FAMILY_MEDFORD); 88283514Sarybchik 89283514Sarybchik if (level >= enp->en_nic_cfg.enc_intr_limit) { 90283514Sarybchik rc = EINVAL; 91283514Sarybchik goto fail1; 92283514Sarybchik } 93283514Sarybchik 94283514Sarybchik (void) memset(payload, 0, sizeof (payload)); 95283514Sarybchik req.emr_cmd = MC_CMD_TRIGGER_INTERRUPT; 96283514Sarybchik req.emr_in_buf = payload; 97283514Sarybchik req.emr_in_length = MC_CMD_TRIGGER_INTERRUPT_IN_LEN; 98283514Sarybchik req.emr_out_buf = payload; 99283514Sarybchik req.emr_out_length = MC_CMD_TRIGGER_INTERRUPT_OUT_LEN; 100283514Sarybchik 101283514Sarybchik MCDI_IN_SET_DWORD(req, TRIGGER_INTERRUPT_IN_INTR_LEVEL, level); 102283514Sarybchik 103283514Sarybchik efx_mcdi_execute(enp, &req); 104283514Sarybchik 105283514Sarybchik if (req.emr_rc != 0) { 106283514Sarybchik rc = req.emr_rc; 107283514Sarybchik goto fail2; 108283514Sarybchik } 109283514Sarybchik 110283514Sarybchik return (0); 111283514Sarybchik 112283514Sarybchikfail2: 113283514Sarybchik EFSYS_PROBE(fail2); 114283514Sarybchik 115283514Sarybchikfail1: 116291436Sarybchik EFSYS_PROBE1(fail1, efx_rc_t, rc); 117283514Sarybchik 118283514Sarybchik return (rc); 119283514Sarybchik} 120283514Sarybchik 121291436Sarybchik __checkReturn efx_rc_t 122293751Sarybchikef10_intr_trigger( 123283514Sarybchik __in efx_nic_t *enp, 124283514Sarybchik __in unsigned int level) 125283514Sarybchik{ 126283514Sarybchik efx_nic_cfg_t *encp = &(enp->en_nic_cfg); 127291436Sarybchik efx_rc_t rc; 128283514Sarybchik 129283514Sarybchik if (encp->enc_bug41750_workaround) { 130293751Sarybchik /* 131293751Sarybchik * bug 41750: Test interrupts don't work on Greenport 132293751Sarybchik * bug 50084: Test interrupts don't work on VFs 133293751Sarybchik */ 134283514Sarybchik rc = ENOTSUP; 135283514Sarybchik goto fail1; 136283514Sarybchik } 137283514Sarybchik 138283514Sarybchik if ((rc = efx_mcdi_trigger_interrupt(enp, level)) != 0) 139283514Sarybchik goto fail2; 140283514Sarybchik 141283514Sarybchik return (0); 142283514Sarybchik 143283514Sarybchikfail2: 144283514Sarybchik EFSYS_PROBE(fail2); 145283514Sarybchikfail1: 146291436Sarybchik EFSYS_PROBE1(fail1, efx_rc_t, rc); 147283514Sarybchik 148283514Sarybchik return (rc); 149283514Sarybchik} 150283514Sarybchik 151283514Sarybchik 152283514Sarybchik void 153293751Sarybchikef10_intr_fini( 154283514Sarybchik __in efx_nic_t *enp) 155283514Sarybchik{ 156283514Sarybchik _NOTE(ARGUNUSED(enp)) 157283514Sarybchik} 158283514Sarybchik 159283514Sarybchik#endif /* EFSYS_OPT_HUNTINGTON */ 160