xref: /titanic_52/usr/src/uts/common/io/bnxe/bnxe_gld.c (revision d14abf155341d55053c76eeec58b787a456b753b)
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 
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  */
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  */
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 */
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  */
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)
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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)
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 
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 
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)
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)
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 */
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 */
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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