Lines Matching full:oct

96 static int	lio_chip_specific_setup(struct octeon_device *oct);
98 static int lio_load_firmware(struct octeon_device *oct);
99 static int lio_nic_starter(struct octeon_device *oct);
100 static int lio_init_nic_module(struct octeon_device *oct);
103 static void lio_if_cfg_callback(struct octeon_device *oct, uint32_t status,
107 static int lio_setup_glists(struct octeon_device *oct, struct lio *lio,
109 static void lio_destroy_nic_device(struct octeon_device *oct, int ifidx);
113 static int lio_stop_nic_module(struct octeon_device *oct);
114 static void lio_destroy_resources(struct octeon_device *oct);
121 lio_get_other_octeon_device(struct octeon_device *oct);
123 static int lio_wait_for_oq_pkts(struct octeon_device *oct);
126 static int lio_dbg_console_print(struct octeon_device *oct,
681 * @param oct octeon device
684 lio_pci_flr(struct octeon_device *oct) in lio_pci_flr() argument
688 pci_find_cap(oct->device, PCIY_EXPRESS, &exppos); in lio_pci_flr()
690 pci_save_state(oct->device); in lio_pci_flr()
693 pci_write_config(oct->device, PCIR_COMMAND, PCIM_CMD_INTxDIS, 2); in lio_pci_flr()
698 status = pci_read_config(oct->device, exppos + PCIER_DEVICE_STA, 2); in lio_pci_flr()
700 lio_dev_info(oct, "Function reset incomplete after 100ms, sleeping for 5 seconds\n"); in lio_pci_flr()
703 status = pci_read_config(oct->device, exppos + PCIER_DEVICE_STA, 2); in lio_pci_flr()
705 lio_dev_info(oct, "Function reset still incomplete after 5s, reset anyway\n"); in lio_pci_flr()
708 pci_write_config(oct->device, exppos + PCIER_DEVICE_CTL, PCIEM_CTL_INITIATE_FLR, 2); in lio_pci_flr()
711 pci_restore_state(oct->device); in lio_pci_flr()
728 lio_dbg_console_print(struct octeon_device *oct, uint32_t console_num, in lio_dbg_console_print() argument
733 lio_dev_info(oct, "%u: %s%s\n", console_num, prefix, suffix); in lio_dbg_console_print()
735 lio_dev_info(oct, "%u: %s\n", console_num, prefix); in lio_dbg_console_print()
737 lio_dev_info(oct, "%u: %s\n", console_num, suffix); in lio_dbg_console_print()
747 struct octeon_device *oct = param; in lio_watchdog() local
753 kproc_suspend_check(oct->watchdog_task); in lio_watchdog()
755 (uint16_t)lio_read_csr64(oct, LIO_CN23XX_SLI_SCRATCH2); in lio_watchdog()
760 oct->cores_crashed = true; in lio_watchdog()
761 other_oct = lio_get_other_octeon_device(oct); in lio_watchdog()
774 lio_dev_err(oct, in lio_watchdog()
775 "ERROR: Octeon core %d crashed or got stuck! See oct-fwdump for details.\n", in lio_watchdog()
789 lio_chip_specific_setup(struct octeon_device *oct) in lio_chip_specific_setup() argument
795 dev_id = lio_read_pci_cfg(oct, 0); in lio_chip_specific_setup()
796 oct->subdevice_id = pci_get_subdevice(oct->device); in lio_chip_specific_setup()
800 oct->chip_id = LIO_CN23XX_PF_VID; in lio_chip_specific_setup()
801 if (pci_get_function(oct->device) == 0) { in lio_chip_specific_setup()
803 lio_dev_info(oct, "Invalid num_queues_per_pf0: %d, Setting it to default\n", in lio_chip_specific_setup()
808 oct->sriov_info.num_pf_rings = num_queues_per_pf0; in lio_chip_specific_setup()
811 lio_dev_info(oct, "Invalid num_queues_per_pf1: %d, Setting it to default\n", in lio_chip_specific_setup()
816 oct->sriov_info.num_pf_rings = num_queues_per_pf1; in lio_chip_specific_setup()
819 ret = lio_cn23xx_pf_setup_device(oct); in lio_chip_specific_setup()
825 lio_dev_err(oct, "Unknown device found (dev_id: %x)\n", dev_id); in lio_chip_specific_setup()
829 lio_dev_info(oct, "%s PASS%d.%d %s Version: %s\n", s, in lio_chip_specific_setup()
830 OCTEON_MAJOR_REV(oct), OCTEON_MINOR_REV(oct), in lio_chip_specific_setup()
831 lio_get_conf(oct)->card_name, LIO_VERSION); in lio_chip_specific_setup()
837 lio_get_other_octeon_device(struct octeon_device *oct) in lio_get_other_octeon_device() argument
841 other_oct = lio_get_device(oct->octeon_id + 1); in lio_get_other_octeon_device()
846 oct_busnum = pci_get_bus(oct->device); in lio_get_other_octeon_device()
852 oct_slot = pci_get_slot(oct->device); in lio_get_other_octeon_device()
864 * @param oct octeon device
869 lio_load_firmware(struct octeon_device *oct) in lio_load_firmware() argument
882 lio_get_conf(oct)->card_name, tmp_fw_type, LIO_FW_NAME_SUFFIX); in lio_load_firmware()
886 lio_dev_err(oct, "Request firmware failed. Could not find file %s.\n", in lio_load_firmware()
891 ret = lio_download_firmware(oct, fw->data, fw->datasize); in lio_load_firmware()
899 lio_nic_starter(struct octeon_device *oct) in lio_nic_starter() argument
903 atomic_store_rel_int(&oct->status, LIO_DEV_RUNNING); in lio_nic_starter()
905 if (oct->app_mode && oct->app_mode == LIO_DRV_NIC_APP) { in lio_nic_starter()
906 if (lio_init_nic_module(oct)) { in lio_nic_starter()
907 lio_dev_err(oct, "NIC initialization failed\n"); in lio_nic_starter()
911 if (octeon_enable_sriov(oct) < 0) in lio_nic_starter()
916 lio_dev_err(oct, in lio_nic_starter()
918 oct->app_mode); in lio_nic_starter()
926 lio_init_nic_module(struct octeon_device *oct) in lio_init_nic_module() argument
928 int num_nic_ports = LIO_GET_NUM_NIC_PORTS_CFG(lio_get_conf(oct)); in lio_init_nic_module()
931 lio_dev_dbg(oct, "Initializing network interfaces\n"); in lio_init_nic_module()
939 oct->ifcount = num_nic_ports; in lio_init_nic_module()
941 bzero(&oct->props, sizeof(struct lio_if_props)); in lio_init_nic_module()
943 oct->props.gmxport = -1; in lio_init_nic_module()
945 retval = lio_setup_nic_devices(oct); in lio_init_nic_module()
947 lio_dev_err(oct, "Setup NIC devices failed\n"); in lio_init_nic_module()
951 lio_dev_dbg(oct, "Network interfaces ready\n"); in lio_init_nic_module()
957 oct->ifcount = 0; in lio_init_nic_module()
992 lio_get_media_subtype(struct octeon_device *oct) in lio_get_media_subtype() argument
995 switch(oct->subdevice_id) { in lio_get_media_subtype()
1010 lio_get_baudrate(struct octeon_device *oct) in lio_get_baudrate() argument
1013 switch(oct->subdevice_id) { in lio_get_baudrate()
1061 struct octeon_device *oct = lio->oct_dev; in lio_get_counter() local
1067 for (i = 0; i < oct->num_oqs; i++) { in lio_get_counter()
1069 counter += oct->droq[q_no]->stats.rx_pkts_received; in lio_get_counter()
1073 for (i = 0; i < oct->num_iqs; i++) { in lio_get_counter()
1075 counter += oct->instr_queue[q_no]->stats.tx_done; in lio_get_counter()
1079 for (i = 0; i < oct->num_oqs; i++) { in lio_get_counter()
1081 counter += oct->droq[q_no]->stats.rx_bytes_received; in lio_get_counter()
1085 for (i = 0; i < oct->num_iqs; i++) { in lio_get_counter()
1087 counter += oct->instr_queue[q_no]->stats.tx_tot_bytes; in lio_get_counter()
1091 for (i = 0; i < oct->num_oqs; i++) { in lio_get_counter()
1093 counter += oct->droq[q_no]->stats.rx_dropped; in lio_get_counter()
1097 for (i = 0; i < oct->num_iqs; i++) { in lio_get_counter()
1099 counter += oct->instr_queue[q_no]->stats.tx_dropped; in lio_get_counter()
1103 counter = oct->link_stats.fromwire.total_mcst; in lio_get_counter()
1106 counter = oct->link_stats.fromhost.mcast_pkts_sent; in lio_get_counter()
1109 counter = oct->link_stats.fromhost.total_collisions; in lio_get_counter()
1112 counter = oct->link_stats.fromwire.fcs_err + in lio_get_counter()
1113 oct->link_stats.fromwire.l2_err + in lio_get_counter()
1114 oct->link_stats.fromwire.frame_err; in lio_get_counter()
1126 struct octeon_device *oct = lio->oct_dev; in lio_init_ifnet() local
1135 (IFM_ETHER | IFM_FDX | lio_get_media_subtype(oct)), in lio_init_ifnet()
1141 lio_dev_dbg(oct, "IFMEDIA flags : %x\n", lio->ifmedia.ifm_media); in lio_init_ifnet()
1143 if_initname(ifp, device_get_name(oct->device), in lio_init_ifnet()
1144 device_get_unit(oct->device)); in lio_init_ifnet()
1164 if_setbaudrate(ifp, lio_get_baudrate(oct)); in lio_init_ifnet()
1479 struct octeon_device *oct = (struct octeon_device *)ptr; in lio_link_info() local
1484 lio_dev_dbg(oct, "%s Called\n", __func__); in lio_link_info()
1486 lio_dev_err(oct, "Malformed NIC_INFO, len=%d, ifidx=%d\n", in lio_link_info()
1497 if (oct->props.gmxport == gmxport) in lio_link_info()
1498 lio_update_link_status(oct->props.ifp, ls); in lio_link_info()
1521 struct octeon_device *oct; in lio_free_sgmbuf() local
1527 oct = iq->oct_dev; in lio_free_sgmbuf()
1528 lio = if_getsoftc(oct->props.ifp); in lio_free_sgmbuf()
1540 lio_if_cfg_callback(struct octeon_device *oct, uint32_t status, void *buf) in lio_if_cfg_callback() argument
1549 oct = lio_get_device(ctx->octeon_id); in lio_if_cfg_callback()
1551 lio_dev_err(oct, "nic if cfg instruction failed. Status: %llx (0x%08x)\n", in lio_if_cfg_callback()
1555 snprintf(oct->fw_info.lio_firmware_version, 32, "%s", in lio_if_cfg_callback()
1579 struct octeon_device *oct = lio->oct_dev; in lio_open() local
1588 lio_dev_info(oct, "Interface Open, ready for traffic\n"); in lio_open()
1599 lio_dev_err(oct, "MAC change failed, error: %d\n", ret); in lio_open()
1605 lio_dev_info(oct, "Interface is opened\n"); in lio_open()
1613 struct octeon_device *oct = lio->oct_dev; in lio_set_rxcsum_command() local
1626 lio_dev_err(oct, "DEVFLAGS RXCSUM change failed in core(ret:0x%x)\n", in lio_set_rxcsum_command()
1634 lio_stop_nic_module(struct octeon_device *oct) in lio_stop_nic_module() argument
1639 lio_dev_dbg(oct, "Stopping network interfaces\n"); in lio_stop_nic_module()
1640 if (!oct->ifcount) { in lio_stop_nic_module()
1641 lio_dev_err(oct, "Init for Octeon was not completed\n"); in lio_stop_nic_module()
1645 mtx_lock(&oct->cmd_resp_wqlock); in lio_stop_nic_module()
1646 oct->cmd_resp_state = LIO_DRV_OFFLINE; in lio_stop_nic_module()
1647 mtx_unlock(&oct->cmd_resp_wqlock); in lio_stop_nic_module()
1649 for (i = 0; i < oct->ifcount; i++) { in lio_stop_nic_module()
1650 lio = if_getsoftc(oct->props.ifp); in lio_stop_nic_module()
1651 for (j = 0; j < oct->num_oqs; j++) in lio_stop_nic_module()
1652 lio_unregister_droq_ops(oct, in lio_stop_nic_module()
1658 for (i = 0; i < oct->ifcount; i++) in lio_stop_nic_module()
1659 lio_destroy_nic_device(oct, i); in lio_stop_nic_module()
1661 lio_dev_dbg(oct, "Network interface stopped\n"); in lio_stop_nic_module()
1667 lio_delete_glists(struct octeon_device *oct, struct lio *lio) in lio_delete_glists() argument
1705 lio_setup_glists(struct octeon_device *oct, struct lio *lio, int num_iqs) in lio_setup_glists() argument
1734 lio_delete_glists(oct, lio); in lio_setup_glists()
1747 lio_delete_glists(oct, lio); in lio_setup_glists()
1765 lio_delete_glists(oct, lio); in lio_setup_glists()
1777 struct octeon_device *oct = lio->oct_dev; in lio_stop() local
1791 lio_dev_info(oct, "Interface is stopped\n"); in lio_stop()
1798 struct octeon_device *oct = lio->oct_dev; in lio_check_rx_oom_status() local
1802 for (q = 0; q < oct->num_oqs; q++) { in lio_check_rx_oom_status()
1804 droq = oct->droq[q_no]; in lio_check_rx_oom_status()
1807 if (lio_read_csr32(oct, droq->pkts_credit_reg) <= 0x40) { in lio_check_rx_oom_status()
1809 desc_refilled = lio_droq_refill(oct, droq); in lio_check_rx_oom_status()
1816 lio_write_csr32(oct, droq->pkts_credit_reg, in lio_check_rx_oom_status()
1842 struct octeon_device *oct = lio->oct_dev; in lio_setup_rx_oom_poll_fn() local
1858 oct->octeon_id); in lio_setup_rx_oom_poll_fn()
1884 lio_destroy_nic_device(struct octeon_device *oct, int ifidx) in lio_destroy_nic_device() argument
1886 if_t ifp = oct->props.ifp; in lio_destroy_nic_device()
1890 lio_dev_err(oct, "%s No ifp ptr for index %d\n", in lio_destroy_nic_device()
1899 lio_dev_dbg(oct, "NIC device cleanup\n"); in lio_destroy_nic_device()
1904 if (lio_wait_for_pending_requests(oct)) in lio_destroy_nic_device()
1905 lio_dev_err(oct, "There were pending requests\n"); in lio_destroy_nic_device()
1907 if (lio_wait_for_instr_fetch(oct)) in lio_destroy_nic_device()
1908 lio_dev_err(oct, "IQ had pending instructions\n"); in lio_destroy_nic_device()
1910 if (lio_wait_for_oq_pkts(oct)) in lio_destroy_nic_device()
1911 lio_dev_err(oct, "OQ had pending packets\n"); in lio_destroy_nic_device()
1916 lio_tcp_lro_free(oct, ifp); in lio_destroy_nic_device()
1920 lio_delete_glists(oct, lio); in lio_destroy_nic_device()
1929 oct->props.gmxport = -1; in lio_destroy_nic_device()
1931 oct->props.ifp = NULL; in lio_destroy_nic_device()
1977 lio_rx_ctl_callback(struct octeon_device *oct, uint32_t status, void *buf) in lio_rx_ctl_callback() argument
1984 oct = lio_get_device(ctx->octeon_id); in lio_rx_ctl_callback()
1986 lio_dev_err(oct, "rx ctl instruction failed. Status: %llx\n", in lio_rx_ctl_callback()
2003 struct octeon_device *oct = (struct octeon_device *)lio->oct_dev; in lio_send_rx_ctrl_cmd() local
2007 if (oct->props.rx_on == start_stop) in lio_send_rx_ctrl_cmd()
2010 sc = lio_alloc_soft_command(oct, OCTEON_CMD_SIZE, 16, ctx_size); in lio_send_rx_ctrl_cmd()
2018 ctx->octeon_id = lio_get_device_id(oct); in lio_send_rx_ctrl_cmd()
2027 lio_prepare_soft_command(oct, sc, LIO_OPCODE_NIC, LIO_OPCODE_NIC_CMD, 0, in lio_send_rx_ctrl_cmd()
2034 retval = lio_send_soft_command(oct, sc); in lio_send_rx_ctrl_cmd()
2036 lio_dev_err(oct, "Failed to send RX Control message\n"); in lio_send_rx_ctrl_cmd()
2042 lio_sleep_cond(oct, &ctx->cond); in lio_send_rx_ctrl_cmd()
2043 oct->props.rx_on = start_stop; in lio_send_rx_ctrl_cmd()
2046 lio_free_soft_command(oct, sc); in lio_send_rx_ctrl_cmd()
2054 struct octeon_device *oct = lio->oct_dev; in lio_vlan_rx_add_vid() local
2075 lio_dev_err(oct, "Add VLAN filter failed in core (ret: 0x%x)\n", in lio_vlan_rx_add_vid()
2085 struct octeon_device *oct = lio->oct_dev; in lio_vlan_rx_kill_vid() local
2106 lio_dev_err(oct, in lio_vlan_rx_kill_vid()
2113 lio_wait_for_oq_pkts(struct octeon_device *oct) in lio_wait_for_oq_pkts() argument
2120 for (i = 0; i < LIO_MAX_OUTPUT_QUEUES(oct); i++) { in lio_wait_for_oq_pkts()
2121 if (!(oct->io_qmask.oq & BIT_ULL(i))) in lio_wait_for_oq_pkts()
2124 pkt_cnt = lio_droq_check_hw_for_pkts(oct->droq[i]); in lio_wait_for_oq_pkts()
2127 taskqueue_enqueue(oct->droq[i]->droq_taskqueue, in lio_wait_for_oq_pkts()
2128 &oct->droq[i]->droq_task); in lio_wait_for_oq_pkts()
2140 lio_destroy_resources(struct octeon_device *oct) in lio_destroy_resources() argument
2144 switch (atomic_load_acq_int(&oct->status)) { in lio_destroy_resources()
2148 atomic_store_rel_int(&oct->status, LIO_DEV_IN_RESET); in lio_destroy_resources()
2150 oct->app_mode = LIO_DRV_INVALID_APP; in lio_destroy_resources()
2151 lio_dev_dbg(oct, "Device state is now %s\n", in lio_destroy_resources()
2152 lio_get_state_string(&oct->status)); in lio_destroy_resources()
2162 lio_remove_consoles(oct); in lio_destroy_resources()
2166 if (lio_wait_for_pending_requests(oct)) in lio_destroy_resources()
2167 lio_dev_err(oct, "There were pending requests\n"); in lio_destroy_resources()
2169 if (lio_wait_for_instr_fetch(oct)) in lio_destroy_resources()
2170 lio_dev_err(oct, "IQ had pending instructions\n"); in lio_destroy_resources()
2177 oct->fn_list.disable_io_queues(oct); in lio_destroy_resources()
2179 if (lio_wait_for_oq_pkts(oct)) in lio_destroy_resources()
2180 lio_dev_err(oct, "OQ had pending packets\n"); in lio_destroy_resources()
2185 oct->fn_list.disable_interrupt(oct, OCTEON_ALL_INTR); in lio_destroy_resources()
2187 if (oct->msix_on) { in lio_destroy_resources()
2188 for (i = 0; i < oct->num_msix_irqs - 1; i++) { in lio_destroy_resources()
2189 if (oct->ioq_vector[i].tag != NULL) { in lio_destroy_resources()
2190 bus_teardown_intr(oct->device, in lio_destroy_resources()
2191 oct->ioq_vector[i].msix_res, in lio_destroy_resources()
2192 oct->ioq_vector[i].tag); in lio_destroy_resources()
2193 oct->ioq_vector[i].tag = NULL; in lio_destroy_resources()
2195 if (oct->ioq_vector[i].msix_res != NULL) { in lio_destroy_resources()
2196 bus_release_resource(oct->device, in lio_destroy_resources()
2198 oct->ioq_vector[i].vector, in lio_destroy_resources()
2199 oct->ioq_vector[i].msix_res); in lio_destroy_resources()
2200 oct->ioq_vector[i].msix_res = NULL; in lio_destroy_resources()
2203 /* non-iov vector's argument is oct struct */ in lio_destroy_resources()
2204 if (oct->tag != NULL) { in lio_destroy_resources()
2205 bus_teardown_intr(oct->device, oct->msix_res, in lio_destroy_resources()
2206 oct->tag); in lio_destroy_resources()
2207 oct->tag = NULL; in lio_destroy_resources()
2210 if (oct->msix_res != NULL) { in lio_destroy_resources()
2211 bus_release_resource(oct->device, SYS_RES_IRQ, in lio_destroy_resources()
2212 oct->aux_vector, in lio_destroy_resources()
2213 oct->msix_res); in lio_destroy_resources()
2214 oct->msix_res = NULL; in lio_destroy_resources()
2217 pci_release_msi(oct->device); in lio_destroy_resources()
2224 for (i = 0; i < LIO_MAX_OUTPUT_QUEUES(oct); i++) { in lio_destroy_resources()
2225 if (!(oct->io_qmask.oq & BIT_ULL(i))) in lio_destroy_resources()
2227 lio_delete_droq(oct, i); in lio_destroy_resources()
2233 if (oct->droq[i] != NULL) { in lio_destroy_resources()
2234 free(oct->droq[i], M_DEVBUF); in lio_destroy_resources()
2235 oct->droq[i] = NULL; in lio_destroy_resources()
2238 lio_delete_response_list(oct); in lio_destroy_resources()
2242 for (i = 0; i < LIO_MAX_INSTR_QUEUES(oct); i++) { in lio_destroy_resources()
2243 if (!(oct->io_qmask.iq & BIT_ULL(i))) in lio_destroy_resources()
2246 lio_delete_instr_queue(oct, i); in lio_destroy_resources()
2252 if (oct->instr_queue[i] != NULL) { in lio_destroy_resources()
2253 free(oct->instr_queue[i], M_DEVBUF); in lio_destroy_resources()
2254 oct->instr_queue[i] = NULL; in lio_destroy_resources()
2257 lio_free_ioq_vector(oct); in lio_destroy_resources()
2261 lio_free_sc_buffer_pool(oct); in lio_destroy_resources()
2265 lio_delete_dispatch_list(oct); in lio_destroy_resources()
2269 refcount = lio_deregister_device(oct); in lio_destroy_resources()
2272 lio_pci_flr(oct); in lio_destroy_resources()
2275 oct->fn_list.soft_reset(oct); in lio_destroy_resources()
2277 lio_unmap_pci_barx(oct, 0); in lio_destroy_resources()
2278 lio_unmap_pci_barx(oct, 1); in lio_destroy_resources()
2283 pci_disable_busmaster(oct->device); in lio_destroy_resources()
2288 } /* end switch (oct->status) */ in lio_destroy_resources()