1 /*- 2 * Copyright (c) 2010 Isilon Systems, Inc. 3 * Copyright (c) 2010 iX Systems, Inc. 4 * Copyright (c) 2010 Panasas, Inc. 5 * Copyright (c) 2013-2021 Mellanox Technologies, Ltd. 6 * Copyright (c) 2014 François Tigeot 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice unmodified, this list of conditions, and the following 14 * disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 21 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 24 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 #ifndef _LINUXKPI_LINUX_DELAY_H_ 31 #define _LINUXKPI_LINUX_DELAY_H_ 32 33 #include <linux/math.h> 34 #include <linux/sched.h> 35 #include <linux/jiffies.h> 36 37 #include <sys/systm.h> 38 39 static inline void 40 linux_msleep(unsigned int ms) 41 { 42 /* guard against invalid values */ 43 if (ms == 0) 44 ms = 1; 45 pause_sbt("lnxsleep", mstosbt(ms), 0, C_HARDCLOCK); 46 } 47 48 #undef msleep 49 #define msleep(ms) linux_msleep(ms) 50 51 #undef msleep_interruptible 52 #define msleep_interruptible(ms) linux_msleep_interruptible(ms) 53 54 #define udelay(t) DELAY(t) 55 56 static inline void 57 mdelay(unsigned long msecs) 58 { 59 while (msecs--) 60 DELAY(1000); 61 } 62 63 static inline void 64 ndelay(unsigned long x) 65 { 66 DELAY(howmany(x, 1000)); 67 } 68 69 static inline void 70 usleep_range_state(unsigned long min, unsigned long max, unsigned int state) 71 { 72 KASSERT(state == TASK_UNINTERRUPTIBLE, ("%s: state=%d unsupported\n", 73 __func__, state)); 74 75 /* guard against invalid values */ 76 if (min == 0) 77 min = 1; 78 pause_sbt("lnxsleep", ustosbt(min), 0, C_HARDCLOCK); 79 } 80 81 static inline void 82 usleep_range(unsigned long min, unsigned long max) 83 { 84 usleep_range_state(min, max, TASK_UNINTERRUPTIBLE); 85 } 86 87 extern unsigned int linux_msleep_interruptible(unsigned int ms); 88 89 static inline void 90 fsleep(unsigned long us) 91 { 92 93 if (us < 10) 94 udelay(us); 95 else 96 usleep_range(us, us); 97 } 98 99 #endif /* _LINUXKPI_LINUX_DELAY_H_ */ 100