12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- /*
- * aQuantia Corporation Network Driver
- * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- */
- /* File aq_utils.h: Useful macro and structures used in all layers of driver. */
- #ifndef AQ_UTILS_H
- #define AQ_UTILS_H
- #include "aq_common.h"
- #define AQ_DIMOF(_ARY_) ARRAY_SIZE(_ARY_)
- struct aq_obj_s {
- spinlock_t lock; /* spinlock for nic/rings processing */
- atomic_t flags;
- };
- static inline void aq_utils_obj_set(atomic_t *flags, u32 mask)
- {
- unsigned long flags_old, flags_new;
- do {
- flags_old = atomic_read(flags);
- flags_new = flags_old | (mask);
- } while (atomic_cmpxchg(flags, flags_old, flags_new) != flags_old);
- }
- static inline void aq_utils_obj_clear(atomic_t *flags, u32 mask)
- {
- unsigned long flags_old, flags_new;
- do {
- flags_old = atomic_read(flags);
- flags_new = flags_old & ~(mask);
- } while (atomic_cmpxchg(flags, flags_old, flags_new) != flags_old);
- }
- static inline bool aq_utils_obj_test(atomic_t *flags, u32 mask)
- {
- return atomic_read(flags) & mask;
- }
- #endif /* AQ_UTILS_H */
|