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/liquidio/lio_main.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  *   BSD LICENSE
    3  *
    4  *   Copyright(c) 2017 Cavium, Inc.. All rights reserved.
    5  *   All rights reserved.
    6  *
    7  *   Redistribution and use in source and binary forms, with or without
    8  *   modification, are permitted provided that the following conditions
    9  *   are met:
   10  *
   11  *     * Redistributions of source code must retain the above copyright
   12  *       notice, this list of conditions and the following disclaimer.
   13  *     * Redistributions in binary form must reproduce the above copyright
   14  *       notice, this list of conditions and the following disclaimer in
   15  *       the documentation and/or other materials provided with the
   16  *       distribution.
   17  *     * Neither the name of Cavium, Inc. nor the names of its
   18  *       contributors may be used to endorse or promote products derived
   19  *       from this software without specific prior written permission.
   20  *
   21  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
   22  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
   23  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
   24  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
   25  *   OWNER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   26  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   27  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   28  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   29  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   30  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
   31  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   32  */
   33 /*$FreeBSD$*/
   34 
   35 #include "lio_bsd.h"
   36 #include "lio_common.h"
   37 
   38 #include "lio_droq.h"
   39 #include "lio_iq.h"
   40 #include "lio_response_manager.h"
   41 #include "lio_device.h"
   42 #include "lio_ctrl.h"
   43 #include "lio_main.h"
   44 #include "lio_network.h"
   45 #include "cn23xx_pf_device.h"
   46 #include "lio_image.h"
   47 #include "lio_ioctl.h"
   48 #include "lio_rxtx.h"
   49 #include "lio_rss.h"
   50 
   51 /* Number of milliseconds to wait for DDR initialization */
   52 #define LIO_DDR_TIMEOUT 10000
   53 #define LIO_MAX_FW_TYPE_LEN     8
   54 
   55 static char fw_type[LIO_MAX_FW_TYPE_LEN];
   56 TUNABLE_STR("hw.lio.fw_type", fw_type, sizeof(fw_type));
   57 
   58 /*
   59  * Integers that specify number of queues per PF.
   60  * Valid range is 0 to 64.
   61  * Use 0 to derive from CPU count.
   62  */
   63 static int      num_queues_per_pf0;
   64 static int      num_queues_per_pf1;
   65 TUNABLE_INT("hw.lio.num_queues_per_pf0", &num_queues_per_pf0);
   66 TUNABLE_INT("hw.lio.num_queues_per_pf1", &num_queues_per_pf1);
   67 
   68 #ifdef RSS
   69 static int      lio_rss = 1;
   70 TUNABLE_INT("hw.lio.rss", &lio_rss);
   71 #endif  /* RSS */
   72 
   73 /* Hardware LRO */
   74 unsigned int    lio_hwlro = 0;
   75 TUNABLE_INT("hw.lio.hwlro", &lio_hwlro);
   76 
   77 /*
   78  * Bitmask indicating which consoles have debug
   79  * output redirected to syslog.
   80  */
   81 static unsigned long    console_bitmask;
   82 TUNABLE_ULONG("hw.lio.console_bitmask", &console_bitmask);
   83 
   84 /*
   85  * \brief determines if a given console has debug enabled.
   86  * @param console console to check
   87  * @returns  1 = enabled. 0 otherwise
   88  */
   89 int
   90 lio_console_debug_enabled(uint32_t console)
   91 {
   92 
   93         return (console_bitmask >> (console)) & 0x1;
   94 }
   95 
   96 static int      lio_detach(device_t dev);
   97 
   98 static int      lio_device_init(struct octeon_device *octeon_dev);
   99 static int      lio_chip_specific_setup(struct octeon_device *oct);
  100 static void     lio_watchdog(void *param);
  101 static int      lio_load_firmware(struct octeon_device *oct);
  102 static int      lio_nic_starter(struct octeon_device *oct);
  103 static int      lio_init_nic_module(struct octeon_device *oct);
  104 static int      lio_setup_nic_devices(struct octeon_device *octeon_dev);
  105 static int      lio_link_info(struct lio_recv_info *recv_info, void *ptr);
  106 static void     lio_if_cfg_callback(struct octeon_device *oct, uint32_t status,
  107                                     void *buf);
  108 static int      lio_set_rxcsum_command(struct ifnet *ifp, int command,
  109                                        uint8_t rx_cmd);
  110 static int      lio_setup_glists(struct octeon_device *oct, struct lio *lio,
  111                                  int num_iqs);
  112 static void     lio_destroy_nic_device(struct octeon_device *oct, int ifidx);
  113 static inline void      lio_update_link_status(struct ifnet *ifp,
  114                                                union octeon_link_status *ls);
  115 static void     lio_send_rx_ctrl_cmd(struct lio *lio, int start_stop);
  116 static int      lio_stop_nic_module(struct octeon_device *oct);
  117 static void     lio_destroy_resources(struct octeon_device *oct);
  118 static int      lio_setup_rx_oom_poll_fn(struct ifnet *ifp);
  119 
  120 static void     lio_vlan_rx_add_vid(void *arg, struct ifnet *ifp, uint16_t vid);
  121 static void     lio_vlan_rx_kill_vid(void *arg, struct ifnet *ifp,
  122                                      uint16_t vid);
  123 static struct octeon_device *
  124         lio_get_other_octeon_device(struct octeon_device *oct);
  125 
  126 static int      lio_wait_for_oq_pkts(struct octeon_device *oct);
  127 
  128 int     lio_send_rss_param(struct lio *lio);
  129 static int      lio_dbg_console_print(struct octeon_device *oct,
  130                                       uint32_t console_num, char *prefix,
  131                                       char *suffix);
  132 
  133 /* Polling interval for determining when NIC application is alive */
  134 #define LIO_STARTER_POLL_INTERVAL_MS    100
  135 
  136 /*
  137  * vendor_info_array.
  138  * This array contains the list of IDs on which the driver should load.
  139  */
  140 struct lio_vendor_info {
  141         uint16_t        vendor_id;
  142         uint16_t        device_id;
  143         uint16_t        subdevice_id;
  144         uint8_t         revision_id;
  145         uint8_t         index;
  146 };
  147 
  148 static struct lio_vendor_info lio_pci_tbl[] = {
  149         /* CN2350 10G */
  150         {PCI_VENDOR_ID_CAVIUM, LIO_CN23XX_PF_VID, LIO_CN2350_10G_SUBDEVICE,
  151                 0x02, 0},
  152 
  153         /* CN2350 10G */
  154         {PCI_VENDOR_ID_CAVIUM, LIO_CN23XX_PF_VID, LIO_CN2350_10G_SUBDEVICE1,
  155                 0x02, 0},
  156 
  157         /* CN2360 10G */
  158         {PCI_VENDOR_ID_CAVIUM, LIO_CN23XX_PF_VID, LIO_CN2360_10G_SUBDEVICE,
  159                 0x02, 1},
  160 
  161         /* CN2350 25G */
  162         {PCI_VENDOR_ID_CAVIUM, LIO_CN23XX_PF_VID, LIO_CN2350_25G_SUBDEVICE,
  163                 0x02, 2},
  164 
  165         /* CN2360 25G */
  166         {PCI_VENDOR_ID_CAVIUM, LIO_CN23XX_PF_VID, LIO_CN2360_25G_SUBDEVICE,
  167                 0x02, 3},
  168 
  169         {0, 0, 0, 0, 0}
  170 };
  171 
  172 static char *lio_strings[] = {
  173         "LiquidIO 2350 10GbE Server Adapter",
  174         "LiquidIO 2360 10GbE Server Adapter",
  175         "LiquidIO 2350 25GbE Server Adapter",
  176         "LiquidIO 2360 25GbE Server Adapter",
  177 };
  178 
  179 struct lio_if_cfg_resp {
  180         uint64_t        rh;
  181         struct octeon_if_cfg_info cfg_info;
  182         uint64_t        status;
  183 };
  184 
  185 struct lio_if_cfg_context {
  186         int             octeon_id;
  187         volatile int    cond;
  188 };
  189 
  190 struct lio_rx_ctl_context {
  191         int             octeon_id;
  192         volatile int    cond;
  193 };
  194 
  195 static int
  196 lio_probe(device_t dev)
  197 {
  198         struct lio_vendor_info  *tbl;
  199 
  200         uint16_t        vendor_id;
  201         uint16_t        device_id;
  202         uint16_t        subdevice_id;
  203         uint8_t         revision_id;
  204         char            device_ver[256];
  205 
  206         vendor_id = pci_get_vendor(dev);
  207         if (vendor_id != PCI_VENDOR_ID_CAVIUM)
  208                 return (ENXIO);
  209 
  210         device_id = pci_get_device(dev);
  211         subdevice_id = pci_get_subdevice(dev);
  212         revision_id = pci_get_revid(dev);
  213 
  214         tbl = lio_pci_tbl;
  215         while (tbl->vendor_id) {
  216                 if ((vendor_id == tbl->vendor_id) &&
  217                     (device_id == tbl->device_id) &&
  218                     (subdevice_id == tbl->subdevice_id) &&
  219                     (revision_id == tbl->revision_id)) {
  220                         sprintf(device_ver, "%s, Version - %s",
  221                                 lio_strings[tbl->index], LIO_VERSION);
  222                         device_set_desc_copy(dev, device_ver);
  223                         return (BUS_PROBE_DEFAULT);
  224                 }
  225 
  226                 tbl++;
  227         }
  228 
  229         return (ENXIO);
  230 }
  231 
  232 static int
  233 lio_attach(device_t device)
  234 {
  235         struct octeon_device    *oct_dev = NULL;
  236         uint64_t        scratch1;
  237         uint32_t        error;
  238         int             timeout, ret = 1;
  239         uint8_t         bus, dev, function;
  240 
  241         oct_dev = lio_allocate_device(device);
  242         if (oct_dev == NULL) {
  243                 device_printf(device, "Error: Unable to allocate device\n");
  244                 return (-ENOMEM);
  245         }
  246 
  247         oct_dev->tx_budget = LIO_DEFAULT_TX_PKTS_PROCESS_BUDGET;
  248         oct_dev->rx_budget = LIO_DEFAULT_RX_PKTS_PROCESS_BUDGET;
  249         oct_dev->msix_on = LIO_FLAG_MSIX_ENABLED;
  250 
  251         oct_dev->device = device;
  252         bus = pci_get_bus(device);
  253         dev = pci_get_slot(device);
  254         function = pci_get_function(device);
  255 
  256         lio_dev_info(oct_dev, "Initializing device %x:%x %02x:%02x.%01x\n",
  257                      pci_get_vendor(device), pci_get_device(device), bus, dev,
  258                      function);
  259 
  260         if (lio_device_init(oct_dev)) {
  261                 lio_dev_err(oct_dev, "Failed to init device\n");
  262                 lio_detach(device);
  263                 return (-ENOMEM);
  264         }
  265 
  266         scratch1 = lio_read_csr64(oct_dev, LIO_CN23XX_SLI_SCRATCH1);
  267         if (!(scratch1 & 4ULL)) {
  268                 /*
  269                  * Bit 2 of SLI_SCRATCH_1 is a flag that indicates that
  270                  * the lio watchdog kernel thread is running for this
  271                  * NIC.  Each NIC gets one watchdog kernel thread.
  272                  */
  273                 scratch1 |= 4ULL;
  274                 lio_write_csr64(oct_dev, LIO_CN23XX_SLI_SCRATCH1, scratch1);
  275 
  276                 error = kproc_create(lio_watchdog, oct_dev,
  277                                      &oct_dev->watchdog_task, 0, 0,
  278                                      "liowd/%02hhx:%02hhx.%hhx", bus,
  279                                      dev, function);
  280                 if (!error) {
  281                         kproc_resume(oct_dev->watchdog_task);
  282                 } else {
  283                         oct_dev->watchdog_task = NULL;
  284                         lio_dev_err(oct_dev,
  285                                     "failed to create kernel_thread\n");
  286                         lio_detach(device);
  287                         return (-1);
  288                 }
  289         }
  290         oct_dev->rx_pause = 1;
  291         oct_dev->tx_pause = 1;
  292 
  293         timeout = 0;
  294         while (timeout < LIO_NIC_STARTER_TIMEOUT) {
  295                 lio_mdelay(LIO_STARTER_POLL_INTERVAL_MS);
  296                 timeout += LIO_STARTER_POLL_INTERVAL_MS;
  297 
  298                 /*
  299                  * During the boot process interrupts are not available.
  300                  * So polling for first control message from FW.
  301                  */
  302                 if (cold)
  303                         lio_droq_bh(oct_dev->droq[0], 0);
  304 
  305                 if (atomic_load_acq_int(&oct_dev->status) == LIO_DEV_CORE_OK) {
  306                         ret = lio_nic_starter(oct_dev);
  307                         break;
  308                 }
  309         }
  310 
  311         if (ret) {
  312                 lio_dev_err(oct_dev, "Firmware failed to start\n");
  313                 lio_detach(device);
  314                 return (-EIO);
  315         }
  316 
  317         lio_dev_dbg(oct_dev, "Device is ready\n");
  318 
  319         return (0);
  320 }
  321 
  322 static int
  323 lio_detach(device_t dev)
  324 {
  325         struct octeon_device    *oct_dev = device_get_softc(dev);
  326 
  327         lio_dev_dbg(oct_dev, "Stopping device\n");
  328         if (oct_dev->watchdog_task) {
  329                 uint64_t        scratch1;
  330 
  331                 kproc_suspend(oct_dev->watchdog_task, 0);
  332 
  333                 scratch1 = lio_read_csr64(oct_dev, LIO_CN23XX_SLI_SCRATCH1);
  334                 scratch1 &= ~4ULL;
  335                 lio_write_csr64(oct_dev, LIO_CN23XX_SLI_SCRATCH1, scratch1);
  336         }
  337 
  338         if (oct_dev->app_mode && (oct_dev->app_mode == LIO_DRV_NIC_APP))
  339                 lio_stop_nic_module(oct_dev);
  340 
  341         /*
  342          * Reset the octeon device and cleanup all memory allocated for
  343          * the octeon device by  driver.
  344          */
  345         lio_destroy_resources(oct_dev);
  346 
  347         lio_dev_info(oct_dev, "Device removed\n");
  348 
  349         /*
  350          * This octeon device has been removed. Update the global
  351          * data structure to reflect this. Free the device structure.
  352          */
  353         lio_free_device_mem(oct_dev);
  354         return (0);
  355 }
  356 
  357 static int
  358 lio_shutdown(device_t dev)
  359 {
  360         struct octeon_device    *oct_dev = device_get_softc(dev);
  361         struct lio      *lio = if_getsoftc(oct_dev->props.ifp);
  362 
  363         lio_send_rx_ctrl_cmd(lio, 0);
  364 
  365         return (0);
  366 }
  367 
  368 static int
  369 lio_suspend(device_t dev)
  370 {
  371 
  372         return (ENXIO);
  373 }
  374 
  375 static int
  376 lio_resume(device_t dev)
  377 {
  378 
  379         return (ENXIO);
  380 }
  381 
  382 static int
  383 lio_event(struct module *mod, int event, void *junk)
  384 {
  385 
  386         switch (event) {
  387         case MOD_LOAD:
  388                 lio_init_device_list(LIO_CFG_TYPE_DEFAULT);
  389                 break;
  390         default:
  391                 break;
  392         }
  393 
  394         return (0);
  395 }
  396 
  397 /*********************************************************************
  398  *  FreeBSD Device Interface Entry Points
  399  * *******************************************************************/
  400 static device_method_t lio_methods[] = {
  401         /* Device interface */
  402         DEVMETHOD(device_probe, lio_probe),
  403         DEVMETHOD(device_attach, lio_attach),
  404         DEVMETHOD(device_detach, lio_detach),
  405         DEVMETHOD(device_shutdown, lio_shutdown),
  406         DEVMETHOD(device_suspend, lio_suspend),
  407         DEVMETHOD(device_resume, lio_resume),
  408         DEVMETHOD_END
  409 };
  410 
  411 static driver_t lio_driver = {
  412         LIO_DRV_NAME, lio_methods, sizeof(struct octeon_device),
  413 };
  414 
  415 DRIVER_MODULE(lio, pci, lio_driver, lio_event, NULL);
  416 
  417 MODULE_DEPEND(lio, pci, 1, 1, 1);
  418 MODULE_DEPEND(lio, ether, 1, 1, 1);
  419 MODULE_DEPEND(lio, firmware, 1, 1, 1);
  420 
  421 static bool
  422 fw_type_is_none(void)
  423 {
  424         return strncmp(fw_type, LIO_FW_NAME_TYPE_NONE,
  425                        sizeof(LIO_FW_NAME_TYPE_NONE)) == 0;
  426 }
  427 
  428 /*
  429  * \brief Device initialization for each Octeon device that is probed
  430  * @param octeon_dev  octeon device
  431  */
  432 static int
  433 lio_device_init(struct octeon_device *octeon_dev)
  434 {
  435         unsigned long   ddr_timeout = LIO_DDR_TIMEOUT;
  436         char    *dbg_enb = NULL;
  437         int     fw_loaded = 0;
  438         int     i, j, ret;
  439         uint8_t bus, dev, function;
  440         char    bootcmd[] = "\n";
  441 
  442         bus = pci_get_bus(octeon_dev->device);
  443         dev = pci_get_slot(octeon_dev->device);
  444         function = pci_get_function(octeon_dev->device);
  445 
  446         atomic_store_rel_int(&octeon_dev->status, LIO_DEV_BEGIN_STATE);
  447 
  448         /* Enable access to the octeon device */
  449         if (pci_enable_busmaster(octeon_dev->device)) {
  450                 lio_dev_err(octeon_dev, "pci_enable_device failed\n");
  451                 return (1);
  452         }
  453 
  454         atomic_store_rel_int(&octeon_dev->status, LIO_DEV_PCI_ENABLE_DONE);
  455 
  456         /* Identify the Octeon type and map the BAR address space. */
  457         if (lio_chip_specific_setup(octeon_dev)) {
  458                 lio_dev_err(octeon_dev, "Chip specific setup failed\n");
  459                 return (1);
  460         }
  461 
  462         atomic_store_rel_int(&octeon_dev->status, LIO_DEV_PCI_MAP_DONE);
  463 
  464         /*
  465          * Only add a reference after setting status 'OCT_DEV_PCI_MAP_DONE',
  466          * since that is what is required for the reference to be removed
  467          * during de-initialization (see 'octeon_destroy_resources').
  468          */
  469         lio_register_device(octeon_dev, bus, dev, function, true);
  470 
  471 
  472         octeon_dev->app_mode = LIO_DRV_INVALID_APP;
  473 
  474         if (!lio_cn23xx_pf_fw_loaded(octeon_dev) && !fw_type_is_none()) {
  475                 fw_loaded = 0;
  476                 /* Do a soft reset of the Octeon device. */
  477                 if (octeon_dev->fn_list.soft_reset(octeon_dev))
  478                         return (1);
  479 
  480                 /* things might have changed */
  481                 if (!lio_cn23xx_pf_fw_loaded(octeon_dev))
  482                         fw_loaded = 0;
  483                 else
  484                         fw_loaded = 1;
  485         } else {
  486                 fw_loaded = 1;
  487         }
  488 
  489         /*
  490          * Initialize the dispatch mechanism used to push packets arriving on
  491          * Octeon Output queues.
  492          */
  493         if (lio_init_dispatch_list(octeon_dev))
  494                 return (1);
  495 
  496         lio_register_dispatch_fn(octeon_dev, LIO_OPCODE_NIC,
  497                                  LIO_OPCODE_NIC_CORE_DRV_ACTIVE,
  498                                  lio_core_drv_init, octeon_dev);
  499         atomic_store_rel_int(&octeon_dev->status, LIO_DEV_DISPATCH_INIT_DONE);
  500 
  501         ret = octeon_dev->fn_list.setup_device_regs(octeon_dev);
  502         if (ret) {
  503                 lio_dev_err(octeon_dev,
  504                             "Failed to configure device registers\n");
  505                 return (ret);
  506         }
  507 
  508         /* Initialize soft command buffer pool */
  509         if (lio_setup_sc_buffer_pool(octeon_dev)) {
  510                 lio_dev_err(octeon_dev, "sc buffer pool allocation failed\n");
  511                 return (1);
  512         }
  513 
  514         atomic_store_rel_int(&octeon_dev->status,
  515                              LIO_DEV_SC_BUFF_POOL_INIT_DONE);
  516 
  517         if (lio_allocate_ioq_vector(octeon_dev)) {
  518                 lio_dev_err(octeon_dev,
  519                             "IOQ vector allocation failed\n");
  520                 return (1);
  521         }
  522 
  523         atomic_store_rel_int(&octeon_dev->status,
  524                              LIO_DEV_MSIX_ALLOC_VECTOR_DONE);
  525 
  526         for (i = 0; i < LIO_MAX_POSSIBLE_INSTR_QUEUES; i++) {
  527                 octeon_dev->instr_queue[i] =
  528                         malloc(sizeof(struct lio_instr_queue),
  529                                M_DEVBUF, M_NOWAIT | M_ZERO);
  530                 if (octeon_dev->instr_queue[i] == NULL)
  531                         return (1);
  532         }
  533 
  534         /* Setup the data structures that manage this Octeon's Input queues. */
  535         if (lio_setup_instr_queue0(octeon_dev)) {
  536                 lio_dev_err(octeon_dev,
  537                             "Instruction queue initialization failed\n");
  538                 return (1);
  539         }
  540 
  541         atomic_store_rel_int(&octeon_dev->status,
  542                              LIO_DEV_INSTR_QUEUE_INIT_DONE);
  543 
  544         /*
  545          * Initialize lists to manage the requests of different types that
  546          * arrive from user & kernel applications for this octeon device.
  547          */
  548 
  549         if (lio_setup_response_list(octeon_dev)) {
  550                 lio_dev_err(octeon_dev, "Response list allocation failed\n");
  551                 return (1);
  552         }
  553 
  554         atomic_store_rel_int(&octeon_dev->status, LIO_DEV_RESP_LIST_INIT_DONE);
  555 
  556         for (i = 0; i < LIO_MAX_POSSIBLE_OUTPUT_QUEUES; i++) {
  557                 octeon_dev->droq[i] = malloc(sizeof(*octeon_dev->droq[i]),
  558                                              M_DEVBUF, M_NOWAIT | M_ZERO);
  559                 if (octeon_dev->droq[i] == NULL)
  560                         return (1);
  561         }
  562 
  563         if (lio_setup_output_queue0(octeon_dev)) {
  564                 lio_dev_err(octeon_dev, "Output queue initialization failed\n");
  565                 return (1);
  566         }
  567 
  568         atomic_store_rel_int(&octeon_dev->status, LIO_DEV_DROQ_INIT_DONE);
  569 
  570         /*
  571          * Setup the interrupt handler and record the INT SUM register address
  572          */
  573         if (lio_setup_interrupt(octeon_dev,
  574                                 octeon_dev->sriov_info.num_pf_rings))
  575                 return (1);
  576 
  577         /* Enable Octeon device interrupts */
  578         octeon_dev->fn_list.enable_interrupt(octeon_dev, OCTEON_ALL_INTR);
  579 
  580         atomic_store_rel_int(&octeon_dev->status, LIO_DEV_INTR_SET_DONE);
  581 
  582         /*
  583          * Send Credit for Octeon Output queues. Credits are always sent BEFORE
  584          * the output queue is enabled.
  585          * This ensures that we'll receive the f/w CORE DRV_ACTIVE message in
  586          * case we've configured CN23XX_SLI_GBL_CONTROL[NOPTR_D] = 0.
  587          * Otherwise, it is possible that the DRV_ACTIVE message will be sent
  588          * before any credits have been issued, causing the ring to be reset
  589          * (and the f/w appear to never have started).
  590          */
  591         for (j = 0; j < octeon_dev->num_oqs; j++)
  592                 lio_write_csr32(octeon_dev,
  593                                 octeon_dev->droq[j]->pkts_credit_reg,
  594                                 octeon_dev->droq[j]->max_count);
  595 
  596         /* Enable the input and output queues for this Octeon device */
  597         ret = octeon_dev->fn_list.enable_io_queues(octeon_dev);
  598         if (ret) {
  599                 lio_dev_err(octeon_dev, "Failed to enable input/output queues");
  600                 return (ret);
  601         }
  602 
  603         atomic_store_rel_int(&octeon_dev->status, LIO_DEV_IO_QUEUES_DONE);
  604 
  605         if (!fw_loaded) {
  606                 lio_dev_dbg(octeon_dev, "Waiting for DDR initialization...\n");
  607                 if (!ddr_timeout) {
  608                         lio_dev_info(octeon_dev,
  609                                      "WAITING. Set ddr_timeout to non-zero value to proceed with initialization.\n");
  610                 }
  611 
  612                 lio_sleep_timeout(LIO_RESET_MSECS);
  613 
  614                 /*
  615                  * Wait for the octeon to initialize DDR after the
  616                  * soft-reset.
  617                  */
  618                 while (!ddr_timeout) {
  619                         if (pause("-", lio_ms_to_ticks(100))) {
  620                                 /* user probably pressed Control-C */
  621                                 return (1);
  622                         }
  623                 }
  624 
  625                 ret = lio_wait_for_ddr_init(octeon_dev, &ddr_timeout);
  626                 if (ret) {
  627                         lio_dev_err(octeon_dev,
  628                                     "DDR not initialized. Please confirm that board is configured to boot from Flash, ret: %d\n",
  629                                     ret);
  630                         return (1);
  631                 }
  632 
  633                 if (lio_wait_for_bootloader(octeon_dev, 1100)) {
  634                         lio_dev_err(octeon_dev, "Board not responding\n");
  635                         return (1);
  636                 }
  637 
  638                 /* Divert uboot to take commands from host instead. */
  639                 ret = lio_console_send_cmd(octeon_dev, bootcmd, 50);
  640 
  641                 lio_dev_dbg(octeon_dev, "Initializing consoles\n");
  642                 ret = lio_init_consoles(octeon_dev);
  643                 if (ret) {
  644                         lio_dev_err(octeon_dev, "Could not access board consoles\n");
  645                         return (1);
  646                 }
  647 
  648                 /*
  649                  * If console debug enabled, specify empty string to
  650                  * use default enablement ELSE specify NULL string for
  651                  * 'disabled'.
  652                  */
  653                 dbg_enb = lio_console_debug_enabled(0) ? "" : NULL;
  654                 ret = lio_add_console(octeon_dev, 0, dbg_enb);
  655 
  656                 if (ret) {
  657                         lio_dev_err(octeon_dev, "Could not access board console\n");
  658                         return (1);
  659                 } else if (lio_console_debug_enabled(0)) {
  660                         /*
  661                          * If console was added AND we're logging console output
  662                          * then set our console print function.
  663                          */
  664                         octeon_dev->console[0].print = lio_dbg_console_print;
  665                 }
  666 
  667                 atomic_store_rel_int(&octeon_dev->status,
  668                                      LIO_DEV_CONSOLE_INIT_DONE);
  669 
  670                 lio_dev_dbg(octeon_dev, "Loading firmware\n");
  671 
  672                 ret = lio_load_firmware(octeon_dev);
  673                 if (ret) {
  674                         lio_dev_err(octeon_dev, "Could not load firmware to board\n");
  675                         return (1);
  676                 }
  677         }
  678 
  679         atomic_store_rel_int(&octeon_dev->status, LIO_DEV_HOST_OK);
  680 
  681         return (0);
  682 }
  683 
  684 /*
  685  * \brief PCI FLR for each Octeon device.
  686  * @param oct octeon device
  687  */
  688 static void
  689 lio_pci_flr(struct octeon_device *oct)
  690 {
  691         uint32_t        exppos, status;
  692 
  693         pci_find_cap(oct->device, PCIY_EXPRESS, &exppos);
  694 
  695         pci_save_state(oct->device);
  696 
  697         /* Quiesce the device completely */
  698         pci_write_config(oct->device, PCIR_COMMAND, PCIM_CMD_INTxDIS, 2);
  699 
  700         /* Wait for Transaction Pending bit clean */
  701         lio_mdelay(100);
  702 
  703         status = pci_read_config(oct->device, exppos + PCIER_DEVICE_STA, 2);
  704         if (status & PCIEM_STA_TRANSACTION_PND) {
  705                 lio_dev_info(oct, "Function reset incomplete after 100ms, sleeping for 5 seconds\n");
  706                 lio_mdelay(5);
  707 
  708                 status = pci_read_config(oct->device, exppos + PCIER_DEVICE_STA, 2);
  709                 if (status & PCIEM_STA_TRANSACTION_PND)
  710                         lio_dev_info(oct, "Function reset still incomplete after 5s, reset anyway\n");
  711         }
  712 
  713         pci_write_config(oct->device, exppos + PCIER_DEVICE_CTL, PCIEM_CTL_INITIATE_FLR, 2);
  714         lio_mdelay(100);
  715 
  716         pci_restore_state(oct->device);
  717 }
  718 
  719 /*
  720  * \brief Debug console print function
  721  * @param octeon_dev  octeon device
  722  * @param console_num console number
  723  * @param prefix      first portion of line to display
  724  * @param suffix      second portion of line to display
  725  *
  726  * The OCTEON debug console outputs entire lines (excluding '\n').
  727  * Normally, the line will be passed in the 'prefix' parameter.
  728  * However, due to buffering, it is possible for a line to be split into two
  729  * parts, in which case they will be passed as the 'prefix' parameter and
  730  * 'suffix' parameter.
  731  */
  732 static int
  733 lio_dbg_console_print(struct octeon_device *oct, uint32_t console_num,
  734                       char *prefix, char *suffix)
  735 {
  736 
  737         if (prefix != NULL && suffix != NULL)
  738                 lio_dev_info(oct, "%u: %s%s\n", console_num, prefix, suffix);
  739         else if (prefix != NULL)
  740                 lio_dev_info(oct, "%u: %s\n", console_num, prefix);
  741         else if (suffix != NULL)
  742                 lio_dev_info(oct, "%u: %s\n", console_num, suffix);
  743 
  744         return (0);
  745 }
  746 
  747 static void
  748 lio_watchdog(void *param)
  749 {
  750         int             core_num;
  751         uint16_t        mask_of_crashed_or_stuck_cores = 0;
  752         struct octeon_device    *oct = param;
  753         bool            err_msg_was_printed[12];
  754 
  755         bzero(err_msg_was_printed, sizeof(err_msg_was_printed));
  756 
  757         while (1) {
  758                 kproc_suspend_check(oct->watchdog_task);
  759                 mask_of_crashed_or_stuck_cores =
  760                         (uint16_t)lio_read_csr64(oct, LIO_CN23XX_SLI_SCRATCH2);
  761 
  762                 if (mask_of_crashed_or_stuck_cores) {
  763                         struct octeon_device *other_oct;
  764 
  765                         oct->cores_crashed = true;
  766                         other_oct = lio_get_other_octeon_device(oct);
  767                         if (other_oct != NULL)
  768                                 other_oct->cores_crashed = true;
  769 
  770                         for (core_num = 0; core_num < LIO_MAX_CORES;
  771                              core_num++) {
  772                                 bool core_crashed_or_got_stuck;
  773 
  774                                 core_crashed_or_got_stuck =
  775                                     (mask_of_crashed_or_stuck_cores >>
  776                                      core_num) & 1;
  777                                 if (core_crashed_or_got_stuck &&
  778                                     !err_msg_was_printed[core_num]) {
  779                                         lio_dev_err(oct,
  780                                                     "ERROR: Octeon core %d crashed or got stuck! See oct-fwdump for details.\n",
  781                                                     core_num);
  782                                         err_msg_was_printed[core_num] = true;
  783                                 }
  784                         }
  785 
  786                 }
  787 
  788                 /* sleep for two seconds */
  789                 pause("-", lio_ms_to_ticks(2000));
  790         }
  791 }
  792 
  793 static int
  794 lio_chip_specific_setup(struct octeon_device *oct)
  795 {
  796         char            *s;
  797         uint32_t        dev_id;
  798         int             ret = 1;
  799 
  800         dev_id = lio_read_pci_cfg(oct, 0);
  801         oct->subdevice_id = pci_get_subdevice(oct->device);
  802 
  803         switch (dev_id) {
  804         case LIO_CN23XX_PF_PCIID:
  805                 oct->chip_id = LIO_CN23XX_PF_VID;
  806                 if (pci_get_function(oct->device) == 0) {
  807                         if (num_queues_per_pf0 < 0) {
  808                                 lio_dev_info(oct, "Invalid num_queues_per_pf0: %d, Setting it to default\n",
  809                                              num_queues_per_pf0);
  810                                 num_queues_per_pf0 = 0;
  811                         }
  812 
  813                         oct->sriov_info.num_pf_rings = num_queues_per_pf0;
  814                 } else {
  815                         if (num_queues_per_pf1 < 0) {
  816                                 lio_dev_info(oct, "Invalid num_queues_per_pf1: %d, Setting it to default\n",
  817                                              num_queues_per_pf1);
  818                                 num_queues_per_pf1 = 0;
  819                         }
  820 
  821                         oct->sriov_info.num_pf_rings = num_queues_per_pf1;
  822                 }
  823 
  824                 ret = lio_cn23xx_pf_setup_device(oct);
  825                 s = "CN23XX";
  826                 break;
  827 
  828         default:
  829                 s = "?";
  830                 lio_dev_err(oct, "Unknown device found (dev_id: %x)\n", dev_id);
  831         }
  832 
  833         if (!ret)
  834                 lio_dev_info(oct, "%s PASS%d.%d %s Version: %s\n", s,
  835                              OCTEON_MAJOR_REV(oct), OCTEON_MINOR_REV(oct),
  836                              lio_get_conf(oct)->card_name, LIO_VERSION);
  837 
  838         return (ret);
  839 }
  840 
  841 static struct octeon_device *
  842 lio_get_other_octeon_device(struct octeon_device *oct)
  843 {
  844         struct octeon_device    *other_oct;
  845 
  846         other_oct = lio_get_device(oct->octeon_id + 1);
  847 
  848         if ((other_oct != NULL) && other_oct->device) {
  849                 int     oct_busnum, other_oct_busnum;
  850 
  851                 oct_busnum = pci_get_bus(oct->device);
  852                 other_oct_busnum = pci_get_bus(other_oct->device);
  853 
  854                 if (oct_busnum == other_oct_busnum) {
  855                         int     oct_slot, other_oct_slot;
  856 
  857                         oct_slot = pci_get_slot(oct->device);
  858                         other_oct_slot = pci_get_slot(other_oct->device);
  859 
  860                         if (oct_slot == other_oct_slot)
  861                                 return (other_oct);
  862                 }
  863         }
  864         return (NULL);
  865 }
  866 
  867 /*
  868  * \brief Load firmware to device
  869  * @param oct octeon device
  870  *
  871  * Maps device to firmware filename, requests firmware, and downloads it
  872  */
  873 static int
  874 lio_load_firmware(struct octeon_device *oct)
  875 {
  876         const struct firmware   *fw;
  877         char    *tmp_fw_type = NULL;
  878         int     ret = 0;
  879         char    fw_name[LIO_MAX_FW_FILENAME_LEN];
  880 
  881         if (fw_type[0] == '\0')
  882                 tmp_fw_type = LIO_FW_NAME_TYPE_NIC;
  883         else
  884                 tmp_fw_type = fw_type;
  885 
  886         sprintf(fw_name, "%s%s_%s%s", LIO_FW_BASE_NAME,
  887                 lio_get_conf(oct)->card_name, tmp_fw_type, LIO_FW_NAME_SUFFIX);
  888 
  889         fw = firmware_get(fw_name);
  890         if (fw == NULL) {
  891                 lio_dev_err(oct, "Request firmware failed. Could not find file %s.\n",
  892                             fw_name);
  893                 return (EINVAL);
  894         }
  895 
  896         ret = lio_download_firmware(oct, fw->data, fw->datasize);
  897 
  898         firmware_put(fw, FIRMWARE_UNLOAD);
  899 
  900         return (ret);
  901 }
  902 
  903 static int
  904 lio_nic_starter(struct octeon_device *oct)
  905 {
  906         int     ret = 0;
  907 
  908         atomic_store_rel_int(&oct->status, LIO_DEV_RUNNING);
  909 
  910         if (oct->app_mode && oct->app_mode == LIO_DRV_NIC_APP) {
  911                 if (lio_init_nic_module(oct)) {
  912                         lio_dev_err(oct, "NIC initialization failed\n");
  913                         ret = -1;
  914 #ifdef CAVIUM_ONiLY_23XX_VF
  915                 } else {
  916                         if (octeon_enable_sriov(oct) < 0)
  917                                 ret = -1;
  918 #endif
  919                 }
  920         } else {
  921                 lio_dev_err(oct,
  922                             "Unexpected application running on NIC (%d). Check firmware.\n",
  923                             oct->app_mode);
  924                 ret = -1;
  925         }
  926 
  927         return (ret);
  928 }
  929 
  930 static int
  931 lio_init_nic_module(struct octeon_device *oct)
  932 {
  933         int     num_nic_ports = LIO_GET_NUM_NIC_PORTS_CFG(lio_get_conf(oct));
  934         int     retval = 0;
  935 
  936         lio_dev_dbg(oct, "Initializing network interfaces\n");
  937 
  938         /*
  939          * only default iq and oq were initialized
  940          * initialize the rest as well
  941          */
  942 
  943         /* run port_config command for each port */
  944         oct->ifcount = num_nic_ports;
  945 
  946         bzero(&oct->props, sizeof(struct lio_if_props));
  947 
  948         oct->props.gmxport = -1;
  949 
  950         retval = lio_setup_nic_devices(oct);
  951         if (retval) {
  952                 lio_dev_err(oct, "Setup NIC devices failed\n");
  953                 goto lio_init_failure;
  954         }
  955 
  956         lio_dev_dbg(oct, "Network interfaces ready\n");
  957 
  958         return (retval);
  959 
  960 lio_init_failure:
  961 
  962         oct->ifcount = 0;
  963 
  964         return (retval);
  965 }
  966 
  967 static int
  968 lio_ifmedia_update(struct ifnet *ifp)
  969 {
  970         struct lio      *lio = if_getsoftc(ifp);
  971         struct ifmedia  *ifm;
  972 
  973         ifm = &lio->ifmedia;
  974 
  975         /* We only support Ethernet media type. */
  976         if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
  977                 return (EINVAL);
  978 
  979         switch (IFM_SUBTYPE(ifm->ifm_media)) {
  980         case IFM_AUTO:
  981                 break;
  982         case IFM_10G_CX4:
  983         case IFM_10G_SR:
  984         case IFM_10G_T:
  985         case IFM_10G_TWINAX:
  986         default:
  987                 /* We don't support changing the media type. */
  988                 lio_dev_err(lio->oct_dev, "Invalid media type (%d)\n",
  989                             IFM_SUBTYPE(ifm->ifm_media));
  990                 return (EINVAL);
  991         }
  992 
  993         return (0);
  994 }
  995 
  996 static int
  997 lio_get_media_subtype(struct octeon_device *oct)
  998 {
  999 
 1000         switch(oct->subdevice_id) {
 1001         case LIO_CN2350_10G_SUBDEVICE:
 1002         case LIO_CN2350_10G_SUBDEVICE1:
 1003         case LIO_CN2360_10G_SUBDEVICE:
 1004                 return (IFM_10G_SR);
 1005 
 1006         case LIO_CN2350_25G_SUBDEVICE:
 1007         case LIO_CN2360_25G_SUBDEVICE:
 1008                 return (IFM_25G_SR);
 1009         }
 1010 
 1011         return (IFM_10G_SR);
 1012 }
 1013 
 1014 static uint64_t
 1015 lio_get_baudrate(struct octeon_device *oct)
 1016 {
 1017 
 1018         switch(oct->subdevice_id) {
 1019         case LIO_CN2350_10G_SUBDEVICE:
 1020         case LIO_CN2350_10G_SUBDEVICE1:
 1021         case LIO_CN2360_10G_SUBDEVICE:
 1022                 return (IF_Gbps(10));
 1023 
 1024         case LIO_CN2350_25G_SUBDEVICE:
 1025         case LIO_CN2360_25G_SUBDEVICE:
 1026                 return (IF_Gbps(25));
 1027         }
 1028 
 1029         return (IF_Gbps(10));
 1030 }
 1031 
 1032 static void
 1033 lio_ifmedia_status(struct ifnet *ifp, struct ifmediareq *ifmr)
 1034 {
 1035         struct lio      *lio = if_getsoftc(ifp);
 1036 
 1037         /* Report link down if the driver isn't running. */
 1038         if (!lio_ifstate_check(lio, LIO_IFSTATE_RUNNING)) {
 1039                 ifmr->ifm_active |= IFM_NONE;
 1040                 return;
 1041         }
 1042 
 1043         /* Setup the default interface info. */
 1044         ifmr->ifm_status = IFM_AVALID;
 1045         ifmr->ifm_active = IFM_ETHER;
 1046 
 1047         if (lio->linfo.link.s.link_up) {
 1048                 ifmr->ifm_status |= IFM_ACTIVE;
 1049         } else {
 1050                 ifmr->ifm_active |= IFM_NONE;
 1051                 return;
 1052         }
 1053 
 1054         ifmr->ifm_active |= lio_get_media_subtype(lio->oct_dev);
 1055 
 1056         if (lio->linfo.link.s.duplex)
 1057                 ifmr->ifm_active |= IFM_FDX;
 1058         else
 1059                 ifmr->ifm_active |= IFM_HDX;
 1060 }
 1061 
 1062 static uint64_t
 1063 lio_get_counter(if_t ifp, ift_counter cnt)
 1064 {
 1065         struct lio      *lio = if_getsoftc(ifp);
 1066         struct octeon_device    *oct = lio->oct_dev;
 1067         uint64_t        counter = 0;
 1068         int             i, q_no;
 1069 
 1070         switch (cnt) {
 1071         case IFCOUNTER_IPACKETS:
 1072                 for (i = 0; i < oct->num_oqs; i++) {
 1073                         q_no = lio->linfo.rxpciq[i].s.q_no;
 1074                         counter += oct->droq[q_no]->stats.rx_pkts_received;
 1075                 }
 1076                 break;
 1077         case IFCOUNTER_OPACKETS:
 1078                 for (i = 0; i < oct->num_iqs; i++) {
 1079                         q_no = lio->linfo.txpciq[i].s.q_no;
 1080                         counter += oct->instr_queue[q_no]->stats.tx_done;
 1081                 }
 1082                 break;
 1083         case IFCOUNTER_IBYTES:
 1084                 for (i = 0; i < oct->num_oqs; i++) {
 1085                         q_no = lio->linfo.rxpciq[i].s.q_no;
 1086                         counter += oct->droq[q_no]->stats.rx_bytes_received;
 1087                 }
 1088                 break;
 1089         case IFCOUNTER_OBYTES:
 1090                 for (i = 0; i < oct->num_iqs; i++) {
 1091                         q_no = lio->linfo.txpciq[i].s.q_no;
 1092                         counter += oct->instr_queue[q_no]->stats.tx_tot_bytes;
 1093                 }
 1094                 break;
 1095         case IFCOUNTER_IQDROPS:
 1096                 for (i = 0; i < oct->num_oqs; i++) {
 1097                         q_no = lio->linfo.rxpciq[i].s.q_no;
 1098                         counter += oct->droq[q_no]->stats.rx_dropped;
 1099                 }
 1100                 break;
 1101         case IFCOUNTER_OQDROPS:
 1102                 for (i = 0; i < oct->num_iqs; i++) {
 1103                         q_no = lio->linfo.txpciq[i].s.q_no;
 1104                         counter += oct->instr_queue[q_no]->stats.tx_dropped;
 1105                 }
 1106                 break;
 1107         case IFCOUNTER_IMCASTS:
 1108                 counter = oct->link_stats.fromwire.total_mcst;
 1109                 break;
 1110         case IFCOUNTER_OMCASTS:
 1111                 counter = oct->link_stats.fromhost.mcast_pkts_sent;
 1112                 break;
 1113         case IFCOUNTER_COLLISIONS:
 1114                 counter = oct->link_stats.fromhost.total_collisions;
 1115                 break;
 1116         case IFCOUNTER_IERRORS:
 1117                 counter = oct->link_stats.fromwire.fcs_err +
 1118                     oct->link_stats.fromwire.l2_err +
 1119                     oct->link_stats.fromwire.frame_err;
 1120                 break;
 1121         default:
 1122                 return (if_get_counter_default(ifp, cnt));
 1123         }
 1124 
 1125         return (counter);
 1126 }
 1127 
 1128 static int
 1129 lio_init_ifnet(struct lio *lio)
 1130 {
 1131         struct octeon_device    *oct = lio->oct_dev;
 1132         if_t ifp = lio->ifp;
 1133 
 1134         /* ifconfig entrypoint for media type/status reporting */
 1135         ifmedia_init(&lio->ifmedia, IFM_IMASK, lio_ifmedia_update,
 1136                      lio_ifmedia_status);
 1137 
 1138         /* set the default interface values */
 1139         ifmedia_add(&lio->ifmedia,
 1140                     (IFM_ETHER | IFM_FDX | lio_get_media_subtype(oct)),
 1141                     0, NULL);
 1142         ifmedia_add(&lio->ifmedia, (IFM_ETHER | IFM_AUTO), 0, NULL);
 1143         ifmedia_set(&lio->ifmedia, (IFM_ETHER | IFM_AUTO));
 1144 
 1145         lio->ifmedia.ifm_media = lio->ifmedia.ifm_cur->ifm_media;
 1146         lio_dev_dbg(oct, "IFMEDIA flags : %x\n", lio->ifmedia.ifm_media);
 1147 
 1148         if_initname(ifp, device_get_name(oct->device),
 1149                     device_get_unit(oct->device));
 1150         if_setflags(ifp, (IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST));
 1151         if_setioctlfn(ifp, lio_ioctl);
 1152         if_setgetcounterfn(ifp, lio_get_counter);
 1153         if_settransmitfn(ifp, lio_mq_start);
 1154         if_setqflushfn(ifp, lio_qflush);
 1155         if_setinitfn(ifp, lio_open);
 1156         if_setmtu(ifp, lio->linfo.link.s.mtu);
 1157         lio->mtu = lio->linfo.link.s.mtu;
 1158         if_sethwassist(ifp, (CSUM_IP | CSUM_TCP | CSUM_UDP | CSUM_TSO |
 1159                              CSUM_TCP_IPV6 | CSUM_UDP_IPV6));
 1160 
 1161         if_setcapabilitiesbit(ifp, (IFCAP_HWCSUM | IFCAP_HWCSUM_IPV6 |
 1162                                     IFCAP_TSO | IFCAP_LRO |
 1163                                     IFCAP_JUMBO_MTU | IFCAP_HWSTATS |
 1164                                     IFCAP_LINKSTATE | IFCAP_VLAN_HWFILTER |
 1165                                     IFCAP_VLAN_HWCSUM | IFCAP_VLAN_HWTAGGING |
 1166                                     IFCAP_VLAN_HWTSO | IFCAP_VLAN_MTU), 0);
 1167 
 1168         if_setcapenable(ifp, if_getcapabilities(ifp));
 1169         if_setbaudrate(ifp, lio_get_baudrate(oct));
 1170 
 1171         return (0);
 1172 }
 1173 
 1174 static void
 1175 lio_tcp_lro_free(struct octeon_device *octeon_dev, struct ifnet *ifp)
 1176 {
 1177         struct lio      *lio = if_getsoftc(ifp);
 1178         struct lio_droq *droq;
 1179         int             q_no;
 1180         int             i;
 1181 
 1182         for (i = 0; i < octeon_dev->num_oqs; i++) {
 1183                 q_no = lio->linfo.rxpciq[i].s.q_no;
 1184                 droq = octeon_dev->droq[q_no];
 1185                 if (droq->lro.ifp) {
 1186                         tcp_lro_free(&droq->lro);
 1187                         droq->lro.ifp = NULL;
 1188                 }
 1189         }
 1190 }
 1191 
 1192 static int
 1193 lio_tcp_lro_init(struct octeon_device *octeon_dev, struct ifnet *ifp)
 1194 {
 1195         struct lio      *lio = if_getsoftc(ifp);
 1196         struct lio_droq *droq;
 1197         struct lro_ctrl *lro;
 1198         int             i, q_no, ret = 0;
 1199 
 1200         for (i = 0; i < octeon_dev->num_oqs; i++) {
 1201                 q_no = lio->linfo.rxpciq[i].s.q_no;
 1202                 droq = octeon_dev->droq[q_no];
 1203                 lro = &droq->lro;
 1204                 ret = tcp_lro_init(lro);
 1205                 if (ret) {
 1206                         lio_dev_err(octeon_dev, "LRO Initialization failed ret %d\n",
 1207                                     ret);
 1208                         goto lro_init_failed;
 1209                 }
 1210 
 1211                 lro->ifp = ifp;
 1212         }
 1213 
 1214         return (ret);
 1215 
 1216 lro_init_failed:
 1217         lio_tcp_lro_free(octeon_dev, ifp);
 1218 
 1219         return (ret);
 1220 }
 1221 
 1222 static int
 1223 lio_setup_nic_devices(struct octeon_device *octeon_dev)
 1224 {
 1225         union           octeon_if_cfg if_cfg;
 1226         struct lio      *lio = NULL;
 1227         struct ifnet    *ifp = NULL;
 1228         struct lio_version              *vdata;
 1229         struct lio_soft_command         *sc;
 1230         struct lio_if_cfg_context       *ctx;
 1231         struct lio_if_cfg_resp          *resp;
 1232         struct lio_if_props             *props;
 1233         int             num_iqueues, num_oqueues, retval;
 1234         unsigned int    base_queue;
 1235         unsigned int    gmx_port_id;
 1236         uint32_t        ctx_size, data_size;
 1237         uint32_t        ifidx_or_pfnum, resp_size;
 1238         uint8_t         mac[ETHER_HDR_LEN], i, j;
 1239 
 1240         /* This is to handle link status changes */
 1241         lio_register_dispatch_fn(octeon_dev, LIO_OPCODE_NIC,
 1242                                  LIO_OPCODE_NIC_INFO,
 1243                                  lio_link_info, octeon_dev);
 1244 
 1245         for (i = 0; i < octeon_dev->ifcount; i++) {
 1246                 resp_size = sizeof(struct lio_if_cfg_resp);
 1247                 ctx_size = sizeof(struct lio_if_cfg_context);
 1248                 data_size = sizeof(struct lio_version);
 1249                 sc = lio_alloc_soft_command(octeon_dev, data_size, resp_size,
 1250                                             ctx_size);
 1251                 if (sc == NULL)
 1252                         return (ENOMEM);
 1253 
 1254                 resp = (struct lio_if_cfg_resp *)sc->virtrptr;
 1255                 ctx = (struct lio_if_cfg_context *)sc->ctxptr;
 1256                 vdata = (struct lio_version *)sc->virtdptr;
 1257 
 1258                 *((uint64_t *)vdata) = 0;
 1259                 vdata->major = htobe16(LIO_BASE_MAJOR_VERSION);
 1260                 vdata->minor = htobe16(LIO_BASE_MINOR_VERSION);
 1261                 vdata->micro = htobe16(LIO_BASE_MICRO_VERSION);
 1262 
 1263                 num_iqueues = octeon_dev->sriov_info.num_pf_rings;
 1264                 num_oqueues = octeon_dev->sriov_info.num_pf_rings;
 1265                 base_queue = octeon_dev->sriov_info.pf_srn;
 1266 
 1267                 gmx_port_id = octeon_dev->pf_num;
 1268                 ifidx_or_pfnum = octeon_dev->pf_num;
 1269 
 1270                 lio_dev_dbg(octeon_dev, "requesting config for interface %d, iqs %d, oqs %d\n",
 1271                             ifidx_or_pfnum, num_iqueues, num_oqueues);
 1272                 ctx->cond = 0;
 1273                 ctx->octeon_id = lio_get_device_id(octeon_dev);
 1274 
 1275                 if_cfg.if_cfg64 = 0;
 1276                 if_cfg.s.num_iqueues = num_iqueues;
 1277                 if_cfg.s.num_oqueues = num_oqueues;
 1278                 if_cfg.s.base_queue = base_queue;
 1279                 if_cfg.s.gmx_port_id = gmx_port_id;
 1280 
 1281                 sc->iq_no = 0;
 1282 
 1283                 lio_prepare_soft_command(octeon_dev, sc, LIO_OPCODE_NIC,
 1284                                          LIO_OPCODE_NIC_IF_CFG, 0,
 1285                                          if_cfg.if_cfg64, 0);
 1286 
 1287                 sc->callback = lio_if_cfg_callback;
 1288                 sc->callback_arg = sc;
 1289                 sc->wait_time = 3000;
 1290 
 1291                 retval = lio_send_soft_command(octeon_dev, sc);
 1292                 if (retval == LIO_IQ_SEND_FAILED) {
 1293                         lio_dev_err(octeon_dev, "iq/oq config failed status: %x\n",
 1294                                     retval);
 1295                         /* Soft instr is freed by driver in case of failure. */
 1296                         goto setup_nic_dev_fail;
 1297                 }
 1298 
 1299                 /*
 1300                  * Sleep on a wait queue till the cond flag indicates that the
 1301                  * response arrived or timed-out.
 1302                  */
 1303                 lio_sleep_cond(octeon_dev, &ctx->cond);
 1304 
 1305                 retval = resp->status;
 1306                 if (retval) {
 1307                         lio_dev_err(octeon_dev, "iq/oq config failed\n");
 1308                         goto setup_nic_dev_fail;
 1309                 }
 1310 
 1311                 lio_swap_8B_data((uint64_t *)(&resp->cfg_info),
 1312                                  (sizeof(struct octeon_if_cfg_info)) >> 3);
 1313 
 1314                 num_iqueues = bitcount64(resp->cfg_info.iqmask);
 1315                 num_oqueues = bitcount64(resp->cfg_info.oqmask);
 1316 
 1317                 if (!(num_iqueues) || !(num_oqueues)) {
 1318                         lio_dev_err(octeon_dev,
 1319                                     "Got bad iqueues (%016llX) or oqueues (%016llX) from firmware.\n",
 1320                                     LIO_CAST64(resp->cfg_info.iqmask),
 1321                                     LIO_CAST64(resp->cfg_info.oqmask));
 1322                         goto setup_nic_dev_fail;
 1323                 }
 1324 
 1325                 lio_dev_dbg(octeon_dev,
 1326                             "interface %d, iqmask %016llx, oqmask %016llx, numiqueues %d, numoqueues %d\n",
 1327                             i, LIO_CAST64(resp->cfg_info.iqmask),
 1328                             LIO_CAST64(resp->cfg_info.oqmask),
 1329                             num_iqueues, num_oqueues);
 1330 
 1331                 ifp = if_alloc(IFT_ETHER);
 1332 
 1333                 if (ifp == NULL) {
 1334                         lio_dev_err(octeon_dev, "Device allocation failed\n");
 1335                         goto setup_nic_dev_fail;
 1336                 }
 1337 
 1338                 lio = malloc(sizeof(struct lio), M_DEVBUF, M_NOWAIT | M_ZERO);
 1339 
 1340                 if (lio == NULL) {
 1341                         lio_dev_err(octeon_dev, "Lio allocation failed\n");
 1342                         goto setup_nic_dev_fail;
 1343                 }
 1344 
 1345                 if_setsoftc(ifp, lio);
 1346 
 1347                 ifp->if_hw_tsomax = LIO_MAX_FRAME_SIZE;
 1348                 ifp->if_hw_tsomaxsegcount = LIO_MAX_SG;
 1349                 ifp->if_hw_tsomaxsegsize = PAGE_SIZE;
 1350 
 1351                 lio->ifidx = ifidx_or_pfnum;
 1352 
 1353                 props = &octeon_dev->props;
 1354                 props->gmxport = resp->cfg_info.linfo.gmxport;
 1355                 props->ifp = ifp;
 1356 
 1357                 lio->linfo.num_rxpciq = num_oqueues;
 1358                 lio->linfo.num_txpciq = num_iqueues;
 1359                 for (j = 0; j < num_oqueues; j++) {
 1360                         lio->linfo.rxpciq[j].rxpciq64 =
 1361                             resp->cfg_info.linfo.rxpciq[j].rxpciq64;
 1362                 }
 1363 
 1364                 for (j = 0; j < num_iqueues; j++) {
 1365                         lio->linfo.txpciq[j].txpciq64 =
 1366                             resp->cfg_info.linfo.txpciq[j].txpciq64;
 1367                 }
 1368 
 1369                 lio->linfo.hw_addr = resp->cfg_info.linfo.hw_addr;
 1370                 lio->linfo.gmxport = resp->cfg_info.linfo.gmxport;
 1371                 lio->linfo.link.link_status64 =
 1372                     resp->cfg_info.linfo.link.link_status64;
 1373 
 1374                 /*
 1375                  * Point to the properties for octeon device to which this
 1376                  * interface belongs.
 1377                  */
 1378                 lio->oct_dev = octeon_dev;
 1379                 lio->ifp = ifp;
 1380 
 1381                 lio_dev_dbg(octeon_dev, "if%d gmx: %d hw_addr: 0x%llx\n", i,
 1382                             lio->linfo.gmxport, LIO_CAST64(lio->linfo.hw_addr));
 1383                 lio_init_ifnet(lio);
 1384                 /* 64-bit swap required on LE machines */
 1385                 lio_swap_8B_data(&lio->linfo.hw_addr, 1);
 1386                 for (j = 0; j < 6; j++)
 1387                         mac[j] = *((uint8_t *)(
 1388                                    ((uint8_t *)&lio->linfo.hw_addr) + 2 + j));
 1389 
 1390                 ether_ifattach(ifp, mac);
 1391 
 1392                 /*
 1393                  * By default all interfaces on a single Octeon uses the same
 1394                  * tx and rx queues
 1395                  */
 1396                 lio->txq = lio->linfo.txpciq[0].s.q_no;
 1397                 lio->rxq = lio->linfo.rxpciq[0].s.q_no;
 1398                 if (lio_setup_io_queues(octeon_dev, i, lio->linfo.num_txpciq,
 1399                                         lio->linfo.num_rxpciq)) {
 1400                         lio_dev_err(octeon_dev, "I/O queues creation failed\n");
 1401                         goto setup_nic_dev_fail;
 1402                 }
 1403 
 1404                 lio_ifstate_set(lio, LIO_IFSTATE_DROQ_OPS);
 1405 
 1406                 lio->tx_qsize = lio_get_tx_qsize(octeon_dev, lio->txq);
 1407                 lio->rx_qsize = lio_get_rx_qsize(octeon_dev, lio->rxq);
 1408 
 1409                 if (lio_setup_glists(octeon_dev, lio, num_iqueues)) {
 1410                         lio_dev_err(octeon_dev, "Gather list allocation failed\n");
 1411                         goto setup_nic_dev_fail;
 1412                 }
 1413 
 1414                 if ((lio_hwlro == 0) && lio_tcp_lro_init(octeon_dev, ifp))
 1415                         goto setup_nic_dev_fail;
 1416 
 1417                 if (lio_hwlro &&
 1418                     (if_getcapenable(ifp) & IFCAP_LRO) &&
 1419                     (if_getcapenable(ifp) & IFCAP_RXCSUM) &&
 1420                     (if_getcapenable(ifp) & IFCAP_RXCSUM_IPV6))
 1421                         lio_set_feature(ifp, LIO_CMD_LRO_ENABLE,
 1422                                         LIO_LROIPV4 | LIO_LROIPV6);
 1423 
 1424                 if ((if_getcapenable(ifp) & IFCAP_VLAN_HWFILTER))
 1425                         lio_set_feature(ifp, LIO_CMD_VLAN_FILTER_CTL, 1);
 1426                 else
 1427                         lio_set_feature(ifp, LIO_CMD_VLAN_FILTER_CTL, 0);
 1428 
 1429                 if (lio_setup_rx_oom_poll_fn(ifp))
 1430                         goto setup_nic_dev_fail;
 1431 
 1432                 lio_dev_dbg(octeon_dev, "Setup NIC ifidx:%d mac:%02x%02x%02x%02x%02x%02x\n",
 1433                             i, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
 1434                 lio->link_changes++;
 1435 
 1436                 lio_ifstate_set(lio, LIO_IFSTATE_REGISTERED);
 1437 
 1438                 /*
 1439                  * Sending command to firmware to enable Rx checksum offload
 1440                  * by default at the time of setup of Liquidio driver for
 1441                  * this device
 1442                  */
 1443                 lio_set_rxcsum_command(ifp, LIO_CMD_TNL_RX_CSUM_CTL,
 1444                                        LIO_CMD_RXCSUM_ENABLE);
 1445                 lio_set_feature(ifp, LIO_CMD_TNL_TX_CSUM_CTL,
 1446                                 LIO_CMD_TXCSUM_ENABLE);
 1447 
 1448 #ifdef RSS
 1449                 if (lio_rss) {
 1450                         if (lio_send_rss_param(lio))
 1451                                 goto setup_nic_dev_fail;
 1452                 } else
 1453 #endif  /* RSS */
 1454 
 1455                         lio_set_feature(ifp, LIO_CMD_SET_FNV,
 1456                                         LIO_CMD_FNV_ENABLE);
 1457 
 1458                 lio_dev_dbg(octeon_dev, "NIC ifidx:%d Setup successful\n", i);
 1459 
 1460                 lio_free_soft_command(octeon_dev, sc);
 1461                 lio->vlan_attach =
 1462                     EVENTHANDLER_REGISTER(vlan_config,
 1463                                           lio_vlan_rx_add_vid, lio,
 1464                                           EVENTHANDLER_PRI_FIRST);
 1465                 lio->vlan_detach =
 1466                     EVENTHANDLER_REGISTER(vlan_unconfig,
 1467                                           lio_vlan_rx_kill_vid, lio,
 1468                                           EVENTHANDLER_PRI_FIRST);
 1469 
 1470                 /* Update stats periodically */
 1471                 callout_init(&lio->stats_timer, 0);
 1472                 lio->stats_interval = LIO_DEFAULT_STATS_INTERVAL;
 1473 
 1474                 lio_add_hw_stats(lio);
 1475         }
 1476 
 1477         return (0);
 1478 
 1479 setup_nic_dev_fail:
 1480 
 1481         lio_free_soft_command(octeon_dev, sc);
 1482 
 1483         while (i--) {
 1484                 lio_dev_err(octeon_dev, "NIC ifidx:%d Setup failed\n", i);
 1485                 lio_destroy_nic_device(octeon_dev, i);
 1486         }
 1487 
 1488         return (ENODEV);
 1489 }
 1490 
 1491 static int
 1492 lio_link_info(struct lio_recv_info *recv_info, void *ptr)
 1493 {
 1494         struct octeon_device    *oct = (struct octeon_device *)ptr;
 1495         struct lio_recv_pkt     *recv_pkt = recv_info->recv_pkt;
 1496         union octeon_link_status *ls;
 1497         int     gmxport = 0, i;
 1498 
 1499         lio_dev_dbg(oct, "%s Called\n", __func__);
 1500         if (recv_pkt->buffer_size[0] != (sizeof(*ls) + LIO_DROQ_INFO_SIZE)) {
 1501                 lio_dev_err(oct, "Malformed NIC_INFO, len=%d, ifidx=%d\n",
 1502                             recv_pkt->buffer_size[0],
 1503                             recv_pkt->rh.r_nic_info.gmxport);
 1504                 goto nic_info_err;
 1505         }
 1506         gmxport = recv_pkt->rh.r_nic_info.gmxport;
 1507         ls = (union octeon_link_status *)(recv_pkt->buffer_ptr[0]->m_data +
 1508                                           LIO_DROQ_INFO_SIZE);
 1509         lio_swap_8B_data((uint64_t *)ls,
 1510                          (sizeof(union octeon_link_status)) >> 3);
 1511 
 1512         if (oct->props.gmxport == gmxport)
 1513                 lio_update_link_status(oct->props.ifp, ls);
 1514 
 1515 nic_info_err:
 1516         for (i = 0; i < recv_pkt->buffer_count; i++)
 1517                 lio_recv_buffer_free(recv_pkt->buffer_ptr[i]);
 1518 
 1519         lio_free_recv_info(recv_info);
 1520         return (0);
 1521 }
 1522 
 1523 void
 1524 lio_free_mbuf(struct lio_instr_queue *iq, struct lio_mbuf_free_info *finfo)
 1525 {
 1526 
 1527         bus_dmamap_sync(iq->txtag, finfo->map, BUS_DMASYNC_POSTWRITE);
 1528         bus_dmamap_unload(iq->txtag, finfo->map);
 1529         m_freem(finfo->mb);
 1530 }
 1531 
 1532 void
 1533 lio_free_sgmbuf(struct lio_instr_queue *iq, struct lio_mbuf_free_info *finfo)
 1534 {
 1535         struct lio_gather       *g;
 1536         struct octeon_device    *oct;
 1537         struct lio              *lio;
 1538         int     iq_no;
 1539 
 1540         g = finfo->g;
 1541         iq_no = iq->txpciq.s.q_no;
 1542         oct = iq->oct_dev;
 1543         lio = if_getsoftc(oct->props.ifp);
 1544 
 1545         mtx_lock(&lio->glist_lock[iq_no]);
 1546         STAILQ_INSERT_TAIL(&lio->ghead[iq_no], &g->node, entries);
 1547         mtx_unlock(&lio->glist_lock[iq_no]);
 1548 
 1549         bus_dmamap_sync(iq->txtag, finfo->map, BUS_DMASYNC_POSTWRITE);
 1550         bus_dmamap_unload(iq->txtag, finfo->map);
 1551         m_freem(finfo->mb);
 1552 }
 1553 
 1554 static void
 1555 lio_if_cfg_callback(struct octeon_device *oct, uint32_t status, void *buf)
 1556 {
 1557         struct lio_soft_command *sc = (struct lio_soft_command *)buf;
 1558         struct lio_if_cfg_resp  *resp;
 1559         struct lio_if_cfg_context *ctx;
 1560 
 1561         resp = (struct lio_if_cfg_resp *)sc->virtrptr;
 1562         ctx = (struct lio_if_cfg_context *)sc->ctxptr;
 1563 
 1564         oct = lio_get_device(ctx->octeon_id);
 1565         if (resp->status)
 1566                 lio_dev_err(oct, "nic if cfg instruction failed. Status: %llx (0x%08x)\n",
 1567                             LIO_CAST64(resp->status), status);
 1568         ctx->cond = 1;
 1569 
 1570         snprintf(oct->fw_info.lio_firmware_version, 32, "%s",
 1571                  resp->cfg_info.lio_firmware_version);
 1572 
 1573         /*
 1574          * This barrier is required to be sure that the response has been
 1575          * written fully before waking up the handler
 1576          */
 1577         wmb();
 1578 }
 1579 
 1580 static int
 1581 lio_is_mac_changed(uint8_t *new, uint8_t *old)
 1582 {
 1583 
 1584         return ((new[0] != old[0]) || (new[1] != old[1]) ||
 1585                 (new[2] != old[2]) || (new[3] != old[3]) ||
 1586                 (new[4] != old[4]) || (new[5] != old[5]));
 1587 }
 1588 
 1589 void
 1590 lio_open(void *arg)
 1591 {
 1592         struct lio      *lio = arg;
 1593         struct ifnet    *ifp = lio->ifp;
 1594         struct octeon_device    *oct = lio->oct_dev;
 1595         uint8_t *mac_new, mac_old[ETHER_HDR_LEN];
 1596         int     ret = 0;
 1597 
 1598         lio_ifstate_set(lio, LIO_IFSTATE_RUNNING);
 1599 
 1600         /* Ready for link status updates */
 1601         lio->intf_open = 1;
 1602 
 1603         lio_dev_info(oct, "Interface Open, ready for traffic\n");
 1604 
 1605         /* tell Octeon to start forwarding packets to host */
 1606         lio_send_rx_ctrl_cmd(lio, 1);
 1607 
 1608         mac_new = IF_LLADDR(ifp);
 1609         memcpy(mac_old, ((uint8_t *)&lio->linfo.hw_addr) + 2, ETHER_HDR_LEN);
 1610 
 1611         if (lio_is_mac_changed(mac_new, mac_old)) {
 1612                 ret = lio_set_mac(ifp, mac_new);
 1613                 if (ret)
 1614                         lio_dev_err(oct, "MAC change failed, error: %d\n", ret);
 1615         }
 1616 
 1617         /* Now inform the stack we're ready */
 1618         if_setdrvflagbits(ifp, IFF_DRV_RUNNING, 0);
 1619 
 1620         lio_dev_info(oct, "Interface is opened\n");
 1621 }
 1622 
 1623 static int
 1624 lio_set_rxcsum_command(struct ifnet *ifp, int command, uint8_t rx_cmd)
 1625 {
 1626         struct lio_ctrl_pkt     nctrl;
 1627         struct lio              *lio = if_getsoftc(ifp);
 1628         struct octeon_device    *oct = lio->oct_dev;
 1629         int     ret = 0;
 1630 
 1631         nctrl.ncmd.cmd64 = 0;
 1632         nctrl.ncmd.s.cmd = command;
 1633         nctrl.ncmd.s.param1 = rx_cmd;
 1634         nctrl.iq_no = lio->linfo.txpciq[0].s.q_no;
 1635         nctrl.wait_time = 100;
 1636         nctrl.lio = lio;
 1637         nctrl.cb_fn = lio_ctrl_cmd_completion;
 1638 
 1639         ret = lio_send_ctrl_pkt(lio->oct_dev, &nctrl);
 1640         if (ret < 0) {
 1641                 lio_dev_err(oct, "DEVFLAGS RXCSUM change failed in core(ret:0x%x)\n",
 1642                             ret);
 1643         }
 1644 
 1645         return (ret);
 1646 }
 1647 
 1648 static int
 1649 lio_stop_nic_module(struct octeon_device *oct)
 1650 {
 1651         int             i, j;
 1652         struct lio      *lio;
 1653 
 1654         lio_dev_dbg(oct, "Stopping network interfaces\n");
 1655         if (!oct->ifcount) {
 1656                 lio_dev_err(oct, "Init for Octeon was not completed\n");
 1657                 return (1);
 1658         }
 1659 
 1660         mtx_lock(&oct->cmd_resp_wqlock);
 1661         oct->cmd_resp_state = LIO_DRV_OFFLINE;
 1662         mtx_unlock(&oct->cmd_resp_wqlock);
 1663 
 1664         for (i = 0; i < oct->ifcount; i++) {
 1665                 lio = if_getsoftc(oct->props.ifp);
 1666                 for (j = 0; j < oct->num_oqs; j++)
 1667                         lio_unregister_droq_ops(oct,
 1668                                                 lio->linfo.rxpciq[j].s.q_no);
 1669         }
 1670 
 1671         callout_drain(&lio->stats_timer);
 1672 
 1673         for (i = 0; i < oct->ifcount; i++)
 1674                 lio_destroy_nic_device(oct, i);
 1675 
 1676         lio_dev_dbg(oct, "Network interface stopped\n");
 1677 
 1678         return (0);
 1679 }
 1680 
 1681 static void
 1682 lio_delete_glists(struct octeon_device *oct, struct lio *lio)
 1683 {
 1684         struct lio_gather       *g;
 1685         int     i;
 1686 
 1687         if (lio->glist_lock != NULL) {
 1688                 free((void *)lio->glist_lock, M_DEVBUF);
 1689                 lio->glist_lock = NULL;
 1690         }
 1691 
 1692         if (lio->ghead == NULL)
 1693                 return;
 1694 
 1695         for (i = 0; i < lio->linfo.num_txpciq; i++) {
 1696                 do {
 1697                         g = (struct lio_gather *)
 1698                             lio_delete_first_node(&lio->ghead[i]);
 1699                         free(g, M_DEVBUF);
 1700                 } while (g);
 1701 
 1702                 if ((lio->glists_virt_base != NULL) &&
 1703                     (lio->glists_virt_base[i] != NULL)) {
 1704                         lio_dma_free(lio->glist_entry_size * lio->tx_qsize,
 1705                                      lio->glists_virt_base[i]);
 1706                 }
 1707         }
 1708 
 1709         free(lio->glists_virt_base, M_DEVBUF);
 1710         lio->glists_virt_base = NULL;
 1711 
 1712         free(lio->glists_dma_base, M_DEVBUF);
 1713         lio->glists_dma_base = NULL;
 1714 
 1715         free(lio->ghead, M_DEVBUF);
 1716         lio->ghead = NULL;
 1717 }
 1718 
 1719 static int
 1720 lio_setup_glists(struct octeon_device *oct, struct lio *lio, int num_iqs)
 1721 {
 1722         struct lio_gather       *g;
 1723         int     i, j;
 1724 
 1725         lio->glist_lock = malloc(num_iqs * sizeof(*lio->glist_lock), M_DEVBUF,
 1726                                  M_NOWAIT | M_ZERO);
 1727         if (lio->glist_lock == NULL)
 1728                 return (1);
 1729 
 1730         lio->ghead = malloc(num_iqs * sizeof(*lio->ghead), M_DEVBUF,
 1731                             M_NOWAIT | M_ZERO);
 1732         if (lio->ghead == NULL) {
 1733                 free((void *)lio->glist_lock, M_DEVBUF);
 1734                 lio->glist_lock = NULL;
 1735                 return (1);
 1736         }
 1737 
 1738         lio->glist_entry_size = ROUNDUP8((ROUNDUP4(LIO_MAX_SG) >> 2) *
 1739                                          LIO_SG_ENTRY_SIZE);
 1740         /*
 1741          * allocate memory to store virtual and dma base address of
 1742          * per glist consistent memory
 1743          */
 1744         lio->glists_virt_base = malloc(num_iqs * sizeof(void *), M_DEVBUF,
 1745                                        M_NOWAIT | M_ZERO);
 1746         lio->glists_dma_base = malloc(num_iqs * sizeof(vm_paddr_t), M_DEVBUF,
 1747                                       M_NOWAIT | M_ZERO);
 1748         if ((lio->glists_virt_base == NULL) || (lio->glists_dma_base == NULL)) {
 1749                 lio_delete_glists(oct, lio);
 1750                 return (1);
 1751         }
 1752 
 1753         for (i = 0; i < num_iqs; i++) {
 1754                 mtx_init(&lio->glist_lock[i], "glist_lock", NULL, MTX_DEF);
 1755 
 1756                 STAILQ_INIT(&lio->ghead[i]);
 1757 
 1758                 lio->glists_virt_base[i] =
 1759                     lio_dma_alloc(lio->glist_entry_size * lio->tx_qsize,
 1760                                   (vm_paddr_t *)&lio->glists_dma_base[i]);
 1761                 if (lio->glists_virt_base[i] == NULL) {
 1762                         lio_delete_glists(oct, lio);
 1763                         return (1);
 1764                 }
 1765 
 1766                 for (j = 0; j < lio->tx_qsize; j++) {
 1767                         g = malloc(sizeof(*g), M_DEVBUF, M_NOWAIT | M_ZERO);
 1768                         if (g == NULL)
 1769                                 break;
 1770 
 1771                         g->sg = (struct lio_sg_entry *)(uintptr_t)
 1772                             ((uint64_t)(uintptr_t)lio->glists_virt_base[i] +
 1773                              (j * lio->glist_entry_size));
 1774                         g->sg_dma_ptr = (uint64_t)lio->glists_dma_base[i] +
 1775                                 (j * lio->glist_entry_size);
 1776                         STAILQ_INSERT_TAIL(&lio->ghead[i], &g->node, entries);
 1777                 }
 1778 
 1779                 if (j != lio->tx_qsize) {
 1780                         lio_delete_glists(oct, lio);
 1781                         return (1);
 1782                 }
 1783         }
 1784 
 1785         return (0);
 1786 }
 1787 
 1788 void
 1789 lio_stop(struct ifnet *ifp)
 1790 {
 1791         struct lio      *lio = if_getsoftc(ifp);
 1792         struct octeon_device    *oct = lio->oct_dev;
 1793 
 1794         lio_ifstate_reset(lio, LIO_IFSTATE_RUNNING);
 1795         if_link_state_change(ifp, LINK_STATE_DOWN);
 1796 
 1797         lio->intf_open = 0;
 1798         lio->linfo.link.s.link_up = 0;
 1799         lio->link_changes++;
 1800 
 1801         lio_send_rx_ctrl_cmd(lio, 0);
 1802 
 1803         /* Tell the stack that the interface is no longer active */
 1804         if_setdrvflagbits(ifp, 0, IFF_DRV_RUNNING);
 1805 
 1806         lio_dev_info(oct, "Interface is stopped\n");
 1807 }
 1808 
 1809 static void
 1810 lio_check_rx_oom_status(struct lio *lio)
 1811 {
 1812         struct lio_droq *droq;
 1813         struct octeon_device *oct = lio->oct_dev;
 1814         int     desc_refilled;
 1815         int     q, q_no = 0;
 1816 
 1817         for (q = 0; q < oct->num_oqs; q++) {
 1818                 q_no = lio->linfo.rxpciq[q].s.q_no;
 1819                 droq = oct->droq[q_no];
 1820                 if (droq == NULL)
 1821                         continue;
 1822                 if (lio_read_csr32(oct, droq->pkts_credit_reg) <= 0x40) {
 1823                         mtx_lock(&droq->lock);
 1824                         desc_refilled = lio_droq_refill(oct, droq);
 1825                         /*
 1826                          * Flush the droq descriptor data to memory to be sure
 1827                          * that when we update the credits the data in memory
 1828                          * is accurate.
 1829                          */
 1830                         wmb();
 1831                         lio_write_csr32(oct, droq->pkts_credit_reg,
 1832                                         desc_refilled);
 1833                         /* make sure mmio write completes */
 1834                         __compiler_membar();
 1835                         mtx_unlock(&droq->lock);
 1836                 }
 1837         }
 1838 }
 1839 
 1840 static void
 1841 lio_poll_check_rx_oom_status(void *arg, int pending __unused)
 1842 {
 1843         struct lio_tq   *rx_status_tq = arg;
 1844         struct lio      *lio = rx_status_tq->ctxptr;
 1845 
 1846         if (lio_ifstate_check(lio, LIO_IFSTATE_RUNNING))
 1847                 lio_check_rx_oom_status(lio);
 1848 
 1849         taskqueue_enqueue_timeout(rx_status_tq->tq, &rx_status_tq->work,
 1850                                   lio_ms_to_ticks(50));
 1851 }
 1852 
 1853 static int
 1854 lio_setup_rx_oom_poll_fn(struct ifnet *ifp)
 1855 {
 1856         struct lio      *lio = if_getsoftc(ifp);
 1857         struct octeon_device    *oct = lio->oct_dev;
 1858         struct lio_tq   *rx_status_tq;
 1859 
 1860         rx_status_tq = &lio->rx_status_tq;
 1861 
 1862         rx_status_tq->tq = taskqueue_create("lio_rx_oom_status", M_WAITOK,
 1863                                             taskqueue_thread_enqueue,
 1864                                             &rx_status_tq->tq);
 1865         if (rx_status_tq->tq == NULL) {
 1866                 lio_dev_err(oct, "unable to create lio rx oom status tq\n");
 1867                 return (-1);
 1868         }
 1869 
 1870         TIMEOUT_TASK_INIT(rx_status_tq->tq, &rx_status_tq->work, 0,
 1871                           lio_poll_check_rx_oom_status, (void *)rx_status_tq);
 1872 
 1873         rx_status_tq->ctxptr = lio;
 1874 
 1875         taskqueue_start_threads(&rx_status_tq->tq, 1, PI_NET,
 1876                                 "lio%d_rx_oom_status",
 1877                                 oct->octeon_id);
 1878 
 1879         taskqueue_enqueue_timeout(rx_status_tq->tq, &rx_status_tq->work,
 1880                                   lio_ms_to_ticks(50));
 1881 
 1882         return (0);
 1883 }
 1884 
 1885 static void
 1886 lio_cleanup_rx_oom_poll_fn(struct ifnet *ifp)
 1887 {
 1888         struct lio      *lio = if_getsoftc(ifp);
 1889 
 1890         if (lio->rx_status_tq.tq != NULL) {
 1891                 while (taskqueue_cancel_timeout(lio->rx_status_tq.tq,
 1892                                                 &lio->rx_status_tq.work, NULL))
 1893                         taskqueue_drain_timeout(lio->rx_status_tq.tq,
 1894                                                 &lio->rx_status_tq.work);
 1895 
 1896                 taskqueue_free(lio->rx_status_tq.tq);
 1897 
 1898                 lio->rx_status_tq.tq = NULL;
 1899         }
 1900 }
 1901 
 1902 static void
 1903 lio_destroy_nic_device(struct octeon_device *oct, int ifidx)
 1904 {
 1905         struct ifnet    *ifp = oct->props.ifp;
 1906         struct lio      *lio;
 1907 
 1908         if (ifp == NULL) {
 1909                 lio_dev_err(oct, "%s No ifp ptr for index %d\n",
 1910                             __func__, ifidx);
 1911                 return;
 1912         }
 1913 
 1914         lio = if_getsoftc(ifp);
 1915 
 1916         lio_ifstate_set(lio, LIO_IFSTATE_DETACH);
 1917 
 1918         lio_dev_dbg(oct, "NIC device cleanup\n");
 1919 
 1920         if (atomic_load_acq_int(&lio->ifstate) & LIO_IFSTATE_RUNNING)
 1921                 lio_stop(ifp);
 1922 
 1923         if (lio_wait_for_pending_requests(oct))
 1924                 lio_dev_err(oct, "There were pending requests\n");
 1925 
 1926         if (lio_wait_for_instr_fetch(oct))
 1927                 lio_dev_err(oct, "IQ had pending instructions\n");
 1928 
 1929         if (lio_wait_for_oq_pkts(oct))
 1930                 lio_dev_err(oct, "OQ had pending packets\n");
 1931 
 1932         if (atomic_load_acq_int(&lio->ifstate) & LIO_IFSTATE_REGISTERED)
 1933                 ether_ifdetach(ifp);
 1934 
 1935         lio_tcp_lro_free(oct, ifp);
 1936 
 1937         lio_cleanup_rx_oom_poll_fn(ifp);
 1938 
 1939         lio_delete_glists(oct, lio);
 1940 
 1941         EVENTHANDLER_DEREGISTER(vlan_config, lio->vlan_attach);
 1942         EVENTHANDLER_DEREGISTER(vlan_unconfig, lio->vlan_detach);
 1943 
 1944         free(lio, M_DEVBUF);
 1945 
 1946         if_free(ifp);
 1947 
 1948         oct->props.gmxport = -1;
 1949 
 1950         oct->props.ifp = NULL;
 1951 }
 1952 
 1953 static void
 1954 print_link_info(struct ifnet *ifp)
 1955 {
 1956         struct lio      *lio = if_getsoftc(ifp);
 1957 
 1958         if (!lio_ifstate_check(lio, LIO_IFSTATE_RESETTING) &&
 1959             lio_ifstate_check(lio, LIO_IFSTATE_REGISTERED)) {
 1960                 struct octeon_link_info *linfo = &lio->linfo;
 1961 
 1962                 if (linfo->link.s.link_up) {
 1963                         lio_dev_info(lio->oct_dev, "%d Mbps %s Duplex UP\n",
 1964                                      linfo->link.s.speed,
 1965                                      (linfo->link.s.duplex) ? "Full" : "Half");
 1966                 } else {
 1967                         lio_dev_info(lio->oct_dev, "Link Down\n");
 1968                 }
 1969         }
 1970 }
 1971 
 1972 static inline void
 1973 lio_update_link_status(struct ifnet *ifp, union octeon_link_status *ls)
 1974 {
 1975         struct lio      *lio = if_getsoftc(ifp);
 1976         int     changed = (lio->linfo.link.link_status64 != ls->link_status64);
 1977 
 1978         lio->linfo.link.link_status64 = ls->link_status64;
 1979 
 1980         if ((lio->intf_open) && (changed)) {
 1981                 print_link_info(ifp);
 1982                 lio->link_changes++;
 1983                 if (lio->linfo.link.s.link_up)
 1984                         if_link_state_change(ifp, LINK_STATE_UP);
 1985                 else
 1986                         if_link_state_change(ifp, LINK_STATE_DOWN);
 1987         }
 1988 }
 1989 
 1990 /*
 1991  * \brief Callback for rx ctrl
 1992  * @param status status of request
 1993  * @param buf pointer to resp structure
 1994  */
 1995 static void
 1996 lio_rx_ctl_callback(struct octeon_device *oct, uint32_t status, void *buf)
 1997 {
 1998         struct lio_soft_command *sc = (struct lio_soft_command *)buf;
 1999         struct lio_rx_ctl_context *ctx;
 2000 
 2001         ctx = (struct lio_rx_ctl_context *)sc->ctxptr;
 2002 
 2003         oct = lio_get_device(ctx->octeon_id);
 2004         if (status)
 2005                 lio_dev_err(oct, "rx ctl instruction failed. Status: %llx\n",
 2006                             LIO_CAST64(status));
 2007         ctx->cond = 1;
 2008 
 2009         /*
 2010          * This barrier is required to be sure that the response has been
 2011          * written fully before waking up the handler
 2012          */
 2013         wmb();
 2014 }
 2015 
 2016 static void
 2017 lio_send_rx_ctrl_cmd(struct lio *lio, int start_stop)
 2018 {
 2019         struct lio_soft_command *sc;
 2020         struct lio_rx_ctl_context *ctx;
 2021         union octeon_cmd        *ncmd;
 2022         struct octeon_device    *oct = (struct octeon_device *)lio->oct_dev;
 2023         int     ctx_size = sizeof(struct lio_rx_ctl_context);
 2024         int     retval;
 2025 
 2026         if (oct->props.rx_on == start_stop)
 2027                 return;
 2028 
 2029         sc = lio_alloc_soft_command(oct, OCTEON_CMD_SIZE, 16, ctx_size);
 2030         if (sc == NULL)
 2031                 return;
 2032 
 2033         ncmd = (union octeon_cmd *)sc->virtdptr;
 2034         ctx = (struct lio_rx_ctl_context *)sc->ctxptr;
 2035 
 2036         ctx->cond = 0;
 2037         ctx->octeon_id = lio_get_device_id(oct);
 2038         ncmd->cmd64 = 0;
 2039         ncmd->s.cmd = LIO_CMD_RX_CTL;
 2040         ncmd->s.param1 = start_stop;
 2041 
 2042         lio_swap_8B_data((uint64_t *)ncmd, (OCTEON_CMD_SIZE >> 3));
 2043 
 2044         sc->iq_no = lio->linfo.txpciq[0].s.q_no;
 2045 
 2046         lio_prepare_soft_command(oct, sc, LIO_OPCODE_NIC, LIO_OPCODE_NIC_CMD, 0,
 2047                                  0, 0);
 2048 
 2049         sc->callback = lio_rx_ctl_callback;
 2050         sc->callback_arg = sc;
 2051         sc->wait_time = 5000;
 2052 
 2053         retval = lio_send_soft_command(oct, sc);
 2054         if (retval == LIO_IQ_SEND_FAILED) {
 2055                 lio_dev_err(oct, "Failed to send RX Control message\n");
 2056         } else {
 2057                 /*
 2058                  * Sleep on a wait queue till the cond flag indicates that the
 2059                  * response arrived or timed-out.
 2060                  */
 2061                 lio_sleep_cond(oct, &ctx->cond);
 2062                 oct->props.rx_on = start_stop;
 2063         }
 2064 
 2065         lio_free_soft_command(oct, sc);
 2066 }
 2067 
 2068 static void
 2069 lio_vlan_rx_add_vid(void *arg, struct ifnet *ifp, uint16_t vid)
 2070 {
 2071         struct lio_ctrl_pkt     nctrl;
 2072         struct lio              *lio = if_getsoftc(ifp);
 2073         struct octeon_device    *oct = lio->oct_dev;
 2074         int     ret = 0;
 2075 
 2076         if (if_getsoftc(ifp) != arg)    /* Not our event */
 2077                 return;
 2078 
 2079         if ((vid == 0) || (vid > 4095)) /* Invalid */
 2080                 return;
 2081 
 2082         bzero(&nctrl, sizeof(struct lio_ctrl_pkt));
 2083 
 2084         nctrl.ncmd.cmd64 = 0;
 2085         nctrl.ncmd.s.cmd = LIO_CMD_ADD_VLAN_FILTER;
 2086         nctrl.ncmd.s.param1 = vid;
 2087         nctrl.iq_no = lio->linfo.txpciq[0].s.q_no;
 2088         nctrl.wait_time = 100;
 2089         nctrl.lio = lio;
 2090         nctrl.cb_fn = lio_ctrl_cmd_completion;
 2091 
 2092         ret = lio_send_ctrl_pkt(lio->oct_dev, &nctrl);
 2093         if (ret < 0) {
 2094                 lio_dev_err(oct, "Add VLAN filter failed in core (ret: 0x%x)\n",
 2095                             ret);
 2096         }
 2097 }
 2098 
 2099 static void
 2100 lio_vlan_rx_kill_vid(void *arg, struct ifnet *ifp, uint16_t vid)
 2101 {
 2102         struct lio_ctrl_pkt     nctrl;
 2103         struct lio              *lio = if_getsoftc(ifp);
 2104         struct octeon_device    *oct = lio->oct_dev;
 2105         int     ret = 0;
 2106 
 2107         if (if_getsoftc(ifp) != arg)    /* Not our event */
 2108                 return;
 2109 
 2110         if ((vid == 0) || (vid > 4095)) /* Invalid */
 2111                 return;
 2112 
 2113         bzero(&nctrl, sizeof(struct lio_ctrl_pkt));
 2114 
 2115         nctrl.ncmd.cmd64 = 0;
 2116         nctrl.ncmd.s.cmd = LIO_CMD_DEL_VLAN_FILTER;
 2117         nctrl.ncmd.s.param1 = vid;
 2118         nctrl.iq_no = lio->linfo.txpciq[0].s.q_no;
 2119         nctrl.wait_time = 100;
 2120         nctrl.lio = lio;
 2121         nctrl.cb_fn = lio_ctrl_cmd_completion;
 2122 
 2123         ret = lio_send_ctrl_pkt(lio->oct_dev, &nctrl);
 2124         if (ret < 0) {
 2125                 lio_dev_err(oct,
 2126                             "Kill VLAN filter failed in core (ret: 0x%x)\n",
 2127                             ret);
 2128         }
 2129 }
 2130 
 2131 static int
 2132 lio_wait_for_oq_pkts(struct octeon_device *oct)
 2133 {
 2134         int     i, pending_pkts, pkt_cnt = 0, retry = 100;
 2135 
 2136         do {
 2137                 pending_pkts = 0;
 2138 
 2139                 for (i = 0; i < LIO_MAX_OUTPUT_QUEUES(oct); i++) {
 2140                         if (!(oct->io_qmask.oq & BIT_ULL(i)))
 2141                                 continue;
 2142 
 2143                         pkt_cnt = lio_droq_check_hw_for_pkts(oct->droq[i]);
 2144                         if (pkt_cnt > 0) {
 2145                                 pending_pkts += pkt_cnt;
 2146                                 taskqueue_enqueue(oct->droq[i]->droq_taskqueue,
 2147                                                   &oct->droq[i]->droq_task);
 2148                         }
 2149                 }
 2150 
 2151                 pkt_cnt = 0;
 2152                 lio_sleep_timeout(1);
 2153         } while (retry-- && pending_pkts);
 2154 
 2155         return (pkt_cnt);
 2156 }
 2157 
 2158 static void
 2159 lio_destroy_resources(struct octeon_device *oct)
 2160 {
 2161         int i, refcount;
 2162 
 2163         switch (atomic_load_acq_int(&oct->status)) {
 2164         case LIO_DEV_RUNNING:
 2165         case LIO_DEV_CORE_OK:
 2166                 /* No more instructions will be forwarded. */
 2167                 atomic_store_rel_int(&oct->status, LIO_DEV_IN_RESET);
 2168 
 2169                 oct->app_mode = LIO_DRV_INVALID_APP;
 2170                 lio_dev_dbg(oct, "Device state is now %s\n",
 2171                             lio_get_state_string(&oct->status));
 2172 
 2173                 lio_sleep_timeout(100);
 2174 
 2175                 /* fallthrough */
 2176         case LIO_DEV_HOST_OK:
 2177 
 2178                 /* fallthrough */
 2179         case LIO_DEV_CONSOLE_INIT_DONE:
 2180                 /* Remove any consoles */
 2181                 lio_remove_consoles(oct);
 2182 
 2183                 /* fallthrough */
 2184         case LIO_DEV_IO_QUEUES_DONE:
 2185                 if (lio_wait_for_pending_requests(oct))
 2186                         lio_dev_err(oct, "There were pending requests\n");
 2187 
 2188                 if (lio_wait_for_instr_fetch(oct))
 2189                         lio_dev_err(oct, "IQ had pending instructions\n");
 2190 
 2191                 /*
 2192                  * Disable the input and output queues now. No more packets will
 2193                  * arrive from Octeon, but we should wait for all packet
 2194                  * processing to finish.
 2195                  */
 2196                 oct->fn_list.disable_io_queues(oct);
 2197 
 2198                 if (lio_wait_for_oq_pkts(oct))
 2199                         lio_dev_err(oct, "OQ had pending packets\n");
 2200 
 2201                 /* fallthrough */
 2202         case LIO_DEV_INTR_SET_DONE:
 2203                 /* Disable interrupts  */
 2204                 oct->fn_list.disable_interrupt(oct, OCTEON_ALL_INTR);
 2205 
 2206                 if (oct->msix_on) {
 2207                         for (i = 0; i < oct->num_msix_irqs - 1; i++) {
 2208                                 if (oct->ioq_vector[i].tag != NULL) {
 2209                                         bus_teardown_intr(oct->device,
 2210                                                   oct->ioq_vector[i].msix_res,
 2211                                                       oct->ioq_vector[i].tag);
 2212                                         oct->ioq_vector[i].tag = NULL;
 2213                                 }
 2214                                 if (oct->ioq_vector[i].msix_res != NULL) {
 2215                                         bus_release_resource(oct->device,
 2216                                                 SYS_RES_IRQ,
 2217                                                 oct->ioq_vector[i].vector,
 2218                                                 oct->ioq_vector[i].msix_res);
 2219                                         oct->ioq_vector[i].msix_res = NULL;
 2220                                 }
 2221                         }
 2222                         /* non-iov vector's argument is oct struct */
 2223                         if (oct->tag != NULL) {
 2224                                 bus_teardown_intr(oct->device, oct->msix_res,
 2225                                                   oct->tag);
 2226                                 oct->tag = NULL;
 2227                         }
 2228 
 2229                         if (oct->msix_res != NULL) {
 2230                                 bus_release_resource(oct->device, SYS_RES_IRQ,
 2231                                                      oct->aux_vector,
 2232                                                      oct->msix_res);
 2233                                 oct->msix_res = NULL;
 2234                         }
 2235 
 2236                         pci_release_msi(oct->device);
 2237                 }
 2238                 /* fallthrough */
 2239         case LIO_DEV_IN_RESET:
 2240         case LIO_DEV_DROQ_INIT_DONE:
 2241                 /* Wait for any pending operations */
 2242                 lio_mdelay(100);
 2243                 for (i = 0; i < LIO_MAX_OUTPUT_QUEUES(oct); i++) {
 2244                         if (!(oct->io_qmask.oq & BIT_ULL(i)))
 2245                                 continue;
 2246                         lio_delete_droq(oct, i);
 2247                 }
 2248 
 2249                 /* fallthrough */
 2250         case LIO_DEV_RESP_LIST_INIT_DONE:
 2251                 for (i = 0; i < LIO_MAX_POSSIBLE_OUTPUT_QUEUES; i++) {
 2252                         if (oct->droq[i] != NULL) {
 2253                                 free(oct->droq[i], M_DEVBUF);
 2254                                 oct->droq[i] = NULL;
 2255                         }
 2256                 }
 2257                 lio_delete_response_list(oct);
 2258 
 2259                 /* fallthrough */
 2260         case LIO_DEV_INSTR_QUEUE_INIT_DONE:
 2261                 for (i = 0; i < LIO_MAX_INSTR_QUEUES(oct); i++) {
 2262                         if (!(oct->io_qmask.iq & BIT_ULL(i)))
 2263                                 continue;
 2264 
 2265                         lio_delete_instr_queue(oct, i);
 2266                 }
 2267 
 2268                 /* fallthrough */
 2269         case LIO_DEV_MSIX_ALLOC_VECTOR_DONE:
 2270                 for (i = 0; i < LIO_MAX_POSSIBLE_INSTR_QUEUES; i++) {
 2271                         if (oct->instr_queue[i] != NULL) {
 2272                                 free(oct->instr_queue[i], M_DEVBUF);
 2273                                 oct->instr_queue[i] = NULL;
 2274                         }
 2275                 }
 2276                 lio_free_ioq_vector(oct);
 2277 
 2278                 /* fallthrough */
 2279         case LIO_DEV_SC_BUFF_POOL_INIT_DONE:
 2280                 lio_free_sc_buffer_pool(oct);
 2281 
 2282                 /* fallthrough */
 2283         case LIO_DEV_DISPATCH_INIT_DONE:
 2284                 lio_delete_dispatch_list(oct);
 2285 
 2286                 /* fallthrough */
 2287         case LIO_DEV_PCI_MAP_DONE:
 2288                 refcount = lio_deregister_device(oct);
 2289 
 2290                 if (fw_type_is_none())
 2291                         lio_pci_flr(oct);
 2292 
 2293                 if (!refcount)
 2294                         oct->fn_list.soft_reset(oct);
 2295 
 2296                 lio_unmap_pci_barx(oct, 0);
 2297                 lio_unmap_pci_barx(oct, 1);
 2298 
 2299                 /* fallthrough */
 2300         case LIO_DEV_PCI_ENABLE_DONE:
 2301                 /* Disable the device, releasing the PCI INT */
 2302                 pci_disable_busmaster(oct->device);
 2303 
 2304                 /* fallthrough */
 2305         case LIO_DEV_BEGIN_STATE:
 2306                 break;
 2307         }       /* end switch (oct->status) */
 2308 }

Cache object: bd8a488fc05c164feddcbbfe54d1dfe0


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