Linux-libre 5.4.47-gnu
[librecmc/linux-libre.git] / drivers / net / wireless / mediatek / mt7601u / core.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (C) 2014 Felix Fietkau <nbd@openwrt.org>
4  * Copyright (C) 2015 Jakub Kicinski <kubakici@wp.pl>
5  */
6
7 #include "mt7601u.h"
8
9 int mt7601u_wait_asic_ready(struct mt7601u_dev *dev)
10 {
11         int i = 100;
12         u32 val;
13
14         do {
15                 if (test_bit(MT7601U_STATE_REMOVED, &dev->state))
16                         return -EIO;
17
18                 val = mt7601u_rr(dev, MT_MAC_CSR0);
19                 if (val && ~val)
20                         return 0;
21
22                 udelay(10);
23         } while (i--);
24
25         return -EIO;
26 }
27
28 bool mt76_poll(struct mt7601u_dev *dev, u32 offset, u32 mask, u32 val,
29                int timeout)
30 {
31         u32 cur;
32
33         timeout /= 10;
34         do {
35                 if (test_bit(MT7601U_STATE_REMOVED, &dev->state))
36                         return false;
37
38                 cur = mt7601u_rr(dev, offset) & mask;
39                 if (cur == val)
40                         return true;
41
42                 udelay(10);
43         } while (timeout-- > 0);
44
45         dev_err(dev->dev, "Error: Time out with reg %08x\n", offset);
46
47         return false;
48 }
49
50 bool mt76_poll_msec(struct mt7601u_dev *dev, u32 offset, u32 mask, u32 val,
51                     int timeout)
52 {
53         u32 cur;
54
55         timeout /= 10;
56         do {
57                 if (test_bit(MT7601U_STATE_REMOVED, &dev->state))
58                         return false;
59
60                 cur = mt7601u_rr(dev, offset) & mask;
61                 if (cur == val)
62                         return true;
63
64                 msleep(10);
65         } while (timeout-- > 0);
66
67         dev_err(dev->dev, "Error: Time out with reg %08x\n", offset);
68
69         return false;
70 }