]> git.ipfire.org Git - people/ms/u-boot.git/blob - arch/powerpc/cpu/mpc85xx/t4240_serdes.c
Add GPL-2.0+ SPDX-License-Identifier to source files
[people/ms/u-boot.git] / arch / powerpc / cpu / mpc85xx / t4240_serdes.c
1 /*
2 * Copyright 2012 Freescale Semiconductor, Inc.
3 *
4 * SPDX-License-Identifier: GPL-2.0+
5 */
6
7 #include <common.h>
8 #include <asm/fsl_serdes.h>
9 #include <asm/processor.h>
10 #include <asm/io.h>
11 #include "fsl_corenet2_serdes.h"
12
13 struct serdes_config {
14 u32 protocol;
15 u8 lanes[SRDS_MAX_LANES];
16 };
17
18 #ifdef CONFIG_PPC_T4240
19 static const struct serdes_config serdes1_cfg_tbl[] = {
20 /* SerDes 1 */
21 {1, {XAUI_FM1_MAC9, XAUI_FM1_MAC9,
22 XAUI_FM1_MAC9, XAUI_FM1_MAC9,
23 XAUI_FM1_MAC10, XAUI_FM1_MAC10,
24 XAUI_FM1_MAC10, XAUI_FM1_MAC10}},
25 {2, {HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
26 HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
27 HIGIG_FM1_MAC10, HIGIG_FM1_MAC10,
28 HIGIG_FM1_MAC10, HIGIG_FM1_MAC10}},
29 {4, {HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
30 HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
31 HIGIG_FM1_MAC10, HIGIG_FM1_MAC10,
32 HIGIG_FM1_MAC10, HIGIG_FM1_MAC10}},
33 {28, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
34 SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
35 SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
36 SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4}},
37 {36, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
38 SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
39 SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
40 SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4}},
41 {38, {NONE, NONE, QSGMII_FM1_B, NONE,
42 NONE, NONE, QSGMII_FM1_A, NONE}},
43 {40, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
44 SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
45 NONE, NONE, QSGMII_FM1_A, NONE}},
46 {46, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
47 SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
48 NONE, NONE, QSGMII_FM1_A, NONE}},
49 {48, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
50 SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
51 NONE, NONE, QSGMII_FM1_A, NONE}},
52 {}
53 };
54 static const struct serdes_config serdes2_cfg_tbl[] = {
55 /* SerDes 2 */
56 {1, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
57 XAUI_FM2_MAC9, XAUI_FM2_MAC9,
58 XAUI_FM2_MAC10, XAUI_FM2_MAC10,
59 XAUI_FM2_MAC10, XAUI_FM2_MAC10}},
60 {2, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
61 HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
62 HIGIG_FM2_MAC10, HIGIG_FM2_MAC10,
63 HIGIG_FM2_MAC10, HIGIG_FM2_MAC10}},
64 {4, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
65 HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
66 HIGIG_FM2_MAC10, HIGIG_FM2_MAC10,
67 HIGIG_FM2_MAC10, HIGIG_FM2_MAC10}},
68 {7, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
69 XAUI_FM2_MAC9, XAUI_FM2_MAC9,
70 SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
71 SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
72 {13, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
73 XAUI_FM2_MAC9, XAUI_FM2_MAC9,
74 SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
75 SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
76 {14, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
77 XAUI_FM2_MAC9, XAUI_FM2_MAC9,
78 SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
79 SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
80 {16, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
81 HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
82 SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
83 SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
84 {22, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
85 HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
86 SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
87 SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
88 {23, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
89 HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
90 SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
91 SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
92 {25, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
93 HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
94 SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
95 SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
96 {26, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
97 HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
98 SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
99 SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
100 {28, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
101 SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
102 SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
103 SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
104 {36, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
105 SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
106 SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
107 SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
108 {38, {NONE, NONE, QSGMII_FM2_B, NONE,
109 NONE, NONE, QSGMII_FM1_A, NONE}},
110 {40, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
111 SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
112 NONE, NONE, QSGMII_FM1_A, NONE}},
113 {46, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
114 SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
115 NONE, NONE, QSGMII_FM1_A, NONE}},
116 {48, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
117 SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
118 NONE, NONE, QSGMII_FM1_A, NONE}},
119 {50, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
120 XAUI_FM2_MAC9, XAUI_FM2_MAC9,
121 NONE, NONE, QSGMII_FM1_A, NONE}},
122 {52, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
123 HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
124 NONE, NONE, QSGMII_FM1_A, NONE}},
125 {54, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
126 HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
127 NONE, NONE, QSGMII_FM1_A, NONE}},
128 {56, {XFI_FM1_MAC9, XFI_FM1_MAC10,
129 XFI_FM2_MAC10, XFI_FM2_MAC9,
130 SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
131 SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
132 {57, {XFI_FM1_MAC9, XFI_FM1_MAC10,
133 XFI_FM2_MAC10, XFI_FM2_MAC9,
134 SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
135 SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
136 {}
137 };
138 static const struct serdes_config serdes3_cfg_tbl[] = {
139 /* SerDes 3 */
140 {2, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1}},
141 {4, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, PCIE2, PCIE2}},
142 {6, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, SRIO1, SRIO1, SRIO1}},
143 {8, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, NONE, NONE, NONE}},
144 {9, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
145 INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN}},
146 {10, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
147 INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN}},
148 {12, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
149 PCIE2, PCIE2, PCIE2, PCIE2}},
150 {14, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
151 PCIE2, PCIE2, PCIE2, PCIE2}},
152 {16, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
153 SRIO1, SRIO1, SRIO1, SRIO1}},
154 {17, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
155 SRIO1, SRIO1, SRIO1, SRIO1}},
156 {19, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
157 SRIO1, SRIO1, SRIO1, SRIO1}},
158 {20, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
159 SRIO1, SRIO1, SRIO1, SRIO1}},
160 {}
161 };
162 static const struct serdes_config serdes4_cfg_tbl[] = {
163 /* SerDes 4 */
164 {2, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3}},
165 {4, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, PCIE4, PCIE4}},
166 {6, {PCIE3, PCIE3, PCIE3, PCIE3, SRIO2, SRIO2, SRIO2, SRIO2}},
167 {8, {PCIE3, PCIE3, PCIE3, PCIE3, SRIO2, SRIO2, SRIO2, SRIO2}},
168 {10, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, SATA1, SATA2} },
169 {12, {PCIE3, PCIE3, PCIE3, PCIE3, AURORA, AURORA, SATA1, SATA2} },
170 {14, {PCIE3, PCIE3, PCIE3, PCIE3, AURORA, AURORA, SRIO2, SRIO2}},
171 {16, {PCIE3, PCIE3, PCIE3, PCIE3, AURORA, AURORA, SRIO2, SRIO2}},
172 {18, {PCIE3, PCIE3, PCIE3, PCIE3, AURORA, AURORA, AURORA, AURORA}},
173 {}
174 };
175 #elif defined(CONFIG_PPC_T4160)
176 static const struct serdes_config serdes1_cfg_tbl[] = {
177 /* SerDes 1 */
178 {1, {XAUI_FM1_MAC9, XAUI_FM1_MAC9,
179 XAUI_FM1_MAC9, XAUI_FM1_MAC9,
180 XAUI_FM1_MAC10, XAUI_FM1_MAC10,
181 XAUI_FM1_MAC10, XAUI_FM1_MAC10} },
182 {2, {HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
183 HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
184 HIGIG_FM1_MAC10, HIGIG_FM1_MAC10,
185 HIGIG_FM1_MAC10, HIGIG_FM1_MAC10} },
186 {4, {HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
187 HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
188 HIGIG_FM1_MAC10, HIGIG_FM1_MAC10,
189 HIGIG_FM1_MAC10, HIGIG_FM1_MAC10} },
190 {28, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
191 SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
192 SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
193 SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4} },
194 {36, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
195 SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
196 SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
197 SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4} },
198 {38, {NONE, NONE, QSGMII_FM1_B, NONE,
199 NONE, NONE, QSGMII_FM1_A, NONE} },
200 {}
201 };
202 static const struct serdes_config serdes2_cfg_tbl[] = {
203 /* SerDes 2 */
204 {7, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
205 XAUI_FM2_MAC9, XAUI_FM2_MAC9,
206 SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
207 SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
208 {13, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
209 XAUI_FM2_MAC9, XAUI_FM2_MAC9,
210 SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
211 SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
212 {16, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
213 HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
214 SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
215 SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
216 {22, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
217 HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
218 SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
219 SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
220 {25, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
221 HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
222 SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
223 SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
224 {26, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
225 HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
226 SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
227 NONE, NONE} },
228 {28, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
229 SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
230 SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
231 SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
232 {36, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
233 SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
234 SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
235 SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
236 {38, {NONE, NONE, QSGMII_FM2_B, NONE,
237 NONE, QSGMII_FM1_A, NONE, NONE} },
238 {40, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
239 SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
240 NONE, QSGMII_FM1_A, NONE, NONE} },
241 {46, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
242 SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
243 NONE, QSGMII_FM1_A, NONE, NONE} },
244 {48, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
245 SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
246 NONE, QSGMII_FM1_A, NONE, NONE} },
247 {50, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
248 XAUI_FM2_MAC9, XAUI_FM2_MAC9,
249 NONE, NONE, NONE, NONE} },
250 {52, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
251 HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
252 NONE, NONE, NONE, NONE} },
253 {54, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
254 HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
255 NONE, NONE, NONE, NONE} },
256 {56, {NONE, XFI_FM1_MAC10,
257 XFI_FM2_MAC10, NONE,
258 SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
259 SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
260 {57, {NONE, XFI_FM1_MAC10,
261 XFI_FM2_MAC10, NONE,
262 SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
263 NONE, NONE} },
264 {}
265 };
266 static const struct serdes_config serdes3_cfg_tbl[] = {
267 /* SerDes 3 */
268 {2, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1} },
269 {4, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, PCIE2, PCIE2} },
270 {6, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, SRIO1, SRIO1, SRIO1} },
271 {8, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, NONE, NONE, NONE} },
272 {9, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
273 INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN} },
274 {10, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
275 INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN} },
276 {12, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
277 PCIE2, PCIE2, PCIE2, PCIE2} },
278 {14, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
279 PCIE2, PCIE2, PCIE2, PCIE2} },
280 {16, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
281 SRIO1, SRIO1, SRIO1, SRIO1} },
282 {17, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
283 SRIO1, SRIO1, SRIO1, SRIO1} },
284 {19, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
285 SRIO1, SRIO1, SRIO1, SRIO1} },
286 {20, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
287 NONE, NONE, NONE, NONE} },
288 {}
289 };
290 static const struct serdes_config serdes4_cfg_tbl[] = {
291 /* SerDes 4 */
292 {4, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, PCIE4, PCIE4} },
293 {6, {SRIO2, SRIO2, SRIO2, SRIO2, SRIO2, SRIO2, SRIO2, SRIO2} },
294 {8, {SRIO2, SRIO2, SRIO2, SRIO2, SRIO2, SRIO2, SRIO2, SRIO2} },
295 {10, {PCIE3, PCIE3, PCIE3, PCIE3, SATA1, SATA1, SATA2, SATA2} },
296 {12, {AURORA, AURORA, AURORA, AURORA, SATA1, SATA1, SATA2, SATA2} },
297 {14, {AURORA, AURORA, AURORA, AURORA, SRIO2, SRIO2, SRIO2, SRIO2} },
298 {16, {AURORA, AURORA, AURORA, AURORA, SRIO2, SRIO2, SRIO2, SRIO2} },
299 {18, {AURORA, AURORA, AURORA, AURORA, AURORA, AURORA, AURORA, AURORA} },
300 {}
301 }
302 ;
303 #else
304 #error "Need to define SerDes protocol"
305 #endif
306 static const struct serdes_config *serdes_cfg_tbl[] = {
307 serdes1_cfg_tbl,
308 serdes2_cfg_tbl,
309 serdes3_cfg_tbl,
310 serdes4_cfg_tbl,
311 };
312
313 enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane)
314 {
315 const struct serdes_config *ptr;
316
317 if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
318 return 0;
319
320 ptr = serdes_cfg_tbl[serdes];
321 while (ptr->protocol) {
322 if (ptr->protocol == cfg)
323 return ptr->lanes[lane];
324 ptr++;
325 }
326 return 0;
327 }
328
329 int is_serdes_prtcl_valid(int serdes, u32 prtcl)
330 {
331 int i;
332 const struct serdes_config *ptr;
333
334 if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
335 return 0;
336
337 ptr = serdes_cfg_tbl[serdes];
338 while (ptr->protocol) {
339 if (ptr->protocol == prtcl)
340 break;
341 ptr++;
342 }
343
344 if (!ptr->protocol)
345 return 0;
346
347 for (i = 0; i < SRDS_MAX_LANES; i++) {
348 if (ptr->lanes[i] != NONE)
349 return 1;
350 }
351
352 return 0;
353 }