Lines Matching defs:adapter

270 	struct al_eth_adapter *adapter;
293 adapter = device_get_softc(dev);
294 adapter->dev = dev;
295 adapter->board_type = ALPINE_INTEGRATED;
296 snprintf(adapter->name, AL_ETH_NAME_MAX_LEN, "%s",
298 AL_RX_LOCK_INIT(adapter);
300 g_adapters[g_adapters_count] = adapter;
303 adapter->udma_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
305 if (adapter->udma_res == NULL) {
306 device_printf(adapter->dev,
311 adapter->udma_base = al_bus_dma_to_va(rman_get_bustag(adapter->udma_res),
312 rman_get_bushandle(adapter->udma_res));
314 adapter->mac_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
316 if (adapter->mac_res == NULL) {
317 device_printf(adapter->dev,
322 adapter->mac_base = al_bus_dma_to_va(rman_get_bustag(adapter->mac_res),
323 rman_get_bushandle(adapter->mac_res));
326 adapter->ec_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &bar_ec,
328 if (adapter->ec_res == NULL) {
329 device_printf(adapter->dev,
334 adapter->ec_base = al_bus_dma_to_va(rman_get_bustag(adapter->ec_res),
335 rman_get_bushandle(adapter->ec_res));
337 adapter->netdev = ifp = if_alloc(IFT_ETHER);
339 if_setsoftc(ifp, adapter);
351 adapter->if_flags = if_getflags(ifp);
361 adapter->id_number = g_adapters_count;
363 if (adapter->board_type == ALPINE_INTEGRATED) {
364 dev_id = pci_get_device(adapter->dev);
365 rev_id = pci_get_revid(adapter->dev);
367 al_eth_fpga_read_pci_config(adapter->internal_pcie_base,
369 al_eth_fpga_read_pci_config(adapter->internal_pcie_base,
373 adapter->dev_id = dev_id;
374 adapter->rev_id = rev_id;
377 adapter->tx_ring_count = AL_ETH_DEFAULT_TX_SW_DESCS;
378 adapter->tx_descs_count = AL_ETH_DEFAULT_TX_HW_DESCS;
379 adapter->rx_ring_count = AL_ETH_DEFAULT_RX_DESCS;
380 adapter->rx_descs_count = AL_ETH_DEFAULT_RX_DESCS;
382 adapter->num_tx_queues = AL_ETH_NUM_QUEUES;
383 adapter->num_rx_queues = AL_ETH_NUM_QUEUES;
385 adapter->small_copy_len = AL_ETH_DEFAULT_SMALL_PACKET_LEN;
386 adapter->link_poll_interval = AL_ETH_DEFAULT_LINK_POLL_INTERVAL;
387 adapter->max_rx_buff_alloc_size = AL_ETH_DEFAULT_MAX_RX_BUFF_ALLOC_SIZE;
389 al_eth_req_rx_buff_size(adapter, if_getmtu(adapter->netdev));
391 adapter->link_config.force_1000_base_x = AL_ETH_DEFAULT_FORCE_1000_BASEX;
393 err = al_eth_board_params_init(adapter);
397 if (adapter->mac_mode == AL_ETH_MAC_MODE_10GbE_Serial) {
398 ifmedia_init(&adapter->media, IFM_IMASK,
400 ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_LX, 0, NULL);
401 ifmedia_add(&adapter->media, IFM_ETHER | IFM_10G_LR, 0, NULL);
402 ifmedia_add(&adapter->media, IFM_ETHER | IFM_AUTO, 0, NULL);
403 ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO);
406 al_eth_function_reset(adapter);
408 err = al_eth_hw_init_adapter(adapter);
412 al_eth_init_rings(adapter);
415 al_eth_lm_config(adapter);
416 mtx_init(&adapter->stats_mtx, "AlStatsMtx", NULL, MTX_DEF);
417 mtx_init(&adapter->wd_mtx, "AlWdMtx", NULL, MTX_DEF);
418 callout_init_mtx(&adapter->stats_callout, &adapter->stats_mtx, 0);
419 callout_init_mtx(&adapter->wd_callout, &adapter->wd_mtx, 0);
421 ether_ifattach(ifp, adapter->mac_addr);
424 if (adapter->mac_mode == AL_ETH_MAC_MODE_RGMII) {
425 al_eth_hw_init(adapter);
428 err = mii_attach(adapter->dev, &adapter->miibus, adapter->netdev,
432 device_printf(adapter->dev, "attaching PHYs failed\n");
436 adapter->mii = device_get_softc(adapter->miibus);
442 bus_release_resource(dev, SYS_RES_MEMORY, bar_ec, adapter->ec_res);
444 bus_release_resource(dev, SYS_RES_MEMORY, bar_mac, adapter->mac_res);
446 bus_release_resource(dev, SYS_RES_MEMORY, bar_udma, adapter->udma_res);
454 struct al_eth_adapter *adapter;
456 adapter = device_get_softc(dev);
457 ether_ifdetach(adapter->netdev);
459 mtx_destroy(&adapter->stats_mtx);
460 mtx_destroy(&adapter->wd_mtx);
462 al_eth_down(adapter);
464 bus_release_resource(dev, SYS_RES_IRQ, 0, adapter->irq_res);
465 bus_release_resource(dev, SYS_RES_MEMORY, 0, adapter->ec_res);
466 bus_release_resource(dev, SYS_RES_MEMORY, 0, adapter->mac_res);
467 bus_release_resource(dev, SYS_RES_MEMORY, 0, adapter->udma_res);
476 /* handle is the base address of the adapter */
486 /* handle is the base address of the adapter */
524 al_eth_serdes_init(struct al_eth_adapter *adapter)
528 adapter->serdes_init = false;
530 serdes_base = alpine_serdes_resource_get(adapter->serdes_grp);
532 device_printf(adapter->dev, "serdes_base get failed!\n");
538 al_serdes_handle_grp_init(serdes_base, adapter->serdes_grp,
539 &adapter->serdes_obj);
541 adapter->serdes_init = true;
598 al_eth_mac_table_unicast_add(struct al_eth_adapter *adapter,
603 memcpy(entry.addr, adapter->mac_addr, sizeof(adapter->mac_addr));
611 device_printf_dbg(adapter->dev,
615 al_eth_fwd_mac_table_set(&adapter->hal_adapter, idx, &entry);
619 al_eth_mac_table_all_multicast_add(struct al_eth_adapter *adapter, uint8_t idx,
634 device_printf_dbg(adapter->dev,
638 al_eth_fwd_mac_table_set(&adapter->hal_adapter, idx, &entry);
642 al_eth_mac_table_broadcast_add(struct al_eth_adapter *adapter,
655 device_printf_dbg(adapter->dev,
659 al_eth_fwd_mac_table_set(&adapter->hal_adapter, idx, &entry);
663 al_eth_mac_table_promiscuous_set(struct al_eth_adapter *adapter,
676 device_printf_dbg(adapter->dev, "%s: %s promiscuous mode\n",
679 al_eth_fwd_mac_table_set(&adapter->hal_adapter,
684 al_eth_set_thash_table_entry(struct al_eth_adapter *adapter, uint8_t idx,
694 al_eth_thash_table_set(&adapter->hal_adapter, idx, udma, queue);
699 al_eth_fsm_table_init(struct al_eth_adapter *adapter)
723 al_eth_fsm_table_set(&adapter->hal_adapter, i, val);
728 al_eth_mac_table_entry_clear(struct al_eth_adapter *adapter,
733 device_printf_dbg(adapter->dev, "%s: clear entry %d\n", __func__, idx);
735 al_eth_fwd_mac_table_set(&adapter->hal_adapter, idx, &entry);
739 al_eth_hw_init_adapter(struct al_eth_adapter *adapter)
741 struct al_eth_adapter_params *params = &adapter->eth_hal_params;
744 /* params->dev_id = adapter->dev_id; */
745 params->rev_id = adapter->rev_id;
748 params->udma_regs_base = adapter->udma_base; /* UDMA register base address */
749 params->ec_regs_base = adapter->ec_base; /* Ethernet controller registers base address */
750 params->mac_regs_base = adapter->mac_base; /* Ethernet MAC registers base address */
751 params->name = adapter->name;
752 params->serdes_lane = adapter->serdes_lane;
754 rc = al_eth_adapter_init(&adapter->hal_adapter, params);
756 device_printf(adapter->dev, "%s failed at hal init!\n",
759 if ((adapter->board_type == ALPINE_NIC) ||
760 (adapter->board_type == ALPINE_FPGA_NIC)) {
772 al_udma_gen_tgtid_conf_set(adapter->udma_base, &conf);
779 al_eth_lm_config(struct al_eth_adapter *adapter)
783 params.adapter = &adapter->hal_adapter;
784 params.serdes_obj = &adapter->serdes_obj;
785 params.lane = adapter->serdes_lane;
786 params.sfp_detection = adapter->sfp_detection_needed;
787 if (adapter->sfp_detection_needed == true) {
788 params.sfp_bus_id = adapter->i2c_adapter_id;
792 if (adapter->sfp_detection_needed == false) {
793 switch (adapter->mac_mode) {
795 if ((adapter->lt_en != 0) && (adapter->an_en != 0))
809 params.link_training = adapter->lt_en;
811 params.static_values = !adapter->dont_override_serdes;
812 params.i2c_context = adapter;
815 params.retimer_exist = adapter->retimer.exist;
816 params.retimer_bus_id = adapter->retimer.bus_id;
817 params.retimer_i2c_addr = adapter->retimer.i2c_addr;
818 params.retimer_channel = adapter->retimer.channel;
820 al_eth_lm_init(&adapter->lm_context, &params);
824 al_eth_board_params_init(struct al_eth_adapter *adapter)
827 if (adapter->board_type == ALPINE_NIC) {
828 adapter->mac_mode = AL_ETH_MAC_MODE_10GbE_Serial;
829 adapter->sfp_detection_needed = false;
830 adapter->phy_exist = false;
831 adapter->an_en = false;
832 adapter->lt_en = false;
833 adapter->ref_clk_freq = AL_ETH_REF_FREQ_375_MHZ;
834 adapter->mdio_freq = AL_ETH_DEFAULT_MDIO_FREQ_KHZ;
835 } else if (adapter->board_type == ALPINE_FPGA_NIC) {
836 adapter->mac_mode = AL_ETH_MAC_MODE_SGMII;
837 adapter->sfp_detection_needed = false;
838 adapter->phy_exist = false;
839 adapter->an_en = false;
840 adapter->lt_en = false;
841 adapter->ref_clk_freq = AL_ETH_REF_FREQ_375_MHZ;
842 adapter->mdio_freq = AL_ETH_DEFAULT_MDIO_FREQ_KHZ;
847 adapter->auto_speed = false;
849 rc = al_eth_board_params_get(adapter->mac_base, &params);
851 device_printf(adapter->dev,
856 adapter->phy_exist = params.phy_exist == true;
857 adapter->phy_addr = params.phy_mdio_addr;
858 adapter->an_en = params.autoneg_enable;
859 adapter->lt_en = params.kr_lt_enable;
860 adapter->serdes_grp = params.serdes_grp;
861 adapter->serdes_lane = params.serdes_lane;
862 adapter->sfp_detection_needed = params.sfp_plus_module_exist;
863 adapter->i2c_adapter_id = params.i2c_adapter_id;
864 adapter->ref_clk_freq = params.ref_clk_freq;
865 adapter->dont_override_serdes = params.dont_override_serdes;
866 adapter->link_config.active_duplex = !params.half_duplex;
867 adapter->link_config.autoneg = !params.an_disable;
868 adapter->link_config.force_1000_base_x = params.force_1000_base_x;
869 adapter->retimer.exist = params.retimer_exist;
870 adapter->retimer.bus_id = params.retimer_bus_id;
871 adapter->retimer.i2c_addr = params.retimer_i2c_addr;
872 adapter->retimer.channel = params.retimer_channel;
876 device_printf(adapter->dev,
879 adapter->link_config.active_speed = 1000;
882 adapter->link_config.active_speed = 100;
885 adapter->link_config.active_speed = 10;
891 device_printf(adapter->dev,
895 adapter->mdio_freq = AL_ETH_DEFAULT_MDIO_FREQ_KHZ;
898 adapter->mdio_freq = AL_ETH_MDIO_FREQ_1000_KHZ;
906 adapter->mac_mode = AL_ETH_MAC_MODE_SGMII;
908 adapter->mac_mode = AL_ETH_MAC_MODE_RGMII;
910 adapter->use_lm = false;
913 adapter->mac_mode = AL_ETH_MAC_MODE_SGMII;
914 adapter->use_lm = true;
917 adapter->mac_mode = AL_ETH_MAC_MODE_10GbE_Serial;
918 adapter->use_lm = true;
921 adapter->sfp_detection_needed = true;
922 adapter->auto_speed = false;
923 adapter->use_lm = true;
926 adapter->sfp_detection_needed = true;
927 adapter->auto_speed = true;
928 adapter->mac_mode_set = false;
929 adapter->use_lm = true;
931 adapter->mac_mode = AL_ETH_MAC_MODE_10GbE_Serial;
934 device_printf(adapter->dev,
940 device_printf(adapter->dev,
944 params.phy_mdio_addr, adapter->mdio_freq,
949 al_eth_mac_addr_read(adapter->ec_base, 0, adapter->mac_addr);
955 al_eth_function_reset(struct al_eth_adapter *adapter)
961 al_eth_board_params_get(adapter->mac_base, &params);
962 al_eth_mac_addr_read(adapter->ec_base, 0, adapter->mac_addr);
963 if (adapter->board_type == ALPINE_INTEGRATED)
966 adapter->dev, adapter->mac_base);
970 adapter->internal_pcie_base, adapter->mac_base);
973 al_eth_board_params_set(adapter->mac_base, &params);
974 al_eth_mac_addr_store(adapter->ec_base, 0, adapter->mac_addr);
980 al_eth_init_rings(struct al_eth_adapter *adapter)
984 for (i = 0; i < adapter->num_tx_queues; i++) {
985 struct al_eth_ring *ring = &adapter->tx_ring[i];
988 ring->dev = adapter->dev;
989 ring->adapter = adapter;
990 ring->netdev = adapter->netdev;
991 al_udma_q_handle_get(&adapter->hal_adapter.tx_udma, i,
993 ring->sw_count = adapter->tx_ring_count;
994 ring->hw_count = adapter->tx_descs_count;
995 ring->unmask_reg_offset = al_udma_iofic_unmask_offset_get((struct unit_regs *)adapter->udma_base, AL_UDMA_IOFIC_LEVEL_PRIMARY, AL_INT_GROUP_C);
999 for (i = 0; i < adapter->num_rx_queues; i++) {
1000 struct al_eth_ring *ring = &adapter->rx_ring[i];
1003 ring->dev = adapter->dev;
1004 ring->adapter = adapter;
1005 ring->netdev = adapter->netdev;
1006 al_udma_q_handle_get(&adapter->hal_adapter.rx_udma, i, &ring->dma_q);
1007 ring->sw_count = adapter->rx_ring_count;
1008 ring->hw_count = adapter->rx_descs_count;
1010 (struct unit_regs *)adapter->udma_base,
1019 struct al_eth_adapter *adapter = arg;
1020 if_t ifp = adapter->netdev;
1023 al_eth_down(adapter);
1024 rc = al_eth_up(adapter);
1034 struct al_eth_adapter *adapter = arg;
1036 al_init_locked(adapter);
1040 al_eth_alloc_rx_buf(struct al_eth_adapter *adapter,
1052 rx_info->data_size = adapter->rx_mbuf_sz;
1054 AL_RX_LOCK(adapter);
1059 AL_RX_UNLOCK(adapter);
1064 rx_info->m->m_pkthdr.len = rx_info->m->m_len = adapter->rx_mbuf_sz;
1085 al_eth_refill_rx_bufs(struct al_eth_adapter *adapter, unsigned int qid,
1088 struct al_eth_ring *rx_ring = &adapter->rx_ring[qid];
1099 if (__predict_false(al_eth_alloc_rx_buf(adapter,
1101 device_printf(adapter->dev,
1109 device_printf(adapter->dev,
1118 device_printf(adapter->dev,
1132 * @adapter: board private structure
1135 al_eth_refill_all_rx_bufs(struct al_eth_adapter *adapter)
1139 for (i = 0; i < adapter->num_rx_queues; i++)
1140 al_eth_refill_rx_bufs(adapter, i, AL_ETH_DEFAULT_RX_DESCS - 1);
1471 * @adapter: structure containing adapter specific data
1476 al_eth_rx_checksum(struct al_eth_adapter *adapter,
1481 if (unlikely((if_getcapenable(adapter->netdev) & IFCAP_RXCSUM) &&
1484 device_printf(adapter->dev,"rx ipv4 header checksum error\n");
1489 if (unlikely((if_getcapenable(adapter->netdev) & IFCAP_RXCSUM_IPV6) &&
1492 device_printf(adapter->dev,"rx ipv6 header checksum error\n");
1500 device_printf_dbg(adapter->dev, "rx L4 checksum error\n");
1505 device_printf_dbg(adapter->dev, "rx checksum correct\n");
1515 al_eth_rx_mbuf(struct al_eth_adapter *adapter,
1525 device_printf_dbg(adapter->dev, "rx_info %p data %p\n", rx_info,
1540 if (len <= adapter->small_copy_len) {
1542 device_printf_dbg(adapter->dev, "rx small packet. len %d\n", len);
1544 AL_RX_LOCK(adapter);
1546 AL_RX_UNLOCK(adapter);
1548 device_printf(adapter->dev, "smbuf is NULL\n");
1619 mbuf = al_eth_rx_mbuf(rx_ring->adapter, rx_ring, hal_pkt, descs,
1631 al_eth_rx_checksum(rx_ring->adapter, hal_pkt, mbuf);
1665 refill_actual = al_eth_refill_rx_bufs(rx_ring->adapter, qid,
1722 struct al_eth_adapter *adapter = if_getsoftc(ifp);
1729 i = m->m_pkthdr.flowid % adapter->num_tx_queues;
1731 i = curcpu % adapter->num_tx_queues;
1738 tx_ring = &adapter->tx_ring[i];
1740 device_printf_dbg(adapter->dev, "dgb start() - assuming link is active, "
1763 al_eth_flow_ctrl_init(struct al_eth_adapter *adapter)
1770 adapter->link_config.flow_ctrl_supported = default_flow_ctrl;
1774 al_eth_flow_ctrl_config(struct al_eth_adapter *adapter)
1777 uint8_t active = adapter->link_config.flow_ctrl_active;
1780 flow_ctrl_params = &adapter->flow_ctrl_params;
1797 al_eth_flow_control_config(&adapter->hal_adapter, flow_ctrl_params);
1803 al_eth_flow_ctrl_enable(struct al_eth_adapter *adapter)
1810 adapter->link_config.flow_ctrl_active =
1811 adapter->link_config.flow_ctrl_supported;
1813 al_eth_flow_ctrl_config(adapter);
1817 al_eth_flow_ctrl_disable(struct al_eth_adapter *adapter)
1820 adapter->link_config.flow_ctrl_active = 0;
1821 al_eth_flow_ctrl_config(adapter);
1825 al_eth_hw_init(struct al_eth_adapter *adapter)
1829 rc = al_eth_hw_init_adapter(adapter);
1833 rc = al_eth_mac_config(&adapter->hal_adapter, adapter->mac_mode);
1835 device_printf(adapter->dev, "%s failed to configure mac!\n",
1840 if ((adapter->mac_mode == AL_ETH_MAC_MODE_SGMII) ||
1841 (adapter->mac_mode == AL_ETH_MAC_MODE_RGMII &&
1842 adapter->phy_exist == false)) {
1843 rc = al_eth_mac_link_config(&adapter->hal_adapter,
1844 adapter->link_config.force_1000_base_x,
1845 adapter->link_config.autoneg,
1846 adapter->link_config.active_speed,
1847 adapter->link_config.active_duplex);
1849 device_printf(adapter->dev,
1856 rc = al_eth_mdio_config(&adapter->hal_adapter,
1858 adapter->ref_clk_freq, adapter->mdio_freq);
1860 device_printf(adapter->dev, "%s failed at mdio config!\n",
1865 al_eth_flow_ctrl_init(adapter);
1871 al_eth_hw_stop(struct al_eth_adapter *adapter)
1874 al_eth_mac_stop(&adapter->hal_adapter);
1883 al_eth_adapter_stop(&adapter->hal_adapter);
1885 adapter->flags |= AL_ETH_FLAG_RESET_REQUESTED;
1888 al_eth_flow_ctrl_disable(adapter);
1901 struct al_eth_adapter *adapter = data;
1904 (struct unit_regs __iomem *)adapter->udma_base;
1910 device_printf_dbg(adapter->dev, "%s group A cause %x\n",
1921 device_printf_dbg(adapter->dev,
1926 device_printf(adapter->dev,
1932 device_printf_dbg(adapter->dev,
1940 device_printf_dbg(adapter->dev, "secondary B cause %x\n",
1942 for (qid = 0; qid < adapter->num_rx_queues; qid++) {
1946 (struct unit_regs __iomem *)adapter->udma_base,
1956 device_printf_dbg(adapter->dev, "secondary C cause %x\n", cause_c);
1957 for (qid = 0; qid < adapter->num_tx_queues; qid++) {
1960 (struct unit_regs __iomem *)adapter->udma_base,
1967 al_eth_tx_cmlp_irq_filter(adapter->tx_ring);
1975 struct al_eth_adapter *adapter = data;
1977 device_printf_dbg(adapter->dev, "%s\n", __func__);
1984 struct al_eth_adapter *adapter = data;
1986 device_printf_dbg(adapter->dev, "%s\n", __func__);
1991 al_eth_enable_msix(struct al_eth_adapter *adapter)
1995 device_printf_dbg(adapter->dev, "%s\n", __func__);
1996 msix_vecs = 1 + adapter->num_rx_queues + adapter->num_tx_queues;
1998 device_printf_dbg(adapter->dev,
2001 adapter->msix_entries = malloc(msix_vecs*sizeof(*adapter->msix_entries),
2004 adapter->msix_entries[AL_ETH_MGMT_IRQ_IDX].entry = 2;
2005 adapter->msix_entries[AL_ETH_MGMT_IRQ_IDX].vector = 0;
2008 for (i = 0; i < adapter->num_rx_queues; i++) {
2009 int irq_idx = AL_ETH_RXQ_IRQ_IDX(adapter, i);
2011 adapter->msix_entries[irq_idx].entry = 3 + i;
2012 adapter->msix_entries[irq_idx].vector = 0;
2015 for (i = 0; i < adapter->num_tx_queues; i++) {
2016 int irq_idx = AL_ETH_TXQ_IRQ_IDX(adapter, i);
2018 adapter->msix_entries[irq_idx].entry = 3 +
2020 adapter->msix_entries[irq_idx].vector = 0;
2024 rc = pci_alloc_msix(adapter->dev, &count);
2027 device_printf_dbg(adapter->dev, "failed to allocate MSIX "
2029 device_printf_dbg(adapter->dev, "ret = %d\n", rc);
2034 device_printf_dbg(adapter->dev, "failed to allocate all MSIX "
2041 adapter->msix_entries[i].vector = 2 + 1 + i;
2043 device_printf_dbg(adapter->dev, "successfully enabled MSIX,"
2046 adapter->msix_vecs = msix_vecs;
2047 adapter->flags |= AL_ETH_FLAG_MSIX_ENABLED;
2051 adapter->msix_vecs = 0;
2052 free(adapter->msix_entries, M_IFAL);
2053 adapter->msix_entries = NULL;
2060 al_eth_setup_int_mode(struct al_eth_adapter *adapter)
2064 rc = al_eth_enable_msix(adapter);
2066 device_printf(adapter->dev, "Failed to enable MSIX mode.\n");
2070 adapter->irq_vecs = max(1, adapter->msix_vecs);
2072 if (adapter->msix_vecs == 0) {
2073 snprintf(adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].name,
2075 device_get_name(adapter->dev));
2076 adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].handler =
2079 adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].vector = 0;
2080 adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].data = adapter;
2082 device_printf(adapter->dev, "%s and vector %d \n", __func__,
2083 adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].vector);
2088 if (adapter->msix_vecs == 1) {
2089 snprintf(adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].name,
2091 device_get_name(adapter->dev));
2092 adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].handler =
2094 adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].vector =
2095 adapter->msix_entries[AL_ETH_MGMT_IRQ_IDX].vector;
2096 adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].data = adapter;
2101 snprintf(adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].name, AL_ETH_IRQNAME_SIZE,
2102 "al-eth-msix-mgmt@pci:%s", device_get_name(adapter->dev));
2103 adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].handler = al_eth_intr_msix_mgmt;
2105 adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].data = adapter;
2106 adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].vector =
2107 adapter->msix_entries[AL_ETH_MGMT_IRQ_IDX].vector;
2109 for (i = 0; i < adapter->num_rx_queues; i++) {
2110 int irq_idx = AL_ETH_RXQ_IRQ_IDX(adapter, i);
2112 snprintf(adapter->irq_tbl[irq_idx].name, AL_ETH_IRQNAME_SIZE,
2114 device_get_name(adapter->dev));
2115 adapter->irq_tbl[irq_idx].handler = al_eth_rx_recv_irq_filter;
2116 adapter->irq_tbl[irq_idx].data = &adapter->rx_ring[i];
2117 adapter->irq_tbl[irq_idx].vector =
2118 adapter->msix_entries[irq_idx].vector;
2121 for (i = 0; i < adapter->num_tx_queues; i++) {
2122 int irq_idx = AL_ETH_TXQ_IRQ_IDX(adapter, i);
2124 snprintf(adapter->irq_tbl[irq_idx].name,
2126 device_get_name(adapter->dev));
2127 adapter->irq_tbl[irq_idx].handler = al_eth_tx_cmlp_irq_filter;
2128 adapter->irq_tbl[irq_idx].data = &adapter->tx_ring[i];
2129 adapter->irq_tbl[irq_idx].vector =
2130 adapter->msix_entries[irq_idx].vector;
2137 __al_eth_free_irq(struct al_eth_adapter *adapter)
2142 for (i = 0; i < adapter->irq_vecs; i++) {
2143 irq = &adapter->irq_tbl[i];
2145 device_printf_dbg(adapter->dev, "tear down irq: %d\n",
2147 rc = bus_teardown_intr(adapter->dev, irq->res,
2150 device_printf(adapter->dev, "failed to tear "
2158 al_eth_free_irq(struct al_eth_adapter *adapter)
2163 if (adapter->msix_vecs >= 1) {
2164 free_irq_cpu_rmap(adapter->netdev->rx_cpu_rmap);
2165 adapter->netdev->rx_cpu_rmap = NULL;
2169 __al_eth_free_irq(adapter);
2171 for (i = 0; i < adapter->irq_vecs; i++) {
2172 irq = &adapter->irq_tbl[i];
2175 device_printf_dbg(adapter->dev, "release resource irq: %d\n",
2177 rc = bus_release_resource(adapter->dev, SYS_RES_IRQ, irq->vector,
2181 device_printf(adapter->dev, "dev has no parent while "
2185 pci_release_msi(adapter->dev);
2187 adapter->flags &= ~AL_ETH_FLAG_MSIX_ENABLED;
2189 adapter->msix_vecs = 0;
2190 free(adapter->msix_entries, M_IFAL);
2191 adapter->msix_entries = NULL;
2195 al_eth_request_irq(struct al_eth_adapter *adapter)
2201 if ((adapter->flags & AL_ETH_FLAG_MSIX_ENABLED) != 0)
2206 for (i = 0; i < adapter->irq_vecs; i++) {
2207 irq = &adapter->irq_tbl[i];
2212 irq->res = bus_alloc_resource_any(adapter->dev, SYS_RES_IRQ,
2215 device_printf(adapter->dev, "could not allocate "
2221 if ((rc = bus_setup_intr(adapter->dev, irq->res,
2224 device_printf(adapter->dev, "failed to register "
2237 irq = &adapter->irq_tbl[v];
2238 bti = bus_teardown_intr(adapter->dev, irq->res, irq->cookie);
2240 device_printf(adapter->dev, "failed to tear "
2245 device_printf_dbg(adapter->dev, "exit_intr: releasing irq %d\n",
2253 irq = &adapter->irq_tbl[v];
2254 device_printf_dbg(adapter->dev, "exit_res: releasing resource"
2256 brr = bus_release_resource(adapter->dev, SYS_RES_IRQ,
2259 device_printf(adapter->dev, "dev has no parent while "
2270 * @adapter: network interface device structure
2276 al_eth_setup_tx_resources(struct al_eth_adapter *adapter, int qid)
2278 struct al_eth_ring *tx_ring = &adapter->tx_ring[qid];
2284 if (adapter->up)
2318 device_get_nameunit(adapter->dev));
2323 device_get_nameunit(adapter->dev));
2367 * @adapter: network interface device structure
2373 al_eth_free_tx_resources(struct al_eth_adapter *adapter, int qid)
2375 struct al_eth_ring *tx_ring = &adapter->tx_ring[qid];
2392 drbr_flush(adapter->netdev, tx_ring->br);
2424 * @adapter: board private structure
2429 al_eth_free_all_tx_resources(struct al_eth_adapter *adapter)
2433 for (i = 0; i < adapter->num_tx_queues; i++)
2434 if (adapter->tx_ring[i].q_params.desc_base)
2435 al_eth_free_tx_resources(adapter, i);
2440 * @adapter: network interface device structure
2446 al_eth_setup_rx_resources(struct al_eth_adapter *adapter, unsigned int qid)
2448 struct al_eth_ring *rx_ring = &adapter->rx_ring[qid];
2487 device_get_nameunit(adapter->dev));
2521 if ((if_getcapenable(adapter->netdev) & IFCAP_LRO) != 0) {
2524 device_printf(adapter->dev,
2527 device_printf_dbg(adapter->dev,
2530 rx_ring->lro.ifp = adapter->netdev;
2542 * @adapter: network interface device structure
2548 al_eth_free_rx_resources(struct al_eth_adapter *adapter, unsigned int qid)
2550 struct al_eth_ring *rx_ring = &adapter->rx_ring[qid];
2599 * @adapter: board private structure
2604 al_eth_free_all_rx_resources(struct al_eth_adapter *adapter)
2608 for (i = 0; i < adapter->num_rx_queues; i++)
2609 if (adapter->rx_ring[i].q_params.desc_base != 0)
2610 al_eth_free_rx_resources(adapter, i);
2615 * @adapter: board private structure
2620 al_eth_setup_all_rx_resources(struct al_eth_adapter *adapter)
2624 for (i = 0; i < adapter->num_rx_queues; i++) {
2625 rc = al_eth_setup_rx_resources(adapter, i);
2629 device_printf(adapter->dev, "Allocation for Rx Queue %u failed\n", i);
2637 al_eth_free_rx_resources(adapter, i);
2643 * @adapter: private structure
2648 al_eth_setup_all_tx_resources(struct al_eth_adapter *adapter)
2652 for (i = 0; i < adapter->num_tx_queues; i++) {
2653 rc = al_eth_setup_tx_resources(adapter, i);
2657 device_printf(adapter->dev,
2667 al_eth_free_tx_resources(adapter, i);
2673 al_eth_disable_int_sync(struct al_eth_adapter *adapter)
2677 if ((adapter->board_type == ALPINE_FPGA_NIC) ||
2678 (adapter->board_type == ALPINE_NIC)) {
2679 al_eth_forward_int_config((uint32_t*)adapter->internal_pcie_base +
2684 al_eth_interrupts_mask(adapter);
2688 al_eth_interrupts_unmask(struct al_eth_adapter *adapter)
2691 uint32_t group_b_mask = (1 << adapter->num_rx_queues) - 1;/* bit per Rx q*/
2692 uint32_t group_c_mask = (1 << adapter->num_tx_queues) - 1;/* bit per Tx q*/
2695 (struct unit_regs __iomem *)adapter->udma_base;
2697 if (adapter->int_mode == AL_IOFIC_MODE_LEGACY)
2713 al_eth_interrupts_mask(struct al_eth_adapter *adapter)
2716 (struct unit_regs __iomem *)adapter->udma_base;
2730 al_eth_configure_int_mode(struct al_eth_adapter *adapter)
2739 if (adapter->msix_vecs == 0)
2741 else if (adapter->msix_vecs > 1)
2744 device_printf(adapter->dev,
2749 if (adapter->board_type != ALPINE_INTEGRATED) {
2756 if (al_udma_iofic_config((struct unit_regs __iomem *)adapter->udma_base,
2759 device_printf(adapter->dev,
2763 adapter->int_mode = int_mode;
2764 device_printf_dbg(adapter->dev, "using %s interrupt mode\n",
2768 al_iofic_moder_res_config(&((struct unit_regs *)(adapter->udma_base))->gen.interrupt_regs.main_iofic, AL_INT_GROUP_B, 15);
2769 al_iofic_moder_res_config(&((struct unit_regs *)(adapter->udma_base))->gen.interrupt_regs.main_iofic, AL_INT_GROUP_C, 15);
2771 adapter->tx_usecs = 0;
2772 adapter->rx_usecs = 0;
2792 al_eth_update_stats(struct al_eth_adapter *adapter)
2794 struct al_eth_mac_stats *mac_stats = &adapter->mac_stats;
2796 if (adapter->up == 0)
2799 al_eth_mac_stats_get(&adapter->hal_adapter, mac_stats);
2807 struct al_eth_adapter *adapter;
2811 adapter = if_getsoftc(ifp);
2812 mac_stats = &adapter->mac_stats;
2863 struct al_eth_adapter *adapter = arg;
2865 al_eth_mac_table_unicast_add(adapter,
2880 al_eth_set_rx_mode(struct al_eth_adapter *adapter)
2882 if_t ifp = adapter->netdev;
2891 al_eth_mac_table_promiscuous_set(adapter, true);
2895 al_eth_mac_table_all_multicast_add(adapter,
2899 al_eth_mac_table_entry_clear(adapter,
2902 al_eth_mac_table_all_multicast_add(adapter,
2913 al_eth_mac_table_promiscuous_set(adapter, true);
2920 al_eth_mac_table_entry_clear(adapter, i);
2925 if_foreach_lladdr(ifp, al_program_addr, adapter);
2927 al_eth_mac_table_promiscuous_set(adapter, false);
2932 al_eth_config_rx_fwd(struct al_eth_adapter *adapter)
2939 al_eth_fwd_pbits_table_set(&adapter->hal_adapter, i, i);
2943 al_eth_fwd_priority_table_set(&adapter->hal_adapter, i, i >> 1);
2951 al_eth_ctrl_table_def_set(&adapter->hal_adapter, AL_FALSE, &entry);
2957 al_eth_mac_table_unicast_add(adapter, AL_ETH_MAC_TABLE_UNICAST_IDX_BASE,
2959 al_eth_mac_table_broadcast_add(adapter, AL_ETH_MAC_TABLE_BROADCAST_IDX, 1);
2960 al_eth_mac_table_promiscuous_set(adapter, false);
2963 for (i = 0; i < sizeof(adapter->toeplitz_hash_key); i++)
2964 *((uint8_t*)adapter->toeplitz_hash_key + i) = (uint8_t)random();
2967 al_eth_hash_key_set(&adapter->hal_adapter, i,
2968 htonl(adapter->toeplitz_hash_key[i]));
2971 adapter->rss_ind_tbl[i] = ethtool_rxfh_indir_default(i,
2973 al_eth_set_thash_table_entry(adapter, i, 0,
2974 adapter->rss_ind_tbl[i]);
2977 al_eth_fsm_table_init(adapter);
2981 al_eth_req_rx_buff_size(struct al_eth_adapter *adapter, int size)
2989 adapter->rx_mbuf_sz = MCLBYTES;
2991 if (adapter->max_rx_buff_alloc_size > 2048)
2992 adapter->rx_mbuf_sz = MJUMPAGESIZE;
2997 if (adapter->max_rx_buff_alloc_size > 4096)
2998 adapter->rx_mbuf_sz = MJUM9BYTES;
3003 if (adapter->max_rx_buff_alloc_size > 9216)
3004 adapter->rx_mbuf_sz = MJUM16BYTES;
3011 al_eth_change_mtu(struct al_eth_adapter *adapter, int new_mtu)
3016 al_eth_req_rx_buff_size(adapter, new_mtu);
3018 device_printf_dbg(adapter->dev, "set MTU to %d\n", new_mtu);
3019 al_eth_rx_pkt_limit_config(&adapter->hal_adapter,
3022 al_eth_tso_mss_config(&adapter->hal_adapter, 0, new_mtu - 100);
3028 al_eth_check_mtu(struct al_eth_adapter *adapter, int new_mtu)
3041 al_eth_udma_queue_enable(struct al_eth_adapter *adapter, enum al_udma_type type,
3049 q_params = &adapter->tx_ring[qid].q_params;
3051 q_params = &adapter->rx_ring[qid].q_params;
3053 rc = al_eth_queue_config(&adapter->hal_adapter, type, qid, q_params);
3055 device_printf(adapter->dev, "config %s queue %u failed\n", name,
3063 al_eth_udma_queues_enable_all(struct al_eth_adapter *adapter)
3067 for (i = 0; i < adapter->num_tx_queues; i++)
3068 al_eth_udma_queue_enable(adapter, UDMA_TX, i);
3070 for (i = 0; i < adapter->num_rx_queues; i++)
3071 al_eth_udma_queue_enable(adapter, UDMA_RX, i);
3077 al_eth_up_complete(struct al_eth_adapter *adapter)
3080 al_eth_configure_int_mode(adapter);
3081 al_eth_config_rx_fwd(adapter);
3082 al_eth_change_mtu(adapter, if_getmtu(adapter->netdev));
3083 al_eth_udma_queues_enable_all(adapter);
3084 al_eth_refill_all_rx_bufs(adapter);
3085 al_eth_interrupts_unmask(adapter);
3088 if ((adapter->board_type == ALPINE_FPGA_NIC) ||
3089 (adapter->board_type == ALPINE_NIC)) {
3090 al_eth_forward_int_config((uint32_t*)adapter->internal_pcie_base +
3094 al_eth_flow_ctrl_enable(adapter);
3096 mtx_lock(&adapter->stats_mtx);
3097 callout_reset(&adapter->stats_callout, hz, al_tick_stats, (void*)adapter);
3098 mtx_unlock(&adapter->stats_mtx);
3100 al_eth_mac_start(&adapter->hal_adapter);
3106 struct al_eth_adapter *adapter = if_getsoftc(ifp);
3109 mii_mediachg(adapter->mii);
3137 struct al_eth_adapter *adapter = arg;
3139 mii_tick(adapter->mii);
3142 callout_schedule(&adapter->wd_callout, hz);
3148 struct al_eth_adapter *adapter = arg;
3150 al_eth_update_stats(adapter);
3152 callout_schedule(&adapter->stats_callout, hz);
3156 al_eth_up(struct al_eth_adapter *adapter)
3158 if_t ifp = adapter->netdev;
3161 if (adapter->up)
3164 if ((adapter->flags & AL_ETH_FLAG_RESET_REQUESTED) != 0) {
3165 al_eth_function_reset(adapter);
3166 adapter->flags &= ~AL_ETH_FLAG_RESET_REQUESTED;
3177 al_eth_serdes_init(adapter);
3179 rc = al_eth_hw_init(adapter);
3183 rc = al_eth_setup_int_mode(adapter);
3185 device_printf(adapter->dev,
3191 rc = al_eth_setup_all_tx_resources(adapter);
3196 rc = al_eth_setup_all_rx_resources(adapter);
3200 rc = al_eth_request_irq(adapter);
3204 al_eth_up_complete(adapter);
3206 adapter->up = true;
3208 if (adapter->mac_mode == AL_ETH_MAC_MODE_10GbE_Serial)
3209 if_link_state_change(adapter->netdev, LINK_STATE_UP);
3211 if (adapter->mac_mode == AL_ETH_MAC_MODE_RGMII) {
3212 mii_mediachg(adapter->mii);
3215 mtx_lock(&adapter->wd_mtx);
3216 callout_reset(&adapter->wd_callout, hz, al_tick, adapter);
3217 mtx_unlock(&adapter->wd_mtx);
3219 mii_pollstat(adapter->mii);
3225 al_eth_free_all_rx_resources(adapter);
3227 al_eth_free_all_tx_resources(adapter);
3229 al_eth_free_irq(adapter);
3231 al_eth_hw_stop(adapter);
3233 al_eth_function_reset(adapter);
3241 struct al_eth_adapter *adapter = device_get_softc(dev);
3243 al_eth_down(adapter);
3249 al_eth_down(struct al_eth_adapter *adapter)
3252 device_printf_dbg(adapter->dev, "al_eth_down: begin\n");
3254 adapter->up = false;
3256 mtx_lock(&adapter->wd_mtx);
3257 callout_stop(&adapter->wd_callout);
3258 mtx_unlock(&adapter->wd_mtx);
3260 al_eth_disable_int_sync(adapter);
3262 mtx_lock(&adapter->stats_mtx);
3263 callout_stop(&adapter->stats_callout);
3264 mtx_unlock(&adapter->stats_mtx);
3266 al_eth_free_irq(adapter);
3267 al_eth_hw_stop(adapter);
3269 al_eth_free_all_tx_resources(adapter);
3270 al_eth_free_all_rx_resources(adapter);
3276 struct al_eth_adapter *adapter = if_getsoftc(ifp);
3283 error = al_eth_check_mtu(adapter, ifr->ifr_mtu);
3285 device_printf(adapter->dev, "ioctl wrong mtu %u\n",
3286 if_getmtu(adapter->netdev));
3291 if_setmtu(adapter->netdev, ifr->ifr_mtu);
3292 al_init(adapter);
3298 if (((if_getflags(ifp) ^ adapter->if_flags) &
3300 device_printf_dbg(adapter->dev,
3302 al_eth_set_rx_mode(adapter);
3305 error = al_eth_up(adapter);
3311 al_eth_down(adapter);
3316 adapter->if_flags = if_getflags(ifp);
3322 device_printf_dbg(adapter->dev,
3324 al_eth_set_rx_mode(adapter);
3332 if (adapter->mii != NULL)
3334 &adapter->mii->mii_media, command);
3337 &adapter->media, command);
3389 al_init(adapter);
3422 struct al_eth_adapter *adapter = device_get_softc(dev);
3428 rc = al_eth_mdio_read(&adapter->hal_adapter, adapter->phy_addr,
3434 device_printf_dbg(adapter->dev,
3442 device_printf(adapter->dev, "MDIO read failed on timeout\n");
3450 struct al_eth_adapter *adapter = device_get_softc(dev);
3455 rc = al_eth_mdio_write(&adapter->hal_adapter, adapter->phy_addr,
3461 device_printf(adapter->dev,
3469 device_printf(adapter->dev, "MDIO write failed on timeout\n");
3477 struct al_eth_adapter *adapter = device_get_softc(dev);
3479 device_printf_dbg(adapter->dev,
3481 device_printf_dbg(adapter->dev,
3483 adapter->mii->mii_media_active, adapter->mii->mii_media_status);
3485 if (adapter->up == 0)
3488 if ((adapter->mii->mii_media_status & IFM_AVALID) != 0) {
3489 if (adapter->mii->mii_media_status & IFM_ACTIVE) {
3490 device_printf(adapter->dev, "link is UP\n");
3491 if_link_state_change(adapter->netdev, LINK_STATE_UP);
3493 device_printf(adapter->dev, "link is DOWN\n");
3494 if_link_state_change(adapter->netdev, LINK_STATE_DOWN);
3502 struct al_eth_adapter *adapter = device_get_softc(dev);
3506 if (adapter->mii == NULL)
3509 if ((if_getflags(adapter->netdev) & IFF_UP) == 0)
3513 if ((adapter->mii->mii_media_status & (IFM_AVALID | IFM_ACTIVE)) !=
3518 if ((adapter->mii->mii_media_active & IFM_FDX) != 0)
3521 speed = IFM_SUBTYPE(adapter->mii->mii_media_active);
3524 al_eth_mac_link_config(&adapter->hal_adapter, 0, 1,
3530 al_eth_mac_link_config(&adapter->hal_adapter, 0, 1,
3536 al_eth_mac_link_config(&adapter->hal_adapter, 0, 1,
3541 device_printf(adapter->dev, "ERROR: unknown MII media active 0x%08x\n",
3542 adapter->mii->mii_media_active);