RDMA/cxgb3: Support for new abort logic
authorSteve Wise <swise@opengridcomputing.com>
Thu, 26 Apr 2007 20:21:20 +0000 (15:21 -0500)
committerRoland Dreier <rolandd@cisco.com>
Mon, 7 May 2007 04:18:08 +0000 (21:18 -0700)
The HW now posts 2 ABORT_RPL and/or PEER_ABORT_REQ messages.  We need
to handle them by silenty dropping the 1st but mark that we're ready
for the final message.  This plugs some close races between the uP and
HW.  Also update the minimum required firmware version.

Signed-off-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
drivers/infiniband/hw/cxgb3/iwch_cm.c
drivers/infiniband/hw/cxgb3/iwch_cm.h
drivers/net/cxgb3/version.h

index a02be40ee29b69e79d3e72b3c146ae7818817028..b2faff5abce8648f533211fec884d0fc04b8d19d 100644 (file)
@@ -1109,6 +1109,15 @@ static int abort_rpl(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
 
        PDBG("%s ep %p\n", __FUNCTION__, ep);
 
+       /*
+        * We get 2 abort replies from the HW.  The first one must
+        * be ignored except for scribbling that we need one more.
+        */
+       if (!(ep->flags & ABORT_REQ_IN_PROGRESS)) {
+               ep->flags |= ABORT_REQ_IN_PROGRESS;
+               return CPL_RET_BUF_DONE;
+       }
+
        close_complete_upcall(ep);
        state_set(&ep->com, DEAD);
        release_ep_resources(ep);
@@ -1476,6 +1485,15 @@ static int peer_abort(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
        int ret;
        int state;
 
+       /*
+        * We get 2 peer aborts from the HW.  The first one must
+        * be ignored except for scribbling that we need one more.
+        */
+       if (!(ep->flags & PEER_ABORT_IN_PROGRESS)) {
+               ep->flags |= PEER_ABORT_IN_PROGRESS;
+               return CPL_RET_BUF_DONE;
+       }
+
        if (is_neg_adv_abort(req->status)) {
                PDBG("%s neg_adv_abort ep %p tid %d\n", __FUNCTION__, ep,
                     ep->hwtid);
index 0c6f281bd4a03726c4875ccb03c75771bde28f7b..21a388c313cffb536a2812fbc54a054480bd73f9 100644 (file)
@@ -143,6 +143,11 @@ enum iwch_ep_state {
        DEAD,
 };
 
+enum iwch_ep_flags {
+       PEER_ABORT_IN_PROGRESS  = (1 << 0),
+       ABORT_REQ_IN_PROGRESS   = (1 << 1),
+};
+
 struct iwch_ep_common {
        struct iw_cm_id *cm_id;
        struct iwch_qp *qp;
@@ -181,6 +186,7 @@ struct iwch_ep {
        u16 plen;
        u32 ird;
        u32 ord;
+       u32 flags;
 };
 
 static inline struct iwch_ep *to_ep(struct iw_cm_id *cm_id)
index 042e27e291cd7eea5db365ef3722b9c4adfdf784..b112317f033e1950d311490607e1cb7d16c43162 100644 (file)
@@ -38,7 +38,7 @@
 #define DRV_VERSION "1.0-ko"
 
 /* Firmware version */
-#define FW_VERSION_MAJOR 3
-#define FW_VERSION_MINOR 3
+#define FW_VERSION_MAJOR 4
+#define FW_VERSION_MINOR 0
 #define FW_VERSION_MICRO 0
 #endif                         /* __CHELSIO_VERSION_H */