Lines Matching refs:rgep

135 rge_alloc_dma_mem(rge_t *rgep, size_t memsize, ddi_dma_attr_t *dma_attr_p,
144 err = ddi_dma_alloc_handle(rgep->devinfo, dma_attr_p,
236 rge_alloc_bufs(rge_t *rgep)
245 err = rge_alloc_dma_mem(rgep,
250 &rgep->dma_area_stats);
253 rgep->hw_stats = DMA_VPTR(rgep->dma_area_stats);
259 err = rge_alloc_dma_mem(rgep,
264 &rgep->dma_area_txdesc);
272 err = rge_alloc_dma_mem(rgep,
277 &rgep->dma_area_rxdesc);
289 rge_free_bufs(rge_t *rgep)
291 rge_free_dma_mem(&rgep->dma_area_stats);
292 rge_free_dma_mem(&rgep->dma_area_txdesc);
293 rge_free_dma_mem(&rgep->dma_area_rxdesc);
306 rge_reinit_send_ring(rge_t *rgep)
315 DMA_ZERO(rgep->tx_desc);
316 ssbdp = rgep->sw_sbds;
317 bdp = rgep->tx_ring;
329 DMA_SYNC(rgep->tx_desc, DDI_DMA_SYNC_FORDEV);
330 rgep->tx_next = 0;
331 rgep->tc_next = 0;
332 rgep->tc_tail = 0;
333 rgep->tx_flow = 0;
334 rgep->tx_free = RGE_SEND_SLOTS;
338 rge_reinit_recv_ring(rge_t *rgep)
348 DMA_ZERO(rgep->rx_desc);
349 srbdp = rgep->sw_rbds;
350 bdp = rgep->rx_ring;
354 RGE_BSWAP_32(pbuf->cookie.dmac_laddress + rgep->head_room);
358 (rgep->rxbuf_size - rgep->head_room));
365 DMA_SYNC(rgep->rx_desc, DDI_DMA_SYNC_FORDEV);
366 rgep->watchdog = 0;
367 rgep->rx_next = 0;
371 rge_reinit_buf_ring(rge_t *rgep)
374 if (rgep->chip_flags & CHIP_FLAG_FORCE_BCOPY)
381 if (rgep->rx_free != RGE_BUF_SLOTS)
382 rgep->rx_bcopy = B_TRUE;
386 rge_reinit_rings(rge_t *rgep)
388 rge_reinit_send_ring(rgep);
389 rge_reinit_recv_ring(rgep);
390 rge_reinit_buf_ring(rgep);
394 rge_fini_send_ring(rge_t *rgep)
399 ssbdp = rgep->sw_sbds;
405 kmem_free(rgep->sw_sbds, RGE_SEND_SLOTS * sizeof (sw_sbd_t));
406 rgep->sw_sbds = NULL;
410 rge_fini_recv_ring(rge_t *rgep)
415 srbdp = rgep->sw_rbds;
428 kmem_free(rgep->sw_rbds, RGE_RECV_SLOTS * sizeof (sw_rbd_t));
429 rgep->sw_rbds = NULL;
433 rge_fini_buf_ring(rge_t *rgep)
438 if (rgep->chip_flags & CHIP_FLAG_FORCE_BCOPY)
441 ASSERT(rgep->rx_free == RGE_BUF_SLOTS);
443 srbdp = rgep->free_srbds;
456 kmem_free(rgep->free_srbds, RGE_BUF_SLOTS * sizeof (sw_rbd_t));
457 rgep->free_srbds = NULL;
461 rge_fini_rings(rge_t *rgep)
463 rge_fini_send_ring(rgep);
464 rge_fini_recv_ring(rgep);
465 rge_fini_buf_ring(rgep);
469 rge_init_send_ring(rge_t *rgep)
481 rgep->sw_sbds = ssbdp;
486 rgep->tx_desc = rgep->dma_area_txdesc;
487 DMA_ZERO(rgep->tx_desc);
488 rgep->tx_ring = rgep->tx_desc.mem_va;
490 desc = rgep->tx_desc;
498 err = rge_alloc_dma_mem(rgep, rgep->txbuf_size,
502 rge_error(rgep,
504 rge_fini_send_ring(rgep);
511 DMA_SYNC(rgep->tx_desc, DDI_DMA_SYNC_FORDEV);
516 rge_init_recv_ring(rge_t *rgep)
528 rgep->sw_rbds = srbdp;
533 rgep->rx_next = 0;
534 rgep->rx_desc = rgep->dma_area_rxdesc;
535 DMA_ZERO(rgep->rx_desc);
536 rgep->rx_ring = rgep->rx_desc.mem_va;
546 err = rge_alloc_dma_mem(rgep, rgep->rxbuf_size,
550 rge_fini_recv_ring(rgep);
551 rge_error(rgep,
556 pbuf->alength -= rgep->head_room;
557 pbuf->offset += rgep->head_room;
558 if (!(rgep->chip_flags & CHIP_FLAG_FORCE_BCOPY)) {
561 rx_buf->private = (caddr_t)rgep;
563 rgep->rxbuf_size, 0, &rx_buf->rx_recycle);
565 rge_fini_recv_ring(rgep);
566 rge_problem(rgep,
573 DMA_SYNC(rgep->rx_desc, DDI_DMA_SYNC_FORDEV);
578 rge_init_buf_ring(rge_t *rgep)
586 if (rgep->chip_flags & CHIP_FLAG_FORCE_BCOPY) {
587 rgep->rx_bcopy = B_TRUE;
595 rgep->free_srbds = free_srbdp;
600 rgep->rc_next = 0;
601 rgep->rf_next = 0;
602 rgep->rx_bcopy = B_FALSE;
603 rgep->rx_free = RGE_BUF_SLOTS;
612 err = rge_alloc_dma_mem(rgep, rgep->rxbuf_size,
616 rge_fini_buf_ring(rgep);
617 rge_error(rgep,
621 pbuf->alength -= rgep->head_room;
622 pbuf->offset += rgep->head_room;
625 rx_buf->private = (caddr_t)rgep;
627 rgep->rxbuf_size, 0, &rx_buf->rx_recycle);
629 rge_fini_buf_ring(rgep);
630 rge_problem(rgep,
640 rge_init_rings(rge_t *rgep)
644 err = rge_init_send_ring(rgep);
648 err = rge_init_recv_ring(rgep);
650 rge_fini_send_ring(rgep);
654 err = rge_init_buf_ring(rgep);
656 rge_fini_send_ring(rgep);
657 rge_fini_recv_ring(rgep);
682 rge_reset(rge_t *rgep)
684 ASSERT(mutex_owned(rgep->genlock));
690 mutex_enter(rgep->rx_lock);
691 mutex_enter(rgep->rc_lock);
692 rw_enter(rgep->errlock, RW_WRITER);
694 (void) rge_chip_reset(rgep);
695 rge_reinit_rings(rgep);
696 rge_chip_init(rgep);
701 rw_exit(rgep->errlock);
702 mutex_exit(rgep->rc_lock);
703 mutex_exit(rgep->rx_lock);
705 rgep->stats.rpackets = 0;
706 rgep->stats.rbytes = 0;
707 rgep->stats.opackets = 0;
708 rgep->stats.obytes = 0;
709 rgep->stats.tx_pre_ismax = B_FALSE;
710 rgep->stats.tx_cur_ismax = B_FALSE;
712 RGE_DEBUG(("rge_reset($%p) done", (void *)rgep));
719 rge_stop(rge_t *rgep)
721 ASSERT(mutex_owned(rgep->genlock));
723 rge_chip_stop(rgep, B_FALSE);
725 RGE_DEBUG(("rge_stop($%p) done", (void *)rgep));
732 rge_start(rge_t *rgep)
734 ASSERT(mutex_owned(rgep->genlock));
739 rge_chip_start(rgep);
740 rgep->watchdog = 0;
747 rge_restart(rge_t *rgep)
751 ASSERT(mutex_owned(rgep->genlock));
755 if (!rgep->rx_bcopy) {
757 if (rgep->rx_free == RGE_BUF_SLOTS)
763 rge_reset(rgep);
764 rgep->stats.chip_reset++;
765 if (rgep->rge_mac_state == RGE_MAC_STARTED) {
766 rge_start(rgep);
767 rgep->resched_needed = B_TRUE;
768 (void) ddi_intr_trigger_softint(rgep->resched_hdl, NULL);
786 rge_t *rgep = arg; /* private device info */
792 mutex_enter(rgep->genlock);
793 if (rgep->suspended) {
794 ASSERT(rgep->rge_mac_state == RGE_MAC_STOPPED);
795 mutex_exit(rgep->genlock);
798 rge_stop(rgep);
802 if (!rgep->rx_bcopy) {
804 if (rgep->rx_free == RGE_BUF_SLOTS)
810 rgep->rge_mac_state = RGE_MAC_STOPPED;
812 mutex_exit(rgep->genlock);
821 rge_t *rgep = arg; /* private device info */
823 mutex_enter(rgep->genlock);
824 if (rgep->suspended) {
825 mutex_exit(rgep->genlock);
831 DMA_ZERO(rgep->dma_area_stats);
832 bzero(&rgep->stats, sizeof (rge_stats_t));
837 rge_reset(rgep);
838 rge_start(rgep);
839 rgep->rge_mac_state = RGE_MAC_STARTED;
842 mutex_exit(rgep->genlock);
853 rge_t *rgep = arg; /* private device info */
859 mutex_enter(rgep->genlock);
860 bcopy(macaddr, rgep->netaddr, ETHERADDRL);
862 if (rgep->suspended) {
863 mutex_exit(rgep->genlock);
867 rge_chip_sync(rgep, RGE_SET_MAC);
868 mutex_exit(rgep->genlock);
910 rge_t *rgep = arg; /* private device info */
916 mutex_enter(rgep->genlock);
917 hashp = rgep->mcast_hash;
929 if (rgep->chipid.is_pcie)
935 if (rgep->mcast_refs[index]++) {
936 mutex_exit(rgep->genlock);
941 if (--rgep->mcast_refs[index]) {
942 mutex_exit(rgep->genlock);
948 if (rgep->suspended) {
949 mutex_exit(rgep->genlock);
956 rge_chip_sync(rgep, RGE_SET_MUL);
958 mutex_exit(rgep->genlock);
971 rge_t *rgep = arg;
976 mutex_enter(rgep->genlock);
978 if (rgep->promisc == on) {
979 mutex_exit(rgep->genlock);
982 rgep->promisc = on;
984 if (rgep->suspended) {
985 mutex_exit(rgep->genlock);
989 rge_chip_sync(rgep, RGE_SET_PROMISC);
991 mutex_exit(rgep->genlock);
1006 rge_set_loop_mode(rge_t *rgep, uint32_t mode)
1011 if (mode == rgep->param_loop_mode)
1033 rgep->param_loop_mode = mode;
1038 rge_loop_ioctl(rge_t *rgep, queue_t *wq, mblk_t *mp, struct iocblk *iocp)
1057 rge_error(rgep, "rge_loop_ioctl: invalid cmd 0x%x", cmd);
1078 *lbmp = rgep->param_loop_mode;
1085 return (rge_set_loop_mode(rgep, *lbmp));
1095 rge_t *rgep = arg;
1108 mutex_enter(rgep->genlock);
1109 if (rgep->suspended) {
1111 mutex_exit(rgep->genlock);
1114 mutex_exit(rgep->genlock);
1164 mutex_enter(rgep->genlock);
1180 status = rge_chip_ioctl(rgep, wq, mp, iocp);
1187 status = rge_loop_ioctl(rgep, wq, mp, iocp);
1192 status = rge_nd_ioctl(rgep, wq, mp, iocp);
1206 rge_phy_update(rgep);
1210 mutex_exit(rgep->genlock);
1255 rge_t *rgep = arg;
1260 switch (rgep->chipid.mac_ver) {
1298 rge_add_intrs(rge_t *rgep, int intr_type)
1300 dev_info_t *dip = rgep->devinfo;
1311 rge_error(rgep, "ddi_intr_get_nintrs() failure, ret: %d, "
1319 rge_error(rgep, "ddi_intr_get_navail() failure, "
1326 rgep->htable = kmem_alloc(intr_size, KM_SLEEP);
1327 rgep->intr_rqst = count;
1330 ret = ddi_intr_alloc(dip, rgep->htable, intr_type, 0,
1333 rge_error(rgep, "ddi_intr_alloc() failed %d\n", ret);
1334 kmem_free(rgep->htable, intr_size);
1338 rge_log(rgep, "ddi_intr_alloc() Requested: %d, Received: %d\n",
1341 rgep->intr_cnt = actual;
1346 if ((ret = ddi_intr_get_pri(rgep->htable[0], &rgep->intr_pri)) !=
1348 rge_error(rgep, "ddi_intr_get_pri() failed %d\n", ret);
1351 (void) ddi_intr_free(rgep->htable[i]);
1353 kmem_free(rgep->htable, intr_size);
1358 if (rgep->intr_pri >= ddi_intr_get_hilevel_pri()) {
1359 rge_error(rgep, "rge_add_intrs:"
1362 (void) ddi_intr_free(rgep->htable[i]);
1363 kmem_free(rgep->htable, intr_size);
1369 if ((ret = ddi_intr_add_handler(rgep->htable[i], rge_intr,
1370 (caddr_t)rgep, (caddr_t)(uintptr_t)i)) != DDI_SUCCESS) {
1371 rge_error(rgep, "ddi_intr_add_handler() "
1375 (void) ddi_intr_remove_handler(rgep->htable[j]);
1378 (void) ddi_intr_free(rgep->htable[i]);
1380 kmem_free(rgep->htable, intr_size);
1385 if ((ret = ddi_intr_get_cap(rgep->htable[0], &rgep->intr_cap))
1387 rge_error(rgep, "ddi_intr_get_cap() failed %d\n", ret);
1389 (void) ddi_intr_remove_handler(rgep->htable[i]);
1390 (void) ddi_intr_free(rgep->htable[i]);
1392 kmem_free(rgep->htable, intr_size);
1405 rge_rem_intrs(rge_t *rgep)
1410 if (rgep->intr_cap & DDI_INTR_FLAG_BLOCK) {
1412 (void) ddi_intr_block_disable(rgep->htable, rgep->intr_cnt);
1414 for (i = 0; i < rgep->intr_cnt; i++) {
1415 (void) ddi_intr_disable(rgep->htable[i]);
1420 for (i = 0; i < rgep->intr_cnt; i++) {
1421 (void) ddi_intr_remove_handler(rgep->htable[i]);
1422 (void) ddi_intr_free(rgep->htable[i]);
1425 kmem_free(rgep->htable, rgep->intr_rqst * sizeof (ddi_intr_handle_t));
1436 rge_unattach(rge_t *rgep)
1441 rgep->progress &= ~PROGRESS_READY;
1442 rgep->rge_mac_state = RGE_MAC_UNATTACH;
1448 if (rgep->periodic_id != NULL) {
1449 ddi_periodic_delete(rgep->periodic_id);
1450 rgep->periodic_id = NULL;
1453 if (rgep->progress & PROGRESS_KSTATS)
1454 rge_fini_kstats(rgep);
1456 if (rgep->progress & PROGRESS_PHY)
1457 (void) rge_phy_reset(rgep);
1459 if (rgep->progress & PROGRESS_INIT) {
1460 mutex_enter(rgep->genlock);
1461 (void) rge_chip_reset(rgep);
1462 mutex_exit(rgep->genlock);
1463 rge_fini_rings(rgep);
1466 if (rgep->progress & PROGRESS_INTR) {
1467 rge_rem_intrs(rgep);
1468 mutex_destroy(rgep->rc_lock);
1469 mutex_destroy(rgep->rx_lock);
1470 mutex_destroy(rgep->tc_lock);
1471 mutex_destroy(rgep->tx_lock);
1472 rw_destroy(rgep->errlock);
1473 mutex_destroy(rgep->genlock);
1476 if (rgep->progress & PROGRESS_FACTOTUM)
1477 (void) ddi_intr_remove_softint(rgep->factotum_hdl);
1479 if (rgep->progress & PROGRESS_RESCHED)
1480 (void) ddi_intr_remove_softint(rgep->resched_hdl);
1482 if (rgep->progress & PROGRESS_NDD)
1483 rge_nd_cleanup(rgep);
1485 rge_free_bufs(rgep);
1487 if (rgep->progress & PROGRESS_REGS)
1488 ddi_regs_map_free(&rgep->io_handle);
1490 if (rgep->progress & PROGRESS_CFG)
1491 pci_config_teardown(&rgep->cfg_handle);
1493 ddi_remove_minor_node(rgep->devinfo, NULL);
1494 kmem_free(rgep, sizeof (*rgep));
1500 rge_t *rgep; /* Our private data */
1504 rgep = ddi_get_driver_private(devinfo);
1512 if (rgep == NULL)
1519 if (rgep->devinfo != devinfo)
1527 cidp = &rgep->chipid;
1528 rge_chip_cfg_init(rgep, &chipid);
1536 mutex_enter(rgep->genlock);
1542 if (rgep->suspended == B_FALSE) {
1543 mutex_exit(rgep->genlock);
1546 rgep->rge_mac_state = RGE_MAC_STARTED;
1550 rge_restart(rgep);
1551 rgep->suspended = B_FALSE;
1553 mutex_exit(rgep->genlock);
1567 rge_t *rgep; /* Our private data */
1601 rgep = kmem_zalloc(sizeof (*rgep), KM_SLEEP);
1602 ddi_set_driver_private(devinfo, rgep);
1603 rgep->devinfo = devinfo;
1608 rgep->rge_mac_state = RGE_MAC_ATTACH;
1609 rgep->debug = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo,
1611 rgep->default_mtu = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo,
1613 rgep->msi_enable = ddi_prop_get_int(DDI_DEV_T_ANY, devinfo,
1615 (void) snprintf(rgep->ifname, sizeof (rgep->ifname), "%s%d",
1629 err = pci_config_setup(devinfo, &rgep->cfg_handle);
1631 rge_problem(rgep, "pci_config_setup() failed");
1634 rgep->progress |= PROGRESS_CFG;
1635 cidp = &rgep->chipid;
1637 rge_chip_cfg_init(rgep, cidp);
1643 0, 0, &rge_reg_accattr, &rgep->io_handle);
1651 0, 0, &rge_reg_accattr, &rgep->io_handle);
1654 rge_problem(rgep, "ddi_regs_map_setup() failed");
1657 rgep->io_regs = regs;
1658 rgep->progress |= PROGRESS_REGS;
1664 rge_chip_ident(rgep);
1665 err = rge_alloc_bufs(rgep);
1667 rge_problem(rgep, "DMA buffer allocation failed");
1674 if (rge_nd_init(rgep)) {
1675 rge_problem(rgep, "rge_nd_init() failed");
1678 rgep->progress |= PROGRESS_NDD;
1702 err = ddi_intr_add_softint(devinfo, &rgep->resched_hdl,
1703 DDI_INTR_SOFTPRI_MIN, rge_reschedule, (caddr_t)rgep);
1705 rge_problem(rgep, "ddi_intr_add_softint() failed");
1708 rgep->progress |= PROGRESS_RESCHED;
1709 err = ddi_intr_add_softint(devinfo, &rgep->factotum_hdl,
1710 DDI_INTR_SOFTPRI_MIN, rge_chip_factotum, (caddr_t)rgep);
1712 rge_problem(rgep, "ddi_intr_add_softint() failed");
1715 rgep->progress |= PROGRESS_FACTOTUM;
1722 rge_error(rgep, "ddi_intr_get_supported_types failed\n");
1731 if (rgep->chipid.mac_ver == MAC_VER_8101E)
1732 rgep->msi_enable = B_FALSE;
1733 if ((intr_types & DDI_INTR_TYPE_MSI) && rgep->msi_enable) {
1734 if (rge_add_intrs(rgep, DDI_INTR_TYPE_MSI) != DDI_SUCCESS) {
1735 rge_error(rgep, "MSI registration failed, "
1738 rge_log(rgep, "Using MSI interrupt type\n");
1739 rgep->intr_type = DDI_INTR_TYPE_MSI;
1740 rgep->progress |= PROGRESS_INTR;
1743 if (!(rgep->progress & PROGRESS_INTR) &&
1745 if (rge_add_intrs(rgep, DDI_INTR_TYPE_FIXED) != DDI_SUCCESS) {
1746 rge_error(rgep, "FIXED interrupt "
1750 rge_log(rgep, "Using FIXED interrupt type\n");
1751 rgep->intr_type = DDI_INTR_TYPE_FIXED;
1752 rgep->progress |= PROGRESS_INTR;
1754 if (!(rgep->progress & PROGRESS_INTR)) {
1755 rge_error(rgep, "No interrupts registered\n");
1758 mutex_init(rgep->genlock, NULL, MUTEX_DRIVER,
1759 DDI_INTR_PRI(rgep->intr_pri));
1760 rw_init(rgep->errlock, NULL, RW_DRIVER,
1761 DDI_INTR_PRI(rgep->intr_pri));
1762 mutex_init(rgep->tx_lock, NULL, MUTEX_DRIVER,
1763 DDI_INTR_PRI(rgep->intr_pri));
1764 mutex_init(rgep->tc_lock, NULL, MUTEX_DRIVER,
1765 DDI_INTR_PRI(rgep->intr_pri));
1766 mutex_init(rgep->rx_lock, NULL, MUTEX_DRIVER,
1767 DDI_INTR_PRI(rgep->intr_pri));
1768 mutex_init(rgep->rc_lock, NULL, MUTEX_DRIVER,
1769 DDI_INTR_PRI(rgep->intr_pri));
1774 err = rge_init_rings(rgep);
1776 rge_problem(rgep, "rge_init_rings() failed");
1779 rgep->progress |= PROGRESS_INIT;
1784 if (rgep->intr_cap & DDI_INTR_FLAG_BLOCK) {
1786 (void) ddi_intr_block_enable(rgep->htable, rgep->intr_cnt);
1789 for (i = 0; i < rgep->intr_cnt; i++) {
1790 (void) ddi_intr_enable(rgep->htable[i]);
1799 rgep->param_link_up = LINK_STATE_UNKNOWN;
1805 mutex_enter(rgep->genlock);
1806 (void) rge_chip_reset(rgep);
1807 rge_chip_sync(rgep, RGE_GET_MAC);
1808 bzero(rgep->mcast_hash, sizeof (rgep->mcast_hash));
1809 bzero(rgep->mcast_refs, sizeof (rgep->mcast_refs));
1810 rgep->promisc = B_FALSE;
1811 rgep->param_loop_mode = RGE_LOOP_NONE;
1812 mutex_exit(rgep->genlock);
1813 rge_phy_init(rgep);
1814 rgep->progress |= PROGRESS_PHY;
1819 rge_init_kstats(rgep, instance);
1820 rgep->progress |= PROGRESS_KSTATS;
1825 macp->m_driver = rgep;
1827 macp->m_src_addr = rgep->netaddr;
1830 macp->m_max_sdu = rgep->default_mtu;
1837 err = mac_register(macp, &rgep->mh);
1846 rgep->periodic_id = ddi_periodic_add(rge_chip_cyclic, rgep,
1849 rgep->progress |= PROGRESS_READY;
1853 rge_unattach(rgep);
1861 rge_suspend(rge_t *rgep)
1866 mutex_enter(rgep->genlock);
1867 rw_enter(rgep->errlock, RW_WRITER);
1869 if (rgep->rge_mac_state != RGE_MAC_STARTED) {
1870 rw_exit(rgep->errlock);
1871 mutex_exit(rgep->genlock);
1875 rgep->suspended = B_TRUE;
1876 rge_stop(rgep);
1877 rgep->rge_mac_state = RGE_MAC_STOPPED;
1879 rw_exit(rgep->errlock);
1880 mutex_exit(rgep->genlock);
1898 rge_t *rgep = ddi_get_driver_private(devinfo);
1900 if (rgep == NULL)
1907 rgep->debug = 0;
1910 rge_chip_stop(rgep, B_FALSE);
1921 rge_t *rgep;
1925 rgep = ddi_get_driver_private(devinfo);
1932 return (rge_suspend(rgep));
1942 if (!(rgep->chip_flags & CHIP_FLAG_FORCE_BCOPY) &&
1943 rgep->rx_free != RGE_BUF_SLOTS)
1952 if (mac_unregister(rgep->mh) != 0)
1958 rge_unattach(rgep);