igb_uio: fix build on arm64 kernel
[dpdk.git] / app / test-pmd / testpmd.c
index 9142218..49fd2ad 100644 (file)
@@ -390,7 +390,7 @@ struct gro_status gro_ports[RTE_MAX_ETHPORTS];
 /* 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 int eth_event_callback(uint8_t port_id,
+static int eth_event_callback(portid_t port_id,
                              enum rte_eth_event_type type,
                              void *param, void *ret_param);
 
@@ -1682,6 +1682,47 @@ close_port(portid_t pid)
        printf("Done\n");
 }
 
+void
+reset_port(portid_t pid)
+{
+       int diag;
+       portid_t pi;
+       struct rte_port *port;
+
+       if (port_id_is_invalid(pid, ENABLED_WARN))
+               return;
+
+       printf("Resetting ports...\n");
+
+       RTE_ETH_FOREACH_DEV(pi) {
+               if (pid != pi && pid != (portid_t)RTE_PORT_ALL)
+                       continue;
+
+               if (port_is_forwarding(pi) != 0 && test_done == 0) {
+                       printf("Please remove port %d from forwarding "
+                              "configuration.\n", pi);
+                       continue;
+               }
+
+               if (port_is_bonding_slave(pi)) {
+                       printf("Please remove port %d from bonded device.\n",
+                              pi);
+                       continue;
+               }
+
+               diag = rte_eth_dev_reset(pi);
+               if (diag == 0) {
+                       port = &ports[pi];
+                       port->need_reconfig = 1;
+                       port->need_reconfig_queues = 1;
+               } else {
+                       printf("Failed to reset port %d. diag=%d\n", pi, diag);
+               }
+       }
+
+       printf("Done\n");
+}
+
 void
 attach_port(char *identifier)
 {
@@ -1728,8 +1769,10 @@ detach_port(uint8_t port_id)
        if (ports[port_id].flow_list)
                port_flow_flush(port_id);
 
-       if (rte_eth_dev_detach(port_id, name))
+       if (rte_eth_dev_detach(port_id, name)) {
+               RTE_LOG(ERR, USER1, "Failed to detach port '%s'\n", name);
                return;
+       }
 
        nb_ports = rte_eth_dev_count();
 
@@ -1773,7 +1816,8 @@ check_all_ports_link_status(uint32_t port_mask)
 {
 #define CHECK_INTERVAL 100 /* 100ms */
 #define MAX_CHECK_TIME 90 /* 9s (90 * 100ms) in total */
-       uint8_t portid, count, all_ports_up, print_flag = 0;
+       portid_t portid;
+       uint8_t count, all_ports_up, print_flag = 0;
        struct rte_eth_link link;
 
        printf("Checking link statuses...\n");
@@ -1788,14 +1832,13 @@ check_all_ports_link_status(uint32_t port_mask)
                        /* print link status if flag set */
                        if (print_flag == 1) {
                                if (link.link_status)
-                                       printf("Port %d Link Up - speed %u "
-                                               "Mbps - %s\n", (uint8_t)portid,
-                                               (unsigned)link.link_speed,
+                                       printf(
+                                       "Port%d Link Up. speed %u Mbps- %s\n",
+                                       portid, link.link_speed,
                                (link.link_duplex == ETH_LINK_FULL_DUPLEX) ?
                                        ("full-duplex") : ("half-duplex\n"));
                                else
-                                       printf("Port %d Link Down\n",
-                                               (uint8_t)portid);
+                                       printf("Port %d Link Down\n", portid);
                                continue;
                        }
                        /* clear all_ports_up flag if any link down */
@@ -1835,12 +1878,14 @@ rmv_event_callback(void *arg)
        stop_port(port_id);
        close_port(port_id);
        printf("removing device %s\n", dev->device->name);
-       rte_eal_dev_detach(dev->device);
+       if (rte_eal_dev_detach(dev->device))
+               RTE_LOG(ERR, USER1, "Failed to detach device %s\n",
+                       dev->device->name);
 }
 
 /* This function is used by the interrupt thread */
 static int
-eth_event_callback(uint8_t port_id, enum rte_eth_event_type type, void *param,
+eth_event_callback(portid_t port_id, enum rte_eth_event_type type, void *param,
                  void *ret_param)
 {
        static const char * const event_desc[] = {
@@ -2169,7 +2214,7 @@ init_port_dcb_config(portid_t pid,
         * Set the numbers of RX & TX queues to 0, so
         * the RX & TX queues will not be setup.
         */
-       (void)rte_eth_dev_configure(pid, 0, 0, &port_conf);
+       rte_eth_dev_configure(pid, 0, 0, &port_conf);
 
        rte_eth_dev_info_get(pid, &rte_port->dev_info);
 
@@ -2283,7 +2328,7 @@ int
 main(int argc, char** argv)
 {
        int  diag;
-       uint8_t port_id;
+       portid_t port_id;
 
        signal(SIGINT, signal_handler);
        signal(SIGTERM, signal_handler);
@@ -2325,6 +2370,13 @@ main(int argc, char** argv)
        if (tx_first && interactive)
                rte_exit(EXIT_FAILURE, "--tx-first cannot be used on "
                                "interactive mode.\n");
+
+       if (tx_first && lsc_interrupt) {
+               printf("Warning: lsc_interrupt needs to be off when "
+                               " using tx_first. Disabling.\n");
+               lsc_interrupt = 0;
+       }
+
        if (!nb_rxq && !nb_txq)
                printf("Warning: Either rx or tx queues should be non-zero\n");