xref: /linux/drivers/net/wireless/mediatek/mt7601u/core.c (revision b85d45947951d23cb22d90caecf4c1eb81342c96)
1 /*
2  * Copyright (C) 2014 Felix Fietkau <nbd@openwrt.org>
3  * Copyright (C) 2015 Jakub Kicinski <kubakici@wp.pl>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2
7  * as published by the Free Software Foundation
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  */
14 
15 #include "mt7601u.h"
16 
17 int mt7601u_wait_asic_ready(struct mt7601u_dev *dev)
18 {
19 	int i = 100;
20 	u32 val;
21 
22 	do {
23 		if (test_bit(MT7601U_STATE_REMOVED, &dev->state))
24 			return -EIO;
25 
26 		val = mt7601u_rr(dev, MT_MAC_CSR0);
27 		if (val && ~val)
28 			return 0;
29 
30 		udelay(10);
31 	} while (i--);
32 
33 	return -EIO;
34 }
35 
36 bool mt76_poll(struct mt7601u_dev *dev, u32 offset, u32 mask, u32 val,
37 	       int timeout)
38 {
39 	u32 cur;
40 
41 	timeout /= 10;
42 	do {
43 		if (test_bit(MT7601U_STATE_REMOVED, &dev->state))
44 			return false;
45 
46 		cur = mt7601u_rr(dev, offset) & mask;
47 		if (cur == val)
48 			return true;
49 
50 		udelay(10);
51 	} while (timeout-- > 0);
52 
53 	dev_err(dev->dev, "Error: Time out with reg %08x\n", offset);
54 
55 	return false;
56 }
57 
58 bool mt76_poll_msec(struct mt7601u_dev *dev, u32 offset, u32 mask, u32 val,
59 		    int timeout)
60 {
61 	u32 cur;
62 
63 	timeout /= 10;
64 	do {
65 		if (test_bit(MT7601U_STATE_REMOVED, &dev->state))
66 			return false;
67 
68 		cur = mt7601u_rr(dev, offset) & mask;
69 		if (cur == val)
70 			return true;
71 
72 		msleep(10);
73 	} while (timeout-- > 0);
74 
75 	dev_err(dev->dev, "Error: Time out with reg %08x\n", offset);
76 
77 	return false;
78 }
79