These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / net / wireless / mediatek / mt7601u / core.c
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 }