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