]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/net/ethernet/intel/i40evf/i40evf_main.c
Merge tag 'armsoc-late' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
[karo-tx-linux.git] / drivers / net / ethernet / intel / i40evf / i40evf_main.c
index 600fb9c4a7f0b74f532fa9b75e0052056a9ff784..14372810fc27aefc36ed1244641051eda34ec184 100644 (file)
@@ -38,7 +38,7 @@ static const char i40evf_driver_string[] =
 
 #define DRV_VERSION_MAJOR 1
 #define DRV_VERSION_MINOR 6
-#define DRV_VERSION_BUILD 11
+#define DRV_VERSION_BUILD 16
 #define DRV_VERSION __stringify(DRV_VERSION_MAJOR) "." \
             __stringify(DRV_VERSION_MINOR) "." \
             __stringify(DRV_VERSION_BUILD) \
@@ -370,6 +370,7 @@ i40evf_map_vector_to_rxq(struct i40evf_adapter *adapter, int v_idx, int r_idx)
 {
        struct i40e_q_vector *q_vector = &adapter->q_vectors[v_idx];
        struct i40e_ring *rx_ring = &adapter->rx_rings[r_idx];
+       struct i40e_hw *hw = &adapter->hw;
 
        rx_ring->q_vector = q_vector;
        rx_ring->next = q_vector->rx.ring;
@@ -377,7 +378,10 @@ i40evf_map_vector_to_rxq(struct i40evf_adapter *adapter, int v_idx, int r_idx)
        q_vector->rx.ring = rx_ring;
        q_vector->rx.count++;
        q_vector->rx.latency_range = I40E_LOW_LATENCY;
+       q_vector->rx.itr = ITR_TO_REG(rx_ring->rx_itr_setting);
+       q_vector->ring_mask |= BIT(r_idx);
        q_vector->itr_countdown = ITR_COUNTDOWN_START;
+       wr32(hw, I40E_VFINT_ITRN1(I40E_RX_ITR, v_idx - 1), q_vector->rx.itr);
 }
 
 /**
@@ -391,6 +395,7 @@ i40evf_map_vector_to_txq(struct i40evf_adapter *adapter, int v_idx, int t_idx)
 {
        struct i40e_q_vector *q_vector = &adapter->q_vectors[v_idx];
        struct i40e_ring *tx_ring = &adapter->tx_rings[t_idx];
+       struct i40e_hw *hw = &adapter->hw;
 
        tx_ring->q_vector = q_vector;
        tx_ring->next = q_vector->tx.ring;
@@ -398,9 +403,10 @@ i40evf_map_vector_to_txq(struct i40evf_adapter *adapter, int v_idx, int t_idx)
        q_vector->tx.ring = tx_ring;
        q_vector->tx.count++;
        q_vector->tx.latency_range = I40E_LOW_LATENCY;
+       q_vector->tx.itr = ITR_TO_REG(tx_ring->tx_itr_setting);
        q_vector->itr_countdown = ITR_COUNTDOWN_START;
        q_vector->num_ringpairs++;
-       q_vector->ring_mask |= BIT(t_idx);
+       wr32(hw, I40E_VFINT_ITRN1(I40E_TX_ITR, v_idx - 1), q_vector->tx.itr);
 }
 
 /**
@@ -1007,7 +1013,7 @@ static void i40evf_configure(struct i40evf_adapter *adapter)
  * i40evf_up_complete - Finish the last steps of bringing up a connection
  * @adapter: board private structure
  **/
