net/bnxt: fix speed autonegotiation
[dpdk.git] / drivers / net / ngbe / ngbe_ethdev.c
index 8e31234..4a2a9dd 100644 (file)
@@ -314,6 +314,7 @@ eth_ngbe_dev_init(struct rte_eth_dev *eth_dev, void *init_params __rte_unused)
        struct rte_intr_handle *intr_handle = pci_dev->intr_handle;
        const struct rte_memzone *mz;
        uint32_t ctrl_ext;
+       u32 led_conf = 0;
        int err, ret;
 
        PMD_INIT_FUNC_TRACE();
@@ -401,6 +402,12 @@ eth_ngbe_dev_init(struct rte_eth_dev *eth_dev, void *init_params __rte_unused)
                return -EIO;
        }
 
+       err = hw->phy.led_oem_chk(hw, &led_conf);
+       if (err == 0)
+               hw->led_conf = led_conf;
+       else
+               hw->led_conf = 0xFFFF;
+
        err = hw->mac.init_hw(hw);
        if (err != 0) {
                PMD_INIT_LOG(ERR, "Hardware Initialization Failure: %d", err);
@@ -950,7 +957,6 @@ ngbe_dev_start(struct rte_eth_dev *dev)
 
        /* stop adapter */
        hw->adapter_stopped = 0;
-       ngbe_stop_hw(hw);
 
        /* reinitialize adapter, this calls reset and start */
        hw->nb_rx_queues = dev->data->nb_rx_queues;
@@ -961,6 +967,8 @@ ngbe_dev_start(struct rte_eth_dev *dev)
        hw->mac.start_hw(hw);
        hw->mac.get_link_status = true;
 
+       ngbe_set_pcie_master(hw, true);
+
        /* configure PF module if SRIOV enabled */
        ngbe_pf_host_configure(dev);
 
@@ -1057,7 +1065,11 @@ ngbe_dev_start(struct rte_eth_dev *dev)
                        speed |= NGBE_LINK_SPEED_10M_FULL;
        }
 
-       hw->phy.init_hw(hw);
+       err = hw->phy.init_hw(hw);
+       if (err != 0) {
+               PMD_INIT_LOG(ERR, "PHY init failed");
+               goto error;
+       }
        err = hw->mac.setup_link(hw, speed, link_up);
        if (err != 0)
                goto error;
@@ -1092,8 +1104,7 @@ skip_link_setup:
        /* resume enabled intr since HW reset */
        ngbe_enable_intr(dev);
 
-       if ((hw->sub_system_id & NGBE_OEM_MASK) == NGBE_LY_M88E1512_SFP ||
-               (hw->sub_system_id & NGBE_OEM_MASK) == NGBE_LY_YT8521S_SFP) {
+       if (hw->gpio_ctl) {
                /* gpio0 is used to power on/off control*/
                wr32(hw, NGBE_GPIODATA, 0);
        }
@@ -1136,8 +1147,7 @@ ngbe_dev_stop(struct rte_eth_dev *dev)
 
        rte_eal_alarm_cancel(ngbe_dev_setup_link_alarm_handler, dev);
 
-       if ((hw->sub_system_id & NGBE_OEM_MASK) == NGBE_LY_M88E1512_SFP ||
-               (hw->sub_system_id & NGBE_OEM_MASK) == NGBE_LY_YT8521S_SFP) {
+       if (hw->gpio_ctl) {
                /* gpio0 is used to power on/off control*/
                wr32(hw, NGBE_GPIODATA, NGBE_GPIOBIT_0);
        }
@@ -1174,6 +1184,8 @@ ngbe_dev_stop(struct rte_eth_dev *dev)
        rte_intr_efd_disable(intr_handle);
        rte_intr_vec_list_free(intr_handle);
 
+       ngbe_set_pcie_master(hw, true);
+
        adapter->rss_reta_updated = 0;
 
        hw->adapter_stopped = true;
@@ -1202,6 +1214,8 @@ ngbe_dev_close(struct rte_eth_dev *dev)
 
        ngbe_dev_free_queues(dev);
 
+       ngbe_set_pcie_master(hw, false);
+
        /* reprogram the RAR[0] in case user changed it. */
        ngbe_set_rar(hw, 0, hw->mac.addr, 0, true);