util.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /*
  2. * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name>
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software for any
  5. * purpose with or without fee is hereby granted, provided that the above
  6. * copyright notice and this permission notice appear in all copies.
  7. *
  8. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  9. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  14. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. */
  16. #include <linux/module.h>
  17. #include "mt76.h"
  18. bool __mt76_poll(struct mt76_dev *dev, u32 offset, u32 mask, u32 val,
  19. int timeout)
  20. {
  21. u32 cur;
  22. timeout /= 10;
  23. do {
  24. cur = dev->bus->rr(dev, offset) & mask;
  25. if (cur == val)
  26. return true;
  27. udelay(10);
  28. } while (timeout-- > 0);
  29. return false;
  30. }
  31. EXPORT_SYMBOL_GPL(__mt76_poll);
  32. bool __mt76_poll_msec(struct mt76_dev *dev, u32 offset, u32 mask, u32 val,
  33. int timeout)
  34. {
  35. u32 cur;
  36. timeout /= 10;
  37. do {
  38. cur = dev->bus->rr(dev, offset) & mask;
  39. if (cur == val)
  40. return true;
  41. usleep_range(10000, 20000);
  42. } while (timeout-- > 0);
  43. return false;
  44. }
  45. EXPORT_SYMBOL_GPL(__mt76_poll_msec);
  46. int mt76_wcid_alloc(unsigned long *mask, int size)
  47. {
  48. int i, idx = 0, cur;
  49. for (i = 0; i < size / BITS_PER_LONG; i++) {
  50. idx = ffs(~mask[i]);
  51. if (!idx)
  52. continue;
  53. idx--;
  54. cur = i * BITS_PER_LONG + idx;
  55. if (cur >= size)
  56. break;
  57. mask[i] |= BIT(idx);
  58. return cur;
  59. }
  60. return -1;
  61. }
  62. EXPORT_SYMBOL_GPL(mt76_wcid_alloc);
  63. MODULE_LICENSE("Dual BSD/GPL");