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-drv.c

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  * AMD 10Gb Ethernet driver
    3  *
    4  * Copyright (c) 2014-2016,2020 Advanced Micro Devices, Inc.
    5  *
    6  * This file is available to you under your choice of the following two
    7  * licenses:
    8  *
    9  * License 1: GPLv2
   10  *
   11  * This file is free software; you may copy, redistribute and/or modify
   12  * it under the terms of the GNU General Public License as published by
   13  * the Free Software Foundation, either version 2 of the License, or (at
   14  * your option) any later version.
   15  *
   16  * This file is distributed in the hope that it will be useful, but
   17  * WITHOUT ANY WARRANTY; without even the implied warranty of
   18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
   19  * General Public License for more details.
   20  *
   21  * You should have received a copy of the GNU General Public License
   22  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
   23  *
   24  * This file incorporates work covered by the following copyright and
   25  * permission notice:
   26  *     The Synopsys DWC ETHER XGMAC Software Driver and documentation
   27  *     (hereinafter "Software") is an unsupported proprietary work of Synopsys,
   28  *     Inc. unless otherwise expressly agreed to in writing between Synopsys
   29  *     and you.
   30  *
   31  *     The Software IS NOT an item of Licensed Software or Licensed Product
   32  *     under any End User Software License Agreement or Agreement for Licensed
   33  *     Product with Synopsys or any supplement thereto.  Permission is hereby
   34  *     granted, free of charge, to any person obtaining a copy of this software
   35  *     annotated with this license and the Software, to deal in the Software
   36  *     without restriction, including without limitation the rights to use,
   37  *     copy, modify, merge, publish, distribute, sublicense, and/or sell copies
   38  *     of the Software, and to permit persons to whom the Software is furnished
   39  *     to do so, subject to the following conditions:
   40  *
   41  *     The above copyright notice and this permission notice shall be included
   42  *     in all copies or substantial portions of the Software.
   43  *
   44  *     THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS"
   45  *     BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   46  *     TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
   47  *     PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS
   48  *     BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   49  *     CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   50  *     SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   51  *     INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   52  *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   53  *     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
   54  *     THE POSSIBILITY OF SUCH DAMAGE.
   55  *
   56  *
   57  * License 2: Modified BSD
   58  *
   59  * Redistribution and use in source and binary forms, with or without
   60  * modification, are permitted provided that the following conditions are met:
   61  *     * Redistributions of source code must retain the above copyright
   62  *       notice, this list of conditions and the following disclaimer.
   63  *     * Redistributions in binary form must reproduce the above copyright
   64  *       notice, this list of conditions and the following disclaimer in the
   65  *       documentation and/or other materials provided with the distribution.
   66  *     * Neither the name of Advanced Micro Devices, Inc. nor the
   67  *       names of its contributors may be used to endorse or promote products
   68  *       derived from this software without specific prior written permission.
   69  *
   70  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
   71  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   72  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   73  * ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
   74  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   75  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   76  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   77  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   78  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   79  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   80  *
   81  * This file incorporates work covered by the following copyright and
   82  * permission notice:
   83  *     The Synopsys DWC ETHER XGMAC Software Driver and documentation
   84  *     (hereinafter "Software") is an unsupported proprietary work of Synopsys,
   85  *     Inc. unless otherwise expressly agreed to in writing between Synopsys
   86  *     and you.
   87  *
   88  *     The Software IS NOT an item of Licensed Software or Licensed Product
   89  *     under any End User Software License Agreement or Agreement for Licensed
   90  *     Product with Synopsys or any supplement thereto.  Permission is hereby
   91  *     granted, free of charge, to any person obtaining a copy of this software
   92  *     annotated with this license and the Software, to deal in the Software
   93  *     without restriction, including without limitation the rights to use,
   94  *     copy, modify, merge, publish, distribute, sublicense, and/or sell copies
   95  *     of the Software, and to permit persons to whom the Software is furnished
   96  *     to do so, subject to the following conditions:
   97  *
   98  *     The above copyright notice and this permission notice shall be included
   99  *     in all copies or substantial portions of the Software.
  100  *
  101  *     THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS"
  102  *     BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
  103  *     TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
  104  *     PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS
  105  *     BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  106  *     CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  107  *     SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  108  *     INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  109  *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  110  *     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
  111  *     THE POSSIBILITY OF SUCH DAMAGE.
  112  */
  113 
  114 #include <sys/cdefs.h>
  115 __FBSDID("$FreeBSD$");
  116 
  117 #include "xgbe.h"
  118 #include "xgbe-common.h"
  119 
  120 int
  121 xgbe_calc_rx_buf_size(if_t netdev, unsigned int mtu)
  122 {
  123         unsigned int rx_buf_size;
  124 
  125         if (mtu > XGMAC_JUMBO_PACKET_MTU)
  126                 return (-EINVAL);
  127 
  128         rx_buf_size = mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN;
  129         rx_buf_size = min(max(rx_buf_size, XGBE_RX_MIN_BUF_SIZE), PAGE_SIZE);
  130         rx_buf_size = (rx_buf_size + XGBE_RX_BUF_ALIGN - 1) & 
  131             ~(XGBE_RX_BUF_ALIGN - 1);
  132 
  133         return (rx_buf_size);
  134 }
  135 
  136 void
  137 xgbe_get_all_hw_features(struct xgbe_prv_data *pdata)
  138 {
  139         unsigned int mac_hfr0, mac_hfr1, mac_hfr2;
  140         struct xgbe_hw_features *hw_feat = &pdata->hw_feat;
  141 
  142         DBGPR("-->xgbe_get_all_hw_features\n");
  143 
  144         mac_hfr0 = XGMAC_IOREAD(pdata, MAC_HWF0R);
  145         mac_hfr1 = XGMAC_IOREAD(pdata, MAC_HWF1R);
  146         mac_hfr2 = XGMAC_IOREAD(pdata, MAC_HWF2R);
  147 
  148         memset(hw_feat, 0, sizeof(*hw_feat));
  149 
  150         hw_feat->version = XGMAC_IOREAD(pdata, MAC_VR);
  151 
  152         /* Hardware feature register 0 */
  153         hw_feat->gmii   = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, GMIISEL);
  154         hw_feat->vlhash = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, VLHASH);
  155         hw_feat->sma    = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, SMASEL);
  156         hw_feat->rwk    = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, RWKSEL);
  157         hw_feat->mgk    = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, MGKSEL);
  158         hw_feat->mmc    = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, MMCSEL);
  159         hw_feat->aoe    = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, ARPOFFSEL);
  160         hw_feat->ts     = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, TSSEL);
  161         hw_feat->eee    = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, EEESEL);
  162         hw_feat->tx_coe = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, TXCOESEL);
  163         hw_feat->rx_coe = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, RXCOESEL);
  164         hw_feat->addn_mac = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R,
  165                                               ADDMACADRSEL);
  166         hw_feat->ts_src = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, TSSTSSEL);
  167         hw_feat->sa_vlan_ins = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, SAVLANINS);
  168         hw_feat->vxn    = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, VXN);
  169 
  170         /* Hardware feature register 1 */
  171         hw_feat->rx_fifo_size   = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R,
  172                                                 RXFIFOSIZE);
  173         hw_feat->tx_fifo_size   = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R,
  174                                                 TXFIFOSIZE);
  175         hw_feat->adv_ts_hi      = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, ADVTHWORD);
  176         hw_feat->dma_width      = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, ADDR64);
  177         hw_feat->dcb            = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, DCBEN);
  178         hw_feat->sph            = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, SPHEN);
  179         hw_feat->tso            = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, TSOEN);
  180         hw_feat->dma_debug      = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, DBGMEMA);
  181         hw_feat->rss            = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, RSSEN);
  182         hw_feat->tc_cnt         = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, NUMTC);
  183         hw_feat->hash_table_size = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R,
  184                                                   HASHTBLSZ);
  185         hw_feat->l3l4_filter_num = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R,
  186                                                   L3L4FNUM);
  187 
  188         /* Hardware feature register 2 */
  189         hw_feat->rx_q_cnt     = XGMAC_GET_BITS(mac_hfr2, MAC_HWF2R, RXQCNT);
  190         hw_feat->tx_q_cnt     = XGMAC_GET_BITS(mac_hfr2, MAC_HWF2R, TXQCNT);
  191         hw_feat->rx_ch_cnt    = XGMAC_GET_BITS(mac_hfr2, MAC_HWF2R, RXCHCNT);
  192         hw_feat->tx_ch_cnt    = XGMAC_GET_BITS(mac_hfr2, MAC_HWF2R, TXCHCNT);
  193         hw_feat->pps_out_num  = XGMAC_GET_BITS(mac_hfr2, MAC_HWF2R, PPSOUTNUM);
  194         hw_feat->aux_snap_num = XGMAC_GET_BITS(mac_hfr2, MAC_HWF2R, AUXSNAPNUM);
  195 
  196         /* Translate the Hash Table size into actual number */
  197         switch (hw_feat->hash_table_size) {
  198         case 0:
  199                 break;
  200         case 1:
  201                 hw_feat->hash_table_size = 64;
  202                 break;
  203         case 2:
  204                 hw_feat->hash_table_size = 128;
  205                 break;
  206         case 3:
  207                 hw_feat->hash_table_size = 256;
  208                 break;
  209         }
  210 
  211         /* Translate the address width setting into actual number */
  212         switch (hw_feat->dma_width) {
  213         case 0:
  214                 hw_feat->dma_width = 32;
  215                 break;
  216         case 1:
  217                 hw_feat->dma_width = 40;
  218                 break;
  219         case 2:
  220                 hw_feat->dma_width = 48;
  221                 break;
  222         default:
  223                 hw_feat->dma_width = 32;
  224         }
  225 
  226         /* The Queue, Channel and TC counts are zero based so increment them
  227          * to get the actual number
  228          */
  229         hw_feat->rx_q_cnt++;
  230         hw_feat->tx_q_cnt++;
  231         hw_feat->rx_ch_cnt++;
  232         hw_feat->tx_ch_cnt++;
  233         hw_feat->tc_cnt++;
  234 
  235         /* Translate the fifo sizes into actual numbers */
  236         hw_feat->rx_fifo_size = 1 << (hw_feat->rx_fifo_size + 7);
  237         hw_feat->tx_fifo_size = 1 << (hw_feat->tx_fifo_size + 7);
  238         DBGPR("%s: Tx fifo 0x%x Rx fifo 0x%x\n", __func__,
  239             hw_feat->tx_fifo_size, hw_feat->rx_fifo_size);
  240 
  241         DBGPR("Hardware features:\n");
  242 
  243         /* Hardware feature register 0 */
  244         DBGPR("  1GbE support              : %s\n",
  245             hw_feat->gmii ? "yes" : "no");
  246         DBGPR("  VLAN hash filter          : %s\n",
  247             hw_feat->vlhash ? "yes" : "no");
  248         DBGPR("  MDIO interface            : %s\n",
  249             hw_feat->sma ? "yes" : "no");
  250         DBGPR("  Wake-up packet support    : %s\n",
  251             hw_feat->rwk ? "yes" : "no");
  252         DBGPR("  Magic packet support      : %s\n",
  253             hw_feat->mgk ? "yes" : "no");
  254         DBGPR("  Management counters       : %s\n",
  255             hw_feat->mmc ? "yes" : "no");
  256         DBGPR("  ARP offload               : %s\n",
  257             hw_feat->aoe ? "yes" : "no");
  258         DBGPR("  IEEE 1588-2008 Timestamp  : %s\n",
  259             hw_feat->ts ? "yes" : "no");
  260         DBGPR("  Energy Efficient Ethernet : %s\n",
  261             hw_feat->eee ? "yes" : "no");
  262         DBGPR("  TX checksum offload       : %s\n",
  263             hw_feat->tx_coe ? "yes" : "no");
  264         DBGPR("  RX checksum offload       : %s\n",
  265             hw_feat->rx_coe ? "yes" : "no");
  266         DBGPR("  Additional MAC addresses  : %u\n",
  267             hw_feat->addn_mac);
  268         DBGPR("  Timestamp source          : %s\n",
  269             (hw_feat->ts_src == 1) ? "internal" :
  270             (hw_feat->ts_src == 2) ? "external" :
  271             (hw_feat->ts_src == 3) ? "internal/external" : "n/a");
  272         DBGPR("  SA/VLAN insertion         : %s\n",
  273             hw_feat->sa_vlan_ins ? "yes" : "no");
  274 
  275         /* Hardware feature register 1 */
  276         DBGPR("  RX fifo size              : %u\n",
  277             hw_feat->rx_fifo_size);
  278         DBGPR("  TX fifo size              : %u\n",
  279             hw_feat->tx_fifo_size);
  280         DBGPR("  IEEE 1588 high word       : %s\n",
  281             hw_feat->adv_ts_hi ? "yes" : "no");
  282         DBGPR("  DMA width                 : %u\n",
  283             hw_feat->dma_width);
  284         DBGPR("  Data Center Bridging      : %s\n",
  285             hw_feat->dcb ? "yes" : "no");
  286         DBGPR("  Split header              : %s\n",
  287             hw_feat->sph ? "yes" : "no");
  288         DBGPR("  TCP Segmentation Offload  : %s\n",
  289             hw_feat->tso ? "yes" : "no");
  290         DBGPR("  Debug memory interface    : %s\n",
  291             hw_feat->dma_debug ? "yes" : "no");
  292         DBGPR("  Receive Side Scaling      : %s\n",
  293             hw_feat->rss ? "yes" : "no");
  294         DBGPR("  Traffic Class count       : %u\n",
  295             hw_feat->tc_cnt);
  296         DBGPR("  Hash table size           : %u\n",
  297             hw_feat->hash_table_size);
  298         DBGPR("  L3/L4 Filters             : %u\n",
  299             hw_feat->l3l4_filter_num);
  300 
  301         /* Hardware feature register 2 */
  302         DBGPR("  RX queue count            : %u\n",
  303             hw_feat->rx_q_cnt);
  304         DBGPR("  TX queue count            : %u\n",
  305             hw_feat->tx_q_cnt);
  306         DBGPR("  RX DMA channel count      : %u\n",
  307             hw_feat->rx_ch_cnt);
  308         DBGPR("  TX DMA channel count      : %u\n",
  309             hw_feat->rx_ch_cnt);
  310         DBGPR("  PPS outputs               : %u\n",
  311             hw_feat->pps_out_num);
  312         DBGPR("  Auxiliary snapshot inputs : %u\n",
  313             hw_feat->aux_snap_num);
  314         
  315         DBGPR("<--xgbe_get_all_hw_features\n");
  316 }
  317 
  318 void
  319 xgbe_init_tx_coalesce(struct xgbe_prv_data *pdata)
  320 {
  321         struct xgbe_hw_if *hw_if = &pdata->hw_if;
  322 
  323         DBGPR("-->xgbe_init_tx_coalesce\n");
  324 
  325         pdata->tx_usecs = XGMAC_INIT_DMA_TX_USECS;
  326         pdata->tx_frames = XGMAC_INIT_DMA_TX_FRAMES;
  327 
  328         hw_if->config_tx_coalesce(pdata);
  329 
  330         DBGPR("<--xgbe_init_tx_coalesce\n");
  331 }
  332 
  333 void
  334 xgbe_init_rx_coalesce(struct xgbe_prv_data *pdata)
  335 {
  336         struct xgbe_hw_if *hw_if = &pdata->hw_if;
  337 
  338         DBGPR("-->xgbe_init_rx_coalesce\n");
  339 
  340         pdata->rx_riwt = hw_if->usec_to_riwt(pdata, XGMAC_INIT_DMA_RX_USECS);
  341         pdata->rx_usecs = XGMAC_INIT_DMA_RX_USECS;
  342         pdata->rx_frames = XGMAC_INIT_DMA_RX_FRAMES;
  343 
  344         hw_if->config_rx_coalesce(pdata);
  345 
  346         DBGPR("<--xgbe_init_rx_coalesce\n");
  347 }

Cache object: 70f1cce2db136c63c45196627439a2f0


[ 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.