ef10_intr.c revision 283514
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 283514 2015-05-25 08:34:55Z arybchik $"); 33283514Sarybchik 34283514Sarybchik#include "efsys.h" 35283514Sarybchik#include "efx.h" 36283514Sarybchik#include "efx_impl.h" 37283514Sarybchik 38283514Sarybchik 39283514Sarybchik#if EFSYS_OPT_HUNTINGTON 40283514Sarybchik 41283514Sarybchik __checkReturn int 42283514Sarybchikhunt_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 53283514Sarybchikhunt_intr_enable( 54283514Sarybchik __in efx_nic_t *enp) 55283514Sarybchik{ 56283514Sarybchik _NOTE(ARGUNUSED(enp)) 57283514Sarybchik} 58283514Sarybchik 59283514Sarybchik 60283514Sarybchik void 61283514Sarybchikhunt_intr_disable( 62283514Sarybchik __in efx_nic_t *enp) 63283514Sarybchik{ 64283514Sarybchik _NOTE(ARGUNUSED(enp)) 65283514Sarybchik} 66283514Sarybchik 67283514Sarybchik 68283514Sarybchik void 69283514Sarybchikhunt_intr_disable_unlocked( 70283514Sarybchik __in efx_nic_t *enp) 71283514Sarybchik{ 72283514Sarybchik _NOTE(ARGUNUSED(enp)) 73283514Sarybchik} 74283514Sarybchik 75283514Sarybchik 76283514Sarybchikstatic __checkReturn int 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)]; 84283514Sarybchik int rc; 85283514Sarybchik 86283514Sarybchik EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON); 87283514Sarybchik 88283514Sarybchik if (level >= enp->en_nic_cfg.enc_intr_limit) { 89283514Sarybchik rc = EINVAL; 90283514Sarybchik goto fail1; 91283514Sarybchik } 92283514Sarybchik 93283514Sarybchik (void) memset(payload, 0, sizeof (payload)); 94283514Sarybchik req.emr_cmd = MC_CMD_TRIGGER_INTERRUPT; 95283514Sarybchik req.emr_in_buf = payload; 96283514Sarybchik req.emr_in_length = MC_CMD_TRIGGER_INTERRUPT_IN_LEN; 97283514Sarybchik req.emr_out_buf = payload; 98283514Sarybchik req.emr_out_length = MC_CMD_TRIGGER_INTERRUPT_OUT_LEN; 99283514Sarybchik 100283514Sarybchik MCDI_IN_SET_DWORD(req, TRIGGER_INTERRUPT_IN_INTR_LEVEL, level); 101283514Sarybchik 102283514Sarybchik efx_mcdi_execute(enp, &req); 103283514Sarybchik 104283514Sarybchik if (req.emr_rc != 0) { 105283514Sarybchik rc = req.emr_rc; 106283514Sarybchik goto fail2; 107283514Sarybchik } 108283514Sarybchik 109283514Sarybchik return (0); 110283514Sarybchik 111283514Sarybchikfail2: 112283514Sarybchik EFSYS_PROBE(fail2); 113283514Sarybchik 114283514Sarybchikfail1: 115283514Sarybchik EFSYS_PROBE1(fail1, int, rc); 116283514Sarybchik 117283514Sarybchik return (rc); 118283514Sarybchik} 119283514Sarybchik 120283514Sarybchik __checkReturn int 121283514Sarybchikhunt_intr_trigger( 122283514Sarybchik __in efx_nic_t *enp, 123283514Sarybchik __in unsigned int level) 124283514Sarybchik{ 125283514Sarybchik efx_nic_cfg_t *encp = &(enp->en_nic_cfg); 126283514Sarybchik int rc; 127283514Sarybchik 128283514Sarybchik if (encp->enc_bug41750_workaround) { 129283514Sarybchik /* bug 41750: Test interrupts don't work on Greenport */ 130283514Sarybchik rc = ENOTSUP; 131283514Sarybchik goto fail1; 132283514Sarybchik } 133283514Sarybchik 134283514Sarybchik if ((rc = efx_mcdi_trigger_interrupt(enp, level)) != 0) 135283514Sarybchik goto fail2; 136283514Sarybchik 137283514Sarybchik return (0); 138283514Sarybchik 139283514Sarybchikfail2: 140283514Sarybchik EFSYS_PROBE(fail2); 141283514Sarybchikfail1: 142283514Sarybchik EFSYS_PROBE1(fail1, int, rc); 143283514Sarybchik 144283514Sarybchik return (rc); 145283514Sarybchik} 146283514Sarybchik 147283514Sarybchik 148283514Sarybchik void 149283514Sarybchikhunt_intr_fini( 150283514Sarybchik __in efx_nic_t *enp) 151283514Sarybchik{ 152283514Sarybchik _NOTE(ARGUNUSED(enp)) 153283514Sarybchik} 154283514Sarybchik 155283514Sarybchik#endif /* EFSYS_OPT_HUNTINGTON */ 156