Lines Matching refs:g

493 mlxcx_quiesce_rx_cqs(mlxcx_t *mlxp, mlxcx_ring_group_t *g)  in mlxcx_quiesce_rx_cqs()  argument
500 mutex_enter(&g->mlg_mtx); in mlxcx_quiesce_rx_cqs()
502 for (i = 0; i < g->mlg_nwqs; ++i) { in mlxcx_quiesce_rx_cqs()
503 wq = &g->mlg_wqs[i]; in mlxcx_quiesce_rx_cqs()
514 mutex_exit(&g->mlg_mtx); in mlxcx_quiesce_rx_cqs()
518 mlxcx_teardown_rx_group(mlxcx_t *mlxp, mlxcx_ring_group_t *g) in mlxcx_teardown_rx_group() argument
527 mutex_enter(&g->mlg_port->mlp_mtx); in mlxcx_teardown_rx_group()
528 mutex_enter(&g->mlg_mtx); in mlxcx_teardown_rx_group()
530 if (g->mlg_state & MLXCX_GROUP_FLOWS) { in mlxcx_teardown_rx_group()
531 mlxcx_remove_all_umcast_entries(mlxp, g->mlg_port, g); in mlxcx_teardown_rx_group()
533 if (g->mlg_rx_vlan_ft != NULL) in mlxcx_teardown_rx_group()
534 mlxcx_remove_all_vlan_entries(mlxp, g); in mlxcx_teardown_rx_group()
536 if (g == &mlxp->mlx_rx_groups[0]) { in mlxcx_teardown_rx_group()
537 ft = g->mlg_port->mlp_rx_flow; in mlxcx_teardown_rx_group()
540 fg = g->mlg_port->mlp_bcast; in mlxcx_teardown_rx_group()
547 fg = g->mlg_port->mlp_promisc; in mlxcx_teardown_rx_group()
557 if (g->mlg_rx_vlan_ft != NULL) { in mlxcx_teardown_rx_group()
558 mutex_enter(&g->mlg_rx_vlan_ft->mlft_mtx); in mlxcx_teardown_rx_group()
559 ASSERT(list_is_empty(&g->mlg_rx_vlans)); in mlxcx_teardown_rx_group()
560 fg = g->mlg_rx_vlan_def_fg; in mlxcx_teardown_rx_group()
569 fg = g->mlg_rx_vlan_promisc_fg; in mlxcx_teardown_rx_group()
578 mlxcx_teardown_flow_table(mlxp, g->mlg_rx_vlan_ft); in mlxcx_teardown_rx_group()
579 list_destroy(&g->mlg_rx_vlans); in mlxcx_teardown_rx_group()
581 g->mlg_rx_vlan_ft = NULL; in mlxcx_teardown_rx_group()
584 mutex_enter(&g->mlg_rx_hash_ft->mlft_mtx); in mlxcx_teardown_rx_group()
585 mlxcx_teardown_flow_table(mlxp, g->mlg_rx_hash_ft); in mlxcx_teardown_rx_group()
586 g->mlg_rx_hash_ft = NULL; in mlxcx_teardown_rx_group()
588 avl_destroy(&g->mlg_rx_macs); in mlxcx_teardown_rx_group()
589 g->mlg_state &= ~MLXCX_GROUP_FLOWS; in mlxcx_teardown_rx_group()
592 if (g->mlg_state & MLXCX_GROUP_RUNNING) { in mlxcx_teardown_rx_group()
593 for (i = 0; i < g->mlg_nwqs; ++i) { in mlxcx_teardown_rx_group()
594 wq = &g->mlg_wqs[i]; in mlxcx_teardown_rx_group()
603 taskq_destroy(g->mlg_refill_tq); in mlxcx_teardown_rx_group()
604 g->mlg_state &= ~MLXCX_GROUP_RUNNING; in mlxcx_teardown_rx_group()
607 if (g->mlg_state & MLXCX_GROUP_TIRTIS) { in mlxcx_teardown_rx_group()
609 mlxcx_tir_t *tir = &g->mlg_tir[i]; in mlxcx_teardown_rx_group()
619 g->mlg_state &= ~MLXCX_GROUP_TIRTIS; in mlxcx_teardown_rx_group()
622 if (g->mlg_state & MLXCX_GROUP_RQT) { in mlxcx_teardown_rx_group()
623 if (g->mlg_rqt->mlrqt_state & MLXCX_RQT_CREATED && in mlxcx_teardown_rx_group()
624 !(g->mlg_rqt->mlrqt_state & MLXCX_RQT_DESTROYED)) { in mlxcx_teardown_rx_group()
625 if (!mlxcx_cmd_destroy_rqt(mlxp, g->mlg_rqt)) { in mlxcx_teardown_rx_group()
627 "for rx ring", g->mlg_rqt->mlrqt_num); in mlxcx_teardown_rx_group()
629 kmem_free(g->mlg_rqt->mlrqt_rq, in mlxcx_teardown_rx_group()
630 g->mlg_rqt->mlrqt_rq_size); in mlxcx_teardown_rx_group()
631 g->mlg_rqt->mlrqt_rq = NULL; in mlxcx_teardown_rx_group()
632 kmem_free(g->mlg_rqt, sizeof (mlxcx_rqtable_t)); in mlxcx_teardown_rx_group()
633 g->mlg_rqt = NULL; in mlxcx_teardown_rx_group()
635 g->mlg_state &= ~MLXCX_GROUP_RQT; in mlxcx_teardown_rx_group()
638 for (i = 0; i < g->mlg_nwqs; ++i) { in mlxcx_teardown_rx_group()
639 wq = &g->mlg_wqs[i]; in mlxcx_teardown_rx_group()
645 kmem_free(g->mlg_wqs, g->mlg_wqs_size); in mlxcx_teardown_rx_group()
646 g->mlg_wqs = NULL; in mlxcx_teardown_rx_group()
647 g->mlg_state &= ~MLXCX_GROUP_WQS; in mlxcx_teardown_rx_group()
649 mutex_exit(&g->mlg_mtx); in mlxcx_teardown_rx_group()
650 mutex_exit(&g->mlg_port->mlp_mtx); in mlxcx_teardown_rx_group()
652 mutex_destroy(&g->mlg_mtx); in mlxcx_teardown_rx_group()
654 g->mlg_state &= ~MLXCX_GROUP_INIT; in mlxcx_teardown_rx_group()
655 ASSERT3S(g->mlg_state, ==, 0); in mlxcx_teardown_rx_group()
659 mlxcx_teardown_tx_group(mlxcx_t *mlxp, mlxcx_ring_group_t *g) in mlxcx_teardown_tx_group() argument
665 mutex_enter(&g->mlg_mtx); in mlxcx_teardown_tx_group()
667 if (g->mlg_state & MLXCX_GROUP_WQS) { in mlxcx_teardown_tx_group()
668 for (i = 0; i < g->mlg_nwqs; ++i) { in mlxcx_teardown_tx_group()
669 wq = &g->mlg_wqs[i]; in mlxcx_teardown_tx_group()
682 g->mlg_state &= ~MLXCX_GROUP_RUNNING; in mlxcx_teardown_tx_group()
683 kmem_free(g->mlg_wqs, g->mlg_wqs_size); in mlxcx_teardown_tx_group()
684 g->mlg_wqs = NULL; in mlxcx_teardown_tx_group()
685 g->mlg_state &= ~MLXCX_GROUP_WQS; in mlxcx_teardown_tx_group()
688 if ((g->mlg_state & MLXCX_GROUP_TIRTIS) && in mlxcx_teardown_tx_group()
689 g->mlg_tis.mltis_state & MLXCX_TIS_CREATED && in mlxcx_teardown_tx_group()
690 !(g->mlg_tis.mltis_state & MLXCX_TIS_DESTROYED)) { in mlxcx_teardown_tx_group()
691 if (!mlxcx_cmd_destroy_tis(mlxp, &g->mlg_tis)) { in mlxcx_teardown_tx_group()
693 g->mlg_tis.mltis_num); in mlxcx_teardown_tx_group()
696 g->mlg_state &= ~MLXCX_GROUP_TIRTIS; in mlxcx_teardown_tx_group()
698 mutex_exit(&g->mlg_mtx); in mlxcx_teardown_tx_group()
699 mutex_destroy(&g->mlg_mtx); in mlxcx_teardown_tx_group()
700 g->mlg_state &= ~MLXCX_GROUP_INIT; in mlxcx_teardown_tx_group()
701 ASSERT3S(g->mlg_state, ==, 0); in mlxcx_teardown_tx_group()
707 mlxcx_ring_group_t *g; in mlxcx_teardown_groups() local
711 g = &mlxp->mlx_rx_groups[i]; in mlxcx_teardown_groups()
712 if (!(g->mlg_state & MLXCX_GROUP_INIT)) in mlxcx_teardown_groups()
714 ASSERT3S(g->mlg_type, ==, MLXCX_GROUP_RX); in mlxcx_teardown_groups()
715 mlxcx_quiesce_rx_cqs(mlxp, g); in mlxcx_teardown_groups()
719 g = &mlxp->mlx_rx_groups[i]; in mlxcx_teardown_groups()
720 if (!(g->mlg_state & MLXCX_GROUP_INIT)) in mlxcx_teardown_groups()
722 mlxcx_teardown_rx_group(mlxp, g); in mlxcx_teardown_groups()
729 g = &mlxp->mlx_tx_groups[i]; in mlxcx_teardown_groups()
730 if (!(g->mlg_state & MLXCX_GROUP_INIT)) in mlxcx_teardown_groups()
732 ASSERT3S(g->mlg_type, ==, MLXCX_GROUP_TX); in mlxcx_teardown_groups()
733 mlxcx_teardown_tx_group(mlxp, g); in mlxcx_teardown_groups()
741 mlxcx_rx_group_setup(mlxcx_t *mlxp, mlxcx_ring_group_t *g) in mlxcx_rx_group_setup() argument
752 ASSERT3S(g->mlg_state, ==, 0); in mlxcx_rx_group_setup()
754 mutex_init(&g->mlg_mtx, NULL, MUTEX_DRIVER, in mlxcx_rx_group_setup()
756 mutex_enter(&g->mlg_mtx); in mlxcx_rx_group_setup()
757 g->mlg_mlx = mlxp; in mlxcx_rx_group_setup()
758 g->mlg_type = MLXCX_GROUP_RX; in mlxcx_rx_group_setup()
759 g->mlg_port = &mlxp->mlx_ports[0]; in mlxcx_rx_group_setup()
760 g->mlg_state |= MLXCX_GROUP_INIT; in mlxcx_rx_group_setup()
762 g->mlg_nwqs = mlxp->mlx_props.mldp_rx_nrings_per_small_group; in mlxcx_rx_group_setup()
763 i = g - &mlxp->mlx_rx_groups[0]; in mlxcx_rx_group_setup()
765 g->mlg_nwqs = mlxp->mlx_props.mldp_rx_nrings_per_large_group; in mlxcx_rx_group_setup()
767 g->mlg_wqs_size = g->mlg_nwqs * sizeof (mlxcx_work_queue_t); in mlxcx_rx_group_setup()
768 g->mlg_wqs = kmem_zalloc(g->mlg_wqs_size, KM_SLEEP); in mlxcx_rx_group_setup()
769 g->mlg_state |= MLXCX_GROUP_WQS; in mlxcx_rx_group_setup()
771 g->mlg_rqt = kmem_zalloc(sizeof (mlxcx_rqtable_t), KM_SLEEP); in mlxcx_rx_group_setup()
772 g->mlg_rqt->mlrqt_max = 2; in mlxcx_rx_group_setup()
773 while (g->mlg_rqt->mlrqt_max < g->mlg_nwqs) in mlxcx_rx_group_setup()
774 g->mlg_rqt->mlrqt_max <<= 1; in mlxcx_rx_group_setup()
775 g->mlg_rqt->mlrqt_rq_size = g->mlg_rqt->mlrqt_max * in mlxcx_rx_group_setup()
777 g->mlg_rqt->mlrqt_rq = kmem_zalloc(g->mlg_rqt->mlrqt_rq_size, KM_SLEEP); in mlxcx_rx_group_setup()
778 g->mlg_state |= MLXCX_GROUP_RQT; in mlxcx_rx_group_setup()
780 for (i = 0; i < g->mlg_nwqs; ++i) { in mlxcx_rx_group_setup()
801 g->mlg_nwqs = i; in mlxcx_rx_group_setup()
805 cq->mlcq_stats = &g->mlg_port->mlp_stats; in mlxcx_rx_group_setup()
807 rq = &g->mlg_wqs[i]; in mlxcx_rx_group_setup()
809 g->mlg_nwqs = i; in mlxcx_rx_group_setup()
812 g->mlg_rqt->mlrqt_rq[g->mlg_rqt->mlrqt_used++] = rq; in mlxcx_rx_group_setup()
813 g->mlg_rqt->mlrqt_state |= MLXCX_RQT_DIRTY; in mlxcx_rx_group_setup()
814 rq->mlwq_group = g; in mlxcx_rx_group_setup()
816 if (g->mlg_nwqs == 0) { in mlxcx_rx_group_setup()
817 mutex_exit(&g->mlg_mtx); in mlxcx_rx_group_setup()
821 if (!mlxcx_cmd_create_rqt(mlxp, g->mlg_rqt)) { in mlxcx_rx_group_setup()
822 mutex_exit(&g->mlg_mtx); in mlxcx_rx_group_setup()
827 mlxcx_tir_t *tir = &g->mlg_tir[i]; in mlxcx_rx_group_setup()
832 tir->mltir_rq = &g->mlg_wqs[0]; in mlxcx_rx_group_setup()
841 tir->mltir_rqtable = g->mlg_rqt; in mlxcx_rx_group_setup()
885 mutex_exit(&g->mlg_mtx); in mlxcx_rx_group_setup()
889 g->mlg_state |= MLXCX_GROUP_TIRTIS; in mlxcx_rx_group_setup()
896 g->mlg_rx_hash_ft = (ft = kmem_zalloc(sizeof (mlxcx_flow_table_t), in mlxcx_rx_group_setup()
900 avl_create(&g->mlg_rx_macs, mlxcx_grmac_compare, in mlxcx_rx_group_setup()
903 g->mlg_state |= MLXCX_GROUP_FLOWS; in mlxcx_rx_group_setup()
909 ft->mlft_port = g->mlg_port; in mlxcx_rx_group_setup()
925 mutex_exit(&g->mlg_mtx); in mlxcx_rx_group_setup()
936 mutex_exit(&g->mlg_mtx); in mlxcx_rx_group_setup()
944 &g->mlg_tir[MLXCX_TIR_ROLE_UDPv6]; in mlxcx_rx_group_setup()
947 mutex_exit(&g->mlg_mtx); in mlxcx_rx_group_setup()
958 mutex_exit(&g->mlg_mtx); in mlxcx_rx_group_setup()
966 &g->mlg_tir[MLXCX_TIR_ROLE_UDPv4]; in mlxcx_rx_group_setup()
969 mutex_exit(&g->mlg_mtx); in mlxcx_rx_group_setup()
980 mutex_exit(&g->mlg_mtx); in mlxcx_rx_group_setup()
988 &g->mlg_tir[MLXCX_TIR_ROLE_TCPv6]; in mlxcx_rx_group_setup()
991 mutex_exit(&g->mlg_mtx); in mlxcx_rx_group_setup()
1002 mutex_exit(&g->mlg_mtx); in mlxcx_rx_group_setup()
1010 &g->mlg_tir[MLXCX_TIR_ROLE_TCPv4]; in mlxcx_rx_group_setup()
1013 mutex_exit(&g->mlg_mtx); in mlxcx_rx_group_setup()
1024 mutex_exit(&g->mlg_mtx); in mlxcx_rx_group_setup()
1031 &g->mlg_tir[MLXCX_TIR_ROLE_IPv6]; in mlxcx_rx_group_setup()
1034 mutex_exit(&g->mlg_mtx); in mlxcx_rx_group_setup()
1045 mutex_exit(&g->mlg_mtx); in mlxcx_rx_group_setup()
1052 &g->mlg_tir[MLXCX_TIR_ROLE_IPv4]; in mlxcx_rx_group_setup()
1055 mutex_exit(&g->mlg_mtx); in mlxcx_rx_group_setup()
1065 mutex_exit(&g->mlg_mtx); in mlxcx_rx_group_setup()
1071 &g->mlg_tir[MLXCX_TIR_ROLE_OTHER]; in mlxcx_rx_group_setup()
1074 mutex_exit(&g->mlg_mtx); in mlxcx_rx_group_setup()
1085 g->mlg_rx_vlan_ft = (ft = kmem_zalloc(sizeof (mlxcx_flow_table_t), in mlxcx_rx_group_setup()
1089 list_create(&g->mlg_rx_vlans, sizeof (mlxcx_group_vlan_t), in mlxcx_rx_group_setup()
1096 ft->mlft_port = g->mlg_port; in mlxcx_rx_group_setup()
1109 fe->mlfe_dest[fe->mlfe_ndest++].mlfed_flow = g->mlg_rx_hash_ft; in mlxcx_rx_group_setup()
1114 mutex_exit(&g->mlg_mtx); in mlxcx_rx_group_setup()
1120 g->mlg_rx_vlan_fg = fg; in mlxcx_rx_group_setup()
1128 mutex_exit(&g->mlg_mtx); in mlxcx_rx_group_setup()
1137 g->mlg_rx_vlan_def_fg = fg; in mlxcx_rx_group_setup()
1143 mutex_exit(&g->mlg_mtx); in mlxcx_rx_group_setup()
1149 mutex_exit(&g->mlg_mtx); in mlxcx_rx_group_setup()
1158 g->mlg_rx_vlan_promisc_fg = fg; in mlxcx_rx_group_setup()
1164 mutex_exit(&g->mlg_mtx); in mlxcx_rx_group_setup()
1173 mutex_exit(&g->mlg_mtx); in mlxcx_rx_group_setup()
1179 mlxcx_rx_ring_start(mlxcx_t *mlxp, mlxcx_ring_group_t *g, in mlxcx_rx_ring_start() argument
1186 mutex_enter(&g->mlg_mtx); in mlxcx_rx_ring_start()
1195 if (!(g->mlg_state & MLXCX_GROUP_RUNNING)) { in mlxcx_rx_ring_start()
1196 mutex_exit(&g->mlg_mtx); in mlxcx_rx_ring_start()
1197 if (!mlxcx_rx_group_start(mlxp, g)) in mlxcx_rx_ring_start()
1199 mutex_enter(&g->mlg_mtx); in mlxcx_rx_ring_start()
1201 ASSERT(g->mlg_state & MLXCX_GROUP_RUNNING); in mlxcx_rx_ring_start()
1212 mutex_exit(&g->mlg_mtx); in mlxcx_rx_ring_start()
1219 mutex_exit(&g->mlg_mtx); in mlxcx_rx_ring_start()
1244 mutex_exit(&g->mlg_mtx); in mlxcx_rx_ring_start()
1250 mlxcx_rx_group_start(mlxcx_t *mlxp, mlxcx_ring_group_t *g) in mlxcx_rx_group_start() argument
1257 mutex_enter(&g->mlg_mtx); in mlxcx_rx_group_start()
1259 if (g->mlg_state & MLXCX_GROUP_RUNNING) { in mlxcx_rx_group_start()
1260 mutex_exit(&g->mlg_mtx); in mlxcx_rx_group_start()
1264 ASSERT0(g->mlg_state & MLXCX_GROUP_RUNNING); in mlxcx_rx_group_start()
1266 g->mlg_state |= MLXCX_GROUP_RUNNING; in mlxcx_rx_group_start()
1270 g - &mlxp->mlx_rx_groups[0]); in mlxcx_rx_group_start()
1278 if ((g->mlg_refill_tq = taskq_create(tq_name, g->mlg_nwqs, minclsyspri, in mlxcx_rx_group_start()
1279 g->mlg_nwqs, INT_MAX, TASKQ_PREPOPULATE)) == NULL) { in mlxcx_rx_group_start()
1281 mutex_exit(&g->mlg_mtx); in mlxcx_rx_group_start()
1285 if (g == &mlxp->mlx_rx_groups[0]) { in mlxcx_rx_group_start()
1286 ft = g->mlg_port->mlp_rx_flow; in mlxcx_rx_group_start()
1293 fg = g->mlg_port->mlp_bcast; in mlxcx_rx_group_start()
1295 fe->mlfe_dest[fe->mlfe_ndest++].mlfed_flow = g->mlg_rx_hash_ft; in mlxcx_rx_group_start()
1298 g->mlg_state &= ~MLXCX_GROUP_RUNNING; in mlxcx_rx_group_start()
1299 taskq_destroy(g->mlg_refill_tq); in mlxcx_rx_group_start()
1300 mutex_exit(&g->mlg_mtx); in mlxcx_rx_group_start()
1304 fg = g->mlg_port->mlp_promisc; in mlxcx_rx_group_start()
1306 fe->mlfe_dest[fe->mlfe_ndest++].mlfed_flow = g->mlg_rx_hash_ft; in mlxcx_rx_group_start()
1315 mutex_exit(&g->mlg_mtx); in mlxcx_rx_group_start()
1321 mlxcx_tx_group_setup(mlxcx_t *mlxp, mlxcx_ring_group_t *g) in mlxcx_tx_group_setup() argument
1328 ASSERT3S(g->mlg_state, ==, 0); in mlxcx_tx_group_setup()
1330 mutex_init(&g->mlg_mtx, NULL, MUTEX_DRIVER, in mlxcx_tx_group_setup()
1332 g->mlg_state |= MLXCX_GROUP_INIT; in mlxcx_tx_group_setup()
1333 mutex_enter(&g->mlg_mtx); in mlxcx_tx_group_setup()
1335 g->mlg_mlx = mlxp; in mlxcx_tx_group_setup()
1336 g->mlg_type = MLXCX_GROUP_TX; in mlxcx_tx_group_setup()
1337 g->mlg_port = &mlxp->mlx_ports[0]; in mlxcx_tx_group_setup()
1339 g->mlg_nwqs = mlxp->mlx_props.mldp_tx_nrings_per_group; in mlxcx_tx_group_setup()
1340 g->mlg_wqs_size = g->mlg_nwqs * sizeof (mlxcx_work_queue_t); in mlxcx_tx_group_setup()
1341 g->mlg_wqs = kmem_zalloc(g->mlg_wqs_size, KM_SLEEP); in mlxcx_tx_group_setup()
1342 g->mlg_state |= MLXCX_GROUP_WQS; in mlxcx_tx_group_setup()
1344 g->mlg_tis.mltis_tdom = &mlxp->mlx_tdom; in mlxcx_tx_group_setup()
1346 if (!mlxcx_cmd_create_tis(mlxp, &g->mlg_tis)) { in mlxcx_tx_group_setup()
1347 mutex_exit(&g->mlg_mtx); in mlxcx_tx_group_setup()
1351 g->mlg_state |= MLXCX_GROUP_TIRTIS; in mlxcx_tx_group_setup()
1353 for (i = 0; i < g->mlg_nwqs; ++i) { in mlxcx_tx_group_setup()
1370 cq->mlcq_stats = &g->mlg_port->mlp_stats; in mlxcx_tx_group_setup()
1372 sq = &g->mlg_wqs[i]; in mlxcx_tx_group_setup()
1373 if (!mlxcx_sq_setup(mlxp, g->mlg_port, cq, &g->mlg_tis, sq)) { in mlxcx_tx_group_setup()
1374 mutex_exit(&g->mlg_mtx); in mlxcx_tx_group_setup()
1377 sq->mlwq_group = g; in mlxcx_tx_group_setup()
1380 mutex_exit(&g->mlg_mtx); in mlxcx_tx_group_setup()
1386 mlxcx_tx_ring_start(mlxcx_t *mlxp, mlxcx_ring_group_t *g, in mlxcx_tx_ring_start() argument
1393 mutex_enter(&g->mlg_mtx); in mlxcx_tx_ring_start()
1403 mutex_exit(&g->mlg_mtx); in mlxcx_tx_ring_start()
1431 mutex_exit(&g->mlg_mtx); in mlxcx_tx_ring_start()
1434 g->mlg_state |= MLXCX_GROUP_RUNNING; in mlxcx_tx_ring_start()
1440 mutex_exit(&g->mlg_mtx); in mlxcx_tx_ring_start()
1864 mlxcx_ring_group_t *g; in mlxcx_rq_refill() local
1903 g = mlwq->mlwq_group; in mlxcx_rq_refill()
1904 taskq_dispatch_ent(g->mlg_refill_tq, in mlxcx_rq_refill()