Lines Matching refs:ngep

232 nge_set_loop_mode(nge_t *ngep, uint32_t mode)  in nge_set_loop_mode()  argument
237 if (mode == ngep->param_loop_mode) in nge_set_loop_mode()
260 ngep->param_loop_mode = mode; in nge_set_loop_mode()
298 nge_alloc_dma_mem(nge_t *ngep, size_t memsize, ddi_device_acc_attr_t *attr_p, in nge_alloc_dma_mem() argument
305 (void *)ngep, memsize, attr_p, dma_flags, dma_p)); in nge_alloc_dma_mem()
309 err = ddi_dma_alloc_handle(ngep->devinfo, ngep->desc_attr.dma_attr, in nge_alloc_dma_mem()
374 nge_alloc_bufs(nge_t *ngep) in nge_alloc_bufs() argument
383 txbuffsize = ngep->tx_desc * ngep->buf_size; in nge_alloc_bufs()
384 rxdescsize = ngep->rx_desc; in nge_alloc_bufs()
385 txdescsize = ngep->tx_desc; in nge_alloc_bufs()
386 rxdescsize *= ngep->desc_attr.rxd_size; in nge_alloc_bufs()
387 txdescsize *= ngep->desc_attr.txd_size; in nge_alloc_bufs()
390 NGE_TRACE(("nge_alloc_bufs($%p)", (void *)ngep)); in nge_alloc_bufs()
394 ASSERT((txbuffsize % ngep->nge_split) == 0); in nge_alloc_bufs()
395 for (split = 0; split < ngep->nge_split; ++split) { in nge_alloc_bufs()
396 err = nge_alloc_dma_mem(ngep, txbuffsize/ngep->nge_split, in nge_alloc_bufs()
398 &ngep->send->buf[split]); in nge_alloc_bufs()
409 err = nge_alloc_dma_mem(ngep, rxdescsize, &nge_desc_accattr, in nge_alloc_bufs()
410 DDI_DMA_RDWR | DDI_DMA_CONSISTENT, &ngep->recv->desc); in nge_alloc_bufs()
418 err = nge_alloc_dma_mem(ngep, txdescsize, &nge_desc_accattr, in nge_alloc_bufs()
419 DDI_DMA_RDWR | DDI_DMA_CONSISTENT, &ngep->send->desc); in nge_alloc_bufs()
426 nge_free_dma_mem(&ngep->recv->desc); in nge_alloc_bufs()
428 for (split = 0; split < ngep->nge_split; ++split) in nge_alloc_bufs()
429 nge_free_dma_mem(&ngep->send->buf[split]); in nge_alloc_bufs()
440 nge_free_bufs(nge_t *ngep) in nge_free_bufs() argument
444 NGE_TRACE(("nge_free_bufs($%p)", (void *)ngep)); in nge_free_bufs()
446 nge_free_dma_mem(&ngep->recv->desc); in nge_free_bufs()
447 nge_free_dma_mem(&ngep->send->desc); in nge_free_bufs()
449 for (split = 0; split < ngep->nge_split; ++split) in nge_free_bufs()
450 nge_free_dma_mem(&ngep->send->buf[split]); in nge_free_bufs()
457 nge_fini_send_ring(nge_t *ngep) in nge_fini_send_ring() argument
464 srp = ngep->send; in nge_fini_send_ring()
467 NGE_TRACE(("nge_fini_send_ring($%p)", (void *)ngep)); in nge_fini_send_ring()
493 nge_init_send_ring(nge_t *ngep) in nge_init_send_ring() argument
505 srp = ngep->send; in nge_init_send_ring()
506 srp->desc.nslots = ngep->tx_desc; in nge_init_send_ring()
509 NGE_TRACE(("nge_init_send_ring($%p)", (void *)ngep)); in nge_init_send_ring()
513 srp->ngep = ngep; in nge_init_send_ring()
525 for (split = 0; split < ngep->nge_split; ++split) { in nge_init_send_ring()
527 for (slot = 0; slot < nslots/ngep->nge_split; ++ssbdp, ++slot) { in nge_init_send_ring()
529 ngep->desc_attr.txd_size); in nge_init_send_ring()
531 ngep->buf_size); in nge_init_send_ring()
542 err = ddi_dma_alloc_handle(ngep->devinfo, in nge_init_send_ring()
543 ngep->desc_attr.tx_dma_attr, DDI_DMA_DONTWAIT, in nge_init_send_ring()
547 nge_fini_send_ring(ngep); in nge_init_send_ring()
548 nge_error(ngep, in nge_init_send_ring()
567 nge_reinit_send_ring(nge_t *ngep) in nge_reinit_send_ring() argument
574 srp = ngep->send; in nge_reinit_send_ring()
612 nge_init_recv_ring(nge_t *ngep) in nge_init_recv_ring() argument
616 rrp = ngep->recv; in nge_init_recv_ring()
617 rrp->desc.nslots = ngep->rx_desc; in nge_init_recv_ring()
618 rrp->ngep = ngep; in nge_init_recv_ring()
625 nge_reinit_recv_ring(nge_t *ngep) in nge_reinit_recv_ring() argument
629 rrp = ngep->recv; in nge_reinit_recv_ring()
646 nge_fini_buff_ring(nge_t *ngep) in nge_fini_buff_ring() argument
653 brp = ngep->buff; in nge_fini_buff_ring()
656 NGE_DEBUG(("nge_fini_buff_ring($%p)", (void *)ngep)); in nge_fini_buff_ring()
661 for (i = 0; i < ngep->rx_desc; i++, ++bsbdp) { in nge_fini_buff_ring()
690 kmem_free(brp->sw_rbds, (ngep->rx_desc * sizeof (*bsbdp))); in nge_fini_buff_ring()
698 nge_init_buff_ring(nge_t *ngep) in nge_init_buff_ring() argument
710 rrp = ngep->recv; in nge_init_buff_ring()
711 brp = ngep->buff; in nge_init_buff_ring()
712 brp->nslots = ngep->rx_buf; in nge_init_buff_ring()
716 brp->ngep = ngep; in nge_init_buff_ring()
718 NGE_TRACE(("nge_init_buff_ring($%p)", (void *)ngep)); in nge_init_buff_ring()
729 err = nge_alloc_dma_mem(ngep, (ngep->buf_size in nge_init_buff_ring()
739 bufp->private = (caddr_t)ngep; in nge_init_buff_ring()
745 ngep->buf_size + NGE_HEADROOM, in nge_init_buff_ring()
761 ngep->desc_attr.rxd_size); in nge_init_buff_ring()
778 nge_reinit_buff_ring(nge_t *ngep) in nge_reinit_buff_ring() argument
787 brp = ngep->buff; in nge_reinit_buff_ring()
788 rrp = ngep->recv; in nge_reinit_buff_ring()
807 ngep->desc_attr.rxd_fill(hw_bd_p, &bsbdp->bufp->cookie, in nge_reinit_buff_ring()
814 nge_init_ring_param_lock(nge_t *ngep) in nge_init_ring_param_lock() argument
819 srp = ngep->send; in nge_init_ring_param_lock()
820 brp = ngep->buff; in nge_init_ring_param_lock()
824 DDI_INTR_PRI(ngep->intr_pri)); in nge_init_ring_param_lock()
826 DDI_INTR_PRI(ngep->intr_pri)); in nge_init_ring_param_lock()
828 DDI_INTR_PRI(ngep->intr_pri)); in nge_init_ring_param_lock()
838 DDI_INTR_PRI(ngep->intr_pri)); in nge_init_ring_param_lock()
842 nge_init_rings(nge_t *ngep) in nge_init_rings() argument
846 err = nge_init_send_ring(ngep); in nge_init_rings()
850 nge_init_recv_ring(ngep); in nge_init_rings()
852 err = nge_init_buff_ring(ngep); in nge_init_rings()
854 nge_fini_send_ring(ngep); in nge_init_rings()
862 nge_reinit_ring(nge_t *ngep) in nge_reinit_ring() argument
866 nge_reinit_recv_ring(ngep); in nge_reinit_ring()
867 nge_reinit_send_ring(ngep); in nge_reinit_ring()
868 err = nge_reinit_buff_ring(ngep); in nge_reinit_ring()
874 nge_fini_rings(nge_t *ngep) in nge_fini_rings() argument
880 nge_fini_buff_ring(ngep); in nge_fini_rings()
881 nge_fini_send_ring(ngep); in nge_fini_rings()
896 nge_loop_ioctl(nge_t *ngep, mblk_t *mp, struct iocblk *iocp) in nge_loop_ioctl() argument
933 *lbmp = ngep->param_loop_mode; in nge_loop_ioctl()
940 return (nge_set_loop_mode(ngep, *lbmp)); in nge_loop_ioctl()
949 nge_check_desc_prop(nge_t *ngep) in nge_check_desc_prop() argument
951 if (ngep->desc_mode != DESC_HOT && ngep->desc_mode != DESC_OFFLOAD) in nge_check_desc_prop()
952 ngep->desc_mode = DESC_HOT; in nge_check_desc_prop()
954 if (ngep->desc_mode == DESC_OFFLOAD) { in nge_check_desc_prop()
956 ngep->desc_attr = nge_sum_desc; in nge_check_desc_prop()
958 } else if (ngep->desc_mode == DESC_HOT) { in nge_check_desc_prop()
960 ngep->desc_attr = nge_hot_desc; in nge_check_desc_prop()
968 nge_get_props(nge_t *ngep) in nge_get_props() argument
974 devinfo = ngep->devinfo; in nge_get_props()
975 infop = (chip_info_t *)&ngep->chipinfo; in nge_get_props()
976 dev_param_p = &ngep->dev_spec_param; in nge_get_props()
983 ngep->intr_moderation = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo, in nge_get_props()
985 ngep->rx_datahwm = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo, in nge_get_props()
987 ngep->rx_prdlwm = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo, in nge_get_props()
989 ngep->rx_prdhwm = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo, in nge_get_props()
992 ngep->sw_intr_intv = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo, in nge_get_props()
994 ngep->debug = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo, in nge_get_props()
996 ngep->desc_mode = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo, in nge_get_props()
998 ngep->lowmem_mode = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo, in nge_get_props()
1002 ngep->default_mtu = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo, in nge_get_props()
1005 ngep->default_mtu = ETHERMTU; in nge_get_props()
1007 ngep->param_link_tx_pause = B_TRUE; in nge_get_props()
1009 ngep->param_link_tx_pause = B_FALSE; in nge_get_props()
1012 ngep->param_link_rx_pause = B_TRUE; in nge_get_props()
1014 ngep->param_link_rx_pause = B_FALSE; in nge_get_props()
1016 if (ngep->default_mtu > ETHERMTU && in nge_get_props()
1017 ngep->default_mtu <= NGE_MTU_2500) { in nge_get_props()
1018 ngep->buf_size = NGE_JB2500_BUFSZ; in nge_get_props()
1019 ngep->tx_desc = NGE_SEND_JB2500_SLOTS_DESC; in nge_get_props()
1020 ngep->rx_desc = NGE_RECV_JB2500_SLOTS_DESC; in nge_get_props()
1021 ngep->rx_buf = NGE_RECV_JB2500_SLOTS_DESC * 2; in nge_get_props()
1022 ngep->nge_split = NGE_SPLIT_256; in nge_get_props()
1023 } else if (ngep->default_mtu > NGE_MTU_2500 && in nge_get_props()
1024 ngep->default_mtu <= NGE_MTU_4500) { in nge_get_props()
1025 ngep->buf_size = NGE_JB4500_BUFSZ; in nge_get_props()
1026 ngep->tx_desc = NGE_SEND_JB4500_SLOTS_DESC; in nge_get_props()
1027 ngep->rx_desc = NGE_RECV_JB4500_SLOTS_DESC; in nge_get_props()
1028 ngep->rx_buf = NGE_RECV_JB4500_SLOTS_DESC * 2; in nge_get_props()
1029 ngep->nge_split = NGE_SPLIT_256; in nge_get_props()
1030 } else if (ngep->default_mtu > NGE_MTU_4500 && in nge_get_props()
1031 ngep->default_mtu <= NGE_MAX_MTU) { in nge_get_props()
1032 ngep->buf_size = NGE_JB9000_BUFSZ; in nge_get_props()
1033 ngep->tx_desc = NGE_SEND_JB9000_SLOTS_DESC; in nge_get_props()
1034 ngep->rx_desc = NGE_RECV_JB9000_SLOTS_DESC; in nge_get_props()
1035 ngep->rx_buf = NGE_RECV_JB9000_SLOTS_DESC * 2; in nge_get_props()
1036 ngep->nge_split = NGE_SPLIT_256; in nge_get_props()
1037 } else if (ngep->default_mtu > NGE_MAX_MTU) { in nge_get_props()
1038 ngep->default_mtu = NGE_MAX_MTU; in nge_get_props()
1039 ngep->buf_size = NGE_JB9000_BUFSZ; in nge_get_props()
1040 ngep->tx_desc = NGE_SEND_JB9000_SLOTS_DESC; in nge_get_props()
1041 ngep->rx_desc = NGE_RECV_JB9000_SLOTS_DESC; in nge_get_props()
1042 ngep->rx_buf = NGE_RECV_JB9000_SLOTS_DESC * 2; in nge_get_props()
1043 ngep->nge_split = NGE_SPLIT_256; in nge_get_props()
1044 } else if (ngep->lowmem_mode != 0) { in nge_get_props()
1045 ngep->default_mtu = ETHERMTU; in nge_get_props()
1046 ngep->buf_size = NGE_STD_BUFSZ; in nge_get_props()
1047 ngep->tx_desc = NGE_SEND_LOWMEM_SLOTS_DESC; in nge_get_props()
1048 ngep->rx_desc = NGE_RECV_LOWMEM_SLOTS_DESC; in nge_get_props()
1049 ngep->rx_buf = NGE_RECV_LOWMEM_SLOTS_DESC * 2; in nge_get_props()
1050 ngep->nge_split = NGE_SPLIT_32; in nge_get_props()
1052 ngep->default_mtu = ETHERMTU; in nge_get_props()
1053 ngep->buf_size = NGE_STD_BUFSZ; in nge_get_props()
1054 ngep->tx_desc = dev_param_p->tx_desc_num; in nge_get_props()
1055 ngep->rx_desc = dev_param_p->rx_desc_num; in nge_get_props()
1056 ngep->rx_buf = dev_param_p->rx_desc_num * 2; in nge_get_props()
1057 ngep->nge_split = dev_param_p->nge_split; in nge_get_props()
1060 nge_check_desc_prop(ngep); in nge_get_props()
1065 nge_reset_dev(nge_t *ngep) in nge_reset_dev() argument
1070 sw_stp = &ngep->statistics.sw_statistics; in nge_reset_dev()
1071 send_ring_t *srp = ngep->send; in nge_reset_dev()
1073 ASSERT(mutex_owned(ngep->genlock)); in nge_reset_dev()
1077 nge_tx_recycle_all(ngep); in nge_reset_dev()
1078 err = nge_reinit_ring(ngep); in nge_reset_dev()
1084 err = nge_chip_reset(ngep); in nge_reset_dev()
1088 nge_reg_put32(ngep, NGE_MUL_ADDR0, 0); in nge_reset_dev()
1089 maddr1.addr_val = nge_reg_get32(ngep, NGE_MUL_ADDR1); in nge_reset_dev()
1091 nge_reg_put32(ngep, NGE_MUL_ADDR1, maddr1.addr_val); in nge_reset_dev()
1097 ngep->watchdog = 0; in nge_reset_dev()
1098 ngep->resched_needed = B_FALSE; in nge_reset_dev()
1099 ngep->promisc = B_FALSE; in nge_reset_dev()
1100 ngep->param_loop_mode = NGE_LOOP_NONE; in nge_reset_dev()
1101 ngep->factotum_flag = 0; in nge_reset_dev()
1102 ngep->resched_needed = 0; in nge_reset_dev()
1103 ngep->nge_mac_state = NGE_MAC_RESET; in nge_reset_dev()
1104 ngep->max_sdu = ngep->default_mtu + ETHER_HEAD_LEN + ETHERFCSL; in nge_reset_dev()
1105 ngep->max_sdu += VTAG_SIZE; in nge_reset_dev()
1106 ngep->rx_def = 0x16; in nge_reset_dev()
1120 nge_t *ngep = arg; /* private device info */ in nge_m_stop() local
1128 mutex_enter(ngep->genlock); in nge_m_stop()
1130 if (ngep->suspended) { in nge_m_stop()
1131 ASSERT(ngep->nge_mac_state == NGE_MAC_STOPPED); in nge_m_stop()
1132 mutex_exit(ngep->genlock); in nge_m_stop()
1135 rw_enter(ngep->rwlock, RW_WRITER); in nge_m_stop()
1137 err = nge_chip_stop(ngep, B_FALSE); in nge_m_stop()
1139 err = nge_chip_reset(ngep); in nge_m_stop()
1141 nge_problem(ngep, "nge_m_stop: stop chip failed"); in nge_m_stop()
1142 ngep->nge_mac_state = NGE_MAC_STOPPED; in nge_m_stop()
1145 nge_tx_recycle_all(ngep); in nge_m_stop()
1146 nge_fini_rings(ngep); in nge_m_stop()
1147 nge_free_bufs(ngep); in nge_m_stop()
1151 rw_exit(ngep->rwlock); in nge_m_stop()
1152 mutex_exit(ngep->genlock); in nge_m_stop()
1159 nge_t *ngep = arg; in nge_m_start() local
1166 mutex_enter(ngep->genlock); in nge_m_start()
1171 if (ngep->suspended) { in nge_m_start()
1172 mutex_exit(ngep->genlock); in nge_m_start()
1175 rw_enter(ngep->rwlock, RW_WRITER); in nge_m_start()
1176 err = nge_alloc_bufs(ngep); in nge_m_start()
1178 nge_problem(ngep, "nge_m_start: DMA buffer allocation failed"); in nge_m_start()
1181 err = nge_init_rings(ngep); in nge_m_start()
1183 nge_free_bufs(ngep); in nge_m_start()
1184 nge_problem(ngep, "nge_init_rings() failed,err=%x", err); in nge_m_start()
1187 err = nge_restart(ngep); in nge_m_start()
1191 rw_exit(ngep->rwlock); in nge_m_start()
1192 mutex_exit(ngep->genlock); in nge_m_start()
1200 nge_t *ngep = arg; in nge_m_unicst() local
1207 mutex_enter(ngep->genlock); in nge_m_unicst()
1209 ethaddr_copy(macaddr, ngep->cur_uni_addr.addr); in nge_m_unicst()
1210 ngep->cur_uni_addr.set = 1; in nge_m_unicst()
1217 if (ngep->suspended) { in nge_m_unicst()
1218 mutex_exit(ngep->genlock); in nge_m_unicst()
1221 nge_chip_sync(ngep); in nge_m_unicst()
1224 mutex_exit(ngep->genlock); in nge_m_unicst()
1232 nge_t *ngep = arg; in nge_m_promisc() local
1239 mutex_enter(ngep->genlock); in nge_m_promisc()
1245 if (ngep->suspended) { in nge_m_promisc()
1246 mutex_exit(ngep->genlock); in nge_m_promisc()
1249 if (ngep->promisc == on) { in nge_m_promisc()
1250 mutex_exit(ngep->genlock); in nge_m_promisc()
1254 ngep->promisc = on; in nge_m_promisc()
1255 ngep->record_promisc = ngep->promisc; in nge_m_promisc()
1256 nge_chip_sync(ngep); in nge_m_promisc()
1258 mutex_exit(ngep->genlock); in nge_m_promisc()
1263 static void nge_mulparam(nge_t *ngep) in nge_mulparam() argument
1274 for (plist = ngep->pcur_mulist; plist != NULL; plist = plist->next) { in nge_mulparam()
1281 ngep->cur_mul_addr.addr[number] in nge_mulparam()
1283 ngep->cur_mul_mask.addr[number] in nge_mulparam()
1292 nge_t *ngep = arg; in nge_m_multicst() local
1302 mutex_enter(ngep->genlock); in nge_m_multicst()
1304 if (ngep->pcur_mulist != NULL) { in nge_m_multicst()
1305 for (plist = ngep->pcur_mulist; plist != NULL; in nge_m_multicst()
1322 ngep->pcur_mulist = pitem; in nge_m_multicst()
1328 if (ngep->pcur_mulist != NULL) { in nge_m_multicst()
1329 for (plist = ngep->pcur_mulist; plist != NULL; in nge_m_multicst()
1342 ngep->pcur_mulist = NULL; in nge_m_multicst()
1345 ngep->pcur_mulist = plist->next; in nge_m_multicst()
1353 if (update && !ngep->suspended) { in nge_m_multicst()
1354 nge_mulparam(ngep); in nge_m_multicst()
1355 nge_chip_sync(ngep); in nge_m_multicst()
1358 mutex_exit(ngep->genlock); in nge_m_multicst()
1368 nge_t *ngep = arg; in nge_m_ioctl() local
1379 mutex_enter(ngep->genlock); in nge_m_ioctl()
1380 if (ngep->suspended) { in nge_m_ioctl()
1382 mutex_exit(ngep->genlock); in nge_m_ioctl()
1385 mutex_exit(ngep->genlock); in nge_m_ioctl()
1438 mutex_enter(ngep->genlock); in nge_m_ioctl()
1456 status = nge_chip_ioctl(ngep, mp, iocp); in nge_m_ioctl()
1463 status = nge_loop_ioctl(ngep, mp, iocp); in nge_m_ioctl()
1481 (*ngep->physops->phys_update)(ngep); in nge_m_ioctl()
1482 nge_chip_sync(ngep); in nge_m_ioctl()
1489 mutex_exit(ngep->genlock); in nge_m_ioctl()
1553 nge_t *ngep = barg; in nge_m_setprop() local
1558 mutex_enter(ngep->genlock); in nge_m_setprop()
1559 if (ngep->param_loop_mode != NGE_LOOP_NONE && in nge_m_setprop()
1565 mutex_exit(ngep->genlock); in nge_m_setprop()
1570 ngep->param_en_1000fdx = *(uint8_t *)pr_val; in nge_m_setprop()
1571 ngep->param_adv_1000fdx = *(uint8_t *)pr_val; in nge_m_setprop()
1574 ngep->param_en_100fdx = *(uint8_t *)pr_val; in nge_m_setprop()
1575 ngep->param_adv_100fdx = *(uint8_t *)pr_val; in nge_m_setprop()
1578 ngep->param_en_100hdx = *(uint8_t *)pr_val; in nge_m_setprop()
1579 ngep->param_adv_100hdx = *(uint8_t *)pr_val; in nge_m_setprop()
1582 ngep->param_en_10fdx = *(uint8_t *)pr_val; in nge_m_setprop()
1583 ngep->param_adv_10fdx = *(uint8_t *)pr_val; in nge_m_setprop()
1586 ngep->param_en_10hdx = *(uint8_t *)pr_val; in nge_m_setprop()
1587 ngep->param_adv_10hdx = *(uint8_t *)pr_val; in nge_m_setprop()
1589 (*ngep->physops->phys_update)(ngep); in nge_m_setprop()
1590 nge_chip_sync(ngep); in nge_m_setprop()
1606 ngep->param_adv_autoneg = *(uint8_t *)pr_val; in nge_m_setprop()
1607 (*ngep->physops->phys_update)(ngep); in nge_m_setprop()
1608 nge_chip_sync(ngep); in nge_m_setprop()
1611 cur_mtu = ngep->default_mtu; in nge_m_setprop()
1623 (!ngep->dev_spec_param.jumbo)) { in nge_m_setprop()
1627 if (ngep->nge_mac_state == NGE_MAC_STARTED) { in nge_m_setprop()
1632 ngep->default_mtu = new_mtu; in nge_m_setprop()
1633 if (ngep->default_mtu > ETHERMTU && in nge_m_setprop()
1634 ngep->default_mtu <= NGE_MTU_2500) { in nge_m_setprop()
1635 ngep->buf_size = NGE_JB2500_BUFSZ; in nge_m_setprop()
1636 ngep->tx_desc = NGE_SEND_JB2500_SLOTS_DESC; in nge_m_setprop()
1637 ngep->rx_desc = NGE_RECV_JB2500_SLOTS_DESC; in nge_m_setprop()
1638 ngep->rx_buf = NGE_RECV_JB2500_SLOTS_DESC * 2; in nge_m_setprop()
1639 ngep->nge_split = NGE_SPLIT_256; in nge_m_setprop()
1640 } else if (ngep->default_mtu > NGE_MTU_2500 && in nge_m_setprop()
1641 ngep->default_mtu <= NGE_MTU_4500) { in nge_m_setprop()
1642 ngep->buf_size = NGE_JB4500_BUFSZ; in nge_m_setprop()
1643 ngep->tx_desc = NGE_SEND_JB4500_SLOTS_DESC; in nge_m_setprop()
1644 ngep->rx_desc = NGE_RECV_JB4500_SLOTS_DESC; in nge_m_setprop()
1645 ngep->rx_buf = NGE_RECV_JB4500_SLOTS_DESC * 2; in nge_m_setprop()
1646 ngep->nge_split = NGE_SPLIT_256; in nge_m_setprop()
1647 } else if (ngep->default_mtu > NGE_MTU_4500 && in nge_m_setprop()
1648 ngep->default_mtu <= NGE_MAX_MTU) { in nge_m_setprop()
1649 ngep->buf_size = NGE_JB9000_BUFSZ; in nge_m_setprop()
1650 ngep->tx_desc = NGE_SEND_JB9000_SLOTS_DESC; in nge_m_setprop()
1651 ngep->rx_desc = NGE_RECV_JB9000_SLOTS_DESC; in nge_m_setprop()
1652 ngep->rx_buf = NGE_RECV_JB9000_SLOTS_DESC * 2; in nge_m_setprop()
1653 ngep->nge_split = NGE_SPLIT_256; in nge_m_setprop()
1654 } else if (ngep->default_mtu > NGE_MAX_MTU) { in nge_m_setprop()
1655 ngep->default_mtu = NGE_MAX_MTU; in nge_m_setprop()
1656 ngep->buf_size = NGE_JB9000_BUFSZ; in nge_m_setprop()
1657 ngep->tx_desc = NGE_SEND_JB9000_SLOTS_DESC; in nge_m_setprop()
1658 ngep->rx_desc = NGE_RECV_JB9000_SLOTS_DESC; in nge_m_setprop()
1659 ngep->rx_buf = NGE_RECV_JB9000_SLOTS_DESC * 2; in nge_m_setprop()
1660 ngep->nge_split = NGE_SPLIT_256; in nge_m_setprop()
1661 } else if (ngep->lowmem_mode != 0) { in nge_m_setprop()
1662 ngep->default_mtu = ETHERMTU; in nge_m_setprop()
1663 ngep->buf_size = NGE_STD_BUFSZ; in nge_m_setprop()
1664 ngep->tx_desc = NGE_SEND_LOWMEM_SLOTS_DESC; in nge_m_setprop()
1665 ngep->rx_desc = NGE_RECV_LOWMEM_SLOTS_DESC; in nge_m_setprop()
1666 ngep->rx_buf = NGE_RECV_LOWMEM_SLOTS_DESC * 2; in nge_m_setprop()
1667 ngep->nge_split = NGE_SPLIT_32; in nge_m_setprop()
1669 ngep->default_mtu = ETHERMTU; in nge_m_setprop()
1670 ngep->buf_size = NGE_STD_BUFSZ; in nge_m_setprop()
1671 ngep->tx_desc = in nge_m_setprop()
1672 ngep->dev_spec_param.tx_desc_num; in nge_m_setprop()
1673 ngep->rx_desc = in nge_m_setprop()
1674 ngep->dev_spec_param.rx_desc_num; in nge_m_setprop()
1675 ngep->rx_buf = in nge_m_setprop()
1676 ngep->dev_spec_param.rx_desc_num * 2; in nge_m_setprop()
1677 ngep->nge_split = in nge_m_setprop()
1678 ngep->dev_spec_param.nge_split; in nge_m_setprop()
1681 err = mac_maxsdu_update(ngep->mh, ngep->default_mtu); in nge_m_setprop()
1691 ngep->param_adv_pause = 0; in nge_m_setprop()
1692 ngep->param_adv_asym_pause = 0; in nge_m_setprop()
1694 ngep->param_link_rx_pause = B_FALSE; in nge_m_setprop()
1695 ngep->param_link_tx_pause = B_FALSE; in nge_m_setprop()
1698 if (!((ngep->param_lp_pause == 0) && in nge_m_setprop()
1699 (ngep->param_lp_asym_pause == 1))) { in nge_m_setprop()
1703 ngep->param_adv_pause = 1; in nge_m_setprop()
1704 ngep->param_adv_asym_pause = 1; in nge_m_setprop()
1706 ngep->param_link_rx_pause = B_TRUE; in nge_m_setprop()
1707 ngep->param_link_tx_pause = B_FALSE; in nge_m_setprop()
1710 if (!((ngep->param_lp_pause == 1) && in nge_m_setprop()
1711 (ngep->param_lp_asym_pause == 1))) { in nge_m_setprop()
1715 ngep->param_adv_pause = 0; in nge_m_setprop()
1716 ngep->param_adv_asym_pause = 1; in nge_m_setprop()
1718 ngep->param_link_rx_pause = B_FALSE; in nge_m_setprop()
1719 ngep->param_link_tx_pause = B_TRUE; in nge_m_setprop()
1722 if (ngep->param_lp_pause != 1) { in nge_m_setprop()
1726 ngep->param_adv_pause = 1; in nge_m_setprop()
1728 ngep->param_link_rx_pause = B_TRUE; in nge_m_setprop()
1729 ngep->param_link_tx_pause = B_TRUE; in nge_m_setprop()
1734 (*ngep->physops->phys_update)(ngep); in nge_m_setprop()
1735 nge_chip_sync(ngep); in nge_m_setprop()
1740 err = nge_set_priv_prop(ngep, pr_name, pr_valsize, in nge_m_setprop()
1743 (*ngep->physops->phys_update)(ngep); in nge_m_setprop()
1744 nge_chip_sync(ngep); in nge_m_setprop()
1750 mutex_exit(ngep->genlock); in nge_m_setprop()
1758 nge_t *ngep = barg; in nge_m_getprop() local
1766 bcopy(&ngep->param_link_duplex, pr_val, in nge_m_getprop()
1771 speed = ngep->param_link_speed * 1000000ull; in nge_m_getprop()
1775 *(uint8_t *)pr_val = ngep->param_adv_autoneg; in nge_m_getprop()
1779 if (ngep->param_link_rx_pause && in nge_m_getprop()
1780 !ngep->param_link_tx_pause) in nge_m_getprop()
1783 if (!ngep->param_link_rx_pause && in nge_m_getprop()
1784 !ngep->param_link_tx_pause) in nge_m_getprop()
1787 if (!ngep->param_link_rx_pause && in nge_m_getprop()
1788 ngep->param_link_tx_pause) in nge_m_getprop()
1791 if (ngep->param_link_rx_pause && in nge_m_getprop()
1792 ngep->param_link_tx_pause) in nge_m_getprop()
1797 *(uint8_t *)pr_val = ngep->param_adv_1000fdx; in nge_m_getprop()
1800 *(uint8_t *)pr_val = ngep->param_en_1000fdx; in nge_m_getprop()
1803 *(uint8_t *)pr_val = ngep->param_adv_1000hdx; in nge_m_getprop()
1806 *(uint8_t *)pr_val = ngep->param_en_1000hdx; in nge_m_getprop()
1809 *(uint8_t *)pr_val = ngep->param_adv_100fdx; in nge_m_getprop()
1812 *(uint8_t *)pr_val = ngep->param_en_100fdx; in nge_m_getprop()
1815 *(uint8_t *)pr_val = ngep->param_adv_100hdx; in nge_m_getprop()
1818 *(uint8_t *)pr_val = ngep->param_en_100hdx; in nge_m_getprop()
1821 *(uint8_t *)pr_val = ngep->param_adv_10fdx; in nge_m_getprop()
1824 *(uint8_t *)pr_val = ngep->param_en_10fdx; in nge_m_getprop()
1827 *(uint8_t *)pr_val = ngep->param_adv_10hdx; in nge_m_getprop()
1830 *(uint8_t *)pr_val = ngep->param_en_10hdx; in nge_m_getprop()
1837 err = nge_get_priv_prop(ngep, pr_name, in nge_m_getprop()
1850 nge_t *ngep = barg; in nge_m_propinfo() local
1885 ngep->dev_spec_param.jumbo ? NGE_MAX_MTU : ETHERMTU); in nge_m_propinfo()
1919 nge_set_priv_prop(nge_t *ngep, const char *pr_name, uint_t pr_valsize, in nge_set_priv_prop() argument
1934 ngep->param_txbcopy_threshold = (uint32_t)result; in nge_set_priv_prop()
1948 ngep->param_rxbcopy_threshold = (uint32_t)result; in nge_set_priv_prop()
1962 ngep->param_recv_max_packet = (uint32_t)result; in nge_set_priv_prop()
1976 ngep->param_poll_quiet_time = (uint32_t)result; in nge_set_priv_prop()
1990 ngep->param_poll_busy_time = (uint32_t)result; in nge_set_priv_prop()
2004 ngep->param_rx_intr_hwater = (uint32_t)result; in nge_set_priv_prop()
2018 ngep->param_rx_intr_lwater = (uint32_t)result; in nge_set_priv_prop()
2028 (*ngep->physops->phys_update)(ngep); in nge_set_priv_prop()
2029 nge_chip_sync(ngep); in nge_set_priv_prop()
2036 nge_get_priv_prop(nge_t *ngep, const char *pr_name, uint_t pr_valsize, in nge_get_priv_prop() argument
2043 value = ngep->param_txbcopy_threshold; in nge_get_priv_prop()
2048 value = ngep->param_rxbcopy_threshold; in nge_get_priv_prop()
2053 value = ngep->param_recv_max_packet; in nge_get_priv_prop()
2058 value = ngep->param_poll_quiet_time; in nge_get_priv_prop()
2063 value = ngep->param_poll_busy_time; in nge_get_priv_prop()
2068 value = ngep->param_rx_intr_hwater; in nge_get_priv_prop()
2073 value = ngep->param_rx_intr_lwater; in nge_get_priv_prop()
2089 nge_t *ngep = arg; in nge_m_getcapab() local
2092 dev_param_p = &ngep->dev_spec_param; in nge_m_getcapab()
2113 nge_restart(nge_t *ngep) in nge_restart() argument
2116 err = nge_reset_dev(ngep); in nge_restart()
2118 ngep->promisc = ngep->record_promisc; in nge_restart()
2119 nge_chip_sync(ngep); in nge_restart()
2121 err = nge_chip_start(ngep); in nge_restart()
2124 ngep->nge_mac_state = NGE_MAC_STOPPED; in nge_restart()
2127 ngep->nge_mac_state = NGE_MAC_STARTED; in nge_restart()
2133 nge_wake_factotum(nge_t *ngep) in nge_wake_factotum() argument
2135 mutex_enter(ngep->softlock); in nge_wake_factotum()
2136 if (ngep->factotum_flag == 0) { in nge_wake_factotum()
2137 ngep->factotum_flag = 1; in nge_wake_factotum()
2138 (void) ddi_intr_trigger_softint(ngep->factotum_hdl, NULL); in nge_wake_factotum()
2140 mutex_exit(ngep->softlock); in nge_wake_factotum()
2144 nge_interrupt_optimize(nge_t *ngep) in nge_interrupt_optimize() argument
2147 tx_pkts = ngep->statistics.sw_statistics.xmit_count - ngep->tpkts_last; in nge_interrupt_optimize()
2148 ngep->tpkts_last = ngep->statistics.sw_statistics.xmit_count; in nge_interrupt_optimize()
2151 ngep->tfint_threshold = (tx_pkts / NGE_POLL_ENTER); in nge_interrupt_optimize()
2153 ngep->tfint_threshold = NGE_TFINT_DEFAULT; in nge_interrupt_optimize()
2166 nge_t *ngep; in nge_chip_cyclic() local
2168 ngep = (nge_t *)arg; in nge_chip_cyclic()
2170 switch (ngep->nge_chip_state) { in nge_chip_cyclic()
2175 nge_interrupt_optimize(ngep); in nge_chip_cyclic()
2183 nge_wake_factotum(ngep); in nge_chip_cyclic()
2196 nge_smu_sema(nge_t *ngep, boolean_t acquire) in nge_smu_sema() argument
2203 tx_en.val = nge_reg_get32(ngep, NGE_TX_EN); in nge_smu_sema()
2211 tx_en.val = nge_reg_get32(ngep, NGE_TX_EN); in nge_smu_sema()
2213 nge_reg_put32(ngep, NGE_TX_EN, tx_en.val); in nge_smu_sema()
2214 tx_en.val = nge_reg_get32(ngep, NGE_TX_EN); in nge_smu_sema()
2223 nge_reg_put32(ngep, NGE_TX_EN, 0x0); in nge_smu_sema()
2229 nge_unattach(nge_t *ngep) in nge_unattach() argument
2234 srp = ngep->send; in nge_unattach()
2235 brp = ngep->buff; in nge_unattach()
2236 NGE_TRACE(("nge_unattach($%p)", (void *)ngep)); in nge_unattach()
2241 ngep->progress &= ~PROGRESS_READY; in nge_unattach()
2242 ngep->nge_mac_state = NGE_MAC_UNATTACH; in nge_unattach()
2248 if (ngep->periodic_id != NULL) { in nge_unattach()
2249 ddi_periodic_delete(ngep->periodic_id); in nge_unattach()
2250 ngep->periodic_id = NULL; in nge_unattach()
2253 if (ngep->progress & PROGRESS_KSTATS) in nge_unattach()
2254 nge_fini_kstats(ngep); in nge_unattach()
2256 if (ngep->progress & PROGRESS_HWINT) { in nge_unattach()
2257 mutex_enter(ngep->genlock); in nge_unattach()
2258 nge_restore_mac_addr(ngep); in nge_unattach()
2259 (void) nge_chip_stop(ngep, B_FALSE); in nge_unattach()
2260 if (ngep->chipinfo.device == DEVICE_ID_MCP55_373 || in nge_unattach()
2261 ngep->chipinfo.device == DEVICE_ID_MCP55_372) { in nge_unattach()
2262 (void) nge_smu_sema(ngep, B_FALSE); in nge_unattach()
2264 mutex_exit(ngep->genlock); in nge_unattach()
2267 if (ngep->progress & PROGRESS_SWINT) in nge_unattach()
2268 nge_rem_intrs(ngep); in nge_unattach()
2270 if (ngep->progress & PROGRESS_FACTOTUM) in nge_unattach()
2271 (void) ddi_intr_remove_softint(ngep->factotum_hdl); in nge_unattach()
2273 if (ngep->progress & PROGRESS_RESCHED) in nge_unattach()
2274 (void) ddi_intr_remove_softint(ngep->resched_hdl); in nge_unattach()
2276 if (ngep->progress & PROGRESS_INTR) { in nge_unattach()
2282 mutex_destroy(ngep->genlock); in nge_unattach()
2283 mutex_destroy(ngep->softlock); in nge_unattach()
2284 rw_destroy(ngep->rwlock); in nge_unattach()
2287 if (ngep->progress & PROGRESS_REGS) in nge_unattach()
2288 ddi_regs_map_free(&ngep->io_handle); in nge_unattach()
2290 if (ngep->progress & PROGRESS_CFG) in nge_unattach()
2291 pci_config_teardown(&ngep->cfg_handle); in nge_unattach()
2293 ddi_remove_minor_node(ngep->devinfo, NULL); in nge_unattach()
2295 kmem_free(ngep, sizeof (*ngep)); in nge_unattach()
2301 nge_t *ngep; in nge_resume() local
2307 ngep = ddi_get_driver_private(devinfo); in nge_resume()
2316 if (ngep == NULL) in nge_resume()
2319 infop = (chip_info_t *)&ngep->chipinfo; in nge_resume()
2321 if (ngep->devinfo != devinfo) in nge_resume()
2325 mutex_enter(ngep->genlock); in nge_resume()
2326 rw_enter(ngep->rwlock, RW_WRITER); in nge_resume()
2332 nge_chip_cfg_init(ngep, infop, B_FALSE); in nge_resume()
2338 if (ngep->suspended == B_FALSE) { in nge_resume()
2339 rw_exit(ngep->rwlock); in nge_resume()
2340 mutex_exit(ngep->genlock); in nge_resume()
2344 nge_tx_recycle_all(ngep); in nge_resume()
2345 err = nge_reinit_ring(ngep); in nge_resume()
2347 err = nge_chip_reset(ngep); in nge_resume()
2349 err = nge_chip_start(ngep); in nge_resume()
2359 ngep->nge_mac_state = NGE_MAC_STARTED; in nge_resume()
2361 ngep->suspended = B_FALSE; in nge_resume()
2363 rw_exit(ngep->rwlock); in nge_resume()
2364 mutex_exit(ngep->genlock); in nge_resume()
2381 nge_t *ngep; in nge_attach() local
2396 ngep = kmem_zalloc(sizeof (*ngep), KM_SLEEP); in nge_attach()
2398 ddi_set_driver_private(devinfo, ngep); in nge_attach()
2399 ngep->devinfo = devinfo; in nge_attach()
2401 (void) snprintf(ngep->ifname, sizeof (ngep->ifname), "%s%d", in nge_attach()
2403 err = pci_config_setup(devinfo, &ngep->cfg_handle); in nge_attach()
2405 nge_problem(ngep, "nge_attach: pci_config_setup() failed"); in nge_attach()
2412 ngep->param_txbcopy_threshold = NGE_TX_COPY_SIZE; in nge_attach()
2413 ngep->param_rxbcopy_threshold = NGE_RX_COPY_SIZE; in nge_attach()
2419 ngep->param_recv_max_packet = 128; in nge_attach()
2426 ngep->param_poll_quiet_time = NGE_POLL_QUIET_TIME; in nge_attach()
2427 ngep->param_poll_busy_time = NGE_POLL_BUSY_TIME; in nge_attach()
2428 ngep->tfint_threshold = NGE_TFINT_DEFAULT; in nge_attach()
2429 ngep->poll = B_FALSE; in nge_attach()
2430 ngep->ch_intr_mode = B_FALSE; in nge_attach()
2437 ngep->param_rx_intr_hwater = 1; in nge_attach()
2438 ngep->param_rx_intr_lwater = 8; in nge_attach()
2441 infop = (chip_info_t *)&ngep->chipinfo; in nge_attach()
2442 nge_chip_cfg_init(ngep, infop, B_FALSE); in nge_attach()
2443 nge_init_dev_spec_param(ngep); in nge_attach()
2444 nge_get_props(ngep); in nge_attach()
2445 ngep->progress |= PROGRESS_CFG; in nge_attach()
2448 &regs, 0, 0, &nge_reg_accattr, &ngep->io_handle); in nge_attach()
2450 nge_problem(ngep, "nge_attach: ddi_regs_map_setup() failed"); in nge_attach()
2453 ngep->io_regs = regs; in nge_attach()
2454 ngep->progress |= PROGRESS_REGS; in nge_attach()
2456 err = nge_register_intrs_and_init_locks(ngep); in nge_attach()
2458 nge_problem(ngep, "nge_attach:" in nge_attach()
2462 nge_init_ring_param_lock(ngep); in nge_attach()
2463 ngep->progress |= PROGRESS_INTR; in nge_attach()
2465 mutex_enter(ngep->genlock); in nge_attach()
2467 if (ngep->chipinfo.device == DEVICE_ID_MCP55_373 || in nge_attach()
2468 ngep->chipinfo.device == DEVICE_ID_MCP55_372) { in nge_attach()
2469 err = nge_smu_sema(ngep, B_TRUE); in nge_attach()
2471 nge_problem(ngep, "nge_attach: nge_smu_sema() failed"); in nge_attach()
2480 nge_phys_init(ngep); in nge_attach()
2481 ngep->nge_chip_state = NGE_CHIP_INITIAL; in nge_attach()
2482 err = nge_chip_reset(ngep); in nge_attach()
2484 nge_problem(ngep, "nge_attach: nge_chip_reset() failed"); in nge_attach()
2485 mutex_exit(ngep->genlock); in nge_attach()
2488 nge_chip_sync(ngep); in nge_attach()
2493 if (ngep->intr_cap & DDI_INTR_FLAG_BLOCK) { in nge_attach()
2495 (void) ddi_intr_block_enable(ngep->htable, in nge_attach()
2496 ngep->intr_actual_cnt); in nge_attach()
2499 for (i = 0; i < ngep->intr_actual_cnt; i++) { in nge_attach()
2500 (void) ddi_intr_enable(ngep->htable[i]); in nge_attach()
2504 ngep->link_state = LINK_STATE_UNKNOWN; in nge_attach()
2505 ngep->progress |= PROGRESS_HWINT; in nge_attach()
2510 if (nge_nd_init(ngep)) { in nge_attach()
2511 nge_problem(ngep, "nge_attach: nge_nd_init() failed"); in nge_attach()
2512 mutex_exit(ngep->genlock); in nge_attach()
2515 ngep->progress |= PROGRESS_NDD; in nge_attach()
2520 nge_init_kstats(ngep, instance); in nge_attach()
2521 ngep->progress |= PROGRESS_KSTATS; in nge_attach()
2523 mutex_exit(ngep->genlock); in nge_attach()
2528 macp->m_driver = ngep; in nge_attach()
2533 macp->m_max_sdu = ngep->default_mtu; in nge_attach()
2540 err = mac_register(macp, &ngep->mh); in nge_attach()
2549 ngep->periodic_id = ddi_periodic_add(nge_chip_cyclic, ngep, in nge_attach()
2552 ngep->progress |= PROGRESS_READY; in nge_attach()
2556 nge_unattach(ngep); in nge_attach()
2561 nge_suspend(nge_t *ngep) in nge_suspend() argument
2563 mutex_enter(ngep->genlock); in nge_suspend()
2564 rw_enter(ngep->rwlock, RW_WRITER); in nge_suspend()
2567 if (ngep->nge_mac_state != NGE_MAC_STARTED) { in nge_suspend()
2568 rw_exit(ngep->rwlock); in nge_suspend()
2569 mutex_exit(ngep->genlock); in nge_suspend()
2572 ngep->suspended = B_TRUE; in nge_suspend()
2573 (void) nge_chip_stop(ngep, B_FALSE); in nge_suspend()
2574 ngep->nge_mac_state = NGE_MAC_STOPPED; in nge_suspend()
2576 rw_exit(ngep->rwlock); in nge_suspend()
2577 mutex_exit(ngep->genlock); in nge_suspend()
2588 nge_t *ngep; in nge_detach() local
2594 ngep = ddi_get_driver_private(devinfo); in nge_detach()
2595 brp = ngep->buff; in nge_detach()
2609 return (nge_suspend(ngep)); in nge_detach()
2632 if (mac_unregister(ngep->mh) != DDI_SUCCESS) in nge_detach()
2640 for (p = ngep->pcur_mulist; p != NULL; p = nextp) { in nge_detach()
2644 ngep->pcur_mulist = NULL; in nge_detach()
2649 nge_unattach(ngep); in nge_detach()
2666 nge_t *ngep; in nge_quiesce() local
2668 ngep = ddi_get_driver_private(devinfo); in nge_quiesce()
2670 if (ngep == NULL) in nge_quiesce()
2677 ngep->debug = 0; in nge_quiesce()
2679 nge_restore_mac_addr(ngep); in nge_quiesce()
2680 (void) nge_chip_stop(ngep, B_FALSE); in nge_quiesce()
2750 nge_register_intrs_and_init_locks(nge_t *ngep) in nge_register_intrs_and_init_locks() argument
2783 err = ddi_intr_add_softint(ngep->devinfo, &ngep->resched_hdl, in nge_register_intrs_and_init_locks()
2784 DDI_INTR_SOFTPRI_MIN, nge_reschedule, (caddr_t)ngep); in nge_register_intrs_and_init_locks()
2786 nge_problem(ngep, in nge_register_intrs_and_init_locks()
2791 ngep->progress |= PROGRESS_RESCHED; in nge_register_intrs_and_init_locks()
2792 err = ddi_intr_add_softint(ngep->devinfo, &ngep->factotum_hdl, in nge_register_intrs_and_init_locks()
2793 DDI_INTR_SOFTPRI_MIN, nge_chip_factotum, (caddr_t)ngep); in nge_register_intrs_and_init_locks()
2795 nge_problem(ngep, in nge_register_intrs_and_init_locks()
2800 if (ddi_intr_get_softint_pri(ngep->factotum_hdl, &soft_prip) in nge_register_intrs_and_init_locks()
2802 nge_problem(ngep, "nge_attach: get softintr priority failed\n"); in nge_register_intrs_and_init_locks()
2806 ngep->soft_pri = soft_prip; in nge_register_intrs_and_init_locks()
2808 ngep->progress |= PROGRESS_FACTOTUM; in nge_register_intrs_and_init_locks()
2810 if (ddi_intr_get_supported_types(ngep->devinfo, &intr_types) in nge_register_intrs_and_init_locks()
2812 nge_error(ngep, "ddi_intr_get_supported_types failed\n"); in nge_register_intrs_and_init_locks()
2823 if (ngep->chipinfo.device == DEVICE_ID_MCP55_373 || in nge_register_intrs_and_init_locks()
2824 ngep->chipinfo.device == DEVICE_ID_MCP55_372) { in nge_register_intrs_and_init_locks()
2829 nge_reg_get32(ngep, NGE_MSI_MASK); in nge_register_intrs_and_init_locks()
2838 nge_reg_put32(ngep, NGE_MSI_MASK, in nge_register_intrs_and_init_locks()
2848 nge_reg_get32(ngep, NGE_MSI_MAP0); in nge_register_intrs_and_init_locks()
2850 nge_reg_get32(ngep, NGE_MSI_MAP1); in nge_register_intrs_and_init_locks()
2866 nge_reg_put32(ngep, NGE_MSI_MAP0, in nge_register_intrs_and_init_locks()
2868 nge_reg_put32(ngep, NGE_MSI_MAP1, in nge_register_intrs_and_init_locks()
2871 if (nge_add_intrs(ngep, DDI_INTR_TYPE_MSI) != DDI_SUCCESS) { in nge_register_intrs_and_init_locks()
2875 nge_log(ngep, "Using MSI interrupt type\n"); in nge_register_intrs_and_init_locks()
2877 ngep->intr_type = DDI_INTR_TYPE_MSI; in nge_register_intrs_and_init_locks()
2878 ngep->progress |= PROGRESS_SWINT; in nge_register_intrs_and_init_locks()
2882 if (!(ngep->progress & PROGRESS_SWINT) && in nge_register_intrs_and_init_locks()
2884 if (nge_add_intrs(ngep, DDI_INTR_TYPE_FIXED) != DDI_SUCCESS) { in nge_register_intrs_and_init_locks()
2885 nge_error(ngep, "FIXED interrupt " in nge_register_intrs_and_init_locks()
2891 nge_log(ngep, "Using FIXED interrupt type\n"); in nge_register_intrs_and_init_locks()
2893 ngep->intr_type = DDI_INTR_TYPE_FIXED; in nge_register_intrs_and_init_locks()
2894 ngep->progress |= PROGRESS_SWINT; in nge_register_intrs_and_init_locks()
2898 if (!(ngep->progress & PROGRESS_SWINT)) { in nge_register_intrs_and_init_locks()
2899 nge_error(ngep, "No interrupts registered\n"); in nge_register_intrs_and_init_locks()
2903 mutex_init(ngep->genlock, NULL, MUTEX_DRIVER, in nge_register_intrs_and_init_locks()
2904 DDI_INTR_PRI(ngep->intr_pri)); in nge_register_intrs_and_init_locks()
2905 mutex_init(ngep->softlock, NULL, MUTEX_DRIVER, in nge_register_intrs_and_init_locks()
2906 DDI_INTR_PRI(ngep->soft_pri)); in nge_register_intrs_and_init_locks()
2907 rw_init(ngep->rwlock, NULL, RW_DRIVER, in nge_register_intrs_and_init_locks()
2908 DDI_INTR_PRI(ngep->intr_pri)); in nge_register_intrs_and_init_locks()
2919 nge_add_intrs(nge_t *ngep, int intr_type) in nge_add_intrs() argument
2921 dev_info_t *dip = ngep->devinfo; in nge_add_intrs()
2930 nge_error(ngep, "ddi_intr_get_nintrs() failure, ret: %d, " in nge_add_intrs()
2939 nge_error(ngep, "ddi_intr_get_navail() failure, " in nge_add_intrs()
2953 ngep->htable = kmem_alloc(intr_size, KM_SLEEP); in nge_add_intrs()
2956 ret = ddi_intr_alloc(dip, ngep->htable, intr_type, 0, in nge_add_intrs()
2960 nge_error(ngep, "ddi_intr_alloc() failed %d\n", ret); in nge_add_intrs()
2962 kmem_free(ngep->htable, intr_size); in nge_add_intrs()
2971 ngep->intr_actual_cnt = actual; in nge_add_intrs()
2972 ngep->intr_req_cnt = count; in nge_add_intrs()
2977 if ((ret = ddi_intr_get_pri(ngep->htable[0], &ngep->intr_pri)) != in nge_add_intrs()
2979 nge_error(ngep, "ddi_intr_get_pri() failed %d\n", ret); in nge_add_intrs()
2983 (void) ddi_intr_free(ngep->htable[i]); in nge_add_intrs()
2986 kmem_free(ngep->htable, intr_size); in nge_add_intrs()
2991 if (ngep->intr_pri >= ddi_intr_get_hilevel_pri()) { in nge_add_intrs()
2992 nge_error(ngep, "nge_add_intrs:" in nge_add_intrs()
2996 (void) ddi_intr_free(ngep->htable[i]); in nge_add_intrs()
2998 kmem_free(ngep->htable, intr_size); in nge_add_intrs()
3006 if ((ret = ddi_intr_add_handler(ngep->htable[i], nge_chip_intr, in nge_add_intrs()
3007 (caddr_t)ngep, (caddr_t)(uintptr_t)i)) != DDI_SUCCESS) { in nge_add_intrs()
3008 nge_error(ngep, "ddi_intr_add_handler() " in nge_add_intrs()
3013 (void) ddi_intr_free(ngep->htable[i]); in nge_add_intrs()
3016 kmem_free(ngep->htable, intr_size); in nge_add_intrs()
3022 if ((ret = ddi_intr_get_cap(ngep->htable[0], &ngep->intr_cap)) in nge_add_intrs()
3024 nge_error(ngep, "ddi_intr_get_cap() failed %d\n", ret); in nge_add_intrs()
3027 (void) ddi_intr_remove_handler(ngep->htable[i]); in nge_add_intrs()
3028 (void) ddi_intr_free(ngep->htable[i]); in nge_add_intrs()
3031 kmem_free(ngep->htable, intr_size); in nge_add_intrs()
3045 nge_rem_intrs(nge_t *ngep) in nge_rem_intrs() argument
3052 if (ngep->intr_cap & DDI_INTR_FLAG_BLOCK) { in nge_rem_intrs()
3054 (void) ddi_intr_block_disable(ngep->htable, in nge_rem_intrs()
3055 ngep->intr_actual_cnt); in nge_rem_intrs()
3057 for (i = 0; i < ngep->intr_actual_cnt; i++) { in nge_rem_intrs()
3058 (void) ddi_intr_disable(ngep->htable[i]); in nge_rem_intrs()
3063 for (i = 0; i < ngep->intr_actual_cnt; i++) { in nge_rem_intrs()
3064 (void) ddi_intr_remove_handler(ngep->htable[i]); in nge_rem_intrs()
3065 (void) ddi_intr_free(ngep->htable[i]); in nge_rem_intrs()
3068 kmem_free(ngep->htable, in nge_rem_intrs()
3069 ngep->intr_req_cnt * sizeof (ddi_intr_handle_t)); in nge_rem_intrs()