1 // SPDX-License-Identifier: ISC
3 * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name>
6 #include <linux/module.h>
9 bool __mt76_poll(struct mt76_dev
*dev
, u32 offset
, u32 mask
, u32 val
,
16 cur
= __mt76_rr(dev
, offset
) & mask
;
21 } while (timeout
-- > 0);
25 EXPORT_SYMBOL_GPL(__mt76_poll
);
27 bool ____mt76_poll_msec(struct mt76_dev
*dev
, u32 offset
, u32 mask
, u32 val
,
28 int timeout
, int tick
)
34 cur
= __mt76_rr(dev
, offset
) & mask
;
38 usleep_range(1000 * tick
, 2000 * tick
);
39 } while (timeout
-- > 0);
43 EXPORT_SYMBOL_GPL(____mt76_poll_msec
);
45 int mt76_wcid_alloc(u32
*mask
, int size
)
49 for (i
= 0; i
< DIV_ROUND_UP(size
, 32); i
++) {
65 EXPORT_SYMBOL_GPL(mt76_wcid_alloc
);
67 int mt76_get_min_avg_rssi(struct mt76_dev
*dev
, bool ext_phy
)
69 struct mt76_wcid
*wcid
;
70 int i
, j
, min_rssi
= 0;
76 for (i
= 0; i
< ARRAY_SIZE(dev
->wcid_mask
); i
++) {
77 u32 mask
= dev
->wcid_mask
[i
];
78 u32 phy_mask
= dev
->wcid_phy_mask
[i
];
83 for (j
= i
* 32; mask
; j
++, mask
>>= 1, phy_mask
>>= 1) {
87 if (!!(phy_mask
& 1) != ext_phy
)
90 wcid
= rcu_dereference(dev
->wcid
[j
]);
94 spin_lock(&dev
->rx_lock
);
95 if (wcid
->inactive_count
++ < 5)
96 cur_rssi
= -ewma_signal_read(&wcid
->rssi
);
99 spin_unlock(&dev
->rx_lock
);
101 if (cur_rssi
< min_rssi
)
111 EXPORT_SYMBOL_GPL(mt76_get_min_avg_rssi
);
113 int __mt76_worker_fn(void *ptr
)
115 struct mt76_worker
*w
= ptr
;
117 while (!kthread_should_stop()) {
118 set_current_state(TASK_INTERRUPTIBLE
);
120 if (kthread_should_park()) {
125 if (!test_and_clear_bit(MT76_WORKER_SCHEDULED
, &w
->state
)) {
130 set_bit(MT76_WORKER_RUNNING
, &w
->state
);
131 set_current_state(TASK_RUNNING
);
134 clear_bit(MT76_WORKER_RUNNING
, &w
->state
);
139 EXPORT_SYMBOL_GPL(__mt76_worker_fn
);
141 MODULE_DESCRIPTION("MediaTek MT76x helpers");
142 MODULE_LICENSE("Dual BSD/GPL");