12ea6f76aSRasesh Mody /* 22ea6f76aSRasesh Mody * Copyright (c) 2016 QLogic Corporation. 32ea6f76aSRasesh Mody * All rights reserved. 42ea6f76aSRasesh Mody * www.qlogic.com 52ea6f76aSRasesh Mody * 62ea6f76aSRasesh Mody * See LICENSE.qede_pmd for copyright and licensing details. 72ea6f76aSRasesh Mody */ 82ea6f76aSRasesh Mody 92ea6f76aSRasesh Mody #include "qede_ethdev.h" 102af14ca7SHarish Patil #include <rte_alarm.h> 117eca78ceSHarish Patil #include <rte_version.h> 122ea6f76aSRasesh Mody 132ea6f76aSRasesh Mody /* Globals */ 142ea6f76aSRasesh Mody static const struct qed_eth_ops *qed_ops; 152ea6f76aSRasesh Mody static const char *drivername = "qede pmd"; 162af14ca7SHarish Patil static int64_t timer_period = 1; 172ea6f76aSRasesh Mody 18d1216e22SRasesh Mody struct rte_qede_xstats_name_off { 19d1216e22SRasesh Mody char name[RTE_ETH_XSTATS_NAME_SIZE]; 20d1216e22SRasesh Mody uint64_t offset; 21d1216e22SRasesh Mody }; 22d1216e22SRasesh Mody 23d1216e22SRasesh Mody static const struct rte_qede_xstats_name_off qede_xstats_strings[] = { 24d1216e22SRasesh Mody {"rx_unicast_bytes", offsetof(struct ecore_eth_stats, rx_ucast_bytes)}, 25d1216e22SRasesh Mody {"rx_multicast_bytes", 26d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, rx_mcast_bytes)}, 27d1216e22SRasesh Mody {"rx_broadcast_bytes", 28d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, rx_bcast_bytes)}, 29d1216e22SRasesh Mody {"rx_unicast_packets", offsetof(struct ecore_eth_stats, rx_ucast_pkts)}, 30d1216e22SRasesh Mody {"rx_multicast_packets", 31d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, rx_mcast_pkts)}, 32d1216e22SRasesh Mody {"rx_broadcast_packets", 33d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, rx_bcast_pkts)}, 34d1216e22SRasesh Mody 35d1216e22SRasesh Mody {"tx_unicast_bytes", offsetof(struct ecore_eth_stats, tx_ucast_bytes)}, 36d1216e22SRasesh Mody {"tx_multicast_bytes", 37d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, tx_mcast_bytes)}, 38d1216e22SRasesh Mody {"tx_broadcast_bytes", 39d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, tx_bcast_bytes)}, 40d1216e22SRasesh Mody {"tx_unicast_packets", offsetof(struct ecore_eth_stats, tx_ucast_pkts)}, 41d1216e22SRasesh Mody {"tx_multicast_packets", 42d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, tx_mcast_pkts)}, 43d1216e22SRasesh Mody {"tx_broadcast_packets", 44d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, tx_bcast_pkts)}, 45d1216e22SRasesh Mody 46d1216e22SRasesh Mody {"rx_64_byte_packets", 47d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, rx_64_byte_packets)}, 48d1216e22SRasesh Mody {"rx_65_to_127_byte_packets", 49d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, rx_65_to_127_byte_packets)}, 50d1216e22SRasesh Mody {"rx_128_to_255_byte_packets", 51d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, rx_128_to_255_byte_packets)}, 52d1216e22SRasesh Mody {"rx_256_to_511_byte_packets", 53d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, rx_256_to_511_byte_packets)}, 54d1216e22SRasesh Mody {"rx_512_to_1023_byte_packets", 55d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, rx_512_to_1023_byte_packets)}, 56d1216e22SRasesh Mody {"rx_1024_to_1518_byte_packets", 57d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, rx_1024_to_1518_byte_packets)}, 58d1216e22SRasesh Mody {"rx_1519_to_1522_byte_packets", 59d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, rx_1519_to_1522_byte_packets)}, 60d1216e22SRasesh Mody {"rx_1519_to_2047_byte_packets", 61d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, rx_1519_to_2047_byte_packets)}, 62d1216e22SRasesh Mody {"rx_2048_to_4095_byte_packets", 63d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, rx_2048_to_4095_byte_packets)}, 64d1216e22SRasesh Mody {"rx_4096_to_9216_byte_packets", 65d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, rx_4096_to_9216_byte_packets)}, 66d1216e22SRasesh Mody {"rx_9217_to_16383_byte_packets", 67d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, 68d1216e22SRasesh Mody rx_9217_to_16383_byte_packets)}, 69d1216e22SRasesh Mody {"tx_64_byte_packets", 70d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, tx_64_byte_packets)}, 71d1216e22SRasesh Mody {"tx_65_to_127_byte_packets", 72d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, tx_65_to_127_byte_packets)}, 73d1216e22SRasesh Mody {"tx_128_to_255_byte_packets", 74d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, tx_128_to_255_byte_packets)}, 75d1216e22SRasesh Mody {"tx_256_to_511_byte_packets", 76d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, tx_256_to_511_byte_packets)}, 77d1216e22SRasesh Mody {"tx_512_to_1023_byte_packets", 78d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, tx_512_to_1023_byte_packets)}, 79d1216e22SRasesh Mody {"tx_1024_to_1518_byte_packets", 80d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, tx_1024_to_1518_byte_packets)}, 81d1216e22SRasesh Mody {"trx_1519_to_1522_byte_packets", 82d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, tx_1519_to_2047_byte_packets)}, 83d1216e22SRasesh Mody {"tx_2048_to_4095_byte_packets", 84d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, tx_2048_to_4095_byte_packets)}, 85d1216e22SRasesh Mody {"tx_4096_to_9216_byte_packets", 86d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, tx_4096_to_9216_byte_packets)}, 87d1216e22SRasesh Mody {"tx_9217_to_16383_byte_packets", 88d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, 89d1216e22SRasesh Mody tx_9217_to_16383_byte_packets)}, 90d1216e22SRasesh Mody 91d1216e22SRasesh Mody {"rx_mac_crtl_frames", 92d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, rx_mac_crtl_frames)}, 93d1216e22SRasesh Mody {"tx_mac_control_frames", 94d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, tx_mac_ctrl_frames)}, 95d1216e22SRasesh Mody {"rx_pause_frames", offsetof(struct ecore_eth_stats, rx_pause_frames)}, 96d1216e22SRasesh Mody {"tx_pause_frames", offsetof(struct ecore_eth_stats, tx_pause_frames)}, 97d1216e22SRasesh Mody {"rx_priority_flow_control_frames", 98d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, rx_pfc_frames)}, 99d1216e22SRasesh Mody {"tx_priority_flow_control_frames", 100d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, tx_pfc_frames)}, 101d1216e22SRasesh Mody 102d1216e22SRasesh Mody {"rx_crc_errors", offsetof(struct ecore_eth_stats, rx_crc_errors)}, 103d1216e22SRasesh Mody {"rx_align_errors", offsetof(struct ecore_eth_stats, rx_align_errors)}, 104d1216e22SRasesh Mody {"rx_carrier_errors", 105d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, rx_carrier_errors)}, 106d1216e22SRasesh Mody {"rx_oversize_packet_errors", 107d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, rx_oversize_packets)}, 108d1216e22SRasesh Mody {"rx_jabber_errors", offsetof(struct ecore_eth_stats, rx_jabbers)}, 109d1216e22SRasesh Mody {"rx_undersize_packet_errors", 110d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, rx_undersize_packets)}, 111d1216e22SRasesh Mody {"rx_fragments", offsetof(struct ecore_eth_stats, rx_fragments)}, 112d1216e22SRasesh Mody {"rx_host_buffer_not_available", 113d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, no_buff_discards)}, 114d1216e22SRasesh Mody /* Number of packets discarded because they are bigger than MTU */ 115d1216e22SRasesh Mody {"rx_packet_too_big_discards", 116d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, packet_too_big_discard)}, 117d1216e22SRasesh Mody {"rx_ttl_zero_discards", 118d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, ttl0_discard)}, 119d1216e22SRasesh Mody {"rx_multi_function_tag_filter_discards", 120d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, mftag_filter_discards)}, 121d1216e22SRasesh Mody {"rx_mac_filter_discards", 122d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, mac_filter_discards)}, 123d1216e22SRasesh Mody {"rx_hw_buffer_truncates", 124d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, brb_truncates)}, 125d1216e22SRasesh Mody {"rx_hw_buffer_discards", 126d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, brb_discards)}, 127d1216e22SRasesh Mody {"tx_lpi_entry_count", 128d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, tx_lpi_entry_count)}, 129d1216e22SRasesh Mody {"tx_total_collisions", 130d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, tx_total_collisions)}, 131d1216e22SRasesh Mody {"tx_error_drop_packets", 132d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, tx_err_drop_pkts)}, 133d1216e22SRasesh Mody 134d1216e22SRasesh Mody {"rx_mac_bytes", offsetof(struct ecore_eth_stats, rx_mac_bytes)}, 135d1216e22SRasesh Mody {"rx_mac_unicast_packets", 136d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, rx_mac_uc_packets)}, 137d1216e22SRasesh Mody {"rx_mac_multicast_packets", 138d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, rx_mac_mc_packets)}, 139d1216e22SRasesh Mody {"rx_mac_broadcast_packets", 140d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, rx_mac_bc_packets)}, 141d1216e22SRasesh Mody {"rx_mac_frames_ok", 142d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, rx_mac_frames_ok)}, 143d1216e22SRasesh Mody {"tx_mac_bytes", offsetof(struct ecore_eth_stats, tx_mac_bytes)}, 144d1216e22SRasesh Mody {"tx_mac_unicast_packets", 145d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, tx_mac_uc_packets)}, 146d1216e22SRasesh Mody {"tx_mac_multicast_packets", 147d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, tx_mac_mc_packets)}, 148d1216e22SRasesh Mody {"tx_mac_broadcast_packets", 149d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, tx_mac_bc_packets)}, 150d1216e22SRasesh Mody 151d1216e22SRasesh Mody {"lro_coalesced_packets", 152d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, tpa_coalesced_pkts)}, 153d1216e22SRasesh Mody {"lro_coalesced_events", 154d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, tpa_coalesced_events)}, 155d1216e22SRasesh Mody {"lro_aborts_num", 156d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, tpa_aborts_num)}, 157d1216e22SRasesh Mody {"lro_not_coalesced_packets", 158d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, tpa_not_coalesced_pkts)}, 159d1216e22SRasesh Mody {"lro_coalesced_bytes", 160d1216e22SRasesh Mody offsetof(struct ecore_eth_stats, tpa_coalesced_bytes)}, 161d1216e22SRasesh Mody }; 162d1216e22SRasesh Mody 1637634c5f9SRasesh Mody static const struct rte_qede_xstats_name_off qede_rxq_xstats_strings[] = { 1647634c5f9SRasesh Mody {"rx_q_segments", 1657634c5f9SRasesh Mody offsetof(struct qede_rx_queue, rx_segs)}, 1667634c5f9SRasesh Mody {"rx_q_hw_errors", 1677634c5f9SRasesh Mody offsetof(struct qede_rx_queue, rx_hw_errors)}, 1687634c5f9SRasesh Mody {"rx_q_allocation_errors", 1697634c5f9SRasesh Mody offsetof(struct qede_rx_queue, rx_alloc_errors)} 1707634c5f9SRasesh Mody }; 1717634c5f9SRasesh Mody 1722ea6f76aSRasesh Mody static void qede_interrupt_action(struct ecore_hwfn *p_hwfn) 1732ea6f76aSRasesh Mody { 1742ea6f76aSRasesh Mody ecore_int_sp_dpc((osal_int_ptr_t)(p_hwfn)); 1752ea6f76aSRasesh Mody } 1762ea6f76aSRasesh Mody 1772ea6f76aSRasesh Mody static void 1782ea6f76aSRasesh Mody qede_interrupt_handler(__rte_unused struct rte_intr_handle *handle, void *param) 1792ea6f76aSRasesh Mody { 1802ea6f76aSRasesh Mody struct rte_eth_dev *eth_dev = (struct rte_eth_dev *)param; 1812ea6f76aSRasesh Mody struct qede_dev *qdev = eth_dev->data->dev_private; 1822ea6f76aSRasesh Mody struct ecore_dev *edev = &qdev->edev; 1832ea6f76aSRasesh Mody 1842ea6f76aSRasesh Mody qede_interrupt_action(ECORE_LEADING_HWFN(edev)); 1852ea6f76aSRasesh Mody if (rte_intr_enable(ð_dev->pci_dev->intr_handle)) 1862ea6f76aSRasesh Mody DP_ERR(edev, "rte_intr_enable failed\n"); 1872ea6f76aSRasesh Mody } 1882ea6f76aSRasesh Mody 1892ea6f76aSRasesh Mody static void 1902ea6f76aSRasesh Mody qede_alloc_etherdev(struct qede_dev *qdev, struct qed_dev_eth_info *info) 1912ea6f76aSRasesh Mody { 1922ea6f76aSRasesh Mody rte_memcpy(&qdev->dev_info, info, sizeof(*info)); 1932ea6f76aSRasesh Mody qdev->num_tc = qdev->dev_info.num_tc; 1942ea6f76aSRasesh Mody qdev->ops = qed_ops; 1952ea6f76aSRasesh Mody } 1962ea6f76aSRasesh Mody 1972ea6f76aSRasesh Mody static void qede_print_adapter_info(struct qede_dev *qdev) 1982ea6f76aSRasesh Mody { 1992ea6f76aSRasesh Mody struct ecore_dev *edev = &qdev->edev; 2002ea6f76aSRasesh Mody struct qed_dev_info *info = &qdev->dev_info.common; 2017eca78ceSHarish Patil static char drv_ver[QEDE_PMD_DRV_VER_STR_SIZE]; 2027eca78ceSHarish Patil static char ver_str[QEDE_PMD_DRV_VER_STR_SIZE]; 2032ea6f76aSRasesh Mody 2042ea6f76aSRasesh Mody DP_INFO(edev, "*********************************\n"); 2057eca78ceSHarish Patil DP_INFO(edev, " DPDK version:%s\n", rte_version()); 2062ea6f76aSRasesh Mody DP_INFO(edev, " Chip details : %s%d\n", 2072ea6f76aSRasesh Mody ECORE_IS_BB(edev) ? "BB" : "AH", 2082ea6f76aSRasesh Mody CHIP_REV_IS_A0(edev) ? 0 : 1); 2097eca78ceSHarish Patil snprintf(ver_str, QEDE_PMD_DRV_VER_STR_SIZE, "%d.%d.%d.%d", 2107eca78ceSHarish Patil info->fw_major, info->fw_minor, info->fw_rev, info->fw_eng); 2117eca78ceSHarish Patil snprintf(drv_ver, QEDE_PMD_DRV_VER_STR_SIZE, "%s_%s", 2127eca78ceSHarish Patil ver_str, QEDE_PMD_VERSION); 2137eca78ceSHarish Patil DP_INFO(edev, " Driver version : %s\n", drv_ver); 2142ea6f76aSRasesh Mody DP_INFO(edev, " Firmware version : %s\n", ver_str); 2152ea6f76aSRasesh Mody 2167eca78ceSHarish Patil snprintf(ver_str, MCP_DRV_VER_STR_SIZE, 2177eca78ceSHarish Patil "%d.%d.%d.%d", 2182ea6f76aSRasesh Mody (info->mfw_rev >> 24) & 0xff, 2192ea6f76aSRasesh Mody (info->mfw_rev >> 16) & 0xff, 2202ea6f76aSRasesh Mody (info->mfw_rev >> 8) & 0xff, (info->mfw_rev) & 0xff); 2217eca78ceSHarish Patil DP_INFO(edev, " Management Firmware version : %s\n", ver_str); 2222ea6f76aSRasesh Mody DP_INFO(edev, " Firmware file : %s\n", fw_file); 2232ea6f76aSRasesh Mody DP_INFO(edev, "*********************************\n"); 2242ea6f76aSRasesh Mody } 2252ea6f76aSRasesh Mody 2262ea6f76aSRasesh Mody static int 2272ea6f76aSRasesh Mody qede_set_ucast_rx_mac(struct qede_dev *qdev, 2282ea6f76aSRasesh Mody enum qed_filter_xcast_params_type opcode, 2292ea6f76aSRasesh Mody uint8_t mac[ETHER_ADDR_LEN]) 2302ea6f76aSRasesh Mody { 2312ea6f76aSRasesh Mody struct ecore_dev *edev = &qdev->edev; 2322ea6f76aSRasesh Mody struct qed_filter_params filter_cmd; 2332ea6f76aSRasesh Mody 2342ea6f76aSRasesh Mody memset(&filter_cmd, 0, sizeof(filter_cmd)); 2352ea6f76aSRasesh Mody filter_cmd.type = QED_FILTER_TYPE_UCAST; 2362ea6f76aSRasesh Mody filter_cmd.filter.ucast.type = opcode; 2372ea6f76aSRasesh Mody filter_cmd.filter.ucast.mac_valid = 1; 2382ea6f76aSRasesh Mody rte_memcpy(&filter_cmd.filter.ucast.mac[0], &mac[0], ETHER_ADDR_LEN); 2392ea6f76aSRasesh Mody return qdev->ops->filter_config(edev, &filter_cmd); 2402ea6f76aSRasesh Mody } 2412ea6f76aSRasesh Mody 2422ea6f76aSRasesh Mody static void 2432ea6f76aSRasesh Mody qede_mac_addr_add(struct rte_eth_dev *eth_dev, struct ether_addr *mac_addr, 2442ea6f76aSRasesh Mody uint32_t index, __rte_unused uint32_t pool) 2452ea6f76aSRasesh Mody { 2462ea6f76aSRasesh Mody struct qede_dev *qdev = eth_dev->data->dev_private; 2472ea6f76aSRasesh Mody struct ecore_dev *edev = &qdev->edev; 2482ea6f76aSRasesh Mody int rc; 2492ea6f76aSRasesh Mody 2502ea6f76aSRasesh Mody PMD_INIT_FUNC_TRACE(edev); 2512ea6f76aSRasesh Mody 2522ea6f76aSRasesh Mody if (index >= qdev->dev_info.num_mac_addrs) { 2532ea6f76aSRasesh Mody DP_ERR(edev, "Index %u is above MAC filter limit %u\n", 2542ea6f76aSRasesh Mody index, qdev->dev_info.num_mac_addrs); 2552ea6f76aSRasesh Mody return; 2562ea6f76aSRasesh Mody } 2572ea6f76aSRasesh Mody 2582ea6f76aSRasesh Mody /* Adding macaddr even though promiscuous mode is set */ 2592ea6f76aSRasesh Mody if (rte_eth_promiscuous_get(eth_dev->data->port_id) == 1) 2602ea6f76aSRasesh Mody DP_INFO(edev, "Port is in promisc mode, yet adding it\n"); 2612ea6f76aSRasesh Mody 2622ea6f76aSRasesh Mody /* Add MAC filters according to the unicast secondary macs */ 2632ea6f76aSRasesh Mody rc = qede_set_ucast_rx_mac(qdev, QED_FILTER_XCAST_TYPE_ADD, 2642ea6f76aSRasesh Mody mac_addr->addr_bytes); 2652ea6f76aSRasesh Mody if (rc) 2662ea6f76aSRasesh Mody DP_ERR(edev, "Unable to add macaddr rc=%d\n", rc); 2672ea6f76aSRasesh Mody } 2682ea6f76aSRasesh Mody 2692ea6f76aSRasesh Mody static void 2702ea6f76aSRasesh Mody qede_mac_addr_remove(struct rte_eth_dev *eth_dev, uint32_t index) 2712ea6f76aSRasesh Mody { 2722ea6f76aSRasesh Mody struct qede_dev *qdev = eth_dev->data->dev_private; 2732ea6f76aSRasesh Mody struct ecore_dev *edev = &qdev->edev; 2742ea6f76aSRasesh Mody struct ether_addr mac_addr; 2752ea6f76aSRasesh Mody int rc; 2762ea6f76aSRasesh Mody 2772ea6f76aSRasesh Mody PMD_INIT_FUNC_TRACE(edev); 2782ea6f76aSRasesh Mody 2792ea6f76aSRasesh Mody if (index >= qdev->dev_info.num_mac_addrs) { 2802ea6f76aSRasesh Mody DP_ERR(edev, "Index %u is above MAC filter limit %u\n", 2812ea6f76aSRasesh Mody index, qdev->dev_info.num_mac_addrs); 2822ea6f76aSRasesh Mody return; 2832ea6f76aSRasesh Mody } 2842ea6f76aSRasesh Mody 2852ea6f76aSRasesh Mody /* Use the index maintained by rte */ 2862ea6f76aSRasesh Mody ether_addr_copy(ð_dev->data->mac_addrs[index], &mac_addr); 2872ea6f76aSRasesh Mody rc = qede_set_ucast_rx_mac(qdev, QED_FILTER_XCAST_TYPE_DEL, 2882ea6f76aSRasesh Mody mac_addr.addr_bytes); 2892ea6f76aSRasesh Mody if (rc) 2902ea6f76aSRasesh Mody DP_ERR(edev, "Unable to remove macaddr rc=%d\n", rc); 2912ea6f76aSRasesh Mody } 2922ea6f76aSRasesh Mody 2932ea6f76aSRasesh Mody static void 2942ea6f76aSRasesh Mody qede_mac_addr_set(struct rte_eth_dev *eth_dev, struct ether_addr *mac_addr) 2952ea6f76aSRasesh Mody { 2962ea6f76aSRasesh Mody struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 2972ea6f76aSRasesh Mody struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 2982ea6f76aSRasesh Mody int rc; 2992ea6f76aSRasesh Mody 30086a2265eSRasesh Mody if (IS_VF(edev) && !ecore_vf_check_mac(ECORE_LEADING_HWFN(edev), 30186a2265eSRasesh Mody mac_addr->addr_bytes)) { 30286a2265eSRasesh Mody DP_ERR(edev, "Setting MAC address is not allowed\n"); 30386a2265eSRasesh Mody ether_addr_copy(&qdev->primary_mac, 30486a2265eSRasesh Mody ð_dev->data->mac_addrs[0]); 30586a2265eSRasesh Mody return; 30686a2265eSRasesh Mody } 30786a2265eSRasesh Mody 3082ea6f76aSRasesh Mody /* First remove the primary mac */ 3092ea6f76aSRasesh Mody rc = qede_set_ucast_rx_mac(qdev, QED_FILTER_XCAST_TYPE_DEL, 3102ea6f76aSRasesh Mody qdev->primary_mac.addr_bytes); 3112ea6f76aSRasesh Mody 3122ea6f76aSRasesh Mody if (rc) { 3132ea6f76aSRasesh Mody DP_ERR(edev, "Unable to remove current macaddr" 3142ea6f76aSRasesh Mody " Reverting to previous default mac\n"); 3152ea6f76aSRasesh Mody ether_addr_copy(&qdev->primary_mac, 3162ea6f76aSRasesh Mody ð_dev->data->mac_addrs[0]); 3172ea6f76aSRasesh Mody return; 3182ea6f76aSRasesh Mody } 3192ea6f76aSRasesh Mody 3202ea6f76aSRasesh Mody /* Add new MAC */ 3212ea6f76aSRasesh Mody rc = qede_set_ucast_rx_mac(qdev, QED_FILTER_XCAST_TYPE_ADD, 3222ea6f76aSRasesh Mody mac_addr->addr_bytes); 3232ea6f76aSRasesh Mody 3242ea6f76aSRasesh Mody if (rc) 3252ea6f76aSRasesh Mody DP_ERR(edev, "Unable to add new default mac\n"); 3262ea6f76aSRasesh Mody else 3272ea6f76aSRasesh Mody ether_addr_copy(mac_addr, &qdev->primary_mac); 3282ea6f76aSRasesh Mody } 3292ea6f76aSRasesh Mody 3302ea6f76aSRasesh Mody 3312ea6f76aSRasesh Mody 3322ea6f76aSRasesh Mody 3332ea6f76aSRasesh Mody static void qede_config_accept_any_vlan(struct qede_dev *qdev, bool action) 3342ea6f76aSRasesh Mody { 3352ea6f76aSRasesh Mody struct ecore_dev *edev = &qdev->edev; 3362ea6f76aSRasesh Mody struct qed_update_vport_params params = { 3372ea6f76aSRasesh Mody .vport_id = 0, 3382ea6f76aSRasesh Mody .accept_any_vlan = action, 3392ea6f76aSRasesh Mody .update_accept_any_vlan_flg = 1, 3402ea6f76aSRasesh Mody }; 3412ea6f76aSRasesh Mody int rc; 3422ea6f76aSRasesh Mody 3432ea6f76aSRasesh Mody /* Proceed only if action actually needs to be performed */ 3442ea6f76aSRasesh Mody if (qdev->accept_any_vlan == action) 3452ea6f76aSRasesh Mody return; 3462ea6f76aSRasesh Mody 3472ea6f76aSRasesh Mody rc = qdev->ops->vport_update(edev, ¶ms); 3482ea6f76aSRasesh Mody if (rc) { 3492ea6f76aSRasesh Mody DP_ERR(edev, "Failed to %s accept-any-vlan\n", 3502ea6f76aSRasesh Mody action ? "enable" : "disable"); 3512ea6f76aSRasesh Mody } else { 3522ea6f76aSRasesh Mody DP_INFO(edev, "%s accept-any-vlan\n", 3532ea6f76aSRasesh Mody action ? "enabled" : "disabled"); 3542ea6f76aSRasesh Mody qdev->accept_any_vlan = action; 3552ea6f76aSRasesh Mody } 3562ea6f76aSRasesh Mody } 3572ea6f76aSRasesh Mody 3582ea6f76aSRasesh Mody static int qede_vlan_stripping(struct rte_eth_dev *eth_dev, bool set_stripping) 3592ea6f76aSRasesh Mody { 3602ea6f76aSRasesh Mody struct qed_update_vport_params vport_update_params; 3612ea6f76aSRasesh Mody struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 3622ea6f76aSRasesh Mody struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 3632ea6f76aSRasesh Mody int rc; 3642ea6f76aSRasesh Mody 3652ea6f76aSRasesh Mody memset(&vport_update_params, 0, sizeof(vport_update_params)); 3662ea6f76aSRasesh Mody vport_update_params.vport_id = 0; 3672ea6f76aSRasesh Mody vport_update_params.update_inner_vlan_removal_flg = 1; 3682ea6f76aSRasesh Mody vport_update_params.inner_vlan_removal_flg = set_stripping; 3692ea6f76aSRasesh Mody rc = qdev->ops->vport_update(edev, &vport_update_params); 3702ea6f76aSRasesh Mody if (rc) { 3712ea6f76aSRasesh Mody DP_ERR(edev, "Update V-PORT failed %d\n", rc); 3722ea6f76aSRasesh Mody return rc; 3732ea6f76aSRasesh Mody } 3742ea6f76aSRasesh Mody 3752ea6f76aSRasesh Mody return 0; 3762ea6f76aSRasesh Mody } 3772ea6f76aSRasesh Mody 3782ea6f76aSRasesh Mody static void qede_vlan_offload_set(struct rte_eth_dev *eth_dev, int mask) 3792ea6f76aSRasesh Mody { 3802ea6f76aSRasesh Mody struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 3812ea6f76aSRasesh Mody struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 382d87246a4SHarish Patil struct rte_eth_rxmode *rxmode = ð_dev->data->dev_conf.rxmode; 3832ea6f76aSRasesh Mody 3842ea6f76aSRasesh Mody if (mask & ETH_VLAN_STRIP_MASK) { 385d87246a4SHarish Patil if (rxmode->hw_vlan_strip) 3862ea6f76aSRasesh Mody (void)qede_vlan_stripping(eth_dev, 1); 3872ea6f76aSRasesh Mody else 3882ea6f76aSRasesh Mody (void)qede_vlan_stripping(eth_dev, 0); 3892ea6f76aSRasesh Mody } 3902ea6f76aSRasesh Mody 391d87246a4SHarish Patil if (mask & ETH_VLAN_FILTER_MASK) { 392d87246a4SHarish Patil /* VLAN filtering kicks in when a VLAN is added */ 393d87246a4SHarish Patil if (rxmode->hw_vlan_filter) { 394d87246a4SHarish Patil qede_vlan_filter_set(eth_dev, 0, 1); 395d87246a4SHarish Patil } else { 396d87246a4SHarish Patil if (qdev->configured_vlans > 1) { /* Excluding VLAN0 */ 397d87246a4SHarish Patil DP_NOTICE(edev, false, 398d87246a4SHarish Patil " Please remove existing VLAN filters" 399d87246a4SHarish Patil " before disabling VLAN filtering\n"); 400d87246a4SHarish Patil /* Signal app that VLAN filtering is still 401d87246a4SHarish Patil * enabled 402d87246a4SHarish Patil */ 403d87246a4SHarish Patil rxmode->hw_vlan_filter = true; 404d87246a4SHarish Patil } else { 405d87246a4SHarish Patil qede_vlan_filter_set(eth_dev, 0, 0); 406d87246a4SHarish Patil } 407d87246a4SHarish Patil } 408d87246a4SHarish Patil } 409d87246a4SHarish Patil 410d87246a4SHarish Patil if (mask & ETH_VLAN_EXTEND_MASK) 411d87246a4SHarish Patil DP_INFO(edev, "No offloads are supported with VLAN Q-in-Q" 412d87246a4SHarish Patil " and classification is based on outer tag only\n"); 413d87246a4SHarish Patil 414d87246a4SHarish Patil DP_INFO(edev, "vlan offload mask %d vlan-strip %d vlan-filter %d\n", 415d87246a4SHarish Patil mask, rxmode->hw_vlan_strip, rxmode->hw_vlan_filter); 4162ea6f76aSRasesh Mody } 4172ea6f76aSRasesh Mody 4182ea6f76aSRasesh Mody static int qede_set_ucast_rx_vlan(struct qede_dev *qdev, 4192ea6f76aSRasesh Mody enum qed_filter_xcast_params_type opcode, 4202ea6f76aSRasesh Mody uint16_t vid) 4212ea6f76aSRasesh Mody { 4222ea6f76aSRasesh Mody struct qed_filter_params filter_cmd; 4232ea6f76aSRasesh Mody struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 4242ea6f76aSRasesh Mody 4252ea6f76aSRasesh Mody memset(&filter_cmd, 0, sizeof(filter_cmd)); 4262ea6f76aSRasesh Mody filter_cmd.type = QED_FILTER_TYPE_UCAST; 4272ea6f76aSRasesh Mody filter_cmd.filter.ucast.type = opcode; 4282ea6f76aSRasesh Mody filter_cmd.filter.ucast.vlan_valid = 1; 4292ea6f76aSRasesh Mody filter_cmd.filter.ucast.vlan = vid; 4302ea6f76aSRasesh Mody 4312ea6f76aSRasesh Mody return qdev->ops->filter_config(edev, &filter_cmd); 4322ea6f76aSRasesh Mody } 4332ea6f76aSRasesh Mody 4342ea6f76aSRasesh Mody static int qede_vlan_filter_set(struct rte_eth_dev *eth_dev, 4352ea6f76aSRasesh Mody uint16_t vlan_id, int on) 4362ea6f76aSRasesh Mody { 4372ea6f76aSRasesh Mody struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 4382ea6f76aSRasesh Mody struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 4392ea6f76aSRasesh Mody struct qed_dev_eth_info *dev_info = &qdev->dev_info; 440d6cb1753SHarish Patil struct qede_vlan_entry *tmp = NULL; 441d6cb1753SHarish Patil struct qede_vlan_entry *vlan; 4422ea6f76aSRasesh Mody int rc; 4432ea6f76aSRasesh Mody 444bec02288SSony Chacko if (on) { 445d6cb1753SHarish Patil if (qdev->configured_vlans == dev_info->num_vlan_filters) { 446bec02288SSony Chacko DP_INFO(edev, "Reached max VLAN filter limit" 4472ea6f76aSRasesh Mody " enabling accept_any_vlan\n"); 4482ea6f76aSRasesh Mody qede_config_accept_any_vlan(qdev, true); 4492ea6f76aSRasesh Mody return 0; 4502ea6f76aSRasesh Mody } 4512ea6f76aSRasesh Mody 452d6cb1753SHarish Patil SLIST_FOREACH(tmp, &qdev->vlan_list_head, list) { 453d6cb1753SHarish Patil if (tmp->vid == vlan_id) { 454d6cb1753SHarish Patil DP_ERR(edev, "VLAN %u already configured\n", 4552ea6f76aSRasesh Mody vlan_id); 456d6cb1753SHarish Patil return -EEXIST; 457d6cb1753SHarish Patil } 4582ea6f76aSRasesh Mody } 4592ea6f76aSRasesh Mody 460d6cb1753SHarish Patil vlan = rte_malloc(NULL, sizeof(struct qede_vlan_entry), 461d6cb1753SHarish Patil RTE_CACHE_LINE_SIZE); 462d6cb1753SHarish Patil 463d6cb1753SHarish Patil if (!vlan) { 464d6cb1753SHarish Patil DP_ERR(edev, "Did not allocate memory for VLAN\n"); 465d6cb1753SHarish Patil return -ENOMEM; 466d6cb1753SHarish Patil } 467d6cb1753SHarish Patil 468d6cb1753SHarish Patil rc = qede_set_ucast_rx_vlan(qdev, QED_FILTER_XCAST_TYPE_ADD, 469d6cb1753SHarish Patil vlan_id); 470d6cb1753SHarish Patil if (rc) { 471d6cb1753SHarish Patil DP_ERR(edev, "Failed to add VLAN %u rc %d\n", vlan_id, 472d6cb1753SHarish Patil rc); 473d6cb1753SHarish Patil rte_free(vlan); 474d6cb1753SHarish Patil } else { 475d6cb1753SHarish Patil vlan->vid = vlan_id; 476d6cb1753SHarish Patil SLIST_INSERT_HEAD(&qdev->vlan_list_head, vlan, list); 477d6cb1753SHarish Patil qdev->configured_vlans++; 478d6cb1753SHarish Patil DP_INFO(edev, "VLAN %u added, configured_vlans %u\n", 479d6cb1753SHarish Patil vlan_id, qdev->configured_vlans); 480d6cb1753SHarish Patil } 481d6cb1753SHarish Patil } else { 482d6cb1753SHarish Patil SLIST_FOREACH(tmp, &qdev->vlan_list_head, list) { 483d6cb1753SHarish Patil if (tmp->vid == vlan_id) 484d6cb1753SHarish Patil break; 485d6cb1753SHarish Patil } 486d6cb1753SHarish Patil 487d6cb1753SHarish Patil if (!tmp) { 488d6cb1753SHarish Patil if (qdev->configured_vlans == 0) { 489d6cb1753SHarish Patil DP_INFO(edev, 490d6cb1753SHarish Patil "No VLAN filters configured yet\n"); 491d6cb1753SHarish Patil return 0; 492d6cb1753SHarish Patil } 493d6cb1753SHarish Patil 494d6cb1753SHarish Patil DP_ERR(edev, "VLAN %u not configured\n", vlan_id); 495d6cb1753SHarish Patil return -EINVAL; 496d6cb1753SHarish Patil } 497d6cb1753SHarish Patil 498d6cb1753SHarish Patil SLIST_REMOVE(&qdev->vlan_list_head, tmp, qede_vlan_entry, list); 499d6cb1753SHarish Patil 500d6cb1753SHarish Patil rc = qede_set_ucast_rx_vlan(qdev, QED_FILTER_XCAST_TYPE_DEL, 501d6cb1753SHarish Patil vlan_id); 502d6cb1753SHarish Patil if (rc) { 503d6cb1753SHarish Patil DP_ERR(edev, "Failed to delete VLAN %u rc %d\n", 504d6cb1753SHarish Patil vlan_id, rc); 505d6cb1753SHarish Patil } else { 506d6cb1753SHarish Patil qdev->configured_vlans--; 507d6cb1753SHarish Patil DP_INFO(edev, "VLAN %u removed configured_vlans %u\n", 508d6cb1753SHarish Patil vlan_id, qdev->configured_vlans); 509d6cb1753SHarish Patil } 510d6cb1753SHarish Patil } 5112ea6f76aSRasesh Mody 5122ea6f76aSRasesh Mody return rc; 5132ea6f76aSRasesh Mody } 5142ea6f76aSRasesh Mody 515dbac54c2SHarish Patil static int qede_init_vport(struct qede_dev *qdev) 516dbac54c2SHarish Patil { 517dbac54c2SHarish Patil struct ecore_dev *edev = &qdev->edev; 518dbac54c2SHarish Patil struct qed_start_vport_params start = {0}; 519dbac54c2SHarish Patil int rc; 520dbac54c2SHarish Patil 521dbac54c2SHarish Patil start.remove_inner_vlan = 1; 522dbac54c2SHarish Patil start.gro_enable = 0; 523dbac54c2SHarish Patil start.mtu = ETHER_MTU + QEDE_ETH_OVERHEAD; 524dbac54c2SHarish Patil start.vport_id = 0; 525dbac54c2SHarish Patil start.drop_ttl0 = false; 526dbac54c2SHarish Patil start.clear_stats = 1; 527dbac54c2SHarish Patil start.handle_ptp_pkts = 0; 528dbac54c2SHarish Patil 529dbac54c2SHarish Patil rc = qdev->ops->vport_start(edev, &start); 530dbac54c2SHarish Patil if (rc) { 531dbac54c2SHarish Patil DP_ERR(edev, "Start V-PORT failed %d\n", rc); 532dbac54c2SHarish Patil return rc; 533dbac54c2SHarish Patil } 534dbac54c2SHarish Patil 535dbac54c2SHarish Patil DP_INFO(edev, 536dbac54c2SHarish Patil "Start vport ramrod passed, vport_id = %d, MTU = %u\n", 537dbac54c2SHarish Patil start.vport_id, ETHER_MTU); 538dbac54c2SHarish Patil 539dbac54c2SHarish Patil return 0; 540dbac54c2SHarish Patil } 541dbac54c2SHarish Patil 5422ea6f76aSRasesh Mody static int qede_dev_configure(struct rte_eth_dev *eth_dev) 5432ea6f76aSRasesh Mody { 5442ea6f76aSRasesh Mody struct qede_dev *qdev = eth_dev->data->dev_private; 5452ea6f76aSRasesh Mody struct ecore_dev *edev = &qdev->edev; 5462ea6f76aSRasesh Mody struct rte_eth_rxmode *rxmode = ð_dev->data->dev_conf.rxmode; 5479c5d0a66SHarish Patil int rc, i, j; 5482ea6f76aSRasesh Mody 5492ea6f76aSRasesh Mody PMD_INIT_FUNC_TRACE(edev); 5502ea6f76aSRasesh Mody 5512af14ca7SHarish Patil /* Check requirements for 100G mode */ 5522af14ca7SHarish Patil if (edev->num_hwfns > 1) { 553cfe28a98SSony Chacko if (eth_dev->data->nb_rx_queues < 2 || 554cfe28a98SSony Chacko eth_dev->data->nb_tx_queues < 2) { 5552af14ca7SHarish Patil DP_NOTICE(edev, false, 556cfe28a98SSony Chacko "100G mode needs min. 2 RX/TX queues\n"); 5572af14ca7SHarish Patil return -EINVAL; 5582af14ca7SHarish Patil } 5592af14ca7SHarish Patil 560cfe28a98SSony Chacko if ((eth_dev->data->nb_rx_queues % 2 != 0) || 561cfe28a98SSony Chacko (eth_dev->data->nb_tx_queues % 2 != 0)) { 5622af14ca7SHarish Patil DP_NOTICE(edev, false, 563cfe28a98SSony Chacko "100G mode needs even no. of RX/TX queues\n"); 5642af14ca7SHarish Patil return -EINVAL; 5652af14ca7SHarish Patil } 5662af14ca7SHarish Patil } 5672af14ca7SHarish Patil 5682ea6f76aSRasesh Mody /* Sanity checks and throw warnings */ 569bec02288SSony Chacko if (rxmode->enable_scatter == 1) 570bec02288SSony Chacko eth_dev->data->scattered_rx = 1; 5712ea6f76aSRasesh Mody 5722ea6f76aSRasesh Mody if (rxmode->enable_lro == 1) { 5732ea6f76aSRasesh Mody DP_INFO(edev, "LRO is not supported\n"); 5742ea6f76aSRasesh Mody return -EINVAL; 5752ea6f76aSRasesh Mody } 5762ea6f76aSRasesh Mody 5772ea6f76aSRasesh Mody if (!rxmode->hw_strip_crc) 5782ea6f76aSRasesh Mody DP_INFO(edev, "L2 CRC stripping is always enabled in hw\n"); 5792ea6f76aSRasesh Mody 5802ea6f76aSRasesh Mody if (!rxmode->hw_ip_checksum) 5812ea6f76aSRasesh Mody DP_INFO(edev, "IP/UDP/TCP checksum offload is always enabled " 5822ea6f76aSRasesh Mody "in hw\n"); 5832ea6f76aSRasesh Mody 584dbac54c2SHarish Patil /* Check for the port restart case */ 585dbac54c2SHarish Patil if (qdev->state != QEDE_DEV_INIT) { 586dbac54c2SHarish Patil rc = qdev->ops->vport_stop(edev, 0); 587dbac54c2SHarish Patil if (rc != 0) 588dbac54c2SHarish Patil return rc; 589dbac54c2SHarish Patil qede_dealloc_fp_resc(eth_dev); 590dbac54c2SHarish Patil } 5912ea6f76aSRasesh Mody 5929c5d0a66SHarish Patil qdev->fp_num_tx = eth_dev->data->nb_tx_queues; 5939c5d0a66SHarish Patil qdev->fp_num_rx = eth_dev->data->nb_rx_queues; 5949c5d0a66SHarish Patil qdev->num_queues = qdev->fp_num_tx + qdev->fp_num_rx; 5959c5d0a66SHarish Patil 596dbac54c2SHarish Patil /* Fastpath status block should be initialized before sending 597dbac54c2SHarish Patil * VPORT-START in the case of VF. Anyway, do it for both VF/PF. 598dbac54c2SHarish Patil */ 599dbac54c2SHarish Patil rc = qede_alloc_fp_resc(qdev); 600dbac54c2SHarish Patil if (rc != 0) 601dbac54c2SHarish Patil return rc; 6022ea6f76aSRasesh Mody 603dbac54c2SHarish Patil /* Issue VPORT-START with default config values to allow 604dbac54c2SHarish Patil * other port configurations early on. 605dbac54c2SHarish Patil */ 606dbac54c2SHarish Patil rc = qede_init_vport(qdev); 607dbac54c2SHarish Patil if (rc != 0) 608dbac54c2SHarish Patil return rc; 609dbac54c2SHarish Patil 6109c5d0a66SHarish Patil SLIST_INIT(&qdev->vlan_list_head); 6119c5d0a66SHarish Patil 612dbac54c2SHarish Patil /* Add primary mac for PF */ 613dbac54c2SHarish Patil if (IS_PF(edev)) 614dbac54c2SHarish Patil qede_mac_addr_set(eth_dev, &qdev->primary_mac); 615dbac54c2SHarish Patil 616d87246a4SHarish Patil /* Enable VLAN offloads by default */ 617d87246a4SHarish Patil qede_vlan_offload_set(eth_dev, ETH_VLAN_STRIP_MASK | 618d87246a4SHarish Patil ETH_VLAN_FILTER_MASK | 619d87246a4SHarish Patil ETH_VLAN_EXTEND_MASK); 620d87246a4SHarish Patil 621dbac54c2SHarish Patil qdev->state = QEDE_DEV_CONFIG; 6222ea6f76aSRasesh Mody 6239c5d0a66SHarish Patil DP_INFO(edev, "Allocated RSS=%d TSS=%d (with CoS=%d)\n", 6249c5d0a66SHarish Patil (int)QEDE_RSS_COUNT(qdev), (int)QEDE_TSS_COUNT(qdev), 6259c5d0a66SHarish Patil qdev->num_tc); 6269c5d0a66SHarish Patil 6272ea6f76aSRasesh Mody return 0; 6282ea6f76aSRasesh Mody } 6292ea6f76aSRasesh Mody 6302ea6f76aSRasesh Mody /* Info about HW descriptor ring limitations */ 6312ea6f76aSRasesh Mody static const struct rte_eth_desc_lim qede_rx_desc_lim = { 6322ea6f76aSRasesh Mody .nb_max = NUM_RX_BDS_MAX, 6332ea6f76aSRasesh Mody .nb_min = 128, 6342ea6f76aSRasesh Mody .nb_align = 128 /* lowest common multiple */ 6352ea6f76aSRasesh Mody }; 6362ea6f76aSRasesh Mody 6372ea6f76aSRasesh Mody static const struct rte_eth_desc_lim qede_tx_desc_lim = { 6382ea6f76aSRasesh Mody .nb_max = NUM_TX_BDS_MAX, 6392ea6f76aSRasesh Mody .nb_min = 256, 6402ea6f76aSRasesh Mody .nb_align = 256 6412ea6f76aSRasesh Mody }; 6422ea6f76aSRasesh Mody 6432ea6f76aSRasesh Mody static void 6442ea6f76aSRasesh Mody qede_dev_info_get(struct rte_eth_dev *eth_dev, 6452ea6f76aSRasesh Mody struct rte_eth_dev_info *dev_info) 6462ea6f76aSRasesh Mody { 6472ea6f76aSRasesh Mody struct qede_dev *qdev = eth_dev->data->dev_private; 6482ea6f76aSRasesh Mody struct ecore_dev *edev = &qdev->edev; 64964c239b7SHarish Patil struct qed_link_output link; 6501ea56b80SHarish Patil uint32_t speed_cap = 0; 6512ea6f76aSRasesh Mody 6522ea6f76aSRasesh Mody PMD_INIT_FUNC_TRACE(edev); 6532ea6f76aSRasesh Mody 6542ea6f76aSRasesh Mody dev_info->min_rx_bufsize = (uint32_t)(ETHER_MIN_MTU + 6552ea6f76aSRasesh Mody QEDE_ETH_OVERHEAD); 6562ea6f76aSRasesh Mody dev_info->max_rx_pktlen = (uint32_t)ETH_TX_MAX_NON_LSO_PKT_LEN; 6572ea6f76aSRasesh Mody dev_info->rx_desc_lim = qede_rx_desc_lim; 6582ea6f76aSRasesh Mody dev_info->tx_desc_lim = qede_tx_desc_lim; 6592ea6f76aSRasesh Mody dev_info->max_rx_queues = (uint16_t)QEDE_MAX_RSS_CNT(qdev); 6602ea6f76aSRasesh Mody dev_info->max_tx_queues = dev_info->max_rx_queues; 6612ea6f76aSRasesh Mody dev_info->max_mac_addrs = qdev->dev_info.num_mac_addrs; 66286a2265eSRasesh Mody if (IS_VF(edev)) 66386a2265eSRasesh Mody dev_info->max_vfs = 0; 66486a2265eSRasesh Mody else 6652ea6f76aSRasesh Mody dev_info->max_vfs = (uint16_t)NUM_OF_VFS(&qdev->edev); 6662ea6f76aSRasesh Mody dev_info->driver_name = qdev->drv_ver; 6675cdd769aSRasesh Mody dev_info->reta_size = ECORE_RSS_IND_TABLE_SIZE; 6682ea6f76aSRasesh Mody dev_info->flow_type_rss_offloads = (uint64_t)QEDE_RSS_OFFLOAD_ALL; 6692ea6f76aSRasesh Mody 6702ea6f76aSRasesh Mody dev_info->default_txconf = (struct rte_eth_txconf) { 6712ea6f76aSRasesh Mody .txq_flags = QEDE_TXQ_FLAGS, 6722ea6f76aSRasesh Mody }; 6732ea6f76aSRasesh Mody 6742ea6f76aSRasesh Mody dev_info->rx_offload_capa = (DEV_RX_OFFLOAD_VLAN_STRIP | 6752ea6f76aSRasesh Mody DEV_RX_OFFLOAD_IPV4_CKSUM | 6762ea6f76aSRasesh Mody DEV_RX_OFFLOAD_UDP_CKSUM | 6772ea6f76aSRasesh Mody DEV_RX_OFFLOAD_TCP_CKSUM); 6782ea6f76aSRasesh Mody dev_info->tx_offload_capa = (DEV_TX_OFFLOAD_VLAN_INSERT | 6792ea6f76aSRasesh Mody DEV_TX_OFFLOAD_IPV4_CKSUM | 6802ea6f76aSRasesh Mody DEV_TX_OFFLOAD_UDP_CKSUM | 6812ea6f76aSRasesh Mody DEV_TX_OFFLOAD_TCP_CKSUM); 6822ea6f76aSRasesh Mody 68364c239b7SHarish Patil memset(&link, 0, sizeof(struct qed_link_output)); 68464c239b7SHarish Patil qdev->ops->common->get_link(edev, &link); 6851ea56b80SHarish Patil if (link.adv_speed & NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_1G) 6861ea56b80SHarish Patil speed_cap |= ETH_LINK_SPEED_1G; 6871ea56b80SHarish Patil if (link.adv_speed & NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_10G) 6881ea56b80SHarish Patil speed_cap |= ETH_LINK_SPEED_10G; 6891ea56b80SHarish Patil if (link.adv_speed & NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_25G) 6901ea56b80SHarish Patil speed_cap |= ETH_LINK_SPEED_25G; 6911ea56b80SHarish Patil if (link.adv_speed & NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_40G) 6921ea56b80SHarish Patil speed_cap |= ETH_LINK_SPEED_40G; 6931ea56b80SHarish Patil if (link.adv_speed & NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_50G) 6941ea56b80SHarish Patil speed_cap |= ETH_LINK_SPEED_50G; 6951ea56b80SHarish Patil if (link.adv_speed & NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_BB_100G) 6961ea56b80SHarish Patil speed_cap |= ETH_LINK_SPEED_100G; 6971ea56b80SHarish Patil dev_info->speed_capa = speed_cap; 6982ea6f76aSRasesh Mody } 6992ea6f76aSRasesh Mody 7002ea6f76aSRasesh Mody /* return 0 means link status changed, -1 means not changed */ 7012ea6f76aSRasesh Mody static int 7022ea6f76aSRasesh Mody qede_link_update(struct rte_eth_dev *eth_dev, __rte_unused int wait_to_complete) 7032ea6f76aSRasesh Mody { 7042ea6f76aSRasesh Mody struct qede_dev *qdev = eth_dev->data->dev_private; 7052ea6f76aSRasesh Mody struct ecore_dev *edev = &qdev->edev; 7062ea6f76aSRasesh Mody uint16_t link_duplex; 7072ea6f76aSRasesh Mody struct qed_link_output link; 7082ea6f76aSRasesh Mody struct rte_eth_link *curr = ð_dev->data->dev_link; 7092ea6f76aSRasesh Mody 7102ea6f76aSRasesh Mody memset(&link, 0, sizeof(struct qed_link_output)); 7112ea6f76aSRasesh Mody qdev->ops->common->get_link(edev, &link); 7122ea6f76aSRasesh Mody 7132ea6f76aSRasesh Mody /* Link Speed */ 7142ea6f76aSRasesh Mody curr->link_speed = link.speed; 7152ea6f76aSRasesh Mody 7162ea6f76aSRasesh Mody /* Link Mode */ 7172ea6f76aSRasesh Mody switch (link.duplex) { 7182ea6f76aSRasesh Mody case QEDE_DUPLEX_HALF: 7192ea6f76aSRasesh Mody link_duplex = ETH_LINK_HALF_DUPLEX; 7202ea6f76aSRasesh Mody break; 7212ea6f76aSRasesh Mody case QEDE_DUPLEX_FULL: 7222ea6f76aSRasesh Mody link_duplex = ETH_LINK_FULL_DUPLEX; 7232ea6f76aSRasesh Mody break; 7242ea6f76aSRasesh Mody case QEDE_DUPLEX_UNKNOWN: 7252ea6f76aSRasesh Mody default: 7262ea6f76aSRasesh Mody link_duplex = -1; 7272ea6f76aSRasesh Mody } 7282ea6f76aSRasesh Mody curr->link_duplex = link_duplex; 7292ea6f76aSRasesh Mody 7302ea6f76aSRasesh Mody /* Link Status */ 7312ea6f76aSRasesh Mody curr->link_status = (link.link_up) ? ETH_LINK_UP : ETH_LINK_DOWN; 7322ea6f76aSRasesh Mody 7332ea6f76aSRasesh Mody /* AN */ 7342ea6f76aSRasesh Mody curr->link_autoneg = (link.supported_caps & QEDE_SUPPORTED_AUTONEG) ? 7352ea6f76aSRasesh Mody ETH_LINK_AUTONEG : ETH_LINK_FIXED; 7362ea6f76aSRasesh Mody 7372ea6f76aSRasesh Mody DP_INFO(edev, "Link - Speed %u Mode %u AN %u Status %u\n", 7382ea6f76aSRasesh Mody curr->link_speed, curr->link_duplex, 7392ea6f76aSRasesh Mody curr->link_autoneg, curr->link_status); 7402ea6f76aSRasesh Mody 7412ea6f76aSRasesh Mody /* return 0 means link status changed, -1 means not changed */ 7422ea6f76aSRasesh Mody return ((curr->link_status == link.link_up) ? -1 : 0); 7432ea6f76aSRasesh Mody } 7442ea6f76aSRasesh Mody 7452ea6f76aSRasesh Mody static void 7462ea6f76aSRasesh Mody qede_rx_mode_setting(struct rte_eth_dev *eth_dev, 7472ea6f76aSRasesh Mody enum qed_filter_rx_mode_type accept_flags) 7482ea6f76aSRasesh Mody { 7492ea6f76aSRasesh Mody struct qede_dev *qdev = eth_dev->data->dev_private; 7502ea6f76aSRasesh Mody struct ecore_dev *edev = &qdev->edev; 7512ea6f76aSRasesh Mody struct qed_filter_params rx_mode; 7522ea6f76aSRasesh Mody 7532ea6f76aSRasesh Mody DP_INFO(edev, "%s mode %u\n", __func__, accept_flags); 7542ea6f76aSRasesh Mody 7552ea6f76aSRasesh Mody memset(&rx_mode, 0, sizeof(struct qed_filter_params)); 7562ea6f76aSRasesh Mody rx_mode.type = QED_FILTER_TYPE_RX_MODE; 7572ea6f76aSRasesh Mody rx_mode.filter.accept_flags = accept_flags; 7582ea6f76aSRasesh Mody qdev->ops->filter_config(edev, &rx_mode); 7592ea6f76aSRasesh Mody } 7602ea6f76aSRasesh Mody 7612ea6f76aSRasesh Mody static void qede_promiscuous_enable(struct rte_eth_dev *eth_dev) 7622ea6f76aSRasesh Mody { 7632ea6f76aSRasesh Mody struct qede_dev *qdev = eth_dev->data->dev_private; 7642ea6f76aSRasesh Mody struct ecore_dev *edev = &qdev->edev; 7652ea6f76aSRasesh Mody 7662ea6f76aSRasesh Mody PMD_INIT_FUNC_TRACE(edev); 7672ea6f76aSRasesh Mody 7682ea6f76aSRasesh Mody enum qed_filter_rx_mode_type type = QED_FILTER_RX_MODE_TYPE_PROMISC; 7692ea6f76aSRasesh Mody 7702ea6f76aSRasesh Mody if (rte_eth_allmulticast_get(eth_dev->data->port_id) == 1) 7712ea6f76aSRasesh Mody type |= QED_FILTER_RX_MODE_TYPE_MULTI_PROMISC; 7722ea6f76aSRasesh Mody 7732ea6f76aSRasesh Mody qede_rx_mode_setting(eth_dev, type); 7742ea6f76aSRasesh Mody } 7752ea6f76aSRasesh Mody 7762ea6f76aSRasesh Mody static void qede_promiscuous_disable(struct rte_eth_dev *eth_dev) 7772ea6f76aSRasesh Mody { 7782ea6f76aSRasesh Mody struct qede_dev *qdev = eth_dev->data->dev_private; 7792ea6f76aSRasesh Mody struct ecore_dev *edev = &qdev->edev; 7802ea6f76aSRasesh Mody 7812ea6f76aSRasesh Mody PMD_INIT_FUNC_TRACE(edev); 7822ea6f76aSRasesh Mody 7832ea6f76aSRasesh Mody if (rte_eth_allmulticast_get(eth_dev->data->port_id) == 1) 7842ea6f76aSRasesh Mody qede_rx_mode_setting(eth_dev, 7852ea6f76aSRasesh Mody QED_FILTER_RX_MODE_TYPE_MULTI_PROMISC); 7862ea6f76aSRasesh Mody else 7872ea6f76aSRasesh Mody qede_rx_mode_setting(eth_dev, QED_FILTER_RX_MODE_TYPE_REGULAR); 7882ea6f76aSRasesh Mody } 7892ea6f76aSRasesh Mody 7902af14ca7SHarish Patil static void qede_poll_sp_sb_cb(void *param) 7912af14ca7SHarish Patil { 7922af14ca7SHarish Patil struct rte_eth_dev *eth_dev = (struct rte_eth_dev *)param; 7932af14ca7SHarish Patil struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 7942af14ca7SHarish Patil struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 7952af14ca7SHarish Patil int rc; 7962af14ca7SHarish Patil 7972af14ca7SHarish Patil qede_interrupt_action(ECORE_LEADING_HWFN(edev)); 7982af14ca7SHarish Patil qede_interrupt_action(&edev->hwfns[1]); 7992af14ca7SHarish Patil 8002af14ca7SHarish Patil rc = rte_eal_alarm_set(timer_period * US_PER_S, 8012af14ca7SHarish Patil qede_poll_sp_sb_cb, 8022af14ca7SHarish Patil (void *)eth_dev); 8032af14ca7SHarish Patil if (rc != 0) { 8042af14ca7SHarish Patil DP_ERR(edev, "Unable to start periodic" 8052af14ca7SHarish Patil " timer rc %d\n", rc); 8062af14ca7SHarish Patil assert(false && "Unable to start periodic timer"); 8072af14ca7SHarish Patil } 8082af14ca7SHarish Patil } 8092af14ca7SHarish Patil 8102ea6f76aSRasesh Mody static void qede_dev_close(struct rte_eth_dev *eth_dev) 8112ea6f76aSRasesh Mody { 812dbac54c2SHarish Patil struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 813dbac54c2SHarish Patil struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 814dbac54c2SHarish Patil int rc; 8152ea6f76aSRasesh Mody 8162ea6f76aSRasesh Mody PMD_INIT_FUNC_TRACE(edev); 8172ea6f76aSRasesh Mody 8182ea6f76aSRasesh Mody /* dev_stop() shall cleanup fp resources in hw but without releasing 8192ea6f76aSRasesh Mody * dma memories and sw structures so that dev_start() can be called 8202ea6f76aSRasesh Mody * by the app without reconfiguration. However, in dev_close() we 8212ea6f76aSRasesh Mody * can release all the resources and device can be brought up newly 8222ea6f76aSRasesh Mody */ 823dbac54c2SHarish Patil if (qdev->state != QEDE_DEV_STOP) 8242ea6f76aSRasesh Mody qede_dev_stop(eth_dev); 8252ea6f76aSRasesh Mody else 8262ea6f76aSRasesh Mody DP_INFO(edev, "Device is already stopped\n"); 8272ea6f76aSRasesh Mody 828dbac54c2SHarish Patil rc = qdev->ops->vport_stop(edev, 0); 829dbac54c2SHarish Patil if (rc != 0) 830dbac54c2SHarish Patil DP_ERR(edev, "Failed to stop VPORT\n"); 8312ea6f76aSRasesh Mody 832dbac54c2SHarish Patil qede_dealloc_fp_resc(eth_dev); 8332ea6f76aSRasesh Mody 8342ea6f76aSRasesh Mody qdev->ops->common->slowpath_stop(edev); 8352ea6f76aSRasesh Mody 8362ea6f76aSRasesh Mody qdev->ops->common->remove(edev); 8372ea6f76aSRasesh Mody 8382ea6f76aSRasesh Mody rte_intr_disable(ð_dev->pci_dev->intr_handle); 8392ea6f76aSRasesh Mody 8402ea6f76aSRasesh Mody rte_intr_callback_unregister(ð_dev->pci_dev->intr_handle, 8412ea6f76aSRasesh Mody qede_interrupt_handler, (void *)eth_dev); 8422ea6f76aSRasesh Mody 8432af14ca7SHarish Patil if (edev->num_hwfns > 1) 8442af14ca7SHarish Patil rte_eal_alarm_cancel(qede_poll_sp_sb_cb, (void *)eth_dev); 8452af14ca7SHarish Patil 846dbac54c2SHarish Patil qdev->state = QEDE_DEV_INIT; /* Go back to init state */ 8472ea6f76aSRasesh Mody } 8482ea6f76aSRasesh Mody 8492ea6f76aSRasesh Mody static void 8502ea6f76aSRasesh Mody qede_get_stats(struct rte_eth_dev *eth_dev, struct rte_eth_stats *eth_stats) 8512ea6f76aSRasesh Mody { 8522ea6f76aSRasesh Mody struct qede_dev *qdev = eth_dev->data->dev_private; 8532ea6f76aSRasesh Mody struct ecore_dev *edev = &qdev->edev; 8542ea6f76aSRasesh Mody struct ecore_eth_stats stats; 8557634c5f9SRasesh Mody unsigned int i = 0, j = 0, qid; 8567634c5f9SRasesh Mody struct qede_tx_queue *txq; 8572ea6f76aSRasesh Mody 8582ea6f76aSRasesh Mody qdev->ops->get_vport_stats(edev, &stats); 8592ea6f76aSRasesh Mody 8602ea6f76aSRasesh Mody /* RX Stats */ 8612ea6f76aSRasesh Mody eth_stats->ipackets = stats.rx_ucast_pkts + 8622ea6f76aSRasesh Mody stats.rx_mcast_pkts + stats.rx_bcast_pkts; 8632ea6f76aSRasesh Mody 8642ea6f76aSRasesh Mody eth_stats->ibytes = stats.rx_ucast_bytes + 8652ea6f76aSRasesh Mody stats.rx_mcast_bytes + stats.rx_bcast_bytes; 8662ea6f76aSRasesh Mody 8672ea6f76aSRasesh Mody eth_stats->ierrors = stats.rx_crc_errors + 8682ea6f76aSRasesh Mody stats.rx_align_errors + 8692ea6f76aSRasesh Mody stats.rx_carrier_errors + 8702ea6f76aSRasesh Mody stats.rx_oversize_packets + 8712ea6f76aSRasesh Mody stats.rx_jabbers + stats.rx_undersize_packets; 8722ea6f76aSRasesh Mody 8732ea6f76aSRasesh Mody eth_stats->rx_nombuf = stats.no_buff_discards; 8742ea6f76aSRasesh Mody 8752ea6f76aSRasesh Mody eth_stats->imissed = stats.mftag_filter_discards + 8762ea6f76aSRasesh Mody stats.mac_filter_discards + 8772ea6f76aSRasesh Mody stats.no_buff_discards + stats.brb_truncates + stats.brb_discards; 8782ea6f76aSRasesh Mody 8792ea6f76aSRasesh Mody /* TX stats */ 8802ea6f76aSRasesh Mody eth_stats->opackets = stats.tx_ucast_pkts + 8812ea6f76aSRasesh Mody stats.tx_mcast_pkts + stats.tx_bcast_pkts; 8822ea6f76aSRasesh Mody 8832ea6f76aSRasesh Mody eth_stats->obytes = stats.tx_ucast_bytes + 8842ea6f76aSRasesh Mody stats.tx_mcast_bytes + stats.tx_bcast_bytes; 8852ea6f76aSRasesh Mody 8862ea6f76aSRasesh Mody eth_stats->oerrors = stats.tx_err_drop_pkts; 8877634c5f9SRasesh Mody 8887634c5f9SRasesh Mody /* Queue stats */ 8897634c5f9SRasesh Mody for (qid = 0; qid < QEDE_QUEUE_CNT(qdev); qid++) { 8907634c5f9SRasesh Mody if (qdev->fp_array[qid].type & QEDE_FASTPATH_RX) { 8917634c5f9SRasesh Mody eth_stats->q_ipackets[i] = 8927634c5f9SRasesh Mody *(uint64_t *)( 8937634c5f9SRasesh Mody ((char *)(qdev->fp_array[(qid)].rxq)) + 8947634c5f9SRasesh Mody offsetof(struct qede_rx_queue, 8957634c5f9SRasesh Mody rcv_pkts)); 8967634c5f9SRasesh Mody eth_stats->q_errors[i] = 8977634c5f9SRasesh Mody *(uint64_t *)( 8987634c5f9SRasesh Mody ((char *)(qdev->fp_array[(qid)].rxq)) + 8997634c5f9SRasesh Mody offsetof(struct qede_rx_queue, 9007634c5f9SRasesh Mody rx_hw_errors)) + 9017634c5f9SRasesh Mody *(uint64_t *)( 9027634c5f9SRasesh Mody ((char *)(qdev->fp_array[(qid)].rxq)) + 9037634c5f9SRasesh Mody offsetof(struct qede_rx_queue, 9047634c5f9SRasesh Mody rx_alloc_errors)); 9057634c5f9SRasesh Mody i++; 9067634c5f9SRasesh Mody } 9077634c5f9SRasesh Mody 9087634c5f9SRasesh Mody if (qdev->fp_array[qid].type & QEDE_FASTPATH_TX) { 9097634c5f9SRasesh Mody txq = qdev->fp_array[(qid)].txqs[0]; 9107634c5f9SRasesh Mody eth_stats->q_opackets[j] = 9117634c5f9SRasesh Mody *((uint64_t *)(uintptr_t) 9127634c5f9SRasesh Mody (((uint64_t)(uintptr_t)(txq)) + 9137634c5f9SRasesh Mody offsetof(struct qede_tx_queue, 9147634c5f9SRasesh Mody xmit_pkts))); 9157634c5f9SRasesh Mody j++; 9167634c5f9SRasesh Mody } 9177634c5f9SRasesh Mody } 9187634c5f9SRasesh Mody } 9197634c5f9SRasesh Mody 9207634c5f9SRasesh Mody static unsigned 9217634c5f9SRasesh Mody qede_get_xstats_count(struct qede_dev *qdev) { 9227634c5f9SRasesh Mody return RTE_DIM(qede_xstats_strings) + 9237634c5f9SRasesh Mody (RTE_DIM(qede_rxq_xstats_strings) * QEDE_RSS_COUNT(qdev)); 924d1216e22SRasesh Mody } 9252ea6f76aSRasesh Mody 926d1216e22SRasesh Mody static int 927d1216e22SRasesh Mody qede_get_xstats_names(__rte_unused struct rte_eth_dev *dev, 928d1216e22SRasesh Mody struct rte_eth_xstat_name *xstats_names, unsigned limit) 929d1216e22SRasesh Mody { 9307634c5f9SRasesh Mody struct qede_dev *qdev = dev->data->dev_private; 9317634c5f9SRasesh Mody const unsigned int stat_cnt = qede_get_xstats_count(qdev); 9327634c5f9SRasesh Mody unsigned int i, qid, stat_idx = 0; 933d1216e22SRasesh Mody 9347634c5f9SRasesh Mody if (xstats_names != NULL) { 9357634c5f9SRasesh Mody for (i = 0; i < RTE_DIM(qede_xstats_strings); i++) { 9367634c5f9SRasesh Mody snprintf(xstats_names[stat_idx].name, 9377634c5f9SRasesh Mody sizeof(xstats_names[stat_idx].name), 938d1216e22SRasesh Mody "%s", 939d1216e22SRasesh Mody qede_xstats_strings[i].name); 9407634c5f9SRasesh Mody stat_idx++; 9417634c5f9SRasesh Mody } 9427634c5f9SRasesh Mody 9437634c5f9SRasesh Mody for (qid = 0; qid < QEDE_RSS_COUNT(qdev); qid++) { 9447634c5f9SRasesh Mody for (i = 0; i < RTE_DIM(qede_rxq_xstats_strings); i++) { 9457634c5f9SRasesh Mody snprintf(xstats_names[stat_idx].name, 9467634c5f9SRasesh Mody sizeof(xstats_names[stat_idx].name), 9477634c5f9SRasesh Mody "%.4s%d%s", 9487634c5f9SRasesh Mody qede_rxq_xstats_strings[i].name, qid, 9497634c5f9SRasesh Mody qede_rxq_xstats_strings[i].name + 4); 9507634c5f9SRasesh Mody stat_idx++; 9517634c5f9SRasesh Mody } 9527634c5f9SRasesh Mody } 9537634c5f9SRasesh Mody } 954d1216e22SRasesh Mody 955d1216e22SRasesh Mody return stat_cnt; 956d1216e22SRasesh Mody } 957d1216e22SRasesh Mody 958d1216e22SRasesh Mody static int 959d1216e22SRasesh Mody qede_get_xstats(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, 960d1216e22SRasesh Mody unsigned int n) 961d1216e22SRasesh Mody { 962d1216e22SRasesh Mody struct qede_dev *qdev = dev->data->dev_private; 963d1216e22SRasesh Mody struct ecore_dev *edev = &qdev->edev; 964d1216e22SRasesh Mody struct ecore_eth_stats stats; 9657634c5f9SRasesh Mody const unsigned int num = qede_get_xstats_count(qdev); 9667634c5f9SRasesh Mody unsigned int i, qid, stat_idx = 0; 967d1216e22SRasesh Mody 968d1216e22SRasesh Mody if (n < num) 969d1216e22SRasesh Mody return num; 970d1216e22SRasesh Mody 971d1216e22SRasesh Mody qdev->ops->get_vport_stats(edev, &stats); 972d1216e22SRasesh Mody 9737634c5f9SRasesh Mody for (i = 0; i < RTE_DIM(qede_xstats_strings); i++) { 9747634c5f9SRasesh Mody xstats[stat_idx].value = *(uint64_t *)(((char *)&stats) + 9757634c5f9SRasesh Mody qede_xstats_strings[i].offset); 9767634c5f9SRasesh Mody stat_idx++; 9777634c5f9SRasesh Mody } 978d1216e22SRasesh Mody 9797634c5f9SRasesh Mody for (qid = 0; qid < QEDE_QUEUE_CNT(qdev); qid++) { 9807634c5f9SRasesh Mody if (qdev->fp_array[qid].type & QEDE_FASTPATH_RX) { 9817634c5f9SRasesh Mody for (i = 0; i < RTE_DIM(qede_rxq_xstats_strings); i++) { 9827634c5f9SRasesh Mody xstats[stat_idx].value = *(uint64_t *)( 9837634c5f9SRasesh Mody ((char *)(qdev->fp_array[(qid)].rxq)) + 9847634c5f9SRasesh Mody qede_rxq_xstats_strings[i].offset); 9857634c5f9SRasesh Mody stat_idx++; 9867634c5f9SRasesh Mody } 9877634c5f9SRasesh Mody } 9887634c5f9SRasesh Mody } 9897634c5f9SRasesh Mody 9907634c5f9SRasesh Mody return stat_idx; 991d1216e22SRasesh Mody } 992d1216e22SRasesh Mody 993d1216e22SRasesh Mody static void 994d1216e22SRasesh Mody qede_reset_xstats(struct rte_eth_dev *dev) 995d1216e22SRasesh Mody { 996d1216e22SRasesh Mody struct qede_dev *qdev = dev->data->dev_private; 997d1216e22SRasesh Mody struct ecore_dev *edev = &qdev->edev; 998d1216e22SRasesh Mody 999d1216e22SRasesh Mody ecore_reset_vport_stats(edev); 10002ea6f76aSRasesh Mody } 10012ea6f76aSRasesh Mody 10022ea6f76aSRasesh Mody int qede_dev_set_link_state(struct rte_eth_dev *eth_dev, bool link_up) 10032ea6f76aSRasesh Mody { 10042ea6f76aSRasesh Mody struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 10052ea6f76aSRasesh Mody struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 10062ea6f76aSRasesh Mody struct qed_link_params link_params; 10072ea6f76aSRasesh Mody int rc; 10082ea6f76aSRasesh Mody 10092ea6f76aSRasesh Mody DP_INFO(edev, "setting link state %d\n", link_up); 10102ea6f76aSRasesh Mody memset(&link_params, 0, sizeof(link_params)); 10112ea6f76aSRasesh Mody link_params.link_up = link_up; 10122ea6f76aSRasesh Mody rc = qdev->ops->common->set_link(edev, &link_params); 10132ea6f76aSRasesh Mody if (rc != ECORE_SUCCESS) 10142ea6f76aSRasesh Mody DP_ERR(edev, "Unable to set link state %d\n", link_up); 10152ea6f76aSRasesh Mody 10162ea6f76aSRasesh Mody return rc; 10172ea6f76aSRasesh Mody } 10182ea6f76aSRasesh Mody 10192ea6f76aSRasesh Mody static int qede_dev_set_link_up(struct rte_eth_dev *eth_dev) 10202ea6f76aSRasesh Mody { 10212ea6f76aSRasesh Mody return qede_dev_set_link_state(eth_dev, true); 10222ea6f76aSRasesh Mody } 10232ea6f76aSRasesh Mody 10242ea6f76aSRasesh Mody static int qede_dev_set_link_down(struct rte_eth_dev *eth_dev) 10252ea6f76aSRasesh Mody { 10262ea6f76aSRasesh Mody return qede_dev_set_link_state(eth_dev, false); 10272ea6f76aSRasesh Mody } 10282ea6f76aSRasesh Mody 10295cdd769aSRasesh Mody static void qede_reset_stats(struct rte_eth_dev *eth_dev) 10305cdd769aSRasesh Mody { 10315cdd769aSRasesh Mody struct qede_dev *qdev = eth_dev->data->dev_private; 10325cdd769aSRasesh Mody struct ecore_dev *edev = &qdev->edev; 10335cdd769aSRasesh Mody 10345cdd769aSRasesh Mody ecore_reset_vport_stats(edev); 10355cdd769aSRasesh Mody } 10365cdd769aSRasesh Mody 10372ea6f76aSRasesh Mody static void qede_allmulticast_enable(struct rte_eth_dev *eth_dev) 10382ea6f76aSRasesh Mody { 10392ea6f76aSRasesh Mody enum qed_filter_rx_mode_type type = 10402ea6f76aSRasesh Mody QED_FILTER_RX_MODE_TYPE_MULTI_PROMISC; 10412ea6f76aSRasesh Mody 10422ea6f76aSRasesh Mody if (rte_eth_promiscuous_get(eth_dev->data->port_id) == 1) 10432ea6f76aSRasesh Mody type |= QED_FILTER_RX_MODE_TYPE_PROMISC; 10442ea6f76aSRasesh Mody 10452ea6f76aSRasesh Mody qede_rx_mode_setting(eth_dev, type); 10462ea6f76aSRasesh Mody } 10472ea6f76aSRasesh Mody 10482ea6f76aSRasesh Mody static void qede_allmulticast_disable(struct rte_eth_dev *eth_dev) 10492ea6f76aSRasesh Mody { 10502ea6f76aSRasesh Mody if (rte_eth_promiscuous_get(eth_dev->data->port_id) == 1) 10512ea6f76aSRasesh Mody qede_rx_mode_setting(eth_dev, QED_FILTER_RX_MODE_TYPE_PROMISC); 10522ea6f76aSRasesh Mody else 10532ea6f76aSRasesh Mody qede_rx_mode_setting(eth_dev, QED_FILTER_RX_MODE_TYPE_REGULAR); 10542ea6f76aSRasesh Mody } 10552ea6f76aSRasesh Mody 10562ea6f76aSRasesh Mody static int qede_flow_ctrl_set(struct rte_eth_dev *eth_dev, 10572ea6f76aSRasesh Mody struct rte_eth_fc_conf *fc_conf) 10582ea6f76aSRasesh Mody { 10592ea6f76aSRasesh Mody struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 10602ea6f76aSRasesh Mody struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 10612ea6f76aSRasesh Mody struct qed_link_output current_link; 10622ea6f76aSRasesh Mody struct qed_link_params params; 10632ea6f76aSRasesh Mody 10642ea6f76aSRasesh Mody memset(¤t_link, 0, sizeof(current_link)); 10652ea6f76aSRasesh Mody qdev->ops->common->get_link(edev, ¤t_link); 10662ea6f76aSRasesh Mody 10672ea6f76aSRasesh Mody memset(¶ms, 0, sizeof(params)); 10682ea6f76aSRasesh Mody params.override_flags |= QED_LINK_OVERRIDE_PAUSE_CONFIG; 10692ea6f76aSRasesh Mody if (fc_conf->autoneg) { 10702ea6f76aSRasesh Mody if (!(current_link.supported_caps & QEDE_SUPPORTED_AUTONEG)) { 10712ea6f76aSRasesh Mody DP_ERR(edev, "Autoneg not supported\n"); 10722ea6f76aSRasesh Mody return -EINVAL; 10732ea6f76aSRasesh Mody } 10742ea6f76aSRasesh Mody params.pause_config |= QED_LINK_PAUSE_AUTONEG_ENABLE; 10752ea6f76aSRasesh Mody } 10762ea6f76aSRasesh Mody 10772ea6f76aSRasesh Mody /* Pause is assumed to be supported (SUPPORTED_Pause) */ 10782ea6f76aSRasesh Mody if (fc_conf->mode == RTE_FC_FULL) 10792ea6f76aSRasesh Mody params.pause_config |= (QED_LINK_PAUSE_TX_ENABLE | 10802ea6f76aSRasesh Mody QED_LINK_PAUSE_RX_ENABLE); 10812ea6f76aSRasesh Mody if (fc_conf->mode == RTE_FC_TX_PAUSE) 10822ea6f76aSRasesh Mody params.pause_config |= QED_LINK_PAUSE_TX_ENABLE; 10832ea6f76aSRasesh Mody if (fc_conf->mode == RTE_FC_RX_PAUSE) 10842ea6f76aSRasesh Mody params.pause_config |= QED_LINK_PAUSE_RX_ENABLE; 10852ea6f76aSRasesh Mody 10862ea6f76aSRasesh Mody params.link_up = true; 10872ea6f76aSRasesh Mody (void)qdev->ops->common->set_link(edev, ¶ms); 10882ea6f76aSRasesh Mody 10892ea6f76aSRasesh Mody return 0; 10902ea6f76aSRasesh Mody } 10912ea6f76aSRasesh Mody 10922ea6f76aSRasesh Mody static int qede_flow_ctrl_get(struct rte_eth_dev *eth_dev, 10932ea6f76aSRasesh Mody struct rte_eth_fc_conf *fc_conf) 10942ea6f76aSRasesh Mody { 10952ea6f76aSRasesh Mody struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 10962ea6f76aSRasesh Mody struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 10972ea6f76aSRasesh Mody struct qed_link_output current_link; 10982ea6f76aSRasesh Mody 10992ea6f76aSRasesh Mody memset(¤t_link, 0, sizeof(current_link)); 11002ea6f76aSRasesh Mody qdev->ops->common->get_link(edev, ¤t_link); 11012ea6f76aSRasesh Mody 11022ea6f76aSRasesh Mody if (current_link.pause_config & QED_LINK_PAUSE_AUTONEG_ENABLE) 11032ea6f76aSRasesh Mody fc_conf->autoneg = true; 11042ea6f76aSRasesh Mody 11052ea6f76aSRasesh Mody if (current_link.pause_config & (QED_LINK_PAUSE_RX_ENABLE | 11062ea6f76aSRasesh Mody QED_LINK_PAUSE_TX_ENABLE)) 11072ea6f76aSRasesh Mody fc_conf->mode = RTE_FC_FULL; 11082ea6f76aSRasesh Mody else if (current_link.pause_config & QED_LINK_PAUSE_RX_ENABLE) 11092ea6f76aSRasesh Mody fc_conf->mode = RTE_FC_RX_PAUSE; 11102ea6f76aSRasesh Mody else if (current_link.pause_config & QED_LINK_PAUSE_TX_ENABLE) 11112ea6f76aSRasesh Mody fc_conf->mode = RTE_FC_TX_PAUSE; 11122ea6f76aSRasesh Mody else 11132ea6f76aSRasesh Mody fc_conf->mode = RTE_FC_NONE; 11142ea6f76aSRasesh Mody 11152ea6f76aSRasesh Mody return 0; 11162ea6f76aSRasesh Mody } 11172ea6f76aSRasesh Mody 11182ea6f76aSRasesh Mody static const uint32_t * 11192ea6f76aSRasesh Mody qede_dev_supported_ptypes_get(struct rte_eth_dev *eth_dev) 11202ea6f76aSRasesh Mody { 11212ea6f76aSRasesh Mody static const uint32_t ptypes[] = { 11222ea6f76aSRasesh Mody RTE_PTYPE_L3_IPV4, 11232ea6f76aSRasesh Mody RTE_PTYPE_L3_IPV6, 11242ea6f76aSRasesh Mody RTE_PTYPE_UNKNOWN 11252ea6f76aSRasesh Mody }; 11262ea6f76aSRasesh Mody 11272ea6f76aSRasesh Mody if (eth_dev->rx_pkt_burst == qede_recv_pkts) 11282ea6f76aSRasesh Mody return ptypes; 11292ea6f76aSRasesh Mody 11302ea6f76aSRasesh Mody return NULL; 11312ea6f76aSRasesh Mody } 11322ea6f76aSRasesh Mody 11339c5d0a66SHarish Patil void qede_init_rss_caps(uint8_t *rss_caps, uint64_t hf) 11349c5d0a66SHarish Patil { 11359c5d0a66SHarish Patil *rss_caps = 0; 11369c5d0a66SHarish Patil *rss_caps |= (hf & ETH_RSS_IPV4) ? ECORE_RSS_IPV4 : 0; 11379c5d0a66SHarish Patil *rss_caps |= (hf & ETH_RSS_IPV6) ? ECORE_RSS_IPV6 : 0; 11389c5d0a66SHarish Patil *rss_caps |= (hf & ETH_RSS_IPV6_EX) ? ECORE_RSS_IPV6 : 0; 11399c5d0a66SHarish Patil *rss_caps |= (hf & ETH_RSS_NONFRAG_IPV4_TCP) ? ECORE_RSS_IPV4_TCP : 0; 11409c5d0a66SHarish Patil *rss_caps |= (hf & ETH_RSS_NONFRAG_IPV6_TCP) ? ECORE_RSS_IPV6_TCP : 0; 11419c5d0a66SHarish Patil *rss_caps |= (hf & ETH_RSS_IPV6_TCP_EX) ? ECORE_RSS_IPV6_TCP : 0; 11429c5d0a66SHarish Patil } 11439c5d0a66SHarish Patil 11449c5d0a66SHarish Patil static int qede_rss_hash_update(struct rte_eth_dev *eth_dev, 11454c98f276SSony Chacko struct rte_eth_rss_conf *rss_conf) 11464c98f276SSony Chacko { 11474c98f276SSony Chacko struct qed_update_vport_params vport_update_params; 11484c98f276SSony Chacko struct qede_dev *qdev = eth_dev->data->dev_private; 11494c98f276SSony Chacko struct ecore_dev *edev = &qdev->edev; 11504c98f276SSony Chacko uint32_t *key = (uint32_t *)rss_conf->rss_key; 11514c98f276SSony Chacko uint64_t hf = rss_conf->rss_hf; 11524c98f276SSony Chacko int i; 11534c98f276SSony Chacko 11544c98f276SSony Chacko memset(&vport_update_params, 0, sizeof(vport_update_params)); 11554c98f276SSony Chacko 11569c5d0a66SHarish Patil if (hf != 0) { 11579c5d0a66SHarish Patil /* Enable RSS */ 11589c5d0a66SHarish Patil qede_init_rss_caps(&qdev->rss_params.rss_caps, hf); 11594c98f276SSony Chacko memcpy(&vport_update_params.rss_params, &qdev->rss_params, 11604c98f276SSony Chacko sizeof(vport_update_params.rss_params)); 11619c5d0a66SHarish Patil if (key) 11629c5d0a66SHarish Patil memcpy(qdev->rss_params.rss_key, rss_conf->rss_key, 11639c5d0a66SHarish Patil rss_conf->rss_key_len); 11644c98f276SSony Chacko vport_update_params.update_rss_flg = 1; 11659c5d0a66SHarish Patil qdev->rss_enabled = 1; 11669c5d0a66SHarish Patil } else { 11679c5d0a66SHarish Patil /* Disable RSS */ 11689c5d0a66SHarish Patil qdev->rss_enabled = 0; 11699c5d0a66SHarish Patil } 11709c5d0a66SHarish Patil 11719c5d0a66SHarish Patil /* If the mapping doesn't fit any supported, return */ 11729c5d0a66SHarish Patil if (qdev->rss_params.rss_caps == 0 && hf != 0) 11739c5d0a66SHarish Patil return -EINVAL; 11749c5d0a66SHarish Patil 11759c5d0a66SHarish Patil DP_INFO(edev, "%s\n", (vport_update_params.update_rss_flg) ? 11769c5d0a66SHarish Patil "Enabling RSS" : "Disabling RSS"); 11779c5d0a66SHarish Patil 11784c98f276SSony Chacko vport_update_params.vport_id = 0; 11794c98f276SSony Chacko 11804c98f276SSony Chacko return qdev->ops->vport_update(edev, &vport_update_params); 11814c98f276SSony Chacko } 11824c98f276SSony Chacko 11836d9e26c4SSony Chacko int qede_rss_hash_conf_get(struct rte_eth_dev *eth_dev, 11846d9e26c4SSony Chacko struct rte_eth_rss_conf *rss_conf) 11856d9e26c4SSony Chacko { 11866d9e26c4SSony Chacko struct qede_dev *qdev = eth_dev->data->dev_private; 11876d9e26c4SSony Chacko uint64_t hf; 11886d9e26c4SSony Chacko 11896d9e26c4SSony Chacko if (rss_conf->rss_key_len < sizeof(qdev->rss_params.rss_key)) 11906d9e26c4SSony Chacko return -EINVAL; 11916d9e26c4SSony Chacko 11926d9e26c4SSony Chacko if (rss_conf->rss_key) 11936d9e26c4SSony Chacko memcpy(rss_conf->rss_key, qdev->rss_params.rss_key, 11946d9e26c4SSony Chacko sizeof(qdev->rss_params.rss_key)); 11956d9e26c4SSony Chacko 11966d9e26c4SSony Chacko hf = 0; 11976d9e26c4SSony Chacko hf |= (qdev->rss_params.rss_caps & ECORE_RSS_IPV4) ? 11986d9e26c4SSony Chacko ETH_RSS_IPV4 : 0; 11996d9e26c4SSony Chacko hf |= (qdev->rss_params.rss_caps & ECORE_RSS_IPV6) ? 12006d9e26c4SSony Chacko ETH_RSS_IPV6 : 0; 12016d9e26c4SSony Chacko hf |= (qdev->rss_params.rss_caps & ECORE_RSS_IPV6) ? 12026d9e26c4SSony Chacko ETH_RSS_IPV6_EX : 0; 12036d9e26c4SSony Chacko hf |= (qdev->rss_params.rss_caps & ECORE_RSS_IPV4_TCP) ? 12046d9e26c4SSony Chacko ETH_RSS_NONFRAG_IPV4_TCP : 0; 12056d9e26c4SSony Chacko hf |= (qdev->rss_params.rss_caps & ECORE_RSS_IPV6_TCP) ? 12066d9e26c4SSony Chacko ETH_RSS_NONFRAG_IPV6_TCP : 0; 12076d9e26c4SSony Chacko hf |= (qdev->rss_params.rss_caps & ECORE_RSS_IPV6_TCP) ? 12086d9e26c4SSony Chacko ETH_RSS_IPV6_TCP_EX : 0; 12096d9e26c4SSony Chacko 12106d9e26c4SSony Chacko rss_conf->rss_hf = hf; 12116d9e26c4SSony Chacko 12126d9e26c4SSony Chacko return 0; 12136d9e26c4SSony Chacko } 12146d9e26c4SSony Chacko 12159c5d0a66SHarish Patil static int qede_rss_reta_update(struct rte_eth_dev *eth_dev, 1216e8876556SSony Chacko struct rte_eth_rss_reta_entry64 *reta_conf, 1217e8876556SSony Chacko uint16_t reta_size) 1218e8876556SSony Chacko { 1219e8876556SSony Chacko struct qed_update_vport_params vport_update_params; 1220e8876556SSony Chacko struct qede_dev *qdev = eth_dev->data->dev_private; 1221e8876556SSony Chacko struct ecore_dev *edev = &qdev->edev; 1222e8876556SSony Chacko uint16_t i, idx, shift; 1223e8876556SSony Chacko 1224e8876556SSony Chacko if (reta_size > ETH_RSS_RETA_SIZE_128) { 1225e8876556SSony Chacko DP_ERR(edev, "reta_size %d is not supported by hardware\n", 1226e8876556SSony Chacko reta_size); 1227e8876556SSony Chacko return -EINVAL; 1228e8876556SSony Chacko } 1229e8876556SSony Chacko 1230e8876556SSony Chacko memset(&vport_update_params, 0, sizeof(vport_update_params)); 1231e8876556SSony Chacko memcpy(&vport_update_params.rss_params, &qdev->rss_params, 1232e8876556SSony Chacko sizeof(vport_update_params.rss_params)); 1233e8876556SSony Chacko 1234e8876556SSony Chacko for (i = 0; i < reta_size; i++) { 1235e8876556SSony Chacko idx = i / RTE_RETA_GROUP_SIZE; 1236e8876556SSony Chacko shift = i % RTE_RETA_GROUP_SIZE; 1237e8876556SSony Chacko if (reta_conf[idx].mask & (1ULL << shift)) { 1238e8876556SSony Chacko uint8_t entry = reta_conf[idx].reta[shift]; 1239e8876556SSony Chacko qdev->rss_params.rss_ind_table[i] = entry; 1240e8876556SSony Chacko } 1241e8876556SSony Chacko } 1242e8876556SSony Chacko 1243e8876556SSony Chacko vport_update_params.update_rss_flg = 1; 1244e8876556SSony Chacko vport_update_params.vport_id = 0; 1245e8876556SSony Chacko 1246e8876556SSony Chacko return qdev->ops->vport_update(edev, &vport_update_params); 1247e8876556SSony Chacko } 1248e8876556SSony Chacko 12493dadf73eSSony Chacko int qede_rss_reta_query(struct rte_eth_dev *eth_dev, 12503dadf73eSSony Chacko struct rte_eth_rss_reta_entry64 *reta_conf, 12513dadf73eSSony Chacko uint16_t reta_size) 12523dadf73eSSony Chacko { 12533dadf73eSSony Chacko struct qede_dev *qdev = eth_dev->data->dev_private; 12543dadf73eSSony Chacko uint16_t i, idx, shift; 12553dadf73eSSony Chacko 12563dadf73eSSony Chacko if (reta_size > ETH_RSS_RETA_SIZE_128) { 12573dadf73eSSony Chacko struct ecore_dev *edev = &qdev->edev; 12583dadf73eSSony Chacko DP_ERR(edev, "reta_size %d is not supported\n", 12593dadf73eSSony Chacko reta_size); 12603dadf73eSSony Chacko } 12613dadf73eSSony Chacko 12623dadf73eSSony Chacko for (i = 0; i < reta_size; i++) { 12633dadf73eSSony Chacko idx = i / RTE_RETA_GROUP_SIZE; 12643dadf73eSSony Chacko shift = i % RTE_RETA_GROUP_SIZE; 12653dadf73eSSony Chacko if (reta_conf[idx].mask & (1ULL << shift)) { 12663dadf73eSSony Chacko uint8_t entry = qdev->rss_params.rss_ind_table[i]; 12673dadf73eSSony Chacko reta_conf[idx].reta[shift] = entry; 12683dadf73eSSony Chacko } 12693dadf73eSSony Chacko } 12703dadf73eSSony Chacko 12713dadf73eSSony Chacko return 0; 12723dadf73eSSony Chacko } 12733dadf73eSSony Chacko 1274200645acSSony Chacko int qede_set_mtu(struct rte_eth_dev *dev, uint16_t mtu) 1275200645acSSony Chacko { 1276200645acSSony Chacko uint32_t frame_size; 1277200645acSSony Chacko struct qede_dev *qdev = dev->data->dev_private; 1278200645acSSony Chacko struct rte_eth_dev_info dev_info = {0}; 1279200645acSSony Chacko 1280200645acSSony Chacko qede_dev_info_get(dev, &dev_info); 1281200645acSSony Chacko 1282200645acSSony Chacko /* VLAN_TAG = 4 */ 1283200645acSSony Chacko frame_size = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN + 4; 1284200645acSSony Chacko 1285200645acSSony Chacko if ((mtu < ETHER_MIN_MTU) || (frame_size > dev_info.max_rx_pktlen)) 1286200645acSSony Chacko return -EINVAL; 1287200645acSSony Chacko 1288200645acSSony Chacko if (!dev->data->scattered_rx && 1289200645acSSony Chacko frame_size > dev->data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM) 1290200645acSSony Chacko return -EINVAL; 1291200645acSSony Chacko 1292200645acSSony Chacko if (frame_size > ETHER_MAX_LEN) 1293200645acSSony Chacko dev->data->dev_conf.rxmode.jumbo_frame = 1; 1294200645acSSony Chacko else 1295200645acSSony Chacko dev->data->dev_conf.rxmode.jumbo_frame = 0; 1296200645acSSony Chacko 1297200645acSSony Chacko /* update max frame size */ 1298200645acSSony Chacko dev->data->dev_conf.rxmode.max_rx_pkt_len = frame_size; 1299200645acSSony Chacko qdev->mtu = mtu; 1300200645acSSony Chacko qede_dev_stop(dev); 1301200645acSSony Chacko qede_dev_start(dev); 1302200645acSSony Chacko 1303200645acSSony Chacko return 0; 1304200645acSSony Chacko } 1305200645acSSony Chacko 13062ea6f76aSRasesh Mody static const struct eth_dev_ops qede_eth_dev_ops = { 13072ea6f76aSRasesh Mody .dev_configure = qede_dev_configure, 13082ea6f76aSRasesh Mody .dev_infos_get = qede_dev_info_get, 13092ea6f76aSRasesh Mody .rx_queue_setup = qede_rx_queue_setup, 13102ea6f76aSRasesh Mody .rx_queue_release = qede_rx_queue_release, 13112ea6f76aSRasesh Mody .tx_queue_setup = qede_tx_queue_setup, 13122ea6f76aSRasesh Mody .tx_queue_release = qede_tx_queue_release, 13132ea6f76aSRasesh Mody .dev_start = qede_dev_start, 13142ea6f76aSRasesh Mody .dev_set_link_up = qede_dev_set_link_up, 13152ea6f76aSRasesh Mody .dev_set_link_down = qede_dev_set_link_down, 13162ea6f76aSRasesh Mody .link_update = qede_link_update, 13172ea6f76aSRasesh Mody .promiscuous_enable = qede_promiscuous_enable, 13182ea6f76aSRasesh Mody .promiscuous_disable = qede_promiscuous_disable, 13192ea6f76aSRasesh Mody .allmulticast_enable = qede_allmulticast_enable, 13202ea6f76aSRasesh Mody .allmulticast_disable = qede_allmulticast_disable, 13212ea6f76aSRasesh Mody .dev_stop = qede_dev_stop, 13222ea6f76aSRasesh Mody .dev_close = qede_dev_close, 13232ea6f76aSRasesh Mody .stats_get = qede_get_stats, 13245cdd769aSRasesh Mody .stats_reset = qede_reset_stats, 1325d1216e22SRasesh Mody .xstats_get = qede_get_xstats, 1326d1216e22SRasesh Mody .xstats_reset = qede_reset_xstats, 1327d1216e22SRasesh Mody .xstats_get_names = qede_get_xstats_names, 13282ea6f76aSRasesh Mody .mac_addr_add = qede_mac_addr_add, 13292ea6f76aSRasesh Mody .mac_addr_remove = qede_mac_addr_remove, 13302ea6f76aSRasesh Mody .mac_addr_set = qede_mac_addr_set, 13312ea6f76aSRasesh Mody .vlan_offload_set = qede_vlan_offload_set, 13322ea6f76aSRasesh Mody .vlan_filter_set = qede_vlan_filter_set, 13332ea6f76aSRasesh Mody .flow_ctrl_set = qede_flow_ctrl_set, 13342ea6f76aSRasesh Mody .flow_ctrl_get = qede_flow_ctrl_get, 13352ea6f76aSRasesh Mody .dev_supported_ptypes_get = qede_dev_supported_ptypes_get, 13364c98f276SSony Chacko .rss_hash_update = qede_rss_hash_update, 13376d9e26c4SSony Chacko .rss_hash_conf_get = qede_rss_hash_conf_get, 1338e8876556SSony Chacko .reta_update = qede_rss_reta_update, 13393dadf73eSSony Chacko .reta_query = qede_rss_reta_query, 1340200645acSSony Chacko .mtu_set = qede_set_mtu, 13412ea6f76aSRasesh Mody }; 13422ea6f76aSRasesh Mody 134386a2265eSRasesh Mody static const struct eth_dev_ops qede_eth_vf_dev_ops = { 134486a2265eSRasesh Mody .dev_configure = qede_dev_configure, 134586a2265eSRasesh Mody .dev_infos_get = qede_dev_info_get, 134686a2265eSRasesh Mody .rx_queue_setup = qede_rx_queue_setup, 134786a2265eSRasesh Mody .rx_queue_release = qede_rx_queue_release, 134886a2265eSRasesh Mody .tx_queue_setup = qede_tx_queue_setup, 134986a2265eSRasesh Mody .tx_queue_release = qede_tx_queue_release, 135086a2265eSRasesh Mody .dev_start = qede_dev_start, 135186a2265eSRasesh Mody .dev_set_link_up = qede_dev_set_link_up, 135286a2265eSRasesh Mody .dev_set_link_down = qede_dev_set_link_down, 135386a2265eSRasesh Mody .link_update = qede_link_update, 135486a2265eSRasesh Mody .promiscuous_enable = qede_promiscuous_enable, 135586a2265eSRasesh Mody .promiscuous_disable = qede_promiscuous_disable, 135686a2265eSRasesh Mody .allmulticast_enable = qede_allmulticast_enable, 135786a2265eSRasesh Mody .allmulticast_disable = qede_allmulticast_disable, 135886a2265eSRasesh Mody .dev_stop = qede_dev_stop, 135986a2265eSRasesh Mody .dev_close = qede_dev_close, 136086a2265eSRasesh Mody .stats_get = qede_get_stats, 136186a2265eSRasesh Mody .stats_reset = qede_reset_stats, 1362d1216e22SRasesh Mody .xstats_get = qede_get_xstats, 1363d1216e22SRasesh Mody .xstats_reset = qede_reset_xstats, 1364d1216e22SRasesh Mody .xstats_get_names = qede_get_xstats_names, 136586a2265eSRasesh Mody .vlan_offload_set = qede_vlan_offload_set, 136686a2265eSRasesh Mody .vlan_filter_set = qede_vlan_filter_set, 136786a2265eSRasesh Mody .dev_supported_ptypes_get = qede_dev_supported_ptypes_get, 13684c98f276SSony Chacko .rss_hash_update = qede_rss_hash_update, 13696d9e26c4SSony Chacko .rss_hash_conf_get = qede_rss_hash_conf_get, 1370e8876556SSony Chacko .reta_update = qede_rss_reta_update, 13713dadf73eSSony Chacko .reta_query = qede_rss_reta_query, 1372200645acSSony Chacko .mtu_set = qede_set_mtu, 137386a2265eSRasesh Mody }; 137486a2265eSRasesh Mody 13752ea6f76aSRasesh Mody static void qede_update_pf_params(struct ecore_dev *edev) 13762ea6f76aSRasesh Mody { 13772ea6f76aSRasesh Mody struct ecore_pf_params pf_params; 13782ea6f76aSRasesh Mody /* 32 rx + 32 tx */ 13792ea6f76aSRasesh Mody memset(&pf_params, 0, sizeof(struct ecore_pf_params)); 13802ea6f76aSRasesh Mody pf_params.eth_pf_params.num_cons = 64; 13812ea6f76aSRasesh Mody qed_ops->common->update_pf_params(edev, &pf_params); 13822ea6f76aSRasesh Mody } 13832ea6f76aSRasesh Mody 13842ea6f76aSRasesh Mody static int qede_common_dev_init(struct rte_eth_dev *eth_dev, bool is_vf) 13852ea6f76aSRasesh Mody { 13862ea6f76aSRasesh Mody struct rte_pci_device *pci_dev; 13872ea6f76aSRasesh Mody struct rte_pci_addr pci_addr; 13882ea6f76aSRasesh Mody struct qede_dev *adapter; 13892ea6f76aSRasesh Mody struct ecore_dev *edev; 13902ea6f76aSRasesh Mody struct qed_dev_eth_info dev_info; 13912ea6f76aSRasesh Mody struct qed_slowpath_params params; 13922ea6f76aSRasesh Mody static bool do_once = true; 13932ea6f76aSRasesh Mody uint8_t bulletin_change; 13942ea6f76aSRasesh Mody uint8_t vf_mac[ETHER_ADDR_LEN]; 13952ea6f76aSRasesh Mody uint8_t is_mac_forced; 13962ea6f76aSRasesh Mody bool is_mac_exist; 13972ea6f76aSRasesh Mody /* Fix up ecore debug level */ 13982ea6f76aSRasesh Mody uint32_t dp_module = ~0 & ~ECORE_MSG_HW; 13992ea6f76aSRasesh Mody uint8_t dp_level = ECORE_LEVEL_VERBOSE; 14002ea6f76aSRasesh Mody uint32_t max_mac_addrs; 14012ea6f76aSRasesh Mody int rc; 14022ea6f76aSRasesh Mody 14032ea6f76aSRasesh Mody /* Extract key data structures */ 14042ea6f76aSRasesh Mody adapter = eth_dev->data->dev_private; 14052ea6f76aSRasesh Mody edev = &adapter->edev; 14062ea6f76aSRasesh Mody pci_addr = eth_dev->pci_dev->addr; 14072ea6f76aSRasesh Mody 14082ea6f76aSRasesh Mody PMD_INIT_FUNC_TRACE(edev); 14092ea6f76aSRasesh Mody 14102ea6f76aSRasesh Mody snprintf(edev->name, NAME_SIZE, PCI_SHORT_PRI_FMT ":dpdk-port-%u", 14112ea6f76aSRasesh Mody pci_addr.bus, pci_addr.devid, pci_addr.function, 14122ea6f76aSRasesh Mody eth_dev->data->port_id); 14132ea6f76aSRasesh Mody 14142ea6f76aSRasesh Mody eth_dev->rx_pkt_burst = qede_recv_pkts; 14152ea6f76aSRasesh Mody eth_dev->tx_pkt_burst = qede_xmit_pkts; 14162ea6f76aSRasesh Mody 14172ea6f76aSRasesh Mody if (rte_eal_process_type() != RTE_PROC_PRIMARY) { 14182ea6f76aSRasesh Mody DP_NOTICE(edev, false, 14192ea6f76aSRasesh Mody "Skipping device init from secondary process\n"); 14202ea6f76aSRasesh Mody return 0; 14212ea6f76aSRasesh Mody } 14222ea6f76aSRasesh Mody 14232ea6f76aSRasesh Mody pci_dev = eth_dev->pci_dev; 14242ea6f76aSRasesh Mody 14252ea6f76aSRasesh Mody rte_eth_copy_pci_info(eth_dev, pci_dev); 14262ea6f76aSRasesh Mody 14275cdd769aSRasesh Mody qed_ops = qed_get_eth_ops(); 14285cdd769aSRasesh Mody if (!qed_ops) { 14295cdd769aSRasesh Mody DP_ERR(edev, "Failed to get qed_eth_ops_pass\n"); 14305cdd769aSRasesh Mody return -EINVAL; 14315cdd769aSRasesh Mody } 14325cdd769aSRasesh Mody 14332ea6f76aSRasesh Mody DP_INFO(edev, "Starting qede probe\n"); 14342ea6f76aSRasesh Mody 14352ea6f76aSRasesh Mody rc = qed_ops->common->probe(edev, pci_dev, QED_PROTOCOL_ETH, 14362ea6f76aSRasesh Mody dp_module, dp_level, is_vf); 14372ea6f76aSRasesh Mody 14382ea6f76aSRasesh Mody if (rc != 0) { 14392ea6f76aSRasesh Mody DP_ERR(edev, "qede probe failed rc %d\n", rc); 14402ea6f76aSRasesh Mody return -ENODEV; 14412ea6f76aSRasesh Mody } 14422ea6f76aSRasesh Mody 14432ea6f76aSRasesh Mody qede_update_pf_params(edev); 14442ea6f76aSRasesh Mody 14452ea6f76aSRasesh Mody rte_intr_callback_register(ð_dev->pci_dev->intr_handle, 14462ea6f76aSRasesh Mody qede_interrupt_handler, (void *)eth_dev); 14472ea6f76aSRasesh Mody 14482ea6f76aSRasesh Mody if (rte_intr_enable(ð_dev->pci_dev->intr_handle)) { 14492ea6f76aSRasesh Mody DP_ERR(edev, "rte_intr_enable() failed\n"); 14502ea6f76aSRasesh Mody return -ENODEV; 14512ea6f76aSRasesh Mody } 14522ea6f76aSRasesh Mody 14532ea6f76aSRasesh Mody /* Start the Slowpath-process */ 14542ea6f76aSRasesh Mody memset(¶ms, 0, sizeof(struct qed_slowpath_params)); 14552ea6f76aSRasesh Mody params.int_mode = ECORE_INT_MODE_MSIX; 14567eca78ceSHarish Patil params.drv_major = QEDE_PMD_VERSION_MAJOR; 14577eca78ceSHarish Patil params.drv_minor = QEDE_PMD_VERSION_MINOR; 14587eca78ceSHarish Patil params.drv_rev = QEDE_PMD_VERSION_REVISION; 14597eca78ceSHarish Patil params.drv_eng = QEDE_PMD_VERSION_PATCH; 14607eca78ceSHarish Patil strncpy((char *)params.name, QEDE_PMD_VER_PREFIX, 14617eca78ceSHarish Patil QEDE_PMD_DRV_VER_STR_SIZE); 14622ea6f76aSRasesh Mody 14632af14ca7SHarish Patil /* For CMT mode device do periodic polling for slowpath events. 14642af14ca7SHarish Patil * This is required since uio device uses only one MSI-x 14652af14ca7SHarish Patil * interrupt vector but we need one for each engine. 14662af14ca7SHarish Patil */ 1467de027ce7SHarish Patil if (edev->num_hwfns > 1 && IS_PF(edev)) { 14682af14ca7SHarish Patil rc = rte_eal_alarm_set(timer_period * US_PER_S, 14692af14ca7SHarish Patil qede_poll_sp_sb_cb, 14702af14ca7SHarish Patil (void *)eth_dev); 14712af14ca7SHarish Patil if (rc != 0) { 14722af14ca7SHarish Patil DP_ERR(edev, "Unable to start periodic" 14732af14ca7SHarish Patil " timer rc %d\n", rc); 14742af14ca7SHarish Patil return -EINVAL; 14752af14ca7SHarish Patil } 14762af14ca7SHarish Patil } 14772af14ca7SHarish Patil 14782ea6f76aSRasesh Mody rc = qed_ops->common->slowpath_start(edev, ¶ms); 14792ea6f76aSRasesh Mody if (rc) { 14802ea6f76aSRasesh Mody DP_ERR(edev, "Cannot start slowpath rc = %d\n", rc); 14812af14ca7SHarish Patil rte_eal_alarm_cancel(qede_poll_sp_sb_cb, 14822af14ca7SHarish Patil (void *)eth_dev); 14832ea6f76aSRasesh Mody return -ENODEV; 14842ea6f76aSRasesh Mody } 14852ea6f76aSRasesh Mody 14862ea6f76aSRasesh Mody rc = qed_ops->fill_dev_info(edev, &dev_info); 14872ea6f76aSRasesh Mody if (rc) { 14882ea6f76aSRasesh Mody DP_ERR(edev, "Cannot get device_info rc %d\n", rc); 14892ea6f76aSRasesh Mody qed_ops->common->slowpath_stop(edev); 14902ea6f76aSRasesh Mody qed_ops->common->remove(edev); 14912af14ca7SHarish Patil rte_eal_alarm_cancel(qede_poll_sp_sb_cb, 14922af14ca7SHarish Patil (void *)eth_dev); 14932ea6f76aSRasesh Mody return -ENODEV; 14942ea6f76aSRasesh Mody } 14952ea6f76aSRasesh Mody 14962ea6f76aSRasesh Mody qede_alloc_etherdev(adapter, &dev_info); 14972ea6f76aSRasesh Mody 14987eca78ceSHarish Patil adapter->ops->common->set_id(edev, edev->name, QEDE_PMD_VERSION); 14992ea6f76aSRasesh Mody 15002ea6f76aSRasesh Mody if (!is_vf) 15012ea6f76aSRasesh Mody adapter->dev_info.num_mac_addrs = 15022ea6f76aSRasesh Mody (uint32_t)RESC_NUM(ECORE_LEADING_HWFN(edev), 15032ea6f76aSRasesh Mody ECORE_MAC); 15042ea6f76aSRasesh Mody else 150586a2265eSRasesh Mody ecore_vf_get_num_mac_filters(ECORE_LEADING_HWFN(edev), 150686a2265eSRasesh Mody &adapter->dev_info.num_mac_addrs); 15072ea6f76aSRasesh Mody 15082ea6f76aSRasesh Mody /* Allocate memory for storing MAC addr */ 15092ea6f76aSRasesh Mody eth_dev->data->mac_addrs = rte_zmalloc(edev->name, 15102ea6f76aSRasesh Mody (ETHER_ADDR_LEN * 15112ea6f76aSRasesh Mody adapter->dev_info.num_mac_addrs), 15122ea6f76aSRasesh Mody RTE_CACHE_LINE_SIZE); 15132ea6f76aSRasesh Mody 15142ea6f76aSRasesh Mody if (eth_dev->data->mac_addrs == NULL) { 15152ea6f76aSRasesh Mody DP_ERR(edev, "Failed to allocate MAC address\n"); 15162ea6f76aSRasesh Mody qed_ops->common->slowpath_stop(edev); 15172ea6f76aSRasesh Mody qed_ops->common->remove(edev); 15182af14ca7SHarish Patil rte_eal_alarm_cancel(qede_poll_sp_sb_cb, 15192af14ca7SHarish Patil (void *)eth_dev); 15202ea6f76aSRasesh Mody return -ENOMEM; 15212ea6f76aSRasesh Mody } 15222ea6f76aSRasesh Mody 152386a2265eSRasesh Mody if (!is_vf) { 15242ea6f76aSRasesh Mody ether_addr_copy((struct ether_addr *)edev->hwfns[0]. 15252ea6f76aSRasesh Mody hw_info.hw_mac_addr, 15262ea6f76aSRasesh Mody ð_dev->data->mac_addrs[0]); 152786a2265eSRasesh Mody ether_addr_copy(ð_dev->data->mac_addrs[0], 152886a2265eSRasesh Mody &adapter->primary_mac); 152986a2265eSRasesh Mody } else { 153086a2265eSRasesh Mody ecore_vf_read_bulletin(ECORE_LEADING_HWFN(edev), 153186a2265eSRasesh Mody &bulletin_change); 153286a2265eSRasesh Mody if (bulletin_change) { 153386a2265eSRasesh Mody is_mac_exist = 153486a2265eSRasesh Mody ecore_vf_bulletin_get_forced_mac( 153586a2265eSRasesh Mody ECORE_LEADING_HWFN(edev), 153686a2265eSRasesh Mody vf_mac, 153786a2265eSRasesh Mody &is_mac_forced); 153886a2265eSRasesh Mody if (is_mac_exist && is_mac_forced) { 153986a2265eSRasesh Mody DP_INFO(edev, "VF macaddr received from PF\n"); 154086a2265eSRasesh Mody ether_addr_copy((struct ether_addr *)&vf_mac, 154186a2265eSRasesh Mody ð_dev->data->mac_addrs[0]); 154286a2265eSRasesh Mody ether_addr_copy(ð_dev->data->mac_addrs[0], 154386a2265eSRasesh Mody &adapter->primary_mac); 154486a2265eSRasesh Mody } else { 154586a2265eSRasesh Mody DP_NOTICE(edev, false, 154686a2265eSRasesh Mody "No VF macaddr assigned\n"); 154786a2265eSRasesh Mody } 154886a2265eSRasesh Mody } 154986a2265eSRasesh Mody } 15502ea6f76aSRasesh Mody 155186a2265eSRasesh Mody eth_dev->dev_ops = (is_vf) ? &qede_eth_vf_dev_ops : &qede_eth_dev_ops; 15522ea6f76aSRasesh Mody 15532ea6f76aSRasesh Mody if (do_once) { 15542ea6f76aSRasesh Mody qede_print_adapter_info(adapter); 15552ea6f76aSRasesh Mody do_once = false; 15562ea6f76aSRasesh Mody } 15572ea6f76aSRasesh Mody 1558dbac54c2SHarish Patil adapter->state = QEDE_DEV_INIT; 1559dbac54c2SHarish Patil 15602ea6f76aSRasesh Mody DP_NOTICE(edev, false, "MAC address : %02x:%02x:%02x:%02x:%02x:%02x\n", 15612ea6f76aSRasesh Mody adapter->primary_mac.addr_bytes[0], 15622ea6f76aSRasesh Mody adapter->primary_mac.addr_bytes[1], 15632ea6f76aSRasesh Mody adapter->primary_mac.addr_bytes[2], 15642ea6f76aSRasesh Mody adapter->primary_mac.addr_bytes[3], 15652ea6f76aSRasesh Mody adapter->primary_mac.addr_bytes[4], 15662ea6f76aSRasesh Mody adapter->primary_mac.addr_bytes[5]); 15672ea6f76aSRasesh Mody 15682ea6f76aSRasesh Mody return rc; 15692ea6f76aSRasesh Mody } 15702ea6f76aSRasesh Mody 15712ea6f76aSRasesh Mody static int qedevf_eth_dev_init(struct rte_eth_dev *eth_dev) 15722ea6f76aSRasesh Mody { 15732ea6f76aSRasesh Mody return qede_common_dev_init(eth_dev, 1); 15742ea6f76aSRasesh Mody } 15752ea6f76aSRasesh Mody 15762ea6f76aSRasesh Mody static int qede_eth_dev_init(struct rte_eth_dev *eth_dev) 15772ea6f76aSRasesh Mody { 15782ea6f76aSRasesh Mody return qede_common_dev_init(eth_dev, 0); 15792ea6f76aSRasesh Mody } 15802ea6f76aSRasesh Mody 15812ea6f76aSRasesh Mody static int qede_dev_common_uninit(struct rte_eth_dev *eth_dev) 15822ea6f76aSRasesh Mody { 15832ea6f76aSRasesh Mody /* only uninitialize in the primary process */ 15842ea6f76aSRasesh Mody if (rte_eal_process_type() != RTE_PROC_PRIMARY) 15852ea6f76aSRasesh Mody return 0; 15862ea6f76aSRasesh Mody 15872ea6f76aSRasesh Mody /* safe to close dev here */ 15882ea6f76aSRasesh Mody qede_dev_close(eth_dev); 15892ea6f76aSRasesh Mody 15902ea6f76aSRasesh Mody eth_dev->dev_ops = NULL; 15912ea6f76aSRasesh Mody eth_dev->rx_pkt_burst = NULL; 15922ea6f76aSRasesh Mody eth_dev->tx_pkt_burst = NULL; 15932ea6f76aSRasesh Mody 15942ea6f76aSRasesh Mody if (eth_dev->data->mac_addrs) 15952ea6f76aSRasesh Mody rte_free(eth_dev->data->mac_addrs); 15962ea6f76aSRasesh Mody 15972ea6f76aSRasesh Mody eth_dev->data->mac_addrs = NULL; 15982ea6f76aSRasesh Mody 15992ea6f76aSRasesh Mody return 0; 16002ea6f76aSRasesh Mody } 16012ea6f76aSRasesh Mody 16022ea6f76aSRasesh Mody static int qede_eth_dev_uninit(struct rte_eth_dev *eth_dev) 16032ea6f76aSRasesh Mody { 16042ea6f76aSRasesh Mody return qede_dev_common_uninit(eth_dev); 16052ea6f76aSRasesh Mody } 16062ea6f76aSRasesh Mody 16072ea6f76aSRasesh Mody static int qedevf_eth_dev_uninit(struct rte_eth_dev *eth_dev) 16082ea6f76aSRasesh Mody { 16092ea6f76aSRasesh Mody return qede_dev_common_uninit(eth_dev); 16102ea6f76aSRasesh Mody } 16112ea6f76aSRasesh Mody 16122ea6f76aSRasesh Mody static struct rte_pci_id pci_id_qedevf_map[] = { 16132ea6f76aSRasesh Mody #define QEDEVF_RTE_PCI_DEVICE(dev) RTE_PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, dev) 16142ea6f76aSRasesh Mody { 16152ea6f76aSRasesh Mody QEDEVF_RTE_PCI_DEVICE(PCI_DEVICE_ID_NX2_VF) 16162ea6f76aSRasesh Mody }, 16172ea6f76aSRasesh Mody { 16182ea6f76aSRasesh Mody QEDEVF_RTE_PCI_DEVICE(PCI_DEVICE_ID_57980S_IOV) 16192ea6f76aSRasesh Mody }, 16202ea6f76aSRasesh Mody {.vendor_id = 0,} 16212ea6f76aSRasesh Mody }; 16222ea6f76aSRasesh Mody 16232ea6f76aSRasesh Mody static struct rte_pci_id pci_id_qede_map[] = { 16242ea6f76aSRasesh Mody #define QEDE_RTE_PCI_DEVICE(dev) RTE_PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, dev) 16252ea6f76aSRasesh Mody { 16262ea6f76aSRasesh Mody QEDE_RTE_PCI_DEVICE(PCI_DEVICE_ID_NX2_57980E) 16272ea6f76aSRasesh Mody }, 16282ea6f76aSRasesh Mody { 16292ea6f76aSRasesh Mody QEDE_RTE_PCI_DEVICE(PCI_DEVICE_ID_NX2_57980S) 16302ea6f76aSRasesh Mody }, 16312ea6f76aSRasesh Mody { 16322ea6f76aSRasesh Mody QEDE_RTE_PCI_DEVICE(PCI_DEVICE_ID_57980S_40) 16332ea6f76aSRasesh Mody }, 16342ea6f76aSRasesh Mody { 16352ea6f76aSRasesh Mody QEDE_RTE_PCI_DEVICE(PCI_DEVICE_ID_57980S_25) 16362ea6f76aSRasesh Mody }, 16372af14ca7SHarish Patil { 16382af14ca7SHarish Patil QEDE_RTE_PCI_DEVICE(PCI_DEVICE_ID_57980S_100) 16392af14ca7SHarish Patil }, 16402ea6f76aSRasesh Mody {.vendor_id = 0,} 16412ea6f76aSRasesh Mody }; 16422ea6f76aSRasesh Mody 16432ea6f76aSRasesh Mody static struct eth_driver rte_qedevf_pmd = { 16442ea6f76aSRasesh Mody .pci_drv = { 16452ea6f76aSRasesh Mody .id_table = pci_id_qedevf_map, 16462ea6f76aSRasesh Mody .drv_flags = 16472ea6f76aSRasesh Mody RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC, 1648c830cb29SDavid Marchand .probe = rte_eth_dev_pci_probe, 1649c830cb29SDavid Marchand .remove = rte_eth_dev_pci_remove, 16502ea6f76aSRasesh Mody }, 16512ea6f76aSRasesh Mody .eth_dev_init = qedevf_eth_dev_init, 16522ea6f76aSRasesh Mody .eth_dev_uninit = qedevf_eth_dev_uninit, 16532ea6f76aSRasesh Mody .dev_private_size = sizeof(struct qede_dev), 16542ea6f76aSRasesh Mody }; 16552ea6f76aSRasesh Mody 16562ea6f76aSRasesh Mody static struct eth_driver rte_qede_pmd = { 16572ea6f76aSRasesh Mody .pci_drv = { 16582ea6f76aSRasesh Mody .id_table = pci_id_qede_map, 16592ea6f76aSRasesh Mody .drv_flags = 16602ea6f76aSRasesh Mody RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC, 1661c830cb29SDavid Marchand .probe = rte_eth_dev_pci_probe, 1662c830cb29SDavid Marchand .remove = rte_eth_dev_pci_remove, 16632ea6f76aSRasesh Mody }, 16642ea6f76aSRasesh Mody .eth_dev_init = qede_eth_dev_init, 16652ea6f76aSRasesh Mody .eth_dev_uninit = qede_eth_dev_uninit, 16662ea6f76aSRasesh Mody .dev_private_size = sizeof(struct qede_dev), 16672ea6f76aSRasesh Mody }; 16682ea6f76aSRasesh Mody 166901f19227SShreyansh Jain RTE_PMD_REGISTER_PCI(net_qede, rte_qede_pmd.pci_drv); 167001f19227SShreyansh Jain RTE_PMD_REGISTER_PCI_TABLE(net_qede, pci_id_qede_map); 1671*0880c401SOlivier Matz RTE_PMD_REGISTER_KMOD_DEP(net_qede, "* igb_uio | uio_pci_generic | vfio"); 167201f19227SShreyansh Jain RTE_PMD_REGISTER_PCI(net_qede_vf, rte_qedevf_pmd.pci_drv); 167301f19227SShreyansh Jain RTE_PMD_REGISTER_PCI_TABLE(net_qede_vf, pci_id_qedevf_map); 1674*0880c401SOlivier Matz RTE_PMD_REGISTER_KMOD_DEP(net_qede_vf, "* igb_uio | vfio"); 1675