16f45ec7bSml29623 /*
26f45ec7bSml29623 * CDDL HEADER START
36f45ec7bSml29623 *
46f45ec7bSml29623 * The contents of this file are subject to the terms of the
56f45ec7bSml29623 * Common Development and Distribution License (the "License").
66f45ec7bSml29623 * You may not use this file except in compliance with the License.
76f45ec7bSml29623 *
86f45ec7bSml29623 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
96f45ec7bSml29623 * or http://www.opensolaris.org/os/licensing.
106f45ec7bSml29623 * See the License for the specific language governing permissions
116f45ec7bSml29623 * and limitations under the License.
126f45ec7bSml29623 *
136f45ec7bSml29623 * When distributing Covered Code, include this CDDL HEADER in each
146f45ec7bSml29623 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
156f45ec7bSml29623 * If applicable, add the following below this CDDL HEADER, with the
166f45ec7bSml29623 * fields enclosed by brackets "[]" replaced with your own identifying
176f45ec7bSml29623 * information: Portions Copyright [yyyy] [name of copyright owner]
186f45ec7bSml29623 *
196f45ec7bSml29623 * CDDL HEADER END
206f45ec7bSml29623 */
216f45ec7bSml29623 /*
229d587972SSantwona Behera * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
236f45ec7bSml29623 */
246f45ec7bSml29623
256f45ec7bSml29623 #include <sys/nxge/nxge_impl.h>
266f45ec7bSml29623 #include <sys/nxge/nxge_mac.h>
27678453a8Sspeer #include <sys/nxge/nxge_hio.h>
286f45ec7bSml29623
29952a2464SMichael Speer /*
30952a2464SMichael Speer * Local defines for FWARC 2006/556
31952a2464SMichael Speer */
32952a2464SMichael Speer #define NXGE_NIU_TDMA_PROP_LEN 2
33952a2464SMichael Speer #define NXGE_NIU_RDMA_PROP_LEN 2
34952a2464SMichael Speer #define NXGE_NIU_0_INTR_PROP_LEN 19
35952a2464SMichael Speer #define NXGE_NIU_1_INTR_PROP_LEN 17
36952a2464SMichael Speer
37952a2464SMichael Speer /*
38952a2464SMichael Speer * Local functions.
39952a2464SMichael Speer */
406f45ec7bSml29623 static void nxge_get_niu_property(dev_info_t *, niu_type_t *);
416f45ec7bSml29623 static nxge_status_t nxge_get_mac_addr_properties(p_nxge_t);
426f45ec7bSml29623 static nxge_status_t nxge_use_cfg_n2niu_properties(p_nxge_t);
436f45ec7bSml29623 static void nxge_use_cfg_neptune_properties(p_nxge_t);
446f45ec7bSml29623 static void nxge_use_cfg_dma_config(p_nxge_t);
456f45ec7bSml29623 static void nxge_use_cfg_vlan_class_config(p_nxge_t);
466f45ec7bSml29623 static void nxge_use_cfg_mac_class_config(p_nxge_t);
476f45ec7bSml29623 static void nxge_use_cfg_class_config(p_nxge_t);
486f45ec7bSml29623 static void nxge_use_cfg_link_cfg(p_nxge_t);
496f45ec7bSml29623 static void nxge_set_hw_dma_config(p_nxge_t);
506f45ec7bSml29623 static void nxge_set_hw_vlan_class_config(p_nxge_t);
516f45ec7bSml29623 static void nxge_set_hw_mac_class_config(p_nxge_t);
526f45ec7bSml29623 static void nxge_set_hw_class_config(p_nxge_t);
536f45ec7bSml29623 static nxge_status_t nxge_use_default_dma_config_n2(p_nxge_t);
546f45ec7bSml29623 static void nxge_ldgv_setup(p_nxge_ldg_t *, p_nxge_ldv_t *, uint8_t,
556f45ec7bSml29623 uint8_t, int *);
5659ac0c16Sdavemq static void nxge_init_mmac(p_nxge_t, boolean_t);
57678453a8Sspeer static void nxge_set_rdc_intr_property(p_nxge_t);
586f45ec7bSml29623
596f45ec7bSml29623 uint32_t nxge_use_hw_property = 1;
606f45ec7bSml29623 uint32_t nxge_groups_per_port = 2;
616f45ec7bSml29623
626f45ec7bSml29623 extern uint32_t nxge_use_partition;
636f45ec7bSml29623 extern uint32_t nxge_dma_obp_props_only;
646f45ec7bSml29623
656f45ec7bSml29623 extern uint_t nxge_rx_intr(void *, void *);
666f45ec7bSml29623 extern uint_t nxge_tx_intr(void *, void *);
676f45ec7bSml29623 extern uint_t nxge_mif_intr(void *, void *);
686f45ec7bSml29623 extern uint_t nxge_mac_intr(void *, void *);
696f45ec7bSml29623 extern uint_t nxge_syserr_intr(void *, void *);
706f45ec7bSml29623 extern void *nxge_list;
716f45ec7bSml29623
726f45ec7bSml29623 #define NXGE_SHARED_REG_SW_SIM
736f45ec7bSml29623
746f45ec7bSml29623 #ifdef NXGE_SHARED_REG_SW_SIM
756f45ec7bSml29623 uint64_t global_dev_ctrl = 0;
766f45ec7bSml29623 #endif
776f45ec7bSml29623
786f45ec7bSml29623 #define MAX_SIBLINGS NXGE_MAX_PORTS
796f45ec7bSml29623
806f45ec7bSml29623 extern uint32_t nxge_rbr_size;
816f45ec7bSml29623 extern uint32_t nxge_rcr_size;
826f45ec7bSml29623 extern uint32_t nxge_tx_ring_size;
836f45ec7bSml29623 extern uint32_t nxge_rbr_spare_size;
846f45ec7bSml29623
856f45ec7bSml29623 extern npi_status_t npi_mac_altaddr_disable(npi_handle_t, uint8_t, uint8_t);
866f45ec7bSml29623
876f45ec7bSml29623 static uint8_t p2_tx_fair[2] = {12, 12};
886f45ec7bSml29623 static uint8_t p2_tx_equal[2] = {12, 12};
896f45ec7bSml29623 static uint8_t p4_tx_fair[4] = {6, 6, 6, 6};
906f45ec7bSml29623 static uint8_t p4_tx_equal[4] = {6, 6, 6, 6};
916f45ec7bSml29623 static uint8_t p2_rx_fair[2] = {8, 8};
926f45ec7bSml29623 static uint8_t p2_rx_equal[2] = {8, 8};
936f45ec7bSml29623 static uint8_t p4_rx_fair[4] = {4, 4, 4, 4};
946f45ec7bSml29623 static uint8_t p4_rx_equal[4] = {4, 4, 4, 4};
956f45ec7bSml29623
966f45ec7bSml29623 static uint8_t p2_rdcgrp_fair[2] = {4, 4};
976f45ec7bSml29623 static uint8_t p2_rdcgrp_equal[2] = {4, 4};
986f45ec7bSml29623 static uint8_t p4_rdcgrp_fair[4] = {2, 2, 1, 1};
996f45ec7bSml29623 static uint8_t p4_rdcgrp_equal[4] = {2, 2, 2, 2};
1006f45ec7bSml29623 static uint8_t p2_rdcgrp_cls[2] = {1, 1};
1016f45ec7bSml29623 static uint8_t p4_rdcgrp_cls[4] = {1, 1, 1, 1};
1026f45ec7bSml29623
10359ac0c16Sdavemq static uint8_t rx_4_1G[4] = {4, 4, 4, 4};
10459ac0c16Sdavemq static uint8_t rx_2_10G[2] = {8, 8};
10559ac0c16Sdavemq static uint8_t rx_2_10G_2_1G[4] = {6, 6, 2, 2};
10659ac0c16Sdavemq static uint8_t rx_1_10G_3_1G[4] = {10, 2, 2, 2};
10759ac0c16Sdavemq static uint8_t rx_1_1G_1_10G_2_1G[4] = {2, 10, 2, 2};
10859ac0c16Sdavemq
10959ac0c16Sdavemq static uint8_t tx_4_1G[4] = {6, 6, 6, 6};
11059ac0c16Sdavemq static uint8_t tx_2_10G[2] = {12, 12};
11159ac0c16Sdavemq static uint8_t tx_2_10G_2_1G[4] = {10, 10, 2, 2};
11259ac0c16Sdavemq static uint8_t tx_1_10G_3_1G[4] = {12, 4, 4, 4};
11359ac0c16Sdavemq static uint8_t tx_1_1G_1_10G_2_1G[4] = {4, 12, 4, 4};
11459ac0c16Sdavemq
1156f45ec7bSml29623 typedef enum {
1166f45ec7bSml29623 DEFAULT = 0,
1176f45ec7bSml29623 EQUAL,
1186f45ec7bSml29623 FAIR,
1196f45ec7bSml29623 CUSTOM,
1206f45ec7bSml29623 CLASSIFY,
1216f45ec7bSml29623 L2_CLASSIFY,
1226f45ec7bSml29623 L3_DISTRIBUTE,
1236f45ec7bSml29623 L3_CLASSIFY,
1246f45ec7bSml29623 L3_TCAM,
1256f45ec7bSml29623 CONFIG_TOKEN_NONE
1266f45ec7bSml29623 } config_token_t;
1276f45ec7bSml29623
1286f45ec7bSml29623 static char *token_names[] = {
1296f45ec7bSml29623 "default",
1306f45ec7bSml29623 "equal",
1316f45ec7bSml29623 "fair",
1326f45ec7bSml29623 "custom",
1336f45ec7bSml29623 "classify",
1346f45ec7bSml29623 "l2_classify",
1356f45ec7bSml29623 "l3_distribute",
1366f45ec7bSml29623 "l3_classify",
1376f45ec7bSml29623 "l3_tcam",
1386f45ec7bSml29623 "none",
1396f45ec7bSml29623 };
1406f45ec7bSml29623
1416f45ec7bSml29623 void nxge_virint_regs_dump(p_nxge_t nxgep);
1426f45ec7bSml29623
1436f45ec7bSml29623 void
nxge_virint_regs_dump(p_nxge_t nxgep)1446f45ec7bSml29623 nxge_virint_regs_dump(p_nxge_t nxgep)
1456f45ec7bSml29623 {
1466f45ec7bSml29623 npi_handle_t handle;
1476f45ec7bSml29623
1486f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL, "==> nxge_virint_regs_dump"));
1496f45ec7bSml29623 handle = NXGE_DEV_NPI_HANDLE(nxgep);
1506f45ec7bSml29623 (void) npi_vir_dump_pio_fzc_regs_one(handle);
1516f45ec7bSml29623 (void) npi_vir_dump_ldgnum(handle);
1526f45ec7bSml29623 (void) npi_vir_dump_ldsv(handle);
1536f45ec7bSml29623 (void) npi_vir_dump_imask0(handle);
1546f45ec7bSml29623 (void) npi_vir_dump_sid(handle);
1556f45ec7bSml29623 (void) npi_mac_dump_regs(handle, nxgep->function_num);
1566f45ec7bSml29623 (void) npi_ipp_dump_regs(handle, nxgep->function_num);
1576f45ec7bSml29623 (void) npi_fflp_dump_regs(handle);
1586f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL, "<== nxge_virint_regs_dump"));
1596f45ec7bSml29623 }
1606f45ec7bSml29623
1616f45ec7bSml29623 /*
1626f45ec7bSml29623 * For now: we hard coded the DMA configurations.
1636f45ec7bSml29623 * and assume for one partition only.
1646f45ec7bSml29623 *
1656f45ec7bSml29623 * OBP. Then OBP will pass this partition's
1666f45ec7bSml29623 * Neptune configurations to fcode to create
1676f45ec7bSml29623 * properties for them.
1686f45ec7bSml29623 *
1696f45ec7bSml29623 * Since Neptune(PCI-E) and NIU (Niagara-2) has
1706f45ec7bSml29623 * different bus interfaces, the driver needs
1716f45ec7bSml29623 * to know which bus it is connected to.
1726f45ec7bSml29623 * Ravinder suggested: create a device property.
1736f45ec7bSml29623 * In partitioning environment, we cannot
1746f45ec7bSml29623 * use .conf file (need to check). If conf changes,
1756f45ec7bSml29623 * need to reboot the system.
1766f45ec7bSml29623 * The following function assumes that we will
1776f45ec7bSml29623 * retrieve its properties from a virtualized nexus driver.
1786f45ec7bSml29623 */
1796f45ec7bSml29623
1806f45ec7bSml29623 nxge_status_t
nxge_cntlops(dev_info_t * dip,nxge_ctl_enum_t ctlop,void * arg,void * result)1816f45ec7bSml29623 nxge_cntlops(dev_info_t *dip, nxge_ctl_enum_t ctlop, void *arg, void *result)
1826f45ec7bSml29623 {
1836f45ec7bSml29623 nxge_status_t status = NXGE_OK;
1846f45ec7bSml29623 int instance;
1856f45ec7bSml29623 p_nxge_t nxgep;
1866f45ec7bSml29623
1876f45ec7bSml29623 #ifndef NXGE_SHARED_REG_SW_SIM
1886f45ec7bSml29623 npi_handle_t handle;
1896f45ec7bSml29623 uint16_t sr16, cr16;
1906f45ec7bSml29623 #endif
1916f45ec7bSml29623 instance = ddi_get_instance(dip);
1926f45ec7bSml29623 NXGE_DEBUG_MSG((NULL, VIR_CTL, "Instance %d ", instance));
1936f45ec7bSml29623
1946f45ec7bSml29623 if (nxge_list == NULL) {
1956f45ec7bSml29623 NXGE_ERROR_MSG((NULL, NXGE_ERR_CTL,
1966f45ec7bSml29623 "nxge_cntlops: nxge_list null"));
1976f45ec7bSml29623 return (NXGE_ERROR);
1986f45ec7bSml29623 }
1996f45ec7bSml29623 nxgep = (p_nxge_t)ddi_get_soft_state(nxge_list, instance);
2006f45ec7bSml29623 if (nxgep == NULL) {
2016f45ec7bSml29623 NXGE_ERROR_MSG((NULL, NXGE_ERR_CTL,
2026f45ec7bSml29623 "nxge_cntlops: nxgep null"));
2036f45ec7bSml29623 return (NXGE_ERROR);
2046f45ec7bSml29623 }
2056f45ec7bSml29623 #ifndef NXGE_SHARED_REG_SW_SIM
2066f45ec7bSml29623 handle = nxgep->npi_reg_handle;
2076f45ec7bSml29623 #endif
2086f45ec7bSml29623 switch (ctlop) {
2096f45ec7bSml29623 case NXGE_CTLOPS_NIUTYPE:
2106f45ec7bSml29623 nxge_get_niu_property(dip, (niu_type_t *)result);
2116f45ec7bSml29623 return (status);
2126f45ec7bSml29623
2136f45ec7bSml29623 case NXGE_CTLOPS_GET_SHARED_REG:
2146f45ec7bSml29623 #ifdef NXGE_SHARED_REG_SW_SIM
2156f45ec7bSml29623 *(uint64_t *)result = global_dev_ctrl;
2166f45ec7bSml29623 return (0);
2176f45ec7bSml29623 #else
2186f45ec7bSml29623 status = npi_dev_func_sr_sr_get(handle, &sr16);
2196f45ec7bSml29623 *(uint16_t *)result = sr16;
2206f45ec7bSml29623 NXGE_DEBUG_MSG((NULL, VIR_CTL,
2216f45ec7bSml29623 "nxge_cntlops: NXGE_CTLOPS_GET_SHARED_REG"));
2226f45ec7bSml29623 return (0);
2236f45ec7bSml29623 #endif
2246f45ec7bSml29623
2256f45ec7bSml29623 case NXGE_CTLOPS_SET_SHARED_REG_LOCK:
2266f45ec7bSml29623 #ifdef NXGE_SHARED_REG_SW_SIM
2276f45ec7bSml29623 global_dev_ctrl = *(uint64_t *)arg;
2286f45ec7bSml29623 return (0);
2296f45ec7bSml29623 #else
2306f45ec7bSml29623 status = NPI_FAILURE;
2316f45ec7bSml29623 while (status != NPI_SUCCESS)
2326f45ec7bSml29623 status = npi_dev_func_sr_lock_enter(handle);
2336f45ec7bSml29623
2346f45ec7bSml29623 sr16 = *(uint16_t *)arg;
2356f45ec7bSml29623 status = npi_dev_func_sr_sr_set_only(handle, &sr16);
2366f45ec7bSml29623 status = npi_dev_func_sr_lock_free(handle);
2376f45ec7bSml29623 NXGE_DEBUG_MSG((NULL, VIR_CTL,
2386f45ec7bSml29623 "nxge_cntlops: NXGE_CTLOPS_SET_SHARED_REG"));
2396f45ec7bSml29623 return (0);
2406f45ec7bSml29623 #endif
2416f45ec7bSml29623
2426f45ec7bSml29623 case NXGE_CTLOPS_UPDATE_SHARED_REG:
2436f45ec7bSml29623 #ifdef NXGE_SHARED_REG_SW_SIM
2446f45ec7bSml29623 global_dev_ctrl |= *(uint64_t *)arg;
2456f45ec7bSml29623 return (0);
2466f45ec7bSml29623 #else
2476f45ec7bSml29623 status = NPI_FAILURE;
2486f45ec7bSml29623 while (status != NPI_SUCCESS)
2496f45ec7bSml29623 status = npi_dev_func_sr_lock_enter(handle);
2506f45ec7bSml29623 status = npi_dev_func_sr_sr_get(handle, &sr16);
2516f45ec7bSml29623 sr16 |= *(uint16_t *)arg;
2526f45ec7bSml29623 status = npi_dev_func_sr_sr_set_only(handle, &sr16);
2536f45ec7bSml29623 status = npi_dev_func_sr_lock_free(handle);
2546f45ec7bSml29623 NXGE_DEBUG_MSG((NULL, VIR_CTL,
2556f45ec7bSml29623 "nxge_cntlops: NXGE_CTLOPS_SET_SHARED_REG"));
2566f45ec7bSml29623 return (0);
2576f45ec7bSml29623 #endif
2586f45ec7bSml29623
2596f45ec7bSml29623 case NXGE_CTLOPS_CLEAR_BIT_SHARED_REG_UL:
2606f45ec7bSml29623 #ifdef NXGE_SHARED_REG_SW_SIM
2616f45ec7bSml29623 global_dev_ctrl |= *(uint64_t *)arg;
2626f45ec7bSml29623 return (0);
2636f45ec7bSml29623 #else
2646f45ec7bSml29623 status = npi_dev_func_sr_sr_get(handle, &sr16);
2656f45ec7bSml29623 cr16 = *(uint16_t *)arg;
2666f45ec7bSml29623 sr16 &= ~cr16;
2676f45ec7bSml29623 status = npi_dev_func_sr_sr_set_only(handle, &sr16);
2686f45ec7bSml29623 NXGE_DEBUG_MSG((NULL, VIR_CTL,
2696f45ec7bSml29623 "nxge_cntlops: NXGE_CTLOPS_SET_SHARED_REG"));
2706f45ec7bSml29623 return (0);
2716f45ec7bSml29623 #endif
2726f45ec7bSml29623
2736f45ec7bSml29623 case NXGE_CTLOPS_CLEAR_BIT_SHARED_REG:
2746f45ec7bSml29623 #ifdef NXGE_SHARED_REG_SW_SIM
2756f45ec7bSml29623 global_dev_ctrl |= *(uint64_t *)arg;
2766f45ec7bSml29623 return (0);
2776f45ec7bSml29623 #else
2786f45ec7bSml29623 status = NPI_FAILURE;
2796f45ec7bSml29623 while (status != NPI_SUCCESS)
2806f45ec7bSml29623 status = npi_dev_func_sr_lock_enter(handle);
2816f45ec7bSml29623 status = npi_dev_func_sr_sr_get(handle, &sr16);
2826f45ec7bSml29623 cr16 = *(uint16_t *)arg;
2836f45ec7bSml29623 sr16 &= ~cr16;
2846f45ec7bSml29623 status = npi_dev_func_sr_sr_set_only(handle, &sr16);
2856f45ec7bSml29623 status = npi_dev_func_sr_lock_free(handle);
2866f45ec7bSml29623 NXGE_DEBUG_MSG((NULL, VIR_CTL,
2876f45ec7bSml29623 "nxge_cntlops: NXGE_CTLOPS_SET_SHARED_REG"));
2886f45ec7bSml29623 return (0);
2896f45ec7bSml29623 #endif
2906f45ec7bSml29623
2916f45ec7bSml29623 case NXGE_CTLOPS_GET_LOCK_BLOCK:
2926f45ec7bSml29623 #ifdef NXGE_SHARED_REG_SW_SIM
2936f45ec7bSml29623 global_dev_ctrl |= *(uint64_t *)arg;
2946f45ec7bSml29623 return (0);
2956f45ec7bSml29623 #else
2966f45ec7bSml29623 status = NPI_FAILURE;
2976f45ec7bSml29623 while (status != NPI_SUCCESS)
2986f45ec7bSml29623 status = npi_dev_func_sr_lock_enter(handle);
2996f45ec7bSml29623 NXGE_DEBUG_MSG((NULL, VIR_CTL,
3006f45ec7bSml29623 "nxge_cntlops: NXGE_CTLOPS_GET_LOCK_BLOCK"));
3016f45ec7bSml29623 return (0);
3026f45ec7bSml29623 #endif
3036f45ec7bSml29623 case NXGE_CTLOPS_GET_LOCK_TRY:
3046f45ec7bSml29623 #ifdef NXGE_SHARED_REG_SW_SIM
3056f45ec7bSml29623 global_dev_ctrl |= *(uint64_t *)arg;
3066f45ec7bSml29623 return (0);
3076f45ec7bSml29623 #else
3086f45ec7bSml29623 status = npi_dev_func_sr_lock_enter(handle);
3096f45ec7bSml29623 NXGE_DEBUG_MSG((NULL, VIR_CTL,
3106f45ec7bSml29623 "nxge_cntlops: NXGE_CTLOPS_GET_LOCK_TRY"));
3116f45ec7bSml29623 if (status == NPI_SUCCESS)
3126f45ec7bSml29623 return (NXGE_OK);
3136f45ec7bSml29623 else
3146f45ec7bSml29623 return (NXGE_ERROR);
3156f45ec7bSml29623 #endif
3166f45ec7bSml29623 case NXGE_CTLOPS_FREE_LOCK:
3176f45ec7bSml29623 #ifdef NXGE_SHARED_REG_SW_SIM
3186f45ec7bSml29623 global_dev_ctrl |= *(uint64_t *)arg;
3196f45ec7bSml29623 return (0);
3206f45ec7bSml29623 #else
3216f45ec7bSml29623 status = npi_dev_func_sr_lock_free(handle);
3226f45ec7bSml29623 NXGE_DEBUG_MSG((NULL, VIR_CTL,
3236f45ec7bSml29623 "nxge_cntlops: NXGE_CTLOPS_GET_LOCK_FREE"));
3246f45ec7bSml29623 if (status == NPI_SUCCESS)
3256f45ec7bSml29623 return (NXGE_OK);
3266f45ec7bSml29623 else
3276f45ec7bSml29623 return (NXGE_ERROR);
3286f45ec7bSml29623 #endif
3296f45ec7bSml29623
3306f45ec7bSml29623 default:
3316f45ec7bSml29623 status = NXGE_ERROR;
3326f45ec7bSml29623 }
3336f45ec7bSml29623
3346f45ec7bSml29623 return (status);
3356f45ec7bSml29623 }
3366f45ec7bSml29623
3376f45ec7bSml29623 void
nxge_common_lock_get(p_nxge_t nxgep)3386f45ec7bSml29623 nxge_common_lock_get(p_nxge_t nxgep)
3396f45ec7bSml29623 {
3406f45ec7bSml29623 uint32_t status = NPI_FAILURE;
3416f45ec7bSml29623 npi_handle_t handle;
3426f45ec7bSml29623
3436f45ec7bSml29623 #if defined(NXGE_SHARE_REG_SW_SIM)
3446f45ec7bSml29623 return;
3456f45ec7bSml29623 #endif
3466f45ec7bSml29623 handle = nxgep->npi_reg_handle;
3476f45ec7bSml29623 while (status != NPI_SUCCESS)
3486f45ec7bSml29623 status = npi_dev_func_sr_lock_enter(handle);
3496f45ec7bSml29623 }
3506f45ec7bSml29623
3516f45ec7bSml29623 void
nxge_common_lock_free(p_nxge_t nxgep)3526f45ec7bSml29623 nxge_common_lock_free(p_nxge_t nxgep)
3536f45ec7bSml29623 {
3546f45ec7bSml29623 npi_handle_t handle;
3556f45ec7bSml29623
3566f45ec7bSml29623 #if defined(NXGE_SHARE_REG_SW_SIM)
3576f45ec7bSml29623 return;
3586f45ec7bSml29623 #endif
3596f45ec7bSml29623 handle = nxgep->npi_reg_handle;
3606f45ec7bSml29623 (void) npi_dev_func_sr_lock_free(handle);
3616f45ec7bSml29623 }
3626f45ec7bSml29623
36356d930aeSspeer
3646f45ec7bSml29623 static void
nxge_get_niu_property(dev_info_t * dip,niu_type_t * niu_type)3656f45ec7bSml29623 nxge_get_niu_property(dev_info_t *dip, niu_type_t *niu_type)
3666f45ec7bSml29623 {
3676f45ec7bSml29623 uchar_t *prop_val;
3686f45ec7bSml29623 uint_t prop_len;
3696f45ec7bSml29623
37059ac0c16Sdavemq *niu_type = NIU_TYPE_NONE;
3716f45ec7bSml29623 if (ddi_prop_lookup_byte_array(DDI_DEV_T_ANY, dip, 0,
3726f45ec7bSml29623 "niu-type", (uchar_t **)&prop_val,
3736f45ec7bSml29623 &prop_len) == DDI_PROP_SUCCESS) {
3746f45ec7bSml29623 if (strncmp("niu", (caddr_t)prop_val, (size_t)prop_len) == 0) {
3756f45ec7bSml29623 *niu_type = N2_NIU;
3766f45ec7bSml29623 }
3776f45ec7bSml29623 ddi_prop_free(prop_val);
3786f45ec7bSml29623 }
3796f45ec7bSml29623 }
3806f45ec7bSml29623
3816f45ec7bSml29623 static config_token_t
nxge_get_config_token(char * prop)3826f45ec7bSml29623 nxge_get_config_token(char *prop)
3836f45ec7bSml29623 {
3846f45ec7bSml29623 config_token_t token = DEFAULT;
3856f45ec7bSml29623
3866f45ec7bSml29623 while (token < CONFIG_TOKEN_NONE) {
3876f45ec7bSml29623 if (strncmp(prop, token_names[token], 4) == 0)
3886f45ec7bSml29623 break;
3896f45ec7bSml29623 token++;
3906f45ec7bSml29623 }
3916f45ec7bSml29623 return (token);
3926f45ec7bSml29623 }
3936f45ec7bSml29623
3946f45ec7bSml29623 /* per port */
3956f45ec7bSml29623
3966f45ec7bSml29623 static nxge_status_t
nxge_update_rxdma_grp_properties(p_nxge_t nxgep,config_token_t token,dev_info_t * s_dip[])3976f45ec7bSml29623 nxge_update_rxdma_grp_properties(p_nxge_t nxgep, config_token_t token,
3986f45ec7bSml29623 dev_info_t *s_dip[])
3996f45ec7bSml29623 {
4006f45ec7bSml29623 nxge_status_t status = NXGE_OK;
4016f45ec7bSml29623 int ddi_status;
4026f45ec7bSml29623 int num_ports = nxgep->nports;
4036f45ec7bSml29623 int port, bits, j;
4046f45ec7bSml29623 uint8_t start_grp = 0, num_grps = 0;
4056f45ec7bSml29623 p_nxge_param_t param_arr;
4066f45ec7bSml29623 uint32_t grp_bitmap[MAX_SIBLINGS];
4076f45ec7bSml29623 int custom_start_grp[MAX_SIBLINGS];
4086f45ec7bSml29623 int custom_num_grp[MAX_SIBLINGS];
4096f45ec7bSml29623 uint8_t bad_config = B_FALSE;
4106f45ec7bSml29623 char *start_prop, *num_prop, *cfg_prop;
4116f45ec7bSml29623
4126f45ec7bSml29623 start_grp = 0;
4136f45ec7bSml29623 param_arr = nxgep->param_arr;
4146f45ec7bSml29623 start_prop = param_arr[param_rdc_grps_start].fcode_name;
4156f45ec7bSml29623 num_prop = param_arr[param_rx_rdc_grps].fcode_name;
4166f45ec7bSml29623
4176f45ec7bSml29623 switch (token) {
4186f45ec7bSml29623 case FAIR:
4196f45ec7bSml29623 cfg_prop = "fair";
4206f45ec7bSml29623 for (port = 0; port < num_ports; port++) {
4216f45ec7bSml29623 custom_num_grp[port] =
4226f45ec7bSml29623 (num_ports == 4) ?
4236f45ec7bSml29623 p4_rdcgrp_fair[port] :
4246f45ec7bSml29623 p2_rdcgrp_fair[port];
4256f45ec7bSml29623 custom_start_grp[port] = start_grp;
4266f45ec7bSml29623 start_grp += custom_num_grp[port];
4276f45ec7bSml29623 }
4286f45ec7bSml29623 break;
4296f45ec7bSml29623
4306f45ec7bSml29623 case EQUAL:
4316f45ec7bSml29623 cfg_prop = "equal";
4326f45ec7bSml29623 for (port = 0; port < num_ports; port++) {
4336f45ec7bSml29623 custom_num_grp[port] =
4346f45ec7bSml29623 (num_ports == 4) ?
4356f45ec7bSml29623 p4_rdcgrp_equal[port] :
4366f45ec7bSml29623 p2_rdcgrp_equal[port];
4376f45ec7bSml29623 custom_start_grp[port] = start_grp;
4386f45ec7bSml29623 start_grp += custom_num_grp[port];
4396f45ec7bSml29623 }
4406f45ec7bSml29623 break;
4416f45ec7bSml29623
4426f45ec7bSml29623
4436f45ec7bSml29623 case CLASSIFY:
4446f45ec7bSml29623 cfg_prop = "classify";
4456f45ec7bSml29623 for (port = 0; port < num_ports; port++) {
4466f45ec7bSml29623 custom_num_grp[port] = (num_ports == 4) ?
4476f45ec7bSml29623 p4_rdcgrp_cls[port] : p2_rdcgrp_cls[port];
4486f45ec7bSml29623 custom_start_grp[port] = start_grp;
4496f45ec7bSml29623 start_grp += custom_num_grp[port];
4506f45ec7bSml29623 }
4516f45ec7bSml29623 break;
4526f45ec7bSml29623
4536f45ec7bSml29623 case CUSTOM:
4546f45ec7bSml29623 cfg_prop = "custom";
4556f45ec7bSml29623 /* See if it is good config */
4566f45ec7bSml29623 num_grps = 0;
4576f45ec7bSml29623 for (port = 0; port < num_ports; port++) {
4586f45ec7bSml29623 custom_start_grp[port] =
4596f45ec7bSml29623 ddi_prop_get_int(DDI_DEV_T_NONE, s_dip[port],
4606f45ec7bSml29623 DDI_PROP_DONTPASS, start_prop, -1);
4616f45ec7bSml29623 if ((custom_start_grp[port] == -1) ||
4626f45ec7bSml29623 (custom_start_grp[port] >=
4636f45ec7bSml29623 NXGE_MAX_RDC_GRPS)) {
4646f45ec7bSml29623 bad_config = B_TRUE;
4656f45ec7bSml29623 break;
4666f45ec7bSml29623 }
4676f45ec7bSml29623 custom_num_grp[port] = ddi_prop_get_int(
4686f45ec7bSml29623 DDI_DEV_T_NONE,
4696f45ec7bSml29623 s_dip[port],
4706f45ec7bSml29623 DDI_PROP_DONTPASS,
4716f45ec7bSml29623 num_prop, -1);
4726f45ec7bSml29623
4736f45ec7bSml29623 if ((custom_num_grp[port] == -1) ||
4746f45ec7bSml29623 (custom_num_grp[port] >
4756f45ec7bSml29623 NXGE_MAX_RDC_GRPS) ||
4766f45ec7bSml29623 ((custom_num_grp[port] +
4776f45ec7bSml29623 custom_start_grp[port]) >=
4786f45ec7bSml29623 NXGE_MAX_RDC_GRPS)) {
4796f45ec7bSml29623 bad_config = B_TRUE;
4806f45ec7bSml29623 break;
4816f45ec7bSml29623 }
4826f45ec7bSml29623 num_grps += custom_num_grp[port];
4836f45ec7bSml29623 if (num_grps > NXGE_MAX_RDC_GRPS) {
4846f45ec7bSml29623 bad_config = B_TRUE;
4856f45ec7bSml29623 break;
4866f45ec7bSml29623 }
4876f45ec7bSml29623 grp_bitmap[port] = 0;
4886f45ec7bSml29623 for (bits = 0;
4896f45ec7bSml29623 bits < custom_num_grp[port];
4906f45ec7bSml29623 bits++) {
4916f45ec7bSml29623 grp_bitmap[port] |=
4926f45ec7bSml29623 (1 << (bits + custom_start_grp[port]));
4936f45ec7bSml29623 }
4946f45ec7bSml29623
4956f45ec7bSml29623 }
4966f45ec7bSml29623
4976f45ec7bSml29623 if (bad_config == B_FALSE) {
4986f45ec7bSml29623 /* check for overlap */
4996f45ec7bSml29623 for (port = 0; port < num_ports - 1; port++) {
5006f45ec7bSml29623 for (j = port + 1; j < num_ports; j++) {
5016f45ec7bSml29623 if (grp_bitmap[port] &
5026f45ec7bSml29623 grp_bitmap[j]) {
5036f45ec7bSml29623 bad_config = B_TRUE;
5046f45ec7bSml29623 break;
5056f45ec7bSml29623 }
5066f45ec7bSml29623 }
5076f45ec7bSml29623 if (bad_config == B_TRUE)
5086f45ec7bSml29623 break;
5096f45ec7bSml29623 }
5106f45ec7bSml29623 }
5116f45ec7bSml29623 if (bad_config == B_TRUE) {
5126f45ec7bSml29623 /* use default config */
5136f45ec7bSml29623 for (port = 0; port < num_ports; port++) {
5146f45ec7bSml29623 custom_num_grp[port] =
5156f45ec7bSml29623 (num_ports == 4) ?
5166f45ec7bSml29623 p4_rx_fair[port] : p2_rx_fair[port];
5176f45ec7bSml29623 custom_start_grp[port] = start_grp;
5186f45ec7bSml29623 start_grp += custom_num_grp[port];
5196f45ec7bSml29623 }
5206f45ec7bSml29623 }
5216f45ec7bSml29623 break;
5226f45ec7bSml29623
5236f45ec7bSml29623 default:
5246f45ec7bSml29623 /* use default config */
5256f45ec7bSml29623 cfg_prop = "fair";
5266f45ec7bSml29623 for (port = 0; port < num_ports; port++) {
5276f45ec7bSml29623 custom_num_grp[port] = (num_ports == 4) ?
5286f45ec7bSml29623 p4_rx_fair[port] : p2_rx_fair[port];
5296f45ec7bSml29623 custom_start_grp[port] = start_grp;
5306f45ec7bSml29623 start_grp += custom_num_grp[port];
5316f45ec7bSml29623 }
5326f45ec7bSml29623 break;
5336f45ec7bSml29623 }
5346f45ec7bSml29623
5356f45ec7bSml29623 /* Now Update the rx properties */
5366f45ec7bSml29623 for (port = 0; port < num_ports; port++) {
5376f45ec7bSml29623 ddi_status = ddi_prop_update_string(DDI_DEV_T_NONE, s_dip[port],
5386f45ec7bSml29623 "rxdma-grp-cfg", cfg_prop);
5396f45ec7bSml29623 if (ddi_status != DDI_PROP_SUCCESS) {
5406f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
5416f45ec7bSml29623 " property %s not updating",
5426f45ec7bSml29623 cfg_prop));
5436f45ec7bSml29623 status |= NXGE_DDI_FAILED;
5446f45ec7bSml29623 }
5456f45ec7bSml29623 ddi_status = ddi_prop_update_int(DDI_DEV_T_NONE, s_dip[port],
5466f45ec7bSml29623 num_prop, custom_num_grp[port]);
5476f45ec7bSml29623
5486f45ec7bSml29623 if (ddi_status != DDI_PROP_SUCCESS) {
5496f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
5506f45ec7bSml29623 " property %s not updating",
5516f45ec7bSml29623 num_prop));
5526f45ec7bSml29623 status |= NXGE_DDI_FAILED;
5536f45ec7bSml29623 }
5546f45ec7bSml29623 ddi_status = ddi_prop_update_int(DDI_DEV_T_NONE, s_dip[port],
5556f45ec7bSml29623 start_prop, custom_start_grp[port]);
5566f45ec7bSml29623
5576f45ec7bSml29623 if (ddi_status != DDI_PROP_SUCCESS) {
5586f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
5596f45ec7bSml29623 " property %s not updating",
5606f45ec7bSml29623 start_prop));
5616f45ec7bSml29623 status |= NXGE_DDI_FAILED;
5626f45ec7bSml29623 }
5636f45ec7bSml29623 }
5646f45ec7bSml29623 if (status & NXGE_DDI_FAILED)
5656f45ec7bSml29623 status |= NXGE_ERROR;
5666f45ec7bSml29623
5676f45ec7bSml29623 return (status);
5686f45ec7bSml29623 }
5696f45ec7bSml29623
5706f45ec7bSml29623 static nxge_status_t
nxge_update_rxdma_properties(p_nxge_t nxgep,config_token_t token,dev_info_t * s_dip[])5716f45ec7bSml29623 nxge_update_rxdma_properties(p_nxge_t nxgep, config_token_t token,
5726f45ec7bSml29623 dev_info_t *s_dip[])
5736f45ec7bSml29623 {
5746f45ec7bSml29623 nxge_status_t status = NXGE_OK;
5756f45ec7bSml29623 int ddi_status;
5766f45ec7bSml29623 int num_ports = nxgep->nports;
5776f45ec7bSml29623 int port, bits, j;
5786f45ec7bSml29623 uint8_t start_rdc = 0, num_rdc = 0;
5796f45ec7bSml29623 p_nxge_param_t param_arr;
5806f45ec7bSml29623 uint32_t rdc_bitmap[MAX_SIBLINGS];
5816f45ec7bSml29623 int custom_start_rdc[MAX_SIBLINGS];
5826f45ec7bSml29623 int custom_num_rdc[MAX_SIBLINGS];
5836f45ec7bSml29623 uint8_t bad_config = B_FALSE;
5846f45ec7bSml29623 int *prop_val;
5856f45ec7bSml29623 uint_t prop_len;
5866f45ec7bSml29623 char *start_rdc_prop, *num_rdc_prop, *cfg_prop;
5876f45ec7bSml29623
5886f45ec7bSml29623 start_rdc = 0;
5896f45ec7bSml29623 param_arr = nxgep->param_arr;
5906f45ec7bSml29623 start_rdc_prop = param_arr[param_rxdma_channels_begin].fcode_name;
5916f45ec7bSml29623 num_rdc_prop = param_arr[param_rxdma_channels].fcode_name;
5926f45ec7bSml29623
5936f45ec7bSml29623 switch (token) {
5946f45ec7bSml29623 case FAIR:
5956f45ec7bSml29623 cfg_prop = "fair";
5966f45ec7bSml29623 for (port = 0; port < num_ports; port++) {
5976f45ec7bSml29623 custom_num_rdc[port] = (num_ports == 4) ?
5986f45ec7bSml29623 p4_rx_fair[port] : p2_rx_fair[port];
5996f45ec7bSml29623 custom_start_rdc[port] = start_rdc;
6006f45ec7bSml29623 start_rdc += custom_num_rdc[port];
6016f45ec7bSml29623 }
6026f45ec7bSml29623 break;
6036f45ec7bSml29623
6046f45ec7bSml29623 case EQUAL:
6056f45ec7bSml29623 cfg_prop = "equal";
6066f45ec7bSml29623 for (port = 0; port < num_ports; port++) {
6076f45ec7bSml29623 custom_num_rdc[port] = (num_ports == 4) ?
6086f45ec7bSml29623 p4_rx_equal[port] :
6096f45ec7bSml29623 p2_rx_equal[port];
6106f45ec7bSml29623 custom_start_rdc[port] = start_rdc;
6116f45ec7bSml29623 start_rdc += custom_num_rdc[port];
6126f45ec7bSml29623 }
6136f45ec7bSml29623 break;
6146f45ec7bSml29623
6156f45ec7bSml29623 case CUSTOM:
6166f45ec7bSml29623 cfg_prop = "custom";
6176f45ec7bSml29623 /* See if it is good config */
6186f45ec7bSml29623 num_rdc = 0;
6196f45ec7bSml29623 for (port = 0; port < num_ports; port++) {
6206f45ec7bSml29623 ddi_status = ddi_prop_lookup_int_array(
6216f45ec7bSml29623 DDI_DEV_T_ANY,
6226f45ec7bSml29623 s_dip[port], 0,
6236f45ec7bSml29623 start_rdc_prop,
6246f45ec7bSml29623 &prop_val,
6256f45ec7bSml29623 &prop_len);
6266f45ec7bSml29623 if (ddi_status == DDI_SUCCESS)
6276f45ec7bSml29623 custom_start_rdc[port] = *prop_val;
6286f45ec7bSml29623 else {
6296f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL,
6306f45ec7bSml29623 " %s custom start port %d"
6316f45ec7bSml29623 " read failed ",
6326f45ec7bSml29623 " rxdma-cfg", port));
6336f45ec7bSml29623 bad_config = B_TRUE;
6346f45ec7bSml29623 status |= NXGE_DDI_FAILED;
6356f45ec7bSml29623 }
6366f45ec7bSml29623 if ((custom_start_rdc[port] == -1) ||
6376f45ec7bSml29623 (custom_start_rdc[port] >=
6386f45ec7bSml29623 NXGE_MAX_RDCS)) {
6396f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL,
6406f45ec7bSml29623 " %s custom start %d"
6416f45ec7bSml29623 " out of range %x ",
6426f45ec7bSml29623 " rxdma-cfg",
6436f45ec7bSml29623 port,
6446f45ec7bSml29623 custom_start_rdc[port]));
6456f45ec7bSml29623 bad_config = B_TRUE;
6466f45ec7bSml29623 break;
6476f45ec7bSml29623 }
6486f45ec7bSml29623 ddi_status = ddi_prop_lookup_int_array(
6496f45ec7bSml29623 DDI_DEV_T_ANY,
6506f45ec7bSml29623 s_dip[port],
6516f45ec7bSml29623 0,
6526f45ec7bSml29623 num_rdc_prop,
6536f45ec7bSml29623 &prop_val,
6546f45ec7bSml29623 &prop_len);
6556f45ec7bSml29623
6566f45ec7bSml29623 if (ddi_status == DDI_SUCCESS)
6576f45ec7bSml29623 custom_num_rdc[port] = *prop_val;
6586f45ec7bSml29623 else {
6596f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL,
6606f45ec7bSml29623 " %s custom num port %d"
6616f45ec7bSml29623 " read failed ",
6626f45ec7bSml29623 "rxdma-cfg", port));
6636f45ec7bSml29623 bad_config = B_TRUE;
6646f45ec7bSml29623 status |= NXGE_DDI_FAILED;
6656f45ec7bSml29623 }
6666f45ec7bSml29623
6676f45ec7bSml29623 if ((custom_num_rdc[port] == -1) ||
6686f45ec7bSml29623 (custom_num_rdc[port] >
6696f45ec7bSml29623 NXGE_MAX_RDCS) ||
6706f45ec7bSml29623 ((custom_num_rdc[port] +
6716f45ec7bSml29623 custom_start_rdc[port]) >
6726f45ec7bSml29623 NXGE_MAX_RDCS)) {
6736f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL,
6746f45ec7bSml29623 " %s custom num %d"
6756f45ec7bSml29623 " out of range %x ",
6766f45ec7bSml29623 " rxdma-cfg",
6776f45ec7bSml29623 port, custom_num_rdc[port]));
6786f45ec7bSml29623 bad_config = B_TRUE;
6796f45ec7bSml29623 break;
6806f45ec7bSml29623 }
6816f45ec7bSml29623 num_rdc += custom_num_rdc[port];
6826f45ec7bSml29623 if (num_rdc > NXGE_MAX_RDCS) {
6836f45ec7bSml29623 bad_config = B_TRUE;
6846f45ec7bSml29623 break;
6856f45ec7bSml29623 }
6866f45ec7bSml29623 rdc_bitmap[port] = 0;
6876f45ec7bSml29623 for (bits = 0;
6886f45ec7bSml29623 bits < custom_num_rdc[port]; bits++) {
6896f45ec7bSml29623 rdc_bitmap[port] |=
6906f45ec7bSml29623 (1 << (bits + custom_start_rdc[port]));
6916f45ec7bSml29623 }
6926f45ec7bSml29623 }
6936f45ec7bSml29623
6946f45ec7bSml29623 if (bad_config == B_FALSE) {
6956f45ec7bSml29623 /* check for overlap */
6966f45ec7bSml29623 for (port = 0; port < num_ports - 1; port++) {
6976f45ec7bSml29623 for (j = port + 1; j < num_ports; j++) {
6986f45ec7bSml29623 if (rdc_bitmap[port] &
6996f45ec7bSml29623 rdc_bitmap[j]) {
7006f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep,
7016f45ec7bSml29623 CFG_CTL,
7026f45ec7bSml29623 " rxdma-cfg"
7036f45ec7bSml29623 " property custom"
7046f45ec7bSml29623 " bit overlap"
7056f45ec7bSml29623 " %d %d ",
7066f45ec7bSml29623 port, j));
7076f45ec7bSml29623 bad_config = B_TRUE;
7086f45ec7bSml29623 break;
7096f45ec7bSml29623 }
7106f45ec7bSml29623 }
7116f45ec7bSml29623 if (bad_config == B_TRUE)
7126f45ec7bSml29623 break;
7136f45ec7bSml29623 }
7146f45ec7bSml29623 }
7156f45ec7bSml29623 if (bad_config == B_TRUE) {
7166f45ec7bSml29623 /* use default config */
7176f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL,
7186f45ec7bSml29623 " rxdma-cfg property:"
7196f45ec7bSml29623 " bad custom config:"
7206f45ec7bSml29623 " use default"));
7216f45ec7bSml29623 for (port = 0; port < num_ports; port++) {
7226f45ec7bSml29623 custom_num_rdc[port] =
7236f45ec7bSml29623 (num_ports == 4) ?
7246f45ec7bSml29623 p4_rx_fair[port] :
7256f45ec7bSml29623 p2_rx_fair[port];
7266f45ec7bSml29623 custom_start_rdc[port] = start_rdc;
7276f45ec7bSml29623 start_rdc += custom_num_rdc[port];
7286f45ec7bSml29623 }
7296f45ec7bSml29623 }
7306f45ec7bSml29623 break;
7316f45ec7bSml29623
7326f45ec7bSml29623 default:
7336f45ec7bSml29623 /* use default config */
7346f45ec7bSml29623 cfg_prop = "fair";
7356f45ec7bSml29623 for (port = 0; port < num_ports; port++) {
7366f45ec7bSml29623 custom_num_rdc[port] = (num_ports == 4) ?
7376f45ec7bSml29623 p4_rx_fair[port] : p2_rx_fair[port];
7386f45ec7bSml29623 custom_start_rdc[port] = start_rdc;
7396f45ec7bSml29623 start_rdc += custom_num_rdc[port];
7406f45ec7bSml29623 }
7416f45ec7bSml29623 break;
7426f45ec7bSml29623 }
7436f45ec7bSml29623
7446f45ec7bSml29623 /* Now Update the rx properties */
7456f45ec7bSml29623 for (port = 0; port < num_ports; port++) {
7466f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL,
7476f45ec7bSml29623 " update property rxdma-cfg with %s ", cfg_prop));
7486f45ec7bSml29623 ddi_status = ddi_prop_update_string(DDI_DEV_T_NONE, s_dip[port],
7496f45ec7bSml29623 "rxdma-cfg", cfg_prop);
7506f45ec7bSml29623 if (ddi_status != DDI_PROP_SUCCESS) {
7516f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL,
7526f45ec7bSml29623 " property rxdma-cfg is not updating to %s",
7536f45ec7bSml29623 cfg_prop));
7546f45ec7bSml29623 status |= NXGE_DDI_FAILED;
7556f45ec7bSml29623 }
7566f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL, " update property %s with %d ",
7576f45ec7bSml29623 num_rdc_prop, custom_num_rdc[port]));
7586f45ec7bSml29623
7596f45ec7bSml29623 ddi_status = ddi_prop_update_int(DDI_DEV_T_NONE, s_dip[port],
7606f45ec7bSml29623 num_rdc_prop, custom_num_rdc[port]);
7616f45ec7bSml29623
7626f45ec7bSml29623 if (ddi_status != DDI_PROP_SUCCESS) {
7636f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
7646f45ec7bSml29623 " property %s not updating with %d",
7656f45ec7bSml29623 num_rdc_prop, custom_num_rdc[port]));
7666f45ec7bSml29623 status |= NXGE_DDI_FAILED;
7676f45ec7bSml29623 }
7686f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL, " update property %s with %d ",
7696f45ec7bSml29623 start_rdc_prop, custom_start_rdc[port]));
7706f45ec7bSml29623 ddi_status = ddi_prop_update_int(DDI_DEV_T_NONE, s_dip[port],
7716f45ec7bSml29623 start_rdc_prop, custom_start_rdc[port]);
7726f45ec7bSml29623
7736f45ec7bSml29623 if (ddi_status != DDI_PROP_SUCCESS) {
7746f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
7756f45ec7bSml29623 " property %s not updating with %d ",
7766f45ec7bSml29623 start_rdc_prop, custom_start_rdc[port]));
7776f45ec7bSml29623 status |= NXGE_DDI_FAILED;
7786f45ec7bSml29623 }
7796f45ec7bSml29623 }
7806f45ec7bSml29623 if (status & NXGE_DDI_FAILED)
7816f45ec7bSml29623 status |= NXGE_ERROR;
7826f45ec7bSml29623 return (status);
7836f45ec7bSml29623 }
7846f45ec7bSml29623
7856f45ec7bSml29623 static nxge_status_t
nxge_update_txdma_properties(p_nxge_t nxgep,config_token_t token,dev_info_t * s_dip[])7866f45ec7bSml29623 nxge_update_txdma_properties(p_nxge_t nxgep, config_token_t token,
7876f45ec7bSml29623 dev_info_t *s_dip[])
7886f45ec7bSml29623 {
7896f45ec7bSml29623 nxge_status_t status = NXGE_OK;
7906f45ec7bSml29623 int ddi_status = DDI_SUCCESS;
7916f45ec7bSml29623 int num_ports = nxgep->nports;
7926f45ec7bSml29623 int port, bits, j;
793da14cebeSEric Cheng uint8_t start_tdc, num_tdc = 0;
7946f45ec7bSml29623 p_nxge_param_t param_arr;
7956f45ec7bSml29623 uint32_t tdc_bitmap[MAX_SIBLINGS];
7966f45ec7bSml29623 int custom_start_tdc[MAX_SIBLINGS];
7976f45ec7bSml29623 int custom_num_tdc[MAX_SIBLINGS];
7986f45ec7bSml29623 uint8_t bad_config = B_FALSE;
7996f45ec7bSml29623 int *prop_val;
8006f45ec7bSml29623 uint_t prop_len;
8016f45ec7bSml29623 char *start_tdc_prop, *num_tdc_prop, *cfg_prop;
8026f45ec7bSml29623
8036f45ec7bSml29623 start_tdc = 0;
8046f45ec7bSml29623 param_arr = nxgep->param_arr;
8056f45ec7bSml29623 start_tdc_prop = param_arr[param_txdma_channels_begin].fcode_name;
8066f45ec7bSml29623 num_tdc_prop = param_arr[param_txdma_channels].fcode_name;
8076f45ec7bSml29623
8086f45ec7bSml29623 switch (token) {
8096f45ec7bSml29623 case FAIR:
8106f45ec7bSml29623 cfg_prop = "fair";
8116f45ec7bSml29623 for (port = 0; port < num_ports; port++) {
8126f45ec7bSml29623 custom_num_tdc[port] = (num_ports == 4) ?
8136f45ec7bSml29623 p4_tx_fair[port] : p2_tx_fair[port];
8146f45ec7bSml29623 custom_start_tdc[port] = start_tdc;
8156f45ec7bSml29623 start_tdc += custom_num_tdc[port];
8166f45ec7bSml29623 }
8176f45ec7bSml29623 break;
8186f45ec7bSml29623
8196f45ec7bSml29623 case EQUAL:
8206f45ec7bSml29623 cfg_prop = "equal";
8216f45ec7bSml29623 for (port = 0; port < num_ports; port++) {
8226f45ec7bSml29623 custom_num_tdc[port] = (num_ports == 4) ?
8236f45ec7bSml29623 p4_tx_equal[port] : p2_tx_equal[port];
8246f45ec7bSml29623 custom_start_tdc[port] = start_tdc;
8256f45ec7bSml29623 start_tdc += custom_num_tdc[port];
8266f45ec7bSml29623 }
8276f45ec7bSml29623 break;
8286f45ec7bSml29623
8296f45ec7bSml29623 case CUSTOM:
8306f45ec7bSml29623 cfg_prop = "custom";
8316f45ec7bSml29623 /* See if it is good config */
8326f45ec7bSml29623 num_tdc = 0;
8336f45ec7bSml29623 for (port = 0; port < num_ports; port++) {
8346f45ec7bSml29623 ddi_status = ddi_prop_lookup_int_array(
8356f45ec7bSml29623 DDI_DEV_T_ANY, s_dip[port], 0, start_tdc_prop,
8366f45ec7bSml29623 &prop_val, &prop_len);
8376f45ec7bSml29623 if (ddi_status == DDI_SUCCESS)
8386f45ec7bSml29623 custom_start_tdc[port] = *prop_val;
8396f45ec7bSml29623 else {
8406f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL,
8416f45ec7bSml29623 " %s custom start port %d"
8426f45ec7bSml29623 " read failed ", " txdma-cfg", port));
8436f45ec7bSml29623 bad_config = B_TRUE;
8446f45ec7bSml29623 status |= NXGE_DDI_FAILED;
8456f45ec7bSml29623 }
8466f45ec7bSml29623
8476f45ec7bSml29623 if ((custom_start_tdc[port] == -1) ||
8486f45ec7bSml29623 (custom_start_tdc[port] >=
8496f45ec7bSml29623 NXGE_MAX_RDCS)) {
8506f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL,
8516f45ec7bSml29623 " %s custom start %d"
8526f45ec7bSml29623 " out of range %x ", " txdma-cfg",
8536f45ec7bSml29623 port, custom_start_tdc[port]));
8546f45ec7bSml29623 bad_config = B_TRUE;
8556f45ec7bSml29623 break;
8566f45ec7bSml29623 }
8576f45ec7bSml29623
8586f45ec7bSml29623 ddi_status = ddi_prop_lookup_int_array(
8596f45ec7bSml29623 DDI_DEV_T_ANY, s_dip[port], 0, num_tdc_prop,
8606f45ec7bSml29623 &prop_val, &prop_len);
8616f45ec7bSml29623 if (ddi_status == DDI_SUCCESS)
8626f45ec7bSml29623 custom_num_tdc[port] = *prop_val;
8636f45ec7bSml29623 else {
8646f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL,
8656f45ec7bSml29623 " %s custom num port %d"
8666f45ec7bSml29623 " read failed ", " txdma-cfg", port));
8676f45ec7bSml29623 bad_config = B_TRUE;
8686f45ec7bSml29623 status |= NXGE_DDI_FAILED;
8696f45ec7bSml29623 }
8706f45ec7bSml29623
8716f45ec7bSml29623 if ((custom_num_tdc[port] == -1) ||
8726f45ec7bSml29623 (custom_num_tdc[port] >
8736f45ec7bSml29623 NXGE_MAX_TDCS) ||
8746f45ec7bSml29623 ((custom_num_tdc[port] +
8756f45ec7bSml29623 custom_start_tdc[port]) >
8766f45ec7bSml29623 NXGE_MAX_TDCS)) {
8776f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL,
8786f45ec7bSml29623 " %s custom num %d"
8796f45ec7bSml29623 " out of range %x ", " rxdma-cfg",
8806f45ec7bSml29623 port, custom_num_tdc[port]));
8816f45ec7bSml29623 bad_config = B_TRUE;
8826f45ec7bSml29623 break;
8836f45ec7bSml29623 }
8846f45ec7bSml29623 num_tdc += custom_num_tdc[port];
8856f45ec7bSml29623 if (num_tdc > NXGE_MAX_TDCS) {
8866f45ec7bSml29623 bad_config = B_TRUE;
8876f45ec7bSml29623 break;
8886f45ec7bSml29623 }
8896f45ec7bSml29623 tdc_bitmap[port] = 0;
8906f45ec7bSml29623 for (bits = 0;
8916f45ec7bSml29623 bits < custom_num_tdc[port]; bits++) {
8926f45ec7bSml29623 tdc_bitmap[port] |=
8936f45ec7bSml29623 (1 <<
8946f45ec7bSml29623 (bits + custom_start_tdc[port]));
8956f45ec7bSml29623 }
8966f45ec7bSml29623
8976f45ec7bSml29623 }
8986f45ec7bSml29623
8996f45ec7bSml29623 if (bad_config == B_FALSE) {
9006f45ec7bSml29623 /* check for overlap */
9016f45ec7bSml29623 for (port = 0; port < num_ports - 1; port++) {
9026f45ec7bSml29623 for (j = port + 1; j < num_ports; j++) {
9036f45ec7bSml29623 if (tdc_bitmap[port] &
9046f45ec7bSml29623 tdc_bitmap[j]) {
9056f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL,
9066f45ec7bSml29623 " rxdma-cfg"
9076f45ec7bSml29623 " property custom"
9086f45ec7bSml29623 " bit overlap"
9096f45ec7bSml29623 " %d %d ",
9106f45ec7bSml29623 port, j));
9116f45ec7bSml29623 bad_config = B_TRUE;
9126f45ec7bSml29623 break;
9136f45ec7bSml29623 }
9146f45ec7bSml29623 }
9156f45ec7bSml29623 if (bad_config == B_TRUE)
9166f45ec7bSml29623 break;
9176f45ec7bSml29623 }
9186f45ec7bSml29623 }
9196f45ec7bSml29623 if (bad_config == B_TRUE) {
9206f45ec7bSml29623 /* use default config */
9216f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL,
9226f45ec7bSml29623 " txdma-cfg property:"
9236f45ec7bSml29623 " bad custom config:" " use default"));
9246f45ec7bSml29623
9256f45ec7bSml29623 for (port = 0; port < num_ports; port++) {
9266f45ec7bSml29623 custom_num_tdc[port] = (num_ports == 4) ?
9276f45ec7bSml29623 p4_tx_fair[port] : p2_tx_fair[port];
9286f45ec7bSml29623 custom_start_tdc[port] = start_tdc;
9296f45ec7bSml29623 start_tdc += custom_num_tdc[port];
9306f45ec7bSml29623 }
9316f45ec7bSml29623 }
9326f45ec7bSml29623 break;
9336f45ec7bSml29623
9346f45ec7bSml29623 default:
9356f45ec7bSml29623 /* use default config */
9366f45ec7bSml29623 cfg_prop = "fair";
9376f45ec7bSml29623 for (port = 0; port < num_ports; port++) {
9386f45ec7bSml29623 custom_num_tdc[port] = (num_ports == 4) ?
9396f45ec7bSml29623 p4_tx_fair[port] : p2_tx_fair[port];
9406f45ec7bSml29623 custom_start_tdc[port] = start_tdc;
9416f45ec7bSml29623 start_tdc += custom_num_tdc[port];
9426f45ec7bSml29623 }
9436f45ec7bSml29623 break;
9446f45ec7bSml29623 }
9456f45ec7bSml29623
9466f45ec7bSml29623 /* Now Update the tx properties */
9476f45ec7bSml29623 for (port = 0; port < num_ports; port++) {
9486f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL,
9496f45ec7bSml29623 " update property txdma-cfg with %s ", cfg_prop));
9506f45ec7bSml29623 ddi_status = ddi_prop_update_string(DDI_DEV_T_NONE, s_dip[port],
9516f45ec7bSml29623 "txdma-cfg", cfg_prop);
9526f45ec7bSml29623 if (ddi_status != DDI_PROP_SUCCESS) {
9536f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL,
9546f45ec7bSml29623 " property txdma-cfg is not updating to %s",
9556f45ec7bSml29623 cfg_prop));
9566f45ec7bSml29623 status |= NXGE_DDI_FAILED;
9576f45ec7bSml29623 }
9586f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL, " update property %s with %d ",
9596f45ec7bSml29623 num_tdc_prop, custom_num_tdc[port]));
9606f45ec7bSml29623
9616f45ec7bSml29623 ddi_status = ddi_prop_update_int(DDI_DEV_T_NONE, s_dip[port],
9626f45ec7bSml29623 num_tdc_prop, custom_num_tdc[port]);
9636f45ec7bSml29623
9646f45ec7bSml29623 if (ddi_status != DDI_PROP_SUCCESS) {
9656f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
9666f45ec7bSml29623 " property %s not updating with %d",
9676f45ec7bSml29623 num_tdc_prop,
9686f45ec7bSml29623 custom_num_tdc[port]));
9696f45ec7bSml29623 status |= NXGE_DDI_FAILED;
9706f45ec7bSml29623 }
9716f45ec7bSml29623
9726f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL, " update property %s with %d ",
9736f45ec7bSml29623 start_tdc_prop, custom_start_tdc[port]));
9746f45ec7bSml29623
9756f45ec7bSml29623 ddi_status = ddi_prop_update_int(DDI_DEV_T_NONE, s_dip[port],
9766f45ec7bSml29623 start_tdc_prop, custom_start_tdc[port]);
9776f45ec7bSml29623 if (ddi_status != DDI_PROP_SUCCESS) {
9786f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
9796f45ec7bSml29623 " property %s not updating with %d ",
9806f45ec7bSml29623 start_tdc_prop, custom_start_tdc[port]));
9816f45ec7bSml29623 status |= NXGE_DDI_FAILED;
9826f45ec7bSml29623 }
9836f45ec7bSml29623 }
9846f45ec7bSml29623 if (status & NXGE_DDI_FAILED)
9856f45ec7bSml29623 status |= NXGE_ERROR;
9866f45ec7bSml29623 return (status);
9876f45ec7bSml29623 }
9886f45ec7bSml29623
9896f45ec7bSml29623 static nxge_status_t
nxge_update_cfg_properties(p_nxge_t nxgep,uint32_t flags,config_token_t token,dev_info_t * s_dip[])9906f45ec7bSml29623 nxge_update_cfg_properties(p_nxge_t nxgep, uint32_t flags,
9916f45ec7bSml29623 config_token_t token, dev_info_t *s_dip[])
9926f45ec7bSml29623 {
9936f45ec7bSml29623 nxge_status_t status = NXGE_OK;
9946f45ec7bSml29623
9956f45ec7bSml29623 switch (flags) {
9966f45ec7bSml29623 case COMMON_TXDMA_CFG:
9976f45ec7bSml29623 if (nxge_dma_obp_props_only == 0)
9986f45ec7bSml29623 status = nxge_update_txdma_properties(nxgep,
9996f45ec7bSml29623 token, s_dip);
10006f45ec7bSml29623 break;
10016f45ec7bSml29623 case COMMON_RXDMA_CFG:
10026f45ec7bSml29623 if (nxge_dma_obp_props_only == 0)
10036f45ec7bSml29623 status = nxge_update_rxdma_properties(nxgep,
10046f45ec7bSml29623 token, s_dip);
10056f45ec7bSml29623
10066f45ec7bSml29623 break;
10076f45ec7bSml29623 case COMMON_RXDMA_GRP_CFG:
10086f45ec7bSml29623 status = nxge_update_rxdma_grp_properties(nxgep,
10096f45ec7bSml29623 token, s_dip);
10106f45ec7bSml29623 break;
10116f45ec7bSml29623 default:
10126f45ec7bSml29623 return (NXGE_ERROR);
10136f45ec7bSml29623 }
10146f45ec7bSml29623 return (status);
10156f45ec7bSml29623 }
10166f45ec7bSml29623
10176f45ec7bSml29623 /*
10186f45ec7bSml29623 * verify consistence.
10196f45ec7bSml29623 * (May require publishing the properties on all the ports.
10206f45ec7bSml29623 *
10216f45ec7bSml29623 * What if properties are published on function 0 device only?
10226f45ec7bSml29623 *
10236f45ec7bSml29623 *
10246f45ec7bSml29623 * rxdma-cfg, txdma-cfg, rxdma-grp-cfg (required )
10256f45ec7bSml29623 * What about class configs?
10266f45ec7bSml29623 *
10276f45ec7bSml29623 * If consistent, update the property on all the siblings.
10286f45ec7bSml29623 * set a flag on hardware shared register
10296f45ec7bSml29623 * The rest of the siblings will check the flag
10306f45ec7bSml29623 * if the flag is set, they will use the updated property
10316f45ec7bSml29623 * without doing any validation.
10326f45ec7bSml29623 */
10336f45ec7bSml29623
10346f45ec7bSml29623 nxge_status_t
nxge_cfg_verify_set_classify_prop(p_nxge_t nxgep,char * prop,uint64_t known_cfg,uint32_t override,dev_info_t * c_dip[])10356f45ec7bSml29623 nxge_cfg_verify_set_classify_prop(p_nxge_t nxgep, char *prop,
10366f45ec7bSml29623 uint64_t known_cfg, uint32_t override, dev_info_t *c_dip[])
10376f45ec7bSml29623 {
10386f45ec7bSml29623 nxge_status_t status = NXGE_OK;
10396f45ec7bSml29623 int ddi_status = DDI_SUCCESS;
10406f45ec7bSml29623 int i = 0, found = 0, update_prop = B_TRUE;
10416f45ec7bSml29623 int *cfg_val;
10426f45ec7bSml29623 uint_t new_value, cfg_value[MAX_SIBLINGS];
10436f45ec7bSml29623 uint_t prop_len;
10446f45ec7bSml29623 uint_t known_cfg_value;
10456f45ec7bSml29623
10466f45ec7bSml29623 known_cfg_value = (uint_t)known_cfg;
10476f45ec7bSml29623
10486f45ec7bSml29623 if (override == B_TRUE) {
10496f45ec7bSml29623 new_value = known_cfg_value;
10506f45ec7bSml29623 for (i = 0; i < nxgep->nports; i++) {
10516f45ec7bSml29623 ddi_status = ddi_prop_update_int(DDI_DEV_T_NONE,
10526f45ec7bSml29623 c_dip[i], prop, new_value);
10536f45ec7bSml29623 #ifdef NXGE_DEBUG_ERROR
10546f45ec7bSml29623 if (ddi_status != DDI_PROP_SUCCESS)
10556f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
10566f45ec7bSml29623 " property %s failed update ", prop));
10576f45ec7bSml29623 #endif
10586f45ec7bSml29623 }
10596f45ec7bSml29623 if (ddi_status != DDI_PROP_SUCCESS)
10606f45ec7bSml29623 return (NXGE_ERROR | NXGE_DDI_FAILED);
10616f45ec7bSml29623 }
10626f45ec7bSml29623 for (i = 0; i < nxgep->nports; i++) {
10636f45ec7bSml29623 cfg_value[i] = known_cfg_value;
10646f45ec7bSml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, c_dip[i], 0,
10656f45ec7bSml29623 prop, &cfg_val,
10666f45ec7bSml29623 &prop_len) == DDI_PROP_SUCCESS) {
10676f45ec7bSml29623 cfg_value[i] = *cfg_val;
10686f45ec7bSml29623 ddi_prop_free(cfg_val);
10696f45ec7bSml29623 found++;
10706f45ec7bSml29623 }
10716f45ec7bSml29623 }
10726f45ec7bSml29623
10736f45ec7bSml29623 if (found != i) {
10746f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL,
10756f45ec7bSml29623 " property %s not specified on all ports", prop));
10766f45ec7bSml29623 if (found == 0) {
10776f45ec7bSml29623 /* not specified: Use default */
10786f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL,
10796f45ec7bSml29623 " property %s not specified on any port:"
10806f45ec7bSml29623 " Using default", prop));
10816f45ec7bSml29623 new_value = known_cfg_value;
10826f45ec7bSml29623 } else {
10836f45ec7bSml29623 /* specified on some */
10846f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL,
10856f45ec7bSml29623 " property %s not specified"
10866f45ec7bSml29623 " on some ports: Using default", prop));
10876f45ec7bSml29623 /* ? use p0 value instead ? */
10886f45ec7bSml29623 new_value = known_cfg_value;
10896f45ec7bSml29623 }
10906f45ec7bSml29623 } else {
10916f45ec7bSml29623 /* check type and consistence */
10926f45ec7bSml29623 /* found on all devices */
10936f45ec7bSml29623 for (i = 1; i < found; i++) {
10946f45ec7bSml29623 if (cfg_value[i] != cfg_value[i - 1]) {
10956f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL,
10966f45ec7bSml29623 " property %s inconsistent:"
10976f45ec7bSml29623 " Using default", prop));
10986f45ec7bSml29623 new_value = known_cfg_value;
10996f45ec7bSml29623 break;
11006f45ec7bSml29623 }
11016f45ec7bSml29623 /*
11026f45ec7bSml29623 * Found on all the ports and consistent. Nothing to
11036f45ec7bSml29623 * do.
11046f45ec7bSml29623 */
11056f45ec7bSml29623 update_prop = B_FALSE;
11066f45ec7bSml29623 }
11076f45ec7bSml29623 }
11086f45ec7bSml29623
11096f45ec7bSml29623 if (update_prop == B_TRUE) {
11106f45ec7bSml29623 for (i = 0; i < nxgep->nports; i++) {
11116f45ec7bSml29623 ddi_status = ddi_prop_update_int(DDI_DEV_T_NONE,
11126f45ec7bSml29623 c_dip[i], prop, new_value);
11136f45ec7bSml29623 #ifdef NXGE_DEBUG_ERROR
11146f45ec7bSml29623 if (ddi_status != DDI_SUCCESS)
11156f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
11166f45ec7bSml29623 " property %s not updating with %d"
11176f45ec7bSml29623 " Using default",
11186f45ec7bSml29623 prop, new_value));
11196f45ec7bSml29623 #endif
11206f45ec7bSml29623 if (ddi_status != DDI_PROP_SUCCESS)
11216f45ec7bSml29623 status |= NXGE_DDI_FAILED;
11226f45ec7bSml29623 }
11236f45ec7bSml29623 }
11246f45ec7bSml29623 if (status & NXGE_DDI_FAILED)
11256f45ec7bSml29623 status |= NXGE_ERROR;
11266f45ec7bSml29623
11276f45ec7bSml29623 return (status);
11286f45ec7bSml29623 }
11296f45ec7bSml29623
11306f45ec7bSml29623 static uint64_t
nxge_class_get_known_cfg(p_nxge_t nxgep,int class_prop,int rx_quick_cfg)11316f45ec7bSml29623 nxge_class_get_known_cfg(p_nxge_t nxgep, int class_prop, int rx_quick_cfg)
11326f45ec7bSml29623 {
11336f45ec7bSml29623 int start_prop;
11346f45ec7bSml29623 uint64_t cfg_value;
11356f45ec7bSml29623 p_nxge_param_t param_arr;
11366f45ec7bSml29623
11376f45ec7bSml29623 param_arr = nxgep->param_arr;
11386f45ec7bSml29623 cfg_value = param_arr[class_prop].value;
11396f45ec7bSml29623 start_prop = param_h1_init_value;
11406f45ec7bSml29623
11416f45ec7bSml29623 /* update the properties per quick config */
11426f45ec7bSml29623 switch (rx_quick_cfg) {
11436f45ec7bSml29623 case CFG_L3_WEB:
11446f45ec7bSml29623 case CFG_L3_DISTRIBUTE:
11456f45ec7bSml29623 cfg_value = nxge_classify_get_cfg_value(nxgep,
11466f45ec7bSml29623 rx_quick_cfg, class_prop - start_prop);
11476f45ec7bSml29623 break;
11486f45ec7bSml29623 default:
11496f45ec7bSml29623 cfg_value = param_arr[class_prop].value;
11506f45ec7bSml29623 break;
11516f45ec7bSml29623 }
11526f45ec7bSml29623 return (cfg_value);
11536f45ec7bSml29623 }
11546f45ec7bSml29623
11556f45ec7bSml29623 static nxge_status_t
nxge_cfg_verify_set_classify(p_nxge_t nxgep,dev_info_t * c_dip[])11566f45ec7bSml29623 nxge_cfg_verify_set_classify(p_nxge_t nxgep, dev_info_t *c_dip[])
11576f45ec7bSml29623 {
11586f45ec7bSml29623 nxge_status_t status = NXGE_OK;
11596f45ec7bSml29623 int rx_quick_cfg, class_prop, start_prop, end_prop;
11606f45ec7bSml29623 char *prop_name;
11616f45ec7bSml29623 int override = B_TRUE;
11626f45ec7bSml29623 uint64_t cfg_value;
11636f45ec7bSml29623 p_nxge_param_t param_arr;
11646f45ec7bSml29623
11656f45ec7bSml29623 param_arr = nxgep->param_arr;
11666f45ec7bSml29623 rx_quick_cfg = param_arr[param_rx_quick_cfg].value;
11676f45ec7bSml29623 start_prop = param_h1_init_value;
11686f45ec7bSml29623 end_prop = param_class_opt_ipv6_sctp;
11696f45ec7bSml29623
11706f45ec7bSml29623 /* update the properties per quick config */
11716f45ec7bSml29623 if (rx_quick_cfg == CFG_NOT_SPECIFIED)
11726f45ec7bSml29623 override = B_FALSE;
11736f45ec7bSml29623
11746f45ec7bSml29623 /*
11756f45ec7bSml29623 * these parameter affect the classification outcome.
11766f45ec7bSml29623 * these parameters are used to configure the Flow key and
11776f45ec7bSml29623 * the TCAM key for each of the IP classes.
11786f45ec7bSml29623 * Included here are also the H1 and H2 initial values
11796f45ec7bSml29623 * which affect the distribution as well as final hash value
11806f45ec7bSml29623 * (hence the offset into RDC table and FCRAM bucket location)
11816f45ec7bSml29623 *
11826f45ec7bSml29623 */
11836f45ec7bSml29623 for (class_prop = start_prop; class_prop <= end_prop; class_prop++) {
11846f45ec7bSml29623 prop_name = param_arr[class_prop].fcode_name;
11856f45ec7bSml29623 cfg_value = nxge_class_get_known_cfg(nxgep,
11866f45ec7bSml29623 class_prop, rx_quick_cfg);
11876f45ec7bSml29623 status = nxge_cfg_verify_set_classify_prop(nxgep, prop_name,
11886f45ec7bSml29623 cfg_value, override, c_dip);
11896f45ec7bSml29623 }
11906f45ec7bSml29623
11916f45ec7bSml29623 /*
11926f45ec7bSml29623 * these properties do not affect the actual classification outcome.
11936f45ec7bSml29623 * used to enable/disable or tune the fflp hardware
11946f45ec7bSml29623 *
11956f45ec7bSml29623 * fcram_access_ratio, tcam_access_ratio, tcam_enable, llc_snap_enable
11966f45ec7bSml29623 *
11976f45ec7bSml29623 */
11986f45ec7bSml29623 override = B_FALSE;
11996f45ec7bSml29623 for (class_prop = param_fcram_access_ratio;
12006f45ec7bSml29623 class_prop <= param_llc_snap_enable; class_prop++) {
12016f45ec7bSml29623 prop_name = param_arr[class_prop].fcode_name;
12026f45ec7bSml29623 cfg_value = param_arr[class_prop].value;
12036f45ec7bSml29623 status = nxge_cfg_verify_set_classify_prop(nxgep, prop_name,
12046f45ec7bSml29623 cfg_value, override, c_dip);
12056f45ec7bSml29623 }
12066f45ec7bSml29623
12076f45ec7bSml29623 return (status);
12086f45ec7bSml29623 }
12096f45ec7bSml29623
12106f45ec7bSml29623 nxge_status_t
nxge_cfg_verify_set(p_nxge_t nxgep,uint32_t flag)12116f45ec7bSml29623 nxge_cfg_verify_set(p_nxge_t nxgep, uint32_t flag)
12126f45ec7bSml29623 {
12136f45ec7bSml29623 nxge_status_t status = NXGE_OK;
12146f45ec7bSml29623 int i = 0, found = 0;
12156f45ec7bSml29623 int num_siblings;
12166f45ec7bSml29623 dev_info_t *c_dip[MAX_SIBLINGS + 1];
12176f45ec7bSml29623 char *prop_val[MAX_SIBLINGS];
12186f45ec7bSml29623 config_token_t c_token[MAX_SIBLINGS];
12196f45ec7bSml29623 char *prop;
12206f45ec7bSml29623
12216f45ec7bSml29623 if (nxge_dma_obp_props_only)
12226f45ec7bSml29623 return (NXGE_OK);
12236f45ec7bSml29623
12246f45ec7bSml29623 num_siblings = 0;
12256f45ec7bSml29623 c_dip[num_siblings] = ddi_get_child(nxgep->p_dip);
12266f45ec7bSml29623 while (c_dip[num_siblings]) {
12276f45ec7bSml29623 c_dip[num_siblings + 1] =
12286f45ec7bSml29623 ddi_get_next_sibling(c_dip[num_siblings]);
12296f45ec7bSml29623 num_siblings++;
12306f45ec7bSml29623 }
12316f45ec7bSml29623
12326f45ec7bSml29623 switch (flag) {
12336f45ec7bSml29623 case COMMON_TXDMA_CFG:
12346f45ec7bSml29623 prop = "txdma-cfg";
12356f45ec7bSml29623 break;
12366f45ec7bSml29623 case COMMON_RXDMA_CFG:
12376f45ec7bSml29623 prop = "rxdma-cfg";
12386f45ec7bSml29623 break;
12396f45ec7bSml29623 case COMMON_RXDMA_GRP_CFG:
12406f45ec7bSml29623 prop = "rxdma-grp-cfg";
12416f45ec7bSml29623 break;
12426f45ec7bSml29623 case COMMON_CLASS_CFG:
12436f45ec7bSml29623 status = nxge_cfg_verify_set_classify(nxgep, c_dip);
12446f45ec7bSml29623 return (status);
12456f45ec7bSml29623 default:
12466f45ec7bSml29623 return (NXGE_ERROR);
12476f45ec7bSml29623 }
12486f45ec7bSml29623
12496f45ec7bSml29623 i = 0;
12506f45ec7bSml29623 while (i < num_siblings) {
12516f45ec7bSml29623 if (ddi_prop_lookup_string(DDI_DEV_T_ANY, c_dip[i], 0, prop,
12526f45ec7bSml29623 (char **)&prop_val[i]) == DDI_PROP_SUCCESS) {
12536f45ec7bSml29623 c_token[i] = nxge_get_config_token(prop_val[i]);
12546f45ec7bSml29623 ddi_prop_free(prop_val[i]);
12556f45ec7bSml29623 found++;
12566f45ec7bSml29623 } else
12576f45ec7bSml29623 c_token[i] = CONFIG_TOKEN_NONE;
12586f45ec7bSml29623 i++;
12596f45ec7bSml29623 }
12606f45ec7bSml29623
12616f45ec7bSml29623 if (found != i) {
12626f45ec7bSml29623 if (found == 0) {
12636f45ec7bSml29623 /* not specified: Use default */
12646f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL,
12656f45ec7bSml29623 " property %s not specified on any port:"
12666f45ec7bSml29623 " Using default", prop));
12676f45ec7bSml29623
12686f45ec7bSml29623 status = nxge_update_cfg_properties(nxgep,
12696f45ec7bSml29623 flag, FAIR, c_dip);
12706f45ec7bSml29623 return (status);
12716f45ec7bSml29623 } else {
12726f45ec7bSml29623 /*
12736f45ec7bSml29623 * if the convention is to use function 0 device then
12746f45ec7bSml29623 * populate the other devices with this configuration.
12756f45ec7bSml29623 *
12766f45ec7bSml29623 * The other alternative is to use the default config.
12776f45ec7bSml29623 */
12786f45ec7bSml29623 /* not specified: Use default */
12796f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL,
12806f45ec7bSml29623 " property %s not specified on some ports:"
12816f45ec7bSml29623 " Using default", prop));
12826f45ec7bSml29623 status = nxge_update_cfg_properties(nxgep,
12836f45ec7bSml29623 flag, FAIR, c_dip);
12846f45ec7bSml29623 return (status);
12856f45ec7bSml29623 }
12866f45ec7bSml29623 }
12876f45ec7bSml29623
12886f45ec7bSml29623 /* check type and consistence */
12896f45ec7bSml29623 /* found on all devices */
12906f45ec7bSml29623 for (i = 1; i < found; i++) {
12916f45ec7bSml29623 if (c_token[i] != c_token[i - 1]) {
12926f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL,
12936f45ec7bSml29623 " property %s inconsistent:"
12946f45ec7bSml29623 " Using default", prop));
12956f45ec7bSml29623 status = nxge_update_cfg_properties(nxgep,
12966f45ec7bSml29623 flag, FAIR, c_dip);
12976f45ec7bSml29623 return (status);
12986f45ec7bSml29623 }
12996f45ec7bSml29623 }
13006f45ec7bSml29623
13016f45ec7bSml29623 /*
13026f45ec7bSml29623 * Found on all the ports check if it is custom configuration. if
13036f45ec7bSml29623 * custom, then verify consistence
13046f45ec7bSml29623 *
13056f45ec7bSml29623 * finally create soft properties
13066f45ec7bSml29623 */
13076f45ec7bSml29623 status = nxge_update_cfg_properties(nxgep, flag, c_token[0], c_dip);
13086f45ec7bSml29623 return (status);
13096f45ec7bSml29623 }
13106f45ec7bSml29623
13116f45ec7bSml29623 nxge_status_t
nxge_cfg_verify_set_quick_config(p_nxge_t nxgep)13126f45ec7bSml29623 nxge_cfg_verify_set_quick_config(p_nxge_t nxgep)
13136f45ec7bSml29623 {
13146f45ec7bSml29623 nxge_status_t status = NXGE_OK;
13156f45ec7bSml29623 int ddi_status = DDI_SUCCESS;
13166f45ec7bSml29623 char *prop_val;
13176f45ec7bSml29623 char *rx_prop;
13186f45ec7bSml29623 char *prop;
13196f45ec7bSml29623 uint32_t cfg_value = CFG_NOT_SPECIFIED;
13206f45ec7bSml29623 p_nxge_param_t param_arr;
13216f45ec7bSml29623
13226f45ec7bSml29623 param_arr = nxgep->param_arr;
13236f45ec7bSml29623 rx_prop = param_arr[param_rx_quick_cfg].fcode_name;
13246f45ec7bSml29623
13256f45ec7bSml29623 prop = "rx-quick-cfg";
13266f45ec7bSml29623
13276f45ec7bSml29623 /*
13286f45ec7bSml29623 * good value are
13296f45ec7bSml29623 *
13306f45ec7bSml29623 * "web-server" "generic-server" "l3-classify" "flow-classify"
13316f45ec7bSml29623 */
13326f45ec7bSml29623 if (ddi_prop_lookup_string(DDI_DEV_T_ANY, nxgep->dip, 0,
13336f45ec7bSml29623 prop, (char **)&prop_val) != DDI_PROP_SUCCESS) {
13346f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, VPD_CTL,
13356f45ec7bSml29623 " property %s not specified: using default ", prop));
13366f45ec7bSml29623 cfg_value = CFG_NOT_SPECIFIED;
13376f45ec7bSml29623 } else {
13386f45ec7bSml29623 cfg_value = CFG_L3_DISTRIBUTE;
13396f45ec7bSml29623 if (strncmp("web-server", (caddr_t)prop_val, 8) == 0) {
13406f45ec7bSml29623 cfg_value = CFG_L3_WEB;
13416f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL,
13426f45ec7bSml29623 " %s: web server ", prop));
13436f45ec7bSml29623 }
13446f45ec7bSml29623 if (strncmp("generic-server", (caddr_t)prop_val, 8) == 0) {
13456f45ec7bSml29623 cfg_value = CFG_L3_DISTRIBUTE;
13466f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL,
13476f45ec7bSml29623 " %s: distribute ", prop));
13486f45ec7bSml29623 }
13496f45ec7bSml29623 /* more */
13506f45ec7bSml29623 ddi_prop_free(prop_val);
13516f45ec7bSml29623 }
13526f45ec7bSml29623
13536f45ec7bSml29623 ddi_status = ddi_prop_update_int(DDI_DEV_T_NONE, nxgep->dip,
13546f45ec7bSml29623 rx_prop, cfg_value);
13556f45ec7bSml29623 if (ddi_status != DDI_PROP_SUCCESS)
13566f45ec7bSml29623 status |= NXGE_DDI_FAILED;
13576f45ec7bSml29623
13586f45ec7bSml29623 /* now handle specified cases: */
13596f45ec7bSml29623 if (status & NXGE_DDI_FAILED)
13606f45ec7bSml29623 status |= NXGE_ERROR;
13616f45ec7bSml29623 return (status);
13626f45ec7bSml29623 }
13636f45ec7bSml29623
136400161856Syc148097 /*
136500161856Syc148097 * Device properties adv-autoneg-cap etc are defined by FWARC
136600161856Syc148097 * http://sac.sfbay/FWARC/2002/345/20020610_asif.haswarey
136700161856Syc148097 */
13686f45ec7bSml29623 static void
nxge_use_cfg_link_cfg(p_nxge_t nxgep)13696f45ec7bSml29623 nxge_use_cfg_link_cfg(p_nxge_t nxgep)
13706f45ec7bSml29623 {
13716f45ec7bSml29623 int *prop_val;
13726f45ec7bSml29623 uint_t prop_len;
13736f45ec7bSml29623 dev_info_t *dip;
13746f45ec7bSml29623 int speed;
13756f45ec7bSml29623 int duplex;
13766f45ec7bSml29623 int adv_autoneg_cap;
13776f45ec7bSml29623 int adv_10gfdx_cap;
13786f45ec7bSml29623 int adv_10ghdx_cap;
13796f45ec7bSml29623 int adv_1000fdx_cap;
13806f45ec7bSml29623 int adv_1000hdx_cap;
13816f45ec7bSml29623 int adv_100fdx_cap;
13826f45ec7bSml29623 int adv_100hdx_cap;
13836f45ec7bSml29623 int adv_10fdx_cap;
13846f45ec7bSml29623 int adv_10hdx_cap;
13856f45ec7bSml29623 int status = DDI_SUCCESS;
13866f45ec7bSml29623
13876f45ec7bSml29623 dip = nxgep->dip;
13886f45ec7bSml29623
13896f45ec7bSml29623 /*
13906f45ec7bSml29623 * first find out the card type and the supported link speeds and
13916f45ec7bSml29623 * features
13926f45ec7bSml29623 */
13936f45ec7bSml29623 /* add code for card type */
13946f45ec7bSml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, 0, "adv-autoneg-cap",
13956f45ec7bSml29623 &prop_val, &prop_len) == DDI_PROP_SUCCESS) {
13966f45ec7bSml29623 ddi_prop_free(prop_val);
13976f45ec7bSml29623 return;
13986f45ec7bSml29623 }
13996f45ec7bSml29623
14006f45ec7bSml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, 0, "adv-10gfdx-cap",
14016f45ec7bSml29623 &prop_val, &prop_len) == DDI_PROP_SUCCESS) {
14026f45ec7bSml29623 ddi_prop_free(prop_val);
14036f45ec7bSml29623 return;
14046f45ec7bSml29623 }
14056f45ec7bSml29623
14066f45ec7bSml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, 0, "adv-1000hdx-cap",
14076f45ec7bSml29623 &prop_val, &prop_len) == DDI_PROP_SUCCESS) {
14086f45ec7bSml29623 ddi_prop_free(prop_val);
14096f45ec7bSml29623 return;
14106f45ec7bSml29623 }
14116f45ec7bSml29623
14126f45ec7bSml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, 0, "adv-1000fdx-cap",
14136f45ec7bSml29623 &prop_val, &prop_len) == DDI_PROP_SUCCESS) {
14146f45ec7bSml29623 ddi_prop_free(prop_val);
14156f45ec7bSml29623 return;
14166f45ec7bSml29623 }
14176f45ec7bSml29623
14186f45ec7bSml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, 0, "adv-100fdx-cap",
14196f45ec7bSml29623 &prop_val, &prop_len) == DDI_PROP_SUCCESS) {
14206f45ec7bSml29623 ddi_prop_free(prop_val);
14216f45ec7bSml29623 return;
14226f45ec7bSml29623 }
14236f45ec7bSml29623
14246f45ec7bSml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, 0, "adv-100hdx-cap",
14256f45ec7bSml29623 &prop_val, &prop_len) == DDI_PROP_SUCCESS) {
14266f45ec7bSml29623 ddi_prop_free(prop_val);
14276f45ec7bSml29623 return;
14286f45ec7bSml29623 }
14296f45ec7bSml29623
14306f45ec7bSml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, 0, "adv-10fdx-cap",
14316f45ec7bSml29623 &prop_val, &prop_len) == DDI_PROP_SUCCESS) {
14326f45ec7bSml29623 ddi_prop_free(prop_val);
14336f45ec7bSml29623 return;
14346f45ec7bSml29623 }
14356f45ec7bSml29623
14366f45ec7bSml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, 0, "adv-10hdx-cap",
14376f45ec7bSml29623 &prop_val, &prop_len) == DDI_PROP_SUCCESS) {
14386f45ec7bSml29623 ddi_prop_free(prop_val);
14396f45ec7bSml29623 return;
14406f45ec7bSml29623 }
14416f45ec7bSml29623
14426f45ec7bSml29623 if (ddi_prop_lookup_byte_array(DDI_DEV_T_ANY, dip, 0, "speed",
14436f45ec7bSml29623 (uchar_t **)&prop_val, &prop_len) == DDI_PROP_SUCCESS) {
14446f45ec7bSml29623 if (strncmp("10000", (caddr_t)prop_val,
14456f45ec7bSml29623 (size_t)prop_len) == 0) {
14466f45ec7bSml29623 speed = 10000;
14476f45ec7bSml29623 } else if (strncmp("1000", (caddr_t)prop_val,
14486f45ec7bSml29623 (size_t)prop_len) == 0) {
14496f45ec7bSml29623 speed = 1000;
14506f45ec7bSml29623 } else if (strncmp("100", (caddr_t)prop_val,
14516f45ec7bSml29623 (size_t)prop_len) == 0) {
14526f45ec7bSml29623 speed = 100;
14536f45ec7bSml29623 } else if (strncmp("10", (caddr_t)prop_val,
14546f45ec7bSml29623 (size_t)prop_len) == 0) {
14556f45ec7bSml29623 speed = 10;
14566f45ec7bSml29623 } else if (strncmp("auto", (caddr_t)prop_val,
14576f45ec7bSml29623 (size_t)prop_len) == 0) {
14586f45ec7bSml29623 speed = 0;
14596f45ec7bSml29623 } else {
14606f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_NOTE,
14616f45ec7bSml29623 "speed property is invalid reverting to auto"));
14626f45ec7bSml29623 speed = 0;
14636f45ec7bSml29623 }
14646f45ec7bSml29623 ddi_prop_free(prop_val);
14656f45ec7bSml29623 } else
14666f45ec7bSml29623 speed = 0;
14676f45ec7bSml29623
14686f45ec7bSml29623 if (ddi_prop_lookup_byte_array(DDI_DEV_T_ANY, dip, 0, "duplex",
14696f45ec7bSml29623 (uchar_t **)&prop_val, &prop_len) == DDI_PROP_SUCCESS) {
14706f45ec7bSml29623 if (strncmp("full", (caddr_t)prop_val,
14716f45ec7bSml29623 (size_t)prop_len) == 0) {
14726f45ec7bSml29623 duplex = 2;
14736f45ec7bSml29623 } else if (strncmp("half", (caddr_t)prop_val,
14746f45ec7bSml29623 (size_t)prop_len) == 0) {
14756f45ec7bSml29623 duplex = 1;
14766f45ec7bSml29623 } else if (strncmp("auto", (caddr_t)prop_val,
14776f45ec7bSml29623 (size_t)prop_len) == 0) {
14786f45ec7bSml29623 duplex = 0;
14796f45ec7bSml29623 } else {
14806f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_NOTE,
14816f45ec7bSml29623 "duplex property is invalid"
14826f45ec7bSml29623 " reverting to auto"));
14836f45ec7bSml29623 duplex = 0;
14846f45ec7bSml29623 }
14856f45ec7bSml29623 ddi_prop_free(prop_val);
14866f45ec7bSml29623 } else
14876f45ec7bSml29623 duplex = 0;
14886f45ec7bSml29623
148900161856Syc148097 /* speed == 0 or duplex == 0 means auto negotiation. */
14906f45ec7bSml29623 adv_autoneg_cap = (speed == 0) || (duplex == 0);
14916f45ec7bSml29623 if (adv_autoneg_cap == 0) {
14926f45ec7bSml29623 adv_10gfdx_cap = ((speed == 10000) && (duplex == 2));
14936f45ec7bSml29623 adv_10ghdx_cap = adv_10gfdx_cap;
14946f45ec7bSml29623 adv_10ghdx_cap |= ((speed == 10000) && (duplex == 1));
14956f45ec7bSml29623 adv_1000fdx_cap = adv_10ghdx_cap;
14966f45ec7bSml29623 adv_1000fdx_cap |= ((speed == 1000) && (duplex == 2));
14976f45ec7bSml29623 adv_1000hdx_cap = adv_1000fdx_cap;
14986f45ec7bSml29623 adv_1000hdx_cap |= ((speed == 1000) && (duplex == 1));
14996f45ec7bSml29623 adv_100fdx_cap = adv_1000hdx_cap;
15006f45ec7bSml29623 adv_100fdx_cap |= ((speed == 100) && (duplex == 2));
15016f45ec7bSml29623 adv_100hdx_cap = adv_100fdx_cap;
15026f45ec7bSml29623 adv_100hdx_cap |= ((speed == 100) && (duplex == 1));
15036f45ec7bSml29623 adv_10fdx_cap = adv_100hdx_cap;
15046f45ec7bSml29623 adv_10fdx_cap |= ((speed == 10) && (duplex == 2));
15056f45ec7bSml29623 adv_10hdx_cap = adv_10fdx_cap;
15066f45ec7bSml29623 adv_10hdx_cap |= ((speed == 10) && (duplex == 1));
15076f45ec7bSml29623 } else if (speed == 0) {
15086f45ec7bSml29623 adv_10gfdx_cap = (duplex == 2);
15096f45ec7bSml29623 adv_10ghdx_cap = (duplex == 1);
15106f45ec7bSml29623 adv_1000fdx_cap = (duplex == 2);
15116f45ec7bSml29623 adv_1000hdx_cap = (duplex == 1);
15126f45ec7bSml29623 adv_100fdx_cap = (duplex == 2);
15136f45ec7bSml29623 adv_100hdx_cap = (duplex == 1);
15146f45ec7bSml29623 adv_10fdx_cap = (duplex == 2);
15156f45ec7bSml29623 adv_10hdx_cap = (duplex == 1);
15166f45ec7bSml29623 }
15176f45ec7bSml29623 if (duplex == 0) {
15186f45ec7bSml29623 adv_10gfdx_cap = (speed == 0);
15196f45ec7bSml29623 adv_10gfdx_cap |= (speed == 10000);
15206f45ec7bSml29623 adv_10ghdx_cap = adv_10gfdx_cap;
15216f45ec7bSml29623 adv_10ghdx_cap |= (speed == 10000);
15226f45ec7bSml29623 adv_1000fdx_cap = adv_10ghdx_cap;
15236f45ec7bSml29623 adv_1000fdx_cap |= (speed == 1000);
15246f45ec7bSml29623 adv_1000hdx_cap = adv_1000fdx_cap;
15256f45ec7bSml29623 adv_1000hdx_cap |= (speed == 1000);
15266f45ec7bSml29623 adv_100fdx_cap = adv_1000hdx_cap;
15276f45ec7bSml29623 adv_100fdx_cap |= (speed == 100);
15286f45ec7bSml29623 adv_100hdx_cap = adv_100fdx_cap;
15296f45ec7bSml29623 adv_100hdx_cap |= (speed == 100);
15306f45ec7bSml29623 adv_10fdx_cap = adv_100hdx_cap;
15316f45ec7bSml29623 adv_10fdx_cap |= (speed == 10);
15326f45ec7bSml29623 adv_10hdx_cap = adv_10fdx_cap;
15336f45ec7bSml29623 adv_10hdx_cap |= (speed == 10);
15346f45ec7bSml29623 }
15356f45ec7bSml29623 status = ddi_prop_update_int_array(DDI_DEV_T_NONE, dip,
15366f45ec7bSml29623 "adv-autoneg-cap", &adv_autoneg_cap, 1);
15376f45ec7bSml29623 if (status)
15386f45ec7bSml29623 return;
15396f45ec7bSml29623
15406f45ec7bSml29623 status = ddi_prop_update_int_array(DDI_DEV_T_NONE, dip,
15416f45ec7bSml29623 "adv-10gfdx-cap", &adv_10gfdx_cap, 1);
15426f45ec7bSml29623 if (status)
15436f45ec7bSml29623 goto nxge_map_myargs_to_gmii_fail1;
15446f45ec7bSml29623
15456f45ec7bSml29623 status = ddi_prop_update_int_array(DDI_DEV_T_NONE, dip,
15466f45ec7bSml29623 "adv-10ghdx-cap", &adv_10ghdx_cap, 1);
15476f45ec7bSml29623 if (status)
15486f45ec7bSml29623 goto nxge_map_myargs_to_gmii_fail2;
15496f45ec7bSml29623
15506f45ec7bSml29623 status = ddi_prop_update_int_array(DDI_DEV_T_NONE, dip,
15516f45ec7bSml29623 "adv-1000fdx-cap", &adv_1000fdx_cap, 1);
15526f45ec7bSml29623 if (status)
15536f45ec7bSml29623 goto nxge_map_myargs_to_gmii_fail3;
15546f45ec7bSml29623
15556f45ec7bSml29623 status = ddi_prop_update_int_array(DDI_DEV_T_NONE, dip,
15566f45ec7bSml29623 "adv-1000hdx-cap", &adv_1000hdx_cap, 1);
15576f45ec7bSml29623 if (status)
15586f45ec7bSml29623 goto nxge_map_myargs_to_gmii_fail4;
15596f45ec7bSml29623
15606f45ec7bSml29623 status = ddi_prop_update_int_array(DDI_DEV_T_NONE, dip,
15616f45ec7bSml29623 "adv-100fdx-cap", &adv_100fdx_cap, 1);
15626f45ec7bSml29623 if (status)
15636f45ec7bSml29623 goto nxge_map_myargs_to_gmii_fail5;
15646f45ec7bSml29623
15656f45ec7bSml29623 status = ddi_prop_update_int_array(DDI_DEV_T_NONE, dip,
15666f45ec7bSml29623 "adv-100hdx-cap", &adv_100hdx_cap, 1);
15676f45ec7bSml29623 if (status)
15686f45ec7bSml29623 goto nxge_map_myargs_to_gmii_fail6;
15696f45ec7bSml29623
15706f45ec7bSml29623 status = ddi_prop_update_int_array(DDI_DEV_T_NONE, dip,
15716f45ec7bSml29623 "adv-10fdx-cap", &adv_10fdx_cap, 1);
15726f45ec7bSml29623 if (status)
15736f45ec7bSml29623 goto nxge_map_myargs_to_gmii_fail7;
15746f45ec7bSml29623
15756f45ec7bSml29623 status = ddi_prop_update_int_array(DDI_DEV_T_NONE, dip,
15766f45ec7bSml29623 "adv-10hdx-cap", &adv_10hdx_cap, 1);
15776f45ec7bSml29623 if (status)
15786f45ec7bSml29623 goto nxge_map_myargs_to_gmii_fail8;
15796f45ec7bSml29623
15806f45ec7bSml29623 return;
15816f45ec7bSml29623
15826f45ec7bSml29623 nxge_map_myargs_to_gmii_fail9:
15836f45ec7bSml29623 (void) ddi_prop_remove(DDI_DEV_T_NONE, dip, "adv-10hdx-cap");
15846f45ec7bSml29623
15856f45ec7bSml29623 nxge_map_myargs_to_gmii_fail8:
15866f45ec7bSml29623 (void) ddi_prop_remove(DDI_DEV_T_NONE, dip, "adv-10fdx-cap");
15876f45ec7bSml29623
15886f45ec7bSml29623 nxge_map_myargs_to_gmii_fail7:
15896f45ec7bSml29623 (void) ddi_prop_remove(DDI_DEV_T_NONE, dip, "adv-100hdx-cap");
15906f45ec7bSml29623
15916f45ec7bSml29623 nxge_map_myargs_to_gmii_fail6:
15926f45ec7bSml29623 (void) ddi_prop_remove(DDI_DEV_T_NONE, dip, "adv-100fdx-cap");
15936f45ec7bSml29623
15946f45ec7bSml29623 nxge_map_myargs_to_gmii_fail5:
15956f45ec7bSml29623 (void) ddi_prop_remove(DDI_DEV_T_NONE, dip, "adv-1000hdx-cap");
15966f45ec7bSml29623
15976f45ec7bSml29623 nxge_map_myargs_to_gmii_fail4:
15986f45ec7bSml29623 (void) ddi_prop_remove(DDI_DEV_T_NONE, dip, "adv-1000fdx-cap");
15996f45ec7bSml29623
16006f45ec7bSml29623 nxge_map_myargs_to_gmii_fail3:
16016f45ec7bSml29623 (void) ddi_prop_remove(DDI_DEV_T_NONE, dip, "adv-10ghdx-cap");
16026f45ec7bSml29623
16036f45ec7bSml29623 nxge_map_myargs_to_gmii_fail2:
16046f45ec7bSml29623 (void) ddi_prop_remove(DDI_DEV_T_NONE, dip, "adv-10gfdx-cap");
16056f45ec7bSml29623
16066f45ec7bSml29623 nxge_map_myargs_to_gmii_fail1:
16076f45ec7bSml29623 (void) ddi_prop_remove(DDI_DEV_T_NONE, dip, "adv-autoneg-cap");
16086f45ec7bSml29623 }
16096f45ec7bSml29623
16106f45ec7bSml29623 nxge_status_t
nxge_get_config_properties(p_nxge_t nxgep)16116f45ec7bSml29623 nxge_get_config_properties(p_nxge_t nxgep)
16126f45ec7bSml29623 {
16136f45ec7bSml29623 nxge_status_t status = NXGE_OK;
16146f45ec7bSml29623 p_nxge_hw_list_t hw_p;
16154df55fdeSJanie Lu char **prop_val;
16164df55fdeSJanie Lu uint_t prop_len;
16174df55fdeSJanie Lu uint_t i;
16186f45ec7bSml29623
16196f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, VPD_CTL, " ==> nxge_get_config_properties"));
16206f45ec7bSml29623
16216f45ec7bSml29623 if ((hw_p = nxgep->nxge_hw_p) == NULL) {
16226f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
16236f45ec7bSml29623 " nxge_get_config_properties:"
16246f45ec7bSml29623 " common hardware not set", nxgep->niu_type));
16256f45ec7bSml29623 return (NXGE_ERROR);
16266f45ec7bSml29623 }
16276f45ec7bSml29623
16286f45ec7bSml29623 /*
16296f45ec7bSml29623 * Get info on how many ports Neptune card has.
16306f45ec7bSml29623 */
16312e59129aSraghus nxgep->nports = nxge_get_nports(nxgep);
163259ac0c16Sdavemq if (nxgep->nports <= 0) {
163356d930aeSspeer NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
163459ac0c16Sdavemq "<==nxge_get_config_properties: Invalid Neptune type 0x%x",
163559ac0c16Sdavemq nxgep->niu_type));
163659ac0c16Sdavemq return (NXGE_ERROR);
163756d930aeSspeer }
163859ac0c16Sdavemq nxgep->classifier.tcam_size = TCAM_NIU_TCAM_MAX_ENTRY;
16392e59129aSraghus if (NXGE_IS_VALID_NEPTUNE_TYPE(nxgep)) {
16402e59129aSraghus nxgep->classifier.tcam_size = TCAM_NXGE_TCAM_MAX_ENTRY;
16412e59129aSraghus }
164259ac0c16Sdavemq if (nxgep->function_num >= nxgep->nports) {
164359ac0c16Sdavemq return (NXGE_ERROR);
16446f45ec7bSml29623 }
16456f45ec7bSml29623
16466f45ec7bSml29623 status = nxge_get_mac_addr_properties(nxgep);
16476f45ec7bSml29623 if (status != NXGE_OK)
16486f45ec7bSml29623 return (NXGE_ERROR);
16496f45ec7bSml29623
16506f45ec7bSml29623 /*
16516f45ec7bSml29623 * read the configuration type. If none is specified, used default.
16526f45ec7bSml29623 * Config types: equal: (default) DMA channels, RDC groups, TCAM, FCRAM
16536f45ec7bSml29623 * are shared equally across all the ports.
16546f45ec7bSml29623 *
16556f45ec7bSml29623 * Fair: DMA channels, RDC groups, TCAM, FCRAM are shared proportional
16566f45ec7bSml29623 * to the port speed.
16576f45ec7bSml29623 *
16586f45ec7bSml29623 *
16596f45ec7bSml29623 * custom: DMA channels, RDC groups, TCAM, FCRAM partition is
16606f45ec7bSml29623 * specified in nxge.conf. Need to read each parameter and set
16616f45ec7bSml29623 * up the parameters in nxge structures.
16626f45ec7bSml29623 *
16636f45ec7bSml29623 */
16646f45ec7bSml29623 switch (nxgep->niu_type) {
16656f45ec7bSml29623 case N2_NIU:
16666f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, VPD_CTL,
16676f45ec7bSml29623 " ==> nxge_get_config_properties: N2"));
16686f45ec7bSml29623 MUTEX_ENTER(&hw_p->nxge_cfg_lock);
16696f45ec7bSml29623 if ((hw_p->flags & COMMON_CFG_VALID) !=
16706f45ec7bSml29623 COMMON_CFG_VALID) {
16716f45ec7bSml29623 status = nxge_cfg_verify_set(nxgep,
16726f45ec7bSml29623 COMMON_RXDMA_GRP_CFG);
16736f45ec7bSml29623 status = nxge_cfg_verify_set(nxgep,
16746f45ec7bSml29623 COMMON_CLASS_CFG);
16756f45ec7bSml29623 hw_p->flags |= COMMON_CFG_VALID;
16766f45ec7bSml29623 }
16776f45ec7bSml29623 MUTEX_EXIT(&hw_p->nxge_cfg_lock);
16786f45ec7bSml29623 status = nxge_use_cfg_n2niu_properties(nxgep);
16796f45ec7bSml29623 break;
168059ac0c16Sdavemq default:
16812e59129aSraghus if (!NXGE_IS_VALID_NEPTUNE_TYPE(nxgep)) {
168259ac0c16Sdavemq NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
168359ac0c16Sdavemq " nxge_get_config_properties:"
168459ac0c16Sdavemq " unknown NIU type 0x%x", nxgep->niu_type));
168559ac0c16Sdavemq return (NXGE_ERROR);
168659ac0c16Sdavemq }
16876f45ec7bSml29623
16886f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, VPD_CTL,
16896f45ec7bSml29623 " ==> nxge_get_config_properties: Neptune"));
16906f45ec7bSml29623 status = nxge_cfg_verify_set_quick_config(nxgep);
16916f45ec7bSml29623 MUTEX_ENTER(&hw_p->nxge_cfg_lock);
16926f45ec7bSml29623 if ((hw_p->flags & COMMON_CFG_VALID) !=
16936f45ec7bSml29623 COMMON_CFG_VALID) {
16946f45ec7bSml29623 status = nxge_cfg_verify_set(nxgep,
16956f45ec7bSml29623 COMMON_TXDMA_CFG);
16966f45ec7bSml29623 status = nxge_cfg_verify_set(nxgep,
16976f45ec7bSml29623 COMMON_RXDMA_CFG);
16986f45ec7bSml29623 status = nxge_cfg_verify_set(nxgep,
16996f45ec7bSml29623 COMMON_RXDMA_GRP_CFG);
17006f45ec7bSml29623 status = nxge_cfg_verify_set(nxgep,
17016f45ec7bSml29623 COMMON_CLASS_CFG);
17026f45ec7bSml29623 hw_p->flags |= COMMON_CFG_VALID;
17036f45ec7bSml29623 }
17046f45ec7bSml29623 MUTEX_EXIT(&hw_p->nxge_cfg_lock);
17056f45ec7bSml29623 nxge_use_cfg_neptune_properties(nxgep);
17066f45ec7bSml29623 status = NXGE_OK;
17076f45ec7bSml29623 break;
17086f45ec7bSml29623 }
17096f45ec7bSml29623
17103d16f8e7Sml29623 /*
17113d16f8e7Sml29623 * Get the software LSO enable flag property from the
17123d16f8e7Sml29623 * driver configuration file (nxge.conf).
17133d16f8e7Sml29623 * This flag will be set to disable (0) if this property
17143d16f8e7Sml29623 * does not exist.
17153d16f8e7Sml29623 */
17163d16f8e7Sml29623 nxgep->soft_lso_enable = ddi_prop_get_int(DDI_DEV_T_ANY, nxgep->dip,
17173d16f8e7Sml29623 DDI_PROP_DONTPASS | DDI_PROP_NOTPROM, "soft-lso-enable", 0);
17183d16f8e7Sml29623 NXGE_DEBUG_MSG((nxgep, VPD_CTL,
17193d16f8e7Sml29623 "nxge_get_config_properties: software lso %d\n",
17203d16f8e7Sml29623 nxgep->soft_lso_enable));
17213d16f8e7Sml29623
17224df55fdeSJanie Lu nxgep->niu_hw_type = NIU_HW_TYPE_DEFAULT;
17234df55fdeSJanie Lu if (nxgep->niu_type == N2_NIU) {
17249d587972SSantwona Behera
17259d587972SSantwona Behera uchar_t *s_prop_val;
17269d587972SSantwona Behera
17274df55fdeSJanie Lu /*
17284df55fdeSJanie Lu * For NIU, the next generation KT has
17294df55fdeSJanie Lu * a few differences in features that the
17304df55fdeSJanie Lu * driver needs to handle them
17314df55fdeSJanie Lu * accordingly.
17324df55fdeSJanie Lu */
17334df55fdeSJanie Lu if (ddi_prop_lookup_string_array(DDI_DEV_T_ANY, nxgep->dip, 0,
17344df55fdeSJanie Lu "compatible", &prop_val, &prop_len) == DDI_PROP_SUCCESS) {
17354df55fdeSJanie Lu for (i = 0; i < prop_len; i++) {
17364df55fdeSJanie Lu if ((strcmp((caddr_t)prop_val[i],
17374df55fdeSJanie Lu KT_NIU_COMPATIBLE) == 0)) {
17384df55fdeSJanie Lu nxgep->niu_hw_type = NIU_HW_TYPE_RF;
17394df55fdeSJanie Lu NXGE_DEBUG_MSG((nxgep, VPD_CTL,
17404df55fdeSJanie Lu "NIU type %d", nxgep->niu_hw_type));
17414df55fdeSJanie Lu break;
17424df55fdeSJanie Lu }
17434df55fdeSJanie Lu }
17444df55fdeSJanie Lu }
17454df55fdeSJanie Lu
17464df55fdeSJanie Lu ddi_prop_free(prop_val);
17479d587972SSantwona Behera /*
17489d587972SSantwona Behera * Some Serdes and PHY properties may also be provided as OBP
17499d587972SSantwona Behera * properties
17509d587972SSantwona Behera */
17519d587972SSantwona Behera if (ddi_prop_lookup_byte_array(DDI_DEV_T_ANY, nxgep->dip, 0,
17529d587972SSantwona Behera "tx-cfg-l", &s_prop_val, &prop_len) == DDI_PROP_SUCCESS) {
17539d587972SSantwona Behera nxgep->srds_prop.tx_cfg_l =
17549d587972SSantwona Behera (uint16_t)(*(uint32_t *)s_prop_val);
17559d587972SSantwona Behera NXGE_DEBUG_MSG((nxgep, VPD_CTL,
17569d587972SSantwona Behera "nxge_get_config_properties: "
17579d587972SSantwona Behera "tx_cfg_l 0x%x, Read from OBP",
17589d587972SSantwona Behera nxgep->srds_prop.tx_cfg_l));
17599d587972SSantwona Behera nxgep->srds_prop.prop_set |= NXGE_SRDS_TXCFGL;
17609d587972SSantwona Behera ddi_prop_free(s_prop_val);
17619d587972SSantwona Behera }
17629d587972SSantwona Behera if (ddi_prop_lookup_byte_array(DDI_DEV_T_ANY, nxgep->dip, 0,
17639d587972SSantwona Behera "tx-cfg-h", &s_prop_val, &prop_len) == DDI_PROP_SUCCESS) {
17649d587972SSantwona Behera nxgep->srds_prop.tx_cfg_h =
17659d587972SSantwona Behera (uint16_t)(*(uint32_t *)s_prop_val);
17669d587972SSantwona Behera NXGE_DEBUG_MSG((nxgep, VPD_CTL,
17679d587972SSantwona Behera "nxge_get_config_properties: "
17689d587972SSantwona Behera "tx_cfg_h 0x%x, Read from OBP",
17699d587972SSantwona Behera nxgep->srds_prop.tx_cfg_h));
17709d587972SSantwona Behera nxgep->srds_prop.prop_set |= NXGE_SRDS_TXCFGH;
17719d587972SSantwona Behera ddi_prop_free(s_prop_val);
17729d587972SSantwona Behera }
17739d587972SSantwona Behera if (ddi_prop_lookup_byte_array(DDI_DEV_T_ANY, nxgep->dip, 0,
17749d587972SSantwona Behera "rx-cfg-l", &s_prop_val, &prop_len) == DDI_PROP_SUCCESS) {
17759d587972SSantwona Behera nxgep->srds_prop.rx_cfg_l =
17769d587972SSantwona Behera (uint16_t)(*(uint32_t *)s_prop_val);
17779d587972SSantwona Behera NXGE_DEBUG_MSG((nxgep, VPD_CTL,
17789d587972SSantwona Behera "nxge_get_config_properties: "
17799d587972SSantwona Behera "rx_cfg_l 0x%x, Read from OBP",
17809d587972SSantwona Behera nxgep->srds_prop.rx_cfg_l));
17819d587972SSantwona Behera nxgep->srds_prop.prop_set |= NXGE_SRDS_RXCFGL;
17829d587972SSantwona Behera ddi_prop_free(s_prop_val);
17839d587972SSantwona Behera }
17849d587972SSantwona Behera if (ddi_prop_lookup_byte_array(DDI_DEV_T_ANY, nxgep->dip, 0,
17859d587972SSantwona Behera "rx-cfg-h", &s_prop_val, &prop_len) == DDI_PROP_SUCCESS) {
17869d587972SSantwona Behera nxgep->srds_prop.rx_cfg_h =
17879d587972SSantwona Behera (uint16_t)(*(uint32_t *)s_prop_val);
17889d587972SSantwona Behera NXGE_DEBUG_MSG((nxgep, VPD_CTL,
17899d587972SSantwona Behera "nxge_get_config_properties: "
17909d587972SSantwona Behera "rx_cfg_h 0x%x, Read from OBP",
17919d587972SSantwona Behera nxgep->srds_prop.rx_cfg_h));
17929d587972SSantwona Behera nxgep->srds_prop.prop_set |= NXGE_SRDS_RXCFGH;
17939d587972SSantwona Behera ddi_prop_free(s_prop_val);
17949d587972SSantwona Behera }
17959d587972SSantwona Behera if (ddi_prop_lookup_byte_array(DDI_DEV_T_ANY, nxgep->dip, 0,
17969d587972SSantwona Behera "pll-cfg", &s_prop_val, &prop_len) == DDI_PROP_SUCCESS) {
17979d587972SSantwona Behera nxgep->srds_prop.pll_cfg_l =
17989d587972SSantwona Behera (uint16_t)(*(uint32_t *)s_prop_val);
17999d587972SSantwona Behera NXGE_DEBUG_MSG((nxgep, VPD_CTL,
18009d587972SSantwona Behera "nxge_get_config_properties: "
18019d587972SSantwona Behera "pll_cfg_l 0x%x, Read from OBP",
18029d587972SSantwona Behera nxgep->srds_prop.pll_cfg_l));
18039d587972SSantwona Behera nxgep->srds_prop.prop_set |= NXGE_SRDS_PLLCFGL;
18049d587972SSantwona Behera ddi_prop_free(s_prop_val);
18059d587972SSantwona Behera }
18069d587972SSantwona Behera if (ddi_prop_lookup_byte_array(DDI_DEV_T_ANY, nxgep->dip, 0,
18079d587972SSantwona Behera "phy-reg-values", &s_prop_val, &prop_len) ==
18089d587972SSantwona Behera DDI_PROP_SUCCESS) {
18099d587972SSantwona Behera
18109d587972SSantwona Behera int tun_cnt, i;
18119d587972SSantwona Behera uchar_t *arr = s_prop_val;
18129d587972SSantwona Behera
18139d587972SSantwona Behera tun_cnt = prop_len / 6; /* 3 values, 2 bytes each */
18149d587972SSantwona Behera nxgep->phy_prop.arr =
18159d587972SSantwona Behera KMEM_ZALLOC(sizeof (nxge_phy_mdio_val_t) * tun_cnt,
18169d587972SSantwona Behera KM_SLEEP);
18179d587972SSantwona Behera nxgep->phy_prop.cnt = tun_cnt;
18189d587972SSantwona Behera for (i = 0; i < tun_cnt; i++) {
18199d587972SSantwona Behera nxgep->phy_prop.arr[i].dev = *(uint16_t *)arr;
18209d587972SSantwona Behera arr += 2;
18219d587972SSantwona Behera nxgep->phy_prop.arr[i].reg = *(uint16_t *)arr;
18229d587972SSantwona Behera arr += 2;
18239d587972SSantwona Behera nxgep->phy_prop.arr[i].val = *(uint16_t *)arr;
18249d587972SSantwona Behera arr += 2;
18259d587972SSantwona Behera NXGE_DEBUG_MSG((nxgep, VPD_CTL,
18269d587972SSantwona Behera "nxge_get_config_properties: From OBP, "
18279d587972SSantwona Behera "read PHY <dev.reg.val> = "
18289d587972SSantwona Behera "<0x%x.0x%x.0x%x>",
18299d587972SSantwona Behera nxgep->phy_prop.arr[i].dev,
18309d587972SSantwona Behera nxgep->phy_prop.arr[i].reg,
18319d587972SSantwona Behera nxgep->phy_prop.arr[i].val));
18329d587972SSantwona Behera }
18339d587972SSantwona Behera ddi_prop_free(s_prop_val);
18349d587972SSantwona Behera }
18354df55fdeSJanie Lu }
18364df55fdeSJanie Lu
18376f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, VPD_CTL, " <== nxge_get_config_properties"));
18386f45ec7bSml29623 return (status);
18396f45ec7bSml29623 }
18406f45ec7bSml29623
18416f45ec7bSml29623 static nxge_status_t
nxge_use_cfg_n2niu_properties(p_nxge_t nxgep)18426f45ec7bSml29623 nxge_use_cfg_n2niu_properties(p_nxge_t nxgep)
18436f45ec7bSml29623 {
18446f45ec7bSml29623 nxge_status_t status = NXGE_OK;
18456f45ec7bSml29623
18466f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL, " ==> nxge_use_cfg_n2niu_properties"));
18476f45ec7bSml29623
18486f45ec7bSml29623 status = nxge_use_default_dma_config_n2(nxgep);
18496f45ec7bSml29623 if (status != NXGE_OK) {
18506f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
18516f45ec7bSml29623 " ==> nxge_use_cfg_n2niu_properties (err 0x%x)",
18526f45ec7bSml29623 status));
18536f45ec7bSml29623 return (status | NXGE_ERROR);
18546f45ec7bSml29623 }
18556f45ec7bSml29623
18566f45ec7bSml29623 (void) nxge_use_cfg_vlan_class_config(nxgep);
18576f45ec7bSml29623 (void) nxge_use_cfg_mac_class_config(nxgep);
18586f45ec7bSml29623 (void) nxge_use_cfg_class_config(nxgep);
18596f45ec7bSml29623 (void) nxge_use_cfg_link_cfg(nxgep);
18606f45ec7bSml29623
18616f45ec7bSml29623 /*
18626f45ec7bSml29623 * Read in the hardware (fcode) properties. Use the ndd array to read
18636f45ec7bSml29623 * each property.
18646f45ec7bSml29623 */
18656f45ec7bSml29623 (void) nxge_get_param_soft_properties(nxgep);
18666f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL, " <== nxge_use_cfg_n2niu_properties"));
18676f45ec7bSml29623
18686f45ec7bSml29623 return (status);
18696f45ec7bSml29623 }
18706f45ec7bSml29623
18716f45ec7bSml29623 static void
nxge_use_cfg_neptune_properties(p_nxge_t nxgep)18726f45ec7bSml29623 nxge_use_cfg_neptune_properties(p_nxge_t nxgep)
18736f45ec7bSml29623 {
18746f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL, "==> nxge_use_cfg_neptune_properties"));
18756f45ec7bSml29623
18766f45ec7bSml29623 (void) nxge_use_cfg_dma_config(nxgep);
18776f45ec7bSml29623 (void) nxge_use_cfg_vlan_class_config(nxgep);
18786f45ec7bSml29623 (void) nxge_use_cfg_mac_class_config(nxgep);
18796f45ec7bSml29623 (void) nxge_use_cfg_class_config(nxgep);
18806f45ec7bSml29623 (void) nxge_use_cfg_link_cfg(nxgep);
18816f45ec7bSml29623
18826f45ec7bSml29623 /*
18836f45ec7bSml29623 * Read in the hardware (fcode) properties. Use the ndd array to read
18846f45ec7bSml29623 * each property.
18856f45ec7bSml29623 */
18866f45ec7bSml29623 (void) nxge_get_param_soft_properties(nxgep);
18876f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL, "<== nxge_use_cfg_neptune_properties"));
18886f45ec7bSml29623 }
18896f45ec7bSml29623
18906f45ec7bSml29623 /*
1891952a2464SMichael Speer * FWARC 2006/556 for N2 NIU. Get the properties
1892952a2464SMichael Speer * from the prom.
18936f45ec7bSml29623 */
18946f45ec7bSml29623 static nxge_status_t
nxge_use_default_dma_config_n2(p_nxge_t nxgep)18956f45ec7bSml29623 nxge_use_default_dma_config_n2(p_nxge_t nxgep)
18966f45ec7bSml29623 {
18976f45ec7bSml29623 int ndmas;
18986f45ec7bSml29623 uint8_t func;
18996f45ec7bSml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp;
19006f45ec7bSml29623 p_nxge_hw_pt_cfg_t p_cfgp;
19016f45ec7bSml29623 int *prop_val;
19026f45ec7bSml29623 uint_t prop_len;
19036f45ec7bSml29623 int i;
19046f45ec7bSml29623 nxge_status_t status = NXGE_OK;
19056f45ec7bSml29623
19066f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, OBP_CTL, "==> nxge_use_default_dma_config_n2"));
19076f45ec7bSml29623
19086f45ec7bSml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config;
19096f45ec7bSml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config;
19106f45ec7bSml29623
19116f45ec7bSml29623 func = nxgep->function_num;
19126f45ec7bSml29623 p_cfgp->function_number = func;
19136f45ec7bSml29623 ndmas = NXGE_TDMA_PER_NIU_PORT;
19146f45ec7bSml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, nxgep->dip, 0,
19156f45ec7bSml29623 "tx-dma-channels", (int **)&prop_val,
19166f45ec7bSml29623 &prop_len) == DDI_PROP_SUCCESS) {
1917952a2464SMichael Speer if (prop_len != NXGE_NIU_TDMA_PROP_LEN) {
1918952a2464SMichael Speer ddi_prop_free(prop_val);
1919952a2464SMichael Speer NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
1920952a2464SMichael Speer "==> nxge_use_default_dma_config_n2: "
1921290b5530SMichael Speer "invalid tx-dma-channels property for the NIU, "
1922290b5530SMichael Speer "using defaults"));
1923290b5530SMichael Speer /*
1924290b5530SMichael Speer * Just failover to defaults
1925290b5530SMichael Speer */
1926290b5530SMichael Speer p_cfgp->tdc.start = (func * NXGE_TDMA_PER_NIU_PORT);
1927290b5530SMichael Speer ndmas = NXGE_TDMA_PER_NIU_PORT;
1928952a2464SMichael Speer } else {
1929678453a8Sspeer p_cfgp->tdc.start = prop_val[0];
19306f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, OBP_CTL,
19316f45ec7bSml29623 "==> nxge_use_default_dma_config_n2: tdc starts %d "
1932678453a8Sspeer "(#%d)", p_cfgp->tdc.start, prop_len));
19336f45ec7bSml29623
19346f45ec7bSml29623 ndmas = prop_val[1];
19356f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, OBP_CTL,
19366f45ec7bSml29623 "==> nxge_use_default_dma_config_n2: #tdc %d (#%d)",
19376f45ec7bSml29623 ndmas, prop_len));
19386f45ec7bSml29623 ddi_prop_free(prop_val);
1939952a2464SMichael Speer }
19406f45ec7bSml29623 } else {
19416f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
19426f45ec7bSml29623 "==> nxge_use_default_dma_config_n2: "
19436f45ec7bSml29623 "get tx-dma-channels failed"));
19446f45ec7bSml29623 return (NXGE_DDI_FAILED);
19456f45ec7bSml29623 }
19466f45ec7bSml29623
1947da14cebeSEric Cheng p_cfgp->tdc.count = ndmas;
1948678453a8Sspeer p_cfgp->tdc.owned = p_cfgp->tdc.count;
19496f45ec7bSml29623
19506f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, OBP_CTL, "==> nxge_use_default_dma_config_n2: "
1951da14cebeSEric Cheng "p_cfgp 0x%llx max_tdcs %d start %d",
1952da14cebeSEric Cheng p_cfgp, p_cfgp->tdc.count, p_cfgp->tdc.start));
19536f45ec7bSml29623
19546f45ec7bSml29623 /* Receive DMA */
19556f45ec7bSml29623 ndmas = NXGE_RDMA_PER_NIU_PORT;
19566f45ec7bSml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, nxgep->dip, 0,
19576f45ec7bSml29623 "rx-dma-channels", (int **)&prop_val,
19586f45ec7bSml29623 &prop_len) == DDI_PROP_SUCCESS) {
1959290b5530SMichael Speer if (prop_len != NXGE_NIU_RDMA_PROP_LEN) {
1960952a2464SMichael Speer ddi_prop_free(prop_val);
1961952a2464SMichael Speer NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
1962952a2464SMichael Speer "==> nxge_use_default_dma_config_n2: "
1963290b5530SMichael Speer "invalid rx-dma-channels property for the NIU, "
1964290b5530SMichael Speer "using defaults"));
1965290b5530SMichael Speer /*
1966290b5530SMichael Speer * Just failover to defaults
1967290b5530SMichael Speer */
1968290b5530SMichael Speer p_cfgp->start_rdc = (func * NXGE_RDMA_PER_NIU_PORT);
1969290b5530SMichael Speer ndmas = NXGE_RDMA_PER_NIU_PORT;
1970952a2464SMichael Speer } else {
19716f45ec7bSml29623 p_cfgp->start_rdc = prop_val[0];
19726f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, OBP_CTL,
1973952a2464SMichael Speer "==> nxge_use_default_dma_config_n2(obp):"
1974952a2464SMichael Speer " rdc start %d (#%d)",
1975952a2464SMichael Speer p_cfgp->start_rdc, prop_len));
19766f45ec7bSml29623 ndmas = prop_val[1];
19776f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, OBP_CTL,
1978952a2464SMichael Speer "==> nxge_use_default_dma_config_n2(obp): "
1979952a2464SMichael Speer "#rdc %d (#%d)", ndmas, prop_len));
19806f45ec7bSml29623 ddi_prop_free(prop_val);
1981952a2464SMichael Speer }
19826f45ec7bSml29623 } else {
19836f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
19846f45ec7bSml29623 "==> nxge_use_default_dma_config_n2: "
19856f45ec7bSml29623 "get rx-dma-channel failed"));
19866f45ec7bSml29623 return (NXGE_DDI_FAILED);
19876f45ec7bSml29623 }
19886f45ec7bSml29623
1989da14cebeSEric Cheng p_cfgp->max_rdcs = ndmas;
19906f45ec7bSml29623 nxgep->rdc_mask = (ndmas - 1);
19916f45ec7bSml29623
19926f45ec7bSml29623 /* Hypervisor: rdc # and group # use the same # !! */
1993678453a8Sspeer p_cfgp->max_grpids = p_cfgp->max_rdcs + p_cfgp->tdc.owned;
19946f45ec7bSml29623 p_cfgp->mif_ldvid = p_cfgp->mac_ldvid = p_cfgp->ser_ldvid = 0;
19956f45ec7bSml29623
19966f45ec7bSml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, nxgep->dip, 0,
19976f45ec7bSml29623 "interrupts", (int **)&prop_val,
19986f45ec7bSml29623 &prop_len) == DDI_PROP_SUCCESS) {
1999952a2464SMichael Speer if ((prop_len != NXGE_NIU_0_INTR_PROP_LEN) &&
2000952a2464SMichael Speer (prop_len != NXGE_NIU_1_INTR_PROP_LEN)) {
2001952a2464SMichael Speer ddi_prop_free(prop_val);
2002952a2464SMichael Speer NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
2003952a2464SMichael Speer "==> nxge_use_default_dma_config_n2: "
2004952a2464SMichael Speer "get interrupts failed"));
2005952a2464SMichael Speer return (NXGE_DDI_FAILED);
2006952a2464SMichael Speer }
2007952a2464SMichael Speer
20086f45ec7bSml29623 /*
20096f45ec7bSml29623 * For each device assigned, the content of each interrupts
20106f45ec7bSml29623 * property is its logical device group.
20116f45ec7bSml29623 *
20126f45ec7bSml29623 * Assignment of interrupts property is in the the following
20136f45ec7bSml29623 * order:
20146f45ec7bSml29623 *
20156f45ec7bSml29623 * MAC MIF (if configured) SYSTEM ERROR (if configured) first
20166f45ec7bSml29623 * receive channel next channel...... last receive channel
20176f45ec7bSml29623 * first transmit channel next channel...... last transmit
20186f45ec7bSml29623 * channel
20196f45ec7bSml29623 *
20206f45ec7bSml29623 * prop_len should be at least for one mac and total # of rx and
20216f45ec7bSml29623 * tx channels. Function 0 owns MIF and ERROR
20226f45ec7bSml29623 */
20236f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, OBP_CTL,
20246f45ec7bSml29623 "==> nxge_use_default_dma_config_n2(obp): "
20256f45ec7bSml29623 "# interrupts %d", prop_len));
20266f45ec7bSml29623
20276f45ec7bSml29623 switch (func) {
20286f45ec7bSml29623 case 0:
20296f45ec7bSml29623 p_cfgp->ldg_chn_start = 3;
20306f45ec7bSml29623 p_cfgp->mac_ldvid = NXGE_MAC_LD_PORT0;
20316f45ec7bSml29623 p_cfgp->mif_ldvid = NXGE_MIF_LD;
20326f45ec7bSml29623 p_cfgp->ser_ldvid = NXGE_SYS_ERROR_LD;
20336f45ec7bSml29623
20346f45ec7bSml29623 break;
20356f45ec7bSml29623 case 1:
20366f45ec7bSml29623 p_cfgp->ldg_chn_start = 1;
20376f45ec7bSml29623 p_cfgp->mac_ldvid = NXGE_MAC_LD_PORT1;
20386f45ec7bSml29623
20396f45ec7bSml29623 break;
20406f45ec7bSml29623 default:
20416f45ec7bSml29623 status = NXGE_DDI_FAILED;
20426f45ec7bSml29623 break;
20436f45ec7bSml29623 }
20446f45ec7bSml29623
20456f45ec7bSml29623 if (status != NXGE_OK)
20466f45ec7bSml29623 return (status);
20476f45ec7bSml29623
20486f45ec7bSml29623 for (i = 0; i < prop_len; i++) {
20496f45ec7bSml29623 p_cfgp->ldg[i] = prop_val[i];
20506f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, OBP_CTL,
20516f45ec7bSml29623 "==> nxge_use_default_dma_config_n2(obp): "
2052678453a8Sspeer "F%d: interrupt #%d, ldg %d",
2053678453a8Sspeer nxgep->function_num, i, p_cfgp->ldg[i]));
20546f45ec7bSml29623 }
20556f45ec7bSml29623
20566f45ec7bSml29623 p_cfgp->max_grpids = prop_len;
20576f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, OBP_CTL,
20586f45ec7bSml29623 "==> nxge_use_default_dma_config_n2(obp): %d "
20596f45ec7bSml29623 "(#%d) maxgrpids %d channel starts %d",
20606f45ec7bSml29623 p_cfgp->mac_ldvid, i, p_cfgp->max_grpids,
20616f45ec7bSml29623 p_cfgp->ldg_chn_start));
20626f45ec7bSml29623 ddi_prop_free(prop_val);
20636f45ec7bSml29623 } else {
20646f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
20656f45ec7bSml29623 "==> nxge_use_default_dma_config_n2: "
20666f45ec7bSml29623 "get interrupts failed"));
20676f45ec7bSml29623 return (NXGE_DDI_FAILED);
20686f45ec7bSml29623 }
20696f45ec7bSml29623
20706f45ec7bSml29623 p_cfgp->max_ldgs = p_cfgp->max_grpids;
20716f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, OBP_CTL,
2072da14cebeSEric Cheng "==> nxge_use_default_dma_config_n2: p_cfgp 0x%llx max_rdcs %d "
2073da14cebeSEric Cheng "max_grpids %d macid %d mifid %d serrid %d",
2074da14cebeSEric Cheng p_cfgp, p_cfgp->max_rdcs, p_cfgp->max_grpids,
20756f45ec7bSml29623 p_cfgp->mac_ldvid, p_cfgp->mif_ldvid, p_cfgp->ser_ldvid));
20766f45ec7bSml29623
2077da14cebeSEric Cheng
20786f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, OBP_CTL, "==> nxge_use_default_dma_config_n2: "
20796f45ec7bSml29623 "p_cfgp p%p start_ldg %d nxgep->max_ldgs %d",
20806f45ec7bSml29623 p_cfgp, p_cfgp->start_ldg, p_cfgp->max_ldgs));
20816f45ec7bSml29623
20826f45ec7bSml29623 /*
20836f45ec7bSml29623 * RDC groups and the beginning RDC group assigned to this function.
20846f45ec7bSml29623 */
2085da14cebeSEric Cheng p_cfgp->max_rdc_grpids = NXGE_MAX_RDC_GROUPS / nxgep->nports;
2086da14cebeSEric Cheng p_cfgp->def_mac_rxdma_grpid =
2087da14cebeSEric Cheng nxgep->function_num * NXGE_MAX_RDC_GROUPS / nxgep->nports;
2088da14cebeSEric Cheng p_cfgp->def_mac_txdma_grpid =
2089da14cebeSEric Cheng nxgep->function_num * NXGE_MAX_TDC_GROUPS / nxgep->nports;
2090678453a8Sspeer
2091da14cebeSEric Cheng if ((p_cfgp->def_mac_rxdma_grpid = nxge_fzc_rdc_tbl_bind(nxgep,
2092da14cebeSEric Cheng p_cfgp->def_mac_rxdma_grpid, B_TRUE)) >= NXGE_MAX_RDC_GRPS) {
2093678453a8Sspeer NXGE_ERROR_MSG((nxgep, CFG_CTL,
2094678453a8Sspeer "nxge_use_default_dma_config_n2(): "
2095678453a8Sspeer "nxge_fzc_rdc_tbl_bind failed"));
2096678453a8Sspeer return (NXGE_DDI_FAILED);
2097678453a8Sspeer }
20986f45ec7bSml29623
20996f45ec7bSml29623 status = ddi_prop_update_int(DDI_DEV_T_NONE, nxgep->dip,
2100678453a8Sspeer "rx-rdc-grps", p_cfgp->max_rdc_grpids);
21016f45ec7bSml29623 if (status) {
21026f45ec7bSml29623 return (NXGE_DDI_FAILED);
21036f45ec7bSml29623 }
21046f45ec7bSml29623 status = ddi_prop_update_int(DDI_DEV_T_NONE, nxgep->dip,
2105678453a8Sspeer "rx-rdc-grps-begin", p_cfgp->def_mac_rxdma_grpid);
21066f45ec7bSml29623 if (status) {
21076f45ec7bSml29623 (void) ddi_prop_remove(DDI_DEV_T_NONE, nxgep->dip,
21086f45ec7bSml29623 "rx-rdc-grps");
21096f45ec7bSml29623 return (NXGE_DDI_FAILED);
21106f45ec7bSml29623 }
21116f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, OBP_CTL, "==> nxge_use_default_dma_config_n2: "
21126f45ec7bSml29623 "p_cfgp $%p # rdc groups %d start rdc group id %d",
21136f45ec7bSml29623 p_cfgp, p_cfgp->max_rdc_grpids,
2114678453a8Sspeer p_cfgp->def_mac_rxdma_grpid));
21156f45ec7bSml29623
2116c1f9c6e5SSantwona Behera nxgep->intr_timeout = NXGE_RDC_RCR_TIMEOUT;
2117c1f9c6e5SSantwona Behera if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, nxgep->dip, 0,
2118c1f9c6e5SSantwona Behera "rxdma-intr-time", (int **)&prop_val, &prop_len) ==
2119c1f9c6e5SSantwona Behera DDI_PROP_SUCCESS) {
2120c1f9c6e5SSantwona Behera if ((prop_len > 0) && (prop_len <= p_cfgp->max_rdcs)) {
2121c1f9c6e5SSantwona Behera nxgep->intr_timeout = prop_val[0];
2122c1f9c6e5SSantwona Behera (void) ddi_prop_update_int_array(DDI_DEV_T_NONE,
2123c1f9c6e5SSantwona Behera nxgep->dip, "rxdma-intr-time", prop_val, prop_len);
2124c1f9c6e5SSantwona Behera }
2125c1f9c6e5SSantwona Behera ddi_prop_free(prop_val);
2126c1f9c6e5SSantwona Behera }
2127c1f9c6e5SSantwona Behera
2128c1f9c6e5SSantwona Behera nxgep->intr_threshold = NXGE_RDC_RCR_THRESHOLD;
2129c1f9c6e5SSantwona Behera if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, nxgep->dip, 0,
2130c1f9c6e5SSantwona Behera "rxdma-intr-pkts", (int **)&prop_val, &prop_len) ==
2131c1f9c6e5SSantwona Behera DDI_PROP_SUCCESS) {
2132c1f9c6e5SSantwona Behera if ((prop_len > 0) && (prop_len <= p_cfgp->max_rdcs)) {
2133c1f9c6e5SSantwona Behera nxgep->intr_threshold = prop_val[0];
2134c1f9c6e5SSantwona Behera (void) ddi_prop_update_int_array(DDI_DEV_T_NONE,
2135c1f9c6e5SSantwona Behera nxgep->dip, "rxdma-intr-pkts", prop_val, prop_len);
2136c1f9c6e5SSantwona Behera }
2137c1f9c6e5SSantwona Behera ddi_prop_free(prop_val);
2138c1f9c6e5SSantwona Behera }
2139c1f9c6e5SSantwona Behera
21406f45ec7bSml29623 nxge_set_hw_dma_config(nxgep);
21416f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, OBP_CTL, "<== nxge_use_default_dma_config_n2"));
21426f45ec7bSml29623 return (status);
21436f45ec7bSml29623 }
21446f45ec7bSml29623
21456f45ec7bSml29623 static void
nxge_use_cfg_dma_config(p_nxge_t nxgep)21466f45ec7bSml29623 nxge_use_cfg_dma_config(p_nxge_t nxgep)
21476f45ec7bSml29623 {
214859ac0c16Sdavemq int tx_ndmas, rx_ndmas, nrxgp, st_txdma, st_rxdma;
21496f45ec7bSml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp;
21506f45ec7bSml29623 p_nxge_hw_pt_cfg_t p_cfgp;
21516f45ec7bSml29623 dev_info_t *dip;
21526f45ec7bSml29623 p_nxge_param_t param_arr;
21536f45ec7bSml29623 char *prop;
21546f45ec7bSml29623 int *prop_val;
21556f45ec7bSml29623 uint_t prop_len;
215659ac0c16Sdavemq int i;
215759ac0c16Sdavemq uint8_t *ch_arr_p;
21586f45ec7bSml29623
21596f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL, " ==> nxge_use_cfg_dma_config"));
21606f45ec7bSml29623 param_arr = nxgep->param_arr;
21616f45ec7bSml29623
21626f45ec7bSml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config;
21636f45ec7bSml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config;
21646f45ec7bSml29623 dip = nxgep->dip;
21656f45ec7bSml29623 p_cfgp->function_number = nxgep->function_num;
21666f45ec7bSml29623 prop = param_arr[param_txdma_channels_begin].fcode_name;
21676f45ec7bSml29623
21686f45ec7bSml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, 0, prop,
21696f45ec7bSml29623 &prop_val, &prop_len) == DDI_PROP_SUCCESS) {
2170678453a8Sspeer p_cfgp->tdc.start = *prop_val;
21716f45ec7bSml29623 ddi_prop_free(prop_val);
21726f45ec7bSml29623 } else {
217359ac0c16Sdavemq switch (nxgep->niu_type) {
217459ac0c16Sdavemq case NEPTUNE_4_1GC:
217559ac0c16Sdavemq ch_arr_p = &tx_4_1G[0];
217659ac0c16Sdavemq break;
217759ac0c16Sdavemq case NEPTUNE_2_10GF:
217859ac0c16Sdavemq ch_arr_p = &tx_2_10G[0];
217959ac0c16Sdavemq break;
218059ac0c16Sdavemq case NEPTUNE_2_10GF_2_1GC:
218159a835ddSjoycey case NEPTUNE_2_10GF_2_1GRF:
218259ac0c16Sdavemq ch_arr_p = &tx_2_10G_2_1G[0];
218359ac0c16Sdavemq break;
218459ac0c16Sdavemq case NEPTUNE_1_10GF_3_1GC:
218559ac0c16Sdavemq ch_arr_p = &tx_1_10G_3_1G[0];
218659ac0c16Sdavemq break;
218759ac0c16Sdavemq case NEPTUNE_1_1GC_1_10GF_2_1GC:
218859ac0c16Sdavemq ch_arr_p = &tx_1_1G_1_10G_2_1G[0];
218959ac0c16Sdavemq break;
219059ac0c16Sdavemq default:
2191d81011f0Ssbehera switch (nxgep->platform_type) {
2192d81011f0Ssbehera case P_NEPTUNE_ALONSO:
2193d81011f0Ssbehera ch_arr_p = &tx_2_10G_2_1G[0];
2194d81011f0Ssbehera break;
2195d81011f0Ssbehera default:
219659ac0c16Sdavemq ch_arr_p = &p4_tx_equal[0];
219759ac0c16Sdavemq break;
21986f45ec7bSml29623 }
2199d81011f0Ssbehera break;
2200d81011f0Ssbehera }
220159ac0c16Sdavemq st_txdma = 0;
220259ac0c16Sdavemq for (i = 0; i < nxgep->function_num; i++, ch_arr_p++)
220359ac0c16Sdavemq st_txdma += *ch_arr_p;
220459ac0c16Sdavemq
22056f45ec7bSml29623 (void) ddi_prop_update_int(DDI_DEV_T_NONE, nxgep->dip,
220659ac0c16Sdavemq prop, st_txdma);
2207678453a8Sspeer p_cfgp->tdc.start = st_txdma;
22086f45ec7bSml29623 }
22096f45ec7bSml29623
22106f45ec7bSml29623 prop = param_arr[param_txdma_channels].fcode_name;
22116f45ec7bSml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, 0, prop,
22126f45ec7bSml29623 &prop_val, &prop_len) == DDI_PROP_SUCCESS) {
22136f45ec7bSml29623 tx_ndmas = *prop_val;
22146f45ec7bSml29623 ddi_prop_free(prop_val);
22156f45ec7bSml29623 } else {
221659ac0c16Sdavemq switch (nxgep->niu_type) {
221759ac0c16Sdavemq case NEPTUNE_4_1GC:
221859ac0c16Sdavemq tx_ndmas = tx_4_1G[nxgep->function_num];
221959ac0c16Sdavemq break;
222059ac0c16Sdavemq case NEPTUNE_2_10GF:
222159ac0c16Sdavemq tx_ndmas = tx_2_10G[nxgep->function_num];
222259ac0c16Sdavemq break;
222359ac0c16Sdavemq case NEPTUNE_2_10GF_2_1GC:
222459a835ddSjoycey case NEPTUNE_2_10GF_2_1GRF:
222559ac0c16Sdavemq tx_ndmas = tx_2_10G_2_1G[nxgep->function_num];
222659ac0c16Sdavemq break;
222759ac0c16Sdavemq case NEPTUNE_1_10GF_3_1GC:
222859ac0c16Sdavemq tx_ndmas = tx_1_10G_3_1G[nxgep->function_num];
222959ac0c16Sdavemq break;
223059ac0c16Sdavemq case NEPTUNE_1_1GC_1_10GF_2_1GC:
223159ac0c16Sdavemq tx_ndmas = tx_1_1G_1_10G_2_1G[nxgep->function_num];
223259ac0c16Sdavemq break;
223359ac0c16Sdavemq default:
2234d81011f0Ssbehera switch (nxgep->platform_type) {
2235d81011f0Ssbehera case P_NEPTUNE_ALONSO:
2236d81011f0Ssbehera tx_ndmas = tx_2_10G_2_1G[nxgep->function_num];
2237d81011f0Ssbehera break;
2238d81011f0Ssbehera default:
223959ac0c16Sdavemq tx_ndmas = p4_tx_equal[nxgep->function_num];
224059ac0c16Sdavemq break;
22416f45ec7bSml29623 }
2242d81011f0Ssbehera break;
2243d81011f0Ssbehera }
22446f45ec7bSml29623 (void) ddi_prop_update_int(DDI_DEV_T_NONE, nxgep->dip,
22456f45ec7bSml29623 prop, tx_ndmas);
22466f45ec7bSml29623 }
22476f45ec7bSml29623
2248da14cebeSEric Cheng p_cfgp->tdc.count = tx_ndmas;
2249678453a8Sspeer p_cfgp->tdc.owned = p_cfgp->tdc.count;
22506f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL, "==> nxge_use_cfg_dma_config: "
2251da14cebeSEric Cheng "p_cfgp 0x%llx max_tdcs %d", p_cfgp, p_cfgp->tdc.count));
22526f45ec7bSml29623
22536f45ec7bSml29623 prop = param_arr[param_rxdma_channels_begin].fcode_name;
22546f45ec7bSml29623
22556f45ec7bSml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, 0, prop,
22566f45ec7bSml29623 &prop_val, &prop_len) == DDI_PROP_SUCCESS) {
22576f45ec7bSml29623 p_cfgp->start_rdc = *prop_val;
22586f45ec7bSml29623 ddi_prop_free(prop_val);
22596f45ec7bSml29623 } else {
226059ac0c16Sdavemq switch (nxgep->niu_type) {
226159ac0c16Sdavemq case NEPTUNE_4_1GC:
226259ac0c16Sdavemq ch_arr_p = &rx_4_1G[0];
226359ac0c16Sdavemq break;
226459ac0c16Sdavemq case NEPTUNE_2_10GF:
226559ac0c16Sdavemq ch_arr_p = &rx_2_10G[0];
226659ac0c16Sdavemq break;
226759ac0c16Sdavemq case NEPTUNE_2_10GF_2_1GC:
226859a835ddSjoycey case NEPTUNE_2_10GF_2_1GRF:
226959ac0c16Sdavemq ch_arr_p = &rx_2_10G_2_1G[0];
227059ac0c16Sdavemq break;
227159ac0c16Sdavemq case NEPTUNE_1_10GF_3_1GC:
227259ac0c16Sdavemq ch_arr_p = &rx_1_10G_3_1G[0];
227359ac0c16Sdavemq break;
227459ac0c16Sdavemq case NEPTUNE_1_1GC_1_10GF_2_1GC:
227559ac0c16Sdavemq ch_arr_p = &rx_1_1G_1_10G_2_1G[0];
227659ac0c16Sdavemq break;
227759ac0c16Sdavemq default:
2278d81011f0Ssbehera switch (nxgep->platform_type) {
2279d81011f0Ssbehera case P_NEPTUNE_ALONSO:
2280d81011f0Ssbehera ch_arr_p = &rx_2_10G_2_1G[0];
2281d81011f0Ssbehera break;
2282d81011f0Ssbehera default:
228359ac0c16Sdavemq ch_arr_p = &p4_rx_equal[0];
228459ac0c16Sdavemq break;
22856f45ec7bSml29623 }
2286d81011f0Ssbehera break;
2287d81011f0Ssbehera }
228859ac0c16Sdavemq st_rxdma = 0;
228959ac0c16Sdavemq for (i = 0; i < nxgep->function_num; i++, ch_arr_p++)
229059ac0c16Sdavemq st_rxdma += *ch_arr_p;
229159ac0c16Sdavemq
22926f45ec7bSml29623 (void) ddi_prop_update_int(DDI_DEV_T_NONE, nxgep->dip,
229359ac0c16Sdavemq prop, st_rxdma);
229459ac0c16Sdavemq p_cfgp->start_rdc = st_rxdma;
22956f45ec7bSml29623 }
22966f45ec7bSml29623
22976f45ec7bSml29623 prop = param_arr[param_rxdma_channels].fcode_name;
22986f45ec7bSml29623
22996f45ec7bSml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, 0, prop,
23006f45ec7bSml29623 &prop_val, &prop_len) == DDI_PROP_SUCCESS) {
23016f45ec7bSml29623 rx_ndmas = *prop_val;
23026f45ec7bSml29623 ddi_prop_free(prop_val);
23036f45ec7bSml29623 } else {
230459ac0c16Sdavemq switch (nxgep->niu_type) {
230559ac0c16Sdavemq case NEPTUNE_4_1GC:
230659ac0c16Sdavemq rx_ndmas = rx_4_1G[nxgep->function_num];
230759ac0c16Sdavemq break;
230859ac0c16Sdavemq case NEPTUNE_2_10GF:
230959ac0c16Sdavemq rx_ndmas = rx_2_10G[nxgep->function_num];
231059ac0c16Sdavemq break;
231159ac0c16Sdavemq case NEPTUNE_2_10GF_2_1GC:
231259a835ddSjoycey case NEPTUNE_2_10GF_2_1GRF:
231359ac0c16Sdavemq rx_ndmas = rx_2_10G_2_1G[nxgep->function_num];
231459ac0c16Sdavemq break;
231559ac0c16Sdavemq case NEPTUNE_1_10GF_3_1GC:
231659ac0c16Sdavemq rx_ndmas = rx_1_10G_3_1G[nxgep->function_num];
231759ac0c16Sdavemq break;
231859ac0c16Sdavemq case NEPTUNE_1_1GC_1_10GF_2_1GC:
231959ac0c16Sdavemq rx_ndmas = rx_1_1G_1_10G_2_1G[nxgep->function_num];
232059ac0c16Sdavemq break;
232159ac0c16Sdavemq default:
2322d81011f0Ssbehera switch (nxgep->platform_type) {
2323d81011f0Ssbehera case P_NEPTUNE_ALONSO:
2324d81011f0Ssbehera rx_ndmas = rx_2_10G_2_1G[nxgep->function_num];
2325d81011f0Ssbehera break;
2326d81011f0Ssbehera default:
232759ac0c16Sdavemq rx_ndmas = p4_rx_equal[nxgep->function_num];
232859ac0c16Sdavemq break;
23296f45ec7bSml29623 }
2330d81011f0Ssbehera break;
2331d81011f0Ssbehera }
23326f45ec7bSml29623 (void) ddi_prop_update_int(DDI_DEV_T_NONE, nxgep->dip,
23336f45ec7bSml29623 prop, rx_ndmas);
23346f45ec7bSml29623 }
23356f45ec7bSml29623
2336da14cebeSEric Cheng p_cfgp->max_rdcs = rx_ndmas;
23376f45ec7bSml29623
2338da14cebeSEric Cheng /*
2339da14cebeSEric Cheng * RDC groups and the beginning RDC group assigned to this function.
2340da14cebeSEric Cheng * XXX: this may be wrong if prop value is used.
2341da14cebeSEric Cheng */
2342da14cebeSEric Cheng p_cfgp->def_mac_rxdma_grpid =
2343da14cebeSEric Cheng nxgep->function_num * NXGE_MAX_RDC_GROUPS / nxgep->nports;
2344da14cebeSEric Cheng p_cfgp->def_mac_txdma_grpid =
2345da14cebeSEric Cheng nxgep->function_num * NXGE_MAX_TDC_GROUPS / nxgep->nports;
2346da14cebeSEric Cheng
2347da14cebeSEric Cheng if ((p_cfgp->def_mac_rxdma_grpid = nxge_fzc_rdc_tbl_bind(nxgep,
2348da14cebeSEric Cheng p_cfgp->def_mac_rxdma_grpid, B_TRUE)) >= NXGE_MAX_RDC_GRPS) {
2349678453a8Sspeer NXGE_ERROR_MSG((nxgep, CFG_CTL,
2350da14cebeSEric Cheng "nxge_use_default_dma_config2(): "
2351678453a8Sspeer "nxge_fzc_rdc_tbl_bind failed"));
2352678453a8Sspeer goto nxge_use_cfg_dma_config_exit;
2353678453a8Sspeer }
2354678453a8Sspeer
23556f45ec7bSml29623 prop = param_arr[param_rx_rdc_grps].fcode_name;
23566f45ec7bSml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, 0, prop,
23576f45ec7bSml29623 &prop_val, &prop_len) == DDI_PROP_SUCCESS) {
23586f45ec7bSml29623 nrxgp = *prop_val;
23596f45ec7bSml29623 ddi_prop_free(prop_val);
23606f45ec7bSml29623 } else {
2361da14cebeSEric Cheng nrxgp = NXGE_MAX_RDC_GRPS / nxgep->nports;
23626f45ec7bSml29623 (void) ddi_prop_update_int(DDI_DEV_T_NONE, nxgep->dip,
23636f45ec7bSml29623 prop, nrxgp);
23646f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL,
23656f45ec7bSml29623 "==> nxge_use_default_dma_config: "
23666f45ec7bSml29623 "num_rdc_grpid not found: use def:# of "
23676f45ec7bSml29623 "rdc groups %d\n", nrxgp));
23686f45ec7bSml29623 }
23696f45ec7bSml29623 p_cfgp->max_rdc_grpids = nrxgp;
23706f45ec7bSml29623
23716f45ec7bSml29623 /*
23726f45ec7bSml29623 * 2/4 ports have the same hard-wired logical groups assigned.
23736f45ec7bSml29623 */
23746f45ec7bSml29623 p_cfgp->start_ldg = nxgep->function_num * NXGE_LDGRP_PER_4PORTS;
23756f45ec7bSml29623 p_cfgp->max_ldgs = NXGE_LDGRP_PER_4PORTS;
23766f45ec7bSml29623
23776f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL, "==> nxge_use_default_dma_config: "
2378da14cebeSEric Cheng "p_cfgp 0x%llx max_rdcs %d max_grpids %d default_grpid %d",
2379da14cebeSEric Cheng p_cfgp, p_cfgp->max_rdcs, p_cfgp->max_grpids,
2380da14cebeSEric Cheng p_cfgp->def_mac_rxdma_grpid));
23816f45ec7bSml29623
23826f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL, "==> nxge_use_cfg_dma_config: "
23836f45ec7bSml29623 "p_cfgp 0x%016llx start_ldg %d nxgep->max_ldgs %d "
2384678453a8Sspeer "def_mac_rxdma_grpid %d",
23856f45ec7bSml29623 p_cfgp, p_cfgp->start_ldg, p_cfgp->max_ldgs,
2386678453a8Sspeer p_cfgp->def_mac_rxdma_grpid));
23876f45ec7bSml29623
2388c1f9c6e5SSantwona Behera nxgep->intr_timeout = NXGE_RDC_RCR_TIMEOUT;
23896f45ec7bSml29623 prop = param_arr[param_rxdma_intr_time].fcode_name;
23906f45ec7bSml29623
23916f45ec7bSml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, 0, prop,
23926f45ec7bSml29623 &prop_val, &prop_len) == DDI_PROP_SUCCESS) {
23936f45ec7bSml29623 if ((prop_len > 0) && (prop_len <= p_cfgp->max_rdcs)) {
2394c1f9c6e5SSantwona Behera nxgep->intr_timeout = prop_val[0];
23956f45ec7bSml29623 (void) ddi_prop_update_int_array(DDI_DEV_T_NONE,
23966f45ec7bSml29623 nxgep->dip, prop, prop_val, prop_len);
23976f45ec7bSml29623 }
23986f45ec7bSml29623 ddi_prop_free(prop_val);
23996f45ec7bSml29623 }
2400c1f9c6e5SSantwona Behera
2401c1f9c6e5SSantwona Behera nxgep->intr_threshold = NXGE_RDC_RCR_THRESHOLD;
24026f45ec7bSml29623 prop = param_arr[param_rxdma_intr_pkts].fcode_name;
24036f45ec7bSml29623
24046f45ec7bSml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, 0, prop,
24056f45ec7bSml29623 &prop_val, &prop_len) == DDI_PROP_SUCCESS) {
24066f45ec7bSml29623 if ((prop_len > 0) && (prop_len <= p_cfgp->max_rdcs)) {
2407c1f9c6e5SSantwona Behera nxgep->intr_threshold = prop_val[0];
24086f45ec7bSml29623 (void) ddi_prop_update_int_array(DDI_DEV_T_NONE,
24096f45ec7bSml29623 nxgep->dip, prop, prop_val, prop_len);
24106f45ec7bSml29623 }
24116f45ec7bSml29623 ddi_prop_free(prop_val);
24126f45ec7bSml29623 }
24136f45ec7bSml29623 nxge_set_hw_dma_config(nxgep);
24146f45ec7bSml29623
241559ac0c16Sdavemq NXGE_DEBUG_MSG((nxgep, CFG_CTL, "<== nxge_use_cfg_dma_config: "
241659ac0c16Sdavemq "sTDC[%d] nTDC[%d] sRDC[%d] nRDC[%d]",
2417678453a8Sspeer p_cfgp->tdc.start, p_cfgp->tdc.count,
241859ac0c16Sdavemq p_cfgp->start_rdc, p_cfgp->max_rdcs));
241959ac0c16Sdavemq
2420678453a8Sspeer nxge_use_cfg_dma_config_exit:
24216f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL, "<== nxge_use_cfg_dma_config"));
24226f45ec7bSml29623 }
24236f45ec7bSml29623
2424678453a8Sspeer void
nxge_get_logical_props(p_nxge_t nxgep)2425678453a8Sspeer nxge_get_logical_props(p_nxge_t nxgep)
2426678453a8Sspeer {
2427678453a8Sspeer nxge_dma_pt_cfg_t *port = &nxgep->pt_config;
2428678453a8Sspeer nxge_hw_pt_cfg_t *hardware;
2429678453a8Sspeer nxge_rdc_grp_t *group;
2430678453a8Sspeer
2431678453a8Sspeer (void) memset(port, 0, sizeof (*port));
2432678453a8Sspeer
2433da14cebeSEric Cheng port->mac_port = nxgep->function_num; /* := function number */
2434678453a8Sspeer
2435678453a8Sspeer /*
2436678453a8Sspeer * alloc_buf_size:
2437678453a8Sspeer * dead variables.
2438678453a8Sspeer */
2439678453a8Sspeer port->rbr_size = nxge_rbr_size;
2440678453a8Sspeer port->rcr_size = nxge_rcr_size;
2441678453a8Sspeer
2442678453a8Sspeer port->tx_dma_map = 0; /* Transmit DMA channel bit map */
2443678453a8Sspeer
2444678453a8Sspeer nxge_set_rdc_intr_property(nxgep);
2445678453a8Sspeer
2446678453a8Sspeer port->rcr_full_header = NXGE_RCR_FULL_HEADER;
2447678453a8Sspeer port->rx_drr_weight = PT_DRR_WT_DEFAULT_10G;
2448678453a8Sspeer
2449678453a8Sspeer /* ----------------------------------------------------- */
2450678453a8Sspeer hardware = &port->hw_config;
2451678453a8Sspeer
2452678453a8Sspeer (void) memset(hardware, 0, sizeof (*hardware));
2453678453a8Sspeer
2454678453a8Sspeer /*
2455678453a8Sspeer * partition_id, read_write_mode:
2456678453a8Sspeer * dead variables.
2457678453a8Sspeer */
2458678453a8Sspeer
2459678453a8Sspeer /*
2460678453a8Sspeer * drr_wt, rx_full_header, *_ldg?, start_mac_entry,
2461678453a8Sspeer * mac_pref, def_mac_rxdma_grpid, start_vlan, max_vlans,
2462678453a8Sspeer * start_ldgs, max_ldgs, max_ldvs,
2463678453a8Sspeer * vlan_pref, def_vlan_rxdma_grpid are meaningful only
2464678453a8Sspeer * in the service domain.
2465678453a8Sspeer */
2466678453a8Sspeer
2467678453a8Sspeer group = &port->rdc_grps[0];
2468678453a8Sspeer
2469da14cebeSEric Cheng group->flag = B_TRUE; /* configured */
2470678453a8Sspeer group->config_method = RDC_TABLE_ENTRY_METHOD_REP;
2471da14cebeSEric Cheng group->port = NXGE_GET_PORT_NUM(nxgep->function_num);
2472678453a8Sspeer
2473678453a8Sspeer /* HIO futures: this is still an open question. */
2474678453a8Sspeer hardware->max_macs = 1;
2475678453a8Sspeer }
2476678453a8Sspeer
24776f45ec7bSml29623 static void
nxge_use_cfg_vlan_class_config(p_nxge_t nxgep)24786f45ec7bSml29623 nxge_use_cfg_vlan_class_config(p_nxge_t nxgep)
24796f45ec7bSml29623 {
24806f45ec7bSml29623 uint_t vlan_cnt;
24816f45ec7bSml29623 int *vlan_cfg_val;
24826f45ec7bSml29623 int status;
24836f45ec7bSml29623 p_nxge_param_t param_arr;
24846f45ec7bSml29623 char *prop;
24856f45ec7bSml29623
24866f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL, " ==> nxge_use_cfg_vlan_config"));
24876f45ec7bSml29623 param_arr = nxgep->param_arr;
24886f45ec7bSml29623 prop = param_arr[param_vlan_2rdc_grp].fcode_name;
24896f45ec7bSml29623
24906f45ec7bSml29623 status = ddi_prop_lookup_int_array(DDI_DEV_T_ANY, nxgep->dip, 0, prop,
24916f45ec7bSml29623 &vlan_cfg_val, &vlan_cnt);
24926f45ec7bSml29623 if (status == DDI_PROP_SUCCESS) {
24936f45ec7bSml29623 status = ddi_prop_update_int_array(DDI_DEV_T_NONE,
24946f45ec7bSml29623 nxgep->dip, prop, vlan_cfg_val, vlan_cnt);
24956f45ec7bSml29623 ddi_prop_free(vlan_cfg_val);
24966f45ec7bSml29623 }
24976f45ec7bSml29623 nxge_set_hw_vlan_class_config(nxgep);
24986f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL, " <== nxge_use_cfg_vlan_config"));
24996f45ec7bSml29623 }
25006f45ec7bSml29623
25016f45ec7bSml29623 static void
nxge_use_cfg_mac_class_config(p_nxge_t nxgep)25026f45ec7bSml29623 nxge_use_cfg_mac_class_config(p_nxge_t nxgep)
25036f45ec7bSml29623 {
25046f45ec7bSml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp;
25056f45ec7bSml29623 p_nxge_hw_pt_cfg_t p_cfgp;
25066f45ec7bSml29623 uint_t mac_cnt;
25076f45ec7bSml29623 int *mac_cfg_val;
25086f45ec7bSml29623 int status;
25096f45ec7bSml29623 p_nxge_param_t param_arr;
25106f45ec7bSml29623 char *prop;
25116f45ec7bSml29623
25126f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL, "==> nxge_use_cfg_mac_class_config"));
25136f45ec7bSml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config;
25146f45ec7bSml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config;
25156f45ec7bSml29623 p_cfgp->start_mac_entry = 0;
25166f45ec7bSml29623 param_arr = nxgep->param_arr;
25176f45ec7bSml29623 prop = param_arr[param_mac_2rdc_grp].fcode_name;
25186f45ec7bSml29623
25196f45ec7bSml29623 switch (nxgep->function_num) {
25206f45ec7bSml29623 case 0:
25216f45ec7bSml29623 case 1:
25226f45ec7bSml29623 /* 10G ports */
25236f45ec7bSml29623 p_cfgp->max_macs = NXGE_MAX_MACS_XMACS;
25246f45ec7bSml29623 break;
25256f45ec7bSml29623 case 2:
25266f45ec7bSml29623 case 3:
25276f45ec7bSml29623 /* 1G ports */
25286f45ec7bSml29623 default:
25296f45ec7bSml29623 p_cfgp->max_macs = NXGE_MAX_MACS_BMACS;
25306f45ec7bSml29623 break;
25316f45ec7bSml29623 }
25326f45ec7bSml29623
25336f45ec7bSml29623 p_cfgp->mac_pref = 1;
25346f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, OBP_CTL,
25356f45ec7bSml29623 "== nxge_use_cfg_mac_class_config: "
25366f45ec7bSml29623 " mac_pref bit set def_mac_rxdma_grpid %d",
25376f45ec7bSml29623 p_cfgp->def_mac_rxdma_grpid));
25386f45ec7bSml29623
25396f45ec7bSml29623 status = ddi_prop_lookup_int_array(DDI_DEV_T_ANY, nxgep->dip, 0, prop,
25406f45ec7bSml29623 &mac_cfg_val, &mac_cnt);
25416f45ec7bSml29623 if (status == DDI_PROP_SUCCESS) {
25426f45ec7bSml29623 if (mac_cnt <= p_cfgp->max_macs)
25436f45ec7bSml29623 status = ddi_prop_update_int_array(DDI_DEV_T_NONE,
25446f45ec7bSml29623 nxgep->dip, prop, mac_cfg_val, mac_cnt);
25456f45ec7bSml29623 ddi_prop_free(mac_cfg_val);
25466f45ec7bSml29623 }
25476f45ec7bSml29623 nxge_set_hw_mac_class_config(nxgep);
25486f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL, " <== nxge_use_cfg_mac_class_config"));
25496f45ec7bSml29623 }
25506f45ec7bSml29623
25516f45ec7bSml29623 static void
nxge_use_cfg_class_config(p_nxge_t nxgep)25526f45ec7bSml29623 nxge_use_cfg_class_config(p_nxge_t nxgep)
25536f45ec7bSml29623 {
25546f45ec7bSml29623 nxge_set_hw_class_config(nxgep);
25556f45ec7bSml29623 }
25566f45ec7bSml29623
25576f45ec7bSml29623 static void
nxge_set_rdc_intr_property(p_nxge_t nxgep)25586f45ec7bSml29623 nxge_set_rdc_intr_property(p_nxge_t nxgep)
25596f45ec7bSml29623 {
25606f45ec7bSml29623 int i;
25616f45ec7bSml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp;
25626f45ec7bSml29623
25636f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL, " ==> nxge_set_rdc_intr_property"));
25646f45ec7bSml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config;
25656f45ec7bSml29623
25666f45ec7bSml29623 for (i = 0; i < NXGE_MAX_RDCS; i++) {
2567c1f9c6e5SSantwona Behera p_dma_cfgp->rcr_timeout[i] = nxgep->intr_timeout;
2568c1f9c6e5SSantwona Behera p_dma_cfgp->rcr_threshold[i] = nxgep->intr_threshold;
25696f45ec7bSml29623 }
25706f45ec7bSml29623
25716f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL, " <== nxge_set_rdc_intr_property"));
25726f45ec7bSml29623 }
25736f45ec7bSml29623
25746f45ec7bSml29623 static void
nxge_set_hw_dma_config(p_nxge_t nxgep)25756f45ec7bSml29623 nxge_set_hw_dma_config(p_nxge_t nxgep)
25766f45ec7bSml29623 {
2577da14cebeSEric Cheng int i, j, ngrps, bitmap, end, st_rdc;
25786f45ec7bSml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp;
25796f45ec7bSml29623 p_nxge_hw_pt_cfg_t p_cfgp;
25806f45ec7bSml29623 p_nxge_rdc_grp_t rdc_grp_p;
2581da14cebeSEric Cheng p_nxge_tdc_grp_t tdc_grp_p;
2582678453a8Sspeer nxge_grp_t *group;
2583da14cebeSEric Cheng uint8_t nrdcs;
2584da14cebeSEric Cheng dc_map_t map = 0;
25856f45ec7bSml29623
25866f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL, "==> nxge_set_hw_dma_config"));
25876f45ec7bSml29623
25886f45ec7bSml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config;
25896f45ec7bSml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config;
25906f45ec7bSml29623
2591da14cebeSEric Cheng switch (nxgep->niu_type) {
2592da14cebeSEric Cheng case NEPTUNE_4_1GC:
2593da14cebeSEric Cheng case NEPTUNE_2_10GF_2_1GC:
2594da14cebeSEric Cheng case NEPTUNE_1_10GF_3_1GC:
2595da14cebeSEric Cheng case NEPTUNE_1_1GC_1_10GF_2_1GC:
2596da14cebeSEric Cheng case NEPTUNE_2_10GF_2_1GRF:
2597da14cebeSEric Cheng default:
2598da14cebeSEric Cheng ngrps = 2;
2599da14cebeSEric Cheng break;
2600da14cebeSEric Cheng case NEPTUNE_2_10GF:
2601da14cebeSEric Cheng case NEPTUNE_2_1GRF:
2602da14cebeSEric Cheng case N2_NIU:
2603da14cebeSEric Cheng ngrps = 4;
2604da14cebeSEric Cheng break;
2605da14cebeSEric Cheng }
2606da14cebeSEric Cheng
2607da14cebeSEric Cheng /*
2608da14cebeSEric Cheng * Setup TDC groups
2609da14cebeSEric Cheng */
26106f45ec7bSml29623 bitmap = 0;
2611678453a8Sspeer end = p_cfgp->tdc.start + p_cfgp->tdc.owned;
2612678453a8Sspeer for (i = p_cfgp->tdc.start; i < end; i++) {
26136f45ec7bSml29623 bitmap |= (1 << i);
26146f45ec7bSml29623 }
26156f45ec7bSml29623
2616678453a8Sspeer nxgep->tx_set.owned.map |= bitmap; /* Owned, & not shared. */
2617da14cebeSEric Cheng nxgep->tx_set.owned.count = p_cfgp->tdc.owned;
26186f45ec7bSml29623 p_dma_cfgp->tx_dma_map = bitmap;
26196f45ec7bSml29623
26206f45ec7bSml29623 for (i = 0; i < ngrps; i++) {
2621da14cebeSEric Cheng group = (nxge_grp_t *)nxge_grp_add(nxgep,
2622da14cebeSEric Cheng NXGE_TRANSMIT_GROUP);
2623da14cebeSEric Cheng tdc_grp_p = &p_dma_cfgp->tdc_grps[
2624da14cebeSEric Cheng p_cfgp->def_mac_txdma_grpid + i];
2625da14cebeSEric Cheng if (i == 0)
2626da14cebeSEric Cheng tdc_grp_p->map = bitmap;
2627da14cebeSEric Cheng else
2628da14cebeSEric Cheng tdc_grp_p->map = 0;
2629da14cebeSEric Cheng /* no ring is associated with a group initially */
2630da14cebeSEric Cheng tdc_grp_p->start_tdc = 0;
2631da14cebeSEric Cheng tdc_grp_p->max_tdcs = 0;
2632da14cebeSEric Cheng tdc_grp_p->grp_index = group->index;
2633da14cebeSEric Cheng }
2634da14cebeSEric Cheng
2635da14cebeSEric Cheng /*
2636da14cebeSEric Cheng * Setup RDC groups
2637da14cebeSEric Cheng */
2638da14cebeSEric Cheng st_rdc = p_cfgp->start_rdc;
2639da14cebeSEric Cheng for (i = 0; i < ngrps; i++) {
2640da14cebeSEric Cheng /*
2641da14cebeSEric Cheng * All rings are associated with the default group initially
2642da14cebeSEric Cheng */
2643da14cebeSEric Cheng if (i == 0) {
2644da14cebeSEric Cheng /* default group */
2645da14cebeSEric Cheng switch (nxgep->niu_type) {
2646da14cebeSEric Cheng case NEPTUNE_4_1GC:
2647da14cebeSEric Cheng nrdcs = rx_4_1G[nxgep->function_num];
2648da14cebeSEric Cheng break;
2649da14cebeSEric Cheng case N2_NIU:
2650da14cebeSEric Cheng case NEPTUNE_2_10GF:
2651da14cebeSEric Cheng nrdcs = rx_2_10G[nxgep->function_num];
2652da14cebeSEric Cheng break;
2653da14cebeSEric Cheng case NEPTUNE_2_10GF_2_1GC:
2654da14cebeSEric Cheng nrdcs = rx_2_10G_2_1G[nxgep->function_num];
2655da14cebeSEric Cheng break;
2656da14cebeSEric Cheng case NEPTUNE_1_10GF_3_1GC:
2657da14cebeSEric Cheng nrdcs = rx_1_10G_3_1G[nxgep->function_num];
2658da14cebeSEric Cheng break;
2659da14cebeSEric Cheng case NEPTUNE_1_1GC_1_10GF_2_1GC:
2660da14cebeSEric Cheng nrdcs = rx_1_1G_1_10G_2_1G[nxgep->function_num];
2661da14cebeSEric Cheng break;
2662da14cebeSEric Cheng default:
2663da14cebeSEric Cheng switch (nxgep->platform_type) {
2664da14cebeSEric Cheng case P_NEPTUNE_ALONSO:
2665da14cebeSEric Cheng nrdcs =
2666da14cebeSEric Cheng rx_2_10G_2_1G[nxgep->function_num];
2667da14cebeSEric Cheng break;
2668da14cebeSEric Cheng default:
2669da14cebeSEric Cheng nrdcs = rx_4_1G[nxgep->function_num];
2670da14cebeSEric Cheng break;
2671da14cebeSEric Cheng }
2672da14cebeSEric Cheng break;
2673da14cebeSEric Cheng }
2674257bdc55SMichael Speer
2675257bdc55SMichael Speer if (p_cfgp->max_rdcs < nrdcs)
2676257bdc55SMichael Speer nrdcs = p_cfgp->max_rdcs;
2677da14cebeSEric Cheng } else {
2678da14cebeSEric Cheng nrdcs = 0;
2679da14cebeSEric Cheng }
2680678453a8Sspeer
2681678453a8Sspeer rdc_grp_p = &p_dma_cfgp->rdc_grps[
2682678453a8Sspeer p_cfgp->def_mac_rxdma_grpid + i];
2683da14cebeSEric Cheng rdc_grp_p->start_rdc = st_rdc;
2684da14cebeSEric Cheng rdc_grp_p->max_rdcs = nrdcs;
2685678453a8Sspeer rdc_grp_p->def_rdc = rdc_grp_p->start_rdc;
26866f45ec7bSml29623
26876f45ec7bSml29623 /* default to: 0, 1, 2, 3, ...., 0, 1, 2, 3.... */
2688da14cebeSEric Cheng if (nrdcs != 0) {
2689da14cebeSEric Cheng for (j = 0; j < nrdcs; j++) {
2690da14cebeSEric Cheng map |= (1 << j);
2691678453a8Sspeer }
2692678453a8Sspeer map <<= rdc_grp_p->start_rdc;
2693da14cebeSEric Cheng } else
2694da14cebeSEric Cheng map = 0;
2695678453a8Sspeer rdc_grp_p->map = map;
2696678453a8Sspeer
2697678453a8Sspeer nxgep->rx_set.owned.map |= map; /* Owned, & not shared. */
2698da14cebeSEric Cheng nxgep->rx_set.owned.count = nrdcs;
2699678453a8Sspeer
2700678453a8Sspeer group = (nxge_grp_t *)nxge_grp_add(nxgep, NXGE_RECEIVE_GROUP);
2701678453a8Sspeer
27026f45ec7bSml29623 rdc_grp_p->config_method = RDC_TABLE_ENTRY_METHOD_SEQ;
2703da14cebeSEric Cheng rdc_grp_p->flag = B_TRUE; /* This group has been configured. */
2704da14cebeSEric Cheng rdc_grp_p->grp_index = group->index;
2705da14cebeSEric Cheng rdc_grp_p->port = NXGE_GET_PORT_NUM(nxgep->function_num);
2706da14cebeSEric Cheng
2707da14cebeSEric Cheng map = 0;
27086f45ec7bSml29623 }
2709678453a8Sspeer
27106f45ec7bSml29623
27116f45ec7bSml29623 /* default RDC */
27126f45ec7bSml29623 p_cfgp->def_rdc = p_cfgp->start_rdc;
27136f45ec7bSml29623 nxgep->def_rdc = p_cfgp->start_rdc;
27146f45ec7bSml29623
27156f45ec7bSml29623 /* full 18 byte header ? */
27166f45ec7bSml29623 p_dma_cfgp->rcr_full_header = NXGE_RCR_FULL_HEADER;
27176f45ec7bSml29623 p_dma_cfgp->rx_drr_weight = PT_DRR_WT_DEFAULT_10G;
27186f45ec7bSml29623 if (nxgep->function_num > 1)
27196f45ec7bSml29623 p_dma_cfgp->rx_drr_weight = PT_DRR_WT_DEFAULT_1G;
27206f45ec7bSml29623 p_dma_cfgp->rbr_size = nxge_rbr_size;
27216f45ec7bSml29623 p_dma_cfgp->rcr_size = nxge_rcr_size;
27226f45ec7bSml29623
27236f45ec7bSml29623 nxge_set_rdc_intr_property(nxgep);
27246f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL, " <== nxge_set_hw_dma_config"));
27256f45ec7bSml29623 }
27266f45ec7bSml29623
27276f45ec7bSml29623 boolean_t
nxge_check_rxdma_port_member(p_nxge_t nxgep,uint8_t rdc)27286f45ec7bSml29623 nxge_check_rxdma_port_member(p_nxge_t nxgep, uint8_t rdc)
27296f45ec7bSml29623 {
27306f45ec7bSml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp;
27316f45ec7bSml29623 p_nxge_hw_pt_cfg_t p_cfgp;
27326f45ec7bSml29623 int status = B_TRUE;
27336f45ec7bSml29623
27346f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG2_CTL, "==> nxge_check_rxdma_port_member"));
27356f45ec7bSml29623
27366f45ec7bSml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config;
27376f45ec7bSml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config;
27386f45ec7bSml29623
27396f45ec7bSml29623 /* Receive DMA Channels */
27406f45ec7bSml29623 if (rdc < p_cfgp->max_rdcs)
27416f45ec7bSml29623 status = B_TRUE;
27426f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG2_CTL, " <== nxge_check_rxdma_port_member"));
27436f45ec7bSml29623 return (status);
27446f45ec7bSml29623 }
27456f45ec7bSml29623
27466f45ec7bSml29623 boolean_t
nxge_check_txdma_port_member(p_nxge_t nxgep,uint8_t tdc)27476f45ec7bSml29623 nxge_check_txdma_port_member(p_nxge_t nxgep, uint8_t tdc)
27486f45ec7bSml29623 {
27496f45ec7bSml29623 int status = B_FALSE;
27506f45ec7bSml29623
2751678453a8Sspeer NXGE_DEBUG_MSG((nxgep, CFG2_CTL, "==> nxge_check_txdma_port_member"));
27526f45ec7bSml29623
2753678453a8Sspeer if (tdc >= nxgep->pt_config.hw_config.tdc.start &&
2754678453a8Sspeer tdc < nxgep->pt_config.hw_config.tdc.count)
27556f45ec7bSml29623 status = B_TRUE;
2756678453a8Sspeer
2757678453a8Sspeer NXGE_DEBUG_MSG((nxgep, CFG2_CTL, " <== nxge_check_txdma_port_member"));
27586f45ec7bSml29623 return (status);
27596f45ec7bSml29623 }
27606f45ec7bSml29623
27616f45ec7bSml29623 boolean_t
nxge_check_rxdma_rdcgrp_member(p_nxge_t nxgep,uint8_t rdc_grp,uint8_t rdc)27626f45ec7bSml29623 nxge_check_rxdma_rdcgrp_member(p_nxge_t nxgep, uint8_t rdc_grp, uint8_t rdc)
27636f45ec7bSml29623 {
27646f45ec7bSml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp;
27656f45ec7bSml29623 int status = B_TRUE;
27666f45ec7bSml29623 p_nxge_rdc_grp_t rdc_grp_p;
27676f45ec7bSml29623
27686f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG2_CTL,
27696f45ec7bSml29623 " ==> nxge_check_rxdma_rdcgrp_member"));
27706f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG2_CTL, " nxge_check_rxdma_rdcgrp_member"
27716f45ec7bSml29623 " rdc %d group %d", rdc, rdc_grp));
27726f45ec7bSml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config;
27736f45ec7bSml29623
27746f45ec7bSml29623 rdc_grp_p = &p_dma_cfgp->rdc_grps[rdc_grp];
27756f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG2_CTL, " max %d ", rdc_grp_p->max_rdcs));
27766f45ec7bSml29623 if (rdc >= rdc_grp_p->max_rdcs) {
27776f45ec7bSml29623 status = B_FALSE;
27786f45ec7bSml29623 }
27796f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG2_CTL,
27806f45ec7bSml29623 " <== nxge_check_rxdma_rdcgrp_member"));
27816f45ec7bSml29623 return (status);
27826f45ec7bSml29623 }
27836f45ec7bSml29623
27846f45ec7bSml29623 boolean_t
nxge_check_rdcgrp_port_member(p_nxge_t nxgep,uint8_t rdc_grp)27856f45ec7bSml29623 nxge_check_rdcgrp_port_member(p_nxge_t nxgep, uint8_t rdc_grp)
27866f45ec7bSml29623 {
27876f45ec7bSml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp;
27886f45ec7bSml29623 p_nxge_hw_pt_cfg_t p_cfgp;
27896f45ec7bSml29623 int status = B_TRUE;
27906f45ec7bSml29623
27916f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG2_CTL, "==> nxge_check_rdcgrp_port_member"));
27926f45ec7bSml29623
27936f45ec7bSml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config;
27946f45ec7bSml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config;
27956f45ec7bSml29623
27966f45ec7bSml29623 if (rdc_grp >= p_cfgp->max_rdc_grpids)
27976f45ec7bSml29623 status = B_FALSE;
27986f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG2_CTL, " <== nxge_check_rdcgrp_port_member"));
27996f45ec7bSml29623 return (status);
28006f45ec7bSml29623 }
28016f45ec7bSml29623
28026f45ec7bSml29623 static void
nxge_set_hw_vlan_class_config(p_nxge_t nxgep)28036f45ec7bSml29623 nxge_set_hw_vlan_class_config(p_nxge_t nxgep)
28046f45ec7bSml29623 {
28056f45ec7bSml29623 int i;
28066f45ec7bSml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp;
28076f45ec7bSml29623 p_nxge_hw_pt_cfg_t p_cfgp;
28086f45ec7bSml29623 p_nxge_param_t param_arr;
28096f45ec7bSml29623 uint_t vlan_cnt;
28106f45ec7bSml29623 int *vlan_cfg_val;
28116f45ec7bSml29623 nxge_param_map_t *vmap;
28126f45ec7bSml29623 char *prop;
28136f45ec7bSml29623 p_nxge_class_pt_cfg_t p_class_cfgp;
28146f45ec7bSml29623 uint32_t good_cfg[32];
28156f45ec7bSml29623 int good_count = 0;
28166f45ec7bSml29623 nxge_mv_cfg_t *vlan_tbl;
28176f45ec7bSml29623
28186f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL, " ==> nxge_set_hw_vlan_config"));
28196f45ec7bSml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config;
28206f45ec7bSml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config;
28216f45ec7bSml29623 p_class_cfgp = (p_nxge_class_pt_cfg_t)&nxgep->class_config;
28226f45ec7bSml29623
28236f45ec7bSml29623 param_arr = nxgep->param_arr;
28246f45ec7bSml29623 prop = param_arr[param_vlan_2rdc_grp].fcode_name;
28256f45ec7bSml29623
28266f45ec7bSml29623 /*
28276f45ec7bSml29623 * By default, VLAN to RDC group mapping is disabled Need to read HW or
28286f45ec7bSml29623 * .conf properties to find out if mapping is required
28296f45ec7bSml29623 *
28306f45ec7bSml29623 * Format
28316f45ec7bSml29623 *
28326f45ec7bSml29623 * uint32_t array, each array entry specifying the VLAN id and the
28336f45ec7bSml29623 * mapping
28346f45ec7bSml29623 *
28356f45ec7bSml29623 * bit[30] = add bit[29] = remove bit[28] = preference bits[23-16] =
28366f45ec7bSml29623 * rdcgrp bits[15-0] = VLAN ID ( )
28376f45ec7bSml29623 */
28386f45ec7bSml29623
28396f45ec7bSml29623 for (i = 0; i < NXGE_MAX_VLANS; i++) {
28406f45ec7bSml29623 p_class_cfgp->vlan_tbl[i].flag = 0;
28416f45ec7bSml29623 }
28426f45ec7bSml29623
28436f45ec7bSml29623 vlan_tbl = (nxge_mv_cfg_t *)&p_class_cfgp->vlan_tbl[0];
28446f45ec7bSml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, nxgep->dip, 0, prop,
28456f45ec7bSml29623 &vlan_cfg_val, &vlan_cnt) == DDI_PROP_SUCCESS) {
28466f45ec7bSml29623 for (i = 0; i < vlan_cnt; i++) {
28476f45ec7bSml29623 vmap = (nxge_param_map_t *)&vlan_cfg_val[i];
28486f45ec7bSml29623 if ((vmap->param_id) &&
28496f45ec7bSml29623 (vmap->param_id < NXGE_MAX_VLANS) &&
28506f45ec7bSml29623 (vmap->map_to <
28516f45ec7bSml29623 p_cfgp->max_rdc_grpids) &&
28526f45ec7bSml29623 (vmap->map_to >= (uint8_t)0)) {
28536f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG2_CTL,
28546f45ec7bSml29623 " nxge_vlan_config mapping"
28556f45ec7bSml29623 " id %d grp %d",
28566f45ec7bSml29623 vmap->param_id, vmap->map_to));
28576f45ec7bSml29623 good_cfg[good_count] = vlan_cfg_val[i];
28586f45ec7bSml29623 if (vlan_tbl[vmap->param_id].flag == 0)
28596f45ec7bSml29623 good_count++;
28606f45ec7bSml29623 vlan_tbl[vmap->param_id].flag = 1;
28616f45ec7bSml29623 vlan_tbl[vmap->param_id].rdctbl =
2862678453a8Sspeer vmap->map_to + p_cfgp->def_mac_rxdma_grpid;
28636f45ec7bSml29623 vlan_tbl[vmap->param_id].mpr_npr = vmap->pref;
28646f45ec7bSml29623 }
28656f45ec7bSml29623 }
28666f45ec7bSml29623 ddi_prop_free(vlan_cfg_val);
28676f45ec7bSml29623 if (good_count != vlan_cnt) {
28686f45ec7bSml29623 (void) ddi_prop_update_int_array(DDI_DEV_T_NONE,
28696f45ec7bSml29623 nxgep->dip, prop, (int *)good_cfg, good_count);
28706f45ec7bSml29623 }
28716f45ec7bSml29623 }
28726f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL, "<== nxge_set_hw_vlan_config"));
28736f45ec7bSml29623 }
28746f45ec7bSml29623
28756f45ec7bSml29623 static void
nxge_set_hw_mac_class_config(p_nxge_t nxgep)28766f45ec7bSml29623 nxge_set_hw_mac_class_config(p_nxge_t nxgep)
28776f45ec7bSml29623 {
28786f45ec7bSml29623 int i;
28796f45ec7bSml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp;
28806f45ec7bSml29623 p_nxge_hw_pt_cfg_t p_cfgp;
28816f45ec7bSml29623 p_nxge_param_t param_arr;
28826f45ec7bSml29623 uint_t mac_cnt;
28836f45ec7bSml29623 int *mac_cfg_val;
28846f45ec7bSml29623 nxge_param_map_t *mac_map;
28856f45ec7bSml29623 char *prop;
28866f45ec7bSml29623 p_nxge_class_pt_cfg_t p_class_cfgp;
28876f45ec7bSml29623 int good_count = 0;
28886f45ec7bSml29623 int good_cfg[NXGE_MAX_MACS];
28896f45ec7bSml29623 nxge_mv_cfg_t *mac_host_info;
28906f45ec7bSml29623
28916f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL, "==> nxge_set_hw_mac_config"));
28926f45ec7bSml29623
28936f45ec7bSml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config;
28946f45ec7bSml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config;
28956f45ec7bSml29623 p_class_cfgp = (p_nxge_class_pt_cfg_t)&nxgep->class_config;
28966f45ec7bSml29623 mac_host_info = (nxge_mv_cfg_t *)&p_class_cfgp->mac_host_info[0];
28976f45ec7bSml29623
28986f45ec7bSml29623 param_arr = nxgep->param_arr;
28996f45ec7bSml29623 prop = param_arr[param_mac_2rdc_grp].fcode_name;
29006f45ec7bSml29623
29016f45ec7bSml29623 for (i = 0; i < NXGE_MAX_MACS; i++) {
29026f45ec7bSml29623 p_class_cfgp->mac_host_info[i].flag = 0;
29037b9fa28bSspeer p_class_cfgp->mac_host_info[i].rdctbl =
29047b9fa28bSspeer p_cfgp->def_mac_rxdma_grpid;
29056f45ec7bSml29623 }
29066f45ec7bSml29623
29076f45ec7bSml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, nxgep->dip, 0, prop,
29086f45ec7bSml29623 &mac_cfg_val, &mac_cnt) == DDI_PROP_SUCCESS) {
29096f45ec7bSml29623 for (i = 0; i < mac_cnt; i++) {
29106f45ec7bSml29623 mac_map = (nxge_param_map_t *)&mac_cfg_val[i];
29116f45ec7bSml29623 if ((mac_map->param_id < p_cfgp->max_macs) &&
29126f45ec7bSml29623 (mac_map->map_to <
29136f45ec7bSml29623 p_cfgp->max_rdc_grpids) &&
29146f45ec7bSml29623 (mac_map->map_to >= (uint8_t)0)) {
29156f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG2_CTL,
29166f45ec7bSml29623 " nxge_mac_config mapping"
29176f45ec7bSml29623 " id %d grp %d",
29186f45ec7bSml29623 mac_map->param_id, mac_map->map_to));
29196f45ec7bSml29623 mac_host_info[mac_map->param_id].mpr_npr =
2920da14cebeSEric Cheng p_cfgp->mac_pref;
29216f45ec7bSml29623 mac_host_info[mac_map->param_id].rdctbl =
29226f45ec7bSml29623 mac_map->map_to +
2923678453a8Sspeer p_cfgp->def_mac_rxdma_grpid;
29246f45ec7bSml29623 good_cfg[good_count] = mac_cfg_val[i];
29256f45ec7bSml29623 if (mac_host_info[mac_map->param_id].flag == 0)
29266f45ec7bSml29623 good_count++;
29276f45ec7bSml29623 mac_host_info[mac_map->param_id].flag = 1;
29286f45ec7bSml29623 }
29296f45ec7bSml29623 }
29306f45ec7bSml29623 ddi_prop_free(mac_cfg_val);
29316f45ec7bSml29623 if (good_count != mac_cnt) {
29326f45ec7bSml29623 (void) ddi_prop_update_int_array(DDI_DEV_T_NONE,
29336f45ec7bSml29623 nxgep->dip, prop, good_cfg, good_count);
29346f45ec7bSml29623 }
29356f45ec7bSml29623 }
29366f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL, "<== nxge_set_hw_mac_config"));
29376f45ec7bSml29623 }
29386f45ec7bSml29623
29396f45ec7bSml29623 static void
nxge_set_hw_class_config(p_nxge_t nxgep)29406f45ec7bSml29623 nxge_set_hw_class_config(p_nxge_t nxgep)
29416f45ec7bSml29623 {
29426f45ec7bSml29623 int i;
29436f45ec7bSml29623 p_nxge_param_t param_arr;
29446f45ec7bSml29623 int *int_prop_val;
29456f45ec7bSml29623 uint32_t cfg_value;
29466f45ec7bSml29623 char *prop;
29476f45ec7bSml29623 p_nxge_class_pt_cfg_t p_class_cfgp;
29486f45ec7bSml29623 int start_prop, end_prop;
29496f45ec7bSml29623 uint_t prop_cnt;
2950c1f9c6e5SSantwona Behera int start_class, j = 0;
29516f45ec7bSml29623
29526f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL, " ==> nxge_set_hw_class_config"));
29536f45ec7bSml29623
29546f45ec7bSml29623 p_class_cfgp = (p_nxge_class_pt_cfg_t)&nxgep->class_config;
29556f45ec7bSml29623 param_arr = nxgep->param_arr;
2956c1f9c6e5SSantwona Behera start_prop = param_class_opt_ipv4_tcp;
29576f45ec7bSml29623 end_prop = param_class_opt_ipv6_sctp;
2958c1f9c6e5SSantwona Behera start_class = TCAM_CLASS_TCP_IPV4;
29596f45ec7bSml29623
2960c1f9c6e5SSantwona Behera for (i = start_prop, j = 0; i <= end_prop; i++, j++) {
29616f45ec7bSml29623 prop = param_arr[i].fcode_name;
29626f45ec7bSml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, nxgep->dip,
29636f45ec7bSml29623 0, prop, &int_prop_val,
29646f45ec7bSml29623 &prop_cnt) == DDI_PROP_SUCCESS) {
29656f45ec7bSml29623 cfg_value = (uint32_t)*int_prop_val;
29666f45ec7bSml29623 ddi_prop_free(int_prop_val);
29676f45ec7bSml29623 } else {
29686f45ec7bSml29623 cfg_value = (uint32_t)param_arr[i].value;
29696f45ec7bSml29623 }
2970c1f9c6e5SSantwona Behera p_class_cfgp->class_cfg[start_class + j] = cfg_value;
29716f45ec7bSml29623 }
29726f45ec7bSml29623
29736f45ec7bSml29623 prop = param_arr[param_h1_init_value].fcode_name;
29746f45ec7bSml29623
29756f45ec7bSml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, nxgep->dip, 0, prop,
29766f45ec7bSml29623 &int_prop_val, &prop_cnt) == DDI_PROP_SUCCESS) {
29776f45ec7bSml29623 cfg_value = (uint32_t)*int_prop_val;
29786f45ec7bSml29623 ddi_prop_free(int_prop_val);
29796f45ec7bSml29623 } else {
29806f45ec7bSml29623 cfg_value = (uint32_t)param_arr[param_h1_init_value].value;
29816f45ec7bSml29623 }
29826f45ec7bSml29623
29836f45ec7bSml29623 p_class_cfgp->init_h1 = (uint32_t)cfg_value;
29846f45ec7bSml29623 prop = param_arr[param_h2_init_value].fcode_name;
29856f45ec7bSml29623
29866f45ec7bSml29623 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, nxgep->dip, 0, prop,
29876f45ec7bSml29623 &int_prop_val, &prop_cnt) == DDI_PROP_SUCCESS) {
29886f45ec7bSml29623 cfg_value = (uint32_t)*int_prop_val;
29896f45ec7bSml29623 ddi_prop_free(int_prop_val);
29906f45ec7bSml29623 } else {
29916f45ec7bSml29623 cfg_value = (uint32_t)param_arr[param_h2_init_value].value;
29926f45ec7bSml29623 }
29936f45ec7bSml29623
29946f45ec7bSml29623 p_class_cfgp->init_h2 = (uint16_t)cfg_value;
29956f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, CFG_CTL, " <== nxge_set_hw_class_config"));
29966f45ec7bSml29623 }
29976f45ec7bSml29623
29986f45ec7bSml29623 nxge_status_t
nxge_ldgv_init_n2(p_nxge_t nxgep,int * navail_p,int * nrequired_p)29996f45ec7bSml29623 nxge_ldgv_init_n2(p_nxge_t nxgep, int *navail_p, int *nrequired_p)
30006f45ec7bSml29623 {
3001678453a8Sspeer int i, maxldvs, maxldgs, nldvs;
30026f45ec7bSml29623 int ldv, endldg;
30036f45ec7bSml29623 uint8_t func;
30046f45ec7bSml29623 uint8_t channel;
30056f45ec7bSml29623 uint8_t chn_start;
30066f45ec7bSml29623 boolean_t own_sys_err = B_FALSE, own_fzc = B_FALSE;
30076f45ec7bSml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp;
30086f45ec7bSml29623 p_nxge_hw_pt_cfg_t p_cfgp;
30096f45ec7bSml29623 p_nxge_ldgv_t ldgvp;
30106f45ec7bSml29623 p_nxge_ldg_t ldgp, ptr;
3011d7cf53fcSmisaki Miyashita p_nxge_ldv_t ldvp, sysldvp;
30126f45ec7bSml29623 nxge_status_t status = NXGE_OK;
3013678453a8Sspeer nxge_grp_set_t *set;
30146f45ec7bSml29623
30156f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL, "==> nxge_ldgv_init_n2"));
30166f45ec7bSml29623 if (!*navail_p) {
30176f45ec7bSml29623 *nrequired_p = 0;
30186f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
30196f45ec7bSml29623 "<== nxge_ldgv_init:no avail"));
30206f45ec7bSml29623 return (NXGE_ERROR);
30216f45ec7bSml29623 }
30226f45ec7bSml29623 /*
30236f45ec7bSml29623 * N2/NIU: one logical device owns one logical group. and each
30246f45ec7bSml29623 * device/group will be assigned one vector by Hypervisor.
30256f45ec7bSml29623 */
30266f45ec7bSml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config;
30276f45ec7bSml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config;
30286f45ec7bSml29623 maxldgs = p_cfgp->max_ldgs;
30296f45ec7bSml29623 if (!maxldgs) {
30306f45ec7bSml29623 /* No devices configured. */
30316f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL, "<== nxge_ldgv_init_n2: "
30326f45ec7bSml29623 "no logical groups configured."));
30336f45ec7bSml29623 return (NXGE_ERROR);
30346f45ec7bSml29623 } else {
30356f45ec7bSml29623 maxldvs = maxldgs + 1;
30366f45ec7bSml29623 }
30376f45ec7bSml29623
30386f45ec7bSml29623 /*
30396f45ec7bSml29623 * If function zero instance, it needs to handle the system and MIF
30406f45ec7bSml29623 * error interrupts. MIF interrupt may not be needed for N2/NIU.
30416f45ec7bSml29623 */
30426f45ec7bSml29623 func = nxgep->function_num;
30436f45ec7bSml29623 if (func == 0) {
30446f45ec7bSml29623 own_sys_err = B_TRUE;
30456f45ec7bSml29623 if (!p_cfgp->ser_ldvid) {
30466f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
30476f45ec7bSml29623 "nxge_ldgv_init_n2: func 0, ERR ID not set!"));
30486f45ec7bSml29623 }
30496f45ec7bSml29623 /* MIF interrupt */
30506f45ec7bSml29623 if (!p_cfgp->mif_ldvid) {
30516f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
30526f45ec7bSml29623 "nxge_ldgv_init_n2: func 0, MIF ID not set!"));
30536f45ec7bSml29623 }
30546f45ec7bSml29623 }
30556f45ec7bSml29623
30566f45ec7bSml29623 /*
30576f45ec7bSml29623 * Assume single partition, each function owns mac.
30586f45ec7bSml29623 */
30596f45ec7bSml29623 if (!nxge_use_partition)
30606f45ec7bSml29623 own_fzc = B_TRUE;
30616f45ec7bSml29623
30626f45ec7bSml29623 ldgvp = nxgep->ldgvp;
30636f45ec7bSml29623 if (ldgvp == NULL) {
30646f45ec7bSml29623 ldgvp = KMEM_ZALLOC(sizeof (nxge_ldgv_t), KM_SLEEP);
30656f45ec7bSml29623 nxgep->ldgvp = ldgvp;
30666f45ec7bSml29623 ldgvp->maxldgs = (uint8_t)maxldgs;
30676f45ec7bSml29623 ldgvp->maxldvs = (uint8_t)maxldvs;
3068678453a8Sspeer ldgp = ldgvp->ldgp = KMEM_ZALLOC(
3069678453a8Sspeer sizeof (nxge_ldg_t) * maxldgs, KM_SLEEP);
3070678453a8Sspeer ldvp = ldgvp->ldvp = KMEM_ZALLOC(
3071678453a8Sspeer sizeof (nxge_ldv_t) * maxldvs, KM_SLEEP);
30726f45ec7bSml29623 } else {
30736f45ec7bSml29623 ldgp = ldgvp->ldgp;
30746f45ec7bSml29623 ldvp = ldgvp->ldvp;
30756f45ec7bSml29623 }
30766f45ec7bSml29623
3077678453a8Sspeer ldgvp->ndma_ldvs = p_cfgp->tdc.owned + p_cfgp->max_rdcs;
30786f45ec7bSml29623 ldgvp->tmres = NXGE_TIMER_RESO;
30796f45ec7bSml29623
30806f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL,
30816f45ec7bSml29623 "==> nxge_ldgv_init_n2: maxldvs %d maxldgs %d",
30826f45ec7bSml29623 maxldvs, maxldgs));
30836f45ec7bSml29623
30846f45ec7bSml29623 /* logical start_ldg is ldv */
30856f45ec7bSml29623 ptr = ldgp;
30866f45ec7bSml29623 for (i = 0; i < maxldgs; i++) {
30876f45ec7bSml29623 ptr->func = func;
30886f45ec7bSml29623 ptr->arm = B_TRUE;
30896f45ec7bSml29623 ptr->vldg_index = (uint8_t)i;
30906f45ec7bSml29623 ptr->ldg_timer = NXGE_TIMER_LDG;
30916f45ec7bSml29623 ptr->ldg = p_cfgp->ldg[i];
30926f45ec7bSml29623 ptr->sys_intr_handler = nxge_intr;
30936f45ec7bSml29623 ptr->nldvs = 0;
30946f45ec7bSml29623 ptr->ldvp = NULL;
30956f45ec7bSml29623 ptr->nxgep = nxgep;
30966f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL,
30976f45ec7bSml29623 "==> nxge_ldgv_init_n2: maxldvs %d maxldgs %d "
30986f45ec7bSml29623 "ldg %d ldgptr $%p",
30996f45ec7bSml29623 maxldvs, maxldgs, ptr->ldg, ptr));
31006f45ec7bSml29623 ptr++;
31016f45ec7bSml29623 }
31026f45ec7bSml29623
31036f45ec7bSml29623 endldg = NXGE_INT_MAX_LDG;
31046f45ec7bSml29623 nldvs = 0;
31056f45ec7bSml29623 ldgvp->nldvs = 0;
31066f45ec7bSml29623 ldgp->ldvp = NULL;
31076f45ec7bSml29623 *nrequired_p = 0;
31086f45ec7bSml29623
31096f45ec7bSml29623 /*
31106f45ec7bSml29623 * logical device group table is organized in the following order (same
31116f45ec7bSml29623 * as what interrupt property has). function 0: owns MAC, MIF, error,
31126f45ec7bSml29623 * rx, tx. function 1: owns MAC, rx, tx.
31136f45ec7bSml29623 */
31146f45ec7bSml29623
31156f45ec7bSml29623 if (own_fzc && p_cfgp->mac_ldvid) {
31166f45ec7bSml29623 /* Each function should own MAC interrupt */
31176f45ec7bSml29623 ldv = p_cfgp->mac_ldvid;
31186f45ec7bSml29623 ldvp->ldv = (uint8_t)ldv;
31196f45ec7bSml29623 ldvp->is_mac = B_TRUE;
31206f45ec7bSml29623 ldvp->ldv_intr_handler = nxge_mac_intr;
31216f45ec7bSml29623 ldvp->ldv_ldf_masks = 0;
31226f45ec7bSml29623 ldvp->nxgep = nxgep;
31236f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL,
31246f45ec7bSml29623 "==> nxge_ldgv_init_n2(mac): maxldvs %d ldv %d "
31256f45ec7bSml29623 "ldg %d ldgptr $%p ldvptr $%p",
31266f45ec7bSml29623 maxldvs, ldv, ldgp->ldg, ldgp, ldvp));
31276f45ec7bSml29623 nxge_ldgv_setup(&ldgp, &ldvp, ldv, endldg, nrequired_p);
31286f45ec7bSml29623 nldvs++;
31296f45ec7bSml29623 }
31306f45ec7bSml29623
31316f45ec7bSml29623 if (own_fzc && p_cfgp->mif_ldvid) {
31326f45ec7bSml29623 ldv = p_cfgp->mif_ldvid;
31336f45ec7bSml29623 ldvp->ldv = (uint8_t)ldv;
31346f45ec7bSml29623 ldvp->is_mif = B_TRUE;
31356f45ec7bSml29623 ldvp->ldv_intr_handler = nxge_mif_intr;
31366f45ec7bSml29623 ldvp->ldv_ldf_masks = 0;
31376f45ec7bSml29623 ldvp->nxgep = nxgep;
31386f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL,
31396f45ec7bSml29623 "==> nxge_ldgv_init_n2(mif): maxldvs %d ldv %d "
31406f45ec7bSml29623 "ldg %d ldgptr $%p ldvptr $%p",
31416f45ec7bSml29623 maxldvs, ldv, ldgp->ldg, ldgp, ldvp));
31426f45ec7bSml29623 nxge_ldgv_setup(&ldgp, &ldvp, ldv, endldg, nrequired_p);
31436f45ec7bSml29623 nldvs++;
31446f45ec7bSml29623 }
31456f45ec7bSml29623
3146d7cf53fcSmisaki Miyashita /*
3147da14cebeSEric Cheng * HW based syserr interrupt for port0, and SW based syserr interrupt
3148da14cebeSEric Cheng * for port1
3149d7cf53fcSmisaki Miyashita */
31506f45ec7bSml29623 if (own_sys_err && p_cfgp->ser_ldvid) {
31516f45ec7bSml29623 ldv = p_cfgp->ser_ldvid;
31526f45ec7bSml29623 /*
31536f45ec7bSml29623 * Unmask the system interrupt states.
31546f45ec7bSml29623 */
31556f45ec7bSml29623 (void) nxge_fzc_sys_err_mask_set(nxgep, SYS_ERR_SMX_MASK |
31566f45ec7bSml29623 SYS_ERR_IPP_MASK | SYS_ERR_TXC_MASK |
31576f45ec7bSml29623 SYS_ERR_ZCP_MASK);
3158d7cf53fcSmisaki Miyashita
3159d7cf53fcSmisaki Miyashita ldvp->use_timer = B_TRUE;
31606f45ec7bSml29623 ldvp->ldv = (uint8_t)ldv;
31616f45ec7bSml29623 ldvp->is_syserr = B_TRUE;
31626f45ec7bSml29623 ldvp->ldv_intr_handler = nxge_syserr_intr;
31636f45ec7bSml29623 ldvp->ldv_ldf_masks = 0;
31646f45ec7bSml29623 ldvp->nxgep = nxgep;
31656f45ec7bSml29623 ldgvp->ldvp_syserr = ldvp;
31666f45ec7bSml29623
31676f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL,
31686f45ec7bSml29623 "==> nxge_ldgv_init_n2(syserr): maxldvs %d ldv %d "
31696f45ec7bSml29623 "ldg %d ldgptr $%p ldvptr p%p",
31706f45ec7bSml29623 maxldvs, ldv, ldgp->ldg, ldgp, ldvp));
3171d7cf53fcSmisaki Miyashita nxge_ldgv_setup(&ldgp, &ldvp, ldv, endldg, nrequired_p);
31726f45ec7bSml29623 nldvs++;
3173d7cf53fcSmisaki Miyashita } else {
3174d7cf53fcSmisaki Miyashita /*
3175da14cebeSEric Cheng * SW based: allocate the ldv for the syserr since the vector
3176da14cebeSEric Cheng * should not be consumed for port1
3177d7cf53fcSmisaki Miyashita */
3178d7cf53fcSmisaki Miyashita sysldvp = KMEM_ZALLOC(sizeof (nxge_ldv_t), KM_SLEEP);
3179d7cf53fcSmisaki Miyashita sysldvp->use_timer = B_TRUE;
3180d7cf53fcSmisaki Miyashita sysldvp->ldv = NXGE_SYS_ERROR_LD;
3181d7cf53fcSmisaki Miyashita sysldvp->is_syserr = B_TRUE;
3182d7cf53fcSmisaki Miyashita sysldvp->ldv_intr_handler = nxge_syserr_intr;
3183d7cf53fcSmisaki Miyashita sysldvp->ldv_ldf_masks = 0;
3184d7cf53fcSmisaki Miyashita sysldvp->nxgep = nxgep;
3185d7cf53fcSmisaki Miyashita ldgvp->ldvp_syserr = sysldvp;
3186da14cebeSEric Cheng ldgvp->ldvp_syserr_alloced = B_TRUE;
3187d7cf53fcSmisaki Miyashita }
31886f45ec7bSml29623
3189da14cebeSEric Cheng
31906f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL, "==> nxge_ldgv_init_n2: "
31916f45ec7bSml29623 "(before rx) func %d nldvs %d navail %d nrequired %d",
31926f45ec7bSml29623 func, nldvs, *navail_p, *nrequired_p));
31936f45ec7bSml29623
31946f45ec7bSml29623 /*
31956f45ec7bSml29623 * Start with RDC to configure logical devices for each group.
31966f45ec7bSml29623 */
3197678453a8Sspeer chn_start = p_cfgp->ldg_chn_start;
3198678453a8Sspeer set = &nxgep->rx_set;
3199678453a8Sspeer for (channel = 0; channel < NXGE_MAX_RDCS; channel++) {
3200678453a8Sspeer if ((1 << channel) & set->owned.map) {
32016f45ec7bSml29623 ldvp->is_rxdma = B_TRUE;
3202678453a8Sspeer ldvp->ldv = (uint8_t)channel + NXGE_RDMA_LD_START;
3203678453a8Sspeer ldvp->channel = channel;
3204678453a8Sspeer ldvp->vdma_index = (uint8_t)channel;
32056f45ec7bSml29623 ldvp->ldv_intr_handler = nxge_rx_intr;
32066f45ec7bSml29623 ldvp->ldv_ldf_masks = 0;
32076f45ec7bSml29623 ldvp->nxgep = nxgep;
32086f45ec7bSml29623 ldgp->ldg = p_cfgp->ldg[chn_start];
32096f45ec7bSml29623
32106f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL,
32116f45ec7bSml29623 "==> nxge_ldgv_init_n2(rx%d): maxldvs %d ldv %d "
32126f45ec7bSml29623 "ldg %d ldgptr 0x%016llx ldvptr 0x%016llx",
32136f45ec7bSml29623 i, maxldvs, ldv, ldgp->ldg, ldgp, ldvp));
3214678453a8Sspeer nxge_ldgv_setup(&ldgp, &ldvp, ldvp->ldv,
3215678453a8Sspeer endldg, nrequired_p);
32166f45ec7bSml29623 nldvs++;
3217678453a8Sspeer chn_start++;
3218678453a8Sspeer }
32196f45ec7bSml29623 }
32206f45ec7bSml29623
32216f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL, "==> nxge_ldgv_init_n2: "
32226f45ec7bSml29623 "func %d nldvs %d navail %d nrequired %d",
32236f45ec7bSml29623 func, nldvs, *navail_p, *nrequired_p));
32246f45ec7bSml29623
32256f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL, "==> nxge_ldgv_init_n2: "
32266f45ec7bSml29623 "func %d nldvs %d navail %d nrequired %d ldgp 0x%llx "
32276f45ec7bSml29623 "ldvp 0x%llx",
32286f45ec7bSml29623 func, nldvs, *navail_p, *nrequired_p, ldgp, ldvp));
32296f45ec7bSml29623 /*
32306f45ec7bSml29623 * Transmit DMA channels.
32316f45ec7bSml29623 */
3232678453a8Sspeer chn_start = p_cfgp->ldg_chn_start + 8;
3233678453a8Sspeer set = &nxgep->tx_set;
3234678453a8Sspeer for (channel = 0; channel < NXGE_MAX_TDCS; channel++) {
3235678453a8Sspeer if ((1 << channel) & set->owned.map) {
32366f45ec7bSml29623 ldvp->is_txdma = B_TRUE;
3237678453a8Sspeer ldvp->ldv = (uint8_t)channel + NXGE_TDMA_LD_START;
3238678453a8Sspeer ldvp->channel = channel;
3239678453a8Sspeer ldvp->vdma_index = (uint8_t)channel;
32406f45ec7bSml29623 ldvp->ldv_intr_handler = nxge_tx_intr;
32416f45ec7bSml29623 ldvp->ldv_ldf_masks = 0;
32426f45ec7bSml29623 ldgp->ldg = p_cfgp->ldg[chn_start];
32436f45ec7bSml29623 ldvp->nxgep = nxgep;
32446f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL,
32456f45ec7bSml29623 "==> nxge_ldgv_init_n2(tx%d): maxldvs %d ldv %d "
3246678453a8Sspeer "ldg %d ldgptr %p ldvptr %p",
3247678453a8Sspeer channel, maxldvs, ldv, ldgp->ldg, ldgp, ldvp));
3248678453a8Sspeer nxge_ldgv_setup(&ldgp, &ldvp, ldvp->ldv,
3249678453a8Sspeer endldg, nrequired_p);
32506f45ec7bSml29623 nldvs++;
3251678453a8Sspeer chn_start++;
3252678453a8Sspeer }
32536f45ec7bSml29623 }
32546f45ec7bSml29623
32556f45ec7bSml29623 ldgvp->ldg_intrs = *nrequired_p;
32566f45ec7bSml29623 ldgvp->nldvs = (uint8_t)nldvs;
32576f45ec7bSml29623
32586f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL, "==> nxge_ldgv_init_n2: "
32596f45ec7bSml29623 "func %d nldvs %d maxgrps %d navail %d nrequired %d",
32606f45ec7bSml29623 func, nldvs, maxldgs, *navail_p, *nrequired_p));
32616f45ec7bSml29623
32626f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL, "<== nxge_ldgv_init_n2"));
32636f45ec7bSml29623 return (status);
32646f45ec7bSml29623 }
32656f45ec7bSml29623
32666f45ec7bSml29623 /*
32676f45ec7bSml29623 * Interrupts related interface functions.
32686f45ec7bSml29623 */
32696f45ec7bSml29623
32706f45ec7bSml29623 nxge_status_t
nxge_ldgv_init(p_nxge_t nxgep,int * navail_p,int * nrequired_p)32716f45ec7bSml29623 nxge_ldgv_init(p_nxge_t nxgep, int *navail_p, int *nrequired_p)
32726f45ec7bSml29623 {
3273678453a8Sspeer int i, maxldvs, maxldgs, nldvs;
32746f45ec7bSml29623 int ldv, ldg, endldg, ngrps;
32756f45ec7bSml29623 uint8_t func;
32766f45ec7bSml29623 uint8_t channel;
32776f45ec7bSml29623 boolean_t own_sys_err = B_FALSE, own_fzc = B_FALSE;
32786f45ec7bSml29623 p_nxge_dma_pt_cfg_t p_dma_cfgp;
32796f45ec7bSml29623 p_nxge_hw_pt_cfg_t p_cfgp;
32806f45ec7bSml29623 p_nxge_ldgv_t ldgvp;
32816f45ec7bSml29623 p_nxge_ldg_t ldgp, ptr;
32826f45ec7bSml29623 p_nxge_ldv_t ldvp;
3283678453a8Sspeer nxge_grp_set_t *set;
3284678453a8Sspeer
32856f45ec7bSml29623 nxge_status_t status = NXGE_OK;
32866f45ec7bSml29623
32876f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL, "==> nxge_ldgv_init"));
32886f45ec7bSml29623 if (!*navail_p) {
32896f45ec7bSml29623 *nrequired_p = 0;
32906f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
32916f45ec7bSml29623 "<== nxge_ldgv_init:no avail"));
32926f45ec7bSml29623 return (NXGE_ERROR);
32936f45ec7bSml29623 }
32946f45ec7bSml29623 p_dma_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config;
32956f45ec7bSml29623 p_cfgp = (p_nxge_hw_pt_cfg_t)&p_dma_cfgp->hw_config;
32966f45ec7bSml29623
3297678453a8Sspeer nldvs = p_cfgp->tdc.owned + p_cfgp->max_rdcs;
32986f45ec7bSml29623
32996f45ec7bSml29623 /*
33006f45ec7bSml29623 * If function zero instance, it needs to handle the system error
33016f45ec7bSml29623 * interrupts.
33026f45ec7bSml29623 */
33036f45ec7bSml29623 func = nxgep->function_num;
33046f45ec7bSml29623 if (func == 0) {
33056f45ec7bSml29623 nldvs++;
33066f45ec7bSml29623 own_sys_err = B_TRUE;
33076f45ec7bSml29623 } else {
33086f45ec7bSml29623 /* use timer */
33096f45ec7bSml29623 nldvs++;
33106f45ec7bSml29623 }
33116f45ec7bSml29623
33126f45ec7bSml29623 /*
33136f45ec7bSml29623 * Assume single partition, each function owns mac.
33146f45ec7bSml29623 */
33156f45ec7bSml29623 if (!nxge_use_partition) {
33166f45ec7bSml29623 /* mac */
33176f45ec7bSml29623 nldvs++;
33186f45ec7bSml29623 /* MIF */
33196f45ec7bSml29623 nldvs++;
33206f45ec7bSml29623 own_fzc = B_TRUE;
33216f45ec7bSml29623 }
33226f45ec7bSml29623 maxldvs = nldvs;
33236f45ec7bSml29623 maxldgs = p_cfgp->max_ldgs;
33246f45ec7bSml29623 if (!maxldvs || !maxldgs) {
33256f45ec7bSml29623 /* No devices configured. */
33266f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL, "<== nxge_ldgv_init: "
33276f45ec7bSml29623 "no logical devices or groups configured."));
33286f45ec7bSml29623 return (NXGE_ERROR);
33296f45ec7bSml29623 }
33306f45ec7bSml29623 ldgvp = nxgep->ldgvp;
33316f45ec7bSml29623 if (ldgvp == NULL) {
33326f45ec7bSml29623 ldgvp = KMEM_ZALLOC(sizeof (nxge_ldgv_t), KM_SLEEP);
33336f45ec7bSml29623 nxgep->ldgvp = ldgvp;
33346f45ec7bSml29623 ldgvp->maxldgs = (uint8_t)maxldgs;
33356f45ec7bSml29623 ldgvp->maxldvs = (uint8_t)maxldvs;
33366f45ec7bSml29623 ldgp = ldgvp->ldgp = KMEM_ZALLOC(sizeof (nxge_ldg_t) * maxldgs,
33376f45ec7bSml29623 KM_SLEEP);
33386f45ec7bSml29623 ldvp = ldgvp->ldvp = KMEM_ZALLOC(sizeof (nxge_ldv_t) * maxldvs,
33396f45ec7bSml29623 KM_SLEEP);
33406f45ec7bSml29623 }
3341678453a8Sspeer ldgvp->ndma_ldvs = p_cfgp->tdc.owned + p_cfgp->max_rdcs;
33426f45ec7bSml29623 ldgvp->tmres = NXGE_TIMER_RESO;
33436f45ec7bSml29623
33446f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL,
33456f45ec7bSml29623 "==> nxge_ldgv_init: maxldvs %d maxldgs %d nldvs %d",
33466f45ec7bSml29623 maxldvs, maxldgs, nldvs));
33476f45ec7bSml29623 ldg = p_cfgp->start_ldg;
33486f45ec7bSml29623 ptr = ldgp;
33496f45ec7bSml29623 for (i = 0; i < maxldgs; i++) {
33506f45ec7bSml29623 ptr->func = func;
33516f45ec7bSml29623 ptr->arm = B_TRUE;
33526f45ec7bSml29623 ptr->vldg_index = (uint8_t)i;
33536f45ec7bSml29623 ptr->ldg_timer = NXGE_TIMER_LDG;
33546f45ec7bSml29623 ptr->ldg = ldg++;
33556f45ec7bSml29623 ptr->sys_intr_handler = nxge_intr;
33566f45ec7bSml29623 ptr->nldvs = 0;
33576f45ec7bSml29623 ptr->nxgep = nxgep;
33586f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL,
33596f45ec7bSml29623 "==> nxge_ldgv_init: maxldvs %d maxldgs %d ldg %d",
33606f45ec7bSml29623 maxldvs, maxldgs, ptr->ldg));
33616f45ec7bSml29623 ptr++;
33626f45ec7bSml29623 }
33636f45ec7bSml29623
33646f45ec7bSml29623 ldg = p_cfgp->start_ldg;
33656f45ec7bSml29623 if (maxldgs > *navail_p) {
33666f45ec7bSml29623 ngrps = *navail_p;
33676f45ec7bSml29623 } else {
33686f45ec7bSml29623 ngrps = maxldgs;
33696f45ec7bSml29623 }
33706f45ec7bSml29623 endldg = ldg + ngrps;
33716f45ec7bSml29623
33726f45ec7bSml29623 /*
33736f45ec7bSml29623 * Receive DMA channels.
33746f45ec7bSml29623 */
33756f45ec7bSml29623 nldvs = 0;
33766f45ec7bSml29623 ldgvp->nldvs = 0;
33776f45ec7bSml29623 ldgp->ldvp = NULL;
33786f45ec7bSml29623 *nrequired_p = 0;
33796f45ec7bSml29623
33806f45ec7bSml29623 /*
33816f45ec7bSml29623 * Start with RDC to configure logical devices for each group.
33826f45ec7bSml29623 */
3383678453a8Sspeer set = &nxgep->rx_set;
3384678453a8Sspeer for (channel = 0; channel < NXGE_MAX_RDCS; channel++) {
3385678453a8Sspeer if ((1 << channel) & set->owned.map) {
3386678453a8Sspeer /* For now, <channel & <vdma_index> are the same. */
33876f45ec7bSml29623 ldvp->is_rxdma = B_TRUE;
3388678453a8Sspeer ldvp->ldv = (uint8_t)channel + NXGE_RDMA_LD_START;
3389678453a8Sspeer ldvp->channel = channel;
3390678453a8Sspeer ldvp->vdma_index = (uint8_t)channel;
33916f45ec7bSml29623 ldvp->ldv_intr_handler = nxge_rx_intr;
33926f45ec7bSml29623 ldvp->ldv_ldf_masks = 0;
33936f45ec7bSml29623 ldvp->use_timer = B_FALSE;
33946f45ec7bSml29623 ldvp->nxgep = nxgep;
3395678453a8Sspeer nxge_ldgv_setup(&ldgp, &ldvp, ldvp->ldv,
3396678453a8Sspeer endldg, nrequired_p);
33976f45ec7bSml29623 nldvs++;
33986f45ec7bSml29623 }
3399678453a8Sspeer }
34006f45ec7bSml29623
34016f45ec7bSml29623 /*
34026f45ec7bSml29623 * Transmit DMA channels.
34036f45ec7bSml29623 */
3404678453a8Sspeer set = &nxgep->tx_set;
3405678453a8Sspeer for (channel = 0; channel < NXGE_MAX_TDCS; channel++) {
3406678453a8Sspeer if ((1 << channel) & set->owned.map) {
3407678453a8Sspeer /* For now, <channel & <vdma_index> are the same. */
34086f45ec7bSml29623 ldvp->is_txdma = B_TRUE;
3409678453a8Sspeer ldvp->ldv = (uint8_t)channel + NXGE_TDMA_LD_START;
3410678453a8Sspeer ldvp->channel = channel;
3411678453a8Sspeer ldvp->vdma_index = (uint8_t)channel;
34126f45ec7bSml29623 ldvp->ldv_intr_handler = nxge_tx_intr;
34136f45ec7bSml29623 ldvp->ldv_ldf_masks = 0;
34146f45ec7bSml29623 ldvp->use_timer = B_FALSE;
34156f45ec7bSml29623 ldvp->nxgep = nxgep;
3416678453a8Sspeer nxge_ldgv_setup(&ldgp, &ldvp, ldvp->ldv,
3417678453a8Sspeer endldg, nrequired_p);
34186f45ec7bSml29623 nldvs++;
34196f45ec7bSml29623 }
3420678453a8Sspeer }
34216f45ec7bSml29623
34226f45ec7bSml29623 if (own_fzc) {
34236f45ec7bSml29623 ldv = NXGE_MIF_LD;
34246f45ec7bSml29623 ldvp->ldv = (uint8_t)ldv;
34256f45ec7bSml29623 ldvp->is_mif = B_TRUE;
34266f45ec7bSml29623 ldvp->ldv_intr_handler = nxge_mif_intr;
34276f45ec7bSml29623 ldvp->ldv_ldf_masks = 0;
34286f45ec7bSml29623 ldvp->use_timer = B_FALSE;
34296f45ec7bSml29623 ldvp->nxgep = nxgep;
34306f45ec7bSml29623 nxge_ldgv_setup(&ldgp, &ldvp, ldv, endldg, nrequired_p);
34316f45ec7bSml29623 nldvs++;
34326f45ec7bSml29623 }
34336f45ec7bSml29623 /*
34346f45ec7bSml29623 * MAC port (function zero control)
34356f45ec7bSml29623 */
34366f45ec7bSml29623 if (own_fzc) {
34376f45ec7bSml29623 ldvp->is_mac = B_TRUE;
34386f45ec7bSml29623 ldvp->ldv_intr_handler = nxge_mac_intr;
34396f45ec7bSml29623 ldvp->ldv_ldf_masks = 0;
34406f45ec7bSml29623 ldv = func + NXGE_MAC_LD_START;
34416f45ec7bSml29623 ldvp->ldv = (uint8_t)ldv;
34426f45ec7bSml29623 ldvp->use_timer = B_FALSE;
34436f45ec7bSml29623 ldvp->nxgep = nxgep;
34446f45ec7bSml29623 nxge_ldgv_setup(&ldgp, &ldvp, ldv, endldg, nrequired_p);
34456f45ec7bSml29623 nldvs++;
34466f45ec7bSml29623 }
34476f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL, "==> nxge_ldgv_init: "
34486f45ec7bSml29623 "func %d nldvs %d navail %d nrequired %d",
34496f45ec7bSml29623 func, nldvs, *navail_p, *nrequired_p));
34506f45ec7bSml29623 /*
34516f45ec7bSml29623 * Function 0 owns system error interrupts.
34526f45ec7bSml29623 */
34536f45ec7bSml29623 ldvp->use_timer = B_TRUE;
34546f45ec7bSml29623 if (own_sys_err) {
34556f45ec7bSml29623 ldv = NXGE_SYS_ERROR_LD;
34566f45ec7bSml29623 ldvp->ldv = (uint8_t)ldv;
34576f45ec7bSml29623 ldvp->is_syserr = B_TRUE;
34586f45ec7bSml29623 ldvp->ldv_intr_handler = nxge_syserr_intr;
34596f45ec7bSml29623 ldvp->ldv_ldf_masks = 0;
34606f45ec7bSml29623 ldvp->nxgep = nxgep;
34616f45ec7bSml29623 ldgvp->ldvp_syserr = ldvp;
34626f45ec7bSml29623 /*
34636f45ec7bSml29623 * Unmask the system interrupt states.
34646f45ec7bSml29623 */
34656f45ec7bSml29623 (void) nxge_fzc_sys_err_mask_set(nxgep, SYS_ERR_SMX_MASK |
34666f45ec7bSml29623 SYS_ERR_IPP_MASK | SYS_ERR_TXC_MASK |
34676f45ec7bSml29623 SYS_ERR_ZCP_MASK);
34686f45ec7bSml29623
34696f45ec7bSml29623 (void) nxge_ldgv_setup(&ldgp, &ldvp, ldv, endldg, nrequired_p);
34706f45ec7bSml29623 nldvs++;
34716f45ec7bSml29623 } else {
34726f45ec7bSml29623 ldv = NXGE_SYS_ERROR_LD;
34736f45ec7bSml29623 ldvp->ldv = (uint8_t)ldv;
34746f45ec7bSml29623 ldvp->is_syserr = B_TRUE;
34756f45ec7bSml29623 ldvp->ldv_intr_handler = nxge_syserr_intr;
34766f45ec7bSml29623 ldvp->nxgep = nxgep;
34776f45ec7bSml29623 ldvp->ldv_ldf_masks = 0;
34786f45ec7bSml29623 ldgvp->ldvp_syserr = ldvp;
34796f45ec7bSml29623 }
34806f45ec7bSml29623
34816f45ec7bSml29623 ldgvp->ldg_intrs = *nrequired_p;
34826f45ec7bSml29623
34836f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL, "==> nxge_ldgv_init: "
34846f45ec7bSml29623 "func %d nldvs %d navail %d nrequired %d",
34856f45ec7bSml29623 func, nldvs, *navail_p, *nrequired_p));
34866f45ec7bSml29623
34876f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL, "<== nxge_ldgv_init"));
34886f45ec7bSml29623 return (status);
34896f45ec7bSml29623 }
34906f45ec7bSml29623
34916f45ec7bSml29623 nxge_status_t
nxge_ldgv_uninit(p_nxge_t nxgep)34926f45ec7bSml29623 nxge_ldgv_uninit(p_nxge_t nxgep)
34936f45ec7bSml29623 {
34946f45ec7bSml29623 p_nxge_ldgv_t ldgvp;
34956f45ec7bSml29623
34966f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL, "==> nxge_ldgv_uninit"));
34976f45ec7bSml29623 ldgvp = nxgep->ldgvp;
34986f45ec7bSml29623 if (ldgvp == NULL) {
34996f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL, "<== nxge_ldgv_uninit: "
35006f45ec7bSml29623 "no logical group configured."));
35016f45ec7bSml29623 return (NXGE_OK);
35026f45ec7bSml29623 }
3503da14cebeSEric Cheng if (ldgvp->ldvp_syserr_alloced == B_TRUE) {
3504d7cf53fcSmisaki Miyashita KMEM_FREE(ldgvp->ldvp_syserr, sizeof (nxge_ldv_t));
3505d7cf53fcSmisaki Miyashita }
35066f45ec7bSml29623 if (ldgvp->ldgp) {
35076f45ec7bSml29623 KMEM_FREE(ldgvp->ldgp, sizeof (nxge_ldg_t) * ldgvp->maxldgs);
35086f45ec7bSml29623 }
35096f45ec7bSml29623 if (ldgvp->ldvp) {
35106f45ec7bSml29623 KMEM_FREE(ldgvp->ldvp, sizeof (nxge_ldv_t) * ldgvp->maxldvs);
35116f45ec7bSml29623 }
35126f45ec7bSml29623 KMEM_FREE(ldgvp, sizeof (nxge_ldgv_t));
35136f45ec7bSml29623 nxgep->ldgvp = NULL;
35146f45ec7bSml29623
35156f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL, "<== nxge_ldgv_uninit"));
35166f45ec7bSml29623 return (NXGE_OK);
35176f45ec7bSml29623 }
35186f45ec7bSml29623
35196f45ec7bSml29623 nxge_status_t
nxge_intr_ldgv_init(p_nxge_t nxgep)35206f45ec7bSml29623 nxge_intr_ldgv_init(p_nxge_t nxgep)
35216f45ec7bSml29623 {
35226f45ec7bSml29623 nxge_status_t status = NXGE_OK;
35236f45ec7bSml29623
35246f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL, "==> nxge_intr_ldgv_init"));
35256f45ec7bSml29623 /*
35266f45ec7bSml29623 * Configure the logical device group numbers, state vectors and
35276f45ec7bSml29623 * interrupt masks for each logical device.
35286f45ec7bSml29623 */
35296f45ec7bSml29623 status = nxge_fzc_intr_init(nxgep);
35306f45ec7bSml29623
35316f45ec7bSml29623 /*
35326f45ec7bSml29623 * Configure logical device masks and timers.
35336f45ec7bSml29623 */
35346f45ec7bSml29623 status = nxge_intr_mask_mgmt(nxgep);
35356f45ec7bSml29623
35366f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL, "<== nxge_intr_ldgv_init"));
35376f45ec7bSml29623 return (status);
35386f45ec7bSml29623 }
35396f45ec7bSml29623
35406f45ec7bSml29623 nxge_status_t
nxge_intr_mask_mgmt(p_nxge_t nxgep)35416f45ec7bSml29623 nxge_intr_mask_mgmt(p_nxge_t nxgep)
35426f45ec7bSml29623 {
35436f45ec7bSml29623 p_nxge_ldgv_t ldgvp;
35446f45ec7bSml29623 p_nxge_ldg_t ldgp;
35456f45ec7bSml29623 p_nxge_ldv_t ldvp;
35466f45ec7bSml29623 npi_handle_t handle;
35476f45ec7bSml29623 int i, j;
35486f45ec7bSml29623 npi_status_t rs = NPI_SUCCESS;
35496f45ec7bSml29623
35506f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL, "==> nxge_intr_mask_mgmt"));
35516f45ec7bSml29623
35526f45ec7bSml29623 if ((ldgvp = nxgep->ldgvp) == NULL) {
35536f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
35546f45ec7bSml29623 "<== nxge_intr_mask_mgmt: Null ldgvp"));
35556f45ec7bSml29623 return (NXGE_ERROR);
35566f45ec7bSml29623 }
35576f45ec7bSml29623 handle = NXGE_DEV_NPI_HANDLE(nxgep);
35586f45ec7bSml29623 ldgp = ldgvp->ldgp;
35596f45ec7bSml29623 ldvp = ldgvp->ldvp;
35606f45ec7bSml29623 if (ldgp == NULL || ldvp == NULL) {
35616f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
35626f45ec7bSml29623 "<== nxge_intr_mask_mgmt: Null ldgp or ldvp"));
35636f45ec7bSml29623 return (NXGE_ERROR);
35646f45ec7bSml29623 }
35656f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL,
35666f45ec7bSml29623 "==> nxge_intr_mask_mgmt: # of intrs %d ", ldgvp->ldg_intrs));
35676f45ec7bSml29623 /* Initialize masks. */
35686f45ec7bSml29623 if (nxgep->niu_type != N2_NIU) {
35696f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL,
35706f45ec7bSml29623 "==> nxge_intr_mask_mgmt(Neptune): # intrs %d ",
35716f45ec7bSml29623 ldgvp->ldg_intrs));
35726f45ec7bSml29623 for (i = 0; i < ldgvp->ldg_intrs; i++, ldgp++) {
35736f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL,
35746f45ec7bSml29623 "==> nxge_intr_mask_mgmt(Neptune): # ldv %d "
35756f45ec7bSml29623 "in group %d", ldgp->nldvs, ldgp->ldg));
35766f45ec7bSml29623 for (j = 0; j < ldgp->nldvs; j++, ldvp++) {
35776f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL,
35786f45ec7bSml29623 "==> nxge_intr_mask_mgmt: set ldv # %d "
35796f45ec7bSml29623 "for ldg %d", ldvp->ldv, ldgp->ldg));
35806f45ec7bSml29623 rs = npi_intr_mask_set(handle, ldvp->ldv,
35816f45ec7bSml29623 ldvp->ldv_ldf_masks);
35826f45ec7bSml29623 if (rs != NPI_SUCCESS) {
35836f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
35846f45ec7bSml29623 "<== nxge_intr_mask_mgmt: "
35856f45ec7bSml29623 "set mask failed "
35866f45ec7bSml29623 " rs 0x%x ldv %d mask 0x%x",
35876f45ec7bSml29623 rs, ldvp->ldv,
35886f45ec7bSml29623 ldvp->ldv_ldf_masks));
35896f45ec7bSml29623 return (NXGE_ERROR | rs);
35906f45ec7bSml29623 }
35916f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL,
35926f45ec7bSml29623 "==> nxge_intr_mask_mgmt: "
35936f45ec7bSml29623 "set mask OK "
35946f45ec7bSml29623 " rs 0x%x ldv %d mask 0x%x",
35956f45ec7bSml29623 rs, ldvp->ldv,
35966f45ec7bSml29623 ldvp->ldv_ldf_masks));
35976f45ec7bSml29623 }
35986f45ec7bSml29623 }
35996f45ec7bSml29623 }
36006f45ec7bSml29623 ldgp = ldgvp->ldgp;
36016f45ec7bSml29623 /* Configure timer and arm bit */
36026f45ec7bSml29623 for (i = 0; i < nxgep->ldgvp->ldg_intrs; i++, ldgp++) {
36036f45ec7bSml29623 rs = npi_intr_ldg_mgmt_set(handle, ldgp->ldg,
36046f45ec7bSml29623 ldgp->arm, ldgp->ldg_timer);
36056f45ec7bSml29623 if (rs != NPI_SUCCESS) {
36066f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
36076f45ec7bSml29623 "<== nxge_intr_mask_mgmt: "
36086f45ec7bSml29623 "set timer failed "
36096f45ec7bSml29623 " rs 0x%x dg %d timer 0x%x",
36106f45ec7bSml29623 rs, ldgp->ldg, ldgp->ldg_timer));
36116f45ec7bSml29623 return (NXGE_ERROR | rs);
36126f45ec7bSml29623 }
36136f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL,
36146f45ec7bSml29623 "==> nxge_intr_mask_mgmt: "
36156f45ec7bSml29623 "set timer OK "
36166f45ec7bSml29623 " rs 0x%x ldg %d timer 0x%x",
36176f45ec7bSml29623 rs, ldgp->ldg, ldgp->ldg_timer));
36186f45ec7bSml29623 }
36196f45ec7bSml29623
36206f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL, "<== nxge_fzc_intr_mask_mgmt"));
36216f45ec7bSml29623 return (NXGE_OK);
36226f45ec7bSml29623 }
36236f45ec7bSml29623
36246f45ec7bSml29623 nxge_status_t
nxge_intr_mask_mgmt_set(p_nxge_t nxgep,boolean_t on)36256f45ec7bSml29623 nxge_intr_mask_mgmt_set(p_nxge_t nxgep, boolean_t on)
36266f45ec7bSml29623 {
36276f45ec7bSml29623 p_nxge_ldgv_t ldgvp;
36286f45ec7bSml29623 p_nxge_ldg_t ldgp;
36296f45ec7bSml29623 p_nxge_ldv_t ldvp;
36306f45ec7bSml29623 npi_handle_t handle;
36316f45ec7bSml29623 int i, j;
36326f45ec7bSml29623 npi_status_t rs = NPI_SUCCESS;
36336f45ec7bSml29623
36346f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL,
36356f45ec7bSml29623 "==> nxge_intr_mask_mgmt_set (%d)", on));
36366f45ec7bSml29623
36376f45ec7bSml29623 if (nxgep->niu_type == N2_NIU) {
36386f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL,
36396f45ec7bSml29623 "<== nxge_intr_mask_mgmt_set (%d) not set (N2/NIU)",
36406f45ec7bSml29623 on));
36416f45ec7bSml29623 return (NXGE_ERROR);
36426f45ec7bSml29623 }
36436f45ec7bSml29623
36446f45ec7bSml29623 if ((ldgvp = nxgep->ldgvp) == NULL) {
36456f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
36466f45ec7bSml29623 "==> nxge_intr_mask_mgmt_set: Null ldgvp"));
36476f45ec7bSml29623 return (NXGE_ERROR);
36486f45ec7bSml29623 }
36496f45ec7bSml29623
36506f45ec7bSml29623 handle = NXGE_DEV_NPI_HANDLE(nxgep);
36516f45ec7bSml29623 ldgp = ldgvp->ldgp;
36526f45ec7bSml29623 ldvp = ldgvp->ldvp;
36536f45ec7bSml29623 if (ldgp == NULL || ldvp == NULL) {
36546f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
36556f45ec7bSml29623 "<== nxge_intr_mask_mgmt_set: Null ldgp or ldvp"));
36566f45ec7bSml29623 return (NXGE_ERROR);
36576f45ec7bSml29623 }
36586f45ec7bSml29623 /* set masks. */
36596f45ec7bSml29623 for (i = 0; i < ldgvp->ldg_intrs; i++, ldgp++) {
36606f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL,
36616f45ec7bSml29623 "==> nxge_intr_mask_mgmt_set: flag %d ldg %d"
36626f45ec7bSml29623 "set mask nldvs %d", on, ldgp->ldg, ldgp->nldvs));
36636f45ec7bSml29623 for (j = 0; j < ldgp->nldvs; j++, ldvp++) {
36646f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL,
36656f45ec7bSml29623 "==> nxge_intr_mask_mgmt_set: "
36666f45ec7bSml29623 "for %d %d flag %d", i, j, on));
36676f45ec7bSml29623 if (on) {
36686f45ec7bSml29623 ldvp->ldv_ldf_masks = 0;
36696f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL,
36706f45ec7bSml29623 "==> nxge_intr_mask_mgmt_set: "
36716f45ec7bSml29623 "ON mask off"));
36726f45ec7bSml29623 } else if (!on) {
36736f45ec7bSml29623 ldvp->ldv_ldf_masks = (uint8_t)LD_IM1_MASK;
36746f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL,
36756f45ec7bSml29623 "==> nxge_intr_mask_mgmt_set:mask on"));
36766f45ec7bSml29623 }
36776f45ec7bSml29623 rs = npi_intr_mask_set(handle, ldvp->ldv,
36786f45ec7bSml29623 ldvp->ldv_ldf_masks);
36796f45ec7bSml29623 if (rs != NPI_SUCCESS) {
36806f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
36816f45ec7bSml29623 "==> nxge_intr_mask_mgmt_set: "
36826f45ec7bSml29623 "set mask failed "
36836f45ec7bSml29623 " rs 0x%x ldv %d mask 0x%x",
36846f45ec7bSml29623 rs, ldvp->ldv, ldvp->ldv_ldf_masks));
36856f45ec7bSml29623 return (NXGE_ERROR | rs);
36866f45ec7bSml29623 }
36876f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL,
36886f45ec7bSml29623 "==> nxge_intr_mask_mgmt_set: flag %d"
36896f45ec7bSml29623 "set mask OK "
36906f45ec7bSml29623 " ldv %d mask 0x%x",
36916f45ec7bSml29623 on, ldvp->ldv, ldvp->ldv_ldf_masks));
36926f45ec7bSml29623 }
36936f45ec7bSml29623 }
36946f45ec7bSml29623
36956f45ec7bSml29623 ldgp = ldgvp->ldgp;
36966f45ec7bSml29623 /* set the arm bit */
36976f45ec7bSml29623 for (i = 0; i < nxgep->ldgvp->ldg_intrs; i++, ldgp++) {
36986f45ec7bSml29623 if (on && !ldgp->arm) {
36996f45ec7bSml29623 ldgp->arm = B_TRUE;
37006f45ec7bSml29623 } else if (!on && ldgp->arm) {
37016f45ec7bSml29623 ldgp->arm = B_FALSE;
37026f45ec7bSml29623 }
37036f45ec7bSml29623 rs = npi_intr_ldg_mgmt_set(handle, ldgp->ldg,
37046f45ec7bSml29623 ldgp->arm, ldgp->ldg_timer);
37056f45ec7bSml29623 if (rs != NPI_SUCCESS) {
37066f45ec7bSml29623 NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
37076f45ec7bSml29623 "<== nxge_intr_mask_mgmt_set: "
37086f45ec7bSml29623 "set timer failed "
37096f45ec7bSml29623 " rs 0x%x ldg %d timer 0x%x",
37106f45ec7bSml29623 rs, ldgp->ldg, ldgp->ldg_timer));
37116f45ec7bSml29623 return (NXGE_ERROR | rs);
37126f45ec7bSml29623 }
37136f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL,
37146f45ec7bSml29623 "==> nxge_intr_mask_mgmt_set: OK (flag %d) "
37156f45ec7bSml29623 "set timer "
37166f45ec7bSml29623 " ldg %d timer 0x%x",
37176f45ec7bSml29623 on, ldgp->ldg, ldgp->ldg_timer));
37186f45ec7bSml29623 }
37196f45ec7bSml29623
37206f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, INT_CTL, "<== nxge_intr_mask_mgmt_set"));
37216f45ec7bSml29623 return (NXGE_OK);
37226f45ec7bSml29623 }
37236f45ec7bSml29623
37246f45ec7bSml29623 static nxge_status_t
nxge_get_mac_addr_properties(p_nxge_t nxgep)37256f45ec7bSml29623 nxge_get_mac_addr_properties(p_nxge_t nxgep)
37266f45ec7bSml29623 {
372759ac0c16Sdavemq #if defined(_BIG_ENDIAN)
37286f45ec7bSml29623 uchar_t *prop_val;
37296f45ec7bSml29623 uint_t prop_len;
373059ac0c16Sdavemq uint_t j;
373159ac0c16Sdavemq #endif
37326f45ec7bSml29623 uint_t i;
37336f45ec7bSml29623 uint8_t func_num;
373459ac0c16Sdavemq boolean_t compute_macs = B_TRUE;
37356f45ec7bSml29623
37366f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, DDI_CTL, "==> nxge_get_mac_addr_properties "));
37376f45ec7bSml29623
37386f45ec7bSml29623 #if defined(_BIG_ENDIAN)
37396f45ec7bSml29623 /*
37406f45ec7bSml29623 * Get the ethernet address.
37416f45ec7bSml29623 */
37426f45ec7bSml29623 (void) localetheraddr((struct ether_addr *)NULL, &nxgep->ouraddr);
37436f45ec7bSml29623
37446f45ec7bSml29623 /*
37456f45ec7bSml29623 * Check if it is an adapter with its own local mac address If it is
37466f45ec7bSml29623 * present, override the system mac address.
37476f45ec7bSml29623 */
37486f45ec7bSml29623 if (ddi_prop_lookup_byte_array(DDI_DEV_T_ANY, nxgep->dip, 0,
37496f45ec7bSml29623 "local-mac-address", &prop_val,
37506f45ec7bSml29623 &prop_len) == DDI_PROP_SUCCESS) {
37516f45ec7bSml29623 if (prop_len == ETHERADDRL) {
37526f45ec7bSml29623 nxgep->factaddr = *(p_ether_addr_t)prop_val;
37536f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, DDI_CTL, "Local mac address = "
37546f45ec7bSml29623 "%02x:%02x:%02x:%02x:%02x:%02x",
37556f45ec7bSml29623 prop_val[0], prop_val[1], prop_val[2],
37566f45ec7bSml29623 prop_val[3], prop_val[4], prop_val[5]));
37576f45ec7bSml29623 }
37586f45ec7bSml29623 ddi_prop_free(prop_val);
37596f45ec7bSml29623 }
37606f45ec7bSml29623 if (ddi_prop_lookup_byte_array(DDI_DEV_T_ANY, nxgep->dip, 0,
37616f45ec7bSml29623 "local-mac-address?", &prop_val,
37626f45ec7bSml29623 &prop_len) == DDI_PROP_SUCCESS) {
37636f45ec7bSml29623 if (strncmp("true", (caddr_t)prop_val, (size_t)prop_len) == 0) {
37646f45ec7bSml29623 nxgep->ouraddr = nxgep->factaddr;
37656f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, DDI_CTL,
37666f45ec7bSml29623 "Using local MAC address"));
37676f45ec7bSml29623 }
37686f45ec7bSml29623 ddi_prop_free(prop_val);
37696f45ec7bSml29623 } else {
37706f45ec7bSml29623 nxgep->ouraddr = nxgep->factaddr;
37716f45ec7bSml29623 }
37726f45ec7bSml29623
37732e59129aSraghus if ((!nxgep->vpd_info.present) ||
377459ac0c16Sdavemq (nxge_is_valid_local_mac(nxgep->factaddr)))
377556d930aeSspeer goto got_mac_addr;
377656d930aeSspeer
377756d930aeSspeer NXGE_DEBUG_MSG((nxgep, DDI_CTL, "nxge_get_mac_addr_properties: "
377856d930aeSspeer "MAC address from properties is not valid...reading from PROM"));
377956d930aeSspeer
378056d930aeSspeer #endif
378156d930aeSspeer if (!nxgep->vpd_info.ver_valid) {
378256d930aeSspeer (void) nxge_espc_mac_addrs_get(nxgep);
378356d930aeSspeer if (!nxge_is_valid_local_mac(nxgep->factaddr)) {
37842e59129aSraghus NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL, "Failed to get "
37852e59129aSraghus "MAC address"));
378656d930aeSspeer NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL, "EEPROM version "
378756d930aeSspeer "[%s] invalid...please update",
378856d930aeSspeer nxgep->vpd_info.ver));
378956d930aeSspeer return (NXGE_ERROR);
379056d930aeSspeer }
379156d930aeSspeer nxgep->ouraddr = nxgep->factaddr;
379256d930aeSspeer goto got_mac_addr;
379356d930aeSspeer }
379456d930aeSspeer /*
379556d930aeSspeer * First get the MAC address from the info in the VPD data read
379656d930aeSspeer * from the EEPROM.
379756d930aeSspeer */
379856d930aeSspeer nxge_espc_get_next_mac_addr(nxgep->vpd_info.mac_addr,
379959ac0c16Sdavemq nxgep->function_num, &nxgep->factaddr);
380056d930aeSspeer
380156d930aeSspeer if (!nxge_is_valid_local_mac(nxgep->factaddr)) {
380256d930aeSspeer NXGE_DEBUG_MSG((nxgep, DDI_CTL,
380356d930aeSspeer "nxge_get_mac_addr_properties: "
380456d930aeSspeer "MAC address in EEPROM VPD data not valid"
380556d930aeSspeer "...reading from NCR registers"));
380656d930aeSspeer (void) nxge_espc_mac_addrs_get(nxgep);
380756d930aeSspeer if (!nxge_is_valid_local_mac(nxgep->factaddr)) {
38082e59129aSraghus NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL, "Failed to get "
38092e59129aSraghus "MAC address"));
381056d930aeSspeer NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL, "EEPROM version "
381156d930aeSspeer "[%s] invalid...please update",
381256d930aeSspeer nxgep->vpd_info.ver));
381356d930aeSspeer return (NXGE_ERROR);
381456d930aeSspeer }
381556d930aeSspeer }
381656d930aeSspeer
381756d930aeSspeer nxgep->ouraddr = nxgep->factaddr;
381856d930aeSspeer
381956d930aeSspeer got_mac_addr:
38206f45ec7bSml29623 func_num = nxgep->function_num;
38216f45ec7bSml29623
38226f45ec7bSml29623 /*
382359ac0c16Sdavemq * Note: mac-addresses property is the list of mac addresses for a
382459ac0c16Sdavemq * port. NXGE_MAX_MMAC_ADDRS is the total number of MAC addresses
382559ac0c16Sdavemq * allocated for a board.
38266f45ec7bSml29623 */
382759ac0c16Sdavemq nxgep->nxge_mmac_info.total_factory_macs = NXGE_MAX_MMAC_ADDRS;
38286f45ec7bSml29623
382959ac0c16Sdavemq #if defined(_BIG_ENDIAN)
38306f45ec7bSml29623 if (ddi_prop_lookup_byte_array(DDI_DEV_T_ANY, nxgep->dip, 0,
383159ac0c16Sdavemq "mac-addresses", &prop_val, &prop_len) == DDI_PROP_SUCCESS) {
38326f45ec7bSml29623 /*
38336f45ec7bSml29623 * XAUI may have up to 18 MACs, more than the XMAC can
38346f45ec7bSml29623 * use (1 unique MAC plus 16 alternate MACs)
38356f45ec7bSml29623 */
383659ac0c16Sdavemq nxgep->nxge_mmac_info.num_factory_mmac =
383759ac0c16Sdavemq prop_len / ETHERADDRL - 1;
38386f45ec7bSml29623 if (nxgep->nxge_mmac_info.num_factory_mmac >
38396f45ec7bSml29623 XMAC_MAX_ALT_ADDR_ENTRY) {
38406f45ec7bSml29623 nxgep->nxge_mmac_info.num_factory_mmac =
38416f45ec7bSml29623 XMAC_MAX_ALT_ADDR_ENTRY;
38426f45ec7bSml29623 }
384359ac0c16Sdavemq
384459ac0c16Sdavemq for (i = 1; i <= nxgep->nxge_mmac_info.num_factory_mmac; i++) {
384559ac0c16Sdavemq for (j = 0; j < ETHERADDRL; j++) {
384659ac0c16Sdavemq nxgep->nxge_mmac_info.factory_mac_pool[i][j] =
384759ac0c16Sdavemq *(prop_val + (i * ETHERADDRL) + j);
38486f45ec7bSml29623 }
384959ac0c16Sdavemq NXGE_DEBUG_MSG((nxgep, DDI_CTL,
385059ac0c16Sdavemq "nxge_get_mac_addr_properties: Alt mac[%d] from "
385159ac0c16Sdavemq "mac-addresses property[%2x:%2x:%2x:%2x:%2x:%2x]",
385259ac0c16Sdavemq i, nxgep->nxge_mmac_info.factory_mac_pool[i][0],
385359ac0c16Sdavemq nxgep->nxge_mmac_info.factory_mac_pool[i][1],
385459ac0c16Sdavemq nxgep->nxge_mmac_info.factory_mac_pool[i][2],
385559ac0c16Sdavemq nxgep->nxge_mmac_info.factory_mac_pool[i][3],
385659ac0c16Sdavemq nxgep->nxge_mmac_info.factory_mac_pool[i][4],
385759ac0c16Sdavemq nxgep->nxge_mmac_info.factory_mac_pool[i][5]));
385859ac0c16Sdavemq }
385959ac0c16Sdavemq
386059ac0c16Sdavemq compute_macs = B_FALSE;
386159ac0c16Sdavemq ddi_prop_free(prop_val);
386259ac0c16Sdavemq goto got_mmac_info;
386359ac0c16Sdavemq }
386459ac0c16Sdavemq #endif
38656f45ec7bSml29623 /*
38666f45ec7bSml29623 * total_factory_macs = 32
38676f45ec7bSml29623 * num_factory_mmac = (32 >> (nports/2)) - 1
38686f45ec7bSml29623 * So if nports = 4, then num_factory_mmac = 7
38696f45ec7bSml29623 * if nports = 2, then num_factory_mmac = 15
38706f45ec7bSml29623 */
387159ac0c16Sdavemq nxgep->nxge_mmac_info.num_factory_mmac =
387259ac0c16Sdavemq ((nxgep->nxge_mmac_info.total_factory_macs >>
38736f45ec7bSml29623 (nxgep->nports >> 1))) - 1;
387456d930aeSspeer
387559ac0c16Sdavemq got_mmac_info:
387659ac0c16Sdavemq
387756d930aeSspeer if ((nxgep->function_num < 2) &&
387856d930aeSspeer (nxgep->nxge_mmac_info.num_factory_mmac >
387956d930aeSspeer XMAC_MAX_ALT_ADDR_ENTRY)) {
388056d930aeSspeer nxgep->nxge_mmac_info.num_factory_mmac =
388156d930aeSspeer XMAC_MAX_ALT_ADDR_ENTRY;
388256d930aeSspeer } else if ((nxgep->function_num > 1) &&
388356d930aeSspeer (nxgep->nxge_mmac_info.num_factory_mmac >
388456d930aeSspeer BMAC_MAX_ALT_ADDR_ENTRY)) {
388556d930aeSspeer nxgep->nxge_mmac_info.num_factory_mmac =
388656d930aeSspeer BMAC_MAX_ALT_ADDR_ENTRY;
388756d930aeSspeer }
388856d930aeSspeer
38896f45ec7bSml29623 for (i = 0; i <= nxgep->nxge_mmac_info.num_mmac; i++) {
38906f45ec7bSml29623 (void) npi_mac_altaddr_disable(nxgep->npi_handle,
38916f45ec7bSml29623 NXGE_GET_PORT_NUM(func_num), i);
38926f45ec7bSml29623 }
38936f45ec7bSml29623
389459ac0c16Sdavemq (void) nxge_init_mmac(nxgep, compute_macs);
38956f45ec7bSml29623 return (NXGE_OK);
38966f45ec7bSml29623 }
38976f45ec7bSml29623
38986f45ec7bSml29623 void
nxge_get_xcvr_properties(p_nxge_t nxgep)38996f45ec7bSml29623 nxge_get_xcvr_properties(p_nxge_t nxgep)
39006f45ec7bSml29623 {
39016f45ec7bSml29623 uchar_t *prop_val;
39026f45ec7bSml29623 uint_t prop_len;
39036f45ec7bSml29623
39046f45ec7bSml29623 NXGE_DEBUG_MSG((nxgep, DDI_CTL, "==> nxge_get_xcvr_properties"));
39056f45ec7bSml29623
39066f45ec7bSml29623 /*
39076f45ec7bSml29623 * Read the type of physical layer interface being used.
39086f45ec7bSml29623 */
39096f45ec7bSml29623 nxgep->statsp->mac_stats.xcvr_inuse = INT_MII_XCVR;
39106f45ec7bSml29623 if (ddi_prop_lookup_byte_array(DDI_DEV_T_ANY, nxgep->dip, 0,
39116f45ec7bSml29623 "phy-type", &prop_val, &prop_len) == DDI_PROP_SUCCESS) {
39126f45ec7bSml29623 if (strncmp("pcs", (caddr_t)prop_val,
39136f45ec7bSml29623 (size_t)prop_len) == 0) {
39146f45ec7bSml29623 nxgep->statsp->mac_stats.xcvr_inuse = PCS_XCVR;
39156f45ec7bSml29623 } else {
39166f45ec7bSml29623 nxgep->statsp->mac_stats.xcvr_inuse = INT_MII_XCVR;
39176f45ec7bSml29623 }
39186f45ec7bSml29623 ddi_prop_free(prop_val);
39196f45ec7bSml29623 } else if (ddi_prop_lookup_byte_array(DDI_DEV_T_ANY, nxgep->dip, 0,
39206f45ec7bSml29623 "phy-interface", &prop_val,
39216f45ec7bSml29623 &prop_len) == DDI_PROP_SUCCESS) {
39226f45ec7bSml29623 if (strncmp("pcs", (caddr_t)prop_val, (size_t)prop_len) == 0) {
39236f45ec7bSml29623 nxgep->statsp->mac_stats.xcvr_inuse = PCS_XCVR;
39246f45ec7bSml29623 } else {
39256f45ec7bSml29623 nxgep->statsp->mac_stats.xcvr_inuse = INT_MII_XCVR;
39266f45ec7bSml29623 }
39276f45ec7bSml29623 ddi_prop_free(prop_val);
39286f45ec7bSml29623 }
39296f45ec7bSml29623 }
39306f45ec7bSml29623
39316f45ec7bSml29623 /*
39326f45ec7bSml29623 * Static functions start here.
39336f45ec7bSml29623 */
39346f45ec7bSml29623
39356f45ec7bSml29623 static void
nxge_ldgv_setup(p_nxge_ldg_t * ldgp,p_nxge_ldv_t * ldvp,uint8_t ldv,uint8_t endldg,int * ngrps)39366f45ec7bSml29623 nxge_ldgv_setup(p_nxge_ldg_t *ldgp, p_nxge_ldv_t *ldvp, uint8_t ldv,
39376f45ec7bSml29623 uint8_t endldg, int *ngrps)
39386f45ec7bSml29623 {
39396f45ec7bSml29623 NXGE_DEBUG_MSG((NULL, INT_CTL, "==> nxge_ldgv_setup"));
39406f45ec7bSml29623 /* Assign the group number for each device. */
39416f45ec7bSml29623 (*ldvp)->ldg_assigned = (*ldgp)->ldg;
39426f45ec7bSml29623 (*ldvp)->ldgp = *ldgp;
39436f45ec7bSml29623 (*ldvp)->ldv = ldv;
39446f45ec7bSml29623
39456f45ec7bSml29623 NXGE_DEBUG_MSG((NULL, INT_CTL, "==> nxge_ldgv_setup: "
39466f45ec7bSml29623 "ldv %d endldg %d ldg %d, ldvp $%p",
39476f45ec7bSml29623 ldv, endldg, (*ldgp)->ldg, (*ldgp)->ldvp));
39486f45ec7bSml29623
39496f45ec7bSml29623 (*ldgp)->nldvs++;
39506f45ec7bSml29623 if ((*ldgp)->ldg == (endldg - 1)) {
39516f45ec7bSml29623 if ((*ldgp)->ldvp == NULL) {
39526f45ec7bSml29623 (*ldgp)->ldvp = *ldvp;
39536f45ec7bSml29623 *ngrps += 1;
39546f45ec7bSml29623 NXGE_DEBUG_MSG((NULL, INT_CTL,
39556f45ec7bSml29623 "==> nxge_ldgv_setup: ngrps %d", *ngrps));
39566f45ec7bSml29623 }
39576f45ec7bSml29623 NXGE_DEBUG_MSG((NULL, INT_CTL,
39586f45ec7bSml29623 "==> nxge_ldgv_setup: ldvp $%p ngrps %d",
39596f45ec7bSml29623 *ldvp, *ngrps));
39606f45ec7bSml29623 ++*ldvp;
39616f45ec7bSml29623 } else {
39626f45ec7bSml29623 (*ldgp)->ldvp = *ldvp;
39636f45ec7bSml29623 *ngrps += 1;
39646f45ec7bSml29623 NXGE_DEBUG_MSG((NULL, INT_CTL, "==> nxge_ldgv_setup(done): "
39656f45ec7bSml29623 "ldv %d endldg %d ldg %d, ldvp $%p",
39666f45ec7bSml29623 ldv, endldg, (*ldgp)->ldg, (*ldgp)->ldvp));
3967*2bc98732SRichard Lowe ++*ldvp;
3968*2bc98732SRichard Lowe ++*ldgp;
39696f45ec7bSml29623 NXGE_DEBUG_MSG((NULL, INT_CTL,
39706f45ec7bSml29623 "==> nxge_ldgv_setup: new ngrps %d", *ngrps));
39716f45ec7bSml29623 }
39726f45ec7bSml29623
39736f45ec7bSml29623 NXGE_DEBUG_MSG((NULL, INT_CTL, "==> nxge_ldgv_setup: "
39746f45ec7bSml29623 "ldv %d ldvp $%p endldg %d ngrps %d",
39756f45ec7bSml29623 ldv, ldvp, endldg, *ngrps));
39766f45ec7bSml29623
39776f45ec7bSml29623 NXGE_DEBUG_MSG((NULL, INT_CTL, "<== nxge_ldgv_setup"));
39786f45ec7bSml29623 }
39796f45ec7bSml29623
39806f45ec7bSml29623 /*
39816f45ec7bSml29623 * Note: This function assumes the following distribution of mac
39826f45ec7bSml29623 * addresses among 4 ports in neptune:
39836f45ec7bSml29623 *
39846f45ec7bSml29623 * -------------
39856f45ec7bSml29623 * 0| |0 - local-mac-address for fn 0
39866f45ec7bSml29623 * -------------
39876f45ec7bSml29623 * 1| |1 - local-mac-address for fn 1
39886f45ec7bSml29623 * -------------
39896f45ec7bSml29623 * 2| |2 - local-mac-address for fn 2
39906f45ec7bSml29623 * -------------
39916f45ec7bSml29623 * 3| |3 - local-mac-address for fn 3
39926f45ec7bSml29623 * -------------
39936f45ec7bSml29623 * | |4 - Start of alt. mac addr. for fn 0
39946f45ec7bSml29623 * | |
39956f45ec7bSml29623 * | |
39966f45ec7bSml29623 * | |10
39976f45ec7bSml29623 * --------------
39986f45ec7bSml29623 * | |11 - Start of alt. mac addr. for fn 1
39996f45ec7bSml29623 * | |
40006f45ec7bSml29623 * | |
40016f45ec7bSml29623 * | |17
40026f45ec7bSml29623 * --------------
40036f45ec7bSml29623 * | |18 - Start of alt. mac addr. for fn 2
40046f45ec7bSml29623 * | |
40056f45ec7bSml29623 * | |
40066f45ec7bSml29623 * | |24
40076f45ec7bSml29623 * --------------
40086f45ec7bSml29623 * | |25 - Start of alt. mac addr. for fn 3
40096f45ec7bSml29623 * | |
40106f45ec7bSml29623 * | |
40116f45ec7bSml29623 * | |31
40126f45ec7bSml29623 * --------------
40136f45ec7bSml29623 *
40146f45ec7bSml29623 * For N2/NIU the mac addresses is from XAUI card.
401559ac0c16Sdavemq *
401659ac0c16Sdavemq * When 'compute_addrs' is true, the alternate mac addresses are computed
401759ac0c16Sdavemq * using the unique mac address as base. Otherwise the alternate addresses
401859ac0c16Sdavemq * are assigned from the list read off the 'mac-addresses' property.
40196f45ec7bSml29623 */
40206f45ec7bSml29623
40216f45ec7bSml29623 static void
nxge_init_mmac(p_nxge_t nxgep,boolean_t compute_addrs)402259ac0c16Sdavemq nxge_init_mmac(p_nxge_t nxgep, boolean_t compute_addrs)
40236f45ec7bSml29623 {
40246f45ec7bSml29623 int slot;
40256f45ec7bSml29623 uint8_t func_num;
40266f45ec7bSml29623 uint16_t *base_mmac_addr;
40276f45ec7bSml29623 uint32_t alt_mac_ls4b;
40286f45ec7bSml29623 uint16_t *mmac_addr;
40296f45ec7bSml29623 uint32_t base_mac_ls4b; /* least significant 4 bytes */
40306f45ec7bSml29623 nxge_mmac_t *mmac_info;
40316f45ec7bSml29623 npi_mac_addr_t mac_addr;
40326f45ec7bSml29623
40336f45ec7bSml29623 func_num = nxgep->function_num;
40346f45ec7bSml29623 base_mmac_addr = (uint16_t *)&nxgep->factaddr;
40356f45ec7bSml29623 mmac_info = (nxge_mmac_t *)&nxgep->nxge_mmac_info;
40366f45ec7bSml29623
403759ac0c16Sdavemq if (compute_addrs) {
40386f45ec7bSml29623 base_mac_ls4b = ((uint32_t)base_mmac_addr[1]) << 16 |
40396f45ec7bSml29623 base_mmac_addr[2];
40406f45ec7bSml29623
40416f45ec7bSml29623 if (nxgep->niu_type == N2_NIU) {
404259ac0c16Sdavemq /* ls4b of 1st altmac */
404359ac0c16Sdavemq alt_mac_ls4b = base_mac_ls4b + 1;
40446f45ec7bSml29623 } else { /* Neptune */
404559ac0c16Sdavemq alt_mac_ls4b = base_mac_ls4b +
404659ac0c16Sdavemq (nxgep->nports - func_num) +
404759ac0c16Sdavemq (func_num * (mmac_info->num_factory_mmac));
404859ac0c16Sdavemq }
40496f45ec7bSml29623 }
40506f45ec7bSml29623
40516f45ec7bSml29623 /* Set flags for unique MAC */
40526f45ec7bSml29623 mmac_info->mac_pool[0].flags |= MMAC_SLOT_USED | MMAC_VENDOR_ADDR;
40536f45ec7bSml29623
40546f45ec7bSml29623 /* Clear flags of all alternate MAC slots */
40556f45ec7bSml29623 for (slot = 1; slot <= mmac_info->num_mmac; slot++) {
40566f45ec7bSml29623 if (slot <= mmac_info->num_factory_mmac)
40576f45ec7bSml29623 mmac_info->mac_pool[slot].flags = MMAC_VENDOR_ADDR;
40586f45ec7bSml29623 else
40596f45ec7bSml29623 mmac_info->mac_pool[slot].flags = 0;
40606f45ec7bSml29623 }
40616f45ec7bSml29623
40626f45ec7bSml29623 /* Generate and store factory alternate MACs */
40636f45ec7bSml29623 for (slot = 1; slot <= mmac_info->num_factory_mmac; slot++) {
40646f45ec7bSml29623 mmac_addr = (uint16_t *)&mmac_info->factory_mac_pool[slot];
406559ac0c16Sdavemq if (compute_addrs) {
40666f45ec7bSml29623 mmac_addr[0] = base_mmac_addr[0];
40676f45ec7bSml29623 mac_addr.w2 = mmac_addr[0];
40686f45ec7bSml29623
40696f45ec7bSml29623 mmac_addr[1] = (alt_mac_ls4b >> 16) & 0x0FFFF;
40706f45ec7bSml29623 mac_addr.w1 = mmac_addr[1];
40716f45ec7bSml29623
40726f45ec7bSml29623 mmac_addr[2] = alt_mac_ls4b & 0x0FFFF;
40736f45ec7bSml29623 mac_addr.w0 = mmac_addr[2];
407459ac0c16Sdavemq
407559ac0c16Sdavemq alt_mac_ls4b++;
407659ac0c16Sdavemq } else {
407759ac0c16Sdavemq mac_addr.w2 = mmac_addr[0];
407859ac0c16Sdavemq mac_addr.w1 = mmac_addr[1];
407959ac0c16Sdavemq mac_addr.w0 = mmac_addr[2];
408059ac0c16Sdavemq }
408159ac0c16Sdavemq
408259ac0c16Sdavemq NXGE_DEBUG_MSG((nxgep, DDI_CTL,
408359ac0c16Sdavemq "mac_pool_addr[%2x:%2x:%2x:%2x:%2x:%2x] npi_addr[%x%x%x]",
408459ac0c16Sdavemq mmac_info->factory_mac_pool[slot][0],
408559ac0c16Sdavemq mmac_info->factory_mac_pool[slot][1],
408659ac0c16Sdavemq mmac_info->factory_mac_pool[slot][2],
408759ac0c16Sdavemq mmac_info->factory_mac_pool[slot][3],
408859ac0c16Sdavemq mmac_info->factory_mac_pool[slot][4],
408959ac0c16Sdavemq mmac_info->factory_mac_pool[slot][5],
409059ac0c16Sdavemq mac_addr.w0, mac_addr.w1, mac_addr.w2));
40916f45ec7bSml29623 /*
409259ac0c16Sdavemq * slot minus 1 because npi_mac_altaddr_entry expects 0
40936f45ec7bSml29623 * for the first alternate mac address.
40946f45ec7bSml29623 */
40956f45ec7bSml29623 (void) npi_mac_altaddr_entry(nxgep->npi_handle, OP_SET,
40966f45ec7bSml29623 NXGE_GET_PORT_NUM(func_num), slot - 1, &mac_addr);
40976f45ec7bSml29623 }
40986f45ec7bSml29623 /* Initialize the first two parameters for mmac kstat */
40996f45ec7bSml29623 nxgep->statsp->mmac_stats.mmac_max_cnt = mmac_info->num_mmac;
41006f45ec7bSml29623 nxgep->statsp->mmac_stats.mmac_avail_cnt = mmac_info->num_mmac;
41016f45ec7bSml29623 }
4102da14cebeSEric Cheng
4103da14cebeSEric Cheng /*
4104da14cebeSEric Cheng * Convert an RDC group index into a port ring index. That is, map
4105da14cebeSEric Cheng * <groupid> to an index into nxgep->rx_ring_handles.
4106da14cebeSEric Cheng * (group ring index -> port ring index)
4107da14cebeSEric Cheng */
4108da14cebeSEric Cheng int
nxge_get_rxring_index(p_nxge_t nxgep,int groupid,int ringidx)4109da14cebeSEric Cheng nxge_get_rxring_index(p_nxge_t nxgep, int groupid, int ringidx)
4110da14cebeSEric Cheng {
4111da14cebeSEric Cheng int i;
4112da14cebeSEric Cheng int index = 0;
4113da14cebeSEric Cheng p_nxge_rdc_grp_t rdc_grp_p;
4114da14cebeSEric Cheng p_nxge_dma_pt_cfg_t p_dma_cfgp;
4115da14cebeSEric Cheng p_nxge_hw_pt_cfg_t p_cfgp;
4116da14cebeSEric Cheng
4117da14cebeSEric Cheng p_dma_cfgp = &nxgep->pt_config;
4118da14cebeSEric Cheng p_cfgp = &p_dma_cfgp->hw_config;
4119da14cebeSEric Cheng
412063f531d1SSriharsha Basavapatna if (isLDOMguest(nxgep))
412163f531d1SSriharsha Basavapatna return (ringidx);
412263f531d1SSriharsha Basavapatna
4123da14cebeSEric Cheng for (i = 0; i < groupid; i++) {
4124da14cebeSEric Cheng rdc_grp_p =
4125da14cebeSEric Cheng &p_dma_cfgp->rdc_grps[p_cfgp->def_mac_rxdma_grpid + i];
4126da14cebeSEric Cheng index += rdc_grp_p->max_rdcs;
4127da14cebeSEric Cheng }
4128da14cebeSEric Cheng
4129da14cebeSEric Cheng return (index + ringidx);
4130da14cebeSEric Cheng }
4131