]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/myri10ge/myri10ge.c
myri10ge: fix stop/go mmio ordering
[linux-2.6-omap-h63xx.git] / drivers / net / myri10ge / myri10ge.c
index a9aebad526528d369798dd88b051aa90a26ec6ec..a5f428bcc0ebb28011efb551534584e768c4a6e9 100644 (file)
@@ -75,7 +75,7 @@
 #include "myri10ge_mcp.h"
 #include "myri10ge_mcp_gen_header.h"
 
-#define MYRI10GE_VERSION_STR "1.4.3-1.369"
+#define MYRI10GE_VERSION_STR "1.4.3-1.375"
 
 MODULE_DESCRIPTION("Myricom 10G driver (10GbE)");
 MODULE_AUTHOR("Maintainer: help@myri.com");
@@ -1393,6 +1393,7 @@ myri10ge_tx_done(struct myri10ge_slice_state *ss, int mcp_index)
                if (tx->req == tx->done) {
                        tx->queue_active = 0;
                        put_be32(htonl(1), tx->send_stop);
+                       mmiowb();
                }
                __netif_tx_unlock(dev_queue);
        }
@@ -2497,6 +2498,10 @@ static int myri10ge_open(struct net_device *dev)
        return 0;
 
 abort_with_rings:
+       while (slice) {
+               slice--;
+               napi_disable(&mgp->ss[slice].napi);
+       }
        for (i = 0; i < mgp->num_slices; i++)
                myri10ge_free_rings(&mgp->ss[i]);
 
@@ -2860,6 +2865,7 @@ again:
        if ((mgp->dev->real_num_tx_queues > 1) && tx->queue_active == 0) {
                tx->queue_active = 1;
                put_be32(htonl(1), tx->send_go);
+               mmiowb();
        }
        tx->pkt_start++;
        if ((avail - count) < MXGEFW_MAX_SEND_DESC) {