1*75a6faf6SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
23a35780fSDavid VomLehn /*
33a35780fSDavid VomLehn * aQuantia Corporation Network Driver
43a35780fSDavid VomLehn * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
53a35780fSDavid VomLehn */
63a35780fSDavid VomLehn
73a35780fSDavid VomLehn /* File aq_utils.h: Useful macro and structures used in all layers of driver. */
83a35780fSDavid VomLehn
93a35780fSDavid VomLehn #ifndef AQ_UTILS_H
103a35780fSDavid VomLehn #define AQ_UTILS_H
113a35780fSDavid VomLehn
123a35780fSDavid VomLehn #include "aq_common.h"
133a35780fSDavid VomLehn
aq_utils_obj_set(atomic_t * flags,u32 mask)143a35780fSDavid VomLehn static inline void aq_utils_obj_set(atomic_t *flags, u32 mask)
153a35780fSDavid VomLehn {
163a35780fSDavid VomLehn unsigned long flags_old, flags_new;
173a35780fSDavid VomLehn
183a35780fSDavid VomLehn do {
193a35780fSDavid VomLehn flags_old = atomic_read(flags);
203a35780fSDavid VomLehn flags_new = flags_old | (mask);
213a35780fSDavid VomLehn } while (atomic_cmpxchg(flags, flags_old, flags_new) != flags_old);
223a35780fSDavid VomLehn }
233a35780fSDavid VomLehn
aq_utils_obj_clear(atomic_t * flags,u32 mask)243a35780fSDavid VomLehn static inline void aq_utils_obj_clear(atomic_t *flags, u32 mask)
253a35780fSDavid VomLehn {
263a35780fSDavid VomLehn unsigned long flags_old, flags_new;
273a35780fSDavid VomLehn
283a35780fSDavid VomLehn do {
293a35780fSDavid VomLehn flags_old = atomic_read(flags);
303a35780fSDavid VomLehn flags_new = flags_old & ~(mask);
313a35780fSDavid VomLehn } while (atomic_cmpxchg(flags, flags_old, flags_new) != flags_old);
323a35780fSDavid VomLehn }
333a35780fSDavid VomLehn
aq_utils_obj_test(atomic_t * flags,u32 mask)343a35780fSDavid VomLehn static inline bool aq_utils_obj_test(atomic_t *flags, u32 mask)
353a35780fSDavid VomLehn {
363a35780fSDavid VomLehn return atomic_read(flags) & mask;
373a35780fSDavid VomLehn }
383a35780fSDavid VomLehn
393a35780fSDavid VomLehn #endif /* AQ_UTILS_H */
40