Lines Matching +full:udma +full:- +full:p

1 /*-
120 #define AL_ETH_MAC_TABLE_DROP_IDX (AL_ETH_FWD_MAC_NUM - 1)
121 #define AL_ETH_MAC_TABLE_BROADCAST_IDX (AL_ETH_MAC_TABLE_DROP_IDX - 1)
175 #define AL_RX_LOCK_INIT(_sc) mtx_init(&((_sc)->if_rx_lock), "ALRXL", "ALRXL", MTX_DEF)
176 #define AL_RX_LOCK(_sc) mtx_lock(&((_sc)->if_rx_lock))
177 #define AL_RX_UNLOCK(_sc) mtx_unlock(&((_sc)->if_rx_lock))
231 /* flag for napi-like mbuf processing, controlled from sysctl */
291 CTLFLAG_RW, &napi, 0, "Use pseudo-napi mechanism"); in al_attach()
294 adapter->dev = dev; in al_attach()
295 adapter->board_type = ALPINE_INTEGRATED; in al_attach()
296 snprintf(adapter->name, AL_ETH_NAME_MAX_LEN, "%s", in al_attach()
303 adapter->udma_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, in al_attach()
305 if (adapter->udma_res == NULL) { in al_attach()
306 device_printf(adapter->dev, in al_attach()
311 adapter->udma_base = al_bus_dma_to_va(rman_get_bustag(adapter->udma_res), in al_attach()
312 rman_get_bushandle(adapter->udma_res)); in al_attach()
314 adapter->mac_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, in al_attach()
316 if (adapter->mac_res == NULL) { in al_attach()
317 device_printf(adapter->dev, in al_attach()
322 adapter->mac_base = al_bus_dma_to_va(rman_get_bustag(adapter->mac_res), in al_attach()
323 rman_get_bushandle(adapter->mac_res)); in al_attach()
326 adapter->ec_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &bar_ec, in al_attach()
328 if (adapter->ec_res == NULL) { in al_attach()
329 device_printf(adapter->dev, in al_attach()
334 adapter->ec_base = al_bus_dma_to_va(rman_get_bustag(adapter->ec_res), in al_attach()
335 rman_get_bushandle(adapter->ec_res)); in al_attach()
337 adapter->netdev = ifp = if_alloc(IFT_ETHER); in al_attach()
351 adapter->if_flags = if_getflags(ifp); in al_attach()
361 adapter->id_number = g_adapters_count; in al_attach()
363 if (adapter->board_type == ALPINE_INTEGRATED) { in al_attach()
364 dev_id = pci_get_device(adapter->dev); in al_attach()
365 rev_id = pci_get_revid(adapter->dev); in al_attach()
367 al_eth_fpga_read_pci_config(adapter->internal_pcie_base, in al_attach()
369 al_eth_fpga_read_pci_config(adapter->internal_pcie_base, in al_attach()
373 adapter->dev_id = dev_id; in al_attach()
374 adapter->rev_id = rev_id; in al_attach()
377 adapter->tx_ring_count = AL_ETH_DEFAULT_TX_SW_DESCS; in al_attach()
378 adapter->tx_descs_count = AL_ETH_DEFAULT_TX_HW_DESCS; in al_attach()
379 adapter->rx_ring_count = AL_ETH_DEFAULT_RX_DESCS; in al_attach()
380 adapter->rx_descs_count = AL_ETH_DEFAULT_RX_DESCS; in al_attach()
382 adapter->num_tx_queues = AL_ETH_NUM_QUEUES; in al_attach()
383 adapter->num_rx_queues = AL_ETH_NUM_QUEUES; in al_attach()
385 adapter->small_copy_len = AL_ETH_DEFAULT_SMALL_PACKET_LEN; in al_attach()
386 adapter->link_poll_interval = AL_ETH_DEFAULT_LINK_POLL_INTERVAL; in al_attach()
387 adapter->max_rx_buff_alloc_size = AL_ETH_DEFAULT_MAX_RX_BUFF_ALLOC_SIZE; in al_attach()
389 al_eth_req_rx_buff_size(adapter, if_getmtu(adapter->netdev)); in al_attach()
391 adapter->link_config.force_1000_base_x = AL_ETH_DEFAULT_FORCE_1000_BASEX; in al_attach()
397 if (adapter->mac_mode == AL_ETH_MAC_MODE_10GbE_Serial) { in al_attach()
398 ifmedia_init(&adapter->media, IFM_IMASK, in al_attach()
400 ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_LX, 0, NULL); in al_attach()
401 ifmedia_add(&adapter->media, IFM_ETHER | IFM_10G_LR, 0, NULL); in al_attach()
402 ifmedia_add(&adapter->media, IFM_ETHER | IFM_AUTO, 0, NULL); in al_attach()
403 ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO); in al_attach()
416 mtx_init(&adapter->stats_mtx, "AlStatsMtx", NULL, MTX_DEF); in al_attach()
417 mtx_init(&adapter->wd_mtx, "AlWdMtx", NULL, MTX_DEF); in al_attach()
418 callout_init_mtx(&adapter->stats_callout, &adapter->stats_mtx, 0); in al_attach()
419 callout_init_mtx(&adapter->wd_callout, &adapter->wd_mtx, 0); in al_attach()
421 ether_ifattach(ifp, adapter->mac_addr); in al_attach()
424 if (adapter->mac_mode == AL_ETH_MAC_MODE_RGMII) { in al_attach()
428 err = mii_attach(adapter->dev, &adapter->miibus, adapter->netdev, in al_attach()
432 device_printf(adapter->dev, "attaching PHYs failed\n"); in al_attach()
436 adapter->mii = device_get_softc(adapter->miibus); in al_attach()
442 bus_release_resource(dev, SYS_RES_MEMORY, bar_ec, adapter->ec_res); in al_attach()
444 bus_release_resource(dev, SYS_RES_MEMORY, bar_mac, adapter->mac_res); in al_attach()
446 bus_release_resource(dev, SYS_RES_MEMORY, bar_udma, adapter->udma_res); in al_attach()
457 ether_ifdetach(adapter->netdev); in al_detach()
459 mtx_destroy(&adapter->stats_mtx); in al_detach()
460 mtx_destroy(&adapter->wd_mtx); in al_detach()
464 bus_release_resource(dev, SYS_RES_IRQ, 0, adapter->irq_res); in al_detach()
465 bus_release_resource(dev, SYS_RES_MEMORY, 0, adapter->ec_res); in al_detach()
466 bus_release_resource(dev, SYS_RES_MEMORY, 0, adapter->mac_res); in al_detach()
467 bus_release_resource(dev, SYS_RES_MEMORY, 0, adapter->udma_res); in al_detach()
528 adapter->serdes_init = false; in al_eth_serdes_init()
530 serdes_base = alpine_serdes_resource_get(adapter->serdes_grp); in al_eth_serdes_init()
532 device_printf(adapter->dev, "serdes_base get failed!\n"); in al_eth_serdes_init()
538 al_serdes_handle_grp_init(serdes_base, adapter->serdes_grp, in al_eth_serdes_init()
539 &adapter->serdes_obj); in al_eth_serdes_init()
541 adapter->serdes_init = true; in al_eth_serdes_init()
550 *paddr = segs->ds_addr; in al_dma_map_addr()
558 uint32_t maxsize = ((size - 1)/PAGE_SIZE + 1) * PAGE_SIZE; in al_dma_alloc_coherent()
603 memcpy(entry.addr, adapter->mac_addr, sizeof(adapter->mac_addr)); in al_eth_mac_table_unicast_add()
611 device_printf_dbg(adapter->dev, in al_eth_mac_table_unicast_add()
615 al_eth_fwd_mac_table_set(&adapter->hal_adapter, idx, &entry); in al_eth_mac_table_unicast_add()
634 device_printf_dbg(adapter->dev, in al_eth_mac_table_all_multicast_add()
638 al_eth_fwd_mac_table_set(&adapter->hal_adapter, idx, &entry); in al_eth_mac_table_all_multicast_add()
655 device_printf_dbg(adapter->dev, in al_eth_mac_table_broadcast_add()
659 al_eth_fwd_mac_table_set(&adapter->hal_adapter, idx, &entry); in al_eth_mac_table_broadcast_add()
676 device_printf_dbg(adapter->dev, "%s: %s promiscuous mode\n", in al_eth_mac_table_promiscuous_set()
679 al_eth_fwd_mac_table_set(&adapter->hal_adapter, in al_eth_mac_table_promiscuous_set()
685 uint8_t udma, uint32_t queue) in al_eth_set_thash_table_entry() argument
688 if (udma != 0) in al_eth_set_thash_table_entry()
694 al_eth_thash_table_set(&adapter->hal_adapter, idx, udma, queue); in al_eth_set_thash_table_entry()
723 al_eth_fsm_table_set(&adapter->hal_adapter, i, val); in al_eth_fsm_table_init()
733 device_printf_dbg(adapter->dev, "%s: clear entry %d\n", __func__, idx); in al_eth_mac_table_entry_clear()
735 al_eth_fwd_mac_table_set(&adapter->hal_adapter, idx, &entry); in al_eth_mac_table_entry_clear()
741 struct al_eth_adapter_params *params = &adapter->eth_hal_params; in al_eth_hw_init_adapter()
744 /* params->dev_id = adapter->dev_id; */ in al_eth_hw_init_adapter()
745 params->rev_id = adapter->rev_id; in al_eth_hw_init_adapter()
746 params->udma_id = 0; in al_eth_hw_init_adapter()
747 params->enable_rx_parser = 1; /* enable rx epe parser*/ in al_eth_hw_init_adapter()
748 params->udma_regs_base = adapter->udma_base; /* UDMA register base address */ in al_eth_hw_init_adapter()
749 params->ec_regs_base = adapter->ec_base; /* Ethernet controller registers base address */ in al_eth_hw_init_adapter()
750 params->mac_regs_base = adapter->mac_base; /* Ethernet MAC registers base address */ in al_eth_hw_init_adapter()
751 params->name = adapter->name; in al_eth_hw_init_adapter()
752 params->serdes_lane = adapter->serdes_lane; in al_eth_hw_init_adapter()
754 rc = al_eth_adapter_init(&adapter->hal_adapter, params); in al_eth_hw_init_adapter()
756 device_printf(adapter->dev, "%s failed at hal init!\n", in al_eth_hw_init_adapter()
759 if ((adapter->board_type == ALPINE_NIC) || in al_eth_hw_init_adapter()
760 (adapter->board_type == ALPINE_FPGA_NIC)) { in al_eth_hw_init_adapter()
761 /* in pcie NIC mode, force eth UDMA to access PCIE0 using the vmid */ in al_eth_hw_init_adapter()
772 al_udma_gen_tgtid_conf_set(adapter->udma_base, &conf); in al_eth_hw_init_adapter()
783 params.adapter = &adapter->hal_adapter; in al_eth_lm_config()
784 params.serdes_obj = &adapter->serdes_obj; in al_eth_lm_config()
785 params.lane = adapter->serdes_lane; in al_eth_lm_config()
786 params.sfp_detection = adapter->sfp_detection_needed; in al_eth_lm_config()
787 if (adapter->sfp_detection_needed == true) { in al_eth_lm_config()
788 params.sfp_bus_id = adapter->i2c_adapter_id; in al_eth_lm_config()
792 if (adapter->sfp_detection_needed == false) { in al_eth_lm_config()
793 switch (adapter->mac_mode) { in al_eth_lm_config()
795 if ((adapter->lt_en != 0) && (adapter->an_en != 0)) in al_eth_lm_config()
809 params.link_training = adapter->lt_en; in al_eth_lm_config()
811 params.static_values = !adapter->dont_override_serdes; in al_eth_lm_config()
815 params.retimer_exist = adapter->retimer.exist; in al_eth_lm_config()
816 params.retimer_bus_id = adapter->retimer.bus_id; in al_eth_lm_config()
817 params.retimer_i2c_addr = adapter->retimer.i2c_addr; in al_eth_lm_config()
818 params.retimer_channel = adapter->retimer.channel; in al_eth_lm_config()
820 al_eth_lm_init(&adapter->lm_context, &params); in al_eth_lm_config()
827 if (adapter->board_type == ALPINE_NIC) { in al_eth_board_params_init()
828 adapter->mac_mode = AL_ETH_MAC_MODE_10GbE_Serial; in al_eth_board_params_init()
829 adapter->sfp_detection_needed = false; in al_eth_board_params_init()
830 adapter->phy_exist = false; in al_eth_board_params_init()
831 adapter->an_en = false; in al_eth_board_params_init()
832 adapter->lt_en = false; in al_eth_board_params_init()
833 adapter->ref_clk_freq = AL_ETH_REF_FREQ_375_MHZ; in al_eth_board_params_init()
834 adapter->mdio_freq = AL_ETH_DEFAULT_MDIO_FREQ_KHZ; in al_eth_board_params_init()
835 } else if (adapter->board_type == ALPINE_FPGA_NIC) { in al_eth_board_params_init()
836 adapter->mac_mode = AL_ETH_MAC_MODE_SGMII; in al_eth_board_params_init()
837 adapter->sfp_detection_needed = false; in al_eth_board_params_init()
838 adapter->phy_exist = false; in al_eth_board_params_init()
839 adapter->an_en = false; in al_eth_board_params_init()
840 adapter->lt_en = false; in al_eth_board_params_init()
841 adapter->ref_clk_freq = AL_ETH_REF_FREQ_375_MHZ; in al_eth_board_params_init()
842 adapter->mdio_freq = AL_ETH_DEFAULT_MDIO_FREQ_KHZ; in al_eth_board_params_init()
847 adapter->auto_speed = false; in al_eth_board_params_init()
849 rc = al_eth_board_params_get(adapter->mac_base, &params); in al_eth_board_params_init()
851 device_printf(adapter->dev, in al_eth_board_params_init()
853 return (-1); in al_eth_board_params_init()
856 adapter->phy_exist = params.phy_exist == true; in al_eth_board_params_init()
857 adapter->phy_addr = params.phy_mdio_addr; in al_eth_board_params_init()
858 adapter->an_en = params.autoneg_enable; in al_eth_board_params_init()
859 adapter->lt_en = params.kr_lt_enable; in al_eth_board_params_init()
860 adapter->serdes_grp = params.serdes_grp; in al_eth_board_params_init()
861 adapter->serdes_lane = params.serdes_lane; in al_eth_board_params_init()
862 adapter->sfp_detection_needed = params.sfp_plus_module_exist; in al_eth_board_params_init()
863 adapter->i2c_adapter_id = params.i2c_adapter_id; in al_eth_board_params_init()
864 adapter->ref_clk_freq = params.ref_clk_freq; in al_eth_board_params_init()
865 adapter->dont_override_serdes = params.dont_override_serdes; in al_eth_board_params_init()
866 adapter->link_config.active_duplex = !params.half_duplex; in al_eth_board_params_init()
867 adapter->link_config.autoneg = !params.an_disable; in al_eth_board_params_init()
868 adapter->link_config.force_1000_base_x = params.force_1000_base_x; in al_eth_board_params_init()
869 adapter->retimer.exist = params.retimer_exist; in al_eth_board_params_init()
870 adapter->retimer.bus_id = params.retimer_bus_id; in al_eth_board_params_init()
871 adapter->retimer.i2c_addr = params.retimer_i2c_addr; in al_eth_board_params_init()
872 adapter->retimer.channel = params.retimer_channel; in al_eth_board_params_init()
876 device_printf(adapter->dev, in al_eth_board_params_init()
879 adapter->link_config.active_speed = 1000; in al_eth_board_params_init()
882 adapter->link_config.active_speed = 100; in al_eth_board_params_init()
885 adapter->link_config.active_speed = 10; in al_eth_board_params_init()
891 device_printf(adapter->dev, in al_eth_board_params_init()
895 adapter->mdio_freq = AL_ETH_DEFAULT_MDIO_FREQ_KHZ; in al_eth_board_params_init()
898 adapter->mdio_freq = AL_ETH_MDIO_FREQ_1000_KHZ; in al_eth_board_params_init()
906 adapter->mac_mode = AL_ETH_MAC_MODE_SGMII; in al_eth_board_params_init()
908 adapter->mac_mode = AL_ETH_MAC_MODE_RGMII; in al_eth_board_params_init()
910 adapter->use_lm = false; in al_eth_board_params_init()
913 adapter->mac_mode = AL_ETH_MAC_MODE_SGMII; in al_eth_board_params_init()
914 adapter->use_lm = true; in al_eth_board_params_init()
917 adapter->mac_mode = AL_ETH_MAC_MODE_10GbE_Serial; in al_eth_board_params_init()
918 adapter->use_lm = true; in al_eth_board_params_init()
921 adapter->sfp_detection_needed = true; in al_eth_board_params_init()
922 adapter->auto_speed = false; in al_eth_board_params_init()
923 adapter->use_lm = true; in al_eth_board_params_init()
926 adapter->sfp_detection_needed = true; in al_eth_board_params_init()
927 adapter->auto_speed = true; in al_eth_board_params_init()
928 adapter->mac_mode_set = false; in al_eth_board_params_init()
929 adapter->use_lm = true; in al_eth_board_params_init()
931 adapter->mac_mode = AL_ETH_MAC_MODE_10GbE_Serial; in al_eth_board_params_init()
934 device_printf(adapter->dev, in al_eth_board_params_init()
937 return (-1); in al_eth_board_params_init()
940 device_printf(adapter->dev, in al_eth_board_params_init()
944 params.phy_mdio_addr, adapter->mdio_freq, in al_eth_board_params_init()
949 al_eth_mac_addr_read(adapter->ec_base, 0, adapter->mac_addr); in al_eth_board_params_init()
961 al_eth_board_params_get(adapter->mac_base, &params); in al_eth_function_reset()
962 al_eth_mac_addr_read(adapter->ec_base, 0, adapter->mac_addr); in al_eth_function_reset()
963 if (adapter->board_type == ALPINE_INTEGRATED) in al_eth_function_reset()
966 adapter->dev, adapter->mac_base); in al_eth_function_reset()
970 adapter->internal_pcie_base, adapter->mac_base); in al_eth_function_reset()
973 al_eth_board_params_set(adapter->mac_base, &params); in al_eth_function_reset()
974 al_eth_mac_addr_store(adapter->ec_base, 0, adapter->mac_addr); in al_eth_function_reset()
984 for (i = 0; i < adapter->num_tx_queues; i++) { in al_eth_init_rings()
985 struct al_eth_ring *ring = &adapter->tx_ring[i]; in al_eth_init_rings()
987 ring->ring_id = i; in al_eth_init_rings()
988 ring->dev = adapter->dev; in al_eth_init_rings()
989 ring->adapter = adapter; in al_eth_init_rings()
990 ring->netdev = adapter->netdev; in al_eth_init_rings()
991 al_udma_q_handle_get(&adapter->hal_adapter.tx_udma, i, in al_eth_init_rings()
992 &ring->dma_q); in al_eth_init_rings()
993 ring->sw_count = adapter->tx_ring_count; in al_eth_init_rings()
994 ring->hw_count = adapter->tx_descs_count; in al_eth_init_rings()
995 …ring->unmask_reg_offset = al_udma_iofic_unmask_offset_get((struct unit_regs *)adapter->udma_base, … in al_eth_init_rings()
996 ring->unmask_val = ~(1 << i); in al_eth_init_rings()
999 for (i = 0; i < adapter->num_rx_queues; i++) { in al_eth_init_rings()
1000 struct al_eth_ring *ring = &adapter->rx_ring[i]; in al_eth_init_rings()
1002 ring->ring_id = i; in al_eth_init_rings()
1003 ring->dev = adapter->dev; in al_eth_init_rings()
1004 ring->adapter = adapter; in al_eth_init_rings()
1005 ring->netdev = adapter->netdev; in al_eth_init_rings()
1006 al_udma_q_handle_get(&adapter->hal_adapter.rx_udma, i, &ring->dma_q); in al_eth_init_rings()
1007 ring->sw_count = adapter->rx_ring_count; in al_eth_init_rings()
1008 ring->hw_count = adapter->rx_descs_count; in al_eth_init_rings()
1009 ring->unmask_reg_offset = al_udma_iofic_unmask_offset_get( in al_eth_init_rings()
1010 (struct unit_regs *)adapter->udma_base, in al_eth_init_rings()
1012 ring->unmask_val = ~(1 << i); in al_eth_init_rings()
1020 if_t ifp = adapter->netdev; in al_init_locked()
1049 if (rx_info->m != NULL) in al_eth_alloc_rx_buf()
1052 rx_info->data_size = adapter->rx_mbuf_sz; in al_eth_alloc_rx_buf()
1057 rx_info->m = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR, in al_eth_alloc_rx_buf()
1058 rx_info->data_size); in al_eth_alloc_rx_buf()
1061 if (rx_info->m == NULL) in al_eth_alloc_rx_buf()
1064 rx_info->m->m_pkthdr.len = rx_info->m->m_len = adapter->rx_mbuf_sz; in al_eth_alloc_rx_buf()
1067 error = bus_dmamap_load_mbuf_sg(rx_ring->dma_buf_tag, rx_info->dma_map, in al_eth_alloc_rx_buf()
1068 rx_info->m, segs, &nsegs, BUS_DMA_NOWAIT); in al_eth_alloc_rx_buf()
1070 device_printf(rx_ring->dev, "failed to map mbuf, error = %d\n", in al_eth_alloc_rx_buf()
1072 m_freem(rx_info->m); in al_eth_alloc_rx_buf()
1073 rx_info->m = NULL; in al_eth_alloc_rx_buf()
1077 al_buf = &rx_info->al_buf; in al_eth_alloc_rx_buf()
1078 al_buf->addr = segs[0].ds_addr + AL_IP_ALIGNMENT_OFFSET; in al_eth_alloc_rx_buf()
1079 al_buf->len = rx_info->data_size - AL_IP_ALIGNMENT_OFFSET; in al_eth_alloc_rx_buf()
1088 struct al_eth_ring *rx_ring = &adapter->rx_ring[qid]; in al_eth_refill_rx_bufs()
1092 next_to_use = rx_ring->next_to_use; in al_eth_refill_rx_bufs()
1097 &rx_ring->rx_buffer_info[next_to_use]; in al_eth_refill_rx_bufs()
1101 device_printf(adapter->dev, in al_eth_refill_rx_bufs()
1106 rc = al_eth_rx_buffer_add(rx_ring->dma_q, in al_eth_refill_rx_bufs()
1107 &rx_info->al_buf, AL_ETH_RX_FLAGS_INT, NULL); in al_eth_refill_rx_bufs()
1109 device_printf(adapter->dev, in al_eth_refill_rx_bufs()
1118 device_printf(adapter->dev, in al_eth_refill_rx_bufs()
1119 "refilled rx queue %d with %d pages only - available %d\n", in al_eth_refill_rx_bufs()
1120 qid, i, al_udma_available_get(rx_ring->dma_q)); in al_eth_refill_rx_bufs()
1123 al_eth_rx_buffer_action(rx_ring->dma_q, i); in al_eth_refill_rx_bufs()
1125 rx_ring->next_to_use = next_to_use; in al_eth_refill_rx_bufs()
1131 * al_eth_refill_all_rx_bufs - allocate all queues Rx buffers
1139 for (i = 0; i < adapter->num_rx_queues; i++) in al_eth_refill_all_rx_bufs()
1140 al_eth_refill_rx_bufs(adapter, i, AL_ETH_DEFAULT_RX_DESCS - 1); in al_eth_refill_all_rx_bufs()
1148 int qid = tx_ring->ring_id; in al_eth_tx_do_cleanup()
1150 total_done = al_eth_comp_tx_get(tx_ring->dma_q); in al_eth_tx_do_cleanup()
1151 device_printf_dbg(tx_ring->dev, in al_eth_tx_do_cleanup()
1153 next_to_clean = tx_ring->next_to_clean; in al_eth_tx_do_cleanup()
1159 tx_info = &tx_ring->tx_buffer_info[next_to_clean]; in al_eth_tx_do_cleanup()
1161 if (tx_info->tx_descs > total_done) in al_eth_tx_do_cleanup()
1164 mbuf = tx_info->m; in al_eth_tx_do_cleanup()
1166 tx_info->m = NULL; in al_eth_tx_do_cleanup()
1168 device_printf_dbg(tx_ring->dev, in al_eth_tx_do_cleanup()
1169 "tx_poll: q %d mbuf %p completed\n", qid, mbuf); in al_eth_tx_do_cleanup()
1172 bus_dmamap_unload(tx_ring->dma_buf_tag, tx_info->dma_map); in al_eth_tx_do_cleanup()
1175 total_done -= tx_info->tx_descs; in al_eth_tx_do_cleanup()
1179 tx_ring->next_to_clean = next_to_clean; in al_eth_tx_do_cleanup()
1181 device_printf_dbg(tx_ring->dev, "tx_poll: q %d done next to clean %x\n", in al_eth_tx_do_cleanup()
1195 uint32_t mss = m->m_pkthdr.tso_segsz; in al_eth_tx_csum()
1212 if ((m->m_pkthdr.csum_flags & CSUM_TSO) != 0) in al_eth_tx_csum()
1215 if ((m->m_pkthdr.csum_flags & CSUM_OFFLOAD) != 0) in al_eth_tx_csum()
1219 struct al_eth_meta_data *meta = &tx_ring->hal_meta; in al_eth_tx_csum()
1222 hal_pkt->flags |= (AL_ETH_TX_FLAGS_TSO | in al_eth_tx_csum()
1225 hal_pkt->flags |= (AL_ETH_TX_FLAGS_L4_CSUM | in al_eth_tx_csum()
1234 if (eh->evl_encap_proto == htons(ETHERTYPE_VLAN)) { in al_eth_tx_csum()
1235 etype = ntohs(eh->evl_proto); in al_eth_tx_csum()
1238 etype = ntohs(eh->evl_encap_proto); in al_eth_tx_csum()
1245 ip = (struct ip *)(m->m_data + ehdrlen); in al_eth_tx_csum()
1246 ip_hlen = ip->ip_hl << 2; in al_eth_tx_csum()
1247 ipproto = ip->ip_p; in al_eth_tx_csum()
1248 hal_pkt->l3_proto_idx = AL_ETH_PROTO_ID_IPv4; in al_eth_tx_csum()
1251 hal_pkt->flags |= AL_ETH_TX_FLAGS_IPV4_L3_CSUM; in al_eth_tx_csum()
1253 hal_pkt->l4_proto_idx = AL_ETH_PROTO_ID_TCP; in al_eth_tx_csum()
1255 hal_pkt->l4_proto_idx = AL_ETH_PROTO_ID_UDP; in al_eth_tx_csum()
1260 ip6 = (struct ip6_hdr *)(m->m_data + ehdrlen); in al_eth_tx_csum()
1261 hal_pkt->l3_proto_idx = AL_ETH_PROTO_ID_IPv6; in al_eth_tx_csum()
1264 ipproto = ip6->ip6_nxt; in al_eth_tx_csum()
1266 hal_pkt->l4_proto_idx = AL_ETH_PROTO_ID_TCP; in al_eth_tx_csum()
1268 hal_pkt->l4_proto_idx = AL_ETH_PROTO_ID_UDP; in al_eth_tx_csum()
1275 meta->words_valid = 4; in al_eth_tx_csum()
1276 meta->l3_header_len = ip_hlen; in al_eth_tx_csum()
1277 meta->l3_header_offset = ehdrlen; in al_eth_tx_csum()
1279 meta->l4_header_len = th->th_off; /* this param needed only for TSO */ in al_eth_tx_csum()
1280 meta->mss_idx_sel = 0; /* check how to select MSS */ in al_eth_tx_csum()
1281 meta->mss_val = mss; in al_eth_tx_csum()
1282 hal_pkt->meta = meta; in al_eth_tx_csum()
1284 hal_pkt->meta = NULL; in al_eth_tx_csum()
1302 if (unlikely(tx_ring->stall) != 0) { in al_eth_xmit_mbuf()
1304 if (al_udma_available_get(tx_ring->dma_q) >= in al_eth_xmit_mbuf()
1305 (AL_ETH_DEFAULT_TX_HW_DESCS - in al_eth_xmit_mbuf()
1307 tx_ring->stall = 0; in al_eth_xmit_mbuf()
1313 device_printf(tx_ring->dev, in al_eth_xmit_mbuf()
1315 tx_ring->ring_id); in al_eth_xmit_mbuf()
1318 device_printf_dbg(tx_ring->dev, in al_eth_xmit_mbuf()
1319 "queue %d is ready!\n", tx_ring->ring_id); in al_eth_xmit_mbuf()
1323 next_to_use = tx_ring->next_to_use; in al_eth_xmit_mbuf()
1324 tx_info = &tx_ring->tx_buffer_info[next_to_use]; in al_eth_xmit_mbuf()
1325 tx_info->m = m; in al_eth_xmit_mbuf()
1326 hal_pkt = &tx_info->hal_pkt; in al_eth_xmit_mbuf()
1329 device_printf(tx_ring->dev, "mbuf is NULL\n"); in al_eth_xmit_mbuf()
1336 error = bus_dmamap_load_mbuf_sg(tx_ring->dma_buf_tag, tx_info->dma_map, in al_eth_xmit_mbuf()
1342 /* Try it again? - one try */ in al_eth_xmit_mbuf()
1347 device_printf(tx_ring->dev, in al_eth_xmit_mbuf()
1354 device_printf(tx_ring->dev, in al_eth_xmit_mbuf()
1359 device_printf(tx_ring->dev, in al_eth_xmit_mbuf()
1366 hal_pkt->flags = AL_ETH_TX_FLAGS_INT; in al_eth_xmit_mbuf()
1369 al_buf = hal_pkt->bufs; in al_eth_xmit_mbuf()
1371 al_buf->addr = segs[a].ds_addr; in al_eth_xmit_mbuf()
1372 al_buf->len = segs[a].ds_len; in al_eth_xmit_mbuf()
1377 hal_pkt->num_of_bufs = nsegs; in al_eth_xmit_mbuf()
1380 tx_info->tx_descs = al_eth_tx_pkt_prepare(tx_ring->dma_q, hal_pkt); in al_eth_xmit_mbuf()
1382 if (tx_info->tx_descs == 0) in al_eth_xmit_mbuf()
1389 if (unlikely(al_udma_available_get(tx_ring->dma_q) < in al_eth_xmit_mbuf()
1391 tx_ring->stall = 1; in al_eth_xmit_mbuf()
1392 device_printf_dbg(tx_ring->dev, "stall, stopping queue %d...\n", in al_eth_xmit_mbuf()
1393 tx_ring->ring_id); in al_eth_xmit_mbuf()
1397 tx_ring->next_to_use = AL_ETH_TX_RING_IDX_NEXT(tx_ring, next_to_use); in al_eth_xmit_mbuf()
1400 al_eth_tx_dma_action(tx_ring->dma_q, tx_info->tx_descs); in al_eth_xmit_mbuf()
1413 tx_ring->cmpl_is_running = 1; in al_eth_tx_cmpl_work()
1420 tx_ring->cmpl_is_running = 0; in al_eth_tx_cmpl_work()
1424 al_eth_irq_config(tx_ring->unmask_reg_offset, tx_ring->unmask_val); in al_eth_tx_cmpl_work()
1432 /* Interrupt should be auto-masked upon arrival */ in al_eth_tx_cmlp_irq_filter()
1434 device_printf_dbg(tx_ring->dev, "%s for ring ID = %d\n", __func__, in al_eth_tx_cmlp_irq_filter()
1435 tx_ring->ring_id); in al_eth_tx_cmlp_irq_filter()
1439 * for casual (non-napi) packet handling. in al_eth_tx_cmlp_irq_filter()
1441 if ((napi == 0) || (napi && tx_ring->cmpl_is_running == 0)) in al_eth_tx_cmlp_irq_filter()
1442 taskqueue_enqueue(tx_ring->cmpl_tq, &tx_ring->cmpl_task); in al_eth_tx_cmlp_irq_filter()
1453 /* Interrupt should be auto-masked upon arrival */ in al_eth_rx_recv_irq_filter()
1455 device_printf_dbg(rx_ring->dev, "%s for ring ID = %d\n", __func__, in al_eth_rx_recv_irq_filter()
1456 rx_ring->ring_id); in al_eth_rx_recv_irq_filter()
1460 * for casual (non-napi) packet handling. in al_eth_rx_recv_irq_filter()
1462 if ((napi == 0) || (napi && rx_ring->enqueue_is_running == 0)) in al_eth_rx_recv_irq_filter()
1463 taskqueue_enqueue(rx_ring->enqueue_tq, &rx_ring->enqueue_task); in al_eth_rx_recv_irq_filter()
1470 * al_eth_rx_checksum - indicate in mbuf if hw indicated a good cksum
1481 if (unlikely((if_getcapenable(adapter->netdev) & IFCAP_RXCSUM) && in al_eth_rx_checksum()
1482 (hal_pkt->l3_proto_idx == AL_ETH_PROTO_ID_IPv4) && in al_eth_rx_checksum()
1483 (hal_pkt->flags & AL_ETH_RX_FLAGS_L3_CSUM_ERR))) { in al_eth_rx_checksum()
1484 device_printf(adapter->dev,"rx ipv4 header checksum error\n"); in al_eth_rx_checksum()
1489 if (unlikely((if_getcapenable(adapter->netdev) & IFCAP_RXCSUM_IPV6) && in al_eth_rx_checksum()
1490 (hal_pkt->l3_proto_idx == AL_ETH_PROTO_ID_IPv6) && in al_eth_rx_checksum()
1491 (hal_pkt->flags & AL_ETH_RX_FLAGS_L3_CSUM_ERR))) { in al_eth_rx_checksum()
1492 device_printf(adapter->dev,"rx ipv6 header checksum error\n"); in al_eth_rx_checksum()
1497 if (likely((hal_pkt->l4_proto_idx == AL_ETH_PROTO_ID_TCP) || in al_eth_rx_checksum()
1498 (hal_pkt->l4_proto_idx == AL_ETH_PROTO_ID_UDP))) { in al_eth_rx_checksum()
1499 if (unlikely(hal_pkt->flags & AL_ETH_RX_FLAGS_L4_CSUM_ERR)) { in al_eth_rx_checksum()
1500 device_printf_dbg(adapter->dev, "rx L4 checksum error\n"); in al_eth_rx_checksum()
1503 mbuf->m_pkthdr.csum_flags = 0; in al_eth_rx_checksum()
1505 device_printf_dbg(adapter->dev, "rx checksum correct\n"); in al_eth_rx_checksum()
1508 mbuf->m_pkthdr.csum_flags = CSUM_IP_CHECKED; in al_eth_rx_checksum()
1509 mbuf->m_pkthdr.csum_flags |= CSUM_IP_VALID; in al_eth_rx_checksum()
1521 &rx_ring->rx_buffer_info[*next_to_clean]; in al_eth_rx_mbuf()
1524 len = hal_pkt->bufs[0].len; in al_eth_rx_mbuf()
1525 device_printf_dbg(adapter->dev, "rx_info %p data %p\n", rx_info, in al_eth_rx_mbuf()
1526 rx_info->m); in al_eth_rx_mbuf()
1528 if (rx_info->m == NULL) { in al_eth_rx_mbuf()
1534 mbuf = rx_info->m; in al_eth_rx_mbuf()
1535 mbuf->m_pkthdr.len = len; in al_eth_rx_mbuf()
1536 mbuf->m_len = len; in al_eth_rx_mbuf()
1537 mbuf->m_pkthdr.rcvif = rx_ring->netdev; in al_eth_rx_mbuf()
1538 mbuf->m_flags |= M_PKTHDR; in al_eth_rx_mbuf()
1540 if (len <= adapter->small_copy_len) { in al_eth_rx_mbuf()
1542 device_printf_dbg(adapter->dev, "rx small packet. len %d\n", len); in al_eth_rx_mbuf()
1548 device_printf(adapter->dev, "smbuf is NULL\n"); in al_eth_rx_mbuf()
1552 smbuf->m_data = smbuf->m_data + AL_IP_ALIGNMENT_OFFSET; in al_eth_rx_mbuf()
1553 memcpy(smbuf->m_data, mbuf->m_data + AL_IP_ALIGNMENT_OFFSET, len); in al_eth_rx_mbuf()
1555 smbuf->m_len = len; in al_eth_rx_mbuf()
1556 smbuf->m_pkthdr.rcvif = rx_ring->netdev; in al_eth_rx_mbuf()
1558 /* first desc of a non-ps chain */ in al_eth_rx_mbuf()
1559 smbuf->m_flags |= M_PKTHDR; in al_eth_rx_mbuf()
1560 smbuf->m_pkthdr.len = smbuf->m_len; in al_eth_rx_mbuf()
1567 mbuf->m_data = mbuf->m_data + AL_IP_ALIGNMENT_OFFSET; in al_eth_rx_mbuf()
1570 bus_dmamap_unload(rx_ring->dma_buf_tag, rx_info->dma_map); in al_eth_rx_mbuf()
1572 rx_info->m = NULL; in al_eth_rx_mbuf()
1583 unsigned int qid = rx_ring->ring_id; in al_eth_rx_recv_work()
1584 struct al_eth_pkt *hal_pkt = &rx_ring->hal_pkt; in al_eth_rx_recv_work()
1585 uint16_t next_to_clean = rx_ring->next_to_clean; in al_eth_rx_recv_work()
1591 rx_ring->enqueue_is_running = 1; in al_eth_rx_recv_work()
1598 descs = al_eth_pkt_rx(rx_ring->dma_q, hal_pkt); in al_eth_rx_recv_work()
1602 device_printf_dbg(rx_ring->dev, "rx_poll: q %d got packet " in al_eth_rx_recv_work()
1604 device_printf_dbg(rx_ring->dev, "rx_poll: q %d flags %x. " in al_eth_rx_recv_work()
1605 "l3 proto %d l4 proto %d\n", qid, hal_pkt->flags, in al_eth_rx_recv_work()
1606 hal_pkt->l3_proto_idx, hal_pkt->l4_proto_idx); in al_eth_rx_recv_work()
1609 if ((hal_pkt->flags & (AL_ETH_RX_ERROR | in al_eth_rx_recv_work()
1611 device_printf(rx_ring->dev, "receive packet with error. " in al_eth_rx_recv_work()
1612 "flags = 0x%x\n", hal_pkt->flags); in al_eth_rx_recv_work()
1619 mbuf = al_eth_rx_mbuf(rx_ring->adapter, rx_ring, hal_pkt, descs, in al_eth_rx_recv_work()
1629 if (__predict_true(if_getcapenable(rx_ring->netdev) & IFCAP_RXCSUM || in al_eth_rx_recv_work()
1630 if_getcapenable(rx_ring->netdev) & IFCAP_RXCSUM_IPV6)) { in al_eth_rx_recv_work()
1631 al_eth_rx_checksum(rx_ring->adapter, hal_pkt, mbuf); in al_eth_rx_recv_work()
1634 mbuf->m_pkthdr.flowid = qid; in al_eth_rx_recv_work()
1642 if ((rx_ring->lro_enabled != 0) && in al_eth_rx_recv_work()
1643 ((mbuf->m_pkthdr.csum_flags & CSUM_IP_VALID) != 0) && in al_eth_rx_recv_work()
1644 hal_pkt->l4_proto_idx == AL_ETH_PROTO_ID_TCP) { in al_eth_rx_recv_work()
1647 * - LRO not enabled, or in al_eth_rx_recv_work()
1648 * - no LRO resources, or in al_eth_rx_recv_work()
1649 * - lro enqueue fails in al_eth_rx_recv_work()
1651 if (rx_ring->lro.lro_cnt != 0) { in al_eth_rx_recv_work()
1652 if (tcp_lro_rx(&rx_ring->lro, mbuf, 0) == 0) in al_eth_rx_recv_work()
1658 if_input(rx_ring->netdev, mbuf); in al_eth_rx_recv_work()
1662 rx_ring->next_to_clean = next_to_clean; in al_eth_rx_recv_work()
1664 refill_required = al_udma_available_get(rx_ring->dma_q); in al_eth_rx_recv_work()
1665 refill_actual = al_eth_refill_rx_bufs(rx_ring->adapter, qid, in al_eth_rx_recv_work()
1669 device_printf_dbg(rx_ring->dev, in al_eth_rx_recv_work()
1673 tcp_lro_flush_all(&rx_ring->lro); in al_eth_rx_recv_work()
1676 rx_ring->enqueue_is_running = 0; in al_eth_rx_recv_work()
1680 al_eth_irq_config(rx_ring->unmask_reg_offset, rx_ring->unmask_val); in al_eth_rx_recv_work()
1690 tx_ring->enqueue_is_running = 1; in al_eth_start_xmit()
1695 mtx_lock(&tx_ring->br_mtx); in al_eth_start_xmit()
1696 mbuf = drbr_dequeue(NULL, tx_ring->br); in al_eth_start_xmit()
1697 mtx_unlock(&tx_ring->br_mtx); in al_eth_start_xmit()
1706 tx_ring->enqueue_is_running = 0; in al_eth_start_xmit()
1709 mtx_lock(&tx_ring->br_mtx); in al_eth_start_xmit()
1710 mbuf = drbr_dequeue(NULL, tx_ring->br); in al_eth_start_xmit()
1711 mtx_unlock(&tx_ring->br_mtx); in al_eth_start_xmit()
1729 i = m->m_pkthdr.flowid % adapter->num_tx_queues; in al_mq_start()
1731 i = curcpu % adapter->num_tx_queues; in al_mq_start()
1738 tx_ring = &adapter->tx_ring[i]; in al_mq_start()
1740 device_printf_dbg(adapter->dev, "dgb start() - assuming link is active, " in al_mq_start()
1743 ret = drbr_enqueue(ifp, tx_ring->br, m); in al_mq_start()
1747 * for casual (non-napi) packet handling. in al_mq_start()
1749 if ((napi == 0) || ((napi != 0) && (tx_ring->enqueue_is_running == 0))) in al_mq_start()
1750 taskqueue_enqueue(tx_ring->enqueue_tq, &tx_ring->enqueue_task); in al_mq_start()
1770 adapter->link_config.flow_ctrl_supported = default_flow_ctrl; in al_eth_flow_ctrl_init()
1777 uint8_t active = adapter->link_config.flow_ctrl_active; in al_eth_flow_ctrl_config()
1780 flow_ctrl_params = &adapter->flow_ctrl_params; in al_eth_flow_ctrl_config()
1782 flow_ctrl_params->type = AL_ETH_FLOW_CONTROL_TYPE_LINK_PAUSE; in al_eth_flow_ctrl_config()
1783 flow_ctrl_params->obay_enable = in al_eth_flow_ctrl_config()
1785 flow_ctrl_params->gen_enable = in al_eth_flow_ctrl_config()
1788 flow_ctrl_params->rx_fifo_th_high = AL_ETH_FLOW_CTRL_RX_FIFO_TH_HIGH; in al_eth_flow_ctrl_config()
1789 flow_ctrl_params->rx_fifo_th_low = AL_ETH_FLOW_CTRL_RX_FIFO_TH_LOW; in al_eth_flow_ctrl_config()
1790 flow_ctrl_params->quanta = AL_ETH_FLOW_CTRL_QUANTA; in al_eth_flow_ctrl_config()
1791 flow_ctrl_params->quanta_th = AL_ETH_FLOW_CTRL_QUANTA_TH; in al_eth_flow_ctrl_config()
1795 flow_ctrl_params->prio_q_map[0][i] = 1 << (i >> 1); in al_eth_flow_ctrl_config()
1797 al_eth_flow_control_config(&adapter->hal_adapter, flow_ctrl_params); in al_eth_flow_ctrl_config()
1810 adapter->link_config.flow_ctrl_active = in al_eth_flow_ctrl_enable()
1811 adapter->link_config.flow_ctrl_supported; in al_eth_flow_ctrl_enable()
1820 adapter->link_config.flow_ctrl_active = 0; in al_eth_flow_ctrl_disable()
1833 rc = al_eth_mac_config(&adapter->hal_adapter, adapter->mac_mode); in al_eth_hw_init()
1835 device_printf(adapter->dev, "%s failed to configure mac!\n", in al_eth_hw_init()
1840 if ((adapter->mac_mode == AL_ETH_MAC_MODE_SGMII) || in al_eth_hw_init()
1841 (adapter->mac_mode == AL_ETH_MAC_MODE_RGMII && in al_eth_hw_init()
1842 adapter->phy_exist == false)) { in al_eth_hw_init()
1843 rc = al_eth_mac_link_config(&adapter->hal_adapter, in al_eth_hw_init()
1844 adapter->link_config.force_1000_base_x, in al_eth_hw_init()
1845 adapter->link_config.autoneg, in al_eth_hw_init()
1846 adapter->link_config.active_speed, in al_eth_hw_init()
1847 adapter->link_config.active_duplex); in al_eth_hw_init()
1849 device_printf(adapter->dev, in al_eth_hw_init()
1856 rc = al_eth_mdio_config(&adapter->hal_adapter, in al_eth_hw_init()
1858 adapter->ref_clk_freq, adapter->mdio_freq); in al_eth_hw_init()
1860 device_printf(adapter->dev, "%s failed at mdio config!\n", in al_eth_hw_init()
1874 al_eth_mac_stop(&adapter->hal_adapter); in al_eth_hw_stop()
1877 * wait till pending rx packets written and UDMA becomes idle, in al_eth_hw_stop()
1879 * UDMA to write to the memory in al_eth_hw_stop()
1883 al_eth_adapter_stop(&adapter->hal_adapter); in al_eth_hw_stop()
1885 adapter->flags |= AL_ETH_FLAG_RESET_REQUESTED; in al_eth_hw_stop()
1894 * al_eth_intr_intx_all - Legacy Interrupt Handler for all interrupts
1904 (struct unit_regs __iomem *)adapter->udma_base; in al_eth_intr_intx_all()
1910 device_printf_dbg(adapter->dev, "%s group A cause %x\n", in al_eth_intr_intx_all()
1919 &regs_base->gen.interrupt_regs.secondary_iofic_ctrl[0]; in al_eth_intr_intx_all()
1921 device_printf_dbg(adapter->dev, in al_eth_intr_intx_all()
1926 device_printf(adapter->dev, in al_eth_intr_intx_all()
1932 device_printf_dbg(adapter->dev, in al_eth_intr_intx_all()
1940 device_printf_dbg(adapter->dev, "secondary B cause %x\n", in al_eth_intr_intx_all()
1942 for (qid = 0; qid < adapter->num_rx_queues; qid++) { in al_eth_intr_intx_all()
1946 (struct unit_regs __iomem *)adapter->udma_base, in al_eth_intr_intx_all()
1956 device_printf_dbg(adapter->dev, "secondary C cause %x\n", cause_c); in al_eth_intr_intx_all()
1957 for (qid = 0; qid < adapter->num_tx_queues; qid++) { in al_eth_intr_intx_all()
1960 (struct unit_regs __iomem *)adapter->udma_base, in al_eth_intr_intx_all()
1967 al_eth_tx_cmlp_irq_filter(adapter->tx_ring); in al_eth_intr_intx_all()
1977 device_printf_dbg(adapter->dev, "%s\n", __func__); in al_eth_intr_msix_all()
1986 device_printf_dbg(adapter->dev, "%s\n", __func__); in al_eth_intr_msix_mgmt()
1995 device_printf_dbg(adapter->dev, "%s\n", __func__); in al_eth_enable_msix()
1996 msix_vecs = 1 + adapter->num_rx_queues + adapter->num_tx_queues; in al_eth_enable_msix()
1998 device_printf_dbg(adapter->dev, in al_eth_enable_msix()
2001 adapter->msix_entries = malloc(msix_vecs*sizeof(*adapter->msix_entries), in al_eth_enable_msix()
2004 adapter->msix_entries[AL_ETH_MGMT_IRQ_IDX].entry = 2; in al_eth_enable_msix()
2005 adapter->msix_entries[AL_ETH_MGMT_IRQ_IDX].vector = 0; in al_eth_enable_msix()
2008 for (i = 0; i < adapter->num_rx_queues; i++) { in al_eth_enable_msix()
2011 adapter->msix_entries[irq_idx].entry = 3 + i; in al_eth_enable_msix()
2012 adapter->msix_entries[irq_idx].vector = 0; in al_eth_enable_msix()
2015 for (i = 0; i < adapter->num_tx_queues; i++) { in al_eth_enable_msix()
2018 adapter->msix_entries[irq_idx].entry = 3 + in al_eth_enable_msix()
2020 adapter->msix_entries[irq_idx].vector = 0; in al_eth_enable_msix()
2024 rc = pci_alloc_msix(adapter->dev, &count); in al_eth_enable_msix()
2027 device_printf_dbg(adapter->dev, "failed to allocate MSIX " in al_eth_enable_msix()
2029 device_printf_dbg(adapter->dev, "ret = %d\n", rc); in al_eth_enable_msix()
2034 device_printf_dbg(adapter->dev, "failed to allocate all MSIX " in al_eth_enable_msix()
2041 adapter->msix_entries[i].vector = 2 + 1 + i; in al_eth_enable_msix()
2043 device_printf_dbg(adapter->dev, "successfully enabled MSIX," in al_eth_enable_msix()
2046 adapter->msix_vecs = msix_vecs; in al_eth_enable_msix()
2047 adapter->flags |= AL_ETH_FLAG_MSIX_ENABLED; in al_eth_enable_msix()
2051 adapter->msix_vecs = 0; in al_eth_enable_msix()
2052 free(adapter->msix_entries, M_IFAL); in al_eth_enable_msix()
2053 adapter->msix_entries = NULL; in al_eth_enable_msix()
2066 device_printf(adapter->dev, "Failed to enable MSIX mode.\n"); in al_eth_setup_int_mode()
2070 adapter->irq_vecs = max(1, adapter->msix_vecs); in al_eth_setup_int_mode()
2072 if (adapter->msix_vecs == 0) { in al_eth_setup_int_mode()
2073 snprintf(adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].name, in al_eth_setup_int_mode()
2074 AL_ETH_IRQNAME_SIZE, "al-eth-intx-all@pci:%s", in al_eth_setup_int_mode()
2075 device_get_name(adapter->dev)); in al_eth_setup_int_mode()
2076 adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].handler = in al_eth_setup_int_mode()
2079 adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].vector = 0; in al_eth_setup_int_mode()
2080 adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].data = adapter; in al_eth_setup_int_mode()
2082 device_printf(adapter->dev, "%s and vector %d \n", __func__, in al_eth_setup_int_mode()
2083 adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].vector); in al_eth_setup_int_mode()
2087 /* single MSI-X mode */ in al_eth_setup_int_mode()
2088 if (adapter->msix_vecs == 1) { in al_eth_setup_int_mode()
2089 snprintf(adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].name, in al_eth_setup_int_mode()
2090 AL_ETH_IRQNAME_SIZE, "al-eth-msix-all@pci:%s", in al_eth_setup_int_mode()
2091 device_get_name(adapter->dev)); in al_eth_setup_int_mode()
2092 adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].handler = in al_eth_setup_int_mode()
2094 adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].vector = in al_eth_setup_int_mode()
2095 adapter->msix_entries[AL_ETH_MGMT_IRQ_IDX].vector; in al_eth_setup_int_mode()
2096 adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].data = adapter; in al_eth_setup_int_mode()
2100 /* MSI-X per queue */ in al_eth_setup_int_mode()
2101 snprintf(adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].name, AL_ETH_IRQNAME_SIZE, in al_eth_setup_int_mode()
2102 "al-eth-msix-mgmt@pci:%s", device_get_name(adapter->dev)); in al_eth_setup_int_mode()
2103 adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].handler = al_eth_intr_msix_mgmt; in al_eth_setup_int_mode()
2105 adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].data = adapter; in al_eth_setup_int_mode()
2106 adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].vector = in al_eth_setup_int_mode()
2107 adapter->msix_entries[AL_ETH_MGMT_IRQ_IDX].vector; in al_eth_setup_int_mode()
2109 for (i = 0; i < adapter->num_rx_queues; i++) { in al_eth_setup_int_mode()
2112 snprintf(adapter->irq_tbl[irq_idx].name, AL_ETH_IRQNAME_SIZE, in al_eth_setup_int_mode()
2113 "al-eth-rx-comp-%d@pci:%s", i, in al_eth_setup_int_mode()
2114 device_get_name(adapter->dev)); in al_eth_setup_int_mode()
2115 adapter->irq_tbl[irq_idx].handler = al_eth_rx_recv_irq_filter; in al_eth_setup_int_mode()
2116 adapter->irq_tbl[irq_idx].data = &adapter->rx_ring[i]; in al_eth_setup_int_mode()
2117 adapter->irq_tbl[irq_idx].vector = in al_eth_setup_int_mode()
2118 adapter->msix_entries[irq_idx].vector; in al_eth_setup_int_mode()
2121 for (i = 0; i < adapter->num_tx_queues; i++) { in al_eth_setup_int_mode()
2124 snprintf(adapter->irq_tbl[irq_idx].name, in al_eth_setup_int_mode()
2125 AL_ETH_IRQNAME_SIZE, "al-eth-tx-comp-%d@pci:%s", i, in al_eth_setup_int_mode()
2126 device_get_name(adapter->dev)); in al_eth_setup_int_mode()
2127 adapter->irq_tbl[irq_idx].handler = al_eth_tx_cmlp_irq_filter; in al_eth_setup_int_mode()
2128 adapter->irq_tbl[irq_idx].data = &adapter->tx_ring[i]; in al_eth_setup_int_mode()
2129 adapter->irq_tbl[irq_idx].vector = in al_eth_setup_int_mode()
2130 adapter->msix_entries[irq_idx].vector; in al_eth_setup_int_mode()
2142 for (i = 0; i < adapter->irq_vecs; i++) { in __al_eth_free_irq()
2143 irq = &adapter->irq_tbl[i]; in __al_eth_free_irq()
2144 if (irq->requested != 0) { in __al_eth_free_irq()
2145 device_printf_dbg(adapter->dev, "tear down irq: %d\n", in __al_eth_free_irq()
2146 irq->vector); in __al_eth_free_irq()
2147 rc = bus_teardown_intr(adapter->dev, irq->res, in __al_eth_free_irq()
2148 irq->cookie); in __al_eth_free_irq()
2150 device_printf(adapter->dev, "failed to tear " in __al_eth_free_irq()
2151 "down irq: %d\n", irq->vector); in __al_eth_free_irq()
2153 irq->requested = 0; in __al_eth_free_irq()
2163 if (adapter->msix_vecs >= 1) { in al_eth_free_irq()
2164 free_irq_cpu_rmap(adapter->netdev->rx_cpu_rmap); in al_eth_free_irq()
2165 adapter->netdev->rx_cpu_rmap = NULL; in al_eth_free_irq()
2171 for (i = 0; i < adapter->irq_vecs; i++) { in al_eth_free_irq()
2172 irq = &adapter->irq_tbl[i]; in al_eth_free_irq()
2173 if (irq->res == NULL) in al_eth_free_irq()
2175 device_printf_dbg(adapter->dev, "release resource irq: %d\n", in al_eth_free_irq()
2176 irq->vector); in al_eth_free_irq()
2177 rc = bus_release_resource(adapter->dev, SYS_RES_IRQ, irq->vector, in al_eth_free_irq()
2178 irq->res); in al_eth_free_irq()
2179 irq->res = NULL; in al_eth_free_irq()
2181 device_printf(adapter->dev, "dev has no parent while " in al_eth_free_irq()
2182 "releasing res for irq: %d\n", irq->vector); in al_eth_free_irq()
2185 pci_release_msi(adapter->dev); in al_eth_free_irq()
2187 adapter->flags &= ~AL_ETH_FLAG_MSIX_ENABLED; in al_eth_free_irq()
2189 adapter->msix_vecs = 0; in al_eth_free_irq()
2190 free(adapter->msix_entries, M_IFAL); in al_eth_free_irq()
2191 adapter->msix_entries = NULL; in al_eth_free_irq()
2201 if ((adapter->flags & AL_ETH_FLAG_MSIX_ENABLED) != 0) in al_eth_request_irq()
2206 for (i = 0; i < adapter->irq_vecs; i++) { in al_eth_request_irq()
2207 irq = &adapter->irq_tbl[i]; in al_eth_request_irq()
2209 if (irq->requested != 0) in al_eth_request_irq()
2212 irq->res = bus_alloc_resource_any(adapter->dev, SYS_RES_IRQ, in al_eth_request_irq()
2213 &irq->vector, flags); in al_eth_request_irq()
2214 if (irq->res == NULL) { in al_eth_request_irq()
2215 device_printf(adapter->dev, "could not allocate " in al_eth_request_irq()
2216 "irq vector=%d\n", irq->vector); in al_eth_request_irq()
2221 if ((rc = bus_setup_intr(adapter->dev, irq->res, in al_eth_request_irq()
2222 INTR_TYPE_NET | INTR_MPSAFE, irq->handler, in al_eth_request_irq()
2223 NULL, irq->data, &irq->cookie)) != 0) { in al_eth_request_irq()
2224 device_printf(adapter->dev, "failed to register " in al_eth_request_irq()
2226 (uintmax_t)rman_get_start(irq->res), rc); in al_eth_request_irq()
2229 irq->requested = 1; in al_eth_request_irq()
2234 v = i - 1; /* -1 because we omit the operation that failed */ in al_eth_request_irq()
2235 while (v-- >= 0) { in al_eth_request_irq()
2237 irq = &adapter->irq_tbl[v]; in al_eth_request_irq()
2238 bti = bus_teardown_intr(adapter->dev, irq->res, irq->cookie); in al_eth_request_irq()
2240 device_printf(adapter->dev, "failed to tear " in al_eth_request_irq()
2241 "down irq: %d\n", irq->vector); in al_eth_request_irq()
2244 irq->requested = 0; in al_eth_request_irq()
2245 device_printf_dbg(adapter->dev, "exit_intr: releasing irq %d\n", in al_eth_request_irq()
2246 irq->vector); in al_eth_request_irq()
2250 v = i - 1; /* -1 because we omit the operation that failed */ in al_eth_request_irq()
2251 while (v-- >= 0) { in al_eth_request_irq()
2253 irq = &adapter->irq_tbl[v]; in al_eth_request_irq()
2254 device_printf_dbg(adapter->dev, "exit_res: releasing resource" in al_eth_request_irq()
2255 " for irq %d\n", irq->vector); in al_eth_request_irq()
2256 brr = bus_release_resource(adapter->dev, SYS_RES_IRQ, in al_eth_request_irq()
2257 irq->vector, irq->res); in al_eth_request_irq()
2259 device_printf(adapter->dev, "dev has no parent while " in al_eth_request_irq()
2260 "releasing res for irq: %d\n", irq->vector); in al_eth_request_irq()
2261 irq->res = NULL; in al_eth_request_irq()
2269 * al_eth_setup_tx_resources - allocate Tx resources (Descriptors)
2278 struct al_eth_ring *tx_ring = &adapter->tx_ring[qid]; in al_eth_setup_tx_resources()
2279 device_t dev = tx_ring->dev; in al_eth_setup_tx_resources()
2280 struct al_udma_q_params *q_params = &tx_ring->q_params; in al_eth_setup_tx_resources()
2284 if (adapter->up) in al_eth_setup_tx_resources()
2287 size = sizeof(struct al_eth_tx_buffer) * tx_ring->sw_count; in al_eth_setup_tx_resources()
2289 tx_ring->tx_buffer_info = malloc(size, M_IFAL, M_ZERO | M_WAITOK); in al_eth_setup_tx_resources()
2290 tx_ring->descs_size = tx_ring->hw_count * sizeof(union al_udma_desc); in al_eth_setup_tx_resources()
2291 q_params->size = tx_ring->hw_count; in al_eth_setup_tx_resources()
2293 ret = al_dma_alloc_coherent(dev, &q_params->desc_phy_base_tag, in al_eth_setup_tx_resources()
2294 (bus_dmamap_t *)&q_params->desc_phy_base_map, in al_eth_setup_tx_resources()
2295 (bus_addr_t *)&q_params->desc_phy_base, in al_eth_setup_tx_resources()
2296 (void**)&q_params->desc_base, tx_ring->descs_size); in al_eth_setup_tx_resources()
2303 if (q_params->desc_base == NULL) in al_eth_setup_tx_resources()
2309 mtx_init(&tx_ring->br_mtx, "AlRingMtx", NULL, MTX_DEF); in al_eth_setup_tx_resources()
2310 tx_ring->br = buf_ring_alloc(AL_BR_SIZE, M_DEVBUF, M_WAITOK, in al_eth_setup_tx_resources()
2311 &tx_ring->br_mtx); in al_eth_setup_tx_resources()
2314 TASK_INIT(&tx_ring->enqueue_task, 0, al_eth_start_xmit, tx_ring); in al_eth_setup_tx_resources()
2315 tx_ring->enqueue_tq = taskqueue_create_fast("al_tx_enque", M_NOWAIT, in al_eth_setup_tx_resources()
2316 taskqueue_thread_enqueue, &tx_ring->enqueue_tq); in al_eth_setup_tx_resources()
2317 taskqueue_start_threads(&tx_ring->enqueue_tq, 1, PI_NET, "%s txeq", in al_eth_setup_tx_resources()
2318 device_get_nameunit(adapter->dev)); in al_eth_setup_tx_resources()
2319 TASK_INIT(&tx_ring->cmpl_task, 0, al_eth_tx_cmpl_work, tx_ring); in al_eth_setup_tx_resources()
2320 tx_ring->cmpl_tq = taskqueue_create_fast("al_tx_cmpl", M_NOWAIT, in al_eth_setup_tx_resources()
2321 taskqueue_thread_enqueue, &tx_ring->cmpl_tq); in al_eth_setup_tx_resources()
2322 taskqueue_start_threads(&tx_ring->cmpl_tq, 1, PI_REALTIME, "%s txcq", in al_eth_setup_tx_resources()
2323 device_get_nameunit(adapter->dev)); in al_eth_setup_tx_resources()
2337 &tx_ring->dma_buf_tag); in al_eth_setup_tx_resources()
2345 for (size = 0; size < tx_ring->sw_count; size++) { in al_eth_setup_tx_resources()
2346 ret = bus_dmamap_create(tx_ring->dma_buf_tag, 0, in al_eth_setup_tx_resources()
2347 &tx_ring->tx_buffer_info[size].dma_map); in al_eth_setup_tx_resources()
2356 q_params->cdesc_base = NULL; in al_eth_setup_tx_resources()
2357 /* size in bytes of the udma completion ring descriptor */ in al_eth_setup_tx_resources()
2358 q_params->cdesc_size = 8; in al_eth_setup_tx_resources()
2359 tx_ring->next_to_use = 0; in al_eth_setup_tx_resources()
2360 tx_ring->next_to_clean = 0; in al_eth_setup_tx_resources()
2366 * al_eth_free_tx_resources - Free Tx Resources per Queue
2375 struct al_eth_ring *tx_ring = &adapter->tx_ring[qid]; in al_eth_free_tx_resources()
2376 struct al_udma_q_params *q_params = &tx_ring->q_params; in al_eth_free_tx_resources()
2380 while (taskqueue_cancel(tx_ring->cmpl_tq, &tx_ring->cmpl_task, NULL)) in al_eth_free_tx_resources()
2381 taskqueue_drain(tx_ring->cmpl_tq, &tx_ring->cmpl_task); in al_eth_free_tx_resources()
2383 taskqueue_free(tx_ring->cmpl_tq); in al_eth_free_tx_resources()
2384 while (taskqueue_cancel(tx_ring->enqueue_tq, in al_eth_free_tx_resources()
2385 &tx_ring->enqueue_task, NULL)) { in al_eth_free_tx_resources()
2386 taskqueue_drain(tx_ring->enqueue_tq, &tx_ring->enqueue_task); in al_eth_free_tx_resources()
2389 taskqueue_free(tx_ring->enqueue_tq); in al_eth_free_tx_resources()
2391 if (tx_ring->br != NULL) { in al_eth_free_tx_resources()
2392 drbr_flush(adapter->netdev, tx_ring->br); in al_eth_free_tx_resources()
2393 buf_ring_free(tx_ring->br, M_DEVBUF); in al_eth_free_tx_resources()
2396 for (size = 0; size < tx_ring->sw_count; size++) { in al_eth_free_tx_resources()
2397 m_freem(tx_ring->tx_buffer_info[size].m); in al_eth_free_tx_resources()
2398 tx_ring->tx_buffer_info[size].m = NULL; in al_eth_free_tx_resources()
2400 bus_dmamap_unload(tx_ring->dma_buf_tag, in al_eth_free_tx_resources()
2401 tx_ring->tx_buffer_info[size].dma_map); in al_eth_free_tx_resources()
2402 bus_dmamap_destroy(tx_ring->dma_buf_tag, in al_eth_free_tx_resources()
2403 tx_ring->tx_buffer_info[size].dma_map); in al_eth_free_tx_resources()
2405 bus_dma_tag_destroy(tx_ring->dma_buf_tag); in al_eth_free_tx_resources()
2407 free(tx_ring->tx_buffer_info, M_IFAL); in al_eth_free_tx_resources()
2408 tx_ring->tx_buffer_info = NULL; in al_eth_free_tx_resources()
2410 mtx_destroy(&tx_ring->br_mtx); in al_eth_free_tx_resources()
2413 if (q_params->desc_base == NULL) in al_eth_free_tx_resources()
2416 al_dma_free_coherent(q_params->desc_phy_base_tag, in al_eth_free_tx_resources()
2417 q_params->desc_phy_base_map, q_params->desc_base); in al_eth_free_tx_resources()
2419 q_params->desc_base = NULL; in al_eth_free_tx_resources()
2423 * al_eth_free_all_tx_resources - Free Tx Resources for All Queues
2433 for (i = 0; i < adapter->num_tx_queues; i++) in al_eth_free_all_tx_resources()
2434 if (adapter->tx_ring[i].q_params.desc_base) in al_eth_free_all_tx_resources()
2439 * al_eth_setup_rx_resources - allocate Rx resources (Descriptors)
2448 struct al_eth_ring *rx_ring = &adapter->rx_ring[qid]; in al_eth_setup_rx_resources()
2449 device_t dev = rx_ring->dev; in al_eth_setup_rx_resources()
2450 struct al_udma_q_params *q_params = &rx_ring->q_params; in al_eth_setup_rx_resources()
2454 size = sizeof(struct al_eth_rx_buffer) * rx_ring->sw_count; in al_eth_setup_rx_resources()
2459 rx_ring->rx_buffer_info = malloc(size, M_IFAL, M_ZERO | M_WAITOK); in al_eth_setup_rx_resources()
2460 rx_ring->descs_size = rx_ring->hw_count * sizeof(union al_udma_desc); in al_eth_setup_rx_resources()
2461 q_params->size = rx_ring->hw_count; in al_eth_setup_rx_resources()
2463 ret = al_dma_alloc_coherent(dev, &q_params->desc_phy_base_tag, in al_eth_setup_rx_resources()
2464 &q_params->desc_phy_base_map, in al_eth_setup_rx_resources()
2465 (bus_addr_t *)&q_params->desc_phy_base, in al_eth_setup_rx_resources()
2466 (void**)&q_params->desc_base, rx_ring->descs_size); in al_eth_setup_rx_resources()
2468 if ((q_params->desc_base == NULL) || (ret != 0)) in al_eth_setup_rx_resources()
2471 /* size in bytes of the udma completion ring descriptor */ in al_eth_setup_rx_resources()
2472 q_params->cdesc_size = 16; in al_eth_setup_rx_resources()
2473 rx_ring->cdescs_size = rx_ring->hw_count * q_params->cdesc_size; in al_eth_setup_rx_resources()
2474 ret = al_dma_alloc_coherent(dev, &q_params->cdesc_phy_base_tag, in al_eth_setup_rx_resources()
2475 &q_params->cdesc_phy_base_map, in al_eth_setup_rx_resources()
2476 (bus_addr_t *)&q_params->cdesc_phy_base, in al_eth_setup_rx_resources()
2477 (void**)&q_params->cdesc_base, rx_ring->cdescs_size); in al_eth_setup_rx_resources()
2479 if ((q_params->cdesc_base == NULL) || (ret != 0)) in al_eth_setup_rx_resources()
2483 NET_TASK_INIT(&rx_ring->enqueue_task, 0, al_eth_rx_recv_work, rx_ring); in al_eth_setup_rx_resources()
2484 rx_ring->enqueue_tq = taskqueue_create_fast("al_rx_enque", M_NOWAIT, in al_eth_setup_rx_resources()
2485 taskqueue_thread_enqueue, &rx_ring->enqueue_tq); in al_eth_setup_rx_resources()
2486 taskqueue_start_threads(&rx_ring->enqueue_tq, 1, PI_NET, "%s rxeq", in al_eth_setup_rx_resources()
2487 device_get_nameunit(adapter->dev)); in al_eth_setup_rx_resources()
2501 &rx_ring->dma_buf_tag); in al_eth_setup_rx_resources()
2508 for (size = 0; size < rx_ring->sw_count; size++) { in al_eth_setup_rx_resources()
2509 ret = bus_dmamap_create(rx_ring->dma_buf_tag, 0, in al_eth_setup_rx_resources()
2510 &rx_ring->rx_buffer_info[size].dma_map); in al_eth_setup_rx_resources()
2518 memset(q_params->cdesc_base, 0, rx_ring->cdescs_size); in al_eth_setup_rx_resources()
2521 if ((if_getcapenable(adapter->netdev) & IFCAP_LRO) != 0) { in al_eth_setup_rx_resources()
2522 int err = tcp_lro_init(&rx_ring->lro); in al_eth_setup_rx_resources()
2524 device_printf(adapter->dev, in al_eth_setup_rx_resources()
2527 device_printf_dbg(adapter->dev, in al_eth_setup_rx_resources()
2529 rx_ring->lro_enabled = true; in al_eth_setup_rx_resources()
2530 rx_ring->lro.ifp = adapter->netdev; in al_eth_setup_rx_resources()
2534 rx_ring->next_to_clean = 0; in al_eth_setup_rx_resources()
2535 rx_ring->next_to_use = 0; in al_eth_setup_rx_resources()
2541 * al_eth_free_rx_resources - Free Rx Resources
2550 struct al_eth_ring *rx_ring = &adapter->rx_ring[qid]; in al_eth_free_rx_resources()
2551 struct al_udma_q_params *q_params = &rx_ring->q_params; in al_eth_free_rx_resources()
2555 while (taskqueue_cancel(rx_ring->enqueue_tq, in al_eth_free_rx_resources()
2556 &rx_ring->enqueue_task, NULL)) { in al_eth_free_rx_resources()
2557 taskqueue_drain(rx_ring->enqueue_tq, &rx_ring->enqueue_task); in al_eth_free_rx_resources()
2560 taskqueue_free(rx_ring->enqueue_tq); in al_eth_free_rx_resources()
2562 for (size = 0; size < rx_ring->sw_count; size++) { in al_eth_free_rx_resources()
2563 m_freem(rx_ring->rx_buffer_info[size].m); in al_eth_free_rx_resources()
2564 rx_ring->rx_buffer_info[size].m = NULL; in al_eth_free_rx_resources()
2565 bus_dmamap_unload(rx_ring->dma_buf_tag, in al_eth_free_rx_resources()
2566 rx_ring->rx_buffer_info[size].dma_map); in al_eth_free_rx_resources()
2567 bus_dmamap_destroy(rx_ring->dma_buf_tag, in al_eth_free_rx_resources()
2568 rx_ring->rx_buffer_info[size].dma_map); in al_eth_free_rx_resources()
2570 bus_dma_tag_destroy(rx_ring->dma_buf_tag); in al_eth_free_rx_resources()
2572 free(rx_ring->rx_buffer_info, M_IFAL); in al_eth_free_rx_resources()
2573 rx_ring->rx_buffer_info = NULL; in al_eth_free_rx_resources()
2576 if (q_params->desc_base == NULL) in al_eth_free_rx_resources()
2579 al_dma_free_coherent(q_params->desc_phy_base_tag, in al_eth_free_rx_resources()
2580 q_params->desc_phy_base_map, q_params->desc_base); in al_eth_free_rx_resources()
2582 q_params->desc_base = NULL; in al_eth_free_rx_resources()
2585 if (q_params->cdesc_base == NULL) in al_eth_free_rx_resources()
2588 al_dma_free_coherent(q_params->cdesc_phy_base_tag, in al_eth_free_rx_resources()
2589 q_params->cdesc_phy_base_map, q_params->cdesc_base); in al_eth_free_rx_resources()
2591 q_params->cdesc_phy_base = 0; in al_eth_free_rx_resources()
2594 tcp_lro_free(&rx_ring->lro); in al_eth_free_rx_resources()
2598 * al_eth_free_all_rx_resources - Free Rx Resources for All Queues
2608 for (i = 0; i < adapter->num_rx_queues; i++) in al_eth_free_all_rx_resources()
2609 if (adapter->rx_ring[i].q_params.desc_base != 0) in al_eth_free_all_rx_resources()
2614 * al_eth_setup_all_rx_resources - allocate all queues Rx resources
2624 for (i = 0; i < adapter->num_rx_queues; i++) { in al_eth_setup_all_rx_resources()
2629 device_printf(adapter->dev, "Allocation for Rx Queue %u failed\n", i); in al_eth_setup_all_rx_resources()
2636 while (i--) in al_eth_setup_all_rx_resources()
2642 * al_eth_setup_all_tx_resources - allocate all queues Tx resources
2652 for (i = 0; i < adapter->num_tx_queues; i++) { in al_eth_setup_all_tx_resources()
2657 device_printf(adapter->dev, in al_eth_setup_all_tx_resources()
2666 while (i--) in al_eth_setup_all_tx_resources()
2677 if ((adapter->board_type == ALPINE_FPGA_NIC) || in al_eth_disable_int_sync()
2678 (adapter->board_type == ALPINE_NIC)) { in al_eth_disable_int_sync()
2679 al_eth_forward_int_config((uint32_t*)adapter->internal_pcie_base + in al_eth_disable_int_sync()
2691 uint32_t group_b_mask = (1 << adapter->num_rx_queues) - 1;/* bit per Rx q*/ in al_eth_interrupts_unmask()
2692 uint32_t group_c_mask = (1 << adapter->num_tx_queues) - 1;/* bit per Tx q*/ in al_eth_interrupts_unmask()
2695 (struct unit_regs __iomem *)adapter->udma_base; in al_eth_interrupts_unmask()
2697 if (adapter->int_mode == AL_IOFIC_MODE_LEGACY) in al_eth_interrupts_unmask()
2716 (struct unit_regs __iomem *)adapter->udma_base; in al_eth_interrupts_mask()
2739 if (adapter->msix_vecs == 0) in al_eth_configure_int_mode()
2741 else if (adapter->msix_vecs > 1) in al_eth_configure_int_mode()
2744 device_printf(adapter->dev, in al_eth_configure_int_mode()
2745 "udma doesn't support single MSI-X mode yet.\n"); in al_eth_configure_int_mode()
2749 if (adapter->board_type != ALPINE_INTEGRATED) { in al_eth_configure_int_mode()
2756 if (al_udma_iofic_config((struct unit_regs __iomem *)adapter->udma_base, in al_eth_configure_int_mode()
2759 device_printf(adapter->dev, in al_eth_configure_int_mode()
2763 adapter->int_mode = int_mode; in al_eth_configure_int_mode()
2764 device_printf_dbg(adapter->dev, "using %s interrupt mode\n", in al_eth_configure_int_mode()
2766 int_mode == AL_IOFIC_MODE_MSIX_PER_Q ? "MSI-X per Queue" : "Unknown"); in al_eth_configure_int_mode()
2768 …al_iofic_moder_res_config(&((struct unit_regs *)(adapter->udma_base))->gen.interrupt_regs.main_iof… in al_eth_configure_int_mode()
2769 …al_iofic_moder_res_config(&((struct unit_regs *)(adapter->udma_base))->gen.interrupt_regs.main_iof… in al_eth_configure_int_mode()
2771 adapter->tx_usecs = 0; in al_eth_configure_int_mode()
2772 adapter->rx_usecs = 0; in al_eth_configure_int_mode()
2778 * ethtool_rxfh_indir_default - get default value for RX flow hash indirection
2794 struct al_eth_mac_stats *mac_stats = &adapter->mac_stats; in al_eth_update_stats()
2796 if (adapter->up == 0) in al_eth_update_stats()
2799 al_eth_mac_stats_get(&adapter->hal_adapter, mac_stats); in al_eth_update_stats()
2812 mac_stats = &adapter->mac_stats; in al_get_counter()
2816 return (mac_stats->aFramesReceivedOK); /* including pause frames */ in al_get_counter()
2818 return (mac_stats->aFramesTransmittedOK); in al_get_counter()
2820 return (mac_stats->aOctetsReceivedOK); in al_get_counter()
2822 return (mac_stats->aOctetsTransmittedOK); in al_get_counter()
2824 return (mac_stats->ifInMulticastPkts); in al_get_counter()
2826 return (mac_stats->ifOutMulticastPkts); in al_get_counter()
2830 return (mac_stats->etherStatsDropEvents); in al_get_counter()
2832 rv = mac_stats->ifInErrors + in al_get_counter()
2833 mac_stats->etherStatsUndersizePkts + /* good but short */ in al_get_counter()
2834 mac_stats->etherStatsFragments + /* short and bad*/ in al_get_counter()
2835 mac_stats->etherStatsJabbers + /* with crc errors */ in al_get_counter()
2836 mac_stats->etherStatsOversizePkts + in al_get_counter()
2837 mac_stats->aFrameCheckSequenceErrors + in al_get_counter()
2838 mac_stats->aAlignmentErrors; in al_get_counter()
2841 return (mac_stats->ifOutErrors); in al_get_counter()
2877 * promiscuous mode, and all-multi behavior.
2882 if_t ifp = adapter->netdev; in al_eth_set_rx_mode()
2894 /* This interface is in all-multicasts mode (used by multicast routers). */ in al_eth_set_rx_mode()
2911 * entries in the mac table - set promiscuous in al_eth_set_rx_mode()
2939 al_eth_fwd_pbits_table_set(&adapter->hal_adapter, i, i); in al_eth_config_rx_fwd()
2943 al_eth_fwd_priority_table_set(&adapter->hal_adapter, i, i >> 1); in al_eth_config_rx_fwd()
2951 al_eth_ctrl_table_def_set(&adapter->hal_adapter, AL_FALSE, &entry); in al_eth_config_rx_fwd()
2963 for (i = 0; i < sizeof(adapter->toeplitz_hash_key); i++) in al_eth_config_rx_fwd()
2964 *((uint8_t*)adapter->toeplitz_hash_key + i) = (uint8_t)random(); in al_eth_config_rx_fwd()
2967 al_eth_hash_key_set(&adapter->hal_adapter, i, in al_eth_config_rx_fwd()
2968 htonl(adapter->toeplitz_hash_key[i])); in al_eth_config_rx_fwd()
2971 adapter->rss_ind_tbl[i] = ethtool_rxfh_indir_default(i, in al_eth_config_rx_fwd()
2974 adapter->rss_ind_tbl[i]); in al_eth_config_rx_fwd()
2989 adapter->rx_mbuf_sz = MCLBYTES; in al_eth_req_rx_buff_size()
2991 if (adapter->max_rx_buff_alloc_size > 2048) in al_eth_req_rx_buff_size()
2992 adapter->rx_mbuf_sz = MJUMPAGESIZE; in al_eth_req_rx_buff_size()
2997 if (adapter->max_rx_buff_alloc_size > 4096) in al_eth_req_rx_buff_size()
2998 adapter->rx_mbuf_sz = MJUM9BYTES; in al_eth_req_rx_buff_size()
3003 if (adapter->max_rx_buff_alloc_size > 9216) in al_eth_req_rx_buff_size()
3004 adapter->rx_mbuf_sz = MJUM16BYTES; in al_eth_req_rx_buff_size()
3018 device_printf_dbg(adapter->dev, "set MTU to %d\n", new_mtu); in al_eth_change_mtu()
3019 al_eth_rx_pkt_limit_config(&adapter->hal_adapter, in al_eth_change_mtu()
3022 al_eth_tso_mss_config(&adapter->hal_adapter, 0, new_mtu - 100); in al_eth_change_mtu()
3049 q_params = &adapter->tx_ring[qid].q_params; in al_eth_udma_queue_enable()
3051 q_params = &adapter->rx_ring[qid].q_params; in al_eth_udma_queue_enable()
3053 rc = al_eth_queue_config(&adapter->hal_adapter, type, qid, q_params); in al_eth_udma_queue_enable()
3055 device_printf(adapter->dev, "config %s queue %u failed\n", name, in al_eth_udma_queue_enable()
3067 for (i = 0; i < adapter->num_tx_queues; i++) in al_eth_udma_queues_enable_all()
3070 for (i = 0; i < adapter->num_rx_queues; i++) in al_eth_udma_queues_enable_all()
3082 al_eth_change_mtu(adapter, if_getmtu(adapter->netdev)); in al_eth_up_complete()
3088 if ((adapter->board_type == ALPINE_FPGA_NIC) || in al_eth_up_complete()
3089 (adapter->board_type == ALPINE_NIC)) { in al_eth_up_complete()
3090 al_eth_forward_int_config((uint32_t*)adapter->internal_pcie_base + in al_eth_up_complete()
3096 mtx_lock(&adapter->stats_mtx); in al_eth_up_complete()
3097 callout_reset(&adapter->stats_callout, hz, al_tick_stats, (void*)adapter); in al_eth_up_complete()
3098 mtx_unlock(&adapter->stats_mtx); in al_eth_up_complete()
3100 al_eth_mac_start(&adapter->hal_adapter); in al_eth_up_complete()
3109 mii_mediachg(adapter->mii); in al_media_update()
3120 if (sc->mii == NULL) { in al_media_status()
3121 ifmr->ifm_active = IFM_ETHER | IFM_NONE; in al_media_status()
3122 ifmr->ifm_status = 0; in al_media_status()
3127 mii = sc->mii; in al_media_status()
3130 ifmr->ifm_active = mii->mii_media_active; in al_media_status()
3131 ifmr->ifm_status = mii->mii_media_status; in al_media_status()
3139 mii_tick(adapter->mii); in al_tick()
3142 callout_schedule(&adapter->wd_callout, hz); in al_tick()
3152 callout_schedule(&adapter->stats_callout, hz); in al_tick_stats()
3158 if_t ifp = adapter->netdev; in al_eth_up()
3161 if (adapter->up) in al_eth_up()
3164 if ((adapter->flags & AL_ETH_FLAG_RESET_REQUESTED) != 0) { in al_eth_up()
3166 adapter->flags &= ~AL_ETH_FLAG_RESET_REQUESTED; in al_eth_up()
3185 device_printf(adapter->dev, in al_eth_up()
3206 adapter->up = true; in al_eth_up()
3208 if (adapter->mac_mode == AL_ETH_MAC_MODE_10GbE_Serial) in al_eth_up()
3209 if_link_state_change(adapter->netdev, LINK_STATE_UP); in al_eth_up()
3211 if (adapter->mac_mode == AL_ETH_MAC_MODE_RGMII) { in al_eth_up()
3212 mii_mediachg(adapter->mii); in al_eth_up()
3215 mtx_lock(&adapter->wd_mtx); in al_eth_up()
3216 callout_reset(&adapter->wd_callout, hz, al_tick, adapter); in al_eth_up()
3217 mtx_unlock(&adapter->wd_mtx); in al_eth_up()
3219 mii_pollstat(adapter->mii); in al_eth_up()
3252 device_printf_dbg(adapter->dev, "al_eth_down: begin\n"); in al_eth_down()
3254 adapter->up = false; in al_eth_down()
3256 mtx_lock(&adapter->wd_mtx); in al_eth_down()
3257 callout_stop(&adapter->wd_callout); in al_eth_down()
3258 mtx_unlock(&adapter->wd_mtx); in al_eth_down()
3262 mtx_lock(&adapter->stats_mtx); in al_eth_down()
3263 callout_stop(&adapter->stats_callout); in al_eth_down()
3264 mtx_unlock(&adapter->stats_mtx); in al_eth_down()
3283 error = al_eth_check_mtu(adapter, ifr->ifr_mtu); in al_ioctl()
3285 device_printf(adapter->dev, "ioctl wrong mtu %u\n", in al_ioctl()
3286 if_getmtu(adapter->netdev)); in al_ioctl()
3291 if_setmtu(adapter->netdev, ifr->ifr_mtu); in al_ioctl()
3298 if (((if_getflags(ifp) ^ adapter->if_flags) & in al_ioctl()
3300 device_printf_dbg(adapter->dev, in al_ioctl()
3316 adapter->if_flags = if_getflags(ifp); in al_ioctl()
3322 device_printf_dbg(adapter->dev, in al_ioctl()
3332 if (adapter->mii != NULL) in al_ioctl()
3334 &adapter->mii->mii_media, command); in al_ioctl()
3337 &adapter->media, command); in al_ioctl()
3344 mask = ifr->ifr_reqcap ^ if_getcapenable(ifp); in al_ioctl()
3347 if ((ifr->ifr_reqcap & IFCAP_POLLING) != 0) { in al_ioctl()
3428 rc = al_eth_mdio_read(&adapter->hal_adapter, adapter->phy_addr, in al_miibus_readreg()
3429 -1, reg, &value); in al_miibus_readreg()
3434 device_printf_dbg(adapter->dev, in al_miibus_readreg()
3437 timeout -= MDIO_PAUSE_MSEC; in al_miibus_readreg()
3442 device_printf(adapter->dev, "MDIO read failed on timeout\n"); in al_miibus_readreg()
3455 rc = al_eth_mdio_write(&adapter->hal_adapter, adapter->phy_addr, in al_miibus_writereg()
3456 -1, reg, value); in al_miibus_writereg()
3461 device_printf(adapter->dev, in al_miibus_writereg()
3464 timeout -= MDIO_PAUSE_MSEC; in al_miibus_writereg()
3469 device_printf(adapter->dev, "MDIO write failed on timeout\n"); in al_miibus_writereg()
3479 device_printf_dbg(adapter->dev, in al_miibus_statchg()
3481 device_printf_dbg(adapter->dev, in al_miibus_statchg()
3483 adapter->mii->mii_media_active, adapter->mii->mii_media_status); in al_miibus_statchg()
3485 if (adapter->up == 0) in al_miibus_statchg()
3488 if ((adapter->mii->mii_media_status & IFM_AVALID) != 0) { in al_miibus_statchg()
3489 if (adapter->mii->mii_media_status & IFM_ACTIVE) { in al_miibus_statchg()
3490 device_printf(adapter->dev, "link is UP\n"); in al_miibus_statchg()
3491 if_link_state_change(adapter->netdev, LINK_STATE_UP); in al_miibus_statchg()
3493 device_printf(adapter->dev, "link is DOWN\n"); in al_miibus_statchg()
3494 if_link_state_change(adapter->netdev, LINK_STATE_DOWN); in al_miibus_statchg()
3506 if (adapter->mii == NULL) in al_miibus_linkchg()
3509 if ((if_getflags(adapter->netdev) & IFF_UP) == 0) in al_miibus_linkchg()
3513 if ((adapter->mii->mii_media_status & (IFM_AVALID | IFM_ACTIVE)) != in al_miibus_linkchg()
3518 if ((adapter->mii->mii_media_active & IFM_FDX) != 0) in al_miibus_linkchg()
3521 speed = IFM_SUBTYPE(adapter->mii->mii_media_active); in al_miibus_linkchg()
3524 al_eth_mac_link_config(&adapter->hal_adapter, 0, 1, in al_miibus_linkchg()
3530 al_eth_mac_link_config(&adapter->hal_adapter, 0, 1, in al_miibus_linkchg()
3536 al_eth_mac_link_config(&adapter->hal_adapter, 0, 1, in al_miibus_linkchg()
3541 device_printf(adapter->dev, "ERROR: unknown MII media active 0x%08x\n", in al_miibus_linkchg()
3542 adapter->mii->mii_media_active); in al_miibus_linkchg()