xref: /linux/drivers/net/wireless/mediatek/mt7601u/core.c (revision d7929c1e13e3788e7cb741d75b5baec5e53eff21)
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 }
71