usr/src/uts/intel/io/vmxnet3s/vmxnet3_main.c
author Sebastien Roy <seb@delphix.com>
Sun, 03 May 2015 18:26:55 +0100
changeset 14277 711401aaa206
parent 13976 814bae19b8a2
permissions -rw-r--r--
Delphix vmxnet3s fixes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13976
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
     1
/*********************************************************
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
     2
 * Copyright (C) 2007 VMware, Inc. All rights reserved.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
     3
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the Common
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
     5
 * Development and Distribution License (the "License") version 1.0
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
     6
 * and no later version.  You may not use this file except in
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
     7
 * compliance with the License.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
     8
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
     9
 * You can obtain a copy of the License at
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    10
 *         http://www.opensource.org/licenses/cddl1.php
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    11
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    12
 * See the License for the specific language governing permissions
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    13
 * and limitations under the License.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    14
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    15
 *********************************************************/
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    16
/*
14277
711401aaa206 Delphix vmxnet3s fixes
Sebastien Roy <seb@delphix.com>
parents: 13976
diff changeset
    17
 * Copyright (c) 2012, 2014 by Delphix. All rights reserved.
13976
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    18
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    19
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    20
#include <vmxnet3_solaris.h>
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    21
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    22
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    23
 * This driver is based on VMware's version 261024, and contains additional
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    24
 * enhancements (see README.txt).
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    25
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    26
#define	BUILD_NUMBER_NUMERIC		261024
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    27
#define	BUILD_NUMBER_NUMERIC_STRING	"261024-il1"
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    28
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    29
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    30
 * TODO:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    31
 *    - Tx data ring
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    32
 *    - MAC_CAPAB_POLL support
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    33
 *    - JF support
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    34
 *    - Dynamic RX pool
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    35
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    36
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    37
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    38
 * Forward declarations
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    39
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    40
static int       vmxnet3_getstat(void *, uint_t, uint64_t *);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    41
static int       vmxnet3_start(void *);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    42
static void      vmxnet3_stop(void *);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    43
static int       vmxnet3_setpromisc(void *, boolean_t);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    44
static void      vmxnet3_ioctl(void *arg, queue_t *wq, mblk_t *mp);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    45
static int       vmxnet3_multicst(void *, boolean_t, const uint8_t *);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    46
static int       vmxnet3_unicst(void *, const uint8_t *);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    47
static boolean_t vmxnet3_getcapab(void *, mac_capab_t, void *);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    48
static int       vmxnet3_setmacprop(void *, const char *, mac_prop_id_t, uint_t,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    49
                                 const void *);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    50
static void      vmxnet3_macpropinfo(void *, const char *, mac_prop_id_t,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    51
                                  mac_prop_info_handle_t);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    52
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    53
int vmxnet3_debug_level;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    54
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    55
/* MAC callbacks */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    56
static mac_callbacks_t vmxnet3_mac_callbacks = {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    57
   .mc_callbacks = MC_GETCAPAB | MC_IOCTL | MC_SETPROP | MC_PROPINFO,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    58
   .mc_getstat = vmxnet3_getstat,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    59
   .mc_start = vmxnet3_start,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    60
   .mc_stop = vmxnet3_stop,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    61
   .mc_setpromisc = vmxnet3_setpromisc,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    62
   .mc_multicst = vmxnet3_multicst,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    63
   .mc_unicst = vmxnet3_unicst,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    64
   .mc_tx = vmxnet3_tx,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    65
   .mc_ioctl = vmxnet3_ioctl,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    66
   .mc_getcapab = vmxnet3_getcapab,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    67
   .mc_setprop = vmxnet3_setmacprop,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    68
   .mc_propinfo = vmxnet3_macpropinfo
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    69
};
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    70
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    71
/* Tx DMA engine description */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    72
static ddi_dma_attr_t vmxnet3_dma_attrs_tx = {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    73
   DMA_ATTR_V0,           /* dma_attr_version */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    74
   0x0000000000000000ull, /* dma_attr_addr_lo */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    75
   0xFFFFFFFFFFFFFFFFull, /* dma_attr_addr_hi */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    76
   0xFFFFFFFFFFFFFFFFull, /* dma_attr_count_max */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    77
   0x0000000000000001ull, /* dma_attr_align */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    78
   0x0000000000000001ull, /* dma_attr_burstsizes */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    79
   0x00000001,            /* dma_attr_minxfer */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    80
   0x000000000000FFFFull, /* dma_attr_maxxfer */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    81
   0xFFFFFFFFFFFFFFFFull, /* dma_attr_seg */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    82
   -1,                    /* dma_attr_sgllen */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    83
   0x00000001,            /* dma_attr_granular */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    84
   0                      /* dma_attr_flags */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    85
};
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    86
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    87
/* --- */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    88
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    89
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    90
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    91
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    92
 * vmxnet3_getstat --
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    93
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    94
 *    Fetch the statistics of a vmxnet3 device.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    95
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    96
 * Results:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    97
 *    DDI_FAILURE.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    98
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
    99
 * Side effects:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   100
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   101
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   102
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   103
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   104
static int
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   105
vmxnet3_getstat(void *data, uint_t stat, uint64_t *val)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   106
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   107
   vmxnet3_softc_t *dp = data;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   108
   UPT1_TxStats *txStats;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   109
   UPT1_RxStats *rxStats;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   110
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   111
   VMXNET3_DEBUG(dp, 3, "getstat(%u)\n", stat);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   112
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   113
   if (!dp->devEnabled) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   114
      return DDI_FAILURE;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   115
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   116
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   117
   txStats = &VMXNET3_TQDESC(dp)->stats;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   118
   rxStats = &VMXNET3_RQDESC(dp)->stats;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   119
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   120
   /*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   121
    * First touch the related register
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   122
    */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   123
   switch (stat) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   124
      case MAC_STAT_MULTIRCV:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   125
      case MAC_STAT_BRDCSTRCV:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   126
      case MAC_STAT_MULTIXMT:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   127
      case MAC_STAT_BRDCSTXMT:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   128
      case MAC_STAT_NORCVBUF:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   129
      case MAC_STAT_IERRORS:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   130
      case MAC_STAT_NOXMTBUF:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   131
      case MAC_STAT_OERRORS:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   132
      case MAC_STAT_RBYTES:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   133
      case MAC_STAT_IPACKETS:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   134
      case MAC_STAT_OBYTES:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   135
      case MAC_STAT_OPACKETS:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   136
         VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_CMD, VMXNET3_CMD_GET_STATS);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   137
         break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   138
      case MAC_STAT_IFSPEED:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   139
      case MAC_STAT_COLLISIONS:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   140
      case ETHER_STAT_LINK_DUPLEX:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   141
         /* nothing */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   142
         break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   143
      default:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   144
         return DDI_FAILURE;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   145
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   146
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   147
   /*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   148
    * Then fetch the corresponding stat
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   149
    */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   150
   switch (stat) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   151
      case MAC_STAT_IFSPEED:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   152
         *val = dp->linkSpeed;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   153
         break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   154
      case MAC_STAT_MULTIRCV:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   155
         *val = rxStats->mcastPktsRxOK;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   156
         break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   157
      case MAC_STAT_BRDCSTRCV:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   158
         *val = rxStats->bcastPktsRxOK;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   159
         break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   160
      case MAC_STAT_MULTIXMT:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   161
         *val = txStats->mcastPktsTxOK;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   162
         break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   163
      case MAC_STAT_BRDCSTXMT:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   164
         *val = txStats->bcastPktsTxOK;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   165
         break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   166
      case MAC_STAT_NORCVBUF:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   167
         *val = rxStats->pktsRxOutOfBuf + dp->rx_alloc_failed;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   168
         break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   169
      case MAC_STAT_IERRORS:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   170
         *val = rxStats->pktsRxError;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   171
         break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   172
      case MAC_STAT_NOXMTBUF:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   173
         *val = txStats->pktsTxDiscard + dp->tx_pullup_failed;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   174
         break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   175
      case MAC_STAT_OERRORS:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   176
         *val = txStats->pktsTxError + dp->tx_error;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   177
         break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   178
      case MAC_STAT_COLLISIONS:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   179
         *val = 0;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   180
         break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   181
      case MAC_STAT_RBYTES:
14277
711401aaa206 Delphix vmxnet3s fixes
Sebastien Roy <seb@delphix.com>
parents: 13976
diff changeset
   182
         *val = rxStats->ucastBytesRxOK +
13976
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   183
                rxStats->mcastBytesRxOK +
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   184
                rxStats->bcastBytesRxOK;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   185
         break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   186
      case MAC_STAT_IPACKETS:
14277
711401aaa206 Delphix vmxnet3s fixes
Sebastien Roy <seb@delphix.com>
parents: 13976
diff changeset
   187
         *val = rxStats->ucastPktsRxOK +
13976
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   188
                rxStats->mcastPktsRxOK +
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   189
                rxStats->bcastPktsRxOK;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   190
         break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   191
      case MAC_STAT_OBYTES:
14277
711401aaa206 Delphix vmxnet3s fixes
Sebastien Roy <seb@delphix.com>
parents: 13976
diff changeset
   192
         *val = txStats->ucastBytesTxOK +
13976
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   193
                txStats->mcastBytesTxOK +
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   194
                txStats->bcastBytesTxOK;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   195
         break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   196
      case MAC_STAT_OPACKETS:
