ef10_intr.c revision 291436
1/*-
2 * Copyright (c) 2012-2015 Solarflare Communications Inc.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 *    this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 *    this list of conditions and the following disclaimer in the documentation
12 *    and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
21 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
22 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
24 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 *
26 * The views and conclusions contained in the software and documentation are
27 * those of the authors and should not be interpreted as representing official
28 * policies, either expressed or implied, of the FreeBSD Project.
29 */
30
31#include <sys/cdefs.h>
32__FBSDID("$FreeBSD: head/sys/dev/sfxge/common/hunt_intr.c 291436 2015-11-29 05:42:49Z arybchik $");
33
34#include "efsys.h"
35#include "efx.h"
36#include "efx_impl.h"
37
38
39#if EFSYS_OPT_HUNTINGTON
40
41	__checkReturn	efx_rc_t
42hunt_intr_init(
43	__in		efx_nic_t *enp,
44	__in		efx_intr_type_t type,
45	__in		efsys_mem_t *esmp)
46{
47	_NOTE(ARGUNUSED(enp, type, esmp))
48	return (0);
49}
50
51
52			void
53hunt_intr_enable(
54	__in		efx_nic_t *enp)
55{
56	_NOTE(ARGUNUSED(enp))
57}
58
59
60			void
61hunt_intr_disable(
62	__in		efx_nic_t *enp)
63{
64	_NOTE(ARGUNUSED(enp))
65}
66
67
68			void
69hunt_intr_disable_unlocked(
70	__in		efx_nic_t *enp)
71{
72	_NOTE(ARGUNUSED(enp))
73}
74
75
76static	__checkReturn	efx_rc_t
77efx_mcdi_trigger_interrupt(
78	__in		efx_nic_t *enp,
79	__in		unsigned int level)
80{
81	efx_mcdi_req_t req;
82	uint8_t payload[MAX(MC_CMD_TRIGGER_INTERRUPT_IN_LEN,
83			    MC_CMD_TRIGGER_INTERRUPT_OUT_LEN)];
84	efx_rc_t rc;
85
86	EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON);
87
88	if (level >= enp->en_nic_cfg.enc_intr_limit) {
89		rc = EINVAL;
90		goto fail1;
91	}
92
93	(void) memset(payload, 0, sizeof (payload));
94	req.emr_cmd = MC_CMD_TRIGGER_INTERRUPT;
95	req.emr_in_buf = payload;
96	req.emr_in_length = MC_CMD_TRIGGER_INTERRUPT_IN_LEN;
97	req.emr_out_buf = payload;
98	req.emr_out_length = MC_CMD_TRIGGER_INTERRUPT_OUT_LEN;
99
100	MCDI_IN_SET_DWORD(req, TRIGGER_INTERRUPT_IN_INTR_LEVEL, level);
101
102	efx_mcdi_execute(enp, &req);
103
104	if (req.emr_rc != 0) {
105		rc = req.emr_rc;
106		goto fail2;
107	}
108
109	return (0);
110
111fail2:
112	EFSYS_PROBE(fail2);
113
114fail1:
115	EFSYS_PROBE1(fail1, efx_rc_t, rc);
116
117	return (rc);
118}
119
120	__checkReturn	efx_rc_t
121hunt_intr_trigger(
122	__in		efx_nic_t *enp,
123	__in		unsigned int level)
124{
125	efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
126	efx_rc_t rc;
127
128	if (encp->enc_bug41750_workaround) {
129		/* bug 41750: Test interrupts don't work on Greenport */
130		rc = ENOTSUP;
131		goto fail1;
132	}
133
134	if ((rc = efx_mcdi_trigger_interrupt(enp, level)) != 0)
135		goto fail2;
136
137	return (0);
138
139fail2:
140	EFSYS_PROBE(fail2);
141fail1:
142	EFSYS_PROBE1(fail1, efx_rc_t, rc);
143
144	return (rc);
145}
146
147
148			void
149hunt_intr_fini(
150	__in		efx_nic_t *enp)
151{
152	_NOTE(ARGUNUSED(enp))
153}
154
155#endif	/* EFSYS_OPT_HUNTINGTON */
156