17780dd71SAdrian Chadd /*-
27780dd71SAdrian Chadd * Copyright (c) 2016 Adrian Chadd <adrian@FreeBSD.org>.
37780dd71SAdrian Chadd * All rights reserved.
47780dd71SAdrian Chadd *
57780dd71SAdrian Chadd * Redistribution and use in source and binary forms, with or without
67780dd71SAdrian Chadd * modification, are permitted provided that the following conditions
77780dd71SAdrian Chadd * are met:
87780dd71SAdrian Chadd * 1. Redistributions of source code must retain the above copyright
97780dd71SAdrian Chadd * notice, this list of conditions and the following disclaimer,
107780dd71SAdrian Chadd * without modification.
117780dd71SAdrian Chadd * 2. Redistributions in binary form must reproduce at minimum a disclaimer
127780dd71SAdrian Chadd * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
137780dd71SAdrian Chadd * redistribution must be conditioned upon including a substantially
147780dd71SAdrian Chadd * similar Disclaimer requirement for further binary redistribution.
157780dd71SAdrian Chadd *
167780dd71SAdrian Chadd * NO WARRANTY
177780dd71SAdrian Chadd * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
187780dd71SAdrian Chadd * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
197780dd71SAdrian Chadd * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
207780dd71SAdrian Chadd * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
217780dd71SAdrian Chadd * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
227780dd71SAdrian Chadd * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
237780dd71SAdrian Chadd * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
247780dd71SAdrian Chadd * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
257780dd71SAdrian Chadd * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
267780dd71SAdrian Chadd * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
277780dd71SAdrian Chadd * THE POSSIBILITY OF SUCH DAMAGES.
287780dd71SAdrian Chadd */
297780dd71SAdrian Chadd #ifndef __IF_BWN_UTIL_H__
307780dd71SAdrian Chadd #define __IF_BWN_UTIL_H__
317780dd71SAdrian Chadd
327780dd71SAdrian Chadd /* Hamming weight; used in the PHY routines */
337780dd71SAdrian Chadd static inline int
bwn_hweight32(uint32_t val)347780dd71SAdrian Chadd bwn_hweight32(uint32_t val)
357780dd71SAdrian Chadd {
367780dd71SAdrian Chadd int i, r = 0;
377780dd71SAdrian Chadd /* yes, could do it without a loop.. */
387780dd71SAdrian Chadd for (i = 0; i < 32; i++) {
397780dd71SAdrian Chadd r = r + (val & 1);
407780dd71SAdrian Chadd val = val >> 1;
417780dd71SAdrian Chadd }
427780dd71SAdrian Chadd return r;
437780dd71SAdrian Chadd }
447780dd71SAdrian Chadd
457780dd71SAdrian Chadd /* Clamp value; PHY code */
467780dd71SAdrian Chadd static inline int
bwn_clamp_val(int val,int lo,int hi)477780dd71SAdrian Chadd bwn_clamp_val(int val, int lo, int hi)
487780dd71SAdrian Chadd {
497780dd71SAdrian Chadd if (val < lo)
507780dd71SAdrian Chadd return lo;
517780dd71SAdrian Chadd if (val > hi)
527780dd71SAdrian Chadd return hi;
537780dd71SAdrian Chadd return val;
547780dd71SAdrian Chadd }
557780dd71SAdrian Chadd
56*020cb220SAdrian Chadd /* Q52 format - used in PHY routines */
57*020cb220SAdrian Chadd #define INT_TO_Q52(i) ((i) << 2)
58*020cb220SAdrian Chadd #define Q52_TO_INT(q52) ((q52) >> 2)
59*020cb220SAdrian Chadd #define Q52_FMT "%u.%u"
60*020cb220SAdrian Chadd #define Q52_ARG(q52) Q52_TO_INT(q52), ((((q52) & 0x3) * 100) / 4)
61*020cb220SAdrian Chadd
627780dd71SAdrian Chadd extern unsigned int bwn_sqrt(struct bwn_mac *mac, unsigned int x);
637780dd71SAdrian Chadd
647780dd71SAdrian Chadd #endif /* __IF_BWN_UTIL_H__ */
65