Merge branch 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelv...
[deliverable/linux.git] / drivers / net / benet / be_main.c
index 5aadd71d4613c97b74739653f2d63f85dbaca9b2..66bb56874d9bd0bbc99b18284f836f2e6a2535ba 100644 (file)
@@ -876,12 +876,19 @@ static struct be_eth_rx_compl *be_rx_compl_get(struct be_adapter *adapter)
 
        be_dws_le_to_cpu(rxcp, sizeof(*rxcp));
 
-       rxcp->dw[offsetof(struct amap_eth_rx_compl, valid) / 32] = 0;
-
        queue_tail_inc(&adapter->rx_obj.cq);
        return rxcp;
 }
 
+/* To reset the valid bit, we need to reset the whole word as
+ * when walking the queue the valid entries are little-endian
+ * and invalid entries are host endian
+ */
+static inline void be_rx_compl_reset(struct be_eth_rx_compl *rxcp)
+{
+       rxcp->dw[offsetof(struct amap_eth_rx_compl, valid) / 32] = 0;
+}
+
 static inline struct page *be_alloc_pages(u32 size)
 {
        gfp_t alloc_flags = GFP_ATOMIC;
@@ -1013,6 +1020,7 @@ static void be_rx_q_clean(struct be_adapter *adapter)
        /* First cleanup pending rx completions */
        while ((rxcp = be_rx_compl_get(adapter)) != NULL) {
                be_rx_compl_discard(adapter, rxcp);
+               be_rx_compl_reset(rxcp);
                be_cq_notify(&adapter->ctrl, rx_cq->id, true, 1);
        }
 
@@ -1048,8 +1056,13 @@ static void be_tx_queues_destroy(struct be_adapter *adapter)
        struct be_queue_info *q;
 
        q = &adapter->tx_obj.q;
-       if (q->created)
+       if (q->created) {
                be_cmd_q_destroy(&adapter->ctrl, q, QTYPE_TXQ);
+
+               /* No more tx completions can be rcvd now; clean up if there
+                * are any pending completions or pending tx requests */
+               be_tx_q_clean(adapter);
+       }
        be_queue_free(adapter, q);
 
        q = &adapter->tx_obj.cq;
@@ -1057,10 +1070,6 @@ static void be_tx_queues_destroy(struct be_adapter *adapter)
                be_cmd_q_destroy(&adapter->ctrl, q, QTYPE_CQ);
        be_queue_free(adapter, q);
 
-       /* No more tx completions can be rcvd now; clean up if there are
-        * any pending completions or pending tx requests */
-       be_tx_q_clean(adapter);
-
        q = &adapter->tx_eq.q;
        if (q->created)
                be_cmd_q_destroy(&adapter->ctrl, q, QTYPE_EQ);
@@ -1294,6 +1303,8 @@ int be_poll_rx(struct napi_struct *napi, int budget)
                        be_rx_compl_process_lro(adapter, rxcp);
                else
                        be_rx_compl_process(adapter, rxcp);
+
+               be_rx_compl_reset(rxcp);
        }
 
        lro_flush_all(&adapter->rx_obj.lro_mgr);
This page took 0.028357 seconds and 5 git commands to generate.