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