18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * aQuantia Corporation Network Driver 48c2ecf20Sopenharmony_ci * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci/* File aq_utils.h: Useful macro and structures used in all layers of driver. */ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#ifndef AQ_UTILS_H 108c2ecf20Sopenharmony_ci#define AQ_UTILS_H 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#include "aq_common.h" 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_cistatic inline void aq_utils_obj_set(atomic_t *flags, u32 mask) 158c2ecf20Sopenharmony_ci{ 168c2ecf20Sopenharmony_ci unsigned long flags_old, flags_new; 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci do { 198c2ecf20Sopenharmony_ci flags_old = atomic_read(flags); 208c2ecf20Sopenharmony_ci flags_new = flags_old | (mask); 218c2ecf20Sopenharmony_ci } while (atomic_cmpxchg(flags, flags_old, flags_new) != flags_old); 228c2ecf20Sopenharmony_ci} 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_cistatic inline void aq_utils_obj_clear(atomic_t *flags, u32 mask) 258c2ecf20Sopenharmony_ci{ 268c2ecf20Sopenharmony_ci unsigned long flags_old, flags_new; 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci do { 298c2ecf20Sopenharmony_ci flags_old = atomic_read(flags); 308c2ecf20Sopenharmony_ci flags_new = flags_old & ~(mask); 318c2ecf20Sopenharmony_ci } while (atomic_cmpxchg(flags, flags_old, flags_new) != flags_old); 328c2ecf20Sopenharmony_ci} 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_cistatic inline bool aq_utils_obj_test(atomic_t *flags, u32 mask) 358c2ecf20Sopenharmony_ci{ 368c2ecf20Sopenharmony_ci return atomic_read(flags) & mask; 378c2ecf20Sopenharmony_ci} 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci#endif /* AQ_UTILS_H */ 40