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