1 /*
   2  * Copyright (c) 2008-2016 Solarflare Communications Inc.
   3  * All rights reserved.
   4  *
   5  * Redistribution and use in source and binary forms, with or without
   6  * modification, are permitted provided that the following conditions are met:
   7  *
   8  * 1. Redistributions of source code must retain the above copyright notice,
   9  *    this list of conditions and the following disclaimer.
  10  * 2. Redistributions in binary form must reproduce the above copyright notice,
  11  *    this list of conditions and the following disclaimer in the documentation
  12  *    and/or other materials provided with the distribution.
  13  *
  14  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  15  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  16  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  17  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
  21  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  22  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  23  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  24  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  25  *
  26  * The views and conclusions contained in the software and documentation are
  27  * those of the authors and should not be interpreted as representing official
  28  * policies, either expressed or implied, of the FreeBSD Project.
  29  */
  30 
  31 #include <sys/types.h>
  32 #include <sys/ddi.h>
  33 #include <sys/sunddi.h>
  34 #include <sys/stream.h>
  35 #include <sys/dlpi.h>
  36 
  37 #include "sfxge.h"
  38 
  39 int
  40 sfxge_bar_init(sfxge_t *sp)
  41 {
  42         efsys_bar_t *esbp = &(sp->s_bar);
  43         ddi_device_acc_attr_t devacc;
  44         int rc;
  45 
  46         devacc.devacc_attr_version = DDI_DEVICE_ATTR_V0;
  47         devacc.devacc_attr_endian_flags = DDI_NEVERSWAP_ACC;
  48         devacc.devacc_attr_dataorder = DDI_STRICTORDER_ACC;
  49 
  50         if (ddi_regs_map_setup(sp->s_dip, EFX_MEM_BAR, &(esbp->esb_base), 0, 0,
  51             &devacc, &(esbp->esb_handle)) != DDI_SUCCESS) {
  52                 rc = ENODEV;
  53                 goto fail1;
  54         }
  55 
  56         mutex_init(&(esbp->esb_lock), NULL, MUTEX_DRIVER, NULL);
  57 
  58         return (0);
  59 
  60 fail1:
  61         DTRACE_PROBE1(fail1, int, rc);
  62 
  63         return (rc);
  64 }
  65 
  66 void
  67 sfxge_bar_fini(sfxge_t *sp)
  68 {
  69         efsys_bar_t *esbp = &(sp->s_bar);
  70 
  71         ddi_regs_map_free(&(esbp->esb_handle));
  72 
  73         mutex_destroy(&(esbp->esb_lock));
  74 
  75         esbp->esb_base = NULL;
  76         esbp->esb_handle = NULL;
  77 }