4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright 2014 QLogic Corporation
24 * The contents of this file are subject to the terms of the
25 * QLogic End User License (the "License").
26 * You may not use this file except in compliance with the License.
28 * You can obtain a copy of the License at
29 * http://www.qlogic.com/Resources/Documents/DriverDownloadHelp/
30 * QLogic_End_User_Software_License.txt
31 * See the License for the specific language governing permissions
32 * and limitations under the License.
36 * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
37 * Copyright (c) 2017, Joyent, Inc.
43 #include <sys/mac_ether.h>
46 #if !(defined(__S11) || defined(__S12))
47 #define mri_driver mr_driver
48 #define mri_start mr_start
49 #define mri_stop mr_stop
50 #define mri_intr mr_intr
51 #define mri_poll mr_poll
52 #define mri_tx mr_send
53 #define mgi_driver mrg_driver
54 #define mgi_start mrg_start
55 #define mgi_stop mrg_stop
56 #define mgi_count mrg_count
57 #define mgi_addmac mrg_addmac
58 #define mgi_remmac mrg_addmac
59 #define mr_gaddring mr_gadd_ring
60 #define mr_gremring mr_grem_ring
61 #endif /* not __S11 or __S12 */
64 * Reconfiguring the network devices parameters require net_config
65 * privilege starting Solaris 10. Only root user is allowed to
66 * update device parameter in Solaris 9 and earlier version. Following
67 * declaration allows single binary image to run on all OS versions.
69 extern int secpolicy_net_config(const cred_t
*, boolean_t
);
70 extern int drv_priv(cred_t
*);
71 #pragma weak secpolicy_net_config
76 char * bnxeLink_priv_props
[] =
96 "_interrupt_coalesce",
97 "_rx_interrupt_coalesce_usec",
98 "_tx_interrupt_coalesce_usec",
101 "_autogreeen_enable",
108 #endif /* MC_SETPROP */
111 static int BnxeMacStats(void * pArg
,
115 um_device_t
* pUM
= (um_device_t
*)pArg
;
117 b10_l2_chip_statistics_t b10_l2_stats
;
120 if ((pUM
== NULL
) || (pVal
== NULL
))
127 BNXE_LOCK_ENTER_GLD(pUM
);
131 BNXE_LOCK_EXIT_GLD(pUM
);
139 case MAC_STAT_IFSPEED
:
140 *pVal
= (pUM
->props
.link_speed
* 1000000ULL);
143 case MAC_STAT_MULTIRCV
:
144 lm_stats_get_l2_chip_stats(pLM
, &b10_l2_stats
,
145 L2_CHIP_STATISTICS_VER_NUM_1
);
146 *pVal
= b10_l2_stats
.IfHCInMulticastPkts
;
149 case MAC_STAT_BRDCSTRCV
:
150 lm_stats_get_l2_chip_stats(pLM
, &b10_l2_stats
,
151 L2_CHIP_STATISTICS_VER_NUM_1
);
152 *pVal
= b10_l2_stats
.IfHCInBroadcastPkts
;
155 case MAC_STAT_MULTIXMT
:
156 lm_stats_get_l2_chip_stats(pLM
, &b10_l2_stats
,
157 L2_CHIP_STATISTICS_VER_NUM_1
);
158 *pVal
= b10_l2_stats
.IfHCOutMulticastPkts
;
161 case MAC_STAT_BRDCSTXMT
:
162 lm_stats_get_l2_chip_stats(pLM
, &b10_l2_stats
,
163 L2_CHIP_STATISTICS_VER_NUM_1
);
164 *pVal
= b10_l2_stats
.IfHCOutBroadcastPkts
;
167 case MAC_STAT_NORCVBUF
:
168 lm_get_stats(pLM
, LM_STATS_RCV_NO_BUFFER_DROP
, (u64_t
*)pVal
);
171 case MAC_STAT_NOXMTBUF
:
173 LM_FOREACH_TSS_IDX(pLM
, idx
)
175 *pVal
+= pUM
->txq
[idx
].txRecycle
;
179 case MAC_STAT_IERRORS
:
180 case ETHER_STAT_MACRCV_ERRORS
:
181 lm_stats_get_l2_chip_stats(pLM
, &b10_l2_stats
,
182 L2_CHIP_STATISTICS_VER_NUM_1
);
183 *pVal
= b10_l2_stats
.IfInErrors
;
186 case MAC_STAT_OERRORS
:
187 /* XXX not available */
190 case MAC_STAT_COLLISIONS
:
191 lm_stats_get_l2_chip_stats(pLM
, &b10_l2_stats
,
192 L2_CHIP_STATISTICS_VER_NUM_1
);
193 *pVal
= b10_l2_stats
.EtherStatsCollisions
;
196 case MAC_STAT_RBYTES
:
197 lm_stats_get_l2_chip_stats(pLM
, &b10_l2_stats
,
198 L2_CHIP_STATISTICS_VER_NUM_1
);
199 *pVal
= b10_l2_stats
.IfHCInOctets
;
202 case MAC_STAT_IPACKETS
:
203 lm_stats_get_l2_chip_stats(pLM
, &b10_l2_stats
,
204 L2_CHIP_STATISTICS_VER_NUM_1
);
205 *pVal
= b10_l2_stats
.IfHCInPkts
;
208 case MAC_STAT_OBYTES
:
209 lm_stats_get_l2_chip_stats(pLM
, &b10_l2_stats
,
210 L2_CHIP_STATISTICS_VER_NUM_1
);
211 *pVal
= b10_l2_stats
.IfHCOutOctets
;
214 case MAC_STAT_OPACKETS
:
215 lm_stats_get_l2_chip_stats(pLM
, &b10_l2_stats
,
216 L2_CHIP_STATISTICS_VER_NUM_1
);
217 *pVal
= b10_l2_stats
.IfHCOutPkts
;
220 case ETHER_STAT_ALIGN_ERRORS
:
221 lm_stats_get_l2_chip_stats(pLM
, &b10_l2_stats
,
222 L2_CHIP_STATISTICS_VER_NUM_1
);
223 *pVal
= b10_l2_stats
.Dot3StatsAlignmentErrors
;
226 case ETHER_STAT_FCS_ERRORS
:
227 lm_stats_get_l2_chip_stats(pLM
, &b10_l2_stats
,
228 L2_CHIP_STATISTICS_VER_NUM_1
);
229 *pVal
= b10_l2_stats
.Dot3StatsFCSErrors
;
232 case ETHER_STAT_FIRST_COLLISIONS
:
233 lm_stats_get_l2_chip_stats(pLM
, &b10_l2_stats
,
234 L2_CHIP_STATISTICS_VER_NUM_1
);
235 *pVal
= b10_l2_stats
.Dot3StatsSingleCollisionFrames
;
238 case ETHER_STAT_MULTI_COLLISIONS
:
239 lm_stats_get_l2_chip_stats(pLM
, &b10_l2_stats
,
240 L2_CHIP_STATISTICS_VER_NUM_1
);
241 *pVal
= b10_l2_stats
.Dot3StatsMultipleCollisionFrames
;
244 case ETHER_STAT_DEFER_XMTS
:
245 lm_stats_get_l2_chip_stats(pLM
, &b10_l2_stats
,
246 L2_CHIP_STATISTICS_VER_NUM_1
);
247 *pVal
= b10_l2_stats
.Dot3StatsDeferredTransmissions
;
250 case ETHER_STAT_TX_LATE_COLLISIONS
:
251 lm_stats_get_l2_chip_stats(pLM
, &b10_l2_stats
,
252 L2_CHIP_STATISTICS_VER_NUM_1
);
253 *pVal
= b10_l2_stats
.Dot3StatsLateCollisions
;
256 case ETHER_STAT_EX_COLLISIONS
:
257 lm_stats_get_l2_chip_stats(pLM
, &b10_l2_stats
,
258 L2_CHIP_STATISTICS_VER_NUM_1
);
259 *pVal
= b10_l2_stats
.Dot3StatsExcessiveCollisions
;
262 case ETHER_STAT_MACXMT_ERRORS
:
263 lm_stats_get_l2_chip_stats(pLM
, &b10_l2_stats
,
264 L2_CHIP_STATISTICS_VER_NUM_1
);
265 *pVal
= b10_l2_stats
.Dot3StatsInternalMacTransmitErrors
;
268 case ETHER_STAT_CARRIER_ERRORS
:
269 lm_stats_get_l2_chip_stats(pLM
, &b10_l2_stats
,
270 L2_CHIP_STATISTICS_VER_NUM_1
);
271 *pVal
= b10_l2_stats
.Dot3StatsCarrierSenseErrors
;
274 case ETHER_STAT_TOOLONG_ERRORS
:
275 lm_stats_get_l2_chip_stats(pLM
, &b10_l2_stats
,
276 L2_CHIP_STATISTICS_VER_NUM_1
);
277 *pVal
= b10_l2_stats
.EtherStatsOverrsizePkts
;
280 #if (MAC_VERSION > 1)
281 case ETHER_STAT_TOOSHORT_ERRORS
:
282 lm_stats_get_l2_chip_stats(pLM
, &b10_l2_stats
,
283 L2_CHIP_STATISTICS_VER_NUM_1
);
284 *pVal
= b10_l2_stats
.EtherStatsUndersizePkts
;
288 case ETHER_STAT_XCVR_ADDR
:
289 *pVal
= pLM
->vars
.phy_addr
;
292 case ETHER_STAT_XCVR_ID
:
296 case ETHER_STAT_XCVR_INUSE
:
297 switch (pUM
->props
.link_speed
)
299 case 0: /* no speed then status is down */
316 /* catches 2500/10000 */
317 *pVal
= XCVR_UNDEFINED
;
321 #if (MAC_VERSION > 1)
322 case ETHER_STAT_CAP_10GFDX
:
327 case ETHER_STAT_CAP_1000FDX
:
332 case ETHER_STAT_CAP_1000HDX
:
333 //*pVal = linkconf->param_1000hdx;
338 case ETHER_STAT_CAP_100FDX
:
339 //*pVal = linkconf->param_100fdx;
343 case ETHER_STAT_CAP_100HDX
:
344 //*pVal = linkconf->param_100hdx;
348 case ETHER_STAT_CAP_10FDX
:
349 //*pVal = linkconf->param_10fdx;
353 case ETHER_STAT_CAP_10HDX
:
354 //*pVal = linkconf->param_10hdx;
358 case ETHER_STAT_CAP_ASMPAUSE
:
362 case ETHER_STAT_CAP_PAUSE
:
366 case ETHER_STAT_CAP_AUTONEG
:
370 #if (MAC_VERSION > 1)
371 case ETHER_STAT_CAP_REMFAULT
:
376 #if (MAC_VERSION > 1)
377 case ETHER_STAT_ADV_CAP_10GFDX
:
378 *pVal
= pUM
->curcfg
.lnkcfg
.param_10000fdx
;
382 case ETHER_STAT_ADV_CAP_1000FDX
:
383 *pVal
= pUM
->curcfg
.lnkcfg
.param_1000fdx
;
387 case ETHER_STAT_ADV_CAP_1000HDX
:
388 //*pVal = pUM->curcfg.lnkcfg.param_1000hdx;
393 case ETHER_STAT_ADV_CAP_100FDX
:
394 *pVal
= pUM
->curcfg
.lnkcfg
.param_100fdx
;
397 case ETHER_STAT_ADV_CAP_100HDX
:
398 *pVal
= pUM
->curcfg
.lnkcfg
.param_100hdx
;
401 case ETHER_STAT_ADV_CAP_10FDX
:
402 *pVal
= pUM
->curcfg
.lnkcfg
.param_10fdx
;
405 case ETHER_STAT_ADV_CAP_10HDX
:
406 *pVal
= pUM
->curcfg
.lnkcfg
.param_10hdx
;
409 case ETHER_STAT_ADV_CAP_ASMPAUSE
:
413 case ETHER_STAT_ADV_CAP_PAUSE
:
417 case ETHER_STAT_ADV_CAP_AUTONEG
:
418 *pVal
= pUM
->curcfg
.lnkcfg
.link_autoneg
;
421 #if (MAC_VERSION > 1)
422 case ETHER_STAT_ADV_REMFAULT
:
427 #if 0 /* LP caps not supported */
428 #if (MAC_VERSION > 1)
429 case ETHER_STAT_LP_CAP_10GFDX
:
430 *pVal
= pUM
->remote
.param_10000fdx
;
434 case ETHER_STAT_LP_CAP_1000FDX
:
435 *pVal
= pUM
->remote
.param_1000fdx
;
439 case ETHER_STAT_LP_CAP_1000HDX
:
440 //*pVal = pUM->remote.param_1000hdx;
445 case ETHER_STAT_LP_CAP_100FDX
:
446 *pVal
= pUM
->remote
.param_100fdx
;
449 case ETHER_STAT_LP_CAP_100HDX
:
450 *pVal
= pUM
->remote
.param_100hdx
;
453 case ETHER_STAT_LP_CAP_10FDX
:
454 *pVal
= pUM
->remote
.param_10fdx
;
457 case ETHER_STAT_LP_CAP_10HDX
:
458 *pVal
= pUM
->remote
.param_10hdx
;
462 case ETHER_STAT_LP_CAP_ASMPAUSE
:
463 /* XXX implement LP_ASYM_PAUSE stat */
466 case ETHER_STAT_LP_CAP_PAUSE
:
467 /* XXX implement LP_PAUSE stat */
471 case ETHER_STAT_LP_CAP_AUTONEG
:
472 *pVal
= pUM
->remote
.link_autoneg
;
475 case ETHER_STAT_LP_REMFAULT
:
476 /* XXX implement LP_REMFAULT stat */
478 #endif /* LP caps not supported */
481 case ETHER_STAT_LINK_ASMPAUSE
:
482 /* XXX implement ASMPAUSE stat */
485 case ETHER_STAT_LINK_PAUSE
:
486 /* XXX implement PAUSE stat */
490 case ETHER_STAT_LINK_AUTONEG
:
491 *pVal
= pUM
->curcfg
.lnkcfg
.link_autoneg
;
494 case ETHER_STAT_LINK_DUPLEX
:
495 *pVal
= (pUM
->props
.link_duplex
== B_TRUE
) ?
496 LINK_DUPLEX_FULL
: LINK_DUPLEX_HALF
;
503 BNXE_LOCK_EXIT_GLD(pUM
);
511 * This routine is called by GLD to enable device for packet reception and
514 static int BnxeMacStart(void * pArg
)
516 um_device_t
* pUM
= (um_device_t
*)pArg
;
518 BNXE_LOCK_ENTER_GLD(pUM
);
522 /* already started */
523 BNXE_LOCK_EXIT_GLD(pUM
);
527 /* Always report the initial link state as unknown. */
528 mac_link_update(pUM
->pMac
, LINK_STATE_UNKNOWN
);
530 if (BnxeHwStartL2(pUM
))
532 BNXE_LOCK_EXIT_GLD(pUM
);
536 atomic_swap_32(&pUM
->plumbed
, B_TRUE
);
538 mutex_enter(&bnxeLoaderMutex
);
540 mutex_exit(&bnxeLoaderMutex
);
542 BNXE_LOCK_EXIT_GLD(pUM
);
549 * This routine stops packet reception by clearing RX MASK register. Also
550 * interrupts are disabled for this device.
552 static void BnxeMacStop(void * pArg
)
554 um_device_t
* pUM
= (um_device_t
*)pArg
;
556 BNXE_LOCK_ENTER_GLD(pUM
);
560 atomic_swap_32(&pUM
->plumbed
, B_FALSE
);
564 /* Report the link state back to unknown. */
565 mac_link_update(pUM
->pMac
, LINK_STATE_UNKNOWN
);
567 mutex_enter(&bnxeLoaderMutex
);
569 mutex_exit(&bnxeLoaderMutex
);
572 BNXE_LOCK_EXIT_GLD(pUM
);
575 /* (flag) TRUE = on, FALSE = off */
576 static int BnxeMacPromiscuous(void * pArg
,
579 um_device_t
* pUM
= (um_device_t
*)pArg
;
581 BNXE_LOCK_ENTER_GLD(pUM
);
585 BNXE_LOCK_EXIT_GLD(pUM
);
591 pUM
->devParams
.rx_filter_mask
[LM_CLI_IDX_NDIS
] |=
592 LM_RX_MASK_PROMISCUOUS_MODE
;
596 pUM
->devParams
.rx_filter_mask
[LM_CLI_IDX_NDIS
] &=
597 ~LM_RX_MASK_PROMISCUOUS_MODE
;
600 BNXE_LOCK_ENTER_HWINIT(pUM
);
602 if (BnxeRxMask(pUM
, LM_CLI_IDX_NDIS
,
603 pUM
->devParams
.rx_filter_mask
[LM_CLI_IDX_NDIS
]) < 0)
605 BNXE_LOCK_EXIT_HWINIT(pUM
);
606 BNXE_LOCK_EXIT_GLD(pUM
);
610 BNXE_LOCK_EXIT_HWINIT(pUM
);
612 BNXE_LOCK_EXIT_GLD(pUM
);
619 * This function is used to enable or disable multicast packet reception for
620 * particular multicast addresses.
621 * (flag) TRUE = add, FALSE = remove
623 static int BnxeMacMulticast(void * pArg
,
625 const uint8_t * pMcastAddr
)
627 um_device_t
* pUM
= (um_device_t
*)pArg
;
630 BNXE_LOCK_ENTER_GLD(pUM
);
634 BNXE_LOCK_EXIT_GLD(pUM
);
638 BNXE_LOCK_ENTER_HWINIT(pUM
);
639 rc
= BnxeMulticast(pUM
, LM_CLI_IDX_NDIS
, flag
, pMcastAddr
, B_TRUE
);
640 BNXE_LOCK_EXIT_HWINIT(pUM
);
642 BNXE_LOCK_EXIT_GLD(pUM
);
650 #if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS)
651 static int BnxeRxRingGroupAddMac(void * groupHandle
,
652 const uint8_t * pMacAddr
,
655 static int BnxeRxRingGroupAddMac(void * groupHandle
,
656 const uint8_t * pMacAddr
)
659 RxQueueGroup
* pRxQGroup
= (RxQueueGroup
*)groupHandle
;
660 um_device_t
* pUM
= (um_device_t
*)pRxQGroup
->pUM
;
661 //u32_t idx = pRxQGroup->idx;
664 #if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS)
665 _NOTE(ARGUNUSED(flags
))
668 BNXE_LOCK_ENTER_GLD(pUM
);
672 BNXE_LOCK_EXIT_GLD(pUM
);
676 /* Validate MAC address */
677 if (IS_ETH_MULTICAST(pMacAddr
))
679 BnxeLogWarn(pUM
, "Cannot program a mcast/bcast address as a MAC Address.");
680 BNXE_LOCK_EXIT_GLD(pUM
);
684 if (pUM
->ucastTableLen
== LM_MAX_UC_TABLE_SIZE
)
686 BNXE_LOCK_EXIT_GLD(pUM
);
690 BNXE_LOCK_ENTER_HWINIT(pUM
);
692 COPY_ETH_ADDRESS(pMacAddr
, pUM
->lm_dev
.params
.mac_addr
);
694 rc
= BnxeMacAddress(pUM
, LM_CLI_IDX_NDIS
, B_TRUE
,
695 pUM
->lm_dev
.params
.mac_addr
);
697 BNXE_LOCK_EXIT_HWINIT(pUM
);
701 BNXE_LOCK_EXIT_GLD(pUM
);
705 pUM
->ucastTableLen
++;
707 BNXE_LOCK_EXIT_GLD(pUM
);
712 static int BnxeRxRingGroupRemMac(void * groupHandle
,
713 const uint8_t * pMacAddr
)
715 RxQueueGroup
* pRxQGroup
= (RxQueueGroup
*)groupHandle
;
716 um_device_t
* pUM
= (um_device_t
*)pRxQGroup
->pUM
;
717 //u32_t idx = pRxQGroup->idx;
720 BNXE_LOCK_ENTER_GLD(pUM
);
724 BNXE_LOCK_EXIT_GLD(pUM
);
728 if (pUM
->ucastTableLen
== 0)
730 BNXE_LOCK_EXIT_GLD(pUM
);
734 BNXE_LOCK_ENTER_HWINIT(pUM
);
736 if (!IS_ETH_ADDRESS_EQUAL(pMacAddr
, pUM
->lm_dev
.params
.mac_addr
))
738 BnxeLogWarn(pUM
, "Deleting MAC address that doesn't match default");
742 rc
= BnxeMacAddress(pUM
, LM_CLI_IDX_NDIS
, B_FALSE
,
743 pUM
->lm_dev
.params
.mac_addr
);
745 memset(pUM
->lm_dev
.params
.mac_addr
, 0, sizeof(pUM
->lm_dev
.params
.mac_addr
));
747 BNXE_LOCK_EXIT_HWINIT(pUM
);
751 BNXE_LOCK_EXIT_GLD(pUM
);
755 pUM
->ucastTableLen
--;
757 BNXE_LOCK_EXIT_GLD(pUM
);
762 static mblk_t
* BnxeTxRingSend(void * ringHandle
,
765 TxQueue
* pTxQ
= (TxQueue
*)ringHandle
;
766 um_device_t
* pUM
= (um_device_t
*)pTxQ
->pUM
;
767 u32_t idx
= pTxQ
->idx
;
773 pNextMblk
= pMblk
->b_next
;
774 pMblk
->b_next
= NULL
;
776 rc
= BnxeTxSendMblk(pUM
, idx
, pMblk
, 0, 0);
778 if (rc
== BNXE_TX_GOODXMIT
)
783 else if (rc
== BNXE_TX_DEFERPKT
)
789 pMblk
->b_next
= pNextMblk
;
798 #endif /* BNXE_RINGS */
801 static int BnxeMacUnicast(void * pArg
,
802 const uint8_t * pMacAddr
)
804 um_device_t
* pUM
= (um_device_t
*)pArg
;
807 BNXE_LOCK_ENTER_GLD(pUM
);
811 memcpy(pUM
->gldMac
, pMacAddr
, ETHERNET_ADDRESS_SIZE
);
812 BNXE_LOCK_EXIT_GLD(pUM
);
816 /* Validate MAC address */
817 if (IS_ETH_MULTICAST(pMacAddr
))
819 BnxeLogWarn(pUM
, "Cannot program a mcast/bcast address as a MAC Address.");
820 BNXE_LOCK_EXIT_GLD(pUM
);
824 BNXE_LOCK_ENTER_HWINIT(pUM
);
826 COPY_ETH_ADDRESS(pMacAddr
, pUM
->lm_dev
.params
.mac_addr
);
828 rc
= BnxeMacAddress(pUM
, LM_CLI_IDX_NDIS
, B_TRUE
,
829 pUM
->lm_dev
.params
.mac_addr
);
831 BNXE_LOCK_EXIT_HWINIT(pUM
);
835 BNXE_LOCK_EXIT_GLD(pUM
);
839 BNXE_LOCK_EXIT_GLD(pUM
);
844 static mblk_t
* BnxeMacTx(void * pArg
,
847 um_device_t
* pUM
= (um_device_t
*)pArg
;
851 BNXE_LOCK_ENTER_GLDTX(pUM
, RW_READER
);
856 BNXE_LOCK_EXIT_GLDTX(pUM
);
863 ring
= BnxeRouteTxRing(pUM
, pMblk
);
865 pNextMblk
= pMblk
->b_next
;
866 pMblk
->b_next
= NULL
;
868 //rc = BnxeTxSendMblk(pUM, NDIS_CID(&pUM->lm_dev), pMblk, 0, 0);
869 rc
= BnxeTxSendMblk(pUM
, ring
, pMblk
, 0, 0);
871 if (rc
== BNXE_TX_GOODXMIT
)
876 else if (rc
== BNXE_TX_DEFERPKT
)
882 pMblk
->b_next
= pNextMblk
;
888 BNXE_LOCK_EXIT_GLDTX(pUM
);
896 static void BnxeBlank(void * pArg
,
900 um_device_t
* pUM
= (um_device_t
*)pArg
;
908 * Need to dynamically reconfigure the hw with new interrupt
909 * coalescing params...
914 static void BnxeMacResources(void * pArg
)
916 um_device_t
* pUM
= (um_device_t
*)pArg
;
920 mrf
.mrf_type
= MAC_RX_FIFO
;
921 mrf
.mrf_blank
= BnxeBlank
;
922 mrf
.mrf_arg
= (void *)pUM
;
923 mrf
.mrf_normal_blank_time
= 25;
924 mrf
.mrf_normal_pkt_count
= 8;
926 LM_FOREACH_RSS_IDX(&pUM
->lm_dev
, idx
)
928 pUM
->macRxResourceHandles
[idx
] =
929 mac_resource_add(pUM
->pMac
, (mac_resource_t
*)&mrf
);
933 #endif /* MC_RESOURCES */
936 static boolean_t
BnxeReadReg(um_device_t
* pUM
,
937 struct bnxe_reg_data
* pData
)
939 if (pData
->offset
& 0x3)
941 BnxeLogWarn(pUM
, "Invalid register offset for GIOCBNXEREG ioctl");
945 LM_BAR_RD32_OFFSET(&pUM
->lm_dev
, 0, pData
->offset
, &pData
->value
);
951 static boolean_t
BnxeWriteReg(um_device_t
* pUM
,
952 struct bnxe_reg_data
* pData
)
954 if (pData
->offset
& 0x3)
956 BnxeLogWarn(pUM
, "Invalid register offset for SIOCBNXEREG ioctl");
960 LM_BAR_WR32_OFFSET(&pUM
->lm_dev
, 0, pData
->offset
, pData
->value
);
966 static boolean_t
BnxeReadNvm(um_device_t
* pUM
,
967 struct bnxe_nvram_data
* pData
)
969 if (pData
->offset
& 0x3)
971 BnxeLogWarn(pUM
, "Invalid register offset for GIOCBNXENVRM ioctl");
975 if (lm_nvram_read(&pUM
->lm_dev
,
978 (pData
->num_of_u32
* sizeof(u32_t
))) !=
988 static boolean_t
BnxeWriteNvm(um_device_t
* pUM
,
989 struct bnxe_nvram_data
* pData
)
991 if (pData
->offset
& 0x3)
993 BnxeLogWarn(pUM
, "Invalid register offset for SIOCBNXENVRM ioctl");
997 if (lm_nvram_write(&pUM
->lm_dev
,
1000 (pData
->num_of_u32
* sizeof(u32_t
))) !=
1010 static boolean_t
BnxeReadPciCfg(um_device_t
* pUM
,
1011 struct bnxe_reg_data
* pData
)
1013 pData
->value
= pci_config_get32(pUM
->pPciCfg
, (off_t
)pData
->offset
);
1018 STATS_SHOW_TYPE_NUM
,
1019 STATS_SHOW_TYPE_STR
,
1020 STATS_SHOW_TYPE_CNT
,
1022 } stats_show_type_t
;
1024 typedef union _b10_stats_show_data_t
1026 u32_t op
; /* ioctl sub-commond */
1030 u32_t num
; /* return number of stats */
1031 u32_t len
; /* length of each string item */
1034 /* variable length... */
1035 char str
[1]; /* holds names of desc.num stats, each desc.len in length */
1039 b10_l2_chip_statistics_v2_t l2_chip_stats
;
1040 b10_l4_chip_statistics_t l4_chip_stats
;
1041 b10_l2_driver_statistics_t l2_drv_stats
;
1042 b10_l4_driver_statistics_t l4_drv_stats
;
1044 } b10_stats_show_data_t
;
1047 static boolean_t
BnxeStatsShow(um_device_t
* pUM
,
1048 b10_stats_show_data_t
* pStats
,
1051 stats_show_type_t op
;
1052 const size_t stats_size
= sizeof(pStats
->cnt
);
1055 * All stats names MUST conform to STATS_STR_LEN length!!!
1058 #define STATS_STR_LEN 39
1061 * Note: these strings must be updated whenever any of
1062 * b10_l2_chip_statistics_t, b10_l4_chip_statistics_t,
1063 * b10_l2_driver_statistics_t or b10_l4_driver_statistics_t
1064 * are changed, or additional statistics are required.
1067 const char p_stat_str
[] =
1069 // b10_l2_chip_statistics_t
1071 "l2_chip_stats_ver_num\0 "
1073 "IfHCInBadOctets\0 "
1075 "IfHCOutBadOctets\0 "
1078 "IfHCInUcastPkts\0 "
1079 "IfHCInMulticastPkts\0 "
1080 "IfHCInBroadcastPkts\0 "
1081 "IfHCOutUcastPkts\0 "
1082 "IfHCOutMulticastPkts\0 "
1083 "IfHCOutBroadcastPkts\0 "
1084 "IfHCInUcastOctets\0 "
1085 "IfHCInMulticastOctets\0 "
1086 "IfHCInBroadcastOctets\0 "
1087 "IfHCOutUcastOctets\0 "
1088 "IfHCOutMulticastOctets\0 "
1089 "IfHCOutBroadcastOctets\0 "
1090 "IfHCOutDiscards\0 "
1091 "IfHCInFalseCarrierErrors\0 "
1092 "Dot3StatsInternalMacTransmitErrors\0 "
1093 "Dot3StatsCarrierSenseErrors\0 "
1094 "Dot3StatsFCSErrors\0 "
1095 "Dot3StatsAlignmentErrors\0 "
1096 "Dot3StatsSingleCollisionFrames\0 "
1097 "Dot3StatsMultipleCollisionFrames\0 "
1098 "Dot3StatsDeferredTransmissions\0 "
1099 "Dot3StatsExcessiveCollisions\0 "
1100 "Dot3StatsLateCollisions\0 "
1101 "EtherStatsCollisions\0 "
1102 "EtherStatsFragments\0 "
1103 "EtherStatsJabbers\0 "
1104 "EtherStatsUndersizePkts\0 "
1105 "EtherStatsOverrsizePkts\0 "
1106 "EtherStatsPktsTx64Octets\0 "
1107 "EtherStatsPktsTx65Octetsto127Octets\0 "
1108 "EtherStatsPktsTx128Octetsto255Octets\0 "
1109 "EtherStatsPktsTx256Octetsto511Octets\0 "
1110 "EtherStatsPktsTx512Octetsto1023Octets\0 "
1111 "EtherStatsPktsTx1024Octetsto1522Octets\0"
1112 "EtherStatsPktsTxOver1522Octets\0 "
1113 "XonPauseFramesReceived\0 "
1114 "XoffPauseFramesReceived\0 "
1117 "FlowControlDone\0 "
1118 "MacControlFramesReceived\0 "
1119 "XoffStateEntered\0 "
1120 "IfInFramesL2FilterDiscards\0 "
1121 "IfInTTL0Discards\0 "
1122 "IfInxxOverflowDiscards\0 "
1123 "IfInMBUFDiscards\0 "
1125 "IfInErrorsOctets\0 "
1126 "IfInNoBrbBuffer\0 "
1129 "Nig_brb_truncate\0 "
1130 "Nig_flow_ctrl_discard\0 "
1131 "Nig_flow_ctrl_octets\0 "
1132 "Nig_flow_ctrl_packet\0 "
1133 "Nig_mng_discard\0 "
1134 "Nig_mng_octet_inp\0 "
1135 "Nig_mng_octet_out\0 "
1136 "Nig_mng_packet_inp\0 "
1137 "Nig_mng_packet_out\0 "
1142 "Tx_Lpi_Count\0 " // This counter counts the number of timers the debounced version of EEE link idle is asserted
1144 // b10_l4_chip_statistics_t
1146 "l4_chip_stats_ver_num\0 "
1149 "OutTCP4Segments\0 "
1150 "RetransmittedTCP4Segments\0 "
1153 "InIP4HeaderErrors\0 "
1158 "InIP4TruncatedPackets\0 "
1160 "OutTCP6Segments\0 "
1161 "RetransmittedTCP6Segments\0 "
1164 "InIP6HeaderErrors\0 "
1169 "InIP6TruncatedPackets\0 "
1171 // b10_l2_driver_statistics_t
1173 "l2_driver_stats_ver_num\0 "
1174 "RxIPv4FragCount\0 "
1175 "RxIpCsErrorCount\0 "
1176 "RxTcpCsErrorCount\0 "
1178 "RxPhyErrorCount\0 "
1182 "TxL2AssemblyBufUse\0 "
1184 // b10_l4_driver_statistics_t
1186 "l4_driver_stats_ver_num\0 "
1187 "CurrentlyIpv4Established\0 "
1192 "CurrentlyIpv6Established\0 "
1197 "RxIndicateReturnPendingCnt\0 "
1198 "RxIndicateReturnDoneCnt\0 "
1199 "RxActiveGenBufCnt\0 "
1201 "TxL4AssemblyBufUse\0 "
1205 ASSERT_STATIC((sizeof(p_stat_str
) / STATS_STR_LEN
) ==
1206 (stats_size
/ sizeof(u64_t
)));
1208 op
= *((stats_show_type_t
*)pStats
);
1212 case STATS_SHOW_TYPE_NUM
:
1214 if (statsLen
< sizeof(pStats
->desc
))
1219 pStats
->desc
.num
= (stats_size
/ sizeof(u64_t
));
1220 pStats
->desc
.len
= STATS_STR_LEN
;
1224 case STATS_SHOW_TYPE_STR
:
1226 if (statsLen
!= sizeof(p_stat_str
))
1231 memcpy(pStats
->str
, p_stat_str
, sizeof(p_stat_str
));
1235 case STATS_SHOW_TYPE_CNT
:
1237 if (statsLen
!= stats_size
)
1242 lm_stats_get_l2_chip_stats(&pUM
->lm_dev
,
1243 &pStats
->cnt
.l2_chip_stats
,
1244 L2_CHIP_STATISTICS_VER_NUM_2
);
1246 lm_stats_get_l4_chip_stats(&pUM
->lm_dev
,
1247 &pStats
->cnt
.l4_chip_stats
);
1249 lm_stats_get_l2_driver_stats(&pUM
->lm_dev
1250 ,&pStats
->cnt
.l2_drv_stats
);
1252 lm_stats_get_l4_driver_stats(&pUM
->lm_dev
,
1253 &pStats
->cnt
.l4_drv_stats
);
1263 static void BnxeMacIoctl(void * pArg
,
1267 um_device_t
* pUM
= (um_device_t
*)pArg
;
1268 struct iocblk
* pIoctl
;
1271 if ((pQ
== NULL
) || (pMblk
== NULL
))
1276 if (pMblk
->b_datap
->db_type
!= M_IOCTL
)
1278 miocnak(pQ
, pMblk
, 0, EINVAL
);
1282 pIoctl
= (struct iocblk
*)pMblk
->b_rptr
;
1284 BNXE_LOCK_ENTER_GLD(pUM
);
1286 switch (pIoctl
->ioc_cmd
)
1290 if ((pIoctl
->ioc_count
!= sizeof(b10_lldp_params_get_t
)) ||
1291 (pMblk
->b_cont
== NULL
) || (pMblk
->b_cont
->b_rptr
== NULL
) ||
1292 (miocpullup(pMblk
, sizeof(b10_lldp_params_get_t
)) < 0))
1294 miocnak(pQ
, pMblk
, 0, EINVAL
);
1298 if (((b10_lldp_params_get_t
*)pMblk
->b_cont
->b_rptr
)->ver_num
!=
1299 LLDP_PARAMS_VER_NUM
)
1301 miocnak(pQ
, pMblk
, 0, EINVAL
);
1305 if (lm_dcbx_lldp_read_params(&pUM
->lm_dev
,
1306 (b10_lldp_params_get_t
*)pMblk
->b_cont
->b_rptr
) !=
1309 miocnak(pQ
, pMblk
, 0,
1310 (!IS_DCB_ENABLED(&pUM
->lm_dev
)) ? ENOTSUP
: EINVAL
);
1314 miocack(pQ
, pMblk
, pIoctl
->ioc_count
, 0);
1319 if ((pIoctl
->ioc_count
!= sizeof(b10_dcbx_params_get_t
)) ||
1320 (pMblk
->b_cont
== NULL
) || (pMblk
->b_cont
->b_rptr
== NULL
) ||
1321 (miocpullup(pMblk
, sizeof(b10_dcbx_params_get_t
)) < 0))
1323 miocnak(pQ
, pMblk
, 0, EINVAL
);
1327 if (((b10_dcbx_params_get_t
*)pMblk
->b_cont
->b_rptr
)->ver_num
!=
1328 DCBX_PARAMS_VER_NUM
)
1330 miocnak(pQ
, pMblk
, 0, EINVAL
);
1334 if (lm_dcbx_read_params(&pUM
->lm_dev
,
1335 (b10_dcbx_params_get_t
*)pMblk
->b_cont
->b_rptr
) !=
1338 miocnak(pQ
, pMblk
, 0,
1339 (!IS_DCB_ENABLED(&pUM
->lm_dev
)) ? ENOTSUP
: EINVAL
);
1343 miocack(pQ
, pMblk
, pIoctl
->ioc_count
, 0);
1349 miocnak(pQ
, pMblk
, 0, EINVAL
);
1354 if ((pIoctl
->ioc_count
!= sizeof(struct bnxe_reg_data
)) ||
1355 (pMblk
->b_cont
== NULL
) || (pMblk
->b_cont
->b_rptr
== NULL
) ||
1356 (miocpullup(pMblk
, sizeof(struct bnxe_reg_data
)) < 0))
1358 miocnak(pQ
, pMblk
, 0, EINVAL
);
1362 if (!BnxeReadReg(pUM
, (struct bnxe_reg_data
*)pMblk
->b_cont
->b_rptr
))
1364 miocnak(pQ
, pMblk
, 0, EINVAL
);
1368 miocack(pQ
, pMblk
, pIoctl
->ioc_count
, 0);
1375 if ((pIoctl
->ioc_count
!= sizeof(struct bnxe_reg_data
)) ||
1376 (pMblk
->b_cont
== NULL
) || (pMblk
->b_cont
->b_rptr
== NULL
) ||
1377 (miocpullup(pMblk
, sizeof(struct bnxe_reg_data
)) < 0))
1379 miocnak(pQ
, pMblk
, 0, EINVAL
);
1383 if (!BnxeWriteReg(pUM
, (struct bnxe_reg_data
*)pMblk
->b_cont
->b_rptr
))
1385 miocnak(pQ
, pMblk
, 0, EINVAL
);
1389 miocack(pQ
, pMblk
, pIoctl
->ioc_count
, 0);
1396 if ((pIoctl
->ioc_count
< sizeof(struct bnxe_nvram_data
)) ||
1397 (pMblk
->b_cont
== NULL
) || (pMblk
->b_cont
->b_rptr
== NULL
) ||
1398 (miocpullup(pMblk
, pIoctl
->ioc_count
) < 0))
1400 miocnak(pQ
, pMblk
, 0, EINVAL
);
1404 if (!BnxeReadNvm(pUM
, (struct bnxe_nvram_data
*)pMblk
->b_cont
->b_rptr
))
1406 miocnak(pQ
, pMblk
, 0, EINVAL
);
1410 miocack(pQ
, pMblk
, pIoctl
->ioc_count
, 0);
1417 if ((pIoctl
->ioc_count
< sizeof(struct bnxe_nvram_data
)) ||
1418 (pMblk
->b_cont
== NULL
) || (pMblk
->b_cont
->b_rptr
== NULL
) ||
1419 (miocpullup(pMblk
, pIoctl
->ioc_count
) < 0))
1421 miocnak(pQ
, pMblk
, 0, EINVAL
);
1425 if (!BnxeWriteNvm(pUM
, (struct bnxe_nvram_data
*)pMblk
->b_cont
->b_rptr
))
1427 miocnak(pQ
, pMblk
, 0, EINVAL
);
1431 miocack(pQ
, pMblk
, pIoctl
->ioc_count
, 0);
1438 if ((pIoctl
->ioc_count
!= sizeof(struct bnxe_reg_data
)) ||
1439 (pMblk
->b_cont
== NULL
) || (pMblk
->b_cont
->b_rptr
== NULL
) ||
1440 (miocpullup(pMblk
, sizeof(struct bnxe_reg_data
)) < 0))
1442 miocnak(pQ
, pMblk
, 0, EINVAL
);
1446 if (!BnxeReadPciCfg(pUM
, (struct bnxe_reg_data
*)pMblk
->b_cont
->b_rptr
))
1448 miocnak(pQ
, pMblk
, 0, EINVAL
);
1452 miocack(pQ
, pMblk
, pIoctl
->ioc_count
, 0);
1459 /* min size = sizeof(op) in b10_stats_show_data_t */
1460 if ((pIoctl
->ioc_count
< sizeof(u32_t
)) ||
1461 (pMblk
->b_cont
== NULL
) || (pMblk
->b_cont
->b_rptr
== NULL
) ||
1462 (miocpullup(pMblk
, pIoctl
->ioc_count
) < 0))
1464 miocnak(pQ
, pMblk
, 0, EINVAL
);
1468 if (!BnxeStatsShow(pUM
,
1469 (b10_stats_show_data_t
*)pMblk
->b_cont
->b_rptr
,
1472 miocnak(pQ
, pMblk
, 0, EINVAL
);
1476 miocack(pQ
, pMblk
, pIoctl
->ioc_count
, 0);
1483 miocnak(pQ
, pMblk
, 0, EINVAL
);
1487 BNXE_LOCK_EXIT_GLD(pUM
);
1493 #if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS)
1494 static mblk_t
* BnxeRxRingPoll(void * ringHandle
,
1498 static mblk_t
* BnxeRxRingPoll(void * ringHandle
,
1502 RxQueue
* pRxQ
= (RxQueue
*)ringHandle
;
1503 um_device_t
* pUM
= (um_device_t
*)pRxQ
->pUM
;
1504 u32_t idx
= pRxQ
->idx
;
1505 mblk_t
* pMblk
= NULL
;
1506 boolean_t pktsRxed
= 0;
1507 boolean_t pktsTxed
= 0;
1509 #if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS)
1510 _NOTE(ARGUNUSED(numPkts
))
1518 if (pRxQ
->inPollMode
== B_FALSE
)
1520 BnxeLogWarn(pUM
, "Polling on ring %d when NOT in poll mode!", idx
);
1524 BNXE_LOCK_ENTER_INTR(pUM
, idx
);
1528 BnxePollRxRing(pUM
, idx
, &pktsRxed
, &pktsTxed
);
1530 if (pktsTxed
) BnxeTxRingProcess(pUM
, idx
);
1531 if (pktsRxed
) pMblk
= BnxeRxRingProcess(pUM
, idx
, TRUE
, numBytes
);
1534 * This is here for the off chance that all rings are in polling
1535 * mode and the default interrupt hasn't fired recently to handle
1538 lm_sq_post_pending(&pUM
->lm_dev
);
1540 BNXE_LOCK_EXIT_INTR(pUM
, idx
);
1546 static int BnxeRxRingStart(mac_ring_driver_t ringHandle
1547 #if defined(__S11) || defined(__S12)
1548 , uint64_t genNumber
1552 RxQueue
* pRxQ
= (RxQueue
*)ringHandle
;
1553 um_device_t
* pUM
= (um_device_t
*)pRxQ
->pUM
;
1554 u32_t idx
= pRxQ
->idx
;
1556 BnxeLogDbg(pUM
, "Starting Rx Ring %d", idx
);
1558 BNXE_LOCK_ENTER_RX(pUM
, idx
);
1559 #if defined(__S11) || defined(__S12)
1560 pRxQ
->genNumber
= genNumber
;
1562 pRxQ
->inPollMode
= B_FALSE
;
1563 pRxQ
->intrDisableCnt
= 0;
1564 pRxQ
->intrEnableCnt
= 0;
1566 BNXE_LOCK_EXIT_RX(pUM
, idx
);
1572 #if defined(__S11) || defined(__S12)
1574 static int BnxeRingStat(mac_ring_driver_t ringHandle
,
1578 RxQueue
* pRxQ
= (RxQueue
*)ringHandle
;
1579 um_device_t
* pUM
= (um_device_t
*)pRxQ
->pUM
;
1583 case MAC_STAT_OERRORS
:
1584 case MAC_STAT_OBYTES
:
1585 case MAC_STAT_OPACKETS
:
1586 case MAC_STAT_IERRORS
:
1587 case MAC_STAT_RBYTES
: /* MAC_STAT_IBYTES */
1588 case MAC_STAT_IPACKETS
:
1596 #endif /* __S11 or __S12 */
1599 #if defined(__S11) || defined(__S12)
1600 static int BnxeRxRingIntrEnable(mac_ring_driver_t ringHandle
)
1602 static int BnxeRxRingIntrEnable(mac_intr_handle_t ringHandle
)
1605 RxQueue
* pRxQ
= (RxQueue
*)ringHandle
;
1606 um_device_t
* pUM
= (um_device_t
*)pRxQ
->pUM
;
1608 BnxeLogDbg(pUM
, "Enabling Interrupt for Rx Ring %d", pRxQ
->idx
);
1610 /* polling not allowed on LM_NON_RSS_SB when overlapped with FCoE */
1611 if ((pRxQ
->idx
== LM_NON_RSS_SB(&pUM
->lm_dev
)) &&
1612 CLIENT_BOUND(pUM
, LM_CLI_IDX_FCOE
) &&
1613 (pUM
->rssIntr
.intrCount
== LM_MAX_RSS_CHAINS(&pUM
->lm_dev
)))
1615 return 0; /* ok, already enabled */
1618 BnxeIntrIguSbEnable(pUM
, pRxQ
->idx
, B_FALSE
);
1624 #if defined(__S11) || defined(__S12)
1625 static int BnxeRxRingIntrDisable(mac_ring_driver_t ringHandle
)
1627 static int BnxeRxRingIntrDisable(mac_intr_handle_t ringHandle
)
1630 RxQueue
* pRxQ
= (RxQueue
*)ringHandle
;
1631 um_device_t
* pUM
= (um_device_t
*)pRxQ
->pUM
;
1633 BnxeLogDbg(pUM
, "Disabling Interrupt for Rx Ring %d", pRxQ
->idx
);
1635 /* polling not allowed on LM_NON_RSS_SB when overlapped with FCoE */
1636 if ((pRxQ
->idx
== LM_NON_RSS_SB(&pUM
->lm_dev
)) &&
1637 CLIENT_BOUND(pUM
, LM_CLI_IDX_FCOE
) &&
1638 (pUM
->rssIntr
.intrCount
== LM_MAX_RSS_CHAINS(&pUM
->lm_dev
)))
1640 return -1; /* NO, keep enabled! */
1643 BnxeIntrIguSbDisable(pUM
, pRxQ
->idx
, B_FALSE
);
1649 /* callback function for MAC layer to register rings */
1650 static void BnxeFillRing(void * arg
,
1651 mac_ring_type_t ringType
,
1652 const int ringGroupIndex
,
1653 const int ringIndex
,
1654 mac_ring_info_t
* pRingInfo
,
1655 mac_ring_handle_t ringHandle
)
1657 um_device_t
* pUM
= (um_device_t
*)arg
;
1663 case MAC_RING_TYPE_RX
:
1665 BnxeLogInfo(pUM
, "Initializing Rx Ring %d (Ring Group %d)",
1666 ringIndex
, ringGroupIndex
);
1668 ASSERT(ringGroupIndex
== 0);
1669 ASSERT(ringIndex
< pUM
->devParams
.numRings
);
1671 pRxQ
= &pUM
->rxq
[ringIndex
];
1672 pRxQ
->ringHandle
= ringHandle
;
1674 pRingInfo
->mri_driver
= (mac_ring_driver_t
)pRxQ
;
1675 pRingInfo
->mri_start
= BnxeRxRingStart
;
1676 pRingInfo
->mri_stop
= NULL
;
1677 #if defined(__S11) || defined(__S12)
1678 pRingInfo
->mri_stat
= BnxeRingStat
;
1680 pRingInfo
->mri_poll
= BnxeRxRingPoll
;
1682 #if !(defined(__S11) || defined(__S12))
1683 pRingInfo
->mri_intr
.mi_handle
= (mac_intr_handle_t
)pRxQ
;
1685 pRingInfo
->mri_intr
.mi_enable
= (mac_intr_enable_t
)BnxeRxRingIntrEnable
;
1686 pRingInfo
->mri_intr
.mi_disable
= (mac_intr_disable_t
)BnxeRxRingIntrDisable
;
1690 case MAC_RING_TYPE_TX
:
1692 BnxeLogInfo(pUM
, "Initializing Tx Ring %d (Ring Group %d)",
1693 ringIndex
, ringGroupIndex
);
1695 ASSERT(ringGroupIndex
== 0);
1696 ASSERT(ringIndex
< pUM
->devParams
.numRings
);
1698 pTxQ
= &pUM
->txq
[ringIndex
];
1699 pTxQ
->ringHandle
= ringHandle
;
1701 pRingInfo
->mri_driver
= (mac_ring_driver_t
)pTxQ
;
1702 pRingInfo
->mri_start
= NULL
;
1703 pRingInfo
->mri_stop
= NULL
;
1704 #if defined(__S11) || defined(__S12)
1705 pRingInfo
->mri_stat
= BnxeRingStat
;
1707 pRingInfo
->mri_tx
= (mac_ring_send_t
)BnxeTxRingSend
;
1717 /* callback function for MAC layer to register groups */
1718 static void BnxeFillGroup(void * arg
,
1719 mac_ring_type_t ringType
,
1720 const int ringGroupIndex
,
1721 mac_group_info_t
* pGroupInfo
,
1722 mac_group_handle_t groupHandle
)
1724 um_device_t
* pUM
= (um_device_t
*)arg
;
1725 RxQueueGroup
* pRxQGroup
;
1729 case MAC_RING_TYPE_RX
:
1731 BnxeLogInfo(pUM
, "Initializing Rx Group %d", ringGroupIndex
);
1733 pRxQGroup
= &pUM
->rxqGroup
[ringGroupIndex
];
1734 pRxQGroup
->groupHandle
= groupHandle
;
1736 pGroupInfo
->mgi_driver
= (mac_group_driver_t
)pRxQGroup
;
1737 pGroupInfo
->mgi_start
= NULL
;
1738 pGroupInfo
->mgi_stop
= NULL
;
1739 pGroupInfo
->mgi_addmac
= BnxeRxRingGroupAddMac
;
1740 pGroupInfo
->mgi_remmac
= BnxeRxRingGroupRemMac
;
1741 pGroupInfo
->mgi_count
= (pUM
->devParams
.numRings
/
1742 USER_OPTION_RX_RING_GROUPS_DEFAULT
);
1743 #if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS)
1744 pGroupInfo
->mgi_flags
= MAC_GROUP_DEFAULT
;
1749 case MAC_RING_TYPE_TX
:
1755 #endif /* BNXE_RINGS */
1758 static boolean_t
BnxeMacGetCapability(void * pArg
,
1759 mac_capab_t capability
,
1760 void * pCapabilityData
)
1762 um_device_t
* pUM
= (um_device_t
*)pArg
;
1763 mac_capab_lso_t
* pCapLSO
;
1764 mac_capab_rings_t
* pCapRings
;
1768 case MAC_CAPAB_HCKSUM
:
1770 *((u32_t
*)pCapabilityData
) = 0;
1772 if (pUM
->devParams
.enabled_oflds
&
1773 (LM_OFFLOAD_TX_IP_CKSUM
| LM_OFFLOAD_RX_IP_CKSUM
))
1775 *((u32_t
*)pCapabilityData
) |= HCKSUM_IPHDRCKSUM
;
1778 if (pUM
->devParams
.enabled_oflds
&
1779 (LM_OFFLOAD_TX_TCP_CKSUM
| LM_OFFLOAD_TX_UDP_CKSUM
|
1780 LM_OFFLOAD_RX_TCP_CKSUM
| LM_OFFLOAD_RX_UDP_CKSUM
))
1782 *((u32_t
*)pCapabilityData
) |= HCKSUM_INET_PARTIAL
;
1789 pCapLSO
= (mac_capab_lso_t
*)pCapabilityData
;
1791 if (pUM
->devParams
.lsoEnable
)
1793 pCapLSO
->lso_flags
= LSO_TX_BASIC_TCP_IPV4
;
1794 pCapLSO
->lso_basic_tcp_ipv4
.lso_max
= BNXE_LSO_MAXLEN
;
1802 case MAC_CAPAB_RINGS
:
1804 if (!pUM
->devParams
.numRings
)
1809 pCapRings
= (mac_capab_rings_t
*)pCapabilityData
;
1811 #if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS)
1812 pCapRings
->mr_version
= MAC_RINGS_VERSION_1
;
1813 pCapRings
->mr_flags
= MAC_RINGS_FLAGS_NONE
;
1815 pCapRings
->mr_group_type
= MAC_GROUP_TYPE_STATIC
;
1816 pCapRings
->mr_rnum
= pUM
->devParams
.numRings
;
1817 pCapRings
->mr_rget
= BnxeFillRing
;
1818 pCapRings
->mr_gaddring
= NULL
;
1819 pCapRings
->mr_gremring
= NULL
;
1820 #if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS)
1821 pCapRings
->mr_ggetringtc
= NULL
;
1824 switch (pCapRings
->mr_type
)
1826 case MAC_RING_TYPE_RX
:
1828 pCapRings
->mr_gnum
= USER_OPTION_RX_RING_GROUPS_DEFAULT
;
1829 pCapRings
->mr_gget
= BnxeFillGroup
;
1832 case MAC_RING_TYPE_TX
:
1834 #if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS)
1835 pCapRings
->mr_gnum
= 1;
1837 pCapRings
->mr_gnum
= 0;
1839 pCapRings
->mr_gget
= NULL
;
1849 #endif /* BNXE_RINGS */
1851 #if !(defined(__S11) || defined(__S12))
1853 case MAC_CAPAB_POLL
:
1856 * There's nothing for us to fill in, simply returning B_TRUE stating
1857 * that we support polling is sufficient.
1861 #endif /* not __S11 or __S12 */
1863 #if defined(ILLUMOS)
1864 case MAC_CAPAB_TRANSCEIVER
:
1865 return bnxe_fill_transceiver(pUM
, pCapabilityData
);
1879 static int BnxeSetPrivateProperty(um_device_t
* pUM
,
1880 const char * pr_name
,
1882 const void * pr_val
)
1887 if (strcmp(pr_name
, "_en_2500fdx_cap") == 0)
1889 if (ddi_strtol(pr_val
, (char **)NULL
, 0, &result
))
1894 if ((result
> 1) || (result
< 0))
1899 pUM
->hwinit
.lnkcfg
.param_2500fdx
= (uint32_t)result
;
1900 pUM
->curcfg
.lnkcfg
.param_2500fdx
= (uint32_t)result
;
1901 if (pUM
->plumbed
) BnxeUpdatePhy(pUM
);
1903 else if (strcmp(pr_name
, "_en_txpause_cap") == 0)
1905 if (ddi_strtol(pr_val
, (char **)NULL
, 0, &result
))
1910 if ((result
> 1) || (result
< 0))
1915 pUM
->hwinit
.lnkcfg
.param_txpause
= (uint32_t)result
;
1916 pUM
->curcfg
.lnkcfg
.param_txpause
= (uint32_t)result
;
1917 if (pUM
->plumbed
) BnxeUpdatePhy(pUM
);
1919 else if (strcmp(pr_name
, "_en_rxpause_cap") == 0)
1921 if (ddi_strtol(pr_val
, (char **)NULL
, 0, &result
))
1926 if ((result
> 1) || (result
< 0))
1931 pUM
->hwinit
.lnkcfg
.param_rxpause
= (uint32_t)result
;
1932 pUM
->curcfg
.lnkcfg
.param_rxpause
= (uint32_t)result
;
1933 if (pUM
->plumbed
) BnxeUpdatePhy(pUM
);
1935 else if (strcmp(pr_name
, "_autoneg_flow") == 0)
1937 if (ddi_strtol(pr_val
, (char **)NULL
, 0, &result
))
1942 if ((result
> 1) || (result
< 0))
1947 pUM
->hwinit
.flow_autoneg
= (uint32_t)result
;
1948 pUM
->curcfg
.flow_autoneg
= (uint32_t)result
;
1949 if (pUM
->plumbed
) BnxeUpdatePhy(pUM
);
1951 else if (strcmp(pr_name
, "_checksum") == 0)
1958 if (ddi_strtol(pr_val
, (char **)NULL
, 0, &result
))
1965 case USER_OPTION_CKSUM_NONE
:
1967 pUM
->devParams
.enabled_oflds
= LM_OFFLOAD_NONE
;
1970 case USER_OPTION_CKSUM_L3
:
1972 pUM
->devParams
.enabled_oflds
= (LM_OFFLOAD_TX_IP_CKSUM
|
1973 LM_OFFLOAD_RX_IP_CKSUM
);
1976 case USER_OPTION_CKSUM_L3_L4
:
1978 pUM
->devParams
.enabled_oflds
= (LM_OFFLOAD_TX_IP_CKSUM
|
1979 LM_OFFLOAD_RX_IP_CKSUM
|
1980 LM_OFFLOAD_TX_TCP_CKSUM
|
1981 LM_OFFLOAD_RX_TCP_CKSUM
|
1982 LM_OFFLOAD_TX_UDP_CKSUM
|
1983 LM_OFFLOAD_RX_UDP_CKSUM
);
1991 pUM
->devParams
.checksum
= (uint32_t)result
;
1993 else if (strcmp(pr_name
, "_tx_ring_policy") == 0)
1995 if (ddi_strtol(pr_val
, (char **)NULL
, 0, &result
))
2002 case BNXE_ROUTE_RING_NONE
:
2003 case BNXE_ROUTE_RING_TCPUDP
:
2004 case BNXE_ROUTE_RING_DEST_MAC
:
2005 case BNXE_ROUTE_RING_MSG_PRIO
:
2014 pUM
->devParams
.routeTxRingPolicy
= (uint32_t)result
;
2016 else if (strcmp(pr_name
, "_num_rings") == 0)
2023 if (ddi_strtol(pr_val
, (char **)NULL
, 0, &result
))
2028 if ((result
< USER_OPTION_NUM_RINGS_MIN
) ||
2029 (result
> USER_OPTION_NUM_RINGS_MAX
))
2034 pUM
->devParams
.numRings
= (uint32_t)result
;
2036 else if (strcmp(pr_name
, "_rx_descs") == 0)
2043 if (ddi_strtol(pr_val
, (char **)NULL
, 0, &result
))
2048 if ((result
< USER_OPTION_BDS_MIN
) || (result
> USER_OPTION_BDS_MAX
))
2053 pUM
->devParams
.numRxDesc
[LM_CLI_IDX_NDIS
] = (uint32_t)result
;
2055 else if (strcmp(pr_name
, "_rx_free_reclaim") == 0)
2057 if (ddi_strtol(pr_val
, (char **)NULL
, 0, &result
))
2062 if ((result
< USER_OPTION_BDS_MIN
) || (result
> USER_OPTION_BDS_MAX
))
2067 pUM
->devParams
.maxRxFree
= (uint32_t)result
;
2069 else if (strcmp(pr_name
, "_tx_descs") == 0)
2076 if (ddi_strtol(pr_val
, (char **)NULL
, 0, &result
))
2081 if ((result
< USER_OPTION_BDS_MIN
) || (result
> USER_OPTION_BDS_MAX
))
2086 pUM
->devParams
.numTxDesc
[LM_CLI_IDX_NDIS
] = (uint32_t)result
;
2088 else if (strcmp(pr_name
, "_tx_free_reclaim") == 0)
2090 if (ddi_strtol(pr_val
, (char **)NULL
, 0, &result
))
2095 if ((result
< USER_OPTION_BDS_MIN
) || (result
> USER_OPTION_BDS_MAX
))
2100 pUM
->devParams
.maxTxFree
= (uint32_t)result
;
2102 else if (strcmp(pr_name
, "_rx_copy_threshold") == 0)
2104 if (ddi_strtol(pr_val
, (char **)NULL
, 0, &result
))
2109 pUM
->devParams
.rxCopyThreshold
= (uint32_t)result
;
2111 else if (strcmp(pr_name
, "_tx_copy_threshold") == 0)
2113 if (ddi_strtol(pr_val
, (char **)NULL
, 0, &result
))
2118 pUM
->devParams
.txCopyThreshold
= (uint32_t)result
;
2120 else if (strcmp(pr_name
, "_interrupt_coalesce") == 0)
2127 if (ddi_strtol(pr_val
, (char **)NULL
, 0, &result
))
2132 if ((result
> 1) || (result
< 0))
2137 pUM
->devParams
.intrCoalesce
= (uint32_t)result
;
2139 else if (strcmp(pr_name
, "_rx_interrupt_coalesce_usec") == 0)
2146 if (ddi_strtol(pr_val
, (char **)NULL
, 0, &result
))
2151 if ((result
< USER_OPTION_INTR_COALESCE_MIN
) ||
2152 (result
< USER_OPTION_INTR_COALESCE_MAX
))
2157 pUM
->devParams
.intrRxPerSec
= (uint32_t)(1000000 / result
);
2159 else if (strcmp(pr_name
, "_tx_interrupt_coalesce_usec") == 0)
2166 if (ddi_strtol(pr_val
, (char **)NULL
, 0, &result
))
2171 if ((result
< USER_OPTION_INTR_COALESCE_MIN
) ||
2172 (result
< USER_OPTION_INTR_COALESCE_MAX
))
2177 pUM
->devParams
.intrTxPerSec
= (uint32_t)(1000000 / result
);
2179 else if (strcmp(pr_name
, "_disable_msix") == 0)
2186 if (ddi_strtol(pr_val
, (char **)NULL
, 0, &result
))
2191 if ((result
> 1) || (result
< 0))
2196 pUM
->devParams
.disableMsix
= (uint32_t)result
;
2198 else if (strcmp(pr_name
, "_l2_fw_flow_ctrl") == 0)
2205 if (ddi_strtol(pr_val
, (char **)NULL
, 0, &result
))
2210 if ((result
> 1) || (result
< 0))
2215 pUM
->devParams
.l2_fw_flow_ctrl
= (uint32_t)result
;
2217 else if (strcmp(pr_name
, "_autogreeen_enable") == 0)
2219 if (ddi_strtol(pr_val
, (char **)NULL
, 0, &result
))
2224 if ((result
> 1) || (result
< 0))
2229 pUM
->devParams
.autogreeenEnable
= (uint32_t)result
;
2230 if (pUM
->plumbed
) BnxeUpdatePhy(pUM
);
2232 else if (strcmp(pr_name
, "_lso_enable") == 0)
2239 if (ddi_strtol(pr_val
, (char **)NULL
, 0, &result
))
2244 if ((result
> 1) || (result
< 0))
2249 pUM
->devParams
.lsoEnable
= (uint32_t)result
;
2251 else if (strcmp(pr_name
, "_log_enable") == 0)
2253 if (ddi_strtol(pr_val
, (char **)NULL
, 0, &result
))
2258 if ((result
> 1) || (result
< 0))
2263 pUM
->devParams
.logEnable
= (uint32_t)result
;
2265 else if (strcmp(pr_name
, "_fcoe_enable") == 0)
2267 if (ddi_strtol(pr_val
, (char **)NULL
, 0, &result
))
2272 if ((result
> 1) || (result
< 0))
2277 pUM
->devParams
.fcoeEnable
= (uint32_t)result
;
2281 BnxeFcoeStartStop(pUM
);
2293 static int BnxeMacSetProperty(void * barg
,
2294 const char * pr_name
,
2295 mac_prop_id_t pr_num
,
2297 const void * pr_val
)
2299 um_device_t
* pUM
= barg
;
2300 boolean_t reprogram
= B_FALSE
;
2307 BNXE_LOCK_ENTER_GLD(pUM
);
2311 /* read-only props */
2312 case MAC_PROP_STATUS
:
2313 case MAC_PROP_SPEED
:
2314 case MAC_PROP_DUPLEX
:
2316 case MAC_PROP_ADV_10GFDX_CAP
:
2317 case MAC_PROP_ADV_1000FDX_CAP
:
2318 case MAC_PROP_ADV_1000HDX_CAP
:
2319 case MAC_PROP_ADV_100FDX_CAP
:
2320 case MAC_PROP_ADV_100HDX_CAP
:
2321 case MAC_PROP_ADV_10FDX_CAP
:
2322 case MAC_PROP_ADV_10HDX_CAP
:
2323 case MAC_PROP_ADV_100T4_CAP
:
2325 case MAC_PROP_EN_1000HDX_CAP
:
2326 case MAC_PROP_EN_100T4_CAP
:
2333 case MAC_PROP_EN_10GFDX_CAP
:
2335 pUM
->hwinit
.lnkcfg
.param_10000fdx
= *(uint8_t *)pr_val
;
2336 pUM
->curcfg
.lnkcfg
.param_10000fdx
= *(uint8_t *)pr_val
;
2340 case MAC_PROP_EN_1000FDX_CAP
:
2342 pUM
->hwinit
.lnkcfg
.param_1000fdx
= *(uint8_t *)pr_val
;
2343 pUM
->curcfg
.lnkcfg
.param_1000fdx
= *(uint8_t *)pr_val
;
2347 case MAC_PROP_EN_100FDX_CAP
:
2349 pUM
->hwinit
.lnkcfg
.param_100fdx
= *(uint8_t *)pr_val
;
2350 pUM
->curcfg
.lnkcfg
.param_100fdx
= *(uint8_t *)pr_val
;
2354 case MAC_PROP_EN_100HDX_CAP
:
2356 pUM
->hwinit
.lnkcfg
.param_100hdx
= *(uint8_t *)pr_val
;
2357 pUM
->curcfg
.lnkcfg
.param_100hdx
= *(uint8_t *)pr_val
;
2361 case MAC_PROP_EN_10FDX_CAP
:
2363 pUM
->hwinit
.lnkcfg
.param_10fdx
= *(uint8_t *)pr_val
;
2364 pUM
->curcfg
.lnkcfg
.param_10fdx
= *(uint8_t *)pr_val
;
2368 case MAC_PROP_EN_10HDX_CAP
:
2370 pUM
->hwinit
.lnkcfg
.param_10hdx
= *(uint8_t *)pr_val
;
2371 pUM
->curcfg
.lnkcfg
.param_10hdx
= *(uint8_t *)pr_val
;
2375 case MAC_PROP_AUTONEG
:
2377 pUM
->hwinit
.lnkcfg
.link_autoneg
= *(uint8_t *)pr_val
;
2378 pUM
->curcfg
.lnkcfg
.link_autoneg
= *(uint8_t *)pr_val
;
2382 case MAC_PROP_FLOWCTRL
:
2384 bcopy(pr_val
, &fl
, sizeof(fl
));
2388 case LINK_FLOWCTRL_NONE
:
2394 case LINK_FLOWCTRL_RX
:
2400 case LINK_FLOWCTRL_TX
:
2406 case LINK_FLOWCTRL_BI
:
2420 pUM
->hwinit
.lnkcfg
.param_rxpause
= rxpause
;
2421 pUM
->hwinit
.lnkcfg
.param_txpause
= txpause
;
2422 pUM
->curcfg
.lnkcfg
.param_rxpause
= rxpause
;
2423 pUM
->curcfg
.lnkcfg
.param_txpause
= txpause
;
2437 bcopy(pr_val
, &mtu
, sizeof (mtu
));
2439 if ((mtu
< USER_OPTION_MTU_MIN
) || (mtu
> USER_OPTION_MTU_MAX
))
2445 if (pUM
->devParams
.mtu
[LM_CLI_IDX_NDIS
] == mtu
)
2450 pUM
->devParams
.mtu
[LM_CLI_IDX_NDIS
] = mtu
;
2451 err
= mac_maxsdu_update(pUM
->pMac
, pUM
->devParams
.mtu
[LM_CLI_IDX_NDIS
]);
2452 pUM
->lm_dev
.params
.mtu
[LM_CLI_IDX_NDIS
] = pUM
->devParams
.mtu
[LM_CLI_IDX_NDIS
];
2455 case MAC_PROP_PRIVATE
:
2457 err
= BnxeSetPrivateProperty(pUM
, pr_name
, pr_valsize
, pr_val
);
2461 if (!err
&& reprogram
)
2463 if (pUM
->plumbed
) BnxeUpdatePhy(pUM
);
2466 BNXE_LOCK_EXIT_GLD(pUM
);
2470 #endif /* MC_SETPROP */
2475 static int BnxeGetPrivateProperty(um_device_t
* pUM
,
2476 const char * pr_name
,
2480 BnxeLinkCfg
* lnk_cfg
= &pUM
->curcfg
.lnkcfg
;
2481 BnxeLinkCfg
* hw_cfg
= &pUM
->hwinit
.lnkcfg
;
2485 if (strcmp(pr_name
, "_adv_2500fdx_cap") == 0)
2487 value
= lnk_cfg
->param_2500fdx
;
2489 else if (strcmp(pr_name
, "_en_2500fdx_cap") == 0)
2491 value
= hw_cfg
->param_2500fdx
;
2493 else if (strcmp(pr_name
, "_adv_txpause_cap") == 0)
2495 value
= lnk_cfg
->param_txpause
;
2497 else if (strcmp(pr_name
, "_en_txpause_cap") == 0)
2499 value
= hw_cfg
->param_txpause
;
2501 else if (strcmp(pr_name
, "_txpause") == 0)
2503 value
= pUM
->props
.link_txpause
;
2505 else if (strcmp(pr_name
, "_adv_rxpause_cap") == 0)
2507 value
= lnk_cfg
->param_rxpause
;
2509 else if (strcmp(pr_name
, "_en_rxpause_cap") == 0)
2511 value
= hw_cfg
->param_rxpause
;
2513 else if (strcmp(pr_name
, "_rxpause") == 0)
2515 value
= pUM
->props
.link_rxpause
;
2517 else if (strcmp(pr_name
, "_autoneg_flow") == 0)
2519 value
= pUM
->hwinit
.flow_autoneg
;
2521 else if (strcmp(pr_name
, "_checksum") == 0)
2523 value
= pUM
->devParams
.checksum
;
2525 else if (strcmp(pr_name
, "_tx_ring_policy") == 0)
2527 value
= pUM
->devParams
.routeTxRingPolicy
;
2529 else if (strcmp(pr_name
, "_num_rings") == 0)
2531 value
= pUM
->devParams
.numRings
;
2533 else if (strcmp(pr_name
, "_rx_descs") == 0)
2535 value
= pUM
->devParams
.numRxDesc
[LM_CLI_IDX_NDIS
];
2537 else if (strcmp(pr_name
, "_rx_free_reclaim") == 0)
2539 value
= pUM
->devParams
.maxRxFree
;
2541 else if (strcmp(pr_name
, "_tx_descs") == 0)
2543 value
= pUM
->devParams
.numTxDesc
[LM_CLI_IDX_NDIS
];
2545 else if (strcmp(pr_name
, "_tx_free_reclaim") == 0)
2547 value
= pUM
->devParams
.maxTxFree
;
2549 else if (strcmp(pr_name
, "_rx_copy_threshold") == 0)
2551 value
= pUM
->devParams
.rxCopyThreshold
;
2553 else if (strcmp(pr_name
, "_tx_copy_threshold") == 0)
2555 value
= pUM
->devParams
.txCopyThreshold
;
2557 else if (strcmp(pr_name
, "_interrupt_coalesce") == 0)
2559 value
= pUM
->devParams
.intrCoalesce
;
2561 else if (strcmp(pr_name
, "_rx_interrupt_coalesce_usec") == 0)
2563 value
= pUM
->devParams
.intrRxPerSec
;
2565 else if (strcmp(pr_name
, "_tx_interrupt_coalesce_usec") == 0)
2567 value
= pUM
->devParams
.intrTxPerSec
;
2569 else if (strcmp(pr_name
, "_disable_msix") == 0)
2571 value
= pUM
->devParams
.disableMsix
;
2573 else if (strcmp(pr_name
, "_l2_fw_flow_ctrl") == 0)
2575 value
= pUM
->devParams
.l2_fw_flow_ctrl
;
2577 else if (strcmp(pr_name
, "_autogreeen_enable") == 0)
2579 value
= pUM
->devParams
.autogreeenEnable
;
2581 else if (strcmp(pr_name
, "_lso_enable") == 0)
2583 value
= pUM
->devParams
.lsoEnable
;
2585 else if (strcmp(pr_name
, "_log_enable") == 0)
2587 value
= pUM
->devParams
.logEnable
;
2589 else if (strcmp(pr_name
, "_fcoe_enable") == 0)
2591 value
= pUM
->devParams
.fcoeEnable
;
2600 (void)snprintf(pr_val
, pr_valsize
, "%d", value
);
2607 static int BnxeMacGetProperty(void * barg
,
2608 const char * pr_name
,
2609 mac_prop_id_t pr_num
,
2613 um_device_t
* pUM
= barg
;
2614 link_flowctrl_t link_flowctrl
;
2615 link_state_t link_state
;
2616 link_duplex_t link_duplex
;
2617 uint64_t link_speed
;
2618 BnxeLinkCfg
* lnk_cfg
= &pUM
->curcfg
.lnkcfg
;
2619 BnxeLinkCfg
* hw_cfg
= &pUM
->hwinit
.lnkcfg
;
2625 ASSERT(pr_valsize
>= sizeof(u32_t
));
2627 bcopy(&pUM
->devParams
.mtu
[LM_CLI_IDX_NDIS
], pr_val
, sizeof(u32_t
));
2630 case MAC_PROP_DUPLEX
:
2632 ASSERT(pr_valsize
>= sizeof(link_duplex_t
));
2634 link_duplex
= pUM
->props
.link_duplex
?
2635 LINK_DUPLEX_FULL
: LINK_DUPLEX_HALF
;
2636 bcopy(&link_duplex
, pr_val
, sizeof(link_duplex_t
));
2639 case MAC_PROP_SPEED
:
2641 ASSERT(pr_valsize
>= sizeof(link_speed
));
2643 link_speed
= (pUM
->props
.link_speed
* 1000000ULL);
2644 bcopy(&link_speed
, pr_val
, sizeof(link_speed
));
2647 case MAC_PROP_STATUS
:
2649 ASSERT(pr_valsize
>= sizeof(link_state_t
));
2651 link_state
= pUM
->props
.link_speed
?
2652 LINK_STATE_UP
: LINK_STATE_DOWN
;
2653 bcopy(&link_state
, pr_val
, sizeof(link_state_t
));
2656 case MAC_PROP_AUTONEG
:
2658 *(uint8_t *)pr_val
= lnk_cfg
->link_autoneg
;
2661 case MAC_PROP_FLOWCTRL
:
2663 ASSERT(pr_valsize
>= sizeof(link_flowctrl_t
));
2665 if (!lnk_cfg
->param_rxpause
&& !lnk_cfg
->param_txpause
)
2667 link_flowctrl
= LINK_FLOWCTRL_NONE
;
2669 if (lnk_cfg
->param_rxpause
&& !lnk_cfg
->param_txpause
)
2671 link_flowctrl
= LINK_FLOWCTRL_RX
;
2673 if (!lnk_cfg
->param_rxpause
&& lnk_cfg
->param_txpause
)
2675 link_flowctrl
= LINK_FLOWCTRL_TX
;
2677 if (lnk_cfg
->param_rxpause
&& lnk_cfg
->param_txpause
)
2679 link_flowctrl
= LINK_FLOWCTRL_BI
;
2682 bcopy(&link_flowctrl
, pr_val
, sizeof(link_flowctrl_t
));
2685 case MAC_PROP_ADV_10GFDX_CAP
:
2687 *(uint8_t *)pr_val
= lnk_cfg
->param_10000fdx
;
2690 case MAC_PROP_EN_10GFDX_CAP
:
2692 *(uint8_t *)pr_val
= hw_cfg
->param_10000fdx
;
2695 case MAC_PROP_ADV_1000FDX_CAP
:
2697 *(uint8_t *)pr_val
= lnk_cfg
->param_1000fdx
;
2700 case MAC_PROP_EN_1000FDX_CAP
:
2702 *(uint8_t *)pr_val
= hw_cfg
->param_1000fdx
;
2705 case MAC_PROP_ADV_1000HDX_CAP
:
2706 case MAC_PROP_EN_1000HDX_CAP
:
2708 *(uint8_t *)pr_val
= 0;
2711 case MAC_PROP_ADV_100FDX_CAP
:
2713 *(uint8_t *)pr_val
= lnk_cfg
->param_100fdx
;
2716 case MAC_PROP_EN_100FDX_CAP
:
2718 *(uint8_t *)pr_val
= hw_cfg
->param_100fdx
;
2721 case MAC_PROP_ADV_100HDX_CAP
:
2723 *(uint8_t *)pr_val
= lnk_cfg
->param_100hdx
;
2726 case MAC_PROP_EN_100HDX_CAP
:
2728 *(uint8_t *)pr_val
= hw_cfg
->param_100hdx
;
2731 case MAC_PROP_ADV_100T4_CAP
:
2732 case MAC_PROP_EN_100T4_CAP
:
2734 *(uint8_t *)pr_val
= 0;
2737 case MAC_PROP_ADV_10FDX_CAP
:
2739 *(uint8_t *)pr_val
= lnk_cfg
->param_10fdx
;
2742 case MAC_PROP_EN_10FDX_CAP
:
2744 *(uint8_t *)pr_val
= hw_cfg
->param_10fdx
;
2747 case MAC_PROP_ADV_10HDX_CAP
:
2749 *(uint8_t *)pr_val
= lnk_cfg
->param_10hdx
;
2752 case MAC_PROP_EN_10HDX_CAP
:
2754 *(uint8_t *)pr_val
= hw_cfg
->param_10hdx
;
2757 case MAC_PROP_PRIVATE
:
2759 return BnxeGetPrivateProperty(pUM
,
2772 #endif /* MC_GETPROP */
2777 static void BnxeMacPrivatePropertyInfo(um_device_t
* pUM
,
2778 const char * pr_name
,
2779 mac_prop_info_handle_t prh
)
2782 BnxeLinkCfg
* default_cfg
= &bnxeLinkCfg
;
2785 bzero(valstr
, sizeof (valstr
));
2787 if ((strcmp(pr_name
, "_adv_2500fdx_cap") == 0) ||
2788 (strcmp(pr_name
, "_adv_txpause_cap") == 0) ||
2789 (strcmp(pr_name
, "_txpause") == 0) ||
2790 (strcmp(pr_name
, "_adv_rxpause_cap") == 0) ||
2791 (strcmp(pr_name
, "_rxpause") == 0) ||
2792 (strcmp(pr_name
, "_checksum") == 0) ||
2793 (strcmp(pr_name
, "_num_rings") == 0) ||
2794 (strcmp(pr_name
, "_rx_descs") == 0) ||
2795 (strcmp(pr_name
, "_tx_descs") == 0) ||
2796 (strcmp(pr_name
, "_interrupt_coalesce") == 0) ||
2797 (strcmp(pr_name
, "_rx_interrupt_coalesce_usec") == 0) ||
2798 (strcmp(pr_name
, "_tx_interrupt_coalesce_usec") == 0) ||
2799 (strcmp(pr_name
, "_disable_msix") == 0) ||
2800 (strcmp(pr_name
, "_l2_fw_flow_ctrl") == 0) ||
2801 (strcmp(pr_name
, "_lso_enable") == 0))
2803 mac_prop_info_set_perm(prh
, MAC_PROP_PERM_READ
);
2807 if (strcmp(pr_name
, "_autoneg_flow") == 0)
2809 default_val
= B_TRUE
;
2811 else if (strcmp(pr_name
, "_tx_ring_policy") == 0)
2813 default_val
= BNXE_ROUTE_RING_TCPUDP
;
2815 else if (strcmp(pr_name
, "_rx_free_reclaim") == 0)
2817 default_val
= USER_OPTION_RX_MAX_FREE_DEFAULT
;
2819 else if (strcmp(pr_name
, "_tx_free_reclaim") == 0)
2821 default_val
= USER_OPTION_TX_MAX_FREE_DEFAULT
;
2823 else if (strcmp(pr_name
, "_rx_copy_threshold") == 0)
2825 default_val
= USER_OPTION_RX_DCOPY_THRESH_DEFAULT
;
2827 else if (strcmp(pr_name
, "_tx_copy_threshold") == 0)
2829 default_val
= USER_OPTION_TX_DCOPY_THRESH_DEFAULT
;
2831 else if (strcmp(pr_name
, "_autogreeen_enable") == 0)
2833 default_val
= B_TRUE
;
2835 else if (strcmp(pr_name
, "_log_enable") == 0)
2837 default_val
= B_TRUE
;
2839 else if (strcmp(pr_name
, "_fcoe_enable") == 0)
2841 default_val
= B_TRUE
;
2848 snprintf(valstr
, sizeof (valstr
), "%d", default_val
);
2849 mac_prop_info_set_default_str(prh
, valstr
);
2853 static void BnxeMacPropertyInfo(void * barg
,
2854 const char * pr_name
,
2855 mac_prop_id_t pr_num
,
2856 mac_prop_info_handle_t prh
)
2858 um_device_t
* pUM
= barg
;
2859 link_flowctrl_t link_flowctrl
;
2860 BnxeLinkCfg
* default_cfg
= &bnxeLinkCfg
;
2864 case MAC_PROP_STATUS
:
2865 case MAC_PROP_SPEED
:
2866 case MAC_PROP_DUPLEX
:
2868 case MAC_PROP_ADV_10GFDX_CAP
:
2869 case MAC_PROP_ADV_1000FDX_CAP
:
2870 case MAC_PROP_ADV_1000HDX_CAP
:
2871 case MAC_PROP_ADV_100FDX_CAP
:
2872 case MAC_PROP_ADV_100HDX_CAP
:
2873 case MAC_PROP_ADV_100T4_CAP
:
2874 case MAC_PROP_ADV_10FDX_CAP
:
2875 case MAC_PROP_ADV_10HDX_CAP
:
2877 case MAC_PROP_EN_1000HDX_CAP
:
2878 case MAC_PROP_EN_100T4_CAP
:
2880 mac_prop_info_set_perm(prh
, MAC_PROP_PERM_READ
);
2883 case MAC_PROP_EN_10GFDX_CAP
:
2885 mac_prop_info_set_default_uint8(prh
, default_cfg
->param_10000fdx
);
2888 case MAC_PROP_EN_1000FDX_CAP
:
2890 mac_prop_info_set_default_uint8(prh
, default_cfg
->param_1000fdx
);
2893 case MAC_PROP_EN_100FDX_CAP
:
2895 mac_prop_info_set_default_uint8(prh
, default_cfg
->param_100fdx
);
2898 case MAC_PROP_EN_100HDX_CAP
:
2900 mac_prop_info_set_default_uint8(prh
, default_cfg
->param_100hdx
);
2903 case MAC_PROP_EN_10FDX_CAP
:
2905 mac_prop_info_set_default_uint8(prh
, default_cfg
->param_10fdx
);
2908 case MAC_PROP_EN_10HDX_CAP
:
2910 mac_prop_info_set_default_uint8(prh
, default_cfg
->param_10hdx
);
2915 mac_prop_info_set_range_uint32(prh
,
2916 USER_OPTION_MTU_MIN
,
2917 USER_OPTION_MTU_MAX
);
2920 case MAC_PROP_AUTONEG
:
2922 mac_prop_info_set_default_uint8(prh
, default_cfg
->link_autoneg
);
2925 case MAC_PROP_FLOWCTRL
:
2927 if (!default_cfg
->param_rxpause
&& !default_cfg
->param_txpause
)
2929 link_flowctrl
= LINK_FLOWCTRL_NONE
;
2932 if (default_cfg
->param_rxpause
&& !default_cfg
->param_txpause
)
2934 link_flowctrl
= LINK_FLOWCTRL_RX
;
2937 if (!default_cfg
->param_rxpause
&& default_cfg
->param_txpause
)
2939 link_flowctrl
= LINK_FLOWCTRL_TX
;
2942 if (default_cfg
->param_rxpause
&& default_cfg
->param_txpause
)
2944 link_flowctrl
= LINK_FLOWCTRL_BI
;
2947 mac_prop_info_set_default_link_flowctrl(prh
, link_flowctrl
);
2950 case MAC_PROP_PRIVATE
:
2952 BnxeMacPrivatePropertyInfo(pUM
, pr_name
, prh
);
2957 #endif /* MC_PROPINFO */
2960 static mac_callbacks_t bnxe_callbacks
=
2991 BnxeMacGetCapability
,
3008 boolean_t
BnxeGldInit(um_device_t
* pUM
)
3010 mac_register_t
* pMac
;
3013 atomic_swap_32(&pUM
->plumbed
, B_FALSE
);
3015 if ((pMac
= mac_alloc(MAC_VERSION
)) == NULL
)
3017 BnxeLogWarn(pUM
, "Failed to allocate GLD MAC memory");
3021 pMac
->m_driver
= pUM
;
3022 pMac
->m_dip
= pUM
->pDev
;
3023 pMac
->m_type_ident
= MAC_PLUGIN_IDENT_ETHER
;
3024 pMac
->m_callbacks
= &bnxe_callbacks
;
3025 pMac
->m_min_sdu
= 0;
3026 pMac
->m_max_sdu
= pUM
->devParams
.mtu
[LM_CLI_IDX_NDIS
];
3027 pMac
->m_src_addr
= &(pUM
->lm_dev
.params
.mac_addr
[0]);
3030 pMac
->m_margin
= VLAN_TAGSZ
;
3034 pMac
->m_priv_props
= bnxeLink_priv_props
;
3037 #if (defined(__S11) || defined(__S12)) && !defined(ILLUMOS)
3038 bnxe_callbacks
.mc_unicst
=
3039 (!pUM
->devParams
.numRings
) ? BnxeMacUnicast
: NULL
;
3041 bnxe_callbacks
.mc_unicst
= BnxeMacUnicast
;
3044 rc
= mac_register(pMac
, &pUM
->pMac
);
3050 BnxeLogWarn(pUM
, "Failed to register with GLD (%d)", rc
);
3054 /* Always report the initial link state as unknown. */
3055 mac_link_update(pUM
->pMac
, LINK_STATE_UNKNOWN
);
3061 boolean_t
BnxeGldFini(um_device_t
* pUM
)
3067 BnxeLogWarn(pUM
, "Detaching device from GLD that is started!");
3071 /* We must not detach until all packets held by stack are retrieved. */
3072 if (!BnxeWaitForPacketsFromClient(pUM
, LM_CLI_IDX_NDIS
))
3079 if (mac_unregister(pUM
->pMac
))
3081 BnxeLogWarn(pUM
, "Failed to unregister with the GLD");
3090 void BnxeGldLink(um_device_t
* pUM
,
3093 mac_link_update(pUM
->pMac
, state
);