Merge remote-tracking branch 'omap_dss2/for-next'
[deliverable/linux.git] / drivers / net / ethernet / intel / fm10k / fm10k_main.c
index e9767b6366a83b2860c21c57a529c833298feac3..0d39103124bd348d140a32c20d10eb0969247328 100644 (file)
@@ -56,7 +56,7 @@ static int __init fm10k_init_module(void)
        pr_info("%s\n", fm10k_copyright);
 
        /* create driver workqueue */
-       fm10k_workqueue = alloc_workqueue("fm10k", WQ_MEM_RECLAIM, 0);
+       fm10k_workqueue = alloc_workqueue("%s", WQ_MEM_RECLAIM, 0, fm10k_driver_name);
 
        fm10k_dbg_init();
 
@@ -651,11 +651,11 @@ static int fm10k_clean_rx_irq(struct fm10k_q_vector *q_vector,
 static struct ethhdr *fm10k_port_is_vxlan(struct sk_buff *skb)
 {
        struct fm10k_intfc *interface = netdev_priv(skb->dev);
-       struct fm10k_vxlan_port *vxlan_port;
+       struct fm10k_udp_port *vxlan_port;
 
        /* we can only offload a vxlan if we recognize it as such */
        vxlan_port = list_first_entry_or_null(&interface->vxlan_port,
-                                             struct fm10k_vxlan_port, list);
+                                             struct fm10k_udp_port, list);
 
        if (!vxlan_port)
                return NULL;
@@ -1128,13 +1128,24 @@ static u64 fm10k_get_tx_completed(struct fm10k_ring *ring)
        return ring->stats.packets;
 }
 
-u64 fm10k_get_tx_pending(struct fm10k_ring *ring)
+/**
+ * fm10k_get_tx_pending - how many Tx descriptors not processed
+ * @ring: the ring structure
+ * @in_sw: is tx_pending being checked in SW or in HW?
+ */
+u64 fm10k_get_tx_pending(struct fm10k_ring *ring, bool in_sw)
 {
        struct fm10k_intfc *interface = ring->q_vector->interface;
        struct fm10k_hw *hw = &interface->hw;
+       u32 head, tail;
 
-       u32 head = fm10k_read_reg(hw, FM10K_TDH(ring->reg_idx));
-       u32 tail = fm10k_read_reg(hw, FM10K_TDT(ring->reg_idx));
+       if (likely(in_sw)) {
+               head = ring->next_to_clean;
+               tail = ring->next_to_use;
+       } else {
+               head = fm10k_read_reg(hw, FM10K_TDH(ring->reg_idx));
+               tail = fm10k_read_reg(hw, FM10K_TDT(ring->reg_idx));
+       }
 
        return ((head <= tail) ? tail : tail + ring->count) - head;
 }
@@ -1143,7 +1154,7 @@ bool fm10k_check_tx_hang(struct fm10k_ring *tx_ring)
 {
        u32 tx_done = fm10k_get_tx_completed(tx_ring);
        u32 tx_done_old = tx_ring->tx_stats.tx_done_old;
-       u32 tx_pending = fm10k_get_tx_pending(tx_ring);
+       u32 tx_pending = fm10k_get_tx_pending(tx_ring, true);
 
        clear_check_for_tx_hang(tx_ring);
 
@@ -1397,7 +1408,7 @@ static void fm10k_update_itr(struct fm10k_ring_container *ring_container)
         * that the calculation will never get below a 1. The bit shift
         * accounts for changes in the ITR due to PCIe link speed.
         */
-       itr_round = ACCESS_ONCE(ring_container->itr_scale) + 8;
+       itr_round = READ_ONCE(ring_container->itr_scale) + 8;
        avg_wire_size += BIT(itr_round) - 1;
        avg_wire_size >>= itr_round;
 
@@ -1473,7 +1484,7 @@ static int fm10k_poll(struct napi_struct *napi, int budget)
        /* re-enable the q_vector */
        fm10k_qv_enable(q_vector);
 
-       return 0;
+       return min(work_done, budget - 1);
 }
 
 /**
This page took 0.027029 seconds and 5 git commands to generate.