1*d14abf15SRobert Mustacchi /*
2*d14abf15SRobert Mustacchi * CDDL HEADER START
3*d14abf15SRobert Mustacchi *
4*d14abf15SRobert Mustacchi * The contents of this file are subject to the terms of the
5*d14abf15SRobert Mustacchi * Common Development and Distribution License (the "License").
6*d14abf15SRobert Mustacchi * You may not use this file except in compliance with the License.
7*d14abf15SRobert Mustacchi *
8*d14abf15SRobert Mustacchi * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*d14abf15SRobert Mustacchi * or http://www.opensolaris.org/os/licensing.
10*d14abf15SRobert Mustacchi * See the License for the specific language governing permissions
11*d14abf15SRobert Mustacchi * and limitations under the License.
12*d14abf15SRobert Mustacchi *
13*d14abf15SRobert Mustacchi * When distributing Covered Code, include this CDDL HEADER in each
14*d14abf15SRobert Mustacchi * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*d14abf15SRobert Mustacchi * If applicable, add the following below this CDDL HEADER, with the
16*d14abf15SRobert Mustacchi * fields enclosed by brackets "[]" replaced with your own identifying
17*d14abf15SRobert Mustacchi * information: Portions Copyright [yyyy] [name of copyright owner]
18*d14abf15SRobert Mustacchi *
19*d14abf15SRobert Mustacchi * CDDL HEADER END
20*d14abf15SRobert Mustacchi */
21*d14abf15SRobert Mustacchi
22*d14abf15SRobert Mustacchi /*
23*d14abf15SRobert Mustacchi * Copyright 2014 QLogic Corporation
24*d14abf15SRobert Mustacchi * The contents of this file are subject to the terms of the
25*d14abf15SRobert Mustacchi * QLogic End User License (the "License").
26*d14abf15SRobert Mustacchi * You may not use this file except in compliance with the License.
27*d14abf15SRobert Mustacchi *
28*d14abf15SRobert Mustacchi * You can obtain a copy of the License at
29*d14abf15SRobert Mustacchi * http://www.qlogic.com/Resources/Documents/DriverDownloadHelp/
30*d14abf15SRobert Mustacchi * QLogic_End_User_Software_License.txt
31*d14abf15SRobert Mustacchi * See the License for the specific language governing permissions
32*d14abf15SRobert Mustacchi * and limitations under the License.
33*d14abf15SRobert Mustacchi */
34*d14abf15SRobert Mustacchi
35*d14abf15SRobert Mustacchi /*
36*d14abf15SRobert Mustacchi * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
37*d14abf15SRobert Mustacchi */
38*d14abf15SRobert Mustacchi
39*d14abf15SRobert Mustacchi #include "bnxe.h"
40*d14abf15SRobert Mustacchi
41*d14abf15SRobert Mustacchi #include <sys/mac.h>
42*d14abf15SRobert Mustacchi #include <sys/mac_ether.h>
43*d14abf15SRobert Mustacchi #include <sys/dlpi.h>
44*d14abf15SRobert Mustacchi
45*d14abf15SRobert Mustacchi #if !(defined(__S11) || defined(__S12))
46*d14abf15SRobert Mustacchi #define mri_driver mr_driver
47*d14abf15SRobert Mustacchi #define mri_start mr_start
48*d14abf15SRobert Mustacchi #define mri_stop mr_stop
49*d14abf15SRobert Mustacchi #define mri_intr mr_intr
50*d14abf15SRobert Mustacchi #define mri_poll mr_poll
51*d14abf15SRobert Mustacchi #define mri_tx mr_send
52*d14abf15SRobert Mustacchi #define mgi_driver mrg_driver
53*d14abf15SRobert Mustacchi #define mgi_start mrg_start
54*d14abf15SRobert Mustacchi #define mgi_stop mrg_stop
55*d14abf15SRobert Mustacchi #define mgi_count mrg_count
56*d14abf15SRobert Mustacchi #define mgi_addmac mrg_addmac
57*d14abf15SRobert Mustacchi #define mgi_remmac mrg_addmac
58*d14abf15SRobert Mustacchi #define mr_gaddring mr_gadd_ring
59*d14abf15SRobert Mustacchi #define mr_gremring mr_grem_ring
60*d14abf15SRobert Mustacchi #endif /* not __S11 or __S12 */
61*d14abf15SRobert Mustacchi
62*d14abf15SRobert Mustacchi /*
63*d14abf15SRobert Mustacchi * Reconfiguring the network devices parameters require net_config
64*d14abf15SRobert Mustacchi * privilege starting Solaris 10. Only root user is allowed to
65*d14abf15SRobert Mustacchi * update device parameter in Solaris 9 and earlier version. Following
66*d14abf15SRobert Mustacchi * declaration allows single binary image to run on all OS versions.
67*d14abf15SRobert Mustacchi */
68*d14abf15SRobert Mustacchi extern int secpolicy_net_config(const cred_t *, boolean_t);
69*d14abf15SRobert Mustacchi extern int drv_priv(cred_t *);
70*d14abf15SRobert Mustacchi #pragma weak secpolicy_net_config
71*d14abf15SRobert Mustacchi #pragma weak drv_priv
72*d14abf15SRobert Mustacchi
73*d14abf15SRobert Mustacchi #ifdef MC_SETPROP
74*d14abf15SRobert Mustacchi
75*d14abf15SRobert Mustacchi char * bnxeLink_priv_props[] =
76*d14abf15SRobert Mustacchi {
77*d14abf15SRobert Mustacchi "_adv_2500fdx_cap",
78*d14abf15SRobert Mustacchi "_en_2500fdx_cap",
79*d14abf15SRobert Mustacchi "_adv_txpause_cap",
80*d14abf15SRobert Mustacchi "_en_txpause_cap",
81*d14abf15SRobert Mustacchi "_txpause",
82*d14abf15SRobert Mustacchi "_adv_rxpause_cap",
83*d14abf15SRobert Mustacchi "_en_rxpause_cap",
84*d14abf15SRobert Mustacchi "_rxpause",
85*d14abf15SRobert Mustacchi "_autoneg_flow",
86*d14abf15SRobert Mustacchi "_checksum",
87*d14abf15SRobert Mustacchi "_num_rings",
88*d14abf15SRobert Mustacchi "_rx_descs",
89*d14abf15SRobert Mustacchi "_rx_free_reclaim",
90*d14abf15SRobert Mustacchi "_rx_copy_threshold",
91*d14abf15SRobert Mustacchi "_tx_descs",
92*d14abf15SRobert Mustacchi "_tx_free_reclaim",
93*d14abf15SRobert Mustacchi "_tx_copy_threshold",
94*d14abf15SRobert Mustacchi "_tx_ring_policy",
95*d14abf15SRobert Mustacchi "_interrupt_coalesce",
96*d14abf15SRobert Mustacchi "_rx_interrupt_coalesce_usec",
97*d14abf15SRobert Mustacchi "_tx_interrupt_coalesce_usec",
98*d14abf15SRobert Mustacchi "_disable_msix",
99*d14abf15SRobert Mustacchi "_l2_fw_flow_ctrl",
100*d14abf15SRobert Mustacchi "_autogreeen_enable",
101*d14abf15SRobert Mustacchi "_lso_enable",
102*d14abf15SRobert Mustacchi "_log_enable",
103*d14abf15SRobert Mustacchi "_fcoe_enable",
104*d14abf15SRobert Mustacchi NULL
105*d14abf15SRobert Mustacchi };
106*d14abf15SRobert Mustacchi
107*d14abf15SRobert Mustacchi #endif /* MC_SETPROP */
108*d14abf15SRobert Mustacchi
109*d14abf15SRobert Mustacchi
BnxeMacStats(void * pArg,uint_t stat,uint64_t * pVal)110*d14abf15SRobert Mustacchi static int BnxeMacStats(void * pArg,
111*d14abf15SRobert Mustacchi uint_t stat,
112*d14abf15SRobert Mustacchi uint64_t * pVal)
113*d14abf15SRobert Mustacchi {
114*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg;
115*d14abf15SRobert Mustacchi lm_device_t * pLM;
116*d14abf15SRobert Mustacchi b10_l2_chip_statistics_t b10_l2_stats;
117*d14abf15SRobert Mustacchi int idx, rc = 0;
118*d14abf15SRobert Mustacchi
119*d14abf15SRobert Mustacchi if ((pUM == NULL) || (pVal == NULL))
120*d14abf15SRobert Mustacchi {
121*d14abf15SRobert Mustacchi return EINVAL;
122*d14abf15SRobert Mustacchi }
123*d14abf15SRobert Mustacchi
124*d14abf15SRobert Mustacchi pLM = &pUM->lm_dev;
125*d14abf15SRobert Mustacchi
126*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM);
127*d14abf15SRobert Mustacchi
128*d14abf15SRobert Mustacchi if (!pUM->plumbed)
129*d14abf15SRobert Mustacchi {
130*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
131*d14abf15SRobert Mustacchi return EAGAIN;
132*d14abf15SRobert Mustacchi }
133*d14abf15SRobert Mustacchi
134*d14abf15SRobert Mustacchi *pVal = 0;
135*d14abf15SRobert Mustacchi
136*d14abf15SRobert Mustacchi switch (stat)
137*d14abf15SRobert Mustacchi {
138*d14abf15SRobert Mustacchi case MAC_STAT_IFSPEED:
139*d14abf15SRobert Mustacchi *pVal = (pUM->props.link_speed * 1000000ULL);
140*d14abf15SRobert Mustacchi break;
141*d14abf15SRobert Mustacchi
142*d14abf15SRobert Mustacchi case MAC_STAT_MULTIRCV:
143*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
144*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
145*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.IfHCInMulticastPkts;
146*d14abf15SRobert Mustacchi break;
147*d14abf15SRobert Mustacchi
148*d14abf15SRobert Mustacchi case MAC_STAT_BRDCSTRCV:
149*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
150*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
151*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.IfHCInBroadcastPkts;
152*d14abf15SRobert Mustacchi break;
153*d14abf15SRobert Mustacchi
154*d14abf15SRobert Mustacchi case MAC_STAT_MULTIXMT:
155*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
156*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
157*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.IfHCOutMulticastPkts;
158*d14abf15SRobert Mustacchi break;
159*d14abf15SRobert Mustacchi
160*d14abf15SRobert Mustacchi case MAC_STAT_BRDCSTXMT:
161*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
162*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
163*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.IfHCOutBroadcastPkts;
164*d14abf15SRobert Mustacchi break;
165*d14abf15SRobert Mustacchi
166*d14abf15SRobert Mustacchi case MAC_STAT_NORCVBUF:
167*d14abf15SRobert Mustacchi lm_get_stats(pLM, LM_STATS_RCV_NO_BUFFER_DROP, (u64_t *)pVal);
168*d14abf15SRobert Mustacchi break;
169*d14abf15SRobert Mustacchi
170*d14abf15SRobert Mustacchi case MAC_STAT_NOXMTBUF:
171*d14abf15SRobert Mustacchi *pVal = 0;
172*d14abf15SRobert Mustacchi LM_FOREACH_TSS_IDX(pLM, idx)
173*d14abf15SRobert Mustacchi {
174*d14abf15SRobert Mustacchi *pVal += pUM->txq[idx].txRecycle;
175*d14abf15SRobert Mustacchi }
176*d14abf15SRobert Mustacchi break;
177*d14abf15SRobert Mustacchi
178*d14abf15SRobert Mustacchi case MAC_STAT_IERRORS:
179*d14abf15SRobert Mustacchi case ETHER_STAT_MACRCV_ERRORS:
180*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
181*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
182*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.IfInErrors;
183*d14abf15SRobert Mustacchi break;
184*d14abf15SRobert Mustacchi
185*d14abf15SRobert Mustacchi case MAC_STAT_OERRORS:
186*d14abf15SRobert Mustacchi /* XXX not available */
187*d14abf15SRobert Mustacchi break;
188*d14abf15SRobert Mustacchi
189*d14abf15SRobert Mustacchi case MAC_STAT_COLLISIONS:
190*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
191*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
192*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.EtherStatsCollisions;
193*d14abf15SRobert Mustacchi break;
194*d14abf15SRobert Mustacchi
195*d14abf15SRobert Mustacchi case MAC_STAT_RBYTES:
196*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
197*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
198*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.IfHCInOctets;
199*d14abf15SRobert Mustacchi break;
200*d14abf15SRobert Mustacchi
201*d14abf15SRobert Mustacchi case MAC_STAT_IPACKETS:
202*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
203*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
204*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.IfHCInPkts;
205*d14abf15SRobert Mustacchi break;
206*d14abf15SRobert Mustacchi
207*d14abf15SRobert Mustacchi case MAC_STAT_OBYTES:
208*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
209*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
210*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.IfHCOutOctets;
211*d14abf15SRobert Mustacchi break;
212*d14abf15SRobert Mustacchi
213*d14abf15SRobert Mustacchi case MAC_STAT_OPACKETS:
214*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
215*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
216*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.IfHCOutPkts;
217*d14abf15SRobert Mustacchi break;
218*d14abf15SRobert Mustacchi
219*d14abf15SRobert Mustacchi case ETHER_STAT_ALIGN_ERRORS:
220*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
221*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
222*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.Dot3StatsAlignmentErrors;
223*d14abf15SRobert Mustacchi break;
224*d14abf15SRobert Mustacchi
225*d14abf15SRobert Mustacchi case ETHER_STAT_FCS_ERRORS:
226*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
227*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
228*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.Dot3StatsFCSErrors;
229*d14abf15SRobert Mustacchi break;
230*d14abf15SRobert Mustacchi
231*d14abf15SRobert Mustacchi case ETHER_STAT_FIRST_COLLISIONS:
232*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
233*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
234*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.Dot3StatsSingleCollisionFrames;
235*d14abf15SRobert Mustacchi break;
236*d14abf15SRobert Mustacchi
237*d14abf15SRobert Mustacchi case ETHER_STAT_MULTI_COLLISIONS:
238*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
239*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
240*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.Dot3StatsMultipleCollisionFrames;
241*d14abf15SRobert Mustacchi break;
242*d14abf15SRobert Mustacchi
243*d14abf15SRobert Mustacchi case ETHER_STAT_DEFER_XMTS:
244*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
245*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
246*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.Dot3StatsDeferredTransmissions;
247*d14abf15SRobert Mustacchi break;
248*d14abf15SRobert Mustacchi
249*d14abf15SRobert Mustacchi case ETHER_STAT_TX_LATE_COLLISIONS:
250*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
251*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
252*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.Dot3StatsLateCollisions;
253*d14abf15SRobert Mustacchi break;
254*d14abf15SRobert Mustacchi
255*d14abf15SRobert Mustacchi case ETHER_STAT_EX_COLLISIONS:
256*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
257*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
258*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.Dot3StatsExcessiveCollisions;
259*d14abf15SRobert Mustacchi break;
260*d14abf15SRobert Mustacchi
261*d14abf15SRobert Mustacchi case ETHER_STAT_MACXMT_ERRORS:
262*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
263*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
264*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.Dot3StatsInternalMacTransmitErrors;
265*d14abf15SRobert Mustacchi break;
266*d14abf15SRobert Mustacchi
267*d14abf15SRobert Mustacchi case ETHER_STAT_CARRIER_ERRORS:
268*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
269*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
270*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.Dot3StatsCarrierSenseErrors;
271*d14abf15SRobert Mustacchi break;
272*d14abf15SRobert Mustacchi
273*d14abf15SRobert Mustacchi case ETHER_STAT_TOOLONG_ERRORS:
274*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
275*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
276*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.EtherStatsOverrsizePkts;
277*d14abf15SRobert Mustacchi break;
278*d14abf15SRobert Mustacchi
279*d14abf15SRobert Mustacchi #if (MAC_VERSION > 1)
280*d14abf15SRobert Mustacchi case ETHER_STAT_TOOSHORT_ERRORS:
281*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(pLM, &b10_l2_stats,
282*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_1);
283*d14abf15SRobert Mustacchi *pVal = b10_l2_stats.EtherStatsUndersizePkts;
284*d14abf15SRobert Mustacchi break;
285*d14abf15SRobert Mustacchi #endif
286*d14abf15SRobert Mustacchi
287*d14abf15SRobert Mustacchi case ETHER_STAT_XCVR_ADDR:
288*d14abf15SRobert Mustacchi *pVal = pLM->vars.phy_addr;
289*d14abf15SRobert Mustacchi break;
290*d14abf15SRobert Mustacchi
291*d14abf15SRobert Mustacchi case ETHER_STAT_XCVR_ID:
292*d14abf15SRobert Mustacchi *pVal = 0;
293*d14abf15SRobert Mustacchi break;
294*d14abf15SRobert Mustacchi
295*d14abf15SRobert Mustacchi case ETHER_STAT_XCVR_INUSE:
296*d14abf15SRobert Mustacchi switch (pUM->props.link_speed)
297*d14abf15SRobert Mustacchi {
298*d14abf15SRobert Mustacchi case 0: /* no speed then status is down */
299*d14abf15SRobert Mustacchi *pVal = XCVR_NONE;
300*d14abf15SRobert Mustacchi break;
301*d14abf15SRobert Mustacchi
302*d14abf15SRobert Mustacchi case 1000:
303*d14abf15SRobert Mustacchi *pVal = XCVR_1000X;
304*d14abf15SRobert Mustacchi break;
305*d14abf15SRobert Mustacchi
306*d14abf15SRobert Mustacchi case 100:
307*d14abf15SRobert Mustacchi *pVal = XCVR_100X;
308*d14abf15SRobert Mustacchi break;
309*d14abf15SRobert Mustacchi
310*d14abf15SRobert Mustacchi case 10:
311*d14abf15SRobert Mustacchi *pVal = XCVR_10;
312*d14abf15SRobert Mustacchi break;
313*d14abf15SRobert Mustacchi
314*d14abf15SRobert Mustacchi default:
315*d14abf15SRobert Mustacchi /* catches 2500/10000 */
316*d14abf15SRobert Mustacchi *pVal = XCVR_UNDEFINED;
317*d14abf15SRobert Mustacchi }
318*d14abf15SRobert Mustacchi break;
319*d14abf15SRobert Mustacchi
320*d14abf15SRobert Mustacchi #if (MAC_VERSION > 1)
321*d14abf15SRobert Mustacchi case ETHER_STAT_CAP_10GFDX:
322*d14abf15SRobert Mustacchi *pVal = 1;
323*d14abf15SRobert Mustacchi break;
324*d14abf15SRobert Mustacchi #endif
325*d14abf15SRobert Mustacchi
326*d14abf15SRobert Mustacchi case ETHER_STAT_CAP_1000FDX:
327*d14abf15SRobert Mustacchi *pVal = 1;
328*d14abf15SRobert Mustacchi break;
329*d14abf15SRobert Mustacchi
330*d14abf15SRobert Mustacchi #if 0
331*d14abf15SRobert Mustacchi case ETHER_STAT_CAP_1000HDX:
332*d14abf15SRobert Mustacchi //*pVal = linkconf->param_1000hdx;
333*d14abf15SRobert Mustacchi *pVal = 0;
334*d14abf15SRobert Mustacchi break;
335*d14abf15SRobert Mustacchi #endif
336*d14abf15SRobert Mustacchi
337*d14abf15SRobert Mustacchi case ETHER_STAT_CAP_100FDX:
338*d14abf15SRobert Mustacchi //*pVal = linkconf->param_100fdx;
339*d14abf15SRobert Mustacchi *pVal = 1;
340*d14abf15SRobert Mustacchi break;
341*d14abf15SRobert Mustacchi
342*d14abf15SRobert Mustacchi case ETHER_STAT_CAP_100HDX:
343*d14abf15SRobert Mustacchi //*pVal = linkconf->param_100hdx;
344*d14abf15SRobert Mustacchi *pVal = 1;
345*d14abf15SRobert Mustacchi break;
346*d14abf15SRobert Mustacchi
347*d14abf15SRobert Mustacchi case ETHER_STAT_CAP_10FDX:
348*d14abf15SRobert Mustacchi //*pVal = linkconf->param_10fdx;
349*d14abf15SRobert Mustacchi *pVal = 1;
350*d14abf15SRobert Mustacchi break;
351*d14abf15SRobert Mustacchi
352*d14abf15SRobert Mustacchi case ETHER_STAT_CAP_10HDX:
353*d14abf15SRobert Mustacchi //*pVal = linkconf->param_10hdx;
354*d14abf15SRobert Mustacchi *pVal = 1;
355*d14abf15SRobert Mustacchi break;
356*d14abf15SRobert Mustacchi
357*d14abf15SRobert Mustacchi case ETHER_STAT_CAP_ASMPAUSE:
358*d14abf15SRobert Mustacchi *pVal = 1;
359*d14abf15SRobert Mustacchi break;
360*d14abf15SRobert Mustacchi
361*d14abf15SRobert Mustacchi case ETHER_STAT_CAP_PAUSE:
362*d14abf15SRobert Mustacchi *pVal = 1;
363*d14abf15SRobert Mustacchi break;
364*d14abf15SRobert Mustacchi
365*d14abf15SRobert Mustacchi case ETHER_STAT_CAP_AUTONEG:
366*d14abf15SRobert Mustacchi *pVal = 1;
367*d14abf15SRobert Mustacchi break;
368*d14abf15SRobert Mustacchi
369*d14abf15SRobert Mustacchi #if (MAC_VERSION > 1)
370*d14abf15SRobert Mustacchi case ETHER_STAT_CAP_REMFAULT:
371*d14abf15SRobert Mustacchi *pVal = 1;
372*d14abf15SRobert Mustacchi break;
373*d14abf15SRobert Mustacchi #endif
374*d14abf15SRobert Mustacchi
375*d14abf15SRobert Mustacchi #if (MAC_VERSION > 1)
376*d14abf15SRobert Mustacchi case ETHER_STAT_ADV_CAP_10GFDX:
377*d14abf15SRobert Mustacchi *pVal = pUM->curcfg.lnkcfg.param_10000fdx;
378*d14abf15SRobert Mustacchi break;
379*d14abf15SRobert Mustacchi #endif
380*d14abf15SRobert Mustacchi
381*d14abf15SRobert Mustacchi case ETHER_STAT_ADV_CAP_1000FDX:
382*d14abf15SRobert Mustacchi *pVal = pUM->curcfg.lnkcfg.param_1000fdx;
383*d14abf15SRobert Mustacchi break;
384*d14abf15SRobert Mustacchi
385*d14abf15SRobert Mustacchi #if 0
386*d14abf15SRobert Mustacchi case ETHER_STAT_ADV_CAP_1000HDX:
387*d14abf15SRobert Mustacchi //*pVal = pUM->curcfg.lnkcfg.param_1000hdx;
388*d14abf15SRobert Mustacchi *pVal = 0;
389*d14abf15SRobert Mustacchi break;
390*d14abf15SRobert Mustacchi #endif
391*d14abf15SRobert Mustacchi
392*d14abf15SRobert Mustacchi case ETHER_STAT_ADV_CAP_100FDX:
393*d14abf15SRobert Mustacchi *pVal = pUM->curcfg.lnkcfg.param_100fdx;
394*d14abf15SRobert Mustacchi break;
395*d14abf15SRobert Mustacchi
396*d14abf15SRobert Mustacchi case ETHER_STAT_ADV_CAP_100HDX:
397*d14abf15SRobert Mustacchi *pVal = pUM->curcfg.lnkcfg.param_100hdx;
398*d14abf15SRobert Mustacchi break;
399*d14abf15SRobert Mustacchi
400*d14abf15SRobert Mustacchi case ETHER_STAT_ADV_CAP_10FDX:
401*d14abf15SRobert Mustacchi *pVal = pUM->curcfg.lnkcfg.param_10fdx;
402*d14abf15SRobert Mustacchi break;
403*d14abf15SRobert Mustacchi
404*d14abf15SRobert Mustacchi case ETHER_STAT_ADV_CAP_10HDX:
405*d14abf15SRobert Mustacchi *pVal = pUM->curcfg.lnkcfg.param_10hdx;
406*d14abf15SRobert Mustacchi break;
407*d14abf15SRobert Mustacchi
408*d14abf15SRobert Mustacchi case ETHER_STAT_ADV_CAP_ASMPAUSE:
409*d14abf15SRobert Mustacchi *pVal = 1;
410*d14abf15SRobert Mustacchi break;
411*d14abf15SRobert Mustacchi
412*d14abf15SRobert Mustacchi case ETHER_STAT_ADV_CAP_PAUSE:
413*d14abf15SRobert Mustacchi *pVal = 1;
414*d14abf15SRobert Mustacchi break;
415*d14abf15SRobert Mustacchi
416*d14abf15SRobert Mustacchi case ETHER_STAT_ADV_CAP_AUTONEG:
417*d14abf15SRobert Mustacchi *pVal = pUM->curcfg.lnkcfg.link_autoneg;
418*d14abf15SRobert Mustacchi break;
419*d14abf15SRobert Mustacchi
420*d14abf15SRobert Mustacchi #if (MAC_VERSION > 1)
421*d14abf15SRobert Mustacchi case ETHER_STAT_ADV_REMFAULT:
422*d14abf15SRobert Mustacchi *pVal = 1;
423*d14abf15SRobert Mustacchi break;
424*d14abf15SRobert Mustacchi #endif
425*d14abf15SRobert Mustacchi
426*d14abf15SRobert Mustacchi #if 0 /* LP caps not supported */
427*d14abf15SRobert Mustacchi #if (MAC_VERSION > 1)
428*d14abf15SRobert Mustacchi case ETHER_STAT_LP_CAP_10GFDX:
429*d14abf15SRobert Mustacchi *pVal = pUM->remote.param_10000fdx;
430*d14abf15SRobert Mustacchi break;
431*d14abf15SRobert Mustacchi #endif
432*d14abf15SRobert Mustacchi
433*d14abf15SRobert Mustacchi case ETHER_STAT_LP_CAP_1000FDX:
434*d14abf15SRobert Mustacchi *pVal = pUM->remote.param_1000fdx;
435*d14abf15SRobert Mustacchi break;
436*d14abf15SRobert Mustacchi
437*d14abf15SRobert Mustacchi #if 0
438*d14abf15SRobert Mustacchi case ETHER_STAT_LP_CAP_1000HDX:
439*d14abf15SRobert Mustacchi //*pVal = pUM->remote.param_1000hdx;
440*d14abf15SRobert Mustacchi *pVal = 0;
441*d14abf15SRobert Mustacchi break;
442*d14abf15SRobert Mustacchi #endif
443*d14abf15SRobert Mustacchi
444*d14abf15SRobert Mustacchi case ETHER_STAT_LP_CAP_100FDX:
445*d14abf15SRobert Mustacchi *pVal = pUM->remote.param_100fdx;
446*d14abf15SRobert Mustacchi break;
447*d14abf15SRobert Mustacchi
448*d14abf15SRobert Mustacchi case ETHER_STAT_LP_CAP_100HDX:
449*d14abf15SRobert Mustacchi *pVal = pUM->remote.param_100hdx;
450*d14abf15SRobert Mustacchi break;
451*d14abf15SRobert Mustacchi
452*d14abf15SRobert Mustacchi case ETHER_STAT_LP_CAP_10FDX:
453*d14abf15SRobert Mustacchi *pVal = pUM->remote.param_10fdx;
454*d14abf15SRobert Mustacchi break;
455*d14abf15SRobert Mustacchi
456*d14abf15SRobert Mustacchi case ETHER_STAT_LP_CAP_10HDX:
457*d14abf15SRobert Mustacchi *pVal = pUM->remote.param_10hdx;
458*d14abf15SRobert Mustacchi break;
459*d14abf15SRobert Mustacchi
460*d14abf15SRobert Mustacchi #if 0
461*d14abf15SRobert Mustacchi case ETHER_STAT_LP_CAP_ASMPAUSE:
462*d14abf15SRobert Mustacchi /* XXX implement LP_ASYM_PAUSE stat */
463*d14abf15SRobert Mustacchi break;
464*d14abf15SRobert Mustacchi
465*d14abf15SRobert Mustacchi case ETHER_STAT_LP_CAP_PAUSE:
466*d14abf15SRobert Mustacchi /* XXX implement LP_PAUSE stat */
467*d14abf15SRobert Mustacchi break;
468*d14abf15SRobert Mustacchi #endif
469*d14abf15SRobert Mustacchi
470*d14abf15SRobert Mustacchi case ETHER_STAT_LP_CAP_AUTONEG:
471*d14abf15SRobert Mustacchi *pVal = pUM->remote.link_autoneg;
472*d14abf15SRobert Mustacchi break;
473*d14abf15SRobert Mustacchi
474*d14abf15SRobert Mustacchi case ETHER_STAT_LP_REMFAULT:
475*d14abf15SRobert Mustacchi /* XXX implement LP_REMFAULT stat */
476*d14abf15SRobert Mustacchi break;
477*d14abf15SRobert Mustacchi #endif /* LP caps not supported */
478*d14abf15SRobert Mustacchi
479*d14abf15SRobert Mustacchi #if 0
480*d14abf15SRobert Mustacchi case ETHER_STAT_LINK_ASMPAUSE:
481*d14abf15SRobert Mustacchi /* XXX implement ASMPAUSE stat */
482*d14abf15SRobert Mustacchi break;
483*d14abf15SRobert Mustacchi
484*d14abf15SRobert Mustacchi case ETHER_STAT_LINK_PAUSE:
485*d14abf15SRobert Mustacchi /* XXX implement PAUSE stat */
486*d14abf15SRobert Mustacchi break;
487*d14abf15SRobert Mustacchi #endif
488*d14abf15SRobert Mustacchi
489*d14abf15SRobert Mustacchi case ETHER_STAT_LINK_AUTONEG:
490*d14abf15SRobert Mustacchi *pVal = pUM->curcfg.lnkcfg.link_autoneg;
491*d14abf15SRobert Mustacchi break;
492*d14abf15SRobert Mustacchi
493*d14abf15SRobert Mustacchi case ETHER_STAT_LINK_DUPLEX:
494*d14abf15SRobert Mustacchi *pVal = (pUM->props.link_duplex == B_TRUE) ?
495*d14abf15SRobert Mustacchi LINK_DUPLEX_FULL : LINK_DUPLEX_HALF;
496*d14abf15SRobert Mustacchi break;
497*d14abf15SRobert Mustacchi
498*d14abf15SRobert Mustacchi default:
499*d14abf15SRobert Mustacchi rc = ENOTSUP;
500*d14abf15SRobert Mustacchi }
501*d14abf15SRobert Mustacchi
502*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
503*d14abf15SRobert Mustacchi
504*d14abf15SRobert Mustacchi return rc;
505*d14abf15SRobert Mustacchi }
506*d14abf15SRobert Mustacchi
507*d14abf15SRobert Mustacchi
508*d14abf15SRobert Mustacchi
509*d14abf15SRobert Mustacchi /*
510*d14abf15SRobert Mustacchi * This routine is called by GLD to enable device for packet reception and
511*d14abf15SRobert Mustacchi * enable interrupts.
512*d14abf15SRobert Mustacchi */
BnxeMacStart(void * pArg)513*d14abf15SRobert Mustacchi static int BnxeMacStart(void * pArg)
514*d14abf15SRobert Mustacchi {
515*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg;
516*d14abf15SRobert Mustacchi
517*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM);
518*d14abf15SRobert Mustacchi
519*d14abf15SRobert Mustacchi if (pUM->plumbed)
520*d14abf15SRobert Mustacchi {
521*d14abf15SRobert Mustacchi /* already started */
522*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
523*d14abf15SRobert Mustacchi return EAGAIN;
524*d14abf15SRobert Mustacchi }
525*d14abf15SRobert Mustacchi
526*d14abf15SRobert Mustacchi /* Always report the initial link state as unknown. */
527*d14abf15SRobert Mustacchi mac_link_update(pUM->pMac, LINK_STATE_UNKNOWN);
528*d14abf15SRobert Mustacchi
529*d14abf15SRobert Mustacchi if (BnxeHwStartL2(pUM))
530*d14abf15SRobert Mustacchi {
531*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
532*d14abf15SRobert Mustacchi return EIO;
533*d14abf15SRobert Mustacchi }
534*d14abf15SRobert Mustacchi
535*d14abf15SRobert Mustacchi atomic_swap_32(&pUM->plumbed, B_TRUE);
536*d14abf15SRobert Mustacchi
537*d14abf15SRobert Mustacchi mutex_enter(&bnxeLoaderMutex);
538*d14abf15SRobert Mustacchi bnxeNumPlumbed++;
539*d14abf15SRobert Mustacchi mutex_exit(&bnxeLoaderMutex);
540*d14abf15SRobert Mustacchi
541*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
542*d14abf15SRobert Mustacchi
543*d14abf15SRobert Mustacchi return 0;
544*d14abf15SRobert Mustacchi }
545*d14abf15SRobert Mustacchi
546*d14abf15SRobert Mustacchi
547*d14abf15SRobert Mustacchi /*
548*d14abf15SRobert Mustacchi * This routine stops packet reception by clearing RX MASK register. Also
549*d14abf15SRobert Mustacchi * interrupts are disabled for this device.
550*d14abf15SRobert Mustacchi */
BnxeMacStop(void * pArg)551*d14abf15SRobert Mustacchi static void BnxeMacStop(void * pArg)
552*d14abf15SRobert Mustacchi {
553*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg;
554*d14abf15SRobert Mustacchi
555*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM);
556*d14abf15SRobert Mustacchi
557*d14abf15SRobert Mustacchi if (pUM->plumbed)
558*d14abf15SRobert Mustacchi {
559*d14abf15SRobert Mustacchi atomic_swap_32(&pUM->plumbed, B_FALSE);
560*d14abf15SRobert Mustacchi
561*d14abf15SRobert Mustacchi BnxeHwStopL2(pUM);
562*d14abf15SRobert Mustacchi
563*d14abf15SRobert Mustacchi /* Report the link state back to unknown. */
564*d14abf15SRobert Mustacchi mac_link_update(pUM->pMac, LINK_STATE_UNKNOWN);
565*d14abf15SRobert Mustacchi
566*d14abf15SRobert Mustacchi mutex_enter(&bnxeLoaderMutex);
567*d14abf15SRobert Mustacchi bnxeNumPlumbed--;
568*d14abf15SRobert Mustacchi mutex_exit(&bnxeLoaderMutex);
569*d14abf15SRobert Mustacchi }
570*d14abf15SRobert Mustacchi
571*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
572*d14abf15SRobert Mustacchi }
573*d14abf15SRobert Mustacchi
574*d14abf15SRobert Mustacchi /* (flag) TRUE = on, FALSE = off */
BnxeMacPromiscuous(void * pArg,boolean_t flag)575*d14abf15SRobert Mustacchi static int BnxeMacPromiscuous(void * pArg,
576*d14abf15SRobert Mustacchi boolean_t flag)
577*d14abf15SRobert Mustacchi {
578*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg;
579*d14abf15SRobert Mustacchi
580*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM);
581*d14abf15SRobert Mustacchi
582*d14abf15SRobert Mustacchi if (!pUM->plumbed)
583*d14abf15SRobert Mustacchi {
584*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
585*d14abf15SRobert Mustacchi return EAGAIN;
586*d14abf15SRobert Mustacchi }
587*d14abf15SRobert Mustacchi
588*d14abf15SRobert Mustacchi if (flag)
589*d14abf15SRobert Mustacchi {
590*d14abf15SRobert Mustacchi pUM->devParams.rx_filter_mask[LM_CLI_IDX_NDIS] |=
591*d14abf15SRobert Mustacchi LM_RX_MASK_PROMISCUOUS_MODE;
592*d14abf15SRobert Mustacchi }
593*d14abf15SRobert Mustacchi else
594*d14abf15SRobert Mustacchi {
595*d14abf15SRobert Mustacchi pUM->devParams.rx_filter_mask[LM_CLI_IDX_NDIS] &=
596*d14abf15SRobert Mustacchi ~LM_RX_MASK_PROMISCUOUS_MODE;
597*d14abf15SRobert Mustacchi }
598*d14abf15SRobert Mustacchi
599*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_HWINIT(pUM);
600*d14abf15SRobert Mustacchi
601*d14abf15SRobert Mustacchi if (BnxeRxMask(pUM, LM_CLI_IDX_NDIS,
602*d14abf15SRobert Mustacchi pUM->devParams.rx_filter_mask[LM_CLI_IDX_NDIS]) < 0)
603*d14abf15SRobert Mustacchi {
604*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_HWINIT(pUM);
605*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
606*d14abf15SRobert Mustacchi return ECANCELED;
607*d14abf15SRobert Mustacchi }
608*d14abf15SRobert Mustacchi
609*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_HWINIT(pUM);
610*d14abf15SRobert Mustacchi
611*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
612*d14abf15SRobert Mustacchi
613*d14abf15SRobert Mustacchi return 0;
614*d14abf15SRobert Mustacchi }
615*d14abf15SRobert Mustacchi
616*d14abf15SRobert Mustacchi
617*d14abf15SRobert Mustacchi /*
618*d14abf15SRobert Mustacchi * This function is used to enable or disable multicast packet reception for
619*d14abf15SRobert Mustacchi * particular multicast addresses.
620*d14abf15SRobert Mustacchi * (flag) TRUE = add, FALSE = remove
621*d14abf15SRobert Mustacchi */
BnxeMacMulticast(void * pArg,boolean_t flag,const uint8_t * pMcastAddr)622*d14abf15SRobert Mustacchi static int BnxeMacMulticast(void * pArg,
623*d14abf15SRobert Mustacchi boolean_t flag,
624*d14abf15SRobert Mustacchi const uint8_t * pMcastAddr)
625*d14abf15SRobert Mustacchi {
626*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg;
627*d14abf15SRobert Mustacchi int rc;
628*d14abf15SRobert Mustacchi
629*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM);
630*d14abf15SRobert Mustacchi
631*d14abf15SRobert Mustacchi if (!pUM->plumbed)
632*d14abf15SRobert Mustacchi {
633*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
634*d14abf15SRobert Mustacchi return EAGAIN;
635*d14abf15SRobert Mustacchi }
636*d14abf15SRobert Mustacchi
637*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_HWINIT(pUM);
638*d14abf15SRobert Mustacchi rc = BnxeMulticast(pUM, LM_CLI_IDX_NDIS, flag, pMcastAddr, B_TRUE);
639*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_HWINIT(pUM);
640*d14abf15SRobert Mustacchi
641*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
642*d14abf15SRobert Mustacchi
643*d14abf15SRobert Mustacchi return rc;
644*d14abf15SRobert Mustacchi }
645*d14abf15SRobert Mustacchi
646*d14abf15SRobert Mustacchi
647*d14abf15SRobert Mustacchi #ifdef BNXE_RINGS
648*d14abf15SRobert Mustacchi
649*d14abf15SRobert Mustacchi #if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS)
BnxeRxRingGroupAddMac(void * groupHandle,const uint8_t * pMacAddr,uint64_t flags)650*d14abf15SRobert Mustacchi static int BnxeRxRingGroupAddMac(void * groupHandle,
651*d14abf15SRobert Mustacchi const uint8_t * pMacAddr,
652*d14abf15SRobert Mustacchi uint64_t flags)
653*d14abf15SRobert Mustacchi #else
654*d14abf15SRobert Mustacchi static int BnxeRxRingGroupAddMac(void * groupHandle,
655*d14abf15SRobert Mustacchi const uint8_t * pMacAddr)
656*d14abf15SRobert Mustacchi #endif
657*d14abf15SRobert Mustacchi {
658*d14abf15SRobert Mustacchi RxQueueGroup * pRxQGroup = (RxQueueGroup *)groupHandle;
659*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pRxQGroup->pUM;
660*d14abf15SRobert Mustacchi //u32_t idx = pRxQGroup->idx;
661*d14abf15SRobert Mustacchi int rc;
662*d14abf15SRobert Mustacchi
663*d14abf15SRobert Mustacchi #if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS)
664*d14abf15SRobert Mustacchi _NOTE(ARGUNUSED(flags))
665*d14abf15SRobert Mustacchi #endif
666*d14abf15SRobert Mustacchi
667*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM);
668*d14abf15SRobert Mustacchi
669*d14abf15SRobert Mustacchi if (!pUM->plumbed)
670*d14abf15SRobert Mustacchi {
671*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
672*d14abf15SRobert Mustacchi return ECANCELED;
673*d14abf15SRobert Mustacchi }
674*d14abf15SRobert Mustacchi
675*d14abf15SRobert Mustacchi /* Validate MAC address */
676*d14abf15SRobert Mustacchi if (IS_ETH_MULTICAST(pMacAddr))
677*d14abf15SRobert Mustacchi {
678*d14abf15SRobert Mustacchi BnxeLogWarn(pUM, "Cannot program a mcast/bcast address as a MAC Address.");
679*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
680*d14abf15SRobert Mustacchi return EINVAL;
681*d14abf15SRobert Mustacchi }
682*d14abf15SRobert Mustacchi
683*d14abf15SRobert Mustacchi if (pUM->ucastTableLen == LM_MAX_UC_TABLE_SIZE)
684*d14abf15SRobert Mustacchi {
685*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
686*d14abf15SRobert Mustacchi return ENOMEM;
687*d14abf15SRobert Mustacchi }
688*d14abf15SRobert Mustacchi
689*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_HWINIT(pUM);
690*d14abf15SRobert Mustacchi
691*d14abf15SRobert Mustacchi COPY_ETH_ADDRESS(pMacAddr, pUM->lm_dev.params.mac_addr);
692*d14abf15SRobert Mustacchi
693*d14abf15SRobert Mustacchi rc = BnxeMacAddress(pUM, LM_CLI_IDX_NDIS, B_TRUE,
694*d14abf15SRobert Mustacchi pUM->lm_dev.params.mac_addr);
695*d14abf15SRobert Mustacchi
696*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_HWINIT(pUM);
697*d14abf15SRobert Mustacchi
698*d14abf15SRobert Mustacchi if (rc < 0)
699*d14abf15SRobert Mustacchi {
700*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
701*d14abf15SRobert Mustacchi return ECANCELED;
702*d14abf15SRobert Mustacchi }
703*d14abf15SRobert Mustacchi
704*d14abf15SRobert Mustacchi pUM->ucastTableLen++;
705*d14abf15SRobert Mustacchi
706*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
707*d14abf15SRobert Mustacchi return 0;
708*d14abf15SRobert Mustacchi }
709*d14abf15SRobert Mustacchi
710*d14abf15SRobert Mustacchi
BnxeRxRingGroupRemMac(void * groupHandle,const uint8_t * pMacAddr)711*d14abf15SRobert Mustacchi static int BnxeRxRingGroupRemMac(void * groupHandle,
712*d14abf15SRobert Mustacchi const uint8_t * pMacAddr)
713*d14abf15SRobert Mustacchi {
714*d14abf15SRobert Mustacchi RxQueueGroup * pRxQGroup = (RxQueueGroup *)groupHandle;
715*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pRxQGroup->pUM;
716*d14abf15SRobert Mustacchi //u32_t idx = pRxQGroup->idx;
717*d14abf15SRobert Mustacchi int rc;
718*d14abf15SRobert Mustacchi
719*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM);
720*d14abf15SRobert Mustacchi
721*d14abf15SRobert Mustacchi if (!pUM->plumbed)
722*d14abf15SRobert Mustacchi {
723*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
724*d14abf15SRobert Mustacchi return ECANCELED;
725*d14abf15SRobert Mustacchi }
726*d14abf15SRobert Mustacchi
727*d14abf15SRobert Mustacchi if (pUM->ucastTableLen == 0)
728*d14abf15SRobert Mustacchi {
729*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
730*d14abf15SRobert Mustacchi return EINVAL;
731*d14abf15SRobert Mustacchi }
732*d14abf15SRobert Mustacchi
733*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_HWINIT(pUM);
734*d14abf15SRobert Mustacchi
735*d14abf15SRobert Mustacchi if (!IS_ETH_ADDRESS_EQUAL(pMacAddr, pUM->lm_dev.params.mac_addr))
736*d14abf15SRobert Mustacchi {
737*d14abf15SRobert Mustacchi BnxeLogWarn(pUM, "Deleting MAC address that doesn't match default");
738*d14abf15SRobert Mustacchi /* XXX */
739*d14abf15SRobert Mustacchi }
740*d14abf15SRobert Mustacchi
741*d14abf15SRobert Mustacchi rc = BnxeMacAddress(pUM, LM_CLI_IDX_NDIS, B_FALSE,
742*d14abf15SRobert Mustacchi pUM->lm_dev.params.mac_addr);
743*d14abf15SRobert Mustacchi
744*d14abf15SRobert Mustacchi memset(pUM->lm_dev.params.mac_addr, 0, sizeof(pUM->lm_dev.params.mac_addr));
745*d14abf15SRobert Mustacchi
746*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_HWINIT(pUM);
747*d14abf15SRobert Mustacchi
748*d14abf15SRobert Mustacchi if (rc < 0)
749*d14abf15SRobert Mustacchi {
750*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
751*d14abf15SRobert Mustacchi return ECANCELED;
752*d14abf15SRobert Mustacchi }
753*d14abf15SRobert Mustacchi
754*d14abf15SRobert Mustacchi pUM->ucastTableLen--;
755*d14abf15SRobert Mustacchi
756*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
757*d14abf15SRobert Mustacchi return 0;
758*d14abf15SRobert Mustacchi }
759*d14abf15SRobert Mustacchi
760*d14abf15SRobert Mustacchi
BnxeTxRingSend(void * ringHandle,mblk_t * pMblk)761*d14abf15SRobert Mustacchi static mblk_t * BnxeTxRingSend(void * ringHandle,
762*d14abf15SRobert Mustacchi mblk_t * pMblk)
763*d14abf15SRobert Mustacchi {
764*d14abf15SRobert Mustacchi TxQueue * pTxQ = (TxQueue *)ringHandle;
765*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pTxQ->pUM;
766*d14abf15SRobert Mustacchi u32_t idx = pTxQ->idx;
767*d14abf15SRobert Mustacchi mblk_t * pNextMblk;
768*d14abf15SRobert Mustacchi int rc;
769*d14abf15SRobert Mustacchi
770*d14abf15SRobert Mustacchi while (pMblk)
771*d14abf15SRobert Mustacchi {
772*d14abf15SRobert Mustacchi pNextMblk = pMblk->b_next;
773*d14abf15SRobert Mustacchi pMblk->b_next = NULL;
774*d14abf15SRobert Mustacchi
775*d14abf15SRobert Mustacchi rc = BnxeTxSendMblk(pUM, idx, pMblk, 0, 0);
776*d14abf15SRobert Mustacchi
777*d14abf15SRobert Mustacchi if (rc == BNXE_TX_GOODXMIT)
778*d14abf15SRobert Mustacchi {
779*d14abf15SRobert Mustacchi pMblk = pNextMblk;
780*d14abf15SRobert Mustacchi continue;
781*d14abf15SRobert Mustacchi }
782*d14abf15SRobert Mustacchi else if (rc == BNXE_TX_DEFERPKT)
783*d14abf15SRobert Mustacchi {
784*d14abf15SRobert Mustacchi pMblk = pNextMblk;
785*d14abf15SRobert Mustacchi }
786*d14abf15SRobert Mustacchi else
787*d14abf15SRobert Mustacchi {
788*d14abf15SRobert Mustacchi pMblk->b_next = pNextMblk;
789*d14abf15SRobert Mustacchi }
790*d14abf15SRobert Mustacchi
791*d14abf15SRobert Mustacchi break;
792*d14abf15SRobert Mustacchi }
793*d14abf15SRobert Mustacchi
794*d14abf15SRobert Mustacchi return pMblk;
795*d14abf15SRobert Mustacchi }
796*d14abf15SRobert Mustacchi
797*d14abf15SRobert Mustacchi #endif /* BNXE_RINGS */
798*d14abf15SRobert Mustacchi
799*d14abf15SRobert Mustacchi
BnxeMacUnicast(void * pArg,const uint8_t * pMacAddr)800*d14abf15SRobert Mustacchi static int BnxeMacUnicast(void * pArg,
801*d14abf15SRobert Mustacchi const uint8_t * pMacAddr)
802*d14abf15SRobert Mustacchi {
803*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg;
804*d14abf15SRobert Mustacchi int rc;
805*d14abf15SRobert Mustacchi
806*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM);
807*d14abf15SRobert Mustacchi
808*d14abf15SRobert Mustacchi if (!pUM->plumbed)
809*d14abf15SRobert Mustacchi {
810*d14abf15SRobert Mustacchi memcpy(pUM->gldMac, pMacAddr, ETHERNET_ADDRESS_SIZE);
811*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
812*d14abf15SRobert Mustacchi return 0;
813*d14abf15SRobert Mustacchi }
814*d14abf15SRobert Mustacchi
815*d14abf15SRobert Mustacchi /* Validate MAC address */
816*d14abf15SRobert Mustacchi if (IS_ETH_MULTICAST(pMacAddr))
817*d14abf15SRobert Mustacchi {
818*d14abf15SRobert Mustacchi BnxeLogWarn(pUM, "Cannot program a mcast/bcast address as a MAC Address.");
819*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
820*d14abf15SRobert Mustacchi return EINVAL;
821*d14abf15SRobert Mustacchi }
822*d14abf15SRobert Mustacchi
823*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_HWINIT(pUM);
824*d14abf15SRobert Mustacchi
825*d14abf15SRobert Mustacchi COPY_ETH_ADDRESS(pMacAddr, pUM->lm_dev.params.mac_addr);
826*d14abf15SRobert Mustacchi
827*d14abf15SRobert Mustacchi rc = BnxeMacAddress(pUM, LM_CLI_IDX_NDIS, B_TRUE,
828*d14abf15SRobert Mustacchi pUM->lm_dev.params.mac_addr);
829*d14abf15SRobert Mustacchi
830*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_HWINIT(pUM);
831*d14abf15SRobert Mustacchi
832*d14abf15SRobert Mustacchi if (rc < 0)
833*d14abf15SRobert Mustacchi {
834*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
835*d14abf15SRobert Mustacchi return EAGAIN;
836*d14abf15SRobert Mustacchi }
837*d14abf15SRobert Mustacchi
838*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
839*d14abf15SRobert Mustacchi return 0;
840*d14abf15SRobert Mustacchi }
841*d14abf15SRobert Mustacchi
842*d14abf15SRobert Mustacchi
BnxeMacTx(void * pArg,mblk_t * pMblk)843*d14abf15SRobert Mustacchi static mblk_t * BnxeMacTx(void * pArg,
844*d14abf15SRobert Mustacchi mblk_t * pMblk)
845*d14abf15SRobert Mustacchi {
846*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg;
847*d14abf15SRobert Mustacchi mblk_t * pNextMblk;
848*d14abf15SRobert Mustacchi int ring, rc;
849*d14abf15SRobert Mustacchi
850*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_GLDTX(pUM, RW_READER);
851*d14abf15SRobert Mustacchi
852*d14abf15SRobert Mustacchi if (!pUM->plumbed)
853*d14abf15SRobert Mustacchi {
854*d14abf15SRobert Mustacchi freemsgchain(pMblk);
855*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLDTX(pUM);
856*d14abf15SRobert Mustacchi
857*d14abf15SRobert Mustacchi return NULL;
858*d14abf15SRobert Mustacchi }
859*d14abf15SRobert Mustacchi
860*d14abf15SRobert Mustacchi while (pMblk)
861*d14abf15SRobert Mustacchi {
862*d14abf15SRobert Mustacchi ring = BnxeRouteTxRing(pUM, pMblk);
863*d14abf15SRobert Mustacchi
864*d14abf15SRobert Mustacchi pNextMblk = pMblk->b_next;
865*d14abf15SRobert Mustacchi pMblk->b_next = NULL;
866*d14abf15SRobert Mustacchi
867*d14abf15SRobert Mustacchi //rc = BnxeTxSendMblk(pUM, NDIS_CID(&pUM->lm_dev), pMblk, 0, 0);
868*d14abf15SRobert Mustacchi rc = BnxeTxSendMblk(pUM, ring, pMblk, 0, 0);
869*d14abf15SRobert Mustacchi
870*d14abf15SRobert Mustacchi if (rc == BNXE_TX_GOODXMIT)
871*d14abf15SRobert Mustacchi {
872*d14abf15SRobert Mustacchi pMblk = pNextMblk;
873*d14abf15SRobert Mustacchi continue;
874*d14abf15SRobert Mustacchi }
875*d14abf15SRobert Mustacchi else if (rc == BNXE_TX_DEFERPKT)
876*d14abf15SRobert Mustacchi {
877*d14abf15SRobert Mustacchi pMblk = pNextMblk;
878*d14abf15SRobert Mustacchi }
879*d14abf15SRobert Mustacchi else
880*d14abf15SRobert Mustacchi {
881*d14abf15SRobert Mustacchi pMblk->b_next = pNextMblk;
882*d14abf15SRobert Mustacchi }
883*d14abf15SRobert Mustacchi
884*d14abf15SRobert Mustacchi break;
885*d14abf15SRobert Mustacchi }
886*d14abf15SRobert Mustacchi
887*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLDTX(pUM);
888*d14abf15SRobert Mustacchi
889*d14abf15SRobert Mustacchi return pMblk;
890*d14abf15SRobert Mustacchi }
891*d14abf15SRobert Mustacchi
892*d14abf15SRobert Mustacchi
893*d14abf15SRobert Mustacchi #ifdef MC_RESOURCES
894*d14abf15SRobert Mustacchi
BnxeBlank(void * pArg,time_t tick_cnt,uint_t pkt_cnt)895*d14abf15SRobert Mustacchi static void BnxeBlank(void * pArg,
896*d14abf15SRobert Mustacchi time_t tick_cnt,
897*d14abf15SRobert Mustacchi uint_t pkt_cnt)
898*d14abf15SRobert Mustacchi {
899*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg;
900*d14abf15SRobert Mustacchi
901*d14abf15SRobert Mustacchi if (!pUM->plumbed)
902*d14abf15SRobert Mustacchi {
903*d14abf15SRobert Mustacchi return;
904*d14abf15SRobert Mustacchi }
905*d14abf15SRobert Mustacchi
906*d14abf15SRobert Mustacchi /* XXX
907*d14abf15SRobert Mustacchi * Need to dynamically reconfigure the hw with new interrupt
908*d14abf15SRobert Mustacchi * coalescing params...
909*d14abf15SRobert Mustacchi */
910*d14abf15SRobert Mustacchi }
911*d14abf15SRobert Mustacchi
912*d14abf15SRobert Mustacchi
BnxeMacResources(void * pArg)913*d14abf15SRobert Mustacchi static void BnxeMacResources(void * pArg)
914*d14abf15SRobert Mustacchi {
915*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg;
916*d14abf15SRobert Mustacchi mac_rx_fifo_t mrf;
917*d14abf15SRobert Mustacchi int idx;
918*d14abf15SRobert Mustacchi
919*d14abf15SRobert Mustacchi mrf.mrf_type = MAC_RX_FIFO;
920*d14abf15SRobert Mustacchi mrf.mrf_blank = BnxeBlank;
921*d14abf15SRobert Mustacchi mrf.mrf_arg = (void *)pUM;
922*d14abf15SRobert Mustacchi mrf.mrf_normal_blank_time = 25;
923*d14abf15SRobert Mustacchi mrf.mrf_normal_pkt_count = 8;
924*d14abf15SRobert Mustacchi
925*d14abf15SRobert Mustacchi LM_FOREACH_RSS_IDX(&pUM->lm_dev, idx)
926*d14abf15SRobert Mustacchi {
927*d14abf15SRobert Mustacchi pUM->macRxResourceHandles[idx] =
928*d14abf15SRobert Mustacchi mac_resource_add(pUM->pMac, (mac_resource_t *)&mrf);
929*d14abf15SRobert Mustacchi }
930*d14abf15SRobert Mustacchi }
931*d14abf15SRobert Mustacchi
932*d14abf15SRobert Mustacchi #endif /* MC_RESOURCES */
933*d14abf15SRobert Mustacchi
934*d14abf15SRobert Mustacchi
BnxeReadReg(um_device_t * pUM,struct bnxe_reg_data * pData)935*d14abf15SRobert Mustacchi static boolean_t BnxeReadReg(um_device_t * pUM,
936*d14abf15SRobert Mustacchi struct bnxe_reg_data * pData)
937*d14abf15SRobert Mustacchi {
938*d14abf15SRobert Mustacchi if (pData->offset & 0x3)
939*d14abf15SRobert Mustacchi {
940*d14abf15SRobert Mustacchi BnxeLogWarn(pUM, "Invalid register offset for GIOCBNXEREG ioctl");
941*d14abf15SRobert Mustacchi return B_FALSE;
942*d14abf15SRobert Mustacchi }
943*d14abf15SRobert Mustacchi
944*d14abf15SRobert Mustacchi LM_BAR_RD32_OFFSET(&pUM->lm_dev, 0, pData->offset, &pData->value);
945*d14abf15SRobert Mustacchi
946*d14abf15SRobert Mustacchi return B_TRUE;
947*d14abf15SRobert Mustacchi }
948*d14abf15SRobert Mustacchi
949*d14abf15SRobert Mustacchi
BnxeWriteReg(um_device_t * pUM,struct bnxe_reg_data * pData)950*d14abf15SRobert Mustacchi static boolean_t BnxeWriteReg(um_device_t * pUM,
951*d14abf15SRobert Mustacchi struct bnxe_reg_data * pData)
952*d14abf15SRobert Mustacchi {
953*d14abf15SRobert Mustacchi if (pData->offset & 0x3)
954*d14abf15SRobert Mustacchi {
955*d14abf15SRobert Mustacchi BnxeLogWarn(pUM, "Invalid register offset for SIOCBNXEREG ioctl");
956*d14abf15SRobert Mustacchi return B_FALSE;
957*d14abf15SRobert Mustacchi }
958*d14abf15SRobert Mustacchi
959*d14abf15SRobert Mustacchi LM_BAR_WR32_OFFSET(&pUM->lm_dev, 0, pData->offset, pData->value);
960*d14abf15SRobert Mustacchi
961*d14abf15SRobert Mustacchi return B_TRUE;
962*d14abf15SRobert Mustacchi }
963*d14abf15SRobert Mustacchi
964*d14abf15SRobert Mustacchi
BnxeReadNvm(um_device_t * pUM,struct bnxe_nvram_data * pData)965*d14abf15SRobert Mustacchi static boolean_t BnxeReadNvm(um_device_t * pUM,
966*d14abf15SRobert Mustacchi struct bnxe_nvram_data * pData)
967*d14abf15SRobert Mustacchi {
968*d14abf15SRobert Mustacchi if (pData->offset & 0x3)
969*d14abf15SRobert Mustacchi {
970*d14abf15SRobert Mustacchi BnxeLogWarn(pUM, "Invalid register offset for GIOCBNXENVRM ioctl");
971*d14abf15SRobert Mustacchi return B_FALSE;
972*d14abf15SRobert Mustacchi }
973*d14abf15SRobert Mustacchi
974*d14abf15SRobert Mustacchi if (lm_nvram_read(&pUM->lm_dev,
975*d14abf15SRobert Mustacchi pData->offset,
976*d14abf15SRobert Mustacchi pData->value,
977*d14abf15SRobert Mustacchi (pData->num_of_u32 * sizeof(u32_t))) !=
978*d14abf15SRobert Mustacchi LM_STATUS_SUCCESS)
979*d14abf15SRobert Mustacchi {
980*d14abf15SRobert Mustacchi return B_FALSE;
981*d14abf15SRobert Mustacchi }
982*d14abf15SRobert Mustacchi
983*d14abf15SRobert Mustacchi return B_TRUE;
984*d14abf15SRobert Mustacchi }
985*d14abf15SRobert Mustacchi
986*d14abf15SRobert Mustacchi
BnxeWriteNvm(um_device_t * pUM,struct bnxe_nvram_data * pData)987*d14abf15SRobert Mustacchi static boolean_t BnxeWriteNvm(um_device_t * pUM,
988*d14abf15SRobert Mustacchi struct bnxe_nvram_data * pData)
989*d14abf15SRobert Mustacchi {
990*d14abf15SRobert Mustacchi if (pData->offset & 0x3)
991*d14abf15SRobert Mustacchi {
992*d14abf15SRobert Mustacchi BnxeLogWarn(pUM, "Invalid register offset for SIOCBNXENVRM ioctl");
993*d14abf15SRobert Mustacchi return B_FALSE;
994*d14abf15SRobert Mustacchi }
995*d14abf15SRobert Mustacchi
996*d14abf15SRobert Mustacchi if (lm_nvram_write(&pUM->lm_dev,
997*d14abf15SRobert Mustacchi pData->offset,
998*d14abf15SRobert Mustacchi pData->value,
999*d14abf15SRobert Mustacchi (pData->num_of_u32 * sizeof(u32_t))) !=
1000*d14abf15SRobert Mustacchi LM_STATUS_SUCCESS)
1001*d14abf15SRobert Mustacchi {
1002*d14abf15SRobert Mustacchi return B_FALSE;
1003*d14abf15SRobert Mustacchi }
1004*d14abf15SRobert Mustacchi
1005*d14abf15SRobert Mustacchi return B_TRUE;
1006*d14abf15SRobert Mustacchi }
1007*d14abf15SRobert Mustacchi
1008*d14abf15SRobert Mustacchi
BnxeReadPciCfg(um_device_t * pUM,struct bnxe_reg_data * pData)1009*d14abf15SRobert Mustacchi static boolean_t BnxeReadPciCfg(um_device_t * pUM,
1010*d14abf15SRobert Mustacchi struct bnxe_reg_data * pData)
1011*d14abf15SRobert Mustacchi {
1012*d14abf15SRobert Mustacchi pData->value = pci_config_get32(pUM->pPciCfg, (off_t)pData->offset);
1013*d14abf15SRobert Mustacchi return B_TRUE;
1014*d14abf15SRobert Mustacchi }
1015*d14abf15SRobert Mustacchi
1016*d14abf15SRobert Mustacchi typedef enum {
1017*d14abf15SRobert Mustacchi STATS_SHOW_TYPE_NUM,
1018*d14abf15SRobert Mustacchi STATS_SHOW_TYPE_STR,
1019*d14abf15SRobert Mustacchi STATS_SHOW_TYPE_CNT,
1020*d14abf15SRobert Mustacchi STATS_SHOW_TYPE_MAX
1021*d14abf15SRobert Mustacchi } stats_show_type_t;
1022*d14abf15SRobert Mustacchi
1023*d14abf15SRobert Mustacchi typedef union _b10_stats_show_data_t
1024*d14abf15SRobert Mustacchi {
1025*d14abf15SRobert Mustacchi u32_t op; /* ioctl sub-commond */
1026*d14abf15SRobert Mustacchi
1027*d14abf15SRobert Mustacchi struct
1028*d14abf15SRobert Mustacchi {
1029*d14abf15SRobert Mustacchi u32_t num; /* return number of stats */
1030*d14abf15SRobert Mustacchi u32_t len; /* length of each string item */
1031*d14abf15SRobert Mustacchi } desc;
1032*d14abf15SRobert Mustacchi
1033*d14abf15SRobert Mustacchi /* variable length... */
1034*d14abf15SRobert Mustacchi char str[1]; /* holds names of desc.num stats, each desc.len in length */
1035*d14abf15SRobert Mustacchi
1036*d14abf15SRobert Mustacchi struct
1037*d14abf15SRobert Mustacchi {
1038*d14abf15SRobert Mustacchi b10_l2_chip_statistics_v2_t l2_chip_stats;
1039*d14abf15SRobert Mustacchi b10_l4_chip_statistics_t l4_chip_stats;
1040*d14abf15SRobert Mustacchi b10_l2_driver_statistics_t l2_drv_stats;
1041*d14abf15SRobert Mustacchi b10_l4_driver_statistics_t l4_drv_stats;
1042*d14abf15SRobert Mustacchi } cnt;
1043*d14abf15SRobert Mustacchi } b10_stats_show_data_t;
1044*d14abf15SRobert Mustacchi
1045*d14abf15SRobert Mustacchi
BnxeStatsShow(um_device_t * pUM,b10_stats_show_data_t * pStats,u32_t statsLen)1046*d14abf15SRobert Mustacchi static boolean_t BnxeStatsShow(um_device_t * pUM,
1047*d14abf15SRobert Mustacchi b10_stats_show_data_t * pStats,
1048*d14abf15SRobert Mustacchi u32_t statsLen)
1049*d14abf15SRobert Mustacchi {
1050*d14abf15SRobert Mustacchi stats_show_type_t op;
1051*d14abf15SRobert Mustacchi const size_t stats_size = sizeof(pStats->cnt);
1052*d14abf15SRobert Mustacchi
1053*d14abf15SRobert Mustacchi /*
1054*d14abf15SRobert Mustacchi * All stats names MUST conform to STATS_STR_LEN length!!!
1055*d14abf15SRobert Mustacchi */
1056*d14abf15SRobert Mustacchi
1057*d14abf15SRobert Mustacchi #define STATS_STR_LEN 39
1058*d14abf15SRobert Mustacchi
1059*d14abf15SRobert Mustacchi /* XXX
1060*d14abf15SRobert Mustacchi * Note: these strings must be updated whenever any of
1061*d14abf15SRobert Mustacchi * b10_l2_chip_statistics_t, b10_l4_chip_statistics_t,
1062*d14abf15SRobert Mustacchi * b10_l2_driver_statistics_t or b10_l4_driver_statistics_t
1063*d14abf15SRobert Mustacchi * are changed, or additional statistics are required.
1064*d14abf15SRobert Mustacchi */
1065*d14abf15SRobert Mustacchi
1066*d14abf15SRobert Mustacchi const char p_stat_str[] =
1067*d14abf15SRobert Mustacchi
1068*d14abf15SRobert Mustacchi // b10_l2_chip_statistics_t
1069*d14abf15SRobert Mustacchi
1070*d14abf15SRobert Mustacchi "l2_chip_stats_ver_num\0 "
1071*d14abf15SRobert Mustacchi "IfHCInOctets\0 "
1072*d14abf15SRobert Mustacchi "IfHCInBadOctets\0 "
1073*d14abf15SRobert Mustacchi "IfHCOutOctets\0 "
1074*d14abf15SRobert Mustacchi "IfHCOutBadOctets\0 "
1075*d14abf15SRobert Mustacchi "IfHCOutPkts\0 "
1076*d14abf15SRobert Mustacchi "IfHCInPkts\0 "
1077*d14abf15SRobert Mustacchi "IfHCInUcastPkts\0 "
1078*d14abf15SRobert Mustacchi "IfHCInMulticastPkts\0 "
1079*d14abf15SRobert Mustacchi "IfHCInBroadcastPkts\0 "
1080*d14abf15SRobert Mustacchi "IfHCOutUcastPkts\0 "
1081*d14abf15SRobert Mustacchi "IfHCOutMulticastPkts\0 "
1082*d14abf15SRobert Mustacchi "IfHCOutBroadcastPkts\0 "
1083*d14abf15SRobert Mustacchi "IfHCInUcastOctets\0 "
1084*d14abf15SRobert Mustacchi "IfHCInMulticastOctets\0 "
1085*d14abf15SRobert Mustacchi "IfHCInBroadcastOctets\0 "
1086*d14abf15SRobert Mustacchi "IfHCOutUcastOctets\0 "
1087*d14abf15SRobert Mustacchi "IfHCOutMulticastOctets\0 "
1088*d14abf15SRobert Mustacchi "IfHCOutBroadcastOctets\0 "
1089*d14abf15SRobert Mustacchi "IfHCOutDiscards\0 "
1090*d14abf15SRobert Mustacchi "IfHCInFalseCarrierErrors\0 "
1091*d14abf15SRobert Mustacchi "Dot3StatsInternalMacTransmitErrors\0 "
1092*d14abf15SRobert Mustacchi "Dot3StatsCarrierSenseErrors\0 "
1093*d14abf15SRobert Mustacchi "Dot3StatsFCSErrors\0 "
1094*d14abf15SRobert Mustacchi "Dot3StatsAlignmentErrors\0 "
1095*d14abf15SRobert Mustacchi "Dot3StatsSingleCollisionFrames\0 "
1096*d14abf15SRobert Mustacchi "Dot3StatsMultipleCollisionFrames\0 "
1097*d14abf15SRobert Mustacchi "Dot3StatsDeferredTransmissions\0 "
1098*d14abf15SRobert Mustacchi "Dot3StatsExcessiveCollisions\0 "
1099*d14abf15SRobert Mustacchi "Dot3StatsLateCollisions\0 "
1100*d14abf15SRobert Mustacchi "EtherStatsCollisions\0 "
1101*d14abf15SRobert Mustacchi "EtherStatsFragments\0 "
1102*d14abf15SRobert Mustacchi "EtherStatsJabbers\0 "
1103*d14abf15SRobert Mustacchi "EtherStatsUndersizePkts\0 "
1104*d14abf15SRobert Mustacchi "EtherStatsOverrsizePkts\0 "
1105*d14abf15SRobert Mustacchi "EtherStatsPktsTx64Octets\0 "
1106*d14abf15SRobert Mustacchi "EtherStatsPktsTx65Octetsto127Octets\0 "
1107*d14abf15SRobert Mustacchi "EtherStatsPktsTx128Octetsto255Octets\0 "
1108*d14abf15SRobert Mustacchi "EtherStatsPktsTx256Octetsto511Octets\0 "
1109*d14abf15SRobert Mustacchi "EtherStatsPktsTx512Octetsto1023Octets\0 "
1110*d14abf15SRobert Mustacchi "EtherStatsPktsTx1024Octetsto1522Octets\0"
1111*d14abf15SRobert Mustacchi "EtherStatsPktsTxOver1522Octets\0 "
1112*d14abf15SRobert Mustacchi "XonPauseFramesReceived\0 "
1113*d14abf15SRobert Mustacchi "XoffPauseFramesReceived\0 "
1114*d14abf15SRobert Mustacchi "OutXonSent\0 "
1115*d14abf15SRobert Mustacchi "OutXoffSent\0 "
1116*d14abf15SRobert Mustacchi "FlowControlDone\0 "
1117*d14abf15SRobert Mustacchi "MacControlFramesReceived\0 "
1118*d14abf15SRobert Mustacchi "XoffStateEntered\0 "
1119*d14abf15SRobert Mustacchi "IfInFramesL2FilterDiscards\0 "
1120*d14abf15SRobert Mustacchi "IfInTTL0Discards\0 "
1121*d14abf15SRobert Mustacchi "IfInxxOverflowDiscards\0 "
1122*d14abf15SRobert Mustacchi "IfInMBUFDiscards\0 "
1123*d14abf15SRobert Mustacchi "IfInErrors\0 "
1124*d14abf15SRobert Mustacchi "IfInErrorsOctets\0 "
1125*d14abf15SRobert Mustacchi "IfInNoBrbBuffer\0 "
1126*d14abf15SRobert Mustacchi
1127*d14abf15SRobert Mustacchi "Nig_brb_packet\0 "
1128*d14abf15SRobert Mustacchi "Nig_brb_truncate\0 "
1129*d14abf15SRobert Mustacchi "Nig_flow_ctrl_discard\0 "
1130*d14abf15SRobert Mustacchi "Nig_flow_ctrl_octets\0 "
1131*d14abf15SRobert Mustacchi "Nig_flow_ctrl_packet\0 "
1132*d14abf15SRobert Mustacchi "Nig_mng_discard\0 "
1133*d14abf15SRobert Mustacchi "Nig_mng_octet_inp\0 "
1134*d14abf15SRobert Mustacchi "Nig_mng_octet_out\0 "
1135*d14abf15SRobert Mustacchi "Nig_mng_packet_inp\0 "
1136*d14abf15SRobert Mustacchi "Nig_mng_packet_out\0 "
1137*d14abf15SRobert Mustacchi "Nig_pbf_octets\0 "
1138*d14abf15SRobert Mustacchi "Nig_pbf_packet\0 "
1139*d14abf15SRobert Mustacchi "Nig_safc_inp\0 "
1140*d14abf15SRobert Mustacchi
1141*d14abf15SRobert Mustacchi "Tx_Lpi_Count\0 " // This counter counts the number of timers the debounced version of EEE link idle is asserted
1142*d14abf15SRobert Mustacchi
1143*d14abf15SRobert Mustacchi // b10_l4_chip_statistics_t
1144*d14abf15SRobert Mustacchi
1145*d14abf15SRobert Mustacchi "l4_chip_stats_ver_num\0 "
1146*d14abf15SRobert Mustacchi "NoTxCqes\0 "
1147*d14abf15SRobert Mustacchi "InTCP4Segments\0 "
1148*d14abf15SRobert Mustacchi "OutTCP4Segments\0 "
1149*d14abf15SRobert Mustacchi "RetransmittedTCP4Segments\0 "
1150*d14abf15SRobert Mustacchi "InTCP4Errors\0 "
1151*d14abf15SRobert Mustacchi "InIP4Receives\0 "
1152*d14abf15SRobert Mustacchi "InIP4HeaderErrors\0 "
1153*d14abf15SRobert Mustacchi "InIP4Discards\0 "
1154*d14abf15SRobert Mustacchi "InIP4Delivers\0 "
1155*d14abf15SRobert Mustacchi "InIP4Octets\0 "
1156*d14abf15SRobert Mustacchi "OutIP4Octets\0 "
1157*d14abf15SRobert Mustacchi "InIP4TruncatedPackets\0 "
1158*d14abf15SRobert Mustacchi "InTCP6Segments\0 "
1159*d14abf15SRobert Mustacchi "OutTCP6Segments\0 "
1160*d14abf15SRobert Mustacchi "RetransmittedTCP6Segments\0 "
1161*d14abf15SRobert Mustacchi "InTCP6Errors\0 "
1162*d14abf15SRobert Mustacchi "InIP6Receives\0 "
1163*d14abf15SRobert Mustacchi "InIP6HeaderErrors\0 "
1164*d14abf15SRobert Mustacchi "InIP6Discards\0 "
1165*d14abf15SRobert Mustacchi "InIP6Delivers\0 "
1166*d14abf15SRobert Mustacchi "InIP6Octets\0 "
1167*d14abf15SRobert Mustacchi "OutIP6Octets\0 "
1168*d14abf15SRobert Mustacchi "InIP6TruncatedPackets\0 "
1169*d14abf15SRobert Mustacchi
1170*d14abf15SRobert Mustacchi // b10_l2_driver_statistics_t
1171*d14abf15SRobert Mustacchi
1172*d14abf15SRobert Mustacchi "l2_driver_stats_ver_num\0 "
1173*d14abf15SRobert Mustacchi "RxIPv4FragCount\0 "
1174*d14abf15SRobert Mustacchi "RxIpCsErrorCount\0 "
1175*d14abf15SRobert Mustacchi "RxTcpCsErrorCount\0 "
1176*d14abf15SRobert Mustacchi "RxLlcSnapCount\0 "
1177*d14abf15SRobert Mustacchi "RxPhyErrorCount\0 "
1178*d14abf15SRobert Mustacchi "RxIpv6ExtCount\0 "
1179*d14abf15SRobert Mustacchi "TxNoL2Bd\0 "
1180*d14abf15SRobert Mustacchi "TxNoSqWqe\0 "
1181*d14abf15SRobert Mustacchi "TxL2AssemblyBufUse\0 "
1182*d14abf15SRobert Mustacchi
1183*d14abf15SRobert Mustacchi // b10_l4_driver_statistics_t
1184*d14abf15SRobert Mustacchi
1185*d14abf15SRobert Mustacchi "l4_driver_stats_ver_num\0 "
1186*d14abf15SRobert Mustacchi "CurrentlyIpv4Established\0 "
1187*d14abf15SRobert Mustacchi "OutIpv4Resets\0 "
1188*d14abf15SRobert Mustacchi "OutIpv4Fin\0 "
1189*d14abf15SRobert Mustacchi "InIpv4Reset\0 "
1190*d14abf15SRobert Mustacchi "InIpv4Fin\0 "
1191*d14abf15SRobert Mustacchi "CurrentlyIpv6Established\0 "
1192*d14abf15SRobert Mustacchi "OutIpv6Resets\0 "
1193*d14abf15SRobert Mustacchi "OutIpv6Fin\0 "
1194*d14abf15SRobert Mustacchi "InIpv6Reset\0 "
1195*d14abf15SRobert Mustacchi "InIpv6Fin\0 "
1196*d14abf15SRobert Mustacchi "RxIndicateReturnPendingCnt\0 "
1197*d14abf15SRobert Mustacchi "RxIndicateReturnDoneCnt\0 "
1198*d14abf15SRobert Mustacchi "RxActiveGenBufCnt\0 "
1199*d14abf15SRobert Mustacchi "TxNoL4Bd\0 "
1200*d14abf15SRobert Mustacchi "TxL4AssemblyBufUse\0 "
1201*d14abf15SRobert Mustacchi
1202*d14abf15SRobert Mustacchi ;
1203*d14abf15SRobert Mustacchi
1204*d14abf15SRobert Mustacchi ASSERT_STATIC((sizeof(p_stat_str) / STATS_STR_LEN) ==
1205*d14abf15SRobert Mustacchi (stats_size / sizeof(u64_t)));
1206*d14abf15SRobert Mustacchi
1207*d14abf15SRobert Mustacchi op = *((stats_show_type_t *)pStats);
1208*d14abf15SRobert Mustacchi
1209*d14abf15SRobert Mustacchi switch (op)
1210*d14abf15SRobert Mustacchi {
1211*d14abf15SRobert Mustacchi case STATS_SHOW_TYPE_NUM:
1212*d14abf15SRobert Mustacchi
1213*d14abf15SRobert Mustacchi if (statsLen < sizeof(pStats->desc))
1214*d14abf15SRobert Mustacchi {
1215*d14abf15SRobert Mustacchi return B_FALSE;
1216*d14abf15SRobert Mustacchi }
1217*d14abf15SRobert Mustacchi
1218*d14abf15SRobert Mustacchi pStats->desc.num = (stats_size / sizeof(u64_t));
1219*d14abf15SRobert Mustacchi pStats->desc.len = STATS_STR_LEN;
1220*d14abf15SRobert Mustacchi
1221*d14abf15SRobert Mustacchi return B_TRUE;
1222*d14abf15SRobert Mustacchi
1223*d14abf15SRobert Mustacchi case STATS_SHOW_TYPE_STR:
1224*d14abf15SRobert Mustacchi
1225*d14abf15SRobert Mustacchi if (statsLen != sizeof(p_stat_str))
1226*d14abf15SRobert Mustacchi {
1227*d14abf15SRobert Mustacchi return B_FALSE;
1228*d14abf15SRobert Mustacchi }
1229*d14abf15SRobert Mustacchi
1230*d14abf15SRobert Mustacchi memcpy(pStats->str, p_stat_str, sizeof(p_stat_str));
1231*d14abf15SRobert Mustacchi
1232*d14abf15SRobert Mustacchi return B_TRUE;
1233*d14abf15SRobert Mustacchi
1234*d14abf15SRobert Mustacchi case STATS_SHOW_TYPE_CNT:
1235*d14abf15SRobert Mustacchi
1236*d14abf15SRobert Mustacchi if (statsLen != stats_size)
1237*d14abf15SRobert Mustacchi {
1238*d14abf15SRobert Mustacchi return B_FALSE;
1239*d14abf15SRobert Mustacchi }
1240*d14abf15SRobert Mustacchi
1241*d14abf15SRobert Mustacchi lm_stats_get_l2_chip_stats(&pUM->lm_dev,
1242*d14abf15SRobert Mustacchi &pStats->cnt.l2_chip_stats,
1243*d14abf15SRobert Mustacchi L2_CHIP_STATISTICS_VER_NUM_2);
1244*d14abf15SRobert Mustacchi
1245*d14abf15SRobert Mustacchi lm_stats_get_l4_chip_stats(&pUM->lm_dev,
1246*d14abf15SRobert Mustacchi &pStats->cnt.l4_chip_stats);
1247*d14abf15SRobert Mustacchi
1248*d14abf15SRobert Mustacchi lm_stats_get_l2_driver_stats(&pUM->lm_dev
1249*d14abf15SRobert Mustacchi ,&pStats->cnt.l2_drv_stats);
1250*d14abf15SRobert Mustacchi
1251*d14abf15SRobert Mustacchi lm_stats_get_l4_driver_stats(&pUM->lm_dev,
1252*d14abf15SRobert Mustacchi &pStats->cnt.l4_drv_stats);
1253*d14abf15SRobert Mustacchi
1254*d14abf15SRobert Mustacchi return B_TRUE;
1255*d14abf15SRobert Mustacchi
1256*d14abf15SRobert Mustacchi default:
1257*d14abf15SRobert Mustacchi
1258*d14abf15SRobert Mustacchi return B_FALSE;
1259*d14abf15SRobert Mustacchi }
1260*d14abf15SRobert Mustacchi }
1261*d14abf15SRobert Mustacchi
BnxeMacIoctl(void * pArg,queue_t * pQ,mblk_t * pMblk)1262*d14abf15SRobert Mustacchi static void BnxeMacIoctl(void * pArg,
1263*d14abf15SRobert Mustacchi queue_t * pQ,
1264*d14abf15SRobert Mustacchi mblk_t * pMblk)
1265*d14abf15SRobert Mustacchi {
1266*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg;
1267*d14abf15SRobert Mustacchi struct iocblk * pIoctl;
1268*d14abf15SRobert Mustacchi int rc;
1269*d14abf15SRobert Mustacchi
1270*d14abf15SRobert Mustacchi if ((pQ == NULL) || (pMblk == NULL))
1271*d14abf15SRobert Mustacchi {
1272*d14abf15SRobert Mustacchi return;
1273*d14abf15SRobert Mustacchi }
1274*d14abf15SRobert Mustacchi
1275*d14abf15SRobert Mustacchi if (pMblk->b_datap->db_type != M_IOCTL)
1276*d14abf15SRobert Mustacchi {
1277*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
1278*d14abf15SRobert Mustacchi return;
1279*d14abf15SRobert Mustacchi }
1280*d14abf15SRobert Mustacchi
1281*d14abf15SRobert Mustacchi pIoctl = (struct iocblk *)pMblk->b_rptr;
1282*d14abf15SRobert Mustacchi
1283*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM);
1284*d14abf15SRobert Mustacchi
1285*d14abf15SRobert Mustacchi switch (pIoctl->ioc_cmd)
1286*d14abf15SRobert Mustacchi {
1287*d14abf15SRobert Mustacchi case GIOCBNXELLDP:
1288*d14abf15SRobert Mustacchi
1289*d14abf15SRobert Mustacchi if ((pIoctl->ioc_count != sizeof(b10_lldp_params_get_t)) ||
1290*d14abf15SRobert Mustacchi (pMblk->b_cont == NULL) || (pMblk->b_cont->b_rptr == NULL) ||
1291*d14abf15SRobert Mustacchi (miocpullup(pMblk, sizeof(b10_lldp_params_get_t)) < 0))
1292*d14abf15SRobert Mustacchi {
1293*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
1294*d14abf15SRobert Mustacchi break;
1295*d14abf15SRobert Mustacchi }
1296*d14abf15SRobert Mustacchi
1297*d14abf15SRobert Mustacchi if (((b10_lldp_params_get_t *)pMblk->b_cont->b_rptr)->ver_num !=
1298*d14abf15SRobert Mustacchi LLDP_PARAMS_VER_NUM)
1299*d14abf15SRobert Mustacchi {
1300*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
1301*d14abf15SRobert Mustacchi break;
1302*d14abf15SRobert Mustacchi }
1303*d14abf15SRobert Mustacchi
1304*d14abf15SRobert Mustacchi if (lm_dcbx_lldp_read_params(&pUM->lm_dev,
1305*d14abf15SRobert Mustacchi (b10_lldp_params_get_t *)pMblk->b_cont->b_rptr) !=
1306*d14abf15SRobert Mustacchi LM_STATUS_SUCCESS)
1307*d14abf15SRobert Mustacchi {
1308*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0,
1309*d14abf15SRobert Mustacchi (!IS_DCB_ENABLED(&pUM->lm_dev)) ? ENOTSUP : EINVAL);
1310*d14abf15SRobert Mustacchi break;
1311*d14abf15SRobert Mustacchi }
1312*d14abf15SRobert Mustacchi
1313*d14abf15SRobert Mustacchi miocack(pQ, pMblk, pIoctl->ioc_count, 0);
1314*d14abf15SRobert Mustacchi break;
1315*d14abf15SRobert Mustacchi
1316*d14abf15SRobert Mustacchi case GIOCBNXEDCBX:
1317*d14abf15SRobert Mustacchi
1318*d14abf15SRobert Mustacchi if ((pIoctl->ioc_count != sizeof(b10_dcbx_params_get_t)) ||
1319*d14abf15SRobert Mustacchi (pMblk->b_cont == NULL) || (pMblk->b_cont->b_rptr == NULL) ||
1320*d14abf15SRobert Mustacchi (miocpullup(pMblk, sizeof(b10_dcbx_params_get_t)) < 0))
1321*d14abf15SRobert Mustacchi {
1322*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
1323*d14abf15SRobert Mustacchi break;
1324*d14abf15SRobert Mustacchi }
1325*d14abf15SRobert Mustacchi
1326*d14abf15SRobert Mustacchi if (((b10_dcbx_params_get_t *)pMblk->b_cont->b_rptr)->ver_num !=
1327*d14abf15SRobert Mustacchi DCBX_PARAMS_VER_NUM)
1328*d14abf15SRobert Mustacchi {
1329*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
1330*d14abf15SRobert Mustacchi break;
1331*d14abf15SRobert Mustacchi }
1332*d14abf15SRobert Mustacchi
1333*d14abf15SRobert Mustacchi if (lm_dcbx_read_params(&pUM->lm_dev,
1334*d14abf15SRobert Mustacchi (b10_dcbx_params_get_t *)pMblk->b_cont->b_rptr) !=
1335*d14abf15SRobert Mustacchi LM_STATUS_SUCCESS)
1336*d14abf15SRobert Mustacchi {
1337*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0,
1338*d14abf15SRobert Mustacchi (!IS_DCB_ENABLED(&pUM->lm_dev)) ? ENOTSUP : EINVAL);
1339*d14abf15SRobert Mustacchi break;
1340*d14abf15SRobert Mustacchi }
1341*d14abf15SRobert Mustacchi
1342*d14abf15SRobert Mustacchi miocack(pQ, pMblk, pIoctl->ioc_count, 0);
1343*d14abf15SRobert Mustacchi break;
1344*d14abf15SRobert Mustacchi
1345*d14abf15SRobert Mustacchi case SIOCBNXEDCBX:
1346*d14abf15SRobert Mustacchi
1347*d14abf15SRobert Mustacchi /* XXX */
1348*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
1349*d14abf15SRobert Mustacchi break;
1350*d14abf15SRobert Mustacchi
1351*d14abf15SRobert Mustacchi case GIOCBNXEREG:
1352*d14abf15SRobert Mustacchi
1353*d14abf15SRobert Mustacchi if ((pIoctl->ioc_count != sizeof(struct bnxe_reg_data)) ||
1354*d14abf15SRobert Mustacchi (pMblk->b_cont == NULL) || (pMblk->b_cont->b_rptr == NULL) ||
1355*d14abf15SRobert Mustacchi (miocpullup(pMblk, sizeof(struct bnxe_reg_data)) < 0))
1356*d14abf15SRobert Mustacchi {
1357*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
1358*d14abf15SRobert Mustacchi break;
1359*d14abf15SRobert Mustacchi }
1360*d14abf15SRobert Mustacchi
1361*d14abf15SRobert Mustacchi if (!BnxeReadReg(pUM, (struct bnxe_reg_data *)pMblk->b_cont->b_rptr))
1362*d14abf15SRobert Mustacchi {
1363*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
1364*d14abf15SRobert Mustacchi }
1365*d14abf15SRobert Mustacchi else
1366*d14abf15SRobert Mustacchi {
1367*d14abf15SRobert Mustacchi miocack(pQ, pMblk, pIoctl->ioc_count, 0);
1368*d14abf15SRobert Mustacchi }
1369*d14abf15SRobert Mustacchi
1370*d14abf15SRobert Mustacchi break;
1371*d14abf15SRobert Mustacchi
1372*d14abf15SRobert Mustacchi case SIOCBNXEREG:
1373*d14abf15SRobert Mustacchi
1374*d14abf15SRobert Mustacchi if ((pIoctl->ioc_count != sizeof(struct bnxe_reg_data)) ||
1375*d14abf15SRobert Mustacchi (pMblk->b_cont == NULL) || (pMblk->b_cont->b_rptr == NULL) ||
1376*d14abf15SRobert Mustacchi (miocpullup(pMblk, sizeof(struct bnxe_reg_data)) < 0))
1377*d14abf15SRobert Mustacchi {
1378*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
1379*d14abf15SRobert Mustacchi break;
1380*d14abf15SRobert Mustacchi }
1381*d14abf15SRobert Mustacchi
1382*d14abf15SRobert Mustacchi if (!BnxeWriteReg(pUM, (struct bnxe_reg_data *)pMblk->b_cont->b_rptr))
1383*d14abf15SRobert Mustacchi {
1384*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
1385*d14abf15SRobert Mustacchi }
1386*d14abf15SRobert Mustacchi else
1387*d14abf15SRobert Mustacchi {
1388*d14abf15SRobert Mustacchi miocack(pQ, pMblk, pIoctl->ioc_count, 0);
1389*d14abf15SRobert Mustacchi }
1390*d14abf15SRobert Mustacchi
1391*d14abf15SRobert Mustacchi break;
1392*d14abf15SRobert Mustacchi
1393*d14abf15SRobert Mustacchi case GIOCBNXENVRM:
1394*d14abf15SRobert Mustacchi
1395*d14abf15SRobert Mustacchi if ((pIoctl->ioc_count < sizeof(struct bnxe_nvram_data)) ||
1396*d14abf15SRobert Mustacchi (pMblk->b_cont == NULL) || (pMblk->b_cont->b_rptr == NULL) ||
1397*d14abf15SRobert Mustacchi (miocpullup(pMblk, pIoctl->ioc_count) < 0))
1398*d14abf15SRobert Mustacchi {
1399*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
1400*d14abf15SRobert Mustacchi break;
1401*d14abf15SRobert Mustacchi }
1402*d14abf15SRobert Mustacchi
1403*d14abf15SRobert Mustacchi if (!BnxeReadNvm(pUM, (struct bnxe_nvram_data *)pMblk->b_cont->b_rptr))
1404*d14abf15SRobert Mustacchi {
1405*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
1406*d14abf15SRobert Mustacchi }
1407*d14abf15SRobert Mustacchi else
1408*d14abf15SRobert Mustacchi {
1409*d14abf15SRobert Mustacchi miocack(pQ, pMblk, pIoctl->ioc_count, 0);
1410*d14abf15SRobert Mustacchi }
1411*d14abf15SRobert Mustacchi
1412*d14abf15SRobert Mustacchi break;
1413*d14abf15SRobert Mustacchi
1414*d14abf15SRobert Mustacchi case SIOCBNXENVRM:
1415*d14abf15SRobert Mustacchi
1416*d14abf15SRobert Mustacchi if ((pIoctl->ioc_count < sizeof(struct bnxe_nvram_data)) ||
1417*d14abf15SRobert Mustacchi (pMblk->b_cont == NULL) || (pMblk->b_cont->b_rptr == NULL) ||
1418*d14abf15SRobert Mustacchi (miocpullup(pMblk, pIoctl->ioc_count) < 0))
1419*d14abf15SRobert Mustacchi {
1420*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
1421*d14abf15SRobert Mustacchi break;
1422*d14abf15SRobert Mustacchi }
1423*d14abf15SRobert Mustacchi
1424*d14abf15SRobert Mustacchi if (!BnxeWriteNvm(pUM, (struct bnxe_nvram_data *)pMblk->b_cont->b_rptr))
1425*d14abf15SRobert Mustacchi {
1426*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
1427*d14abf15SRobert Mustacchi }
1428*d14abf15SRobert Mustacchi else
1429*d14abf15SRobert Mustacchi {
1430*d14abf15SRobert Mustacchi miocack(pQ, pMblk, pIoctl->ioc_count, 0);
1431*d14abf15SRobert Mustacchi }
1432*d14abf15SRobert Mustacchi
1433*d14abf15SRobert Mustacchi break;
1434*d14abf15SRobert Mustacchi
1435*d14abf15SRobert Mustacchi case GIOCBNXEPCI:
1436*d14abf15SRobert Mustacchi
1437*d14abf15SRobert Mustacchi if ((pIoctl->ioc_count != sizeof(struct bnxe_reg_data)) ||
1438*d14abf15SRobert Mustacchi (pMblk->b_cont == NULL) || (pMblk->b_cont->b_rptr == NULL) ||
1439*d14abf15SRobert Mustacchi (miocpullup(pMblk, sizeof(struct bnxe_reg_data)) < 0))
1440*d14abf15SRobert Mustacchi {
1441*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
1442*d14abf15SRobert Mustacchi break;
1443*d14abf15SRobert Mustacchi }
1444*d14abf15SRobert Mustacchi
1445*d14abf15SRobert Mustacchi if (!BnxeReadPciCfg(pUM, (struct bnxe_reg_data *)pMblk->b_cont->b_rptr))
1446*d14abf15SRobert Mustacchi {
1447*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
1448*d14abf15SRobert Mustacchi }
1449*d14abf15SRobert Mustacchi else
1450*d14abf15SRobert Mustacchi {
1451*d14abf15SRobert Mustacchi miocack(pQ, pMblk, pIoctl->ioc_count, 0);
1452*d14abf15SRobert Mustacchi }
1453*d14abf15SRobert Mustacchi
1454*d14abf15SRobert Mustacchi break;
1455*d14abf15SRobert Mustacchi
1456*d14abf15SRobert Mustacchi case GIOCBNXESTATS:
1457*d14abf15SRobert Mustacchi
1458*d14abf15SRobert Mustacchi /* min size = sizeof(op) in b10_stats_show_data_t */
1459*d14abf15SRobert Mustacchi if ((pIoctl->ioc_count < sizeof(u32_t)) ||
1460*d14abf15SRobert Mustacchi (pMblk->b_cont == NULL) || (pMblk->b_cont->b_rptr == NULL) ||
1461*d14abf15SRobert Mustacchi (miocpullup(pMblk, pIoctl->ioc_count) < 0))
1462*d14abf15SRobert Mustacchi {
1463*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
1464*d14abf15SRobert Mustacchi break;
1465*d14abf15SRobert Mustacchi }
1466*d14abf15SRobert Mustacchi
1467*d14abf15SRobert Mustacchi if (!BnxeStatsShow(pUM,
1468*d14abf15SRobert Mustacchi (b10_stats_show_data_t *)pMblk->b_cont->b_rptr,
1469*d14abf15SRobert Mustacchi pIoctl->ioc_count))
1470*d14abf15SRobert Mustacchi {
1471*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
1472*d14abf15SRobert Mustacchi }
1473*d14abf15SRobert Mustacchi else
1474*d14abf15SRobert Mustacchi {
1475*d14abf15SRobert Mustacchi miocack(pQ, pMblk, pIoctl->ioc_count, 0);
1476*d14abf15SRobert Mustacchi }
1477*d14abf15SRobert Mustacchi
1478*d14abf15SRobert Mustacchi break;
1479*d14abf15SRobert Mustacchi
1480*d14abf15SRobert Mustacchi default:
1481*d14abf15SRobert Mustacchi
1482*d14abf15SRobert Mustacchi miocnak(pQ, pMblk, 0, EINVAL);
1483*d14abf15SRobert Mustacchi break;
1484*d14abf15SRobert Mustacchi }
1485*d14abf15SRobert Mustacchi
1486*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
1487*d14abf15SRobert Mustacchi }
1488*d14abf15SRobert Mustacchi
1489*d14abf15SRobert Mustacchi
1490*d14abf15SRobert Mustacchi #ifdef BNXE_RINGS
1491*d14abf15SRobert Mustacchi
1492*d14abf15SRobert Mustacchi #if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS)
BnxeRxRingPoll(void * ringHandle,int numBytes,int numPkts)1493*d14abf15SRobert Mustacchi static mblk_t * BnxeRxRingPoll(void * ringHandle,
1494*d14abf15SRobert Mustacchi int numBytes,
1495*d14abf15SRobert Mustacchi int numPkts)
1496*d14abf15SRobert Mustacchi #else
1497*d14abf15SRobert Mustacchi static mblk_t * BnxeRxRingPoll(void * ringHandle,
1498*d14abf15SRobert Mustacchi int numBytes)
1499*d14abf15SRobert Mustacchi #endif
1500*d14abf15SRobert Mustacchi {
1501*d14abf15SRobert Mustacchi RxQueue * pRxQ = (RxQueue *)ringHandle;
1502*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pRxQ->pUM;
1503*d14abf15SRobert Mustacchi u32_t idx = pRxQ->idx;
1504*d14abf15SRobert Mustacchi mblk_t * pMblk = NULL;
1505*d14abf15SRobert Mustacchi boolean_t pktsRxed = 0;
1506*d14abf15SRobert Mustacchi boolean_t pktsTxed = 0;
1507*d14abf15SRobert Mustacchi
1508*d14abf15SRobert Mustacchi #if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS)
1509*d14abf15SRobert Mustacchi _NOTE(ARGUNUSED(numPkts))
1510*d14abf15SRobert Mustacchi #endif
1511*d14abf15SRobert Mustacchi
1512*d14abf15SRobert Mustacchi if (numBytes <= 0)
1513*d14abf15SRobert Mustacchi {
1514*d14abf15SRobert Mustacchi return NULL;
1515*d14abf15SRobert Mustacchi }
1516*d14abf15SRobert Mustacchi
1517*d14abf15SRobert Mustacchi if (pRxQ->inPollMode == B_FALSE)
1518*d14abf15SRobert Mustacchi {
1519*d14abf15SRobert Mustacchi BnxeLogWarn(pUM, "Polling on ring %d when NOT in poll mode!", idx);
1520*d14abf15SRobert Mustacchi return NULL;
1521*d14abf15SRobert Mustacchi }
1522*d14abf15SRobert Mustacchi
1523*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_INTR(pUM, idx);
1524*d14abf15SRobert Mustacchi
1525*d14abf15SRobert Mustacchi pRxQ->pollCnt++;
1526*d14abf15SRobert Mustacchi
1527*d14abf15SRobert Mustacchi BnxePollRxRing(pUM, idx, &pktsRxed, &pktsTxed);
1528*d14abf15SRobert Mustacchi
1529*d14abf15SRobert Mustacchi if (pktsTxed) BnxeTxRingProcess(pUM, idx);
1530*d14abf15SRobert Mustacchi if (pktsRxed) pMblk = BnxeRxRingProcess(pUM, idx, TRUE, numBytes);
1531*d14abf15SRobert Mustacchi
1532*d14abf15SRobert Mustacchi /*
1533*d14abf15SRobert Mustacchi * This is here for the off chance that all rings are in polling
1534*d14abf15SRobert Mustacchi * mode and the default interrupt hasn't fired recently to handle
1535*d14abf15SRobert Mustacchi * the sq.
1536*d14abf15SRobert Mustacchi */
1537*d14abf15SRobert Mustacchi lm_sq_post_pending(&pUM->lm_dev);
1538*d14abf15SRobert Mustacchi
1539*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_INTR(pUM, idx);
1540*d14abf15SRobert Mustacchi
1541*d14abf15SRobert Mustacchi return pMblk;
1542*d14abf15SRobert Mustacchi }
1543*d14abf15SRobert Mustacchi
1544*d14abf15SRobert Mustacchi
BnxeRxRingStart(mac_ring_driver_t ringHandle,uint64_t genNumber)1545*d14abf15SRobert Mustacchi static int BnxeRxRingStart(mac_ring_driver_t ringHandle
1546*d14abf15SRobert Mustacchi #if defined(__S11) || defined(__S12)
1547*d14abf15SRobert Mustacchi , uint64_t genNumber
1548*d14abf15SRobert Mustacchi #endif
1549*d14abf15SRobert Mustacchi )
1550*d14abf15SRobert Mustacchi {
1551*d14abf15SRobert Mustacchi RxQueue * pRxQ = (RxQueue *)ringHandle;
1552*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pRxQ->pUM;
1553*d14abf15SRobert Mustacchi u32_t idx = pRxQ->idx;
1554*d14abf15SRobert Mustacchi
1555*d14abf15SRobert Mustacchi BnxeLogDbg(pUM, "Starting Rx Ring %d", idx);
1556*d14abf15SRobert Mustacchi
1557*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_RX(pUM, idx);
1558*d14abf15SRobert Mustacchi #if defined(__S11) || defined(__S12)
1559*d14abf15SRobert Mustacchi pRxQ->genNumber = genNumber;
1560*d14abf15SRobert Mustacchi #endif
1561*d14abf15SRobert Mustacchi pRxQ->inPollMode = B_FALSE;
1562*d14abf15SRobert Mustacchi pRxQ->intrDisableCnt = 0;
1563*d14abf15SRobert Mustacchi pRxQ->intrEnableCnt = 0;
1564*d14abf15SRobert Mustacchi pRxQ->pollCnt = 0;
1565*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_RX(pUM, idx);
1566*d14abf15SRobert Mustacchi
1567*d14abf15SRobert Mustacchi return 0;
1568*d14abf15SRobert Mustacchi }
1569*d14abf15SRobert Mustacchi
1570*d14abf15SRobert Mustacchi
1571*d14abf15SRobert Mustacchi #if defined(__S11) || defined(__S12)
1572*d14abf15SRobert Mustacchi
BnxeRingStat(mac_ring_driver_t ringHandle,uint_t stat,uint64_t * val)1573*d14abf15SRobert Mustacchi static int BnxeRingStat(mac_ring_driver_t ringHandle,
1574*d14abf15SRobert Mustacchi uint_t stat,
1575*d14abf15SRobert Mustacchi uint64_t * val)
1576*d14abf15SRobert Mustacchi {
1577*d14abf15SRobert Mustacchi RxQueue * pRxQ = (RxQueue *)ringHandle;
1578*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pRxQ->pUM;
1579*d14abf15SRobert Mustacchi
1580*d14abf15SRobert Mustacchi switch (stat)
1581*d14abf15SRobert Mustacchi {
1582*d14abf15SRobert Mustacchi case MAC_STAT_OERRORS:
1583*d14abf15SRobert Mustacchi case MAC_STAT_OBYTES:
1584*d14abf15SRobert Mustacchi case MAC_STAT_OPACKETS:
1585*d14abf15SRobert Mustacchi case MAC_STAT_IERRORS:
1586*d14abf15SRobert Mustacchi case MAC_STAT_RBYTES: /* MAC_STAT_IBYTES */
1587*d14abf15SRobert Mustacchi case MAC_STAT_IPACKETS:
1588*d14abf15SRobert Mustacchi default:
1589*d14abf15SRobert Mustacchi return ENOTSUP;
1590*d14abf15SRobert Mustacchi }
1591*d14abf15SRobert Mustacchi
1592*d14abf15SRobert Mustacchi return 0;
1593*d14abf15SRobert Mustacchi }
1594*d14abf15SRobert Mustacchi
1595*d14abf15SRobert Mustacchi #endif /* __S11 or __S12 */
1596*d14abf15SRobert Mustacchi
1597*d14abf15SRobert Mustacchi
1598*d14abf15SRobert Mustacchi #if defined(__S11) || defined(__S12)
BnxeRxRingIntrEnable(mac_ring_driver_t ringHandle)1599*d14abf15SRobert Mustacchi static int BnxeRxRingIntrEnable(mac_ring_driver_t ringHandle)
1600*d14abf15SRobert Mustacchi #else
1601*d14abf15SRobert Mustacchi static int BnxeRxRingIntrEnable(mac_intr_handle_t ringHandle)
1602*d14abf15SRobert Mustacchi #endif
1603*d14abf15SRobert Mustacchi {
1604*d14abf15SRobert Mustacchi RxQueue * pRxQ = (RxQueue *)ringHandle;
1605*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pRxQ->pUM;
1606*d14abf15SRobert Mustacchi
1607*d14abf15SRobert Mustacchi BnxeLogDbg(pUM, "Enabling Interrupt for Rx Ring %d", pRxQ->idx);
1608*d14abf15SRobert Mustacchi
1609*d14abf15SRobert Mustacchi /* polling not allowed on LM_NON_RSS_SB when overlapped with FCoE */
1610*d14abf15SRobert Mustacchi if ((pRxQ->idx == LM_NON_RSS_SB(&pUM->lm_dev)) &&
1611*d14abf15SRobert Mustacchi CLIENT_BOUND(pUM, LM_CLI_IDX_FCOE) &&
1612*d14abf15SRobert Mustacchi (pUM->rssIntr.intrCount == LM_MAX_RSS_CHAINS(&pUM->lm_dev)))
1613*d14abf15SRobert Mustacchi {
1614*d14abf15SRobert Mustacchi return 0; /* ok, already enabled */
1615*d14abf15SRobert Mustacchi }
1616*d14abf15SRobert Mustacchi
1617*d14abf15SRobert Mustacchi BnxeIntrIguSbEnable(pUM, pRxQ->idx, B_FALSE);
1618*d14abf15SRobert Mustacchi
1619*d14abf15SRobert Mustacchi return 0;
1620*d14abf15SRobert Mustacchi }
1621*d14abf15SRobert Mustacchi
1622*d14abf15SRobert Mustacchi
1623*d14abf15SRobert Mustacchi #if defined(__S11) || defined(__S12)
BnxeRxRingIntrDisable(mac_ring_driver_t ringHandle)1624*d14abf15SRobert Mustacchi static int BnxeRxRingIntrDisable(mac_ring_driver_t ringHandle)
1625*d14abf15SRobert Mustacchi #else
1626*d14abf15SRobert Mustacchi static int BnxeRxRingIntrDisable(mac_intr_handle_t ringHandle)
1627*d14abf15SRobert Mustacchi #endif
1628*d14abf15SRobert Mustacchi {
1629*d14abf15SRobert Mustacchi RxQueue * pRxQ = (RxQueue *)ringHandle;
1630*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pRxQ->pUM;
1631*d14abf15SRobert Mustacchi
1632*d14abf15SRobert Mustacchi BnxeLogDbg(pUM, "Disabling Interrupt for Rx Ring %d", pRxQ->idx);
1633*d14abf15SRobert Mustacchi
1634*d14abf15SRobert Mustacchi /* polling not allowed on LM_NON_RSS_SB when overlapped with FCoE */
1635*d14abf15SRobert Mustacchi if ((pRxQ->idx == LM_NON_RSS_SB(&pUM->lm_dev)) &&
1636*d14abf15SRobert Mustacchi CLIENT_BOUND(pUM, LM_CLI_IDX_FCOE) &&
1637*d14abf15SRobert Mustacchi (pUM->rssIntr.intrCount == LM_MAX_RSS_CHAINS(&pUM->lm_dev)))
1638*d14abf15SRobert Mustacchi {
1639*d14abf15SRobert Mustacchi return -1; /* NO, keep enabled! */
1640*d14abf15SRobert Mustacchi }
1641*d14abf15SRobert Mustacchi
1642*d14abf15SRobert Mustacchi BnxeIntrIguSbDisable(pUM, pRxQ->idx, B_FALSE);
1643*d14abf15SRobert Mustacchi
1644*d14abf15SRobert Mustacchi return 0;
1645*d14abf15SRobert Mustacchi }
1646*d14abf15SRobert Mustacchi
1647*d14abf15SRobert Mustacchi
1648*d14abf15SRobert Mustacchi /* callback function for MAC layer to register rings */
BnxeFillRing(void * arg,mac_ring_type_t ringType,const int ringGroupIndex,const int ringIndex,mac_ring_info_t * pRingInfo,mac_ring_handle_t ringHandle)1649*d14abf15SRobert Mustacchi static void BnxeFillRing(void * arg,
1650*d14abf15SRobert Mustacchi mac_ring_type_t ringType,
1651*d14abf15SRobert Mustacchi const int ringGroupIndex,
1652*d14abf15SRobert Mustacchi const int ringIndex,
1653*d14abf15SRobert Mustacchi mac_ring_info_t * pRingInfo,
1654*d14abf15SRobert Mustacchi mac_ring_handle_t ringHandle)
1655*d14abf15SRobert Mustacchi {
1656*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)arg;
1657*d14abf15SRobert Mustacchi RxQueue * pRxQ;
1658*d14abf15SRobert Mustacchi TxQueue * pTxQ;
1659*d14abf15SRobert Mustacchi
1660*d14abf15SRobert Mustacchi switch (ringType)
1661*d14abf15SRobert Mustacchi {
1662*d14abf15SRobert Mustacchi case MAC_RING_TYPE_RX:
1663*d14abf15SRobert Mustacchi
1664*d14abf15SRobert Mustacchi BnxeLogInfo(pUM, "Initializing Rx Ring %d (Ring Group %d)",
1665*d14abf15SRobert Mustacchi ringIndex, ringGroupIndex);
1666*d14abf15SRobert Mustacchi
1667*d14abf15SRobert Mustacchi ASSERT(ringGroupIndex == 0);
1668*d14abf15SRobert Mustacchi ASSERT(ringIndex < pUM->devParams.numRings);
1669*d14abf15SRobert Mustacchi
1670*d14abf15SRobert Mustacchi pRxQ = &pUM->rxq[ringIndex];
1671*d14abf15SRobert Mustacchi pRxQ->ringHandle = ringHandle;
1672*d14abf15SRobert Mustacchi
1673*d14abf15SRobert Mustacchi pRingInfo->mri_driver = (mac_ring_driver_t)pRxQ;
1674*d14abf15SRobert Mustacchi pRingInfo->mri_start = BnxeRxRingStart;
1675*d14abf15SRobert Mustacchi pRingInfo->mri_stop = NULL;
1676*d14abf15SRobert Mustacchi #if defined(__S11) || defined(__S12)
1677*d14abf15SRobert Mustacchi pRingInfo->mri_stat = BnxeRingStat;
1678*d14abf15SRobert Mustacchi #endif
1679*d14abf15SRobert Mustacchi pRingInfo->mri_poll = BnxeRxRingPoll;
1680*d14abf15SRobert Mustacchi
1681*d14abf15SRobert Mustacchi #if !(defined(__S11) || defined(__S12))
1682*d14abf15SRobert Mustacchi pRingInfo->mri_intr.mi_handle = (mac_intr_handle_t)pRxQ;
1683*d14abf15SRobert Mustacchi #endif
1684*d14abf15SRobert Mustacchi pRingInfo->mri_intr.mi_enable = (mac_intr_enable_t)BnxeRxRingIntrEnable;
1685*d14abf15SRobert Mustacchi pRingInfo->mri_intr.mi_disable = (mac_intr_disable_t)BnxeRxRingIntrDisable;
1686*d14abf15SRobert Mustacchi
1687*d14abf15SRobert Mustacchi break;
1688*d14abf15SRobert Mustacchi
1689*d14abf15SRobert Mustacchi case MAC_RING_TYPE_TX:
1690*d14abf15SRobert Mustacchi
1691*d14abf15SRobert Mustacchi BnxeLogInfo(pUM, "Initializing Tx Ring %d (Ring Group %d)",
1692*d14abf15SRobert Mustacchi ringIndex, ringGroupIndex);
1693*d14abf15SRobert Mustacchi
1694*d14abf15SRobert Mustacchi ASSERT(ringGroupIndex == 0);
1695*d14abf15SRobert Mustacchi ASSERT(ringIndex < pUM->devParams.numRings);
1696*d14abf15SRobert Mustacchi
1697*d14abf15SRobert Mustacchi pTxQ = &pUM->txq[ringIndex];
1698*d14abf15SRobert Mustacchi pTxQ->ringHandle = ringHandle;
1699*d14abf15SRobert Mustacchi
1700*d14abf15SRobert Mustacchi pRingInfo->mri_driver = (mac_ring_driver_t)pTxQ;
1701*d14abf15SRobert Mustacchi pRingInfo->mri_start = NULL;
1702*d14abf15SRobert Mustacchi pRingInfo->mri_stop = NULL;
1703*d14abf15SRobert Mustacchi #if defined(__S11) || defined(__S12)
1704*d14abf15SRobert Mustacchi pRingInfo->mri_stat = BnxeRingStat;
1705*d14abf15SRobert Mustacchi #endif
1706*d14abf15SRobert Mustacchi pRingInfo->mri_tx = (mac_ring_send_t)BnxeTxRingSend;
1707*d14abf15SRobert Mustacchi
1708*d14abf15SRobert Mustacchi break;
1709*d14abf15SRobert Mustacchi
1710*d14abf15SRobert Mustacchi default:
1711*d14abf15SRobert Mustacchi break;
1712*d14abf15SRobert Mustacchi }
1713*d14abf15SRobert Mustacchi }
1714*d14abf15SRobert Mustacchi
1715*d14abf15SRobert Mustacchi
1716*d14abf15SRobert Mustacchi /* callback function for MAC layer to register groups */
BnxeFillGroup(void * arg,mac_ring_type_t ringType,const int ringGroupIndex,mac_group_info_t * pGroupInfo,mac_group_handle_t groupHandle)1717*d14abf15SRobert Mustacchi static void BnxeFillGroup(void * arg,
1718*d14abf15SRobert Mustacchi mac_ring_type_t ringType,
1719*d14abf15SRobert Mustacchi const int ringGroupIndex,
1720*d14abf15SRobert Mustacchi mac_group_info_t * pGroupInfo,
1721*d14abf15SRobert Mustacchi mac_group_handle_t groupHandle)
1722*d14abf15SRobert Mustacchi {
1723*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)arg;
1724*d14abf15SRobert Mustacchi RxQueueGroup * pRxQGroup;
1725*d14abf15SRobert Mustacchi
1726*d14abf15SRobert Mustacchi switch (ringType)
1727*d14abf15SRobert Mustacchi {
1728*d14abf15SRobert Mustacchi case MAC_RING_TYPE_RX:
1729*d14abf15SRobert Mustacchi
1730*d14abf15SRobert Mustacchi BnxeLogInfo(pUM, "Initializing Rx Group %d", ringGroupIndex);
1731*d14abf15SRobert Mustacchi
1732*d14abf15SRobert Mustacchi pRxQGroup = &pUM->rxqGroup[ringGroupIndex];
1733*d14abf15SRobert Mustacchi pRxQGroup->groupHandle = groupHandle;
1734*d14abf15SRobert Mustacchi
1735*d14abf15SRobert Mustacchi pGroupInfo->mgi_driver = (mac_group_driver_t)pRxQGroup;
1736*d14abf15SRobert Mustacchi pGroupInfo->mgi_start = NULL;
1737*d14abf15SRobert Mustacchi pGroupInfo->mgi_stop = NULL;
1738*d14abf15SRobert Mustacchi pGroupInfo->mgi_addmac = BnxeRxRingGroupAddMac;
1739*d14abf15SRobert Mustacchi pGroupInfo->mgi_remmac = BnxeRxRingGroupRemMac;
1740*d14abf15SRobert Mustacchi pGroupInfo->mgi_count = (pUM->devParams.numRings /
1741*d14abf15SRobert Mustacchi USER_OPTION_RX_RING_GROUPS_DEFAULT);
1742*d14abf15SRobert Mustacchi #if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS)
1743*d14abf15SRobert Mustacchi pGroupInfo->mgi_flags = MAC_GROUP_DEFAULT;
1744*d14abf15SRobert Mustacchi #endif
1745*d14abf15SRobert Mustacchi
1746*d14abf15SRobert Mustacchi break;
1747*d14abf15SRobert Mustacchi
1748*d14abf15SRobert Mustacchi case MAC_RING_TYPE_TX:
1749*d14abf15SRobert Mustacchi default:
1750*d14abf15SRobert Mustacchi break;
1751*d14abf15SRobert Mustacchi }
1752*d14abf15SRobert Mustacchi }
1753*d14abf15SRobert Mustacchi
1754*d14abf15SRobert Mustacchi #endif /* BNXE_RINGS */
1755*d14abf15SRobert Mustacchi
1756*d14abf15SRobert Mustacchi
BnxeMacGetCapability(void * pArg,mac_capab_t capability,void * pCapabilityData)1757*d14abf15SRobert Mustacchi static boolean_t BnxeMacGetCapability(void * pArg,
1758*d14abf15SRobert Mustacchi mac_capab_t capability,
1759*d14abf15SRobert Mustacchi void * pCapabilityData)
1760*d14abf15SRobert Mustacchi {
1761*d14abf15SRobert Mustacchi um_device_t * pUM = (um_device_t *)pArg;
1762*d14abf15SRobert Mustacchi mac_capab_lso_t * pCapLSO;
1763*d14abf15SRobert Mustacchi mac_capab_rings_t * pCapRings;
1764*d14abf15SRobert Mustacchi
1765*d14abf15SRobert Mustacchi switch (capability)
1766*d14abf15SRobert Mustacchi {
1767*d14abf15SRobert Mustacchi case MAC_CAPAB_HCKSUM:
1768*d14abf15SRobert Mustacchi
1769*d14abf15SRobert Mustacchi *((u32_t *)pCapabilityData) = 0;
1770*d14abf15SRobert Mustacchi
1771*d14abf15SRobert Mustacchi if (pUM->devParams.enabled_oflds &
1772*d14abf15SRobert Mustacchi (LM_OFFLOAD_TX_IP_CKSUM | LM_OFFLOAD_RX_IP_CKSUM))
1773*d14abf15SRobert Mustacchi {
1774*d14abf15SRobert Mustacchi *((u32_t *)pCapabilityData) |= HCKSUM_IPHDRCKSUM;
1775*d14abf15SRobert Mustacchi }
1776*d14abf15SRobert Mustacchi
1777*d14abf15SRobert Mustacchi if (pUM->devParams.enabled_oflds &
1778*d14abf15SRobert Mustacchi (LM_OFFLOAD_TX_TCP_CKSUM | LM_OFFLOAD_TX_UDP_CKSUM |
1779*d14abf15SRobert Mustacchi LM_OFFLOAD_RX_TCP_CKSUM | LM_OFFLOAD_RX_UDP_CKSUM))
1780*d14abf15SRobert Mustacchi {
1781*d14abf15SRobert Mustacchi *((u32_t *)pCapabilityData) |= HCKSUM_INET_PARTIAL;
1782*d14abf15SRobert Mustacchi }
1783*d14abf15SRobert Mustacchi
1784*d14abf15SRobert Mustacchi break;
1785*d14abf15SRobert Mustacchi
1786*d14abf15SRobert Mustacchi case MAC_CAPAB_LSO:
1787*d14abf15SRobert Mustacchi
1788*d14abf15SRobert Mustacchi pCapLSO = (mac_capab_lso_t *)pCapabilityData;
1789*d14abf15SRobert Mustacchi
1790*d14abf15SRobert Mustacchi if (pUM->devParams.lsoEnable)
1791*d14abf15SRobert Mustacchi {
1792*d14abf15SRobert Mustacchi pCapLSO->lso_flags = LSO_TX_BASIC_TCP_IPV4;
1793*d14abf15SRobert Mustacchi pCapLSO->lso_basic_tcp_ipv4.lso_max = BNXE_LSO_MAXLEN;
1794*d14abf15SRobert Mustacchi break;
1795*d14abf15SRobert Mustacchi }
1796*d14abf15SRobert Mustacchi
1797*d14abf15SRobert Mustacchi return B_FALSE;
1798*d14abf15SRobert Mustacchi
1799*d14abf15SRobert Mustacchi #ifdef BNXE_RINGS
1800*d14abf15SRobert Mustacchi
1801*d14abf15SRobert Mustacchi case MAC_CAPAB_RINGS:
1802*d14abf15SRobert Mustacchi
1803*d14abf15SRobert Mustacchi if (!pUM->devParams.numRings)
1804*d14abf15SRobert Mustacchi {
1805*d14abf15SRobert Mustacchi return B_FALSE;
1806*d14abf15SRobert Mustacchi }
1807*d14abf15SRobert Mustacchi
1808*d14abf15SRobert Mustacchi pCapRings = (mac_capab_rings_t *)pCapabilityData;
1809*d14abf15SRobert Mustacchi
1810*d14abf15SRobert Mustacchi #if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS)
1811*d14abf15SRobert Mustacchi pCapRings->mr_version = MAC_RINGS_VERSION_1;
1812*d14abf15SRobert Mustacchi pCapRings->mr_flags = MAC_RINGS_FLAGS_NONE;
1813*d14abf15SRobert Mustacchi #endif
1814*d14abf15SRobert Mustacchi pCapRings->mr_group_type = MAC_GROUP_TYPE_STATIC;
1815*d14abf15SRobert Mustacchi pCapRings->mr_rnum = pUM->devParams.numRings;
1816*d14abf15SRobert Mustacchi pCapRings->mr_rget = BnxeFillRing;
1817*d14abf15SRobert Mustacchi pCapRings->mr_gaddring = NULL;
1818*d14abf15SRobert Mustacchi pCapRings->mr_gremring = NULL;
1819*d14abf15SRobert Mustacchi #if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS)
1820*d14abf15SRobert Mustacchi pCapRings->mr_ggetringtc = NULL;
1821*d14abf15SRobert Mustacchi #endif
1822*d14abf15SRobert Mustacchi
1823*d14abf15SRobert Mustacchi switch (pCapRings->mr_type)
1824*d14abf15SRobert Mustacchi {
1825*d14abf15SRobert Mustacchi case MAC_RING_TYPE_RX:
1826*d14abf15SRobert Mustacchi
1827*d14abf15SRobert Mustacchi pCapRings->mr_gnum = USER_OPTION_RX_RING_GROUPS_DEFAULT;
1828*d14abf15SRobert Mustacchi pCapRings->mr_gget = BnxeFillGroup;
1829*d14abf15SRobert Mustacchi break;
1830*d14abf15SRobert Mustacchi
1831*d14abf15SRobert Mustacchi case MAC_RING_TYPE_TX:
1832*d14abf15SRobert Mustacchi
1833*d14abf15SRobert Mustacchi #if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS)
1834*d14abf15SRobert Mustacchi pCapRings->mr_gnum = 1;
1835*d14abf15SRobert Mustacchi #else
1836*d14abf15SRobert Mustacchi pCapRings->mr_gnum = 0;
1837*d14abf15SRobert Mustacchi #endif
1838*d14abf15SRobert Mustacchi pCapRings->mr_gget = NULL;
1839*d14abf15SRobert Mustacchi break;
1840*d14abf15SRobert Mustacchi
1841*d14abf15SRobert Mustacchi default:
1842*d14abf15SRobert Mustacchi
1843*d14abf15SRobert Mustacchi return B_FALSE;
1844*d14abf15SRobert Mustacchi }
1845*d14abf15SRobert Mustacchi
1846*d14abf15SRobert Mustacchi break;
1847*d14abf15SRobert Mustacchi
1848*d14abf15SRobert Mustacchi #endif /* BNXE_RINGS */
1849*d14abf15SRobert Mustacchi
1850*d14abf15SRobert Mustacchi #if !(defined(__S11) || defined(__S12))
1851*d14abf15SRobert Mustacchi
1852*d14abf15SRobert Mustacchi case MAC_CAPAB_POLL:
1853*d14abf15SRobert Mustacchi
1854*d14abf15SRobert Mustacchi /*
1855*d14abf15SRobert Mustacchi * There's nothing for us to fill in, simply returning B_TRUE stating
1856*d14abf15SRobert Mustacchi * that we support polling is sufficient.
1857*d14abf15SRobert Mustacchi */
1858*d14abf15SRobert Mustacchi break;
1859*d14abf15SRobert Mustacchi
1860*d14abf15SRobert Mustacchi #endif /* not __S11 or __S12 */
1861*d14abf15SRobert Mustacchi
1862*d14abf15SRobert Mustacchi default:
1863*d14abf15SRobert Mustacchi
1864*d14abf15SRobert Mustacchi return B_FALSE;
1865*d14abf15SRobert Mustacchi }
1866*d14abf15SRobert Mustacchi
1867*d14abf15SRobert Mustacchi return B_TRUE;
1868*d14abf15SRobert Mustacchi }
1869*d14abf15SRobert Mustacchi
1870*d14abf15SRobert Mustacchi
1871*d14abf15SRobert Mustacchi #ifdef MC_SETPROP
1872*d14abf15SRobert Mustacchi
BnxeSetPrivateProperty(um_device_t * pUM,const char * pr_name,uint_t pr_valsize,const void * pr_val)1873*d14abf15SRobert Mustacchi static int BnxeSetPrivateProperty(um_device_t * pUM,
1874*d14abf15SRobert Mustacchi const char * pr_name,
1875*d14abf15SRobert Mustacchi uint_t pr_valsize,
1876*d14abf15SRobert Mustacchi const void * pr_val)
1877*d14abf15SRobert Mustacchi {
1878*d14abf15SRobert Mustacchi int err = 0;
1879*d14abf15SRobert Mustacchi long result;
1880*d14abf15SRobert Mustacchi
1881*d14abf15SRobert Mustacchi if (strcmp(pr_name, "_en_2500fdx_cap") == 0)
1882*d14abf15SRobert Mustacchi {
1883*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
1884*d14abf15SRobert Mustacchi {
1885*d14abf15SRobert Mustacchi return EINVAL;
1886*d14abf15SRobert Mustacchi }
1887*d14abf15SRobert Mustacchi
1888*d14abf15SRobert Mustacchi if ((result > 1) || (result < 0))
1889*d14abf15SRobert Mustacchi {
1890*d14abf15SRobert Mustacchi return EINVAL;
1891*d14abf15SRobert Mustacchi }
1892*d14abf15SRobert Mustacchi
1893*d14abf15SRobert Mustacchi pUM->hwinit.lnkcfg.param_2500fdx = (uint32_t)result;
1894*d14abf15SRobert Mustacchi pUM->curcfg.lnkcfg.param_2500fdx = (uint32_t)result;
1895*d14abf15SRobert Mustacchi if (pUM->plumbed) BnxeUpdatePhy(pUM);
1896*d14abf15SRobert Mustacchi }
1897*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_en_txpause_cap") == 0)
1898*d14abf15SRobert Mustacchi {
1899*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
1900*d14abf15SRobert Mustacchi {
1901*d14abf15SRobert Mustacchi return EINVAL;
1902*d14abf15SRobert Mustacchi }
1903*d14abf15SRobert Mustacchi
1904*d14abf15SRobert Mustacchi if ((result > 1) || (result < 0))
1905*d14abf15SRobert Mustacchi {
1906*d14abf15SRobert Mustacchi return EINVAL;
1907*d14abf15SRobert Mustacchi }
1908*d14abf15SRobert Mustacchi
1909*d14abf15SRobert Mustacchi pUM->hwinit.lnkcfg.param_txpause = (uint32_t)result;
1910*d14abf15SRobert Mustacchi pUM->curcfg.lnkcfg.param_txpause = (uint32_t)result;
1911*d14abf15SRobert Mustacchi if (pUM->plumbed) BnxeUpdatePhy(pUM);
1912*d14abf15SRobert Mustacchi }
1913*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_en_rxpause_cap") == 0)
1914*d14abf15SRobert Mustacchi {
1915*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
1916*d14abf15SRobert Mustacchi {
1917*d14abf15SRobert Mustacchi return EINVAL;
1918*d14abf15SRobert Mustacchi }
1919*d14abf15SRobert Mustacchi
1920*d14abf15SRobert Mustacchi if ((result > 1) || (result < 0))
1921*d14abf15SRobert Mustacchi {
1922*d14abf15SRobert Mustacchi return EINVAL;
1923*d14abf15SRobert Mustacchi }
1924*d14abf15SRobert Mustacchi
1925*d14abf15SRobert Mustacchi pUM->hwinit.lnkcfg.param_rxpause = (uint32_t)result;
1926*d14abf15SRobert Mustacchi pUM->curcfg.lnkcfg.param_rxpause = (uint32_t)result;
1927*d14abf15SRobert Mustacchi if (pUM->plumbed) BnxeUpdatePhy(pUM);
1928*d14abf15SRobert Mustacchi }
1929*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_autoneg_flow") == 0)
1930*d14abf15SRobert Mustacchi {
1931*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
1932*d14abf15SRobert Mustacchi {
1933*d14abf15SRobert Mustacchi return EINVAL;
1934*d14abf15SRobert Mustacchi }
1935*d14abf15SRobert Mustacchi
1936*d14abf15SRobert Mustacchi if ((result > 1) || (result < 0))
1937*d14abf15SRobert Mustacchi {
1938*d14abf15SRobert Mustacchi return EINVAL;
1939*d14abf15SRobert Mustacchi }
1940*d14abf15SRobert Mustacchi
1941*d14abf15SRobert Mustacchi pUM->hwinit.flow_autoneg = (uint32_t)result;
1942*d14abf15SRobert Mustacchi pUM->curcfg.flow_autoneg = (uint32_t)result;
1943*d14abf15SRobert Mustacchi if (pUM->plumbed) BnxeUpdatePhy(pUM);
1944*d14abf15SRobert Mustacchi }
1945*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_checksum") == 0)
1946*d14abf15SRobert Mustacchi {
1947*d14abf15SRobert Mustacchi if (pUM->plumbed)
1948*d14abf15SRobert Mustacchi {
1949*d14abf15SRobert Mustacchi return EBUSY;
1950*d14abf15SRobert Mustacchi }
1951*d14abf15SRobert Mustacchi
1952*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
1953*d14abf15SRobert Mustacchi {
1954*d14abf15SRobert Mustacchi return EINVAL;
1955*d14abf15SRobert Mustacchi }
1956*d14abf15SRobert Mustacchi
1957*d14abf15SRobert Mustacchi switch (result)
1958*d14abf15SRobert Mustacchi {
1959*d14abf15SRobert Mustacchi case USER_OPTION_CKSUM_NONE:
1960*d14abf15SRobert Mustacchi
1961*d14abf15SRobert Mustacchi pUM->devParams.enabled_oflds = LM_OFFLOAD_NONE;
1962*d14abf15SRobert Mustacchi break;
1963*d14abf15SRobert Mustacchi
1964*d14abf15SRobert Mustacchi case USER_OPTION_CKSUM_L3:
1965*d14abf15SRobert Mustacchi
1966*d14abf15SRobert Mustacchi pUM->devParams.enabled_oflds = (LM_OFFLOAD_TX_IP_CKSUM |
1967*d14abf15SRobert Mustacchi LM_OFFLOAD_RX_IP_CKSUM);
1968*d14abf15SRobert Mustacchi break;
1969*d14abf15SRobert Mustacchi
1970*d14abf15SRobert Mustacchi case USER_OPTION_CKSUM_L3_L4:
1971*d14abf15SRobert Mustacchi
1972*d14abf15SRobert Mustacchi pUM->devParams.enabled_oflds = (LM_OFFLOAD_TX_IP_CKSUM |
1973*d14abf15SRobert Mustacchi LM_OFFLOAD_RX_IP_CKSUM |
1974*d14abf15SRobert Mustacchi LM_OFFLOAD_TX_TCP_CKSUM |
1975*d14abf15SRobert Mustacchi LM_OFFLOAD_RX_TCP_CKSUM |
1976*d14abf15SRobert Mustacchi LM_OFFLOAD_TX_UDP_CKSUM |
1977*d14abf15SRobert Mustacchi LM_OFFLOAD_RX_UDP_CKSUM);
1978*d14abf15SRobert Mustacchi break;
1979*d14abf15SRobert Mustacchi
1980*d14abf15SRobert Mustacchi default:
1981*d14abf15SRobert Mustacchi
1982*d14abf15SRobert Mustacchi return EINVAL;
1983*d14abf15SRobert Mustacchi }
1984*d14abf15SRobert Mustacchi
1985*d14abf15SRobert Mustacchi pUM->devParams.checksum = (uint32_t)result;
1986*d14abf15SRobert Mustacchi }
1987*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_tx_ring_policy") == 0)
1988*d14abf15SRobert Mustacchi {
1989*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
1990*d14abf15SRobert Mustacchi {
1991*d14abf15SRobert Mustacchi return EINVAL;
1992*d14abf15SRobert Mustacchi }
1993*d14abf15SRobert Mustacchi
1994*d14abf15SRobert Mustacchi switch (result)
1995*d14abf15SRobert Mustacchi {
1996*d14abf15SRobert Mustacchi case BNXE_ROUTE_RING_NONE:
1997*d14abf15SRobert Mustacchi case BNXE_ROUTE_RING_TCPUDP:
1998*d14abf15SRobert Mustacchi case BNXE_ROUTE_RING_DEST_MAC:
1999*d14abf15SRobert Mustacchi case BNXE_ROUTE_RING_MSG_PRIO:
2000*d14abf15SRobert Mustacchi
2001*d14abf15SRobert Mustacchi break;
2002*d14abf15SRobert Mustacchi
2003*d14abf15SRobert Mustacchi default:
2004*d14abf15SRobert Mustacchi
2005*d14abf15SRobert Mustacchi return EINVAL;
2006*d14abf15SRobert Mustacchi }
2007*d14abf15SRobert Mustacchi
2008*d14abf15SRobert Mustacchi pUM->devParams.routeTxRingPolicy = (uint32_t)result;
2009*d14abf15SRobert Mustacchi }
2010*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_num_rings") == 0)
2011*d14abf15SRobert Mustacchi {
2012*d14abf15SRobert Mustacchi if (pUM->plumbed)
2013*d14abf15SRobert Mustacchi {
2014*d14abf15SRobert Mustacchi return EBUSY;
2015*d14abf15SRobert Mustacchi }
2016*d14abf15SRobert Mustacchi
2017*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
2018*d14abf15SRobert Mustacchi {
2019*d14abf15SRobert Mustacchi return EINVAL;
2020*d14abf15SRobert Mustacchi }
2021*d14abf15SRobert Mustacchi
2022*d14abf15SRobert Mustacchi if ((result < USER_OPTION_NUM_RINGS_MIN) ||
2023*d14abf15SRobert Mustacchi (result > USER_OPTION_NUM_RINGS_MAX))
2024*d14abf15SRobert Mustacchi {
2025*d14abf15SRobert Mustacchi return EINVAL;
2026*d14abf15SRobert Mustacchi }
2027*d14abf15SRobert Mustacchi
2028*d14abf15SRobert Mustacchi pUM->devParams.numRings = (uint32_t)result;
2029*d14abf15SRobert Mustacchi }
2030*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_rx_descs") == 0)
2031*d14abf15SRobert Mustacchi {
2032*d14abf15SRobert Mustacchi if (pUM->plumbed)
2033*d14abf15SRobert Mustacchi {
2034*d14abf15SRobert Mustacchi return EBUSY;
2035*d14abf15SRobert Mustacchi }
2036*d14abf15SRobert Mustacchi
2037*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
2038*d14abf15SRobert Mustacchi {
2039*d14abf15SRobert Mustacchi return EINVAL;
2040*d14abf15SRobert Mustacchi }
2041*d14abf15SRobert Mustacchi
2042*d14abf15SRobert Mustacchi if ((result < USER_OPTION_BDS_MIN) || (result > USER_OPTION_BDS_MAX))
2043*d14abf15SRobert Mustacchi {
2044*d14abf15SRobert Mustacchi return EINVAL;
2045*d14abf15SRobert Mustacchi }
2046*d14abf15SRobert Mustacchi
2047*d14abf15SRobert Mustacchi pUM->devParams.numRxDesc[LM_CLI_IDX_NDIS] = (uint32_t)result;
2048*d14abf15SRobert Mustacchi }
2049*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_rx_free_reclaim") == 0)
2050*d14abf15SRobert Mustacchi {
2051*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
2052*d14abf15SRobert Mustacchi {
2053*d14abf15SRobert Mustacchi return EINVAL;
2054*d14abf15SRobert Mustacchi }
2055*d14abf15SRobert Mustacchi
2056*d14abf15SRobert Mustacchi if ((result < USER_OPTION_BDS_MIN) || (result > USER_OPTION_BDS_MAX))
2057*d14abf15SRobert Mustacchi {
2058*d14abf15SRobert Mustacchi return EINVAL;
2059*d14abf15SRobert Mustacchi }
2060*d14abf15SRobert Mustacchi
2061*d14abf15SRobert Mustacchi pUM->devParams.maxRxFree = (uint32_t)result;
2062*d14abf15SRobert Mustacchi }
2063*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_tx_descs") == 0)
2064*d14abf15SRobert Mustacchi {
2065*d14abf15SRobert Mustacchi if (pUM->plumbed)
2066*d14abf15SRobert Mustacchi {
2067*d14abf15SRobert Mustacchi return EBUSY;
2068*d14abf15SRobert Mustacchi }
2069*d14abf15SRobert Mustacchi
2070*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
2071*d14abf15SRobert Mustacchi {
2072*d14abf15SRobert Mustacchi return EINVAL;
2073*d14abf15SRobert Mustacchi }
2074*d14abf15SRobert Mustacchi
2075*d14abf15SRobert Mustacchi if ((result < USER_OPTION_BDS_MIN) || (result > USER_OPTION_BDS_MAX))
2076*d14abf15SRobert Mustacchi {
2077*d14abf15SRobert Mustacchi return EINVAL;
2078*d14abf15SRobert Mustacchi }
2079*d14abf15SRobert Mustacchi
2080*d14abf15SRobert Mustacchi pUM->devParams.numTxDesc[LM_CLI_IDX_NDIS] = (uint32_t)result;
2081*d14abf15SRobert Mustacchi }
2082*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_tx_free_reclaim") == 0)
2083*d14abf15SRobert Mustacchi {
2084*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
2085*d14abf15SRobert Mustacchi {
2086*d14abf15SRobert Mustacchi return EINVAL;
2087*d14abf15SRobert Mustacchi }
2088*d14abf15SRobert Mustacchi
2089*d14abf15SRobert Mustacchi if ((result < USER_OPTION_BDS_MIN) || (result > USER_OPTION_BDS_MAX))
2090*d14abf15SRobert Mustacchi {
2091*d14abf15SRobert Mustacchi return EINVAL;
2092*d14abf15SRobert Mustacchi }
2093*d14abf15SRobert Mustacchi
2094*d14abf15SRobert Mustacchi pUM->devParams.maxTxFree = (uint32_t)result;
2095*d14abf15SRobert Mustacchi }
2096*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_rx_copy_threshold") == 0)
2097*d14abf15SRobert Mustacchi {
2098*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
2099*d14abf15SRobert Mustacchi {
2100*d14abf15SRobert Mustacchi return EINVAL;
2101*d14abf15SRobert Mustacchi }
2102*d14abf15SRobert Mustacchi
2103*d14abf15SRobert Mustacchi pUM->devParams.rxCopyThreshold = (uint32_t)result;
2104*d14abf15SRobert Mustacchi }
2105*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_tx_copy_threshold") == 0)
2106*d14abf15SRobert Mustacchi {
2107*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
2108*d14abf15SRobert Mustacchi {
2109*d14abf15SRobert Mustacchi return EINVAL;
2110*d14abf15SRobert Mustacchi }
2111*d14abf15SRobert Mustacchi
2112*d14abf15SRobert Mustacchi pUM->devParams.txCopyThreshold = (uint32_t)result;
2113*d14abf15SRobert Mustacchi }
2114*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_interrupt_coalesce") == 0)
2115*d14abf15SRobert Mustacchi {
2116*d14abf15SRobert Mustacchi if (pUM->plumbed)
2117*d14abf15SRobert Mustacchi {
2118*d14abf15SRobert Mustacchi return EBUSY;
2119*d14abf15SRobert Mustacchi }
2120*d14abf15SRobert Mustacchi
2121*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
2122*d14abf15SRobert Mustacchi {
2123*d14abf15SRobert Mustacchi return EINVAL;
2124*d14abf15SRobert Mustacchi }
2125*d14abf15SRobert Mustacchi
2126*d14abf15SRobert Mustacchi if ((result > 1) || (result < 0))
2127*d14abf15SRobert Mustacchi {
2128*d14abf15SRobert Mustacchi return EINVAL;
2129*d14abf15SRobert Mustacchi }
2130*d14abf15SRobert Mustacchi
2131*d14abf15SRobert Mustacchi pUM->devParams.intrCoalesce = (uint32_t)result;
2132*d14abf15SRobert Mustacchi }
2133*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_rx_interrupt_coalesce_usec") == 0)
2134*d14abf15SRobert Mustacchi {
2135*d14abf15SRobert Mustacchi if (pUM->plumbed)
2136*d14abf15SRobert Mustacchi {
2137*d14abf15SRobert Mustacchi return EBUSY;
2138*d14abf15SRobert Mustacchi }
2139*d14abf15SRobert Mustacchi
2140*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
2141*d14abf15SRobert Mustacchi {
2142*d14abf15SRobert Mustacchi return EINVAL;
2143*d14abf15SRobert Mustacchi }
2144*d14abf15SRobert Mustacchi
2145*d14abf15SRobert Mustacchi if ((result < USER_OPTION_INTR_COALESCE_MIN) ||
2146*d14abf15SRobert Mustacchi (result < USER_OPTION_INTR_COALESCE_MAX))
2147*d14abf15SRobert Mustacchi {
2148*d14abf15SRobert Mustacchi return EINVAL;
2149*d14abf15SRobert Mustacchi }
2150*d14abf15SRobert Mustacchi
2151*d14abf15SRobert Mustacchi pUM->devParams.intrRxPerSec = (uint32_t)(1000000 / result);
2152*d14abf15SRobert Mustacchi }
2153*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_tx_interrupt_coalesce_usec") == 0)
2154*d14abf15SRobert Mustacchi {
2155*d14abf15SRobert Mustacchi if (pUM->plumbed)
2156*d14abf15SRobert Mustacchi {
2157*d14abf15SRobert Mustacchi return EBUSY;
2158*d14abf15SRobert Mustacchi }
2159*d14abf15SRobert Mustacchi
2160*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
2161*d14abf15SRobert Mustacchi {
2162*d14abf15SRobert Mustacchi return EINVAL;
2163*d14abf15SRobert Mustacchi }
2164*d14abf15SRobert Mustacchi
2165*d14abf15SRobert Mustacchi if ((result < USER_OPTION_INTR_COALESCE_MIN) ||
2166*d14abf15SRobert Mustacchi (result < USER_OPTION_INTR_COALESCE_MAX))
2167*d14abf15SRobert Mustacchi {
2168*d14abf15SRobert Mustacchi return EINVAL;
2169*d14abf15SRobert Mustacchi }
2170*d14abf15SRobert Mustacchi
2171*d14abf15SRobert Mustacchi pUM->devParams.intrTxPerSec = (uint32_t)(1000000 / result);
2172*d14abf15SRobert Mustacchi }
2173*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_disable_msix") == 0)
2174*d14abf15SRobert Mustacchi {
2175*d14abf15SRobert Mustacchi if (pUM->plumbed)
2176*d14abf15SRobert Mustacchi {
2177*d14abf15SRobert Mustacchi return EBUSY;
2178*d14abf15SRobert Mustacchi }
2179*d14abf15SRobert Mustacchi
2180*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
2181*d14abf15SRobert Mustacchi {
2182*d14abf15SRobert Mustacchi return EINVAL;
2183*d14abf15SRobert Mustacchi }
2184*d14abf15SRobert Mustacchi
2185*d14abf15SRobert Mustacchi if ((result > 1) || (result < 0))
2186*d14abf15SRobert Mustacchi {
2187*d14abf15SRobert Mustacchi return EINVAL;
2188*d14abf15SRobert Mustacchi }
2189*d14abf15SRobert Mustacchi
2190*d14abf15SRobert Mustacchi pUM->devParams.disableMsix = (uint32_t)result;
2191*d14abf15SRobert Mustacchi }
2192*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_l2_fw_flow_ctrl") == 0)
2193*d14abf15SRobert Mustacchi {
2194*d14abf15SRobert Mustacchi if (pUM->plumbed)
2195*d14abf15SRobert Mustacchi {
2196*d14abf15SRobert Mustacchi return EBUSY;
2197*d14abf15SRobert Mustacchi }
2198*d14abf15SRobert Mustacchi
2199*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
2200*d14abf15SRobert Mustacchi {
2201*d14abf15SRobert Mustacchi return EINVAL;
2202*d14abf15SRobert Mustacchi }
2203*d14abf15SRobert Mustacchi
2204*d14abf15SRobert Mustacchi if ((result > 1) || (result < 0))
2205*d14abf15SRobert Mustacchi {
2206*d14abf15SRobert Mustacchi return EINVAL;
2207*d14abf15SRobert Mustacchi }
2208*d14abf15SRobert Mustacchi
2209*d14abf15SRobert Mustacchi pUM->devParams.l2_fw_flow_ctrl = (uint32_t)result;
2210*d14abf15SRobert Mustacchi }
2211*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_autogreeen_enable") == 0)
2212*d14abf15SRobert Mustacchi {
2213*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
2214*d14abf15SRobert Mustacchi {
2215*d14abf15SRobert Mustacchi return EINVAL;
2216*d14abf15SRobert Mustacchi }
2217*d14abf15SRobert Mustacchi
2218*d14abf15SRobert Mustacchi if ((result > 1) || (result < 0))
2219*d14abf15SRobert Mustacchi {
2220*d14abf15SRobert Mustacchi return EINVAL;
2221*d14abf15SRobert Mustacchi }
2222*d14abf15SRobert Mustacchi
2223*d14abf15SRobert Mustacchi pUM->devParams.autogreeenEnable = (uint32_t)result;
2224*d14abf15SRobert Mustacchi if (pUM->plumbed) BnxeUpdatePhy(pUM);
2225*d14abf15SRobert Mustacchi }
2226*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_lso_enable") == 0)
2227*d14abf15SRobert Mustacchi {
2228*d14abf15SRobert Mustacchi if (pUM->plumbed)
2229*d14abf15SRobert Mustacchi {
2230*d14abf15SRobert Mustacchi return EBUSY;
2231*d14abf15SRobert Mustacchi }
2232*d14abf15SRobert Mustacchi
2233*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
2234*d14abf15SRobert Mustacchi {
2235*d14abf15SRobert Mustacchi return EINVAL;
2236*d14abf15SRobert Mustacchi }
2237*d14abf15SRobert Mustacchi
2238*d14abf15SRobert Mustacchi if ((result > 1) || (result < 0))
2239*d14abf15SRobert Mustacchi {
2240*d14abf15SRobert Mustacchi return EINVAL;
2241*d14abf15SRobert Mustacchi }
2242*d14abf15SRobert Mustacchi
2243*d14abf15SRobert Mustacchi pUM->devParams.lsoEnable = (uint32_t)result;
2244*d14abf15SRobert Mustacchi }
2245*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_log_enable") == 0)
2246*d14abf15SRobert Mustacchi {
2247*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
2248*d14abf15SRobert Mustacchi {
2249*d14abf15SRobert Mustacchi return EINVAL;
2250*d14abf15SRobert Mustacchi }
2251*d14abf15SRobert Mustacchi
2252*d14abf15SRobert Mustacchi if ((result > 1) || (result < 0))
2253*d14abf15SRobert Mustacchi {
2254*d14abf15SRobert Mustacchi return EINVAL;
2255*d14abf15SRobert Mustacchi }
2256*d14abf15SRobert Mustacchi
2257*d14abf15SRobert Mustacchi pUM->devParams.logEnable = (uint32_t)result;
2258*d14abf15SRobert Mustacchi }
2259*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_fcoe_enable") == 0)
2260*d14abf15SRobert Mustacchi {
2261*d14abf15SRobert Mustacchi if (ddi_strtol(pr_val, (char **)NULL, 0, &result))
2262*d14abf15SRobert Mustacchi {
2263*d14abf15SRobert Mustacchi return EINVAL;
2264*d14abf15SRobert Mustacchi }
2265*d14abf15SRobert Mustacchi
2266*d14abf15SRobert Mustacchi if ((result > 1) || (result < 0))
2267*d14abf15SRobert Mustacchi {
2268*d14abf15SRobert Mustacchi return EINVAL;
2269*d14abf15SRobert Mustacchi }
2270*d14abf15SRobert Mustacchi
2271*d14abf15SRobert Mustacchi pUM->devParams.fcoeEnable = (uint32_t)result;
2272*d14abf15SRobert Mustacchi
2273*d14abf15SRobert Mustacchi if (BNXE_FCOE(pUM))
2274*d14abf15SRobert Mustacchi {
2275*d14abf15SRobert Mustacchi BnxeFcoeStartStop(pUM);
2276*d14abf15SRobert Mustacchi }
2277*d14abf15SRobert Mustacchi }
2278*d14abf15SRobert Mustacchi else
2279*d14abf15SRobert Mustacchi {
2280*d14abf15SRobert Mustacchi err = ENOTSUP;
2281*d14abf15SRobert Mustacchi }
2282*d14abf15SRobert Mustacchi
2283*d14abf15SRobert Mustacchi return err;
2284*d14abf15SRobert Mustacchi }
2285*d14abf15SRobert Mustacchi
2286*d14abf15SRobert Mustacchi
BnxeMacSetProperty(void * barg,const char * pr_name,mac_prop_id_t pr_num,uint_t pr_valsize,const void * pr_val)2287*d14abf15SRobert Mustacchi static int BnxeMacSetProperty(void * barg,
2288*d14abf15SRobert Mustacchi const char * pr_name,
2289*d14abf15SRobert Mustacchi mac_prop_id_t pr_num,
2290*d14abf15SRobert Mustacchi uint_t pr_valsize,
2291*d14abf15SRobert Mustacchi const void * pr_val)
2292*d14abf15SRobert Mustacchi {
2293*d14abf15SRobert Mustacchi um_device_t * pUM = barg;
2294*d14abf15SRobert Mustacchi boolean_t reprogram = B_FALSE;
2295*d14abf15SRobert Mustacchi boolean_t rxpause;
2296*d14abf15SRobert Mustacchi boolean_t txpause;
2297*d14abf15SRobert Mustacchi uint32_t mtu;
2298*d14abf15SRobert Mustacchi link_flowctrl_t fl;
2299*d14abf15SRobert Mustacchi int err = 0;
2300*d14abf15SRobert Mustacchi
2301*d14abf15SRobert Mustacchi BNXE_LOCK_ENTER_GLD(pUM);
2302*d14abf15SRobert Mustacchi
2303*d14abf15SRobert Mustacchi switch (pr_num)
2304*d14abf15SRobert Mustacchi {
2305*d14abf15SRobert Mustacchi /* read-only props */
2306*d14abf15SRobert Mustacchi case MAC_PROP_STATUS:
2307*d14abf15SRobert Mustacchi case MAC_PROP_SPEED:
2308*d14abf15SRobert Mustacchi case MAC_PROP_DUPLEX:
2309*d14abf15SRobert Mustacchi
2310*d14abf15SRobert Mustacchi case MAC_PROP_ADV_10GFDX_CAP:
2311*d14abf15SRobert Mustacchi case MAC_PROP_ADV_1000FDX_CAP:
2312*d14abf15SRobert Mustacchi case MAC_PROP_ADV_1000HDX_CAP:
2313*d14abf15SRobert Mustacchi case MAC_PROP_ADV_100FDX_CAP:
2314*d14abf15SRobert Mustacchi case MAC_PROP_ADV_100HDX_CAP:
2315*d14abf15SRobert Mustacchi case MAC_PROP_ADV_10FDX_CAP:
2316*d14abf15SRobert Mustacchi case MAC_PROP_ADV_10HDX_CAP:
2317*d14abf15SRobert Mustacchi case MAC_PROP_ADV_100T4_CAP:
2318*d14abf15SRobert Mustacchi
2319*d14abf15SRobert Mustacchi case MAC_PROP_EN_1000HDX_CAP:
2320*d14abf15SRobert Mustacchi case MAC_PROP_EN_100T4_CAP:
2321*d14abf15SRobert Mustacchi
2322*d14abf15SRobert Mustacchi default:
2323*d14abf15SRobert Mustacchi
2324*d14abf15SRobert Mustacchi err = ENOTSUP;
2325*d14abf15SRobert Mustacchi break;
2326*d14abf15SRobert Mustacchi
2327*d14abf15SRobert Mustacchi case MAC_PROP_EN_10GFDX_CAP:
2328*d14abf15SRobert Mustacchi
2329*d14abf15SRobert Mustacchi pUM->hwinit.lnkcfg.param_10000fdx = *(uint8_t *)pr_val;
2330*d14abf15SRobert Mustacchi pUM->curcfg.lnkcfg.param_10000fdx = *(uint8_t *)pr_val;
2331*d14abf15SRobert Mustacchi reprogram = B_TRUE;
2332*d14abf15SRobert Mustacchi break;
2333*d14abf15SRobert Mustacchi
2334*d14abf15SRobert Mustacchi case MAC_PROP_EN_1000FDX_CAP:
2335*d14abf15SRobert Mustacchi
2336*d14abf15SRobert Mustacchi pUM->hwinit.lnkcfg.param_1000fdx = *(uint8_t *)pr_val;
2337*d14abf15SRobert Mustacchi pUM->curcfg.lnkcfg.param_1000fdx = *(uint8_t *)pr_val;
2338*d14abf15SRobert Mustacchi reprogram = B_TRUE;
2339*d14abf15SRobert Mustacchi break;
2340*d14abf15SRobert Mustacchi
2341*d14abf15SRobert Mustacchi case MAC_PROP_EN_100FDX_CAP:
2342*d14abf15SRobert Mustacchi
2343*d14abf15SRobert Mustacchi pUM->hwinit.lnkcfg.param_100fdx = *(uint8_t *)pr_val;
2344*d14abf15SRobert Mustacchi pUM->curcfg.lnkcfg.param_100fdx = *(uint8_t *)pr_val;
2345*d14abf15SRobert Mustacchi reprogram = B_TRUE;
2346*d14abf15SRobert Mustacchi break;
2347*d14abf15SRobert Mustacchi
2348*d14abf15SRobert Mustacchi case MAC_PROP_EN_100HDX_CAP:
2349*d14abf15SRobert Mustacchi
2350*d14abf15SRobert Mustacchi pUM->hwinit.lnkcfg.param_100hdx = *(uint8_t *)pr_val;
2351*d14abf15SRobert Mustacchi pUM->curcfg.lnkcfg.param_100hdx = *(uint8_t *)pr_val;
2352*d14abf15SRobert Mustacchi reprogram = B_TRUE;
2353*d14abf15SRobert Mustacchi break;
2354*d14abf15SRobert Mustacchi
2355*d14abf15SRobert Mustacchi case MAC_PROP_EN_10FDX_CAP:
2356*d14abf15SRobert Mustacchi
2357*d14abf15SRobert Mustacchi pUM->hwinit.lnkcfg.param_10fdx = *(uint8_t *)pr_val;
2358*d14abf15SRobert Mustacchi pUM->curcfg.lnkcfg.param_10fdx = *(uint8_t *)pr_val;
2359*d14abf15SRobert Mustacchi reprogram = B_TRUE;
2360*d14abf15SRobert Mustacchi break;
2361*d14abf15SRobert Mustacchi
2362*d14abf15SRobert Mustacchi case MAC_PROP_EN_10HDX_CAP:
2363*d14abf15SRobert Mustacchi
2364*d14abf15SRobert Mustacchi pUM->hwinit.lnkcfg.param_10hdx = *(uint8_t *)pr_val;
2365*d14abf15SRobert Mustacchi pUM->curcfg.lnkcfg.param_10hdx = *(uint8_t *)pr_val;
2366*d14abf15SRobert Mustacchi reprogram = B_TRUE;
2367*d14abf15SRobert Mustacchi break;
2368*d14abf15SRobert Mustacchi
2369*d14abf15SRobert Mustacchi case MAC_PROP_AUTONEG:
2370*d14abf15SRobert Mustacchi
2371*d14abf15SRobert Mustacchi pUM->hwinit.lnkcfg.link_autoneg = *(uint8_t *)pr_val;
2372*d14abf15SRobert Mustacchi pUM->curcfg.lnkcfg.link_autoneg = *(uint8_t *)pr_val;
2373*d14abf15SRobert Mustacchi reprogram = B_TRUE;
2374*d14abf15SRobert Mustacchi break;
2375*d14abf15SRobert Mustacchi
2376*d14abf15SRobert Mustacchi case MAC_PROP_FLOWCTRL:
2377*d14abf15SRobert Mustacchi
2378*d14abf15SRobert Mustacchi bcopy(pr_val, &fl, sizeof(fl));
2379*d14abf15SRobert Mustacchi
2380*d14abf15SRobert Mustacchi switch (fl)
2381*d14abf15SRobert Mustacchi {
2382*d14abf15SRobert Mustacchi case LINK_FLOWCTRL_NONE:
2383*d14abf15SRobert Mustacchi
2384*d14abf15SRobert Mustacchi rxpause = B_FALSE;
2385*d14abf15SRobert Mustacchi txpause = B_FALSE;
2386*d14abf15SRobert Mustacchi break;
2387*d14abf15SRobert Mustacchi
2388*d14abf15SRobert Mustacchi case LINK_FLOWCTRL_RX:
2389*d14abf15SRobert Mustacchi
2390*d14abf15SRobert Mustacchi rxpause = B_TRUE;
2391*d14abf15SRobert Mustacchi txpause = B_FALSE;
2392*d14abf15SRobert Mustacchi break;
2393*d14abf15SRobert Mustacchi
2394*d14abf15SRobert Mustacchi case LINK_FLOWCTRL_TX:
2395*d14abf15SRobert Mustacchi
2396*d14abf15SRobert Mustacchi rxpause = B_FALSE;
2397*d14abf15SRobert Mustacchi txpause = B_TRUE;
2398*d14abf15SRobert Mustacchi break;
2399*d14abf15SRobert Mustacchi
2400*d14abf15SRobert Mustacchi case LINK_FLOWCTRL_BI:
2401*d14abf15SRobert Mustacchi
2402*d14abf15SRobert Mustacchi rxpause = B_TRUE;
2403*d14abf15SRobert Mustacchi txpause = B_TRUE;
2404*d14abf15SRobert Mustacchi break;
2405*d14abf15SRobert Mustacchi
2406*d14abf15SRobert Mustacchi default:
2407*d14abf15SRobert Mustacchi
2408*d14abf15SRobert Mustacchi err = ENOTSUP;
2409*d14abf15SRobert Mustacchi break;
2410*d14abf15SRobert Mustacchi }
2411*d14abf15SRobert Mustacchi
2412*d14abf15SRobert Mustacchi if (err == 0)
2413*d14abf15SRobert Mustacchi {
2414*d14abf15SRobert Mustacchi pUM->hwinit.lnkcfg.param_rxpause = rxpause;
2415*d14abf15SRobert Mustacchi pUM->hwinit.lnkcfg.param_txpause = txpause;
2416*d14abf15SRobert Mustacchi pUM->curcfg.lnkcfg.param_rxpause = rxpause;
2417*d14abf15SRobert Mustacchi pUM->curcfg.lnkcfg.param_txpause = txpause;
2418*d14abf15SRobert Mustacchi reprogram = B_TRUE;
2419*d14abf15SRobert Mustacchi }
2420*d14abf15SRobert Mustacchi
2421*d14abf15SRobert Mustacchi break;
2422*d14abf15SRobert Mustacchi
2423*d14abf15SRobert Mustacchi case MAC_PROP_MTU:
2424*d14abf15SRobert Mustacchi
2425*d14abf15SRobert Mustacchi if (pUM->plumbed)
2426*d14abf15SRobert Mustacchi {
2427*d14abf15SRobert Mustacchi err = EBUSY;
2428*d14abf15SRobert Mustacchi break;
2429*d14abf15SRobert Mustacchi }
2430*d14abf15SRobert Mustacchi
2431*d14abf15SRobert Mustacchi bcopy(pr_val, &mtu, sizeof (mtu));
2432*d14abf15SRobert Mustacchi
2433*d14abf15SRobert Mustacchi if ((mtu < USER_OPTION_MTU_MIN) || (mtu > USER_OPTION_MTU_MAX))
2434*d14abf15SRobert Mustacchi {
2435*d14abf15SRobert Mustacchi err = EINVAL;
2436*d14abf15SRobert Mustacchi break;
2437*d14abf15SRobert Mustacchi }
2438*d14abf15SRobert Mustacchi
2439*d14abf15SRobert Mustacchi if (pUM->devParams.mtu[LM_CLI_IDX_NDIS] == mtu)
2440*d14abf15SRobert Mustacchi {
2441*d14abf15SRobert Mustacchi break;
2442*d14abf15SRobert Mustacchi }
2443*d14abf15SRobert Mustacchi
2444*d14abf15SRobert Mustacchi pUM->devParams.mtu[LM_CLI_IDX_NDIS] = mtu;
2445*d14abf15SRobert Mustacchi err = mac_maxsdu_update(pUM->pMac, pUM->devParams.mtu[LM_CLI_IDX_NDIS]);
2446*d14abf15SRobert Mustacchi pUM->lm_dev.params.mtu[LM_CLI_IDX_NDIS] = pUM->devParams.mtu[LM_CLI_IDX_NDIS];
2447*d14abf15SRobert Mustacchi break;
2448*d14abf15SRobert Mustacchi
2449*d14abf15SRobert Mustacchi case MAC_PROP_PRIVATE:
2450*d14abf15SRobert Mustacchi
2451*d14abf15SRobert Mustacchi err = BnxeSetPrivateProperty(pUM, pr_name, pr_valsize, pr_val);
2452*d14abf15SRobert Mustacchi break;
2453*d14abf15SRobert Mustacchi }
2454*d14abf15SRobert Mustacchi
2455*d14abf15SRobert Mustacchi if (!err && reprogram)
2456*d14abf15SRobert Mustacchi {
2457*d14abf15SRobert Mustacchi if (pUM->plumbed) BnxeUpdatePhy(pUM);
2458*d14abf15SRobert Mustacchi }
2459*d14abf15SRobert Mustacchi
2460*d14abf15SRobert Mustacchi BNXE_LOCK_EXIT_GLD(pUM);
2461*d14abf15SRobert Mustacchi return err;
2462*d14abf15SRobert Mustacchi }
2463*d14abf15SRobert Mustacchi
2464*d14abf15SRobert Mustacchi #endif /* MC_SETPROP */
2465*d14abf15SRobert Mustacchi
2466*d14abf15SRobert Mustacchi
2467*d14abf15SRobert Mustacchi #ifdef MC_GETPROP
2468*d14abf15SRobert Mustacchi
BnxeGetPrivateProperty(um_device_t * pUM,const char * pr_name,uint_t pr_valsize,void * pr_val)2469*d14abf15SRobert Mustacchi static int BnxeGetPrivateProperty(um_device_t * pUM,
2470*d14abf15SRobert Mustacchi const char * pr_name,
2471*d14abf15SRobert Mustacchi uint_t pr_valsize,
2472*d14abf15SRobert Mustacchi void * pr_val)
2473*d14abf15SRobert Mustacchi {
2474*d14abf15SRobert Mustacchi BnxeLinkCfg * lnk_cfg = &pUM->curcfg.lnkcfg;
2475*d14abf15SRobert Mustacchi BnxeLinkCfg * hw_cfg = &pUM->hwinit.lnkcfg;
2476*d14abf15SRobert Mustacchi int value;
2477*d14abf15SRobert Mustacchi int err = 0;
2478*d14abf15SRobert Mustacchi
2479*d14abf15SRobert Mustacchi if (strcmp(pr_name, "_adv_2500fdx_cap") == 0)
2480*d14abf15SRobert Mustacchi {
2481*d14abf15SRobert Mustacchi value = lnk_cfg->param_2500fdx;
2482*d14abf15SRobert Mustacchi }
2483*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_en_2500fdx_cap") == 0)
2484*d14abf15SRobert Mustacchi {
2485*d14abf15SRobert Mustacchi value = hw_cfg->param_2500fdx;
2486*d14abf15SRobert Mustacchi }
2487*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_adv_txpause_cap") == 0)
2488*d14abf15SRobert Mustacchi {
2489*d14abf15SRobert Mustacchi value = lnk_cfg->param_txpause;
2490*d14abf15SRobert Mustacchi }
2491*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_en_txpause_cap") == 0)
2492*d14abf15SRobert Mustacchi {
2493*d14abf15SRobert Mustacchi value = hw_cfg->param_txpause;
2494*d14abf15SRobert Mustacchi }
2495*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_txpause") == 0)
2496*d14abf15SRobert Mustacchi {
2497*d14abf15SRobert Mustacchi value = pUM->props.link_txpause;
2498*d14abf15SRobert Mustacchi }
2499*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_adv_rxpause_cap") == 0)
2500*d14abf15SRobert Mustacchi {
2501*d14abf15SRobert Mustacchi value = lnk_cfg->param_rxpause;
2502*d14abf15SRobert Mustacchi }
2503*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_en_rxpause_cap") == 0)
2504*d14abf15SRobert Mustacchi {
2505*d14abf15SRobert Mustacchi value = hw_cfg->param_rxpause;
2506*d14abf15SRobert Mustacchi }
2507*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_rxpause") == 0)
2508*d14abf15SRobert Mustacchi {
2509*d14abf15SRobert Mustacchi value = pUM->props.link_rxpause;
2510*d14abf15SRobert Mustacchi }
2511*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_autoneg_flow") == 0)
2512*d14abf15SRobert Mustacchi {
2513*d14abf15SRobert Mustacchi value = pUM->hwinit.flow_autoneg;
2514*d14abf15SRobert Mustacchi }
2515*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_checksum") == 0)
2516*d14abf15SRobert Mustacchi {
2517*d14abf15SRobert Mustacchi value = pUM->devParams.checksum;
2518*d14abf15SRobert Mustacchi }
2519*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_tx_ring_policy") == 0)
2520*d14abf15SRobert Mustacchi {
2521*d14abf15SRobert Mustacchi value = pUM->devParams.routeTxRingPolicy;
2522*d14abf15SRobert Mustacchi }
2523*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_num_rings") == 0)
2524*d14abf15SRobert Mustacchi {
2525*d14abf15SRobert Mustacchi value = pUM->devParams.numRings;
2526*d14abf15SRobert Mustacchi }
2527*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_rx_descs") == 0)
2528*d14abf15SRobert Mustacchi {
2529*d14abf15SRobert Mustacchi value = pUM->devParams.numRxDesc[LM_CLI_IDX_NDIS];
2530*d14abf15SRobert Mustacchi }
2531*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_rx_free_reclaim") == 0)
2532*d14abf15SRobert Mustacchi {
2533*d14abf15SRobert Mustacchi value = pUM->devParams.maxRxFree;
2534*d14abf15SRobert Mustacchi }
2535*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_tx_descs") == 0)
2536*d14abf15SRobert Mustacchi {
2537*d14abf15SRobert Mustacchi value = pUM->devParams.numTxDesc[LM_CLI_IDX_NDIS];
2538*d14abf15SRobert Mustacchi }
2539*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_tx_free_reclaim") == 0)
2540*d14abf15SRobert Mustacchi {
2541*d14abf15SRobert Mustacchi value = pUM->devParams.maxTxFree;
2542*d14abf15SRobert Mustacchi }
2543*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_rx_copy_threshold") == 0)
2544*d14abf15SRobert Mustacchi {
2545*d14abf15SRobert Mustacchi value = pUM->devParams.rxCopyThreshold;
2546*d14abf15SRobert Mustacchi }
2547*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_tx_copy_threshold") == 0)
2548*d14abf15SRobert Mustacchi {
2549*d14abf15SRobert Mustacchi value = pUM->devParams.txCopyThreshold;
2550*d14abf15SRobert Mustacchi }
2551*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_interrupt_coalesce") == 0)
2552*d14abf15SRobert Mustacchi {
2553*d14abf15SRobert Mustacchi value = pUM->devParams.intrCoalesce;
2554*d14abf15SRobert Mustacchi }
2555*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_rx_interrupt_coalesce_usec") == 0)
2556*d14abf15SRobert Mustacchi {
2557*d14abf15SRobert Mustacchi value = pUM->devParams.intrRxPerSec;
2558*d14abf15SRobert Mustacchi }
2559*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_tx_interrupt_coalesce_usec") == 0)
2560*d14abf15SRobert Mustacchi {
2561*d14abf15SRobert Mustacchi value = pUM->devParams.intrTxPerSec;
2562*d14abf15SRobert Mustacchi }
2563*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_disable_msix") == 0)
2564*d14abf15SRobert Mustacchi {
2565*d14abf15SRobert Mustacchi value = pUM->devParams.disableMsix;
2566*d14abf15SRobert Mustacchi }
2567*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_l2_fw_flow_ctrl") == 0)
2568*d14abf15SRobert Mustacchi {
2569*d14abf15SRobert Mustacchi value = pUM->devParams.l2_fw_flow_ctrl;
2570*d14abf15SRobert Mustacchi }
2571*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_autogreeen_enable") == 0)
2572*d14abf15SRobert Mustacchi {
2573*d14abf15SRobert Mustacchi value = pUM->devParams.autogreeenEnable;
2574*d14abf15SRobert Mustacchi }
2575*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_lso_enable") == 0)
2576*d14abf15SRobert Mustacchi {
2577*d14abf15SRobert Mustacchi value = pUM->devParams.lsoEnable;
2578*d14abf15SRobert Mustacchi }
2579*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_log_enable") == 0)
2580*d14abf15SRobert Mustacchi {
2581*d14abf15SRobert Mustacchi value = pUM->devParams.logEnable;
2582*d14abf15SRobert Mustacchi }
2583*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_fcoe_enable") == 0)
2584*d14abf15SRobert Mustacchi {
2585*d14abf15SRobert Mustacchi value = pUM->devParams.fcoeEnable;
2586*d14abf15SRobert Mustacchi }
2587*d14abf15SRobert Mustacchi else
2588*d14abf15SRobert Mustacchi {
2589*d14abf15SRobert Mustacchi err = ENOTSUP;
2590*d14abf15SRobert Mustacchi }
2591*d14abf15SRobert Mustacchi
2592*d14abf15SRobert Mustacchi if (!err)
2593*d14abf15SRobert Mustacchi {
2594*d14abf15SRobert Mustacchi (void)snprintf(pr_val, pr_valsize, "%d", value);
2595*d14abf15SRobert Mustacchi }
2596*d14abf15SRobert Mustacchi
2597*d14abf15SRobert Mustacchi return err;
2598*d14abf15SRobert Mustacchi }
2599*d14abf15SRobert Mustacchi
2600*d14abf15SRobert Mustacchi
BnxeMacGetProperty(void * barg,const char * pr_name,mac_prop_id_t pr_num,uint_t pr_valsize,void * pr_val)2601*d14abf15SRobert Mustacchi static int BnxeMacGetProperty(void * barg,
2602*d14abf15SRobert Mustacchi const char * pr_name,
2603*d14abf15SRobert Mustacchi mac_prop_id_t pr_num,
2604*d14abf15SRobert Mustacchi uint_t pr_valsize,
2605*d14abf15SRobert Mustacchi void * pr_val)
2606*d14abf15SRobert Mustacchi {
2607*d14abf15SRobert Mustacchi um_device_t * pUM = barg;
2608*d14abf15SRobert Mustacchi link_flowctrl_t link_flowctrl;
2609*d14abf15SRobert Mustacchi link_state_t link_state;
2610*d14abf15SRobert Mustacchi link_duplex_t link_duplex;
2611*d14abf15SRobert Mustacchi uint64_t link_speed;
2612*d14abf15SRobert Mustacchi BnxeLinkCfg * lnk_cfg = &pUM->curcfg.lnkcfg;
2613*d14abf15SRobert Mustacchi BnxeLinkCfg * hw_cfg = &pUM->hwinit.lnkcfg;
2614*d14abf15SRobert Mustacchi
2615*d14abf15SRobert Mustacchi switch (pr_num)
2616*d14abf15SRobert Mustacchi {
2617*d14abf15SRobert Mustacchi case MAC_PROP_MTU:
2618*d14abf15SRobert Mustacchi
2619*d14abf15SRobert Mustacchi ASSERT(pr_valsize >= sizeof(u32_t));
2620*d14abf15SRobert Mustacchi
2621*d14abf15SRobert Mustacchi bcopy(&pUM->devParams.mtu[LM_CLI_IDX_NDIS], pr_val, sizeof(u32_t));
2622*d14abf15SRobert Mustacchi break;
2623*d14abf15SRobert Mustacchi
2624*d14abf15SRobert Mustacchi case MAC_PROP_DUPLEX:
2625*d14abf15SRobert Mustacchi
2626*d14abf15SRobert Mustacchi ASSERT(pr_valsize >= sizeof(link_duplex_t));
2627*d14abf15SRobert Mustacchi
2628*d14abf15SRobert Mustacchi link_duplex = pUM->props.link_duplex ?
2629*d14abf15SRobert Mustacchi LINK_DUPLEX_FULL : LINK_DUPLEX_HALF;
2630*d14abf15SRobert Mustacchi bcopy(&link_duplex, pr_val, sizeof(link_duplex_t));
2631*d14abf15SRobert Mustacchi break;
2632*d14abf15SRobert Mustacchi
2633*d14abf15SRobert Mustacchi case MAC_PROP_SPEED:
2634*d14abf15SRobert Mustacchi
2635*d14abf15SRobert Mustacchi ASSERT(pr_valsize >= sizeof(link_speed));
2636*d14abf15SRobert Mustacchi
2637*d14abf15SRobert Mustacchi link_speed = (pUM->props.link_speed * 1000000ULL);
2638*d14abf15SRobert Mustacchi bcopy(&link_speed, pr_val, sizeof(link_speed));
2639*d14abf15SRobert Mustacchi break;
2640*d14abf15SRobert Mustacchi
2641*d14abf15SRobert Mustacchi case MAC_PROP_STATUS:
2642*d14abf15SRobert Mustacchi
2643*d14abf15SRobert Mustacchi ASSERT(pr_valsize >= sizeof(link_state_t));
2644*d14abf15SRobert Mustacchi
2645*d14abf15SRobert Mustacchi link_state = pUM->props.link_speed ?
2646*d14abf15SRobert Mustacchi LINK_STATE_UP : LINK_STATE_DOWN;
2647*d14abf15SRobert Mustacchi bcopy(&link_state, pr_val, sizeof(link_state_t));
2648*d14abf15SRobert Mustacchi break;
2649*d14abf15SRobert Mustacchi
2650*d14abf15SRobert Mustacchi case MAC_PROP_AUTONEG:
2651*d14abf15SRobert Mustacchi
2652*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = lnk_cfg->link_autoneg;
2653*d14abf15SRobert Mustacchi break;
2654*d14abf15SRobert Mustacchi
2655*d14abf15SRobert Mustacchi case MAC_PROP_FLOWCTRL:
2656*d14abf15SRobert Mustacchi
2657*d14abf15SRobert Mustacchi ASSERT(pr_valsize >= sizeof(link_flowctrl_t));
2658*d14abf15SRobert Mustacchi
2659*d14abf15SRobert Mustacchi if (!lnk_cfg->param_rxpause && !lnk_cfg->param_txpause)
2660*d14abf15SRobert Mustacchi {
2661*d14abf15SRobert Mustacchi link_flowctrl = LINK_FLOWCTRL_NONE;
2662*d14abf15SRobert Mustacchi }
2663*d14abf15SRobert Mustacchi if (lnk_cfg->param_rxpause && !lnk_cfg->param_txpause)
2664*d14abf15SRobert Mustacchi {
2665*d14abf15SRobert Mustacchi link_flowctrl = LINK_FLOWCTRL_RX;
2666*d14abf15SRobert Mustacchi }
2667*d14abf15SRobert Mustacchi if (!lnk_cfg->param_rxpause && lnk_cfg->param_txpause)
2668*d14abf15SRobert Mustacchi {
2669*d14abf15SRobert Mustacchi link_flowctrl = LINK_FLOWCTRL_TX;
2670*d14abf15SRobert Mustacchi }
2671*d14abf15SRobert Mustacchi if (lnk_cfg->param_rxpause && lnk_cfg->param_txpause)
2672*d14abf15SRobert Mustacchi {
2673*d14abf15SRobert Mustacchi link_flowctrl = LINK_FLOWCTRL_BI;
2674*d14abf15SRobert Mustacchi }
2675*d14abf15SRobert Mustacchi
2676*d14abf15SRobert Mustacchi bcopy(&link_flowctrl, pr_val, sizeof(link_flowctrl_t));
2677*d14abf15SRobert Mustacchi break;
2678*d14abf15SRobert Mustacchi
2679*d14abf15SRobert Mustacchi case MAC_PROP_ADV_10GFDX_CAP:
2680*d14abf15SRobert Mustacchi
2681*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = lnk_cfg->param_10000fdx;
2682*d14abf15SRobert Mustacchi break;
2683*d14abf15SRobert Mustacchi
2684*d14abf15SRobert Mustacchi case MAC_PROP_EN_10GFDX_CAP:
2685*d14abf15SRobert Mustacchi
2686*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = hw_cfg->param_10000fdx;
2687*d14abf15SRobert Mustacchi break;
2688*d14abf15SRobert Mustacchi
2689*d14abf15SRobert Mustacchi case MAC_PROP_ADV_1000FDX_CAP:
2690*d14abf15SRobert Mustacchi
2691*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = lnk_cfg->param_1000fdx;
2692*d14abf15SRobert Mustacchi break;
2693*d14abf15SRobert Mustacchi
2694*d14abf15SRobert Mustacchi case MAC_PROP_EN_1000FDX_CAP:
2695*d14abf15SRobert Mustacchi
2696*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = hw_cfg->param_1000fdx;
2697*d14abf15SRobert Mustacchi break;
2698*d14abf15SRobert Mustacchi
2699*d14abf15SRobert Mustacchi case MAC_PROP_ADV_1000HDX_CAP:
2700*d14abf15SRobert Mustacchi case MAC_PROP_EN_1000HDX_CAP:
2701*d14abf15SRobert Mustacchi
2702*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = 0;
2703*d14abf15SRobert Mustacchi break;
2704*d14abf15SRobert Mustacchi
2705*d14abf15SRobert Mustacchi case MAC_PROP_ADV_100FDX_CAP:
2706*d14abf15SRobert Mustacchi
2707*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = lnk_cfg->param_100fdx;
2708*d14abf15SRobert Mustacchi break;
2709*d14abf15SRobert Mustacchi
2710*d14abf15SRobert Mustacchi case MAC_PROP_EN_100FDX_CAP:
2711*d14abf15SRobert Mustacchi
2712*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = hw_cfg->param_100fdx;
2713*d14abf15SRobert Mustacchi break;
2714*d14abf15SRobert Mustacchi
2715*d14abf15SRobert Mustacchi case MAC_PROP_ADV_100HDX_CAP:
2716*d14abf15SRobert Mustacchi
2717*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = lnk_cfg->param_100hdx;
2718*d14abf15SRobert Mustacchi break;
2719*d14abf15SRobert Mustacchi
2720*d14abf15SRobert Mustacchi case MAC_PROP_EN_100HDX_CAP:
2721*d14abf15SRobert Mustacchi
2722*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = hw_cfg->param_100hdx;
2723*d14abf15SRobert Mustacchi break;
2724*d14abf15SRobert Mustacchi
2725*d14abf15SRobert Mustacchi case MAC_PROP_ADV_100T4_CAP:
2726*d14abf15SRobert Mustacchi case MAC_PROP_EN_100T4_CAP:
2727*d14abf15SRobert Mustacchi
2728*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = 0;
2729*d14abf15SRobert Mustacchi break;
2730*d14abf15SRobert Mustacchi
2731*d14abf15SRobert Mustacchi case MAC_PROP_ADV_10FDX_CAP:
2732*d14abf15SRobert Mustacchi
2733*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = lnk_cfg->param_10fdx;
2734*d14abf15SRobert Mustacchi break;
2735*d14abf15SRobert Mustacchi
2736*d14abf15SRobert Mustacchi case MAC_PROP_EN_10FDX_CAP:
2737*d14abf15SRobert Mustacchi
2738*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = hw_cfg->param_10fdx;
2739*d14abf15SRobert Mustacchi break;
2740*d14abf15SRobert Mustacchi
2741*d14abf15SRobert Mustacchi case MAC_PROP_ADV_10HDX_CAP:
2742*d14abf15SRobert Mustacchi
2743*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = lnk_cfg->param_10hdx;
2744*d14abf15SRobert Mustacchi break;
2745*d14abf15SRobert Mustacchi
2746*d14abf15SRobert Mustacchi case MAC_PROP_EN_10HDX_CAP:
2747*d14abf15SRobert Mustacchi
2748*d14abf15SRobert Mustacchi *(uint8_t *)pr_val = hw_cfg->param_10hdx;
2749*d14abf15SRobert Mustacchi break;
2750*d14abf15SRobert Mustacchi
2751*d14abf15SRobert Mustacchi case MAC_PROP_PRIVATE:
2752*d14abf15SRobert Mustacchi
2753*d14abf15SRobert Mustacchi return BnxeGetPrivateProperty(pUM,
2754*d14abf15SRobert Mustacchi pr_name,
2755*d14abf15SRobert Mustacchi pr_valsize,
2756*d14abf15SRobert Mustacchi pr_val);
2757*d14abf15SRobert Mustacchi
2758*d14abf15SRobert Mustacchi default:
2759*d14abf15SRobert Mustacchi
2760*d14abf15SRobert Mustacchi return ENOTSUP;
2761*d14abf15SRobert Mustacchi }
2762*d14abf15SRobert Mustacchi
2763*d14abf15SRobert Mustacchi return 0;
2764*d14abf15SRobert Mustacchi }
2765*d14abf15SRobert Mustacchi
2766*d14abf15SRobert Mustacchi #endif /* MC_GETPROP */
2767*d14abf15SRobert Mustacchi
2768*d14abf15SRobert Mustacchi
2769*d14abf15SRobert Mustacchi #ifdef MC_PROPINFO
2770*d14abf15SRobert Mustacchi
BnxeMacPrivatePropertyInfo(um_device_t * pUM,const char * pr_name,mac_prop_info_handle_t prh)2771*d14abf15SRobert Mustacchi static void BnxeMacPrivatePropertyInfo(um_device_t * pUM,
2772*d14abf15SRobert Mustacchi const char * pr_name,
2773*d14abf15SRobert Mustacchi mac_prop_info_handle_t prh)
2774*d14abf15SRobert Mustacchi {
2775*d14abf15SRobert Mustacchi char valstr[64];
2776*d14abf15SRobert Mustacchi BnxeLinkCfg * default_cfg = &bnxeLinkCfg;
2777*d14abf15SRobert Mustacchi int default_val;
2778*d14abf15SRobert Mustacchi
2779*d14abf15SRobert Mustacchi bzero(valstr, sizeof (valstr));
2780*d14abf15SRobert Mustacchi
2781*d14abf15SRobert Mustacchi if ((strcmp(pr_name, "_adv_2500fdx_cap") == 0) ||
2782*d14abf15SRobert Mustacchi (strcmp(pr_name, "_adv_txpause_cap") == 0) ||
2783*d14abf15SRobert Mustacchi (strcmp(pr_name, "_txpause") == 0) ||
2784*d14abf15SRobert Mustacchi (strcmp(pr_name, "_adv_rxpause_cap") == 0) ||
2785*d14abf15SRobert Mustacchi (strcmp(pr_name, "_rxpause") == 0) ||
2786*d14abf15SRobert Mustacchi (strcmp(pr_name, "_checksum") == 0) ||
2787*d14abf15SRobert Mustacchi (strcmp(pr_name, "_num_rings") == 0) ||
2788*d14abf15SRobert Mustacchi (strcmp(pr_name, "_rx_descs") == 0) ||
2789*d14abf15SRobert Mustacchi (strcmp(pr_name, "_tx_descs") == 0) ||
2790*d14abf15SRobert Mustacchi (strcmp(pr_name, "_interrupt_coalesce") == 0) ||
2791*d14abf15SRobert Mustacchi (strcmp(pr_name, "_rx_interrupt_coalesce_usec") == 0) ||
2792*d14abf15SRobert Mustacchi (strcmp(pr_name, "_tx_interrupt_coalesce_usec") == 0) ||
2793*d14abf15SRobert Mustacchi (strcmp(pr_name, "_disable_msix") == 0) ||
2794*d14abf15SRobert Mustacchi (strcmp(pr_name, "_l2_fw_flow_ctrl") == 0) ||
2795*d14abf15SRobert Mustacchi (strcmp(pr_name, "_lso_enable") == 0))
2796*d14abf15SRobert Mustacchi {
2797*d14abf15SRobert Mustacchi mac_prop_info_set_perm(prh, MAC_PROP_PERM_READ);
2798*d14abf15SRobert Mustacchi return;
2799*d14abf15SRobert Mustacchi }
2800*d14abf15SRobert Mustacchi
2801*d14abf15SRobert Mustacchi if (strcmp(pr_name, "_autoneg_flow") == 0)
2802*d14abf15SRobert Mustacchi {
2803*d14abf15SRobert Mustacchi default_val = B_TRUE;
2804*d14abf15SRobert Mustacchi }
2805*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_tx_ring_policy") == 0)
2806*d14abf15SRobert Mustacchi {
2807*d14abf15SRobert Mustacchi default_val = BNXE_ROUTE_RING_TCPUDP;
2808*d14abf15SRobert Mustacchi }
2809*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_rx_free_reclaim") == 0)
2810*d14abf15SRobert Mustacchi {
2811*d14abf15SRobert Mustacchi default_val = USER_OPTION_RX_MAX_FREE_DEFAULT;
2812*d14abf15SRobert Mustacchi }
2813*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_tx_free_reclaim") == 0)
2814*d14abf15SRobert Mustacchi {
2815*d14abf15SRobert Mustacchi default_val = USER_OPTION_TX_MAX_FREE_DEFAULT;
2816*d14abf15SRobert Mustacchi }
2817*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_rx_copy_threshold") == 0)
2818*d14abf15SRobert Mustacchi {
2819*d14abf15SRobert Mustacchi default_val = USER_OPTION_RX_DCOPY_THRESH_DEFAULT;
2820*d14abf15SRobert Mustacchi }
2821*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_tx_copy_threshold") == 0)
2822*d14abf15SRobert Mustacchi {
2823*d14abf15SRobert Mustacchi default_val = USER_OPTION_TX_DCOPY_THRESH_DEFAULT;
2824*d14abf15SRobert Mustacchi }
2825*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_autogreeen_enable") == 0)
2826*d14abf15SRobert Mustacchi {
2827*d14abf15SRobert Mustacchi default_val = B_TRUE;
2828*d14abf15SRobert Mustacchi }
2829*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_log_enable") == 0)
2830*d14abf15SRobert Mustacchi {
2831*d14abf15SRobert Mustacchi default_val = B_TRUE;
2832*d14abf15SRobert Mustacchi }
2833*d14abf15SRobert Mustacchi else if (strcmp(pr_name, "_fcoe_enable") == 0)
2834*d14abf15SRobert Mustacchi {
2835*d14abf15SRobert Mustacchi default_val = B_TRUE;
2836*d14abf15SRobert Mustacchi }
2837*d14abf15SRobert Mustacchi else
2838*d14abf15SRobert Mustacchi {
2839*d14abf15SRobert Mustacchi return;
2840*d14abf15SRobert Mustacchi }
2841*d14abf15SRobert Mustacchi
2842*d14abf15SRobert Mustacchi snprintf(valstr, sizeof (valstr), "%d", default_val);
2843*d14abf15SRobert Mustacchi mac_prop_info_set_default_str(prh, valstr);
2844*d14abf15SRobert Mustacchi }
2845*d14abf15SRobert Mustacchi
2846*d14abf15SRobert Mustacchi
BnxeMacPropertyInfo(void * barg,const char * pr_name,mac_prop_id_t pr_num,mac_prop_info_handle_t prh)2847*d14abf15SRobert Mustacchi static void BnxeMacPropertyInfo(void * barg,
2848*d14abf15SRobert Mustacchi const char * pr_name,
2849*d14abf15SRobert Mustacchi mac_prop_id_t pr_num,
2850*d14abf15SRobert Mustacchi mac_prop_info_handle_t prh)
2851*d14abf15SRobert Mustacchi {
2852*d14abf15SRobert Mustacchi um_device_t * pUM = barg;
2853*d14abf15SRobert Mustacchi link_flowctrl_t link_flowctrl;
2854*d14abf15SRobert Mustacchi BnxeLinkCfg * default_cfg = &bnxeLinkCfg;
2855*d14abf15SRobert Mustacchi
2856*d14abf15SRobert Mustacchi switch (pr_num)
2857*d14abf15SRobert Mustacchi {
2858*d14abf15SRobert Mustacchi case MAC_PROP_STATUS:
2859*d14abf15SRobert Mustacchi case MAC_PROP_SPEED:
2860*d14abf15SRobert Mustacchi case MAC_PROP_DUPLEX:
2861*d14abf15SRobert Mustacchi
2862*d14abf15SRobert Mustacchi case MAC_PROP_ADV_10GFDX_CAP:
2863*d14abf15SRobert Mustacchi case MAC_PROP_ADV_1000FDX_CAP:
2864*d14abf15SRobert Mustacchi case MAC_PROP_ADV_1000HDX_CAP:
2865*d14abf15SRobert Mustacchi case MAC_PROP_ADV_100FDX_CAP:
2866*d14abf15SRobert Mustacchi case MAC_PROP_ADV_100HDX_CAP:
2867*d14abf15SRobert Mustacchi case MAC_PROP_ADV_100T4_CAP:
2868*d14abf15SRobert Mustacchi case MAC_PROP_ADV_10FDX_CAP:
2869*d14abf15SRobert Mustacchi case MAC_PROP_ADV_10HDX_CAP:
2870*d14abf15SRobert Mustacchi
2871*d14abf15SRobert Mustacchi case MAC_PROP_EN_1000HDX_CAP:
2872*d14abf15SRobert Mustacchi case MAC_PROP_EN_100T4_CAP:
2873*d14abf15SRobert Mustacchi
2874*d14abf15SRobert Mustacchi mac_prop_info_set_perm(prh, MAC_PROP_PERM_READ);
2875*d14abf15SRobert Mustacchi break;
2876*d14abf15SRobert Mustacchi
2877*d14abf15SRobert Mustacchi case MAC_PROP_EN_10GFDX_CAP:
2878*d14abf15SRobert Mustacchi
2879*d14abf15SRobert Mustacchi mac_prop_info_set_default_uint8(prh, default_cfg->param_10000fdx);
2880*d14abf15SRobert Mustacchi break;
2881*d14abf15SRobert Mustacchi
2882*d14abf15SRobert Mustacchi case MAC_PROP_EN_1000FDX_CAP:
2883*d14abf15SRobert Mustacchi
2884*d14abf15SRobert Mustacchi mac_prop_info_set_default_uint8(prh, default_cfg->param_1000fdx);
2885*d14abf15SRobert Mustacchi break;
2886*d14abf15SRobert Mustacchi
2887*d14abf15SRobert Mustacchi case MAC_PROP_EN_100FDX_CAP:
2888*d14abf15SRobert Mustacchi
2889*d14abf15SRobert Mustacchi mac_prop_info_set_default_uint8(prh, default_cfg->param_100fdx);
2890*d14abf15SRobert Mustacchi break;
2891*d14abf15SRobert Mustacchi
2892*d14abf15SRobert Mustacchi case MAC_PROP_EN_100HDX_CAP:
2893*d14abf15SRobert Mustacchi
2894*d14abf15SRobert Mustacchi mac_prop_info_set_default_uint8(prh, default_cfg->param_100hdx);
2895*d14abf15SRobert Mustacchi break;
2896*d14abf15SRobert Mustacchi
2897*d14abf15SRobert Mustacchi case MAC_PROP_EN_10FDX_CAP:
2898*d14abf15SRobert Mustacchi
2899*d14abf15SRobert Mustacchi mac_prop_info_set_default_uint8(prh, default_cfg->param_10fdx);
2900*d14abf15SRobert Mustacchi break;
2901*d14abf15SRobert Mustacchi
2902*d14abf15SRobert Mustacchi case MAC_PROP_EN_10HDX_CAP:
2903*d14abf15SRobert Mustacchi
2904*d14abf15SRobert Mustacchi mac_prop_info_set_default_uint8(prh, default_cfg->param_10hdx);
2905*d14abf15SRobert Mustacchi break;
2906*d14abf15SRobert Mustacchi
2907*d14abf15SRobert Mustacchi case MAC_PROP_MTU:
2908*d14abf15SRobert Mustacchi
2909*d14abf15SRobert Mustacchi mac_prop_info_set_range_uint32(prh,
2910*d14abf15SRobert Mustacchi USER_OPTION_MTU_MIN,
2911*d14abf15SRobert Mustacchi USER_OPTION_MTU_MAX);
2912*d14abf15SRobert Mustacchi break;
2913*d14abf15SRobert Mustacchi
2914*d14abf15SRobert Mustacchi case MAC_PROP_AUTONEG:
2915*d14abf15SRobert Mustacchi
2916*d14abf15SRobert Mustacchi mac_prop_info_set_default_uint8(prh, default_cfg->link_autoneg);
2917*d14abf15SRobert Mustacchi break;
2918*d14abf15SRobert Mustacchi
2919*d14abf15SRobert Mustacchi case MAC_PROP_FLOWCTRL:
2920*d14abf15SRobert Mustacchi
2921*d14abf15SRobert Mustacchi if (!default_cfg->param_rxpause && !default_cfg->param_txpause)
2922*d14abf15SRobert Mustacchi {
2923*d14abf15SRobert Mustacchi link_flowctrl = LINK_FLOWCTRL_NONE;
2924*d14abf15SRobert Mustacchi }
2925*d14abf15SRobert Mustacchi
2926*d14abf15SRobert Mustacchi if (default_cfg->param_rxpause && !default_cfg->param_txpause)
2927*d14abf15SRobert Mustacchi {
2928*d14abf15SRobert Mustacchi link_flowctrl = LINK_FLOWCTRL_RX;
2929*d14abf15SRobert Mustacchi }
2930*d14abf15SRobert Mustacchi
2931*d14abf15SRobert Mustacchi if (!default_cfg->param_rxpause && default_cfg->param_txpause)
2932*d14abf15SRobert Mustacchi {
2933*d14abf15SRobert Mustacchi link_flowctrl = LINK_FLOWCTRL_TX;
2934*d14abf15SRobert Mustacchi }
2935*d14abf15SRobert Mustacchi
2936*d14abf15SRobert Mustacchi if (default_cfg->param_rxpause && default_cfg->param_txpause)
2937*d14abf15SRobert Mustacchi {
2938*d14abf15SRobert Mustacchi link_flowctrl = LINK_FLOWCTRL_BI;
2939*d14abf15SRobert Mustacchi }
2940*d14abf15SRobert Mustacchi
2941*d14abf15SRobert Mustacchi mac_prop_info_set_default_link_flowctrl(prh, link_flowctrl);
2942*d14abf15SRobert Mustacchi break;
2943*d14abf15SRobert Mustacchi
2944*d14abf15SRobert Mustacchi case MAC_PROP_PRIVATE:
2945*d14abf15SRobert Mustacchi
2946*d14abf15SRobert Mustacchi BnxeMacPrivatePropertyInfo(pUM, pr_name, prh);
2947*d14abf15SRobert Mustacchi break;
2948*d14abf15SRobert Mustacchi }
2949*d14abf15SRobert Mustacchi }
2950*d14abf15SRobert Mustacchi
2951*d14abf15SRobert Mustacchi #endif /* MC_PROPINFO */
2952*d14abf15SRobert Mustacchi
2953*d14abf15SRobert Mustacchi
2954*d14abf15SRobert Mustacchi static mac_callbacks_t bnxe_callbacks =
2955*d14abf15SRobert Mustacchi {
2956*d14abf15SRobert Mustacchi (
2957*d14abf15SRobert Mustacchi MC_IOCTL
2958*d14abf15SRobert Mustacchi #ifdef MC_RESOURCES
2959*d14abf15SRobert Mustacchi | MC_RESOURCES
2960*d14abf15SRobert Mustacchi #endif
2961*d14abf15SRobert Mustacchi #ifdef MC_SETPROP
2962*d14abf15SRobert Mustacchi | MC_SETPROP
2963*d14abf15SRobert Mustacchi #endif
2964*d14abf15SRobert Mustacchi #ifdef MC_GETPROP
2965*d14abf15SRobert Mustacchi | MC_GETPROP
2966*d14abf15SRobert Mustacchi #endif
2967*d14abf15SRobert Mustacchi #ifdef MC_PROPINFO
2968*d14abf15SRobert Mustacchi | MC_PROPINFO
2969*d14abf15SRobert Mustacchi #endif
2970*d14abf15SRobert Mustacchi | MC_GETCAPAB
2971*d14abf15SRobert Mustacchi ),
2972*d14abf15SRobert Mustacchi BnxeMacStats,
2973*d14abf15SRobert Mustacchi BnxeMacStart,
2974*d14abf15SRobert Mustacchi BnxeMacStop,
2975*d14abf15SRobert Mustacchi BnxeMacPromiscuous,
2976*d14abf15SRobert Mustacchi BnxeMacMulticast,
2977*d14abf15SRobert Mustacchi NULL,
2978*d14abf15SRobert Mustacchi BnxeMacTx,
2979*d14abf15SRobert Mustacchi #ifdef MC_RESOURCES
2980*d14abf15SRobert Mustacchi BnxeMacResources,
2981*d14abf15SRobert Mustacchi #else
2982*d14abf15SRobert Mustacchi NULL,
2983*d14abf15SRobert Mustacchi #endif
2984*d14abf15SRobert Mustacchi BnxeMacIoctl,
2985*d14abf15SRobert Mustacchi BnxeMacGetCapability,
2986*d14abf15SRobert Mustacchi #ifdef MC_OPEN
2987*d14abf15SRobert Mustacchi NULL,
2988*d14abf15SRobert Mustacchi NULL,
2989*d14abf15SRobert Mustacchi #endif
2990*d14abf15SRobert Mustacchi #ifdef MC_SETPROP
2991*d14abf15SRobert Mustacchi BnxeMacSetProperty,
2992*d14abf15SRobert Mustacchi #endif
2993*d14abf15SRobert Mustacchi #ifdef MC_GETPROP
2994*d14abf15SRobert Mustacchi BnxeMacGetProperty,
2995*d14abf15SRobert Mustacchi #endif
2996*d14abf15SRobert Mustacchi #ifdef MC_PROPINFO
2997*d14abf15SRobert Mustacchi BnxeMacPropertyInfo
2998*d14abf15SRobert Mustacchi #endif
2999*d14abf15SRobert Mustacchi };
3000*d14abf15SRobert Mustacchi
3001*d14abf15SRobert Mustacchi
BnxeGldInit(um_device_t * pUM)3002*d14abf15SRobert Mustacchi boolean_t BnxeGldInit(um_device_t * pUM)
3003*d14abf15SRobert Mustacchi {
3004*d14abf15SRobert Mustacchi mac_register_t * pMac;
3005*d14abf15SRobert Mustacchi int rc;
3006*d14abf15SRobert Mustacchi
3007*d14abf15SRobert Mustacchi atomic_swap_32(&pUM->plumbed, B_FALSE);
3008*d14abf15SRobert Mustacchi
3009*d14abf15SRobert Mustacchi if ((pMac = mac_alloc(MAC_VERSION)) == NULL)
3010*d14abf15SRobert Mustacchi {
3011*d14abf15SRobert Mustacchi BnxeLogWarn(pUM, "Failed to allocate GLD MAC memory");
3012*d14abf15SRobert Mustacchi return B_FALSE;
3013*d14abf15SRobert Mustacchi }
3014*d14abf15SRobert Mustacchi
3015*d14abf15SRobert Mustacchi pMac->m_driver = pUM;
3016*d14abf15SRobert Mustacchi pMac->m_dip = pUM->pDev;
3017*d14abf15SRobert Mustacchi pMac->m_type_ident = MAC_PLUGIN_IDENT_ETHER;
3018*d14abf15SRobert Mustacchi pMac->m_callbacks = &bnxe_callbacks;
3019*d14abf15SRobert Mustacchi pMac->m_min_sdu = 0;
3020*d14abf15SRobert Mustacchi pMac->m_max_sdu = pUM->devParams.mtu[LM_CLI_IDX_NDIS];
3021*d14abf15SRobert Mustacchi pMac->m_src_addr = &(pUM->lm_dev.params.mac_addr[0]);
3022*d14abf15SRobert Mustacchi
3023*d14abf15SRobert Mustacchi #ifdef MC_OPEN
3024*d14abf15SRobert Mustacchi pMac->m_margin = VLAN_TAGSZ;
3025*d14abf15SRobert Mustacchi #endif
3026*d14abf15SRobert Mustacchi
3027*d14abf15SRobert Mustacchi #ifdef MC_SETPROP
3028*d14abf15SRobert Mustacchi pMac->m_priv_props = bnxeLink_priv_props;
3029*d14abf15SRobert Mustacchi #endif
3030*d14abf15SRobert Mustacchi
3031*d14abf15SRobert Mustacchi #if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS)
3032*d14abf15SRobert Mustacchi bnxe_callbacks.mc_unicst =
3033*d14abf15SRobert Mustacchi (!pUM->devParams.numRings) ? BnxeMacUnicast : NULL;
3034*d14abf15SRobert Mustacchi #else
3035*d14abf15SRobert Mustacchi bnxe_callbacks.mc_unicst = BnxeMacUnicast;
3036*d14abf15SRobert Mustacchi #endif
3037*d14abf15SRobert Mustacchi
3038*d14abf15SRobert Mustacchi rc = mac_register(pMac, &pUM->pMac);
3039*d14abf15SRobert Mustacchi
3040*d14abf15SRobert Mustacchi mac_free(pMac);
3041*d14abf15SRobert Mustacchi
3042*d14abf15SRobert Mustacchi if (rc != 0)
3043*d14abf15SRobert Mustacchi {
3044*d14abf15SRobert Mustacchi BnxeLogWarn(pUM, "Failed to register with GLD (%d)", rc);
3045*d14abf15SRobert Mustacchi return B_FALSE;
3046*d14abf15SRobert Mustacchi }
3047*d14abf15SRobert Mustacchi
3048*d14abf15SRobert Mustacchi /* Always report the initial link state as unknown. */
3049*d14abf15SRobert Mustacchi mac_link_update(pUM->pMac, LINK_STATE_UNKNOWN);
3050*d14abf15SRobert Mustacchi
3051*d14abf15SRobert Mustacchi return B_TRUE;
3052*d14abf15SRobert Mustacchi }
3053*d14abf15SRobert Mustacchi
3054*d14abf15SRobert Mustacchi
BnxeGldFini(um_device_t * pUM)3055*d14abf15SRobert Mustacchi boolean_t BnxeGldFini(um_device_t * pUM)
3056*d14abf15SRobert Mustacchi {
3057*d14abf15SRobert Mustacchi int cnt;
3058*d14abf15SRobert Mustacchi
3059*d14abf15SRobert Mustacchi if (pUM->plumbed)
3060*d14abf15SRobert Mustacchi {
3061*d14abf15SRobert Mustacchi BnxeLogWarn(pUM, "Detaching device from GLD that is started!");
3062*d14abf15SRobert Mustacchi return B_FALSE;
3063*d14abf15SRobert Mustacchi }
3064*d14abf15SRobert Mustacchi
3065*d14abf15SRobert Mustacchi /* We must not detach until all packets held by stack are retrieved. */
3066*d14abf15SRobert Mustacchi if (!BnxeWaitForPacketsFromClient(pUM, LM_CLI_IDX_NDIS))
3067*d14abf15SRobert Mustacchi {
3068*d14abf15SRobert Mustacchi return B_FALSE;
3069*d14abf15SRobert Mustacchi }
3070*d14abf15SRobert Mustacchi
3071*d14abf15SRobert Mustacchi if (pUM->pMac)
3072*d14abf15SRobert Mustacchi {
3073*d14abf15SRobert Mustacchi if (mac_unregister(pUM->pMac))
3074*d14abf15SRobert Mustacchi {
3075*d14abf15SRobert Mustacchi BnxeLogWarn(pUM, "Failed to unregister with the GLD");
3076*d14abf15SRobert Mustacchi return B_FALSE;
3077*d14abf15SRobert Mustacchi }
3078*d14abf15SRobert Mustacchi }
3079*d14abf15SRobert Mustacchi
3080*d14abf15SRobert Mustacchi return B_TRUE;
3081*d14abf15SRobert Mustacchi }
3082*d14abf15SRobert Mustacchi
3083*d14abf15SRobert Mustacchi
BnxeGldLink(um_device_t * pUM,link_state_t state)3084*d14abf15SRobert Mustacchi void BnxeGldLink(um_device_t * pUM,
3085*d14abf15SRobert Mustacchi link_state_t state)
3086*d14abf15SRobert Mustacchi {
3087*d14abf15SRobert Mustacchi mac_link_update(pUM->pMac, state);
3088*d14abf15SRobert Mustacchi }
3089*d14abf15SRobert Mustacchi
3090