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(msecs: 10); |
65 | } while (timeout-- > 0); |
66 | |
67 | dev_err(dev->dev, "Error: Time out with reg %08x\n" , offset); |
68 | |
69 | return false; |
70 | } |
71 | |