New upstream version 16.11.8
[deb_dpdk.git] / drivers / net / bonding / rte_eth_bond_pmd.c
index aa71e3f..6081918 100644 (file)
@@ -643,7 +643,7 @@ bandwidth_left(uint8_t port_id, uint64_t load, uint8_t update_idx,
 {
        struct rte_eth_link link_status;
 
-       rte_eth_link_get(port_id, &link_status);
+       rte_eth_link_get_nowait(port_id, &link_status);
        uint64_t link_bwg = link_status.link_speed * 1000000ULL / 8;
        if (link_bwg == 0)
                return;
@@ -1217,7 +1217,8 @@ mac_address_slaves_update(struct rte_eth_dev *bonded_eth_dev)
        case BONDING_MODE_BALANCE:
        case BONDING_MODE_BROADCAST:
                for (i = 0; i < internals->slave_count; i++) {
-                       if (mac_address_set(&rte_eth_devices[internals->slaves[i].port_id],
+                       if (rte_eth_dev_default_mac_addr_set(
+                                       internals->slaves[i].port_id,
                                        bonded_eth_dev->data->mac_addrs)) {
                                RTE_BOND_LOG(ERR, "Failed to update port Id %d MAC address",
                                                internals->slaves[i].port_id);
@@ -1235,15 +1236,16 @@ mac_address_slaves_update(struct rte_eth_dev *bonded_eth_dev)
                for (i = 0; i < internals->slave_count; i++) {
                        if (internals->slaves[i].port_id ==
                                        internals->current_primary_port) {
-                               if (mac_address_set(&rte_eth_devices[internals->primary_port],
+                               if (rte_eth_dev_default_mac_addr_set(
+                                               internals->primary_port,
                                                bonded_eth_dev->data->mac_addrs)) {
                                        RTE_BOND_LOG(ERR, "Failed to update port Id %d MAC address",
                                                        internals->current_primary_port);
                                        return -1;
                                }
                        } else {
-                               if (mac_address_set(
-                                               &rte_eth_devices[internals->slaves[i].port_id],
+                               if (rte_eth_dev_default_mac_addr_set(
+                                               internals->slaves[i].port_id,
                                                &internals->slaves[i].persisted_mac_addr)) {
                                        RTE_BOND_LOG(ERR, "Failed to update port Id %d MAC address",
                                                        internals->slaves[i].port_id);
@@ -1523,7 +1525,7 @@ bond_ethdev_start(struct rte_eth_dev *eth_dev)
 
        if (internals->slave_count == 0) {
                RTE_BOND_LOG(ERR, "Cannot start port since there are no slave devices");
-               return -1;
+               goto out_err;
        }
 
        if (internals->user_defined_mac == 0) {
@@ -1534,19 +1536,15 @@ bond_ethdev_start(struct rte_eth_dev *eth_dev)
                                new_mac_addr = &internals->slaves[i].persisted_mac_addr;
 
                if (new_mac_addr == NULL)
-                       return -1;
+                       goto out_err;
 
                if (mac_address_set(eth_dev, new_mac_addr) != 0) {
                        RTE_BOND_LOG(ERR, "bonded port (%d) failed to update MAC address",
                                        eth_dev->data->port_id);
-                       return -1;
+                       goto out_err;
                }
        }
 
-       /* Update all slave devices MACs*/
-       if (mac_address_slaves_update(eth_dev) != 0)
-               return -1;
-
        /* If bonded device is configure in promiscuous mode then re-apply config */
        if (internals->promiscuous_en)
                bond_ethdev_promiscuous_enable(eth_dev);
@@ -1558,7 +1556,7 @@ bond_ethdev_start(struct rte_eth_dev *eth_dev)
                        RTE_BOND_LOG(ERR,
                                        "bonded port (%d) failed to reconfigure slave device (%d)",
                                        eth_dev->data->port_id, internals->slaves[i].port_id);
-                       return -1;
+                       goto out_err;
                }
                /* We will need to poll for link status if any slave doesn't
                 * support interrupts
@@ -1566,6 +1564,7 @@ bond_ethdev_start(struct rte_eth_dev *eth_dev)
                if (internals->slaves[i].link_status_poll_enabled)
                        internals->link_status_polling_enabled = 1;
        }
+
        /* start polling if needed */
        if (internals->link_status_polling_enabled) {
                rte_eal_alarm_set(
@@ -1574,6 +1573,10 @@ bond_ethdev_start(struct rte_eth_dev *eth_dev)
                        (void *)&rte_eth_devices[internals->port_id]);
        }
 
+       /* Update all slave devices MACs*/
+       if (mac_address_slaves_update(eth_dev) != 0)
+               goto out_err;
+
        if (internals->user_defined_primary_port)
                bond_ethdev_primary_set(internals, internals->primary_port);
 
@@ -1585,6 +1588,10 @@ bond_ethdev_start(struct rte_eth_dev *eth_dev)
                bond_tlb_enable(internals);
 
        return 0;
+
+out_err:
+       eth_dev->data->dev_started = 0;
+       return -1;
 }
 
 static void
@@ -1642,7 +1649,6 @@ bond_ethdev_stop(struct rte_eth_dev *eth_dev)
                        tlb_last_obytets[internals->active_slaves[i]] = 0;
        }
 
-       internals->active_slave_count = 0;
        internals->link_status_polling_enabled = 0;
        for (i = 0; i < internals->slave_count; i++)
                internals->slaves[i].last_link_status = 0;
@@ -1667,6 +1673,8 @@ static void
 bond_ethdev_info(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 {
        struct bond_dev_private *internals = dev->data->dev_private;
+       uint16_t max_nb_rx_queues = UINT16_MAX;
+       uint16_t max_nb_tx_queues = UINT16_MAX;
 
        dev_info->max_mac_addrs = 1;
 
@@ -1674,8 +1682,29 @@ bond_ethdev_info(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
                                  ? internals->candidate_max_rx_pktlen
                                  : ETHER_MAX_JUMBO_FRAME_LEN;
 
-       dev_info->max_rx_queues = (uint16_t)128;
-       dev_info->max_tx_queues = (uint16_t)512;
+       if (internals->slave_count > 0) {
+               /* Max number of tx/rx queues that the bonded device can
+                * support is the minimum values of the bonded slaves, as
+                * all slaves must be capable of supporting the same number
+                * of tx/rx queues.
+                */
+               struct rte_eth_dev_info slave_info;
+               uint8_t idx;
+
+               for (idx = 0; idx < internals->slave_count; idx++) {
+                       rte_eth_dev_info_get(internals->slaves[idx].port_id,
+                                       &slave_info);
+
+                       if (slave_info.max_rx_queues < max_nb_rx_queues)
+                               max_nb_rx_queues = slave_info.max_rx_queues;
+
+                       if (slave_info.max_tx_queues < max_nb_tx_queues)
+                               max_nb_tx_queues = slave_info.max_tx_queues;
+               }
+       }
+
+       dev_info->max_rx_queues = max_nb_rx_queues;
+       dev_info->max_tx_queues = max_nb_tx_queues;
 
        dev_info->min_rx_bufsize = 0;
        dev_info->pci_dev = NULL;