-static int i40evf_up_complete(struct i40evf_adapter *adapter)
+static void i40evf_up_complete(struct i40evf_adapter *adapter)
 {
        adapter->state = __I40EVF_RUNNING;
        clear_bit(__I40E_DOWN, &adapter->vsi.state);
@@ -1016,7 +1022,6 @@ static int i40evf_up_complete(struct i40evf_adapter *adapter)
 
        adapter->aq_required |= I40EVF_FLAG_AQ_ENABLE_QUEUES;
        mod_timer_pending(&adapter->watchdog_timer, jiffies + 1);
-       return 0;
 }
 
 /**
@@ -1037,6 +1042,7 @@ void i40evf_down(struct i40evf_adapter *adapter)
 
        netif_carrier_off(netdev);
        netif_tx_disable(netdev);
+       adapter->link_up = false;
        i40evf_napi_disable_all(adapter);
        i40evf_irq_disable(adapter);
 
@@ -1154,6 +1160,7 @@ static int i40evf_alloc_queues(struct i40evf_adapter *adapter)
                tx_ring->netdev = adapter->netdev;
                tx_ring->dev = &adapter->pdev->dev;
                tx_ring->count = adapter->tx_desc_count;
+               tx_ring->tx_itr_setting = (I40E_ITR_DYNAMIC | I40E_ITR_TX_DEF);
                if (adapter->flags & I40E_FLAG_WB_ON_ITR_CAPABLE)
                        tx_ring->flags |= I40E_TXR_FLAGS_WB_ON_ITR;
 
@@ -1162,6 +1169,7 @@ static int i40evf_alloc_queues(struct i40evf_adapter *adapter)
                rx_ring->netdev = adapter->netdev;
                rx_ring->dev = &adapter->pdev->dev;
                rx_ring->count = adapter->rx_desc_count;
+               rx_ring->rx_itr_setting = (I40E_ITR_DYNAMIC | I40E_ITR_RX_DEF);
        }
 
        return 0;
@@ -1420,7 +1428,9 @@ int i40evf_init_interrupt_scheme(struct i40evf_adapter *adapter)
 {
        int err;
 
+       rtnl_lock();
        err = i40evf_set_interrupt_capability(adapter);
+       rtnl_unlock();
        if (err) {
                dev_err(&adapter->pdev->dev,
                        "Unable to setup interrupt capabilities\n");
@@ -1729,6 +1739,7 @@ static void i40evf_reset_task(struct work_struct *work)
                        set_bit(__I40E_DOWN, &adapter->vsi.state);
                        netif_carrier_off(netdev);
                        netif_tx_disable(netdev);
+                       adapter->link_up = false;
                        i40evf_napi_disable_all(adapter);
                        i40evf_irq_disable(adapter);
                        i40evf_free_traffic_irqs(adapter);
@@ -1767,6 +1778,7 @@ continue_reset:
        if (netif_running(adapter->netdev)) {
                netif_carrier_off(netdev);
                netif_tx_stop_all_queues(netdev);
+               adapter->link_up = false;
                i40evf_napi_disable_all(adapter);
        }
        i40evf_irq_disable(adapter);
@@ -1781,8 +1793,7 @@ continue_reset:
        i40evf_free_all_tx_resources(adapter);
 
        /* kill and reinit the admin queue */
-       if (i40evf_shutdown_adminq(hw))
-               dev_warn(&adapter->pdev->dev, "Failed to shut down adminq\n");
+       i40evf_shutdown_adminq(hw);
        adapter->current_op = I40E_VIRTCHNL_OP_UNKNOWN;
        err = i40evf_init_adminq(hw);
        if (err)
@@ -1802,6 +1813,8 @@ continue_reset:
        }
        adapter->aq_required |= I40EVF_FLAG_AQ_ADD_MAC_FILTER;
        adapter->aq_required |= I40EVF_FLAG_AQ_ADD_VLAN_FILTER;
+       /* Open RDMA Client again */
+       adapter->aq_required |= I40EVF_FLAG_SERVICE_CLIENT_REQUESTED;
        clear_bit(__I40EVF_IN_CRITICAL_TASK, &adapter->crit_section);
        i40evf_misc_irq_enable(adapter);
 
@@ -1820,9 +1833,7 @@ continue_reset:
 
                i40evf_configure(adapter);
 
-               err = i40evf_up_complete(adapter);
-               if (err)
-                       goto reset_err;
+               i40evf_up_complete(adapter);
 
                i40evf_irq_enable(adapter, true);
        } else {
@@ -2052,9 +2063,7 @@ static int i40evf_open(struct net_device *netdev)
        i40evf_add_filter(adapter, adapter->hw.mac.addr);
        i40evf_configure(adapter);
 
-       err = i40evf_up_complete(adapter);
-       if (err)
-               goto err_req_irq;
+       i40evf_up_complete(adapter);
 
        i40evf_irq_enable(adapter, true);
 
@@ -2268,10 +2277,6 @@ int i40evf_process_config(struct i40evf_adapter *adapter)
        adapter->vsi.back = adapter;
        adapter->vsi.base_vector = 1;
        adapter->vsi.work_limit = I40E_DEFAULT_IRQ_WORK;
-       adapter->vsi.rx_itr_setting = (I40E_ITR_DYNAMIC |
-                                      ITR_REG_TO_USEC(I40E_ITR_RX_DEF));
-       adapter->vsi.tx_itr_setting = (I40E_ITR_DYNAMIC |
-                                      ITR_REG_TO_USEC(I40E_ITR_TX_DEF));
        vsi->netdev = adapter->netdev;
        vsi->qs_handle = adapter->vsi_res->qset_handle;
        if (vfres->vf_offload_flags & I40E_VIRTCHNL_VF_OFFLOAD_RSS_PF) {
@@ -2453,6 +2458,7 @@ static void i40evf_init_task(struct work_struct *work)
                goto err_sw_init;
 
        netif_carrier_off(netdev);
+       adapter->link_up = false;
 
        if (!adapter->netdev_registered) {
                err = register_netdev(netdev);
@@ -2831,7 +2837,8 @@ static int __init i40evf_init_module(void)
 
        pr_info("%s\n", i40evf_copyright);
 
-       i40evf_wq = create_singlethread_workqueue(i40evf_driver_name);
+       i40evf_wq = alloc_workqueue("%s", WQ_UNBOUND | WQ_MEM_RECLAIM, 1,
+                                   i40evf_driver_name);
        if (!i40evf_wq) {
                pr_err("%s: Failed to create workqueue\n", i40evf_driver_name);
                return -ENOMEM;