usb_os_adapter.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. #include "usb_os_adapter.h"
  2. void *kmem_cache_alloc(struct kmem_cache *obj, int flag)
  3. {
  4. (void)flag;
  5. return pvPortMalloc(obj->sz);
  6. }
  7. void kmem_cache_free(struct kmem_cache *cachep, void *obj)
  8. {
  9. (void)cachep;
  10. vPortFree(obj);
  11. }
  12. void kmem_cache_destroy(struct kmem_cache *cachep)
  13. {
  14. free(cachep);
  15. }
  16. static void *kmalloc_array(size_t n, size_t size, gfp_t flags)
  17. {
  18. void* ptr = NULL;
  19. if (size != 0 && n > SIZE_MAX / size)
  20. return NULL;
  21. ptr = pvPortMalloc(n * size);
  22. if (flags & __GFP_ZERO) {
  23. memset(ptr, 0, n * size);
  24. }
  25. return ptr;
  26. }
  27. void *kcalloc(size_t n, size_t size, gfp_t flags)
  28. {
  29. return kmalloc_array(n, size, flags | __GFP_ZERO);
  30. }
  31. void *kmalloc(size_t size, int flags)
  32. {
  33. void *p;
  34. p = pvPortMalloc(size);
  35. if (flags & __GFP_ZERO)
  36. memset(p, 0, size);
  37. return p;
  38. }
  39. void *kzalloc(size_t size, gfp_t flags)
  40. {
  41. return kmalloc(size, flags | __GFP_ZERO);
  42. }
  43. //struct device;
  44. void *devm_kzalloc(struct device *dev, size_t size, gfp_t flags)
  45. {
  46. return kmalloc(size, flags | __GFP_ZERO);
  47. }
  48. void kfree(void* addr)
  49. {
  50. vPortFree(addr);
  51. }
  52. struct kmem_cache *get_mem(int element_sz)
  53. {
  54. struct kmem_cache *ret;
  55. ret = pvPortMalloc(sizeof(struct kmem_cache));
  56. ret->sz = element_sz;
  57. return ret;
  58. }
  59. static unsigned long _find_next_bit(const unsigned long *addr1,
  60. const unsigned long *addr2, unsigned long nbits,
  61. unsigned long start, unsigned long invert)
  62. {
  63. unsigned long tmp;
  64. if (unlikely(start >= nbits))
  65. return nbits;
  66. tmp = addr1[start / BITS_PER_LONG];
  67. if (addr2)
  68. tmp &= addr2[start / BITS_PER_LONG];
  69. tmp ^= invert;
  70. /* Handle 1st word. */
  71. tmp &= BITMAP_FIRST_WORD_MASK(start);
  72. start = round_down(start, BITS_PER_LONG);
  73. while (!tmp) {
  74. start += BITS_PER_LONG;
  75. if (start >= nbits)
  76. return nbits;
  77. tmp = addr1[start / BITS_PER_LONG];
  78. if (addr2)
  79. tmp &= addr2[start / BITS_PER_LONG];
  80. tmp ^= invert;
  81. }
  82. return min(start + __ffs(tmp), nbits);
  83. }
  84. unsigned long find_next_bit(const unsigned long *addr, unsigned long size,
  85. unsigned long offset)
  86. {
  87. return _find_next_bit(addr, NULL, size, offset, 0UL);
  88. }
  89. unsigned long find_next_zero_bit(const unsigned long *addr, unsigned long size,
  90. unsigned long offset)
  91. {
  92. return _find_next_bit(addr, NULL, size, offset, ~0UL);
  93. }
  94. unsigned long bitmap_find_next_zero_area_off(unsigned long *map,
  95. unsigned long size,
  96. unsigned long start,
  97. unsigned int nr,
  98. unsigned long align_mask,
  99. unsigned long align_offset)
  100. {
  101. unsigned long index, end, i;
  102. again:
  103. index = find_next_zero_bit(map, size, start);
  104. /* Align allocation */
  105. index = __ALIGN_MASK(index + align_offset, align_mask) - align_offset;
  106. end = index + nr;
  107. if (end > size)
  108. return end;
  109. i = find_next_bit(map, end, index);
  110. if (i < end) {
  111. start = i + 1;
  112. goto again;
  113. }
  114. return index;
  115. }
  116. unsigned long
  117. bitmap_find_next_zero_area(unsigned long *map,
  118. unsigned long size,
  119. unsigned long start,
  120. unsigned int nr,
  121. unsigned long align_mask)
  122. {
  123. return bitmap_find_next_zero_area_off(map, size, start, nr, align_mask, 0);
  124. }
  125. void bitmap_set(unsigned long *map, unsigned int start, int len)
  126. {
  127. unsigned long *p = map + BIT_WORD(start);
  128. const unsigned int size = start + len;
  129. int bits_to_set = BITS_PER_LONG - (start % BITS_PER_LONG);
  130. unsigned long mask_to_set = BITMAP_FIRST_WORD_MASK(start);
  131. while (len - bits_to_set >= 0) {
  132. *p |= mask_to_set;
  133. len -= bits_to_set;
  134. bits_to_set = BITS_PER_LONG;
  135. mask_to_set = ~0UL;
  136. p++;
  137. }
  138. if (len) {
  139. mask_to_set &= BITMAP_LAST_WORD_MASK(size);
  140. *p |= mask_to_set;
  141. }
  142. }
  143. void bitmap_clear(unsigned long *map, unsigned int start, int len)
  144. {
  145. unsigned long *p = map + BIT_WORD(start);
  146. const unsigned int size = start + len;
  147. int bits_to_clear = BITS_PER_LONG - (start % BITS_PER_LONG);
  148. unsigned long mask_to_clear = BITMAP_FIRST_WORD_MASK(start);
  149. while (len - bits_to_clear >= 0) {
  150. *p &= ~mask_to_clear;
  151. len -= bits_to_clear;
  152. bits_to_clear = BITS_PER_LONG;
  153. mask_to_clear = ~0UL;
  154. p++;
  155. }
  156. if (len) {
  157. mask_to_clear &= BITMAP_LAST_WORD_MASK(size);
  158. *p &= ~mask_to_clear;
  159. }
  160. }
  161. void writesl(u32 addr, const void *buffer, unsigned int count)
  162. {
  163. if (count) {
  164. const u32 *buf = (u32 *)buffer;
  165. do {
  166. writel(*buf++, addr);
  167. } while (--count);
  168. }
  169. }
  170. void readsl(u32 addr, void *buffer, unsigned int count)
  171. {
  172. if (count) {
  173. u32 *buf = (u32 *)buffer;
  174. do {
  175. u32 x = readl(addr);
  176. *buf++ = x;
  177. } while (--count);
  178. }
  179. }
  180. void iowrite32_rep(u32 addr, const void *buffer, unsigned int count)
  181. {
  182. writesl(addr, buffer, count);
  183. }
  184. void ioread32_rep(u32 addr, void *buffer, unsigned int count)
  185. {
  186. readsl(addr, buffer, count);
  187. }
  188. void put_unaligned_le16(u16 val, void *p)
  189. {
  190. // *((__le16 *)p) = cpu_to_le16(val);
  191. u8 *tmp = (u8*)p;
  192. tmp[0] = (val & 0xff);
  193. tmp[1] = ((val >> 8) & 0xff);
  194. }
  195. void put_unaligned_le32(u32 val, void *p)
  196. {
  197. // *((__le32 *)p) = cpu_to_le32(val);
  198. u8 *tmp = (u8*)p;
  199. tmp[0] = (val & 0xff);
  200. tmp[1] = ((val >> 8) & 0xff);
  201. tmp[2] = ((val >> 16) & 0xff);
  202. tmp[3] = ((val >> 24) & 0xff);
  203. }
  204. int get_unaligned_le16(void *p)
  205. {
  206. u8 *tmp = (u8*)p;
  207. return (tmp[1] << 8) | tmp[0];
  208. }
  209. int get_unaligned_le32(void *p)
  210. {
  211. u8 *tmp = (u8*)p;
  212. return (tmp[3] << 24) | (tmp[2] << 16) | (tmp[1] << 8) | tmp[0];
  213. }
  214. void generic_set_bit(int nr, volatile unsigned long *addr)
  215. {
  216. unsigned long mask = BIT_MASK(nr);
  217. unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
  218. *p |= mask;
  219. }
  220. int is_zero_ether_addr(const u8 *addr)
  221. {
  222. return !(addr[0] | addr[1] | addr[2] | addr[3] | addr[4] | addr[5]);
  223. }
  224. int is_multicast_ether_addr(const u8 *addr)
  225. {
  226. return 0x01 & addr[0];
  227. }
  228. int is_local_ether_addr(const u8 *addr)
  229. {
  230. return 0x02 & addr[0];
  231. }
  232. #if 0
  233. int is_broadcast_ether_addr(const u8 *addr)
  234. {
  235. return (addr[0] & addr[1] & addr[2] & addr[3] & addr[4] & addr[5]) == 0xff;
  236. }
  237. #endif
  238. int is_unicast_ether_addr(const u8 *addr)
  239. {
  240. return !is_multicast_ether_addr(addr);
  241. }
  242. int is_valid_ether_addr(const u8 *addr)
  243. {
  244. return !is_multicast_ether_addr(addr) && !is_zero_ether_addr(addr);
  245. }
  246. #if 0
  247. static inline void random_ether_addr(u8 *addr)
  248. {
  249. get_random_bytes (addr, ETH_ALEN);
  250. addr [0] &= 0xfe; /* clear multicast bit */
  251. addr [0] |= 0x02; /* set local assignment bit (IEEE802) */
  252. }
  253. #endif