ef10_intr.c revision 293769
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 293769 2016-01-12 15:28:59Z 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 151293769Sarybchik void 152293769Sarybchikef10_intr_status_line( 153293769Sarybchik __in efx_nic_t *enp, 154293769Sarybchik __out boolean_t *fatalp, 155293769Sarybchik __out uint32_t *qmaskp) 156293769Sarybchik{ 157293769Sarybchik efx_dword_t dword; 158283514Sarybchik 159293769Sarybchik EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON || 160293769Sarybchik enp->en_family == EFX_FAMILY_MEDFORD); 161293769Sarybchik 162293769Sarybchik /* Read the queue mask and implicitly acknowledge the interrupt. */ 163293769Sarybchik EFX_BAR_READD(enp, ER_DZ_BIU_INT_ISR_REG, &dword, B_FALSE); 164293769Sarybchik *qmaskp = EFX_DWORD_FIELD(dword, EFX_DWORD_0); 165293769Sarybchik 166293769Sarybchik EFSYS_PROBE1(qmask, uint32_t, *qmaskp); 167293769Sarybchik 168293769Sarybchik *fatalp = B_FALSE; 169293769Sarybchik} 170293769Sarybchik 171283514Sarybchik void 172293769Sarybchikef10_intr_status_message( 173293769Sarybchik __in efx_nic_t *enp, 174293769Sarybchik __in unsigned int message, 175293769Sarybchik __out boolean_t *fatalp) 176293769Sarybchik{ 177293769Sarybchik EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON || 178293769Sarybchik enp->en_family == EFX_FAMILY_MEDFORD); 179293769Sarybchik 180293769Sarybchik _NOTE(ARGUNUSED(enp, message)) 181293769Sarybchik 182293769Sarybchik /* EF10 fatal errors are reported via events */ 183293769Sarybchik *fatalp = B_FALSE; 184293769Sarybchik} 185293769Sarybchik 186293769Sarybchik void 187293769Sarybchikef10_intr_fatal( 188293769Sarybchik __in efx_nic_t *enp) 189293769Sarybchik{ 190293769Sarybchik /* EF10 fatal errors are reported via events */ 191293769Sarybchik _NOTE(ARGUNUSED(enp)) 192293769Sarybchik} 193293769Sarybchik 194293769Sarybchik void 195293751Sarybchikef10_intr_fini( 196283514Sarybchik __in efx_nic_t *enp) 197283514Sarybchik{ 198283514Sarybchik _NOTE(ARGUNUSED(enp)) 199283514Sarybchik} 200283514Sarybchik 201283514Sarybchik#endif /* EFSYS_OPT_HUNTINGTON */ 202