1 /*
2 * Copyright 2007-2013 Solarflare Communications Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 * SUCH DAMAGE.
24 */
25
26 #include "efsys.h"
27 #include "efx.h"
28 #include "efx_types.h"
29 #include "efx_regs.h"
30 #include "efx_impl.h"
31 #include "nullphy.h"
32 #include "nullphy_impl.h"
33
34 #if EFSYS_OPT_PHY_NULL
35
36 __checkReturn int
37 nullphy_reset(
38 __in efx_nic_t *enp)
39 {
40 _NOTE(ARGUNUSED(enp))
41
42 enp->en_reset_flags |= EFX_RESET_PHY;
43
44 return (0);
45 }
46
47 __checkReturn int
48 nullphy_reconfigure(
49 __in efx_nic_t *enp)
50 {
51 efx_port_t *epp = &(enp->en_port);
52 efx_word_t word;
53 efx_word_t check;
54 int rc;
55
56 _NOTE(ARGUNUSED(enp))
57
58 EFX_POPULATE_WORD_3(word, HOSTPORT_EQ, 1, PORTSEL, 0, CX4uC_RESET, 1);
59
60 if ((rc = falcon_i2c_send(enp, PCF8575, (caddr_t)&word.ew_byte[0],
61 sizeof (word.ew_byte) / sizeof (efx_byte_t))) != 0)
62 goto fail1;
63
64 if ((rc = falcon_i2c_recv(enp, PCF8575, (caddr_t)&check.ew_byte[0],
65 sizeof (check.ew_byte) / sizeof (efx_byte_t))) != 0)
66 goto fail2;
67
68 if (EFX_WORD_FIELD(check, EFX_WORD_0) !=
69 EFX_WORD_FIELD(word, EFX_WORD_0)) {
70 rc = EFAULT;
71 goto fail3;
72 }
73
74 EFSYS_ASSERT3U(epp->ep_adv_cap_mask, ==, NULLPHY_ADV_CAP_MASK);
75
76 return (0);
77
78 fail3:
79 EFSYS_PROBE(fail3);
80 fail2:
81 EFSYS_PROBE(fail2);
82 fail1:
83 EFSYS_PROBE1(fail1, int, rc);
84
85 return (rc);
86 }
87
88 __checkReturn int
89 nullphy_verify(
90 __in efx_nic_t *enp)
91 {
92 _NOTE(ARGUNUSED(enp))
93
94 return (ENOTSUP);
95 }
96
97 __checkReturn int
98 nullphy_downlink_check(
99 __in efx_nic_t *enp,
100 __out efx_link_mode_t *modep,
101 __out unsigned int *fcntlp,
102 __out uint32_t *lp_cap_maskp)
103 {
104 efx_port_t *epp = &(enp->en_port);
105
106 *modep = EFX_LINK_10000FDX;
107 *fcntlp = epp->ep_fcntl;
108 *lp_cap_maskp = NULLPHY_ADV_CAP_MASK;
109
110 return (0);
111 }
112
113 __checkReturn int
114 nullphy_lp_cap_get(
115 __in efx_nic_t *enp,
116 __out uint32_t *maskp)
117 {
118 _NOTE(ARGUNUSED(enp, maskp))
119
120 return (ENOTSUP);
121 }
122
123 __checkReturn int
124 nullphy_oui_get(
125 __in efx_nic_t *enp,
126 __out uint32_t *ouip)
127 {
128 _NOTE(ARGUNUSED(enp, ouip))
129
130 return (ENOTSUP);
131 }
132
133 #if EFSYS_OPT_PHY_STATS
134
135 __checkReturn int
136 nullphy_stats_update(
137 __in efx_nic_t *enp,
138 __in efsys_mem_t *esmp,
139 __out_ecount(EFX_PHY_NSTATS) uint32_t *stat)
140 {
141 _NOTE(ARGUNUSED(enp, esmp, stat))
142
143 return (ENOTSUP);
144 }
145 #endif /* EFSYS_OPT_PHY_STATS */
146
147 #if EFSYS_OPT_PHY_PROPS
148
149 #if EFSYS_OPT_NAMES
150 const char __cs *
151 nullphy_prop_name(
152 __in efx_nic_t *enp,
153 __in unsigned int id)
154 {
155 _NOTE(ARGUNUSED(enp, id))
156
157 EFSYS_ASSERT(B_FALSE);
158
159 return (NULL);
160 }
161 #endif /* EFSYS_OPT_NAMES */
162
163 __checkReturn int
164 nullphy_prop_get(
165 __in efx_nic_t *enp,
166 __in unsigned int id,
167 __in uint32_t flags,
168 __out uint32_t *valp)
169 {
170 _NOTE(ARGUNUSED(enp, id, flags, valp))
171
172 EFSYS_ASSERT(B_FALSE);
173
174 return (ENOTSUP);
175 }
176
177 __checkReturn int
178 nullphy_prop_set(
179 __in efx_nic_t *enp,
180 __in unsigned int id,
181 __in uint32_t val)
182 {
183 _NOTE(ARGUNUSED(enp, id, val))
184
185 EFSYS_ASSERT(B_FALSE);
186
187 return (ENOTSUP);
188 }
189 #endif /* EFSYS_OPT_PHY_PROPS */
190
191 #endif /* EFSYS_OPT_PHY_NULL */