Author: np
Date: Tue Apr 25 16:54:27 2017
New Revision: 317410
URL: https://svnweb.freebsd.org/changeset/base/317410

Log:
  cxgbe/iw_cxgbe: Pull in some updates to c4iw_wait_for_reply from the
  iw_cxgb4 Linux driver.
  
  Obtained from:        Chelsio Communications
  MFC after:    3 days
  Sponsored by: Chelsio Communications

Modified:
  head/sys/dev/cxgbe/iw_cxgbe/iw_cxgbe.h

Modified: head/sys/dev/cxgbe/iw_cxgbe/iw_cxgbe.h
==============================================================================
--- head/sys/dev/cxgbe/iw_cxgbe/iw_cxgbe.h      Tue Apr 25 15:56:46 2017        
(r317409)
+++ head/sys/dev/cxgbe/iw_cxgbe/iw_cxgbe.h      Tue Apr 25 16:54:27 2017        
(r317410)
@@ -157,49 +157,70 @@ static inline int c4iw_num_stags(struct 
        return (int)(rdev->adap->vres.stag.size >> 5);
 }
 
-#define C4IW_WR_TO (10*HZ)
+#define C4IW_WR_TO (60*HZ)
 
 struct c4iw_wr_wait {
        int ret;
-       atomic_t completion;
+       struct completion completion;
 };
 
 static inline void c4iw_init_wr_wait(struct c4iw_wr_wait *wr_waitp)
 {
        wr_waitp->ret = 0;
-       atomic_set(&wr_waitp->completion, 0);
+       init_completion(&wr_waitp->completion);
 }
 
 static inline void c4iw_wake_up(struct c4iw_wr_wait *wr_waitp, int ret)
 {
        wr_waitp->ret = ret;
-       atomic_set(&wr_waitp->completion, 1);
-       wakeup(wr_waitp);
+       complete(&wr_waitp->completion);
 }
 
 static inline int
 c4iw_wait_for_reply(struct c4iw_rdev *rdev, struct c4iw_wr_wait *wr_waitp,
-    u32 hwtid, u32 qpid, const char *func)
+                                       u32 hwtid, u32 qpid, const char *func)
 {
        struct adapter *sc = rdev->adap;
        unsigned to = C4IW_WR_TO;
+       int ret;
+       int timedout = 0;
+       struct timeval t1, t2;
+
+       if (c4iw_fatal_error(rdev)) {
+               wr_waitp->ret = -EIO;
+               goto out;
+       }
 
-       while (!atomic_read(&wr_waitp->completion)) {
-                tsleep(wr_waitp, 0, "c4iw_wait", to);
-                if (SIGPENDING(curthread)) {
-                       printf("%s - Device %s not responding - "
-                           "tid %u qpid %u\n", func,
-                           device_get_nameunit(sc->dev), hwtid, qpid);
-                        if (c4iw_fatal_error(rdev)) {
-                                wr_waitp->ret = -EIO;
-                                break;
-                        }
-                        to = to << 2;
-                }
-        }
+       getmicrotime(&t1);
+       do {
+               ret = wait_for_completion_timeout(&wr_waitp->completion, to);
+               if (!ret) {
+                       getmicrotime(&t2);
+                       timevalsub(&t2, &t1);
+                       printf("%s - Device %s not responding after %ld.%06ld "
+                           "seconds - tid %u qpid %u\n", func,
+                           device_get_nameunit(sc->dev), t2.tv_sec, t2.tv_usec,
+                           hwtid, qpid);
+                       if (c4iw_fatal_error(rdev)) {
+                               wr_waitp->ret = -EIO;
+                               break;
+                       }
+                       to = to << 2;
+                       timedout = 1;
+               }
+       } while (!ret);
+
+out:
+       if (timedout) {
+               getmicrotime(&t2);
+               timevalsub(&t2, &t1);
+               printf("%s - Device %s reply after %ld.%06ld seconds - "
+                   "tid %u qpid %u\n", func, device_get_nameunit(sc->dev),
+                   t2.tv_sec, t2.tv_usec, hwtid, qpid);
+       }
        if (wr_waitp->ret)
-               CTR4(KTR_IW_CXGBE, "%s: FW reply %d tid %u qpid %u",
-                   device_get_nameunit(sc->dev), wr_waitp->ret, hwtid, qpid);
+               CTR4(KTR_IW_CXGBE, "%p: FW reply %d tid %u qpid %u", sc,
+                   wr_waitp->ret, hwtid, qpid);
        return (wr_waitp->ret);
 }
 
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to