14277
711401aaa206 Delphix vmxnet3s fixes
Sebastien Roy <seb@delphix.com>
parents: 13976
diff changeset
   197
         *val = txStats->ucastPktsTxOK +
13976
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   198
                txStats->mcastPktsTxOK +
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   199
                txStats->bcastPktsTxOK;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   200
         break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   201
      case ETHER_STAT_LINK_DUPLEX:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   202
         *val = LINK_DUPLEX_FULL;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   203
         break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   204
      default:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   205
         ASSERT(B_FALSE);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   206
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   207
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   208
   return DDI_SUCCESS;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   209
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   210
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   211
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   212
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   213
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   214
 * vmxnet3_prepare_drivershared --
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   215
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   216
 *    Allocate and initialize the shared data structures
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   217
 *    of a vmxnet3 device.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   218
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   219
 * Results:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   220
 *    DDI_SUCCESS or DDI_FAILURE.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   221
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   222
 * Side effects:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   223
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   224
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   225
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   226
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   227
static int
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   228
vmxnet3_prepare_drivershared(vmxnet3_softc_t *dp)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   229
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   230
   Vmxnet3_DriverShared *ds;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   231
   size_t allocSize = sizeof(Vmxnet3_DriverShared);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   232
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   233
   if (vmxnet3_alloc_dma_mem_1(dp, &dp->sharedData, allocSize,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   234
                               B_TRUE) != DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   235
      return DDI_FAILURE;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   236
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   237
   ds = VMXNET3_DS(dp);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   238
   (void) memset(ds, 0, allocSize);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   239
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   240
   allocSize = sizeof(Vmxnet3_TxQueueDesc) + sizeof(Vmxnet3_RxQueueDesc);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   241
   if (vmxnet3_alloc_dma_mem_128(dp, &dp->queueDescs, allocSize,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   242
                                 B_TRUE) != DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   243
      vmxnet3_free_dma_mem(&dp->sharedData);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   244
      return DDI_FAILURE;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   245
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   246
   (void) memset(dp->queueDescs.buf, 0, allocSize);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   247
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   248
   ds->magic = VMXNET3_REV1_MAGIC;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   249
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   250
   /* Take care of most of devRead */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   251
   ds->devRead.misc.driverInfo.version = BUILD_NUMBER_NUMERIC;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   252
#ifdef _LP64
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   253
   ds->devRead.misc.driverInfo.gos.gosBits = VMXNET3_GOS_BITS_64;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   254
#else
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   255
   ds->devRead.misc.driverInfo.gos.gosBits = VMXNET3_GOS_BITS_32;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   256
#endif
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   257
   ds->devRead.misc.driverInfo.gos.gosType = VMXNET3_GOS_TYPE_SOLARIS;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   258
   ds->devRead.misc.driverInfo.gos.gosVer = 10;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   259
   ds->devRead.misc.driverInfo.vmxnet3RevSpt = 1;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   260
   ds->devRead.misc.driverInfo.uptVerSpt = 1;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   261
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   262
   ds->devRead.misc.uptFeatures = UPT1_F_RXCSUM;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   263
   ds->devRead.misc.mtu = dp->cur_mtu;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   264
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   265
   // XXX: ds->devRead.misc.maxNumRxSG
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   266
   ds->devRead.misc.numTxQueues = 1;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   267
   ds->devRead.misc.numRxQueues = 1;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   268
   ds->devRead.misc.queueDescPA = dp->queueDescs.bufPA;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   269
   ds->devRead.misc.queueDescLen = allocSize;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   270
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   271
   /* TxQueue and RxQueue information is filled in other functions */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   272
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   273
   ds->devRead.intrConf.autoMask = (dp->intrMaskMode == VMXNET3_IMM_AUTO);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   274
   ds->devRead.intrConf.numIntrs = 1;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   275
   // XXX: ds->intr.modLevels
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   276
   ds->devRead.intrConf.eventIntrIdx = 0;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   277
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   278
   VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_DSAL, VMXNET3_ADDR_LO(dp->sharedData.bufPA));
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   279
   VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_DSAH, VMXNET3_ADDR_HI(dp->sharedData.bufPA));
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   280
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   281
   return DDI_SUCCESS;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   282
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   283
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   284
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   285
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   286
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   287
 * vmxnet3_destroy_drivershared --
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   288
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   289
 *    Destroy the shared data structures of a vmxnet3 device.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   290
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   291
 * Results:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   292
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   293
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   294
 * Side effects:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   295
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   296
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   297
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   298
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   299
static void
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   300
vmxnet3_destroy_drivershared(vmxnet3_softc_t *dp)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   301
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   302
   VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_DSAL, 0);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   303
   VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_DSAH, 0);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   304
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   305
   vmxnet3_free_dma_mem(&dp->queueDescs);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   306
   vmxnet3_free_dma_mem(&dp->sharedData);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   307
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   308
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   309
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   310
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   311
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   312
 * vmxnet3_alloc_cmdring --
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   313
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   314
 *    Allocate and initialize the command ring of a queue.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   315
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   316
 * Results:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   317
 *    DDI_SUCCESS or DDI_FAILURE.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   318
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   319
 * Side effects:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   320
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   321
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   322
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   323
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   324
static int
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   325
vmxnet3_alloc_cmdring(vmxnet3_softc_t *dp, vmxnet3_cmdring_t *cmdRing)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   326
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   327
   size_t ringSize = cmdRing->size * sizeof(Vmxnet3_TxDesc);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   328
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   329
   if (vmxnet3_alloc_dma_mem_512(dp, &cmdRing->dma, ringSize,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   330
                                 B_TRUE) != DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   331
      return DDI_FAILURE;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   332
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   333
   (void) memset(cmdRing->dma.buf, 0, ringSize);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   334
   cmdRing->avail = cmdRing->size;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   335
   cmdRing->next2fill = 0;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   336
   cmdRing->gen = VMXNET3_INIT_GEN;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   337
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   338
   return DDI_SUCCESS;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   339
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   340
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   341
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   342
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   343
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   344
 * vmxnet3_alloc_compring --
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   345
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   346
 *    Allocate and initialize the completion ring of a queue.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   347
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   348
 * Results:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   349
 *    DDI_SUCCESS or DDI_FAILURE.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   350
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   351
 * Side effects:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   352
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   353
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   354
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   355
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   356
static int
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   357
vmxnet3_alloc_compring(vmxnet3_softc_t *dp, vmxnet3_compring_t *compRing)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   358
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   359
   size_t ringSize = compRing->size * sizeof(Vmxnet3_TxCompDesc);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   360
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   361
   if (vmxnet3_alloc_dma_mem_512(dp, &compRing->dma, ringSize,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   362
                                 B_TRUE) != DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   363
      return DDI_FAILURE;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   364
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   365
   (void) memset(compRing->dma.buf, 0, ringSize);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   366
   compRing->next2comp = 0;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   367
   compRing->gen = VMXNET3_INIT_GEN;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   368
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   369
   return DDI_SUCCESS;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   370
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   371
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   372
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   373
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   374
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   375
 * vmxnet3_prepare_txqueue --
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   376
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   377
 *    Initialize the tx queue of a vmxnet3 device.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   378
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   379
 * Results:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   380
 *    DDI_SUCCESS or DDI_FAILURE.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   381
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   382
 * Side effects:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   383
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   384
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   385
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   386
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   387
static int
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   388
vmxnet3_prepare_txqueue(vmxnet3_softc_t *dp)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   389
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   390
   Vmxnet3_TxQueueDesc *tqdesc = VMXNET3_TQDESC(dp);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   391
   vmxnet3_txqueue_t *txq = &dp->txQueue;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   392
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   393
   ASSERT(!(txq->cmdRing.size & VMXNET3_RING_SIZE_MASK));
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   394
   ASSERT(!(txq->compRing.size & VMXNET3_RING_SIZE_MASK));
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   395
   ASSERT(!txq->cmdRing.dma.buf && !txq->compRing.dma.buf);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   396
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   397
   if (vmxnet3_alloc_cmdring(dp, &txq->cmdRing) != DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   398
      goto error;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   399
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   400
   tqdesc->conf.txRingBasePA = txq->cmdRing.dma.bufPA;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   401
   tqdesc->conf.txRingSize = txq->cmdRing.size;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   402
   tqdesc->conf.dataRingBasePA = 0;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   403
   tqdesc->conf.dataRingSize = 0;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   404
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   405
   if (vmxnet3_alloc_compring(dp, &txq->compRing) != DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   406
      goto error_cmdring;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   407
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   408
   tqdesc->conf.compRingBasePA = txq->compRing.dma.bufPA;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   409
   tqdesc->conf.compRingSize = txq->compRing.size;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   410
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   411
   txq->metaRing = kmem_zalloc(txq->cmdRing.size*sizeof(vmxnet3_metatx_t),
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   412
                               KM_SLEEP);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   413
   ASSERT(txq->metaRing);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   414
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   415
   if (vmxnet3_txqueue_init(dp, txq) != DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   416
      goto error_mpring;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   417
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   418
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   419
   return DDI_SUCCESS;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   420
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   421
error_mpring:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   422
   kmem_free(txq->metaRing, txq->cmdRing.size*sizeof(vmxnet3_metatx_t));
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   423
   vmxnet3_free_dma_mem(&txq->compRing.dma);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   424
error_cmdring:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   425
   vmxnet3_free_dma_mem(&txq->cmdRing.dma);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   426
error:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   427
   return DDI_FAILURE;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   428
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   429
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   430
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   431
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   432
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   433
 * vmxnet3_prepare_rxqueue --
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   434
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   435
 *    Initialize the rx queue of a vmxnet3 device.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   436
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   437
 * Results:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   438
 *    DDI_SUCCESS or DDI_FAILURE.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   439
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   440
 * Side effects:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   441
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   442
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   443
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   444
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   445
static int
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   446
vmxnet3_prepare_rxqueue(vmxnet3_softc_t *dp)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   447
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   448
   Vmxnet3_RxQueueDesc *rqdesc = VMXNET3_RQDESC(dp);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   449
   vmxnet3_rxqueue_t *rxq = &dp->rxQueue;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   450
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   451
   ASSERT(!(rxq->cmdRing.size & VMXNET3_RING_SIZE_MASK));
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   452
   ASSERT(!(rxq->compRing.size & VMXNET3_RING_SIZE_MASK));
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   453
   ASSERT(!rxq->cmdRing.dma.buf && !rxq->compRing.dma.buf);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   454
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   455
   if (vmxnet3_alloc_cmdring(dp, &rxq->cmdRing) != DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   456
      goto error;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   457
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   458
   rqdesc->conf.rxRingBasePA[0] = rxq->cmdRing.dma.bufPA;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   459
   rqdesc->conf.rxRingSize[0] = rxq->cmdRing.size;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   460
   rqdesc->conf.rxRingBasePA[1] = 0;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   461
   rqdesc->conf.rxRingSize[1] = 0;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   462
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   463
   if (vmxnet3_alloc_compring(dp, &rxq->compRing) != DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   464
      goto error_cmdring;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   465
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   466
   rqdesc->conf.compRingBasePA = rxq->compRing.dma.bufPA;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   467
   rqdesc->conf.compRingSize = rxq->compRing.size;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   468
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   469
   rxq->bufRing = kmem_zalloc(rxq->cmdRing.size*sizeof(vmxnet3_bufdesc_t),
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   470
                              KM_SLEEP);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   471
   ASSERT(rxq->bufRing);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   472
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   473
   if (vmxnet3_rxqueue_init(dp, rxq) != DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   474
      goto error_bufring;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   475
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   476
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   477
   return DDI_SUCCESS;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   478
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   479
error_bufring:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   480
   kmem_free(rxq->bufRing, rxq->cmdRing.size*sizeof(vmxnet3_bufdesc_t));
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   481
   vmxnet3_free_dma_mem(&rxq->compRing.dma);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   482
error_cmdring:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   483
   vmxnet3_free_dma_mem(&rxq->cmdRing.dma);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   484
error:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   485
   return DDI_FAILURE;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   486
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   487
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   488
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   489
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   490
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   491
 * vmxnet3_destroy_txqueue --
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   492
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   493
 *    Destroy the tx queue of a vmxnet3 device.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   494
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   495
 * Results:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   496
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   497
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   498
 * Side effects:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   499
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   500
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   501
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   502
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   503
static void
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   504
vmxnet3_destroy_txqueue(vmxnet3_softc_t *dp)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   505
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   506
   vmxnet3_txqueue_t *txq = &dp->txQueue;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   507
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   508
   ASSERT(txq->metaRing);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   509
   ASSERT(txq->cmdRing.dma.buf && txq->compRing.dma.buf);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   510
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   511
   vmxnet3_txqueue_fini(dp, txq);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   512
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   513
   kmem_free(txq->metaRing, txq->cmdRing.size*sizeof(vmxnet3_metatx_t));
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   514
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   515
   vmxnet3_free_dma_mem(&txq->cmdRing.dma);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   516
   vmxnet3_free_dma_mem(&txq->compRing.dma);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   517
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   518
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   519
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   520
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   521
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   522
 * vmxnet3_destroy_rxqueue --
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   523
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   524
 *    Destroy the rx queue of a vmxnet3 device.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   525
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   526
 * Results:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   527
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   528
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   529
 * Side effects:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   530
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   531
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   532
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   533
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   534
static void
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   535
vmxnet3_destroy_rxqueue(vmxnet3_softc_t *dp)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   536
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   537
   vmxnet3_rxqueue_t *rxq = &dp->rxQueue;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   538
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   539
   ASSERT(rxq->bufRing);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   540
   ASSERT(rxq->cmdRing.dma.buf && rxq->compRing.dma.buf);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   541
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   542
   vmxnet3_rxqueue_fini(dp, rxq);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   543
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   544
   kmem_free(rxq->bufRing, rxq->cmdRing.size*sizeof(vmxnet3_bufdesc_t));
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   545
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   546
   vmxnet3_free_dma_mem(&rxq->cmdRing.dma);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   547
   vmxnet3_free_dma_mem(&rxq->compRing.dma);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   548
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   549
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   550
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   551
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   552
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   553
 * vmxnet3_refresh_rxfilter --
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   554
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   555
 *    Apply new RX filters settings to a vmxnet3 device.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   556
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   557
 * Results:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   558
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   559
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   560
 * Side effects:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   561
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   562
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   563
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   564
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   565
static void
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   566
vmxnet3_refresh_rxfilter(vmxnet3_softc_t *dp)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   567
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   568
   Vmxnet3_DriverShared *ds = VMXNET3_DS(dp);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   569
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   570
   ds->devRead.rxFilterConf.rxMode = dp->rxMode;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   571
   VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_CMD, VMXNET3_CMD_UPDATE_RX_MODE);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   572
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   573
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   574
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   575
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   576
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   577
 * vmxnet3_refresh_linkstate --
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   578
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   579
 *    Fetch the link state of a vmxnet3 device.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   580
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   581
 * Results:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   582
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   583
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   584
 * Side effects:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   585
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   586
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   587
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   588
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   589
static void
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   590
vmxnet3_refresh_linkstate(vmxnet3_softc_t *dp)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   591
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   592
   uint32_t ret32;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   593
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   594
   VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_CMD, VMXNET3_CMD_GET_LINK);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   595
   ret32 = VMXNET3_BAR1_GET32(dp, VMXNET3_REG_CMD);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   596
   if (ret32 & 1) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   597
      dp->linkState = LINK_STATE_UP;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   598
      dp->linkSpeed = (ret32 >> 16) * 1000000ULL;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   599
   } else {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   600
      dp->linkState = LINK_STATE_DOWN;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   601
      dp->linkSpeed = 0;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   602
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   603
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   604
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   605
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   606
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   607
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   608
 * vmxnet3_start --
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   609
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   610
 *    Start a vmxnet3 device: allocate and initialize the shared data
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   611
 *    structures and send a start command to the device.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   612
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   613
 * Results:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   614
 *    DDI_SUCCESS or DDI_FAILURE.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   615
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   616
 * Side effects:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   617
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   618
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   619
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   620
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   621
static int
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   622
vmxnet3_start(void *data)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   623
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   624
   vmxnet3_softc_t *dp = data;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   625
   Vmxnet3_TxQueueDesc *tqdesc;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   626
   Vmxnet3_RxQueueDesc *rqdesc;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   627
   int txQueueSize, rxQueueSize;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   628
   uint32_t ret32;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   629
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   630
   VMXNET3_DEBUG(dp, 1, "start()\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   631
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   632
   /*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   633
    * Allocate vmxnet3's shared data and advertise its PA
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   634
    */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   635
   if (vmxnet3_prepare_drivershared(dp) != DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   636
      VMXNET3_WARN(dp, "vmxnet3_prepare_drivershared() failed\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   637
      goto error;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   638
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   639
   tqdesc = VMXNET3_TQDESC(dp);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   640
   rqdesc = VMXNET3_RQDESC(dp);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   641
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   642
   /*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   643
    * Create and initialize the tx queue
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   644
    */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   645
   txQueueSize = vmxnet3_getprop(dp, "TxRingSize", 32, 4096,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   646
                                 VMXNET3_DEF_TX_RING_SIZE);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   647
   if (!(txQueueSize & VMXNET3_RING_SIZE_MASK)) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   648
      dp->txQueue.cmdRing.size = txQueueSize;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   649
      dp->txQueue.compRing.size = txQueueSize;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   650
      dp->txQueue.sharedCtrl = &tqdesc->ctrl;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   651
      if (vmxnet3_prepare_txqueue(dp) != DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   652
         VMXNET3_WARN(dp, "vmxnet3_prepare_txqueue() failed\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   653
         goto error_shared_data;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   654
      }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   655
   } else {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   656
      VMXNET3_WARN(dp, "invalid tx ring size (%d)\n", txQueueSize);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   657
      goto error_shared_data;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   658
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   659
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   660
   /*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   661
    * Create and initialize the rx queue
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   662
    */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   663
   rxQueueSize = vmxnet3_getprop(dp, "RxRingSize", 32, 4096,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   664
                                 VMXNET3_DEF_RX_RING_SIZE);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   665
   if (!(rxQueueSize & VMXNET3_RING_SIZE_MASK)) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   666
      dp->rxQueue.cmdRing.size = rxQueueSize;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   667
      dp->rxQueue.compRing.size = rxQueueSize;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   668
      dp->rxQueue.sharedCtrl = &rqdesc->ctrl;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   669
      if (vmxnet3_prepare_rxqueue(dp) != DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   670
         VMXNET3_WARN(dp, "vmxnet3_prepare_rxqueue() failed\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   671
         goto error_tx_queue;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   672
      }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   673
   } else {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   674
      VMXNET3_WARN(dp, "invalid rx ring size (%d)\n", rxQueueSize);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   675
      goto error_tx_queue;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   676
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   677
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   678
   /*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   679
    * Allocate the Tx DMA handle
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   680
    */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   681
   if (ddi_dma_alloc_handle(dp->dip, &vmxnet3_dma_attrs_tx, DDI_DMA_SLEEP,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   682
                            NULL, &dp->txDmaHandle) != DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   683
      VMXNET3_WARN(dp, "ddi_dma_alloc_handle() failed\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   684
      goto error_rx_queue;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   685
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   686
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   687
   /*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   688
    * Activate the device
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   689
    */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   690
   VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_CMD, VMXNET3_CMD_ACTIVATE_DEV);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   691
   ret32 = VMXNET3_BAR1_GET32(dp, VMXNET3_REG_CMD);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   692
   if (ret32) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   693
      VMXNET3_WARN(dp, "ACTIVATE_DEV failed: 0x%x\n", ret32);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   694
      goto error_txhandle;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   695
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   696
   dp->devEnabled = B_TRUE;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   697
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   698
   VMXNET3_BAR0_PUT32(dp, VMXNET3_REG_RXPROD, dp->txQueue.cmdRing.size - 1);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   699
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   700
   /*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   701
    * Update the RX filters, must be done after ACTIVATE_DEV
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   702
    */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   703
   dp->rxMode = VMXNET3_RXM_UCAST | VMXNET3_RXM_BCAST;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   704
   vmxnet3_refresh_rxfilter(dp);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   705
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   706
   /*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   707
    * Get the link state now because no events will be generated
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   708
    */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   709
   vmxnet3_refresh_linkstate(dp);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   710
   mac_link_update(dp->mac, dp->linkState);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   711
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   712
   /*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   713
    * Finally, unmask the interrupt
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   714
    */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   715
   VMXNET3_BAR0_PUT32(dp, VMXNET3_REG_IMR, 0);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   716
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   717
   return DDI_SUCCESS;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   718
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   719
error_txhandle:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   720
   ddi_dma_free_handle(&dp->txDmaHandle);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   721
error_rx_queue:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   722
   vmxnet3_destroy_rxqueue(dp);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   723
error_tx_queue:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   724
   vmxnet3_destroy_txqueue(dp);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   725
error_shared_data:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   726
   vmxnet3_destroy_drivershared(dp);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   727
error:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   728
   return DDI_FAILURE;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   729
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   730
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   731
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   732
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   733
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   734
 * vmxnet3_stop --
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   735
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   736
 *    Stop a vmxnet3 device: send a stop command to the device and
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   737
 *    de-allocate the shared data structures.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   738
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   739
 * Results:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   740
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   741
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   742
 * Side effects:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   743
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   744
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   745
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   746
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   747
static void
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   748
vmxnet3_stop(void *data)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   749
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   750
   vmxnet3_softc_t *dp = data;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   751
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   752
   VMXNET3_DEBUG(dp, 1, "stop()\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   753
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   754
   /*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   755
    * Take the 2 locks related to asynchronous events.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   756
    * These events should always check dp->devEnabled before poking dp.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   757
    */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   758
   mutex_enter(&dp->intrLock);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   759
   mutex_enter(&dp->rxPoolLock);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   760
   VMXNET3_BAR0_PUT32(dp, VMXNET3_REG_IMR, 1);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   761
   dp->devEnabled = B_FALSE;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   762
   VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_CMD, VMXNET3_CMD_QUIESCE_DEV);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   763
   mutex_exit(&dp->rxPoolLock);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   764
   mutex_exit(&dp->intrLock);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   765
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   766
   ddi_dma_free_handle(&dp->txDmaHandle);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   767
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   768
   vmxnet3_destroy_rxqueue(dp);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   769
   vmxnet3_destroy_txqueue(dp);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   770
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   771
   vmxnet3_destroy_drivershared(dp);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   772
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   773
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   774
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   775
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   776
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   777
 * vmxnet3_setpromisc --
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   778
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   779
 *    Set or unset promiscuous mode on a vmxnet3 device.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   780
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   781
 * Results:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   782
 *    DDI_SUCCESS.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   783
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   784
 * Side effects:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   785
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   786
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   787
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   788
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   789
static int
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   790
vmxnet3_setpromisc(void *data, boolean_t promisc)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   791
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   792
   vmxnet3_softc_t *dp = data;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   793
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   794
   VMXNET3_DEBUG(dp, 2, "setpromisc(%s)\n", promisc ? "TRUE" : "FALSE");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   795
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   796
   if (promisc) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   797
      dp->rxMode |= VMXNET3_RXM_PROMISC;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   798
   } else {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   799
      dp->rxMode &= ~VMXNET3_RXM_PROMISC;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   800
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   801
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   802
   vmxnet3_refresh_rxfilter(dp);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   803
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   804
   return DDI_SUCCESS;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   805
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   806
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   807
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   808
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   809
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   810
 * vmxnet3_multicst --
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   811
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   812
 *    Add or remove a multicast address from/to a vmxnet3 device.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   813
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   814
 * Results:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   815
 *    DDI_FAILURE.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   816
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   817
 * Side effects:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   818
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   819
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   820
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   821
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   822
static int
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   823
vmxnet3_multicst(void *data, boolean_t add, const uint8_t *macaddr)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   824
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   825
   vmxnet3_softc_t *dp = data;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   826
   vmxnet3_dmabuf_t newMfTable;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   827
   int ret = DDI_SUCCESS;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   828
   uint16_t macIdx;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   829
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   830
   VMXNET3_DEBUG(dp, 2, "multicst(%s, "MACADDR_FMT")\n",
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   831
                 add ? "add" : "remove",
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   832
                 MACADDR_FMT_ARGS(macaddr));
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   833
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   834
   /*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   835
    * First lookup the position of the given MAC to check if it is
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   836
    * present in the existing MF table.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   837
    */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   838
   for (macIdx = 0; macIdx < dp->mfTable.bufLen; macIdx += 6) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   839
      if (memcmp(&dp->mfTable.buf[macIdx], macaddr, 6) == 0) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   840
         break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   841
      }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   842
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   843
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   844
   /*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   845
    * Check for 2 situations we can handle gracefully by bailing out:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   846
    * Adding an already existing filter or removing a non-existing one.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   847
    */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   848
   if (add && macIdx < dp->mfTable.bufLen) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   849
      VMXNET3_WARN(dp, MACADDR_FMT " already in MC filter list @ %u\n",
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   850
                   MACADDR_FMT_ARGS(macaddr), macIdx / 6);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   851
      ASSERT(B_FALSE);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   852
      goto done;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   853
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   854
   if (!add && macIdx == dp->mfTable.bufLen) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   855
      VMXNET3_WARN(dp, MACADDR_FMT " not in MC filter list @ %u\n",
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   856
                   MACADDR_FMT_ARGS(macaddr), macIdx / 6);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   857
      ASSERT(B_FALSE);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   858
      goto done;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   859
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   860
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   861
   /*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   862
    * Create the new MF table
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   863
    */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   864
   {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   865
      size_t allocSize = dp->mfTable.bufLen + (add ? 6 : -6);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   866
      if (allocSize) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   867
         ret = vmxnet3_alloc_dma_mem_1(dp, &newMfTable, allocSize, B_TRUE);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   868
         ASSERT(ret == DDI_SUCCESS);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   869
         if (add) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   870
            (void) memcpy(newMfTable.buf, dp->mfTable.buf, dp->mfTable.bufLen);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   871
            (void) memcpy(newMfTable.buf + dp->mfTable.bufLen, macaddr, 6);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   872
         } else {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   873
            (void) memcpy(newMfTable.buf, dp->mfTable.buf, macIdx);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   874
            (void) memcpy(newMfTable.buf + macIdx,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   875
                   dp->mfTable.buf + macIdx + 6,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   876
                   dp->mfTable.bufLen - macIdx - 6);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   877
         }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   878
      } else {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   879
         newMfTable.buf = NULL;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   880
         newMfTable.bufPA = 0;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   881
         newMfTable.bufLen = 0;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   882
      }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   883
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   884
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   885
   /*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   886
    * Now handle 2 corner cases: if we're creating the first filter or
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   887
    * removing the last one, we have to update rxMode accordingly.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   888
    */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   889
   if (add && newMfTable.bufLen == 6) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   890
      ASSERT(!(dp->rxMode & VMXNET3_RXM_MCAST));
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   891
      dp->rxMode |= VMXNET3_RXM_MCAST;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   892
      vmxnet3_refresh_rxfilter(dp);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   893
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   894
   if (!add && dp->mfTable.bufLen == 6) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   895
      ASSERT(newMfTable.buf == NULL);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   896
      ASSERT(dp->rxMode & VMXNET3_RXM_MCAST);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   897
      dp->rxMode &= ~VMXNET3_RXM_MCAST;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   898
      vmxnet3_refresh_rxfilter(dp);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   899
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   900
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   901
   /*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   902
    * Now replace the old MF table with the new one
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   903
    */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   904
   if (dp->mfTable.buf) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   905
      vmxnet3_free_dma_mem(&dp->mfTable);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   906
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   907
   dp->mfTable = newMfTable;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   908
   VMXNET3_DS(dp)->devRead.rxFilterConf.mfTablePA = newMfTable.bufPA;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   909
   VMXNET3_DS(dp)->devRead.rxFilterConf.mfTableLen = newMfTable.bufLen;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   910
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   911
done:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   912
   /* Always update the filters */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   913
   VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_CMD, VMXNET3_CMD_UPDATE_MAC_FILTERS);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   914
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   915
   return ret;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   916
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   917
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   918
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   919
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   920
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   921
 * vmxnet3_unicst --
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   922
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   923
 *    Set the mac address of a vmxnet3 device.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   924
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   925
 * Results:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   926
 *    DDI_FAILURE.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   927
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   928
 * Side effects:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   929
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   930
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   931
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   932
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   933
static int
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   934
vmxnet3_unicst(void *data, const uint8_t *macaddr)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   935
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   936
   vmxnet3_softc_t *dp = data;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   937
   uint32_t val32;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   938
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   939
   VMXNET3_DEBUG(dp, 2, "unicst("MACADDR_FMT")\n",
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   940
                 MACADDR_FMT_ARGS(macaddr));
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   941
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   942
   val32 = *((uint32_t *) (macaddr + 0));
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   943
   VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_MACL, val32);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   944
   val32 = *((uint16_t *) (macaddr + 4));
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   945
   VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_MACH, val32);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   946
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   947
   (void) memcpy(dp->macaddr, macaddr, 6);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   948
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   949
   return DDI_SUCCESS;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   950
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   951
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   952
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   953
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   954
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   955
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   956
 * vmxnet3_change_mtu --
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   957
 *
14277
711401aaa206 Delphix vmxnet3s fixes
Sebastien Roy <seb@delphix.com>
parents: 13976
diff changeset
   958
 *    Change the MTU as seen by the driver. This is only supported when
711401aaa206 Delphix vmxnet3s fixes
Sebastien Roy <seb@delphix.com>
parents: 13976
diff changeset
   959
 *    the mac is stopped.
13976
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   960
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   961
 * Results:
14277
711401aaa206 Delphix vmxnet3s fixes
Sebastien Roy <seb@delphix.com>
parents: 13976
diff changeset
   962
 *    EBUSY if the device is enabled.
711401aaa206 Delphix vmxnet3s fixes
Sebastien Roy <seb@delphix.com>
parents: 13976
diff changeset
   963
 *    EINVAL for invalid MTU values.
711401aaa206 Delphix vmxnet3s fixes
Sebastien Roy <seb@delphix.com>
parents: 13976
diff changeset
   964
 *    0 on success.
13976
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   965
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   966
 * Side effects:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   967
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   968
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   969
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   970
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   971
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   972
static int
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   973
vmxnet3_change_mtu(vmxnet3_softc_t *dp, uint32_t new_mtu)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   974
{
14277
711401aaa206 Delphix vmxnet3s fixes
Sebastien Roy <seb@delphix.com>
parents: 13976
diff changeset
   975
   int ret;
711401aaa206 Delphix vmxnet3s fixes
Sebastien Roy <seb@delphix.com>
parents: 13976
diff changeset
   976
711401aaa206 Delphix vmxnet3s fixes
Sebastien Roy <seb@delphix.com>
parents: 13976
diff changeset
   977
   if (dp->devEnabled)
711401aaa206 Delphix vmxnet3s fixes
Sebastien Roy <seb@delphix.com>
parents: 13976
diff changeset
   978
      return EBUSY;
711401aaa206 Delphix vmxnet3s fixes
Sebastien Roy <seb@delphix.com>
parents: 13976
diff changeset
   979
13976
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   980
   if (new_mtu == dp->cur_mtu) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   981
      VMXNET3_WARN(dp, "New MTU is same as old mtu : %d.\n", new_mtu);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   982
      return 0;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   983
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   984
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   985
   if (new_mtu < VMXNET3_MIN_MTU || new_mtu > VMXNET3_MAX_MTU) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   986
      VMXNET3_WARN(dp, "New MTU not in valid range [%d, %d].\n",
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   987
                   VMXNET3_MIN_MTU, VMXNET3_MAX_MTU);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   988
      return EINVAL;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   989
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   990
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   991
   dp->cur_mtu = new_mtu;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   992
14277
711401aaa206 Delphix vmxnet3s fixes
Sebastien Roy <seb@delphix.com>
parents: 13976
diff changeset
   993
   if ((ret = mac_maxsdu_update(dp->mac, new_mtu)) != 0)
711401aaa206 Delphix vmxnet3s fixes
Sebastien Roy <seb@delphix.com>
parents: 13976
diff changeset
   994
      VMXNET3_WARN(dp, "Unable to update mac with %d mtu: %d", new_mtu, ret);
13976
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   995
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   996
   return ret;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   997
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   998
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
   999
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1000
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1001
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1002
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1003
 * vmxnet3_ioctl --
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1004
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1005
 *    DDI/DDK callback to handle IOCTL in driver. Currently it only handles
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1006
 *    ND_SET ioctl. Rest all are ignored. The ND_SET is used to set/reset
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1007
 *    accept-jumbo ndd parameted for the interface.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1008
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1009
 * Results:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1010
 *    Nothing is returned directly. An ACK or NACK is conveyed to the calling
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1011
 *    function from the mblk which was used to call this function.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1012
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1013
 * Side effects:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1014
 *    MTU can be changed and device can be reset.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1015
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1016
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1017
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1018
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1019
static void
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1020
vmxnet3_ioctl(void *arg, queue_t *wq, mblk_t *mp)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1021
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1022
   vmxnet3_softc_t *dp = arg;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1023
   int             ret = EINVAL;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1024
   IOCP            iocp;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1025
   mblk_t          *mp1;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1026
   char            *valp, *param;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1027
   int             data;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1028
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1029
   iocp = (void *)mp->b_rptr;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1030
   iocp->ioc_error = 0;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1031
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1032
   switch (iocp->ioc_cmd) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1033
   case ND_SET:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1034
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1035
      /* the mblk in continuation would contain the ndd parameter name
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1036
       * and data value to be set
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1037
       */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1038
      mp1 = mp->b_cont;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1039
      if (!mp1) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1040
         VMXNET3_WARN(dp, "Error locating parameter name.\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1041
         ret = EINVAL;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1042
         break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1043
      }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1044
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1045
      mp1->b_datap->db_lim[-1] = '\0';	/* Force null termination */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1046
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1047
      /*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1048
       * From /usr/src/uts/common/inet/nd.c : nd_getset()
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1049
       * "logic throughout nd_xxx assumes single data block for ioctl.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1050
       *  However, existing code sends in some big buffers."
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1051
       */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1052
      if (mp1->b_cont) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1053
         freemsg(mp1->b_cont);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1054
         mp1->b_cont = NULL;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1055
      }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1056
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1057
      valp = (char *)mp1->b_rptr;	/* Points to param name*/
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1058
      ASSERT(valp);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1059
      param = valp;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1060
      VMXNET3_DEBUG(dp, 3, "ND Set ioctl for %s\n", param);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1061
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1062
      /* Go past the end of this null terminated string to get the data value.*/
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1063
      while (*valp && valp <= (char *)mp1->b_wptr)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1064
         valp++;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1065
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1066
      if (valp > (char *)mp1->b_wptr) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1067
         /* We are already beyond the readable area of mblk and still havent
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1068
          * found the end of param string.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1069
          */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1070
         VMXNET3_WARN(dp, "No data value found to be set to param.\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1071
         data = -1;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1072
      } else {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1073
         valp++;                        /* Now this points to data string */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1074
         data = (int)*valp - (int)'0';  /* Get numeric value of first letter */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1075
      }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1076
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1077
      if (strcmp("accept-jumbo", param) == 0) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1078
         if (data == 1) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1079
            VMXNET3_DEBUG(dp, 2, "Accepting jumbo frames\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1080
            ret = vmxnet3_change_mtu(dp, VMXNET3_MAX_MTU);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1081
         } else if (data == 0) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1082
            VMXNET3_DEBUG(dp, 2, "Rejecting jumbo frames\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1083
            ret = vmxnet3_change_mtu(dp, ETHERMTU);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1084
         } else {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1085
            VMXNET3_WARN(dp, "Invalid data value to be set, use 1 or 0.\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1086
            ret = -1;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1087
         }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1088
      }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1089
      freemsg(mp1);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1090
      mp->b_cont = NULL;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1091
      break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1092
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1093
   default:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1094
      if (mp->b_cont) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1095
         freemsg(mp->b_cont);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1096
         mp->b_cont = NULL;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1097
      }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1098
      ret = -1;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1099
      break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1100
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1101
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1102
   if (ret == 0)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1103
      miocack(wq, mp, 0, 0);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1104
   else
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1105
      miocnak(wq, mp, 0, EINVAL);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1106
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1107
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1108
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1109
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1110
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1111
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1112
 * vmxnet3_getcapab --
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1113
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1114
 *    Get the capabilities of a vmxnet3 device.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1115
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1116
 * Results:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1117
 *    B_TRUE or B_FALSE.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1118
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1119
 * Side effects:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1120
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1121
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1122
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1123
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1124
static boolean_t
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1125
vmxnet3_getcapab(void *data, mac_capab_t capab, void *arg)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1126
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1127
   vmxnet3_softc_t *dp = data;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1128
   boolean_t ret;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1129
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1130
   switch (capab) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1131
      case MAC_CAPAB_HCKSUM: {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1132
         uint32_t *txflags = arg;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1133
         *txflags = HCKSUM_INET_PARTIAL;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1134
         ret = B_TRUE;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1135
         break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1136
      }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1137
      case MAC_CAPAB_LSO: {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1138
         mac_capab_lso_t *lso = arg;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1139
         lso->lso_flags = LSO_TX_BASIC_TCP_IPV4;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1140
         lso->lso_basic_tcp_ipv4.lso_max = IP_MAXPACKET;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1141
         ret = vmxnet3_getprop(dp, "EnableLSO", 0, 1, 1);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1142
         break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1143
      }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1144
      default:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1145
         ret = B_FALSE;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1146
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1147
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1148
   VMXNET3_DEBUG(dp, 2, "getcapab(0x%x) -> %s\n", capab, ret ? "yes" : "no");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1149
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1150
   return ret;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1151
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1152
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1153
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1154
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1155
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1156
 * vmxnet3_setmacprop --
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1157
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1158
 *    Set a MAC property.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1159
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1160
 * Results:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1161
 *    0 on success, errno otherwise.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1162
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1163
 * Side effects:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1164
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1165
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1166
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1167
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1168
/* ARGSUSED */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1169
static int
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1170
vmxnet3_setmacprop(void *data, const char *pr_name, mac_prop_id_t pr_num,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1171
                   uint_t pr_valsize, const void *pr_val)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1172
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1173
   vmxnet3_softc_t *dp = data;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1174
   int ret = 0;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1175
   uint32_t newmtu;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1176
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1177
   switch (pr_num) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1178
      case MAC_PROP_MTU:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1179
         (void) memcpy(&newmtu, pr_val, sizeof (newmtu));
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1180
         ret = vmxnet3_change_mtu(dp, newmtu);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1181
         break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1182
      default:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1183
         ret = ENOTSUP;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1184
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1185
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1186
   return ret;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1187
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1188
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1189
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1190
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1191
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1192
 * vmxnet3_macpropinfo --
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1193
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1194
 *    Get MAC property information.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1195
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1196
 * Results:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1197
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1198
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1199
 * Side effects:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1200
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1201
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1202
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1203
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1204
/* ARGSUSED */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1205
static void
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1206
vmxnet3_macpropinfo(void *data, const char *pr_name, mac_prop_id_t pr_num,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1207
                    mac_prop_info_handle_t prh)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1208
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1209
   switch (pr_num) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1210
      case MAC_PROP_MTU:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1211
         mac_prop_info_set_range_uint32(prh, VMXNET3_MIN_MTU, VMXNET3_MAX_MTU);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1212
         break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1213
      default:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1214
	 break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1215
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1216
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1217
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1218
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1219
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1220
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1221
 * vmxnet3_reset --
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1222
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1223
 *    Reset a vmxnet3 device. Only to be used when the device is wedged.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1224
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1225
 * Results:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1226
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1227
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1228
 * Side effects:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1229
 *    The device is reset.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1230
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1231
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1232
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1233
static void
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1234
vmxnet3_reset(void *data)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1235
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1236
   int ret;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1237
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1238
   vmxnet3_softc_t *dp = data;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1239
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1240
   VMXNET3_DEBUG(dp, 1, "vmxnet3_reset()\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1241
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1242
   atomic_inc_32(&dp->reset_count);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1243
   vmxnet3_stop(dp);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1244
   VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_CMD, VMXNET3_CMD_RESET_DEV);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1245
   if ((ret = vmxnet3_start(dp)) != DDI_SUCCESS)
14277
711401aaa206 Delphix vmxnet3s fixes
Sebastien Roy <seb@delphix.com>
parents: 13976
diff changeset
  1246
      VMXNET3_WARN(dp, "failed to reset the device: %d", ret);
13976
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1247
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1248
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1249
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1250
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1251
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1252
 * vmxnet3_intr_events --
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1253
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1254
 *    Process pending events on a vmxnet3 device.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1255
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1256
 * Results:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1257
 *    B_TRUE if the link state changed, B_FALSE otherwise.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1258
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1259
 * Side effects:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1260
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1261
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1262
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1263
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1264
static boolean_t
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1265
vmxnet3_intr_events(vmxnet3_softc_t *dp)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1266
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1267
   Vmxnet3_DriverShared *ds = VMXNET3_DS(dp);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1268
   boolean_t linkStateChanged = B_FALSE;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1269
   uint32_t events = ds->ecr;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1270
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1271
   if (events) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1272
      VMXNET3_DEBUG(dp, 2, "events(0x%x)\n", events);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1273
      if (events & (VMXNET3_ECR_RQERR | VMXNET3_ECR_TQERR)) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1274
         Vmxnet3_TxQueueDesc *tqdesc = VMXNET3_TQDESC(dp);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1275
         Vmxnet3_RxQueueDesc *rqdesc = VMXNET3_RQDESC(dp);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1276
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1277
         VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_CMD, VMXNET3_CMD_GET_QUEUE_STATUS);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1278
         if (tqdesc->status.stopped) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1279
            VMXNET3_WARN(dp, "tq error 0x%x\n", tqdesc->status.error);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1280
         }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1281
         if (rqdesc->status.stopped) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1282
            VMXNET3_WARN(dp, "rq error 0x%x\n", rqdesc->status.error);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1283
         }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1284
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1285
         if (ddi_taskq_dispatch(dp->resetTask, vmxnet3_reset,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1286
                                dp, DDI_NOSLEEP) == DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1287
            VMXNET3_WARN(dp, "reset scheduled\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1288
         } else {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1289
            VMXNET3_WARN(dp, "ddi_taskq_dispatch() failed()\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1290
         }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1291
      }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1292
      if (events & VMXNET3_ECR_LINK) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1293
         vmxnet3_refresh_linkstate(dp);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1294
         linkStateChanged = B_TRUE;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1295
      }
14277
711401aaa206 Delphix vmxnet3s fixes
Sebastien Roy <seb@delphix.com>
parents: 13976
diff changeset
  1296
      if (events & VMXNET3_ECR_DIC) {
711401aaa206 Delphix vmxnet3s fixes
Sebastien Roy <seb@delphix.com>
parents: 13976
diff changeset
  1297
         VMXNET3_DEBUG(dp, 1, "device implementation change\n");
711401aaa206 Delphix vmxnet3s fixes
Sebastien Roy <seb@delphix.com>
parents: 13976
diff changeset
  1298
      }
13976
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1299
      VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_ECR, events);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1300
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1301
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1302
   return linkStateChanged;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1303
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1304
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1305
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1306
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1307
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1308
 * vmxnet3_intr --
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1309
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1310
 *    Interrupt handler of a vmxnet3 device.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1311
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1312
 * Results:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1313
 *    DDI_INTR_CLAIMED or DDI_INTR_UNCLAIMED.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1314
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1315
 * Side effects:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1316
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1317
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1318
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1319
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1320
/* ARGSUSED1 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1321
static u_int
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1322
vmxnet3_intr(caddr_t data1, caddr_t data2)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1323
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1324
   vmxnet3_softc_t *dp = (void *) data1;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1325
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1326
   VMXNET3_DEBUG(dp, 3, "intr()\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1327
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1328
   mutex_enter(&dp->intrLock);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1329
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1330
   if (dp->devEnabled) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1331
      boolean_t linkStateChanged;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1332
      boolean_t mustUpdateTx;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1333
      mblk_t *mps;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1334
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1335
      if (dp->intrType == DDI_INTR_TYPE_FIXED &&
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1336
          !VMXNET3_BAR1_GET32(dp, VMXNET3_REG_ICR)) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1337
         goto intr_unclaimed;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1338
      }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1339
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1340
      if (dp->intrMaskMode == VMXNET3_IMM_ACTIVE) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1341
         VMXNET3_BAR0_PUT32(dp, VMXNET3_REG_IMR, 1);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1342
      }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1343
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1344
      linkStateChanged = vmxnet3_intr_events(dp);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1345
      mustUpdateTx = vmxnet3_tx_complete(dp, &dp->txQueue);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1346
      mps = vmxnet3_rx_intr(dp, &dp->rxQueue);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1347
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1348
      mutex_exit(&dp->intrLock);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1349
      VMXNET3_BAR0_PUT32(dp, VMXNET3_REG_IMR, 0);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1350
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1351
      if (linkStateChanged) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1352
         mac_link_update(dp->mac, dp->linkState);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1353
      }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1354
      if (mustUpdateTx) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1355
         mac_tx_update(dp->mac);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1356
      }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1357
      if (mps) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1358
         mac_rx(dp->mac, NULL, mps);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1359
      }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1360
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1361
      return DDI_INTR_CLAIMED;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1362
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1363
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1364
intr_unclaimed:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1365
   mutex_exit(&dp->intrLock);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1366
   return DDI_INTR_UNCLAIMED;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1367
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1368
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1369
static int
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1370
vmxnet3_kstat_update(kstat_t *ksp, int rw)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1371
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1372
   vmxnet3_softc_t *dp = ksp->ks_private;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1373
   vmxnet3_kstats_t *statp = ksp->ks_data;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1374
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1375
   if (rw == KSTAT_WRITE)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1376
      return EACCES;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1377
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1378
   statp->reset_count.value.ul = dp->reset_count;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1379
   statp->tx_pullup_needed.value.ul = dp->tx_pullup_needed;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1380
   statp->tx_ring_full.value.ul = dp->tx_ring_full;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1381
   statp->rx_alloc_buf.value.ul = dp->rx_alloc_buf;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1382
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1383
   return 0;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1384
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1385
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1386
static int
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1387
vmxnet3_kstat_init(vmxnet3_softc_t *dp)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1388
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1389
   vmxnet3_kstats_t *statp;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1390
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1391
   dp->devKstats = kstat_create(VMXNET3_MODNAME, dp->instance, "statistics",
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1392
                                "dev",  KSTAT_TYPE_NAMED,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1393
                                sizeof (vmxnet3_kstats_t) /
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1394
                                sizeof (kstat_named_t), 0);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1395
   if (dp->devKstats == NULL)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1396
      return DDI_FAILURE;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1397
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1398
   dp->devKstats->ks_update = vmxnet3_kstat_update;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1399
   dp->devKstats->ks_private = dp;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1400
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1401
   statp = dp->devKstats->ks_data;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1402
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1403
   kstat_named_init(&statp->reset_count, "reset_count", KSTAT_DATA_ULONG);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1404
   kstat_named_init(&statp->tx_pullup_needed, "tx_pullup_needed",
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1405
		    KSTAT_DATA_ULONG);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1406
   kstat_named_init(&statp->tx_ring_full, "tx_ring_full", KSTAT_DATA_ULONG);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1407
   kstat_named_init(&statp->rx_alloc_buf, "rx_alloc_buf", KSTAT_DATA_ULONG);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1408
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1409
   kstat_install(dp->devKstats);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1410
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1411
   return DDI_SUCCESS;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1412
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1413
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1414
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1415
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1416
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1417
 * vmxnet3_attach --
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1418
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1419
 *    Probe and attach a vmxnet3 instance to the stack.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1420
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1421
 * Results:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1422
 *    DDI_SUCCESS or DDI_FAILURE.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1423
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1424
 * Side effects:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1425
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1426
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1427
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1428
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1429
static int
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1430
vmxnet3_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1431
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1432
   vmxnet3_softc_t *dp;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1433
   mac_register_t *macr;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1434
   uint16_t vendorId, devId, ret16;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1435
   uint32_t ret32;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1436
   int ret, err;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1437
   uint_t uret;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1438
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1439
   if (cmd != DDI_ATTACH) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1440
      goto error;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1441
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1442
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1443
   /*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1444
    * Allocate the soft state
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1445
    */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1446
   dp = kmem_zalloc(sizeof(vmxnet3_softc_t), KM_SLEEP);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1447
   ASSERT(dp);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1448
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1449
   dp->dip = dip;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1450
   dp->instance = ddi_get_instance(dip);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1451
   dp->cur_mtu = ETHERMTU;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1452
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1453
   VMXNET3_DEBUG(dp, 1, "attach()\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1454
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1455
   ddi_set_driver_private(dip, dp);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1456
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1457
   /*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1458
    * Get access to the PCI bus configuration space
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1459
    */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1460
   if (pci_config_setup(dip, &dp->pciHandle) != DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1461
      VMXNET3_WARN(dp, "pci_config_setup() failed\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1462
      goto error_soft_state;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1463
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1464
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1465
   /*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1466
    * Make sure the chip is a vmxnet3 device
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1467
    */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1468
   vendorId = pci_config_get16(dp->pciHandle, PCI_CONF_VENID);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1469
   devId = pci_config_get16(dp->pciHandle, PCI_CONF_DEVID);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1470
   if (vendorId != PCI_VENDOR_ID_VMWARE ||
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1471
       devId != PCI_DEVICE_ID_VMWARE_VMXNET3) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1472
      VMXNET3_WARN(dp, "wrong PCI venid/devid (0x%x, 0x%x)\n",
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1473
                   vendorId, devId);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1474
      goto error_pci_config;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1475
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1476
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1477
   /*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1478
    * Make sure we can access the registers through the I/O space
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1479
    */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1480
   ret16 = pci_config_get16(dp->pciHandle, PCI_CONF_COMM);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1481
   ret16 |= PCI_COMM_IO | PCI_COMM_ME;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1482
   pci_config_put16(dp->pciHandle, PCI_CONF_COMM, ret16);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1483
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1484
   /*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1485
    * Map the I/O space in memory
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1486
    */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1487
   if (ddi_regs_map_setup(dip, 1, &dp->bar0, 0, 0, &vmxnet3_dev_attr,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1488
                          &dp->bar0Handle) != DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1489
      VMXNET3_WARN(dp, "ddi_regs_map_setup() for BAR0 failed\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1490
      goto error_pci_config;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1491
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1492
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1493
   if (ddi_regs_map_setup(dip, 2, &dp->bar1, 0, 0, &vmxnet3_dev_attr,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1494
                          &dp->bar1Handle) != DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1495
      VMXNET3_WARN(dp, "ddi_regs_map_setup() for BAR1 failed\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1496
      goto error_regs_map_0;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1497
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1498
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1499
   /*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1500
    * Check the version number of the virtual device
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1501
    */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1502
   if (VMXNET3_BAR1_GET32(dp, VMXNET3_REG_VRRS) & 1) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1503
      VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_VRRS, 1);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1504
   } else {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1505
      VMXNET3_WARN(dp, "incompatible h/w version\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1506
      goto error_regs_map_1;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1507
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1508
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1509
   if (VMXNET3_BAR1_GET32(dp, VMXNET3_REG_UVRS) & 1) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1510
      VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_UVRS, 1);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1511
   } else {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1512
      VMXNET3_WARN(dp, "incompatible upt version\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1513
      goto error_regs_map_1;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1514
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1515
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1516
   if (vmxnet3_kstat_init(dp) != DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1517
      VMXNET3_WARN(dp, "unable to initialize kstats");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1518
      goto error_regs_map_1;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1519
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1520
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1521
   /*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1522
    * Read the MAC address from the device
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1523
    */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1524
   ret32 = VMXNET3_BAR1_GET32(dp, VMXNET3_REG_MACL);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1525
   *((uint32_t *) (dp->macaddr + 0)) = ret32;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1526
   ret32 = VMXNET3_BAR1_GET32(dp, VMXNET3_REG_MACH);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1527
   *((uint16_t *) (dp->macaddr + 4)) = ret32;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1528
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1529
   /*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1530
    * Register with the MAC framework
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1531
    */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1532
   if (!(macr = mac_alloc(MAC_VERSION))) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1533
      VMXNET3_WARN(dp, "mac_alloc() failed.\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1534
      goto error_kstat;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1535
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1536
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1537
   macr->m_type_ident = MAC_PLUGIN_IDENT_ETHER;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1538
   macr->m_driver = dp;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1539
   macr->m_dip = dip;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1540
   macr->m_instance = 0;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1541
   macr->m_src_addr = dp->macaddr;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1542
   macr->m_dst_addr = NULL;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1543
   macr->m_callbacks = &vmxnet3_mac_callbacks;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1544
   macr->m_min_sdu = VMXNET3_MIN_MTU;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1545
   macr->m_max_sdu = ETHERMTU;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1546
   macr->m_margin = VLAN_TAGSZ;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1547
   macr->m_pdata = NULL;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1548
   macr->m_pdata_size = 0;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1549
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1550
   ret = mac_register(macr, &dp->mac);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1551
   mac_free(macr);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1552
   if (ret != DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1553
      VMXNET3_WARN(dp, "mac_register() failed\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1554
      goto error_kstat;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1555
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1556
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1557
   /*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1558
    * Register the interrupt(s) in this order of preference:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1559
    * MSI-X, MSI, INTx
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1560
    */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1561
   VMXNET3_BAR1_PUT32(dp, VMXNET3_REG_CMD, VMXNET3_CMD_GET_CONF_INTR);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1562
   ret32 = VMXNET3_BAR1_GET32(dp, VMXNET3_REG_CMD);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1563
   switch (ret32 & 0x3) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1564
      case VMXNET3_IT_AUTO:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1565
      case VMXNET3_IT_MSIX:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1566
         dp->intrType = DDI_INTR_TYPE_MSIX;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1567
         err = ddi_intr_alloc(dip, &dp->intrHandle, dp->intrType, 0, 1,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1568
                              &ret, DDI_INTR_ALLOC_STRICT);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1569
         if (err == DDI_SUCCESS)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1570
            break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1571
         VMXNET3_DEBUG(dp, 2, "DDI_INTR_TYPE_MSIX failed, err:%d\n", err);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1572
	 /* FALLTHROUGH */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1573
      case VMXNET3_IT_MSI:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1574
         dp->intrType = DDI_INTR_TYPE_MSI;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1575
         if (ddi_intr_alloc(dip, &dp->intrHandle, dp->intrType, 0, 1,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1576
                            &ret, DDI_INTR_ALLOC_STRICT) == DDI_SUCCESS)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1577
            break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1578
         VMXNET3_DEBUG(dp, 2, "DDI_INTR_TYPE_MSI failed\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1579
	 /* FALLTHROUGH */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1580
      case VMXNET3_IT_INTX:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1581
         dp->intrType = DDI_INTR_TYPE_FIXED;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1582
         if (ddi_intr_alloc(dip, &dp->intrHandle, dp->intrType, 0, 1,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1583
                            &ret, DDI_INTR_ALLOC_STRICT) == DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1584
            break;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1585
         }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1586
         VMXNET3_DEBUG(dp, 2, "DDI_INTR_TYPE_INTX failed\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1587
	 /* FALLTHROUGH */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1588
      default:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1589
         VMXNET3_WARN(dp, "ddi_intr_alloc() failed\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1590
         goto error_mac;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1591
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1592
   dp->intrMaskMode = (ret32 >> 2) & 0x3;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1593
   if (dp->intrMaskMode == VMXNET3_IMM_LAZY) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1594
      VMXNET3_WARN(dp, "Lazy masking is not supported\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1595
      goto error_intr;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1596
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1597
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1598
   if (ddi_intr_get_pri(dp->intrHandle, &uret) != DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1599
      VMXNET3_WARN(dp, "ddi_intr_get_pri() failed\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1600
      goto error_intr;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1601
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1602
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1603
   VMXNET3_DEBUG(dp, 2, "intrType=0x%x, intrMaskMode=0x%x, intrPrio=%u\n",
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1604
           dp->intrType, dp->intrMaskMode, uret);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1605
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1606
   /*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1607
    * Create a task queue to reset the device if it wedges.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1608
    */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1609
   dp->resetTask = ddi_taskq_create(dip, "vmxnet3_reset_task", 1,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1610
                                    TASKQ_DEFAULTPRI, 0);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1611
   if (!dp->resetTask) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1612
      VMXNET3_WARN(dp, "ddi_taskq_create() failed()\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1613
      goto error_intr;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1614
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1615
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1616
   /*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1617
    * Initialize our mutexes now that we know the interrupt priority
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1618
    * This _must_ be done before ddi_intr_enable()
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1619
    */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1620
   mutex_init(&dp->intrLock, NULL, MUTEX_DRIVER, DDI_INTR_PRI(uret));
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1621
   mutex_init(&dp->txLock, NULL, MUTEX_DRIVER, DDI_INTR_PRI(uret));
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1622
   mutex_init(&dp->rxPoolLock, NULL, MUTEX_DRIVER, DDI_INTR_PRI(uret));
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1623
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1624
   if (ddi_intr_add_handler(dp->intrHandle, vmxnet3_intr,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1625
                            dp, NULL) != DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1626
      VMXNET3_WARN(dp, "ddi_intr_add_handler() failed\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1627
      goto error_mutexes;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1628
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1629
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1630
   err = ddi_intr_get_cap(dp->intrHandle, &dp->intrCap);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1631
   if (err != DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1632
      VMXNET3_WARN(dp, "ddi_intr_get_cap() failed %d", err);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1633
      goto error_intr_handler;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1634
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1635
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1636
   if (dp->intrCap & DDI_INTR_FLAG_BLOCK) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1637
      err = ddi_intr_block_enable(&dp->intrHandle, 1);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1638
      if (err != DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1639
         VMXNET3_WARN(dp, "ddi_intr_block_enable() failed, err:%d\n", err);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1640
         goto error_intr_handler;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1641
      }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1642
   } else {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1643
      err = ddi_intr_enable(dp->intrHandle);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1644
      if ((err != DDI_SUCCESS)) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1645
         VMXNET3_WARN(dp, "ddi_intr_enable() failed, err:%d\n", err);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1646
         goto error_intr_handler;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1647
      }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1648
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1649
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1650
   return DDI_SUCCESS;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1651
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1652
error_intr_handler:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1653
   (void) ddi_intr_remove_handler(dp->intrHandle);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1654
error_mutexes:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1655
   mutex_destroy(&dp->rxPoolLock);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1656
   mutex_destroy(&dp->txLock);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1657
   mutex_destroy(&dp->intrLock);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1658
   ddi_taskq_destroy(dp->resetTask);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1659
error_intr:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1660
   (void) ddi_intr_free(dp->intrHandle);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1661
error_mac:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1662
   (void) mac_unregister(dp->mac);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1663
error_kstat:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1664
   kstat_delete(dp->devKstats);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1665
error_regs_map_1:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1666
   ddi_regs_map_free(&dp->bar1Handle);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1667
error_regs_map_0:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1668
   ddi_regs_map_free(&dp->bar0Handle);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1669
error_pci_config:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1670
   pci_config_teardown(&dp->pciHandle);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1671
error_soft_state:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1672
   kmem_free(dp, sizeof(vmxnet3_softc_t));
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1673
error:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1674
   return DDI_FAILURE;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1675
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1676
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1677
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1678
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1679
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1680
 * vmxnet3_detach --
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1681
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1682
 *    Detach a vmxnet3 instance from the stack.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1683
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1684
 * Results:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1685
 *    DDI_SUCCESS or DDI_FAILURE.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1686
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1687
 * Side effects:
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1688
 *    None.
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1689
 *
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1690
 *---------------------------------------------------------------------------
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1691
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1692
static int
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1693
vmxnet3_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1694
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1695
   vmxnet3_softc_t *dp = ddi_get_driver_private(dip);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1696
   unsigned int retries = 0;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1697
   int ret;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1698
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1699
   VMXNET3_DEBUG(dp, 1, "detach()\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1700
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1701
   if (cmd != DDI_DETACH) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1702
      return DDI_FAILURE;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1703
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1704
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1705
   while (dp->rxNumBufs) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1706
      if (retries++ < 10) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1707
         VMXNET3_WARN(dp, "rx pending (%u), waiting 1 second...\n",
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1708
                      dp->rxNumBufs);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1709
         delay(drv_usectohz(1000000));
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1710
      } else {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1711
         VMXNET3_WARN(dp, "giving up...\n");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1712
         return DDI_FAILURE;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1713
      }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1714
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1715
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1716
   if (dp->intrCap & DDI_INTR_FLAG_BLOCK) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1717
      ret = ddi_intr_block_disable(&dp->intrHandle, 1);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1718
   } else {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1719
      ret = ddi_intr_disable(dp->intrHandle);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1720
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1721
   if (ret != DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1722
      VMXNET3_WARN(dp, "unable to disable interrupts");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1723
      return DDI_FAILURE;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1724
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1725
   if (ddi_intr_remove_handler(dp->intrHandle) != DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1726
      VMXNET3_WARN(dp, "unable to remove interrupt handler");
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1727
      return DDI_FAILURE;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1728
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1729
   (void) ddi_intr_free(dp->intrHandle);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1730
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1731
   VERIFY(mac_unregister(dp->mac) == 0);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1732
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1733
   kstat_delete(dp->devKstats);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1734
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1735
   if (dp->mfTable.buf) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1736
      vmxnet3_free_dma_mem(&dp->mfTable);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1737
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1738
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1739
   mutex_destroy(&dp->rxPoolLock);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1740
   mutex_destroy(&dp->txLock);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1741
   mutex_destroy(&dp->intrLock);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1742
   ddi_taskq_destroy(dp->resetTask);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1743
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1744
   ddi_regs_map_free(&dp->bar1Handle);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1745
   ddi_regs_map_free(&dp->bar0Handle);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1746
   pci_config_teardown(&dp->pciHandle);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1747
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1748
   kmem_free(dp, sizeof(vmxnet3_softc_t));
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1749
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1750
   return DDI_SUCCESS;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1751
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1752
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1753
/* --- */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1754
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1755
/*
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1756
 * Structures used by the Solaris module loader
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1757
 */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1758
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1759
#define VMXNET3_IDENT "VMware Ethernet v3 b" BUILD_NUMBER_NUMERIC_STRING
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1760
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1761
DDI_DEFINE_STREAM_OPS(vmxnet3_dev_ops,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1762
                      nulldev,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1763
                      nulldev,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1764
                      vmxnet3_attach,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1765
                      vmxnet3_detach,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1766
                      nodev,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1767
                      NULL,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1768
                      D_NEW | D_MP,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1769
                      NULL,
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1770
                      ddi_quiesce_not_supported);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1771
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1772
static struct modldrv vmxnet3_modldrv = {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1773
   &mod_driverops,             /* drv_modops */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1774
   VMXNET3_IDENT,              /* drv_linkinfo */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1775
   &vmxnet3_dev_ops            /* drv_dev_ops */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1776
};
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1777
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1778
static struct modlinkage vmxnet3_modlinkage = {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1779
    MODREV_1,                  /* ml_rev */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1780
    { &vmxnet3_modldrv, NULL } /* ml_linkage */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1781
};
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1782
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1783
/* Module load entry point */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1784
int _init(void)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1785
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1786
   int ret;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1787
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1788
   mac_init_ops(&vmxnet3_dev_ops, VMXNET3_MODNAME);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1789
   ret = mod_install(&vmxnet3_modlinkage);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1790
   if (ret != DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1791
      mac_fini_ops(&vmxnet3_dev_ops);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1792
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1793
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1794
   return ret;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1795
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1796
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1797
/* Module unload entry point */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1798
int _fini(void)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1799
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1800
   int ret;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1801
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1802
   ret = mod_remove(&vmxnet3_modlinkage);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1803
   if (ret == DDI_SUCCESS) {
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1804
      mac_fini_ops(&vmxnet3_dev_ops);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1805
   }
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1806
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1807
   return ret;
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1808
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1809
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1810
/* Module info entry point */
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1811
int _info(struct modinfo *modinfop)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1812
{
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1813
   return mod_info(&vmxnet3_modlinkage, modinfop);
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1814
}
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1815
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1816
void
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1817
vmxnet3_log(int level, vmxnet3_softc_t *dp, char *fmt, ...)
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1818
{
14277
711401aaa206 Delphix vmxnet3s fixes
Sebastien Roy <seb@delphix.com>
parents: 13976
diff changeset
  1819
   dev_err(dp->dip, level, fmt);
13976
814bae19b8a2 vmware vmxnet3s driver
Sebastien Roy <seb@delphix.com>
parents:
diff changeset
  1820
}