ethdev: use device handle to detach
[dpdk.git] / app / test-pmd / testpmd.c
index cec1cb9..0a23d82 100644 (file)
@@ -73,6 +73,9 @@
 #include <rte_ethdev.h>
 #include <rte_dev.h>
 #include <rte_string_fns.h>
+#ifdef RTE_LIBRTE_IXGBE_PMD
+#include <rte_pmd_ixgbe.h>
+#endif
 #ifdef RTE_LIBRTE_PMD_XENVIRT
 #include <rte_eth_xenvirt.h>
 #endif
@@ -295,13 +298,13 @@ uint32_t event_print_mask = (UINT32_C(1) << RTE_ETH_EVENT_UNKNOWN) |
 /*
  * NIC bypass mode configuration options.
  */
-#ifdef RTE_NIC_BYPASS
 
+#if defined RTE_LIBRTE_IXGBE_PMD && defined RTE_LIBRTE_IXGBE_BYPASS
 /* The NIC bypass watchdog timeout. */
-uint32_t bypass_timeout = RTE_BYPASS_TMT_OFF;
-
+uint32_t bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_OFF;
 #endif
 
+
 #ifdef RTE_LIBRTE_LATENCY_STATS
 
 /*
@@ -365,7 +368,8 @@ struct queue_stats_mappings *rx_queue_stats_mappings = rx_queue_stats_mappings_a
 uint16_t nb_tx_queue_stats_mappings = 0;
 uint16_t nb_rx_queue_stats_mappings = 0;
 
-unsigned max_socket = 0;
+unsigned int num_sockets = 0;
+unsigned int socket_ids[RTE_MAX_NUMA_NODES];
 
 #ifdef RTE_LIBRTE_BITRATE
 /* Bitrate statistics */
@@ -377,9 +381,9 @@ uint8_t bitrate_enabled;
 /* Forward function declarations */
 static void map_port_queue_stats_mapping_registers(uint8_t pi, struct rte_port *port);
 static void check_all_ports_link_status(uint32_t port_mask);
-static void eth_event_callback(uint8_t port_id,
-                              enum rte_eth_event_type type,
-                              void *param);
+static int eth_event_callback(uint8_t port_id,
+                             enum rte_eth_event_type type,
+                             void *param, void *ret_param);
 
 /*
  * Check if all the ports are started.
@@ -387,6 +391,22 @@ static void eth_event_callback(uint8_t port_id,
  */
 static int all_ports_started(void);
 
+/*
+ * Helper function to check if socket is already discovered.
+ * If yes, return positive value. If not, return zero.
+ */
+int
+new_socket_id(unsigned int socket_id)
+{
+       unsigned int i;
+
+       for (i = 0; i < num_sockets; i++) {
+               if (socket_ids[i] == socket_id)
+                       return 0;
+       }
+       return 1;
+}
+
 /*
  * Setup default configuration.
  */
@@ -399,11 +419,14 @@ set_default_fwd_lcores_config(void)
 
        nb_lc = 0;
        for (i = 0; i < RTE_MAX_LCORE; i++) {
-               sock_num = rte_lcore_to_socket_id(i) + 1;
-               if (sock_num > max_socket) {
-                       if (sock_num > RTE_MAX_NUMA_NODES)
-                               rte_exit(EXIT_FAILURE, "Total sockets greater than %u\n", RTE_MAX_NUMA_NODES);
-                       max_socket = sock_num;
+               sock_num = rte_lcore_to_socket_id(i);
+               if (new_socket_id(sock_num)) {
+                       if (num_sockets >= RTE_MAX_NUMA_NODES) {
+                               rte_exit(EXIT_FAILURE,
+                                        "Total sockets greater than %u\n",
+                                        RTE_MAX_NUMA_NODES);
+                       }
+                       socket_ids[num_sockets++] = sock_num;
                }
                if (!rte_lcore_is_enabled(i))
                        continue;
@@ -517,7 +540,7 @@ check_socket_id(const unsigned int socket_id)
 {
        static int warning_once = 0;
 
-       if (socket_id >= max_socket) {
+       if (new_socket_id(socket_id)) {
                if (!warning_once && numa_support)
                        printf("Warning: NUMA should be configured manually by"
                               " using --port-numa-config and"
@@ -609,8 +632,9 @@ init_config(void)
        if (numa_support) {
                uint8_t i;
 
-               for (i = 0; i < max_socket; i++)
-                       mbuf_pool_create(mbuf_data_size, nb_mbuf_per_pool, i);
+               for (i = 0; i < num_sockets; i++)
+                       mbuf_pool_create(mbuf_data_size, nb_mbuf_per_pool,
+                                        socket_ids[i]);
        } else {
                if (socket_num == UMA_NO_CONFIG)
                        mbuf_pool_create(mbuf_data_size, nb_mbuf_per_pool, 0);
@@ -1800,13 +1824,14 @@ rmv_event_callback(void *arg)
        else if (da->type == RTE_DEVTYPE_WHITELISTED_PCI)
                rte_pci_device_name(&da->pci.addr, name, sizeof(name));
        printf("removing device %s\n", name);
-       rte_eal_dev_detach(name);
+       rte_eal_dev_detach(dev->device);
        dev->state = RTE_ETH_DEV_UNUSED;
 }
 
 /* This function is used by the interrupt thread */
-static void
-eth_event_callback(uint8_t port_id, enum rte_eth_event_type type, void *param)
+static int
+eth_event_callback(uint8_t port_id, enum rte_eth_event_type type, void *param,
+                 void *ret_param)
 {
        static const char * const event_desc[] = {
                [RTE_ETH_EVENT_UNKNOWN] = "Unknown",
@@ -1820,6 +1845,7 @@ eth_event_callback(uint8_t port_id, enum rte_eth_event_type type, void *param)
        };
 
        RTE_SET_USED(param);
+       RTE_SET_USED(ret_param);
 
        if (type >= RTE_ETH_EVENT_MAX) {
                fprintf(stderr, "\nPort %" PRIu8 ": %s called upon invalid event %d\n",
@@ -1840,6 +1866,7 @@ eth_event_callback(uint8_t port_id, enum rte_eth_event_type type, void *param)
        default:
                break;
        }
+       return 0;
 }
 
 static int
@@ -1991,8 +2018,8 @@ init_port_config(void)
                rte_eth_macaddr_get(pid, &port->eth_addr);
 
                map_port_queue_stats_mapping_registers(pid, port);
-#ifdef RTE_NIC_BYPASS
-               rte_eth_dev_bypass_init(pid);
+#if defined RTE_LIBRTE_IXGBE_PMD && defined RTE_LIBRTE_IXGBE_BYPASS
+               rte_pmd_ixgbe_bypass_init(pid);
 #endif
 
                if (lsc_interrupt &&