The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/axgbe/xgbe_osdep.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
    3  *
    4  * Copyright (c) 2016,2017 SoftIron Inc.
    5  * Copyright (c) 2020 Advanced Micro Devices, Inc.
    6  *
    7  * This software was developed by Andrew Turner under
    8  * the sponsorship of SoftIron Inc.
    9  *
   10  * Redistribution and use in source and binary forms, with or without
   11  * modification, are permitted provided that the following conditions
   12  * are met:
   13  * 1. Redistributions of source code must retain the above copyright
   14  *    notice, this list of conditions and the following disclaimer.
   15  * 2. Redistributions in binary form must reproduce the above copyright
   16  *    notice, this list of conditions and the following disclaimer in the
   17  *    documentation and/or other materials provided with the distribution.
   18  *
   19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   22  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   29  * SUCH DAMAGE.
   30  *
   31  * $FreeBSD$
   32  */
   33 
   34 #ifndef _XGBE_OSDEP_H_
   35 #define _XGBE_OSDEP_H_
   36 
   37 #include <sys/endian.h>
   38 #include <sys/socket.h>
   39 
   40 #include <net/ethernet.h>
   41 #include <net/if.h>
   42 #include <net/if_var.h>
   43 #include <net/iflib.h>
   44 
   45 MALLOC_DECLARE(M_AXGBE);
   46 
   47 typedef uint16_t __le16;
   48 typedef uint16_t __be16;
   49 typedef uint32_t __le32;
   50 
   51 #define BIT(pos)                (1ul << pos)
   52 
   53 #define cpu_to_be16(x)          be16toh(x)
   54 #define be16_to_cpu(x)          htobe16(x)
   55 #define lower_32_bits(x)        ((x) & 0xffffffffu)
   56 #define upper_32_bits(x)        (((x) >> 32) & 0xffffffffu)
   57 #define cpu_to_le32(x)          le32toh(x)
   58 #define le32_to_cpu(x)          htole32(x)
   59 #define cpu_to_le16(x)          htole16(x)
   60 
   61 #define for_each_set_bit(bit, addr, size) \
   62         for ((bit) = find_first_bit((addr), (size));            \
   63              (bit) < (size);                                    \
   64              (bit) = find_next_bit((addr), (size), (bit) + 1))
   65 
   66 typedef struct mtx spinlock_t;
   67 
   68 static inline void
   69 spin_lock_init(spinlock_t *spinlock)
   70 {
   71         mtx_init(spinlock, "axgbe_spin", NULL, MTX_SPIN);
   72 }
   73 
   74 #define spin_lock_irqsave(spinlock, flags)                              \
   75 do {                                                                    \
   76         (flags) = intr_disable();                                       \
   77         mtx_lock_spin(spinlock);                                        \
   78 } while (0)
   79 
   80 #define spin_unlock_irqrestore(spinlock, flags)                         \
   81 do {                                                                    \
   82         mtx_unlock_spin(spinlock);                                      \
   83         intr_restore(flags);                                            \
   84 } while (0)
   85 
   86 #define ADVERTISED_Pause                (1 << 0)
   87 #define ADVERTISED_Asym_Pause           (1 << 1)
   88 #define ADVERTISED_Autoneg              (1 << 2)
   89 #define ADVERTISED_Backplane            (1 << 3)
   90 #define ADVERTISED_10000baseKR_Full     (1 << 4)
   91 #define ADVERTISED_2500baseX_Full       (1 << 5)
   92 #define ADVERTISED_1000baseKX_Full      (1 << 6)
   93 #define ADVERTISED_100baseT_Full        (1 << 7)
   94 #define ADVERTISED_10000baseR_FEC       (1 << 8)
   95 #define ADVERTISED_10000baseT_Full      (1 << 9)
   96 #define ADVERTISED_2500baseT_Full       (1 << 10)
   97 #define ADVERTISED_1000baseT_Full       (1 << 11)
   98 #define ADVERTISED_TP                   (1 << 12)
   99 #define ADVERTISED_FIBRE                (1 << 13)
  100 #define ADVERTISED_1000baseX_Full       (1 << 14)
  101 #define ADVERTISED_10000baseSR_Full     (1 << 15)
  102 #define ADVERTISED_10000baseLR_Full     (1 << 16)
  103 #define ADVERTISED_10000baseLRM_Full    (1 << 17)
  104 #define ADVERTISED_10000baseER_Full     (1 << 18)
  105 #define ADVERTISED_10000baseCR_Full     (1 << 19)
  106 #define ADVERTISED_100baseT_Half        (1 << 20)
  107 #define ADVERTISED_1000baseT_Half       (1 << 21)
  108 
  109 #define SUPPORTED_Pause                 (1 << 0)
  110 #define SUPPORTED_Asym_Pause            (1 << 1)
  111 #define SUPPORTED_Autoneg               (1 << 2)
  112 #define SUPPORTED_Backplane             (1 << 3)
  113 #define SUPPORTED_10000baseKR_Full      (1 << 4)
  114 #define SUPPORTED_2500baseX_Full        (1 << 5)
  115 #define SUPPORTED_1000baseKX_Full       (1 << 6)
  116 #define SUPPORTED_100baseT_Full         (1 << 7)
  117 #define SUPPORTED_10000baseR_FEC        (1 << 8)
  118 #define SUPPORTED_10000baseT_Full       (1 << 9)
  119 #define SUPPORTED_2500baseT_Full        (1 << 10)
  120 #define SUPPORTED_1000baseT_Full        (1 << 11)
  121 #define SUPPORTED_TP                    (1 << 12)
  122 #define SUPPORTED_FIBRE                 (1 << 13)
  123 #define SUPPORTED_1000baseX_Full        (1 << 14)
  124 #define SUPPORTED_10000baseSR_Full      (1 << 15)
  125 #define SUPPORTED_10000baseLR_Full      (1 << 16)
  126 #define SUPPORTED_10000baseLRM_Full     (1 << 17)
  127 #define SUPPORTED_10000baseER_Full      (1 << 18)
  128 #define SUPPORTED_10000baseCR_Full      (1 << 19)
  129 #define SUPPORTED_100baseT_Half         (1 << 20)
  130 #define SUPPORTED_1000baseT_Half        (1 << 21)
  131 
  132 #define LPA_PAUSE_ASYM                  0x0800
  133 
  134 #define AUTONEG_DISABLE                 0
  135 #define AUTONEG_ENABLE                  1
  136 
  137 #define DUPLEX_UNKNOWN                  1
  138 #define DUPLEX_FULL                     2
  139 #define DUPLEX_HALF                     3
  140 
  141 #define SPEED_UNKNOWN                   1
  142 #define SPEED_10000                     2
  143 #define SPEED_2500                      3
  144 #define SPEED_1000                      4
  145 #define SPEED_100                       5
  146 #define SPEED_10                        6
  147 
  148 #define BMCR_SPEED100                   0x2000
  149 
  150 #define MDIO_MMD_PMAPMD                 1
  151 #define MDIO_MMD_PCS                    3
  152 #define MDIO_MMD_AN                     7
  153 #define MDIO_MMD_VEND1                  30      /* Vendor specific 1 */
  154 #define MDIO_MMD_VEND2                  31      /* Vendor specific 2 */
  155 
  156 #define MDIO_PMA_10GBR_FECABLE          170
  157 #define MDIO_PMA_10GBR_FECABLE_ABLE     0x0001
  158 #define MDIO_PMA_10GBR_FECABLE_ERRABLE  0x0002
  159 #define MII_ADDR_C45                    (1<<30)
  160 
  161 #define MDIO_CTRL1                      0x00 /* MII_BMCR */
  162 #define MDIO_CTRL1_RESET                0x8000 /* BMCR_RESET */
  163 #define MDIO_CTRL1_SPEEDSELEXT          0x2040 /* BMCR_SPEED1000|BMCR_SPEED100*/
  164 #define MDIO_CTRL1_SPEEDSEL             (MDIO_CTRL1_SPEEDSELEXT | 0x3c)
  165 #define MDIO_AN_CTRL1_ENABLE            0x1000 /* BMCR_AUTOEN */
  166 #define MDIO_CTRL1_LPOWER               0x0800 /* BMCR_PDOWN */
  167 #define MDIO_AN_CTRL1_RESTART           0x0200 /* BMCR_STARTNEG */
  168 
  169 #define MDIO_CTRL1_SPEED10G             (MDIO_CTRL1_SPEEDSELEXT | 0x00)
  170 
  171 #define MDIO_STAT1                      1 /* MII_BMSR */
  172 #define MDIO_STAT1_LSTATUS              0x0004 /* BMSR_LINK */
  173 
  174 #define MDIO_DEVID1                     2 /* MII_PHYSID1 */
  175 #define MDIO_DEVID2                     3 /* MII_PHYSID2 */
  176 #define MDIO_SPEED                      4
  177 #define MDIO_DEVS1                      5
  178 #define MDIO_DEVS2                      6
  179 #define MDIO_CTRL2                      0x07
  180 #define MDIO_PCS_CTRL2_10GBR            0x0000
  181 #define MDIO_PCS_CTRL2_10GBX            0x0001
  182 #define MDIO_PCS_CTRL2_TYPE             0x0003
  183 
  184 #define MDIO_AN_ADVERTISE               16
  185 
  186 #define MDIO_AN_LPA                     19
  187 
  188 #define ETH_ALEN                        ETHER_ADDR_LEN
  189 #define ETH_HLEN                        ETHER_HDR_LEN
  190 #define ETH_FCS_LEN                     4
  191 #define VLAN_HLEN                       ETHER_VLAN_ENCAP_LEN
  192 #define VLAN_NVID                       4096
  193 #define VLAN_VID_MASK                   0x0FFF
  194 
  195 #define CRC32_POLY_LE                   0xedb88320
  196 
  197 #define ARRAY_SIZE(x)                   nitems(x)
  198 
  199 #define BITS_PER_LONG                   (sizeof(long) * CHAR_BIT)
  200 #define BITS_TO_LONGS(n)                howmany((n), BITS_PER_LONG)
  201 
  202 #define BITMAP_LAST_WORD_MASK(n)        (~0UL >> (BITS_PER_LONG - (n)))
  203 
  204 #define min_t(t, a, b)                  MIN((t)(a), (t)(b))
  205 #define max_t(t, a, b)                  MAX((t)(a), (t)(b))
  206 
  207 static inline void
  208 clear_bit(int pos, unsigned long *p)
  209 {
  210 
  211         atomic_clear_long(p, 1ul << pos);
  212 }
  213 
  214 static inline int
  215 test_bit(int pos, unsigned long *p)
  216 {
  217         unsigned long val;
  218 
  219         val = *p;
  220         return ((val & 1ul << pos) != 0);
  221 }
  222 
  223 static inline void
  224 set_bit(int pos, unsigned long *p)
  225 {
  226 
  227         atomic_set_long(p, 1ul << pos);
  228 }
  229 
  230 static inline int
  231 __ffsl(long mask)
  232 {
  233 
  234         return (ffsl(mask) - 1);
  235 }
  236 
  237 static inline int
  238 fls64(uint64_t mask)
  239 {
  240 
  241         return (flsll(mask));
  242 }
  243 
  244 static inline int
  245 get_bitmask_order(unsigned int count)
  246 {
  247         int order;
  248 
  249         order = fls(count);
  250         return (order); /* We could be slightly more clever with -1 here... */
  251 }
  252 
  253 static inline unsigned long
  254 find_next_bit(const unsigned long *addr, unsigned long size, unsigned long offset)
  255 {
  256         long mask;
  257         int offs;
  258         int bit;
  259         int pos;
  260 
  261         if (offset >= size)
  262                 return (size);
  263         pos = offset / BITS_PER_LONG;
  264         offs = offset % BITS_PER_LONG;
  265         bit = BITS_PER_LONG * pos;
  266         addr += pos;
  267         if (offs) {
  268                 mask = (*addr) & ~BITMAP_LAST_WORD_MASK(offs);
  269                 if (mask)
  270                         return (bit + __ffsl(mask));
  271                 if (size - bit <= BITS_PER_LONG)
  272                         return (size);
  273                 bit += BITS_PER_LONG;
  274                 addr++;
  275         }
  276         for (size -= bit; size >= BITS_PER_LONG;
  277             size -= BITS_PER_LONG, bit += BITS_PER_LONG, addr++) {
  278                 if (*addr == 0)
  279                         continue;
  280                 return (bit + __ffsl(*addr));
  281         }
  282         if (size) {
  283                 mask = (*addr) & BITMAP_LAST_WORD_MASK(size);
  284                 if (mask)
  285                         bit += __ffsl(mask);
  286                 else
  287                         bit += size;
  288         }
  289         return (bit);
  290 }
  291 
  292 static inline unsigned long
  293 find_first_bit(const unsigned long *addr, unsigned long size)
  294 {
  295         long mask;
  296         int bit;
  297 
  298         for (bit = 0; size >= BITS_PER_LONG;
  299             size -= BITS_PER_LONG, bit += BITS_PER_LONG, addr++) {
  300                 if (*addr == 0)
  301                         continue;
  302                 return (bit + __ffsl(*addr));
  303         }
  304         if (size) {
  305                 mask = (*addr) & BITMAP_LAST_WORD_MASK(size);
  306                 if (mask)
  307                         bit += __ffsl(mask);
  308                 else
  309                         bit += size;
  310         }
  311         return (bit);
  312 }
  313 
  314 #endif /* _XGBE_OSDEP_H_ */

Cache object: 57e16b5c4af473b7ad4469f7ed2514a7


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.