app/testpmd: add port reset command
[dpdk.git] / app / test-pmd / testpmd.c
index 9142218..e097ee0 100644 (file)
@@ -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();
 
@@ -1835,7 +1878,9 @@ 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 */
@@ -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");