1 /*
   2 * CDDL HEADER START
   3 *
   4 * The contents of this file are subject to the terms of the
   5 * Common Development and Distribution License, v.1,  (the "License").
   6 * You may not use this file except in compliance with the License.
   7 *
   8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9 * or http://opensource.org/licenses/CDDL-1.0.
  10 * See the License for the specific language governing permissions
  11 * and limitations under the License.
  12 *
  13 * When distributing Covered Code, include this CDDL HEADER in each
  14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15 * If applicable, add the following below this CDDL HEADER, with the
  16 * fields enclosed by brackets "[]" replaced with your own identifying
  17 * information: Portions Copyright [yyyy] [name of copyright owner]
  18 *
  19 * CDDL HEADER END
  20 */
  21 
  22 /*
  23 * Copyright 2014-2017 Cavium, Inc. 
  24 * The contents of this file are subject to the terms of the Common Development 
  25 * and Distribution License, v.1,  (the "License").
  26 
  27 * You may not use this file except in compliance with the License.
  28 
  29 * You can obtain a copy of the License at available 
  30 * at http://opensource.org/licenses/CDDL-1.0
  31 
  32 * See the License for the specific language governing permissions and 
  33 * limitations under the License.
  34 */
  35 
  36 
  37 #include "qede.h"
  38 
  39 qede_link_props_t qede_def_link_props  = 
  40 {
  41         GLDM_FIBER,
  42         B_TRUE,
  43         B_TRUE,
  44         B_TRUE,
  45         B_TRUE,
  46         B_TRUE,
  47         B_TRUE,
  48         B_TRUE,
  49         B_TRUE,
  50         B_FALSE
  51 };
  52 static void 
  53 qede_cfg_get_val(qede_t  *qede,
  54     char *        pName,
  55     void *        pVal,
  56     int           defaultVal,
  57     boolean_t     boolVal)
  58 {
  59         int val;
  60 #define         QEDE_CFG_NAME_LEN_MAX           128
  61 
  62         char name[QEDE_CFG_NAME_LEN_MAX];
  63 
  64         /* first check if the hardcoded default has been overridden */
  65 
  66         snprintf(name, QEDE_CFG_NAME_LEN_MAX, "default_%s", pName);
  67 
  68         val = ddi_prop_get_int(DDI_DEV_T_ANY,
  69                 qede->dip,
  70                 (DDI_PROP_NOTPROM | DDI_PROP_DONTPASS),
  71                 name,
  72                 defaultVal);
  73         /* now check for a config for this specific instance */
  74 
  75         snprintf(name, QEDE_CFG_NAME_LEN_MAX, "qede%d_%s", qede->instance, 
  76             pName);
  77 
  78         val = ddi_prop_get_int(DDI_DEV_T_ANY,
  79                 qede->dip,
  80                 (DDI_PROP_NOTPROM | DDI_PROP_DONTPASS),
  81                 name,
  82                 val);
  83 
  84         if (boolVal) {
  85                 *((boolean_t *)pVal) = (val) ? B_TRUE : B_FALSE;
  86         } else {
  87                 *((int *)pVal) = val;
  88         }
  89 }
  90 
  91 void 
  92 qede_cfg_init(qede_t *qede)
  93 {
  94 
  95         int option;
  96 
  97         qede->checksum = DEFAULT_CKSUM_OFFLOAD;
  98         qede->enabled_offloads = QEDE_OFFLOAD_NONE;
  99         qede->mtu = DEFAULT_MTU;
 100         qede->num_fp = DEFAULT_FASTPATH_COUNT;
 101         qede->rx_ring_size = DEFAULT_RX_RING_SIZE;
 102         qede->tx_ring_size = DEFAULT_TX_RING_SIZE;
 103         qede->tx_recycle_threshold = DEFAULT_TX_RECYCLE_THRESHOLD;
 104         qede->rx_copy_threshold = DEFAULT_RX_COPY_THRESHOLD;
 105         qede->tx_bcopy_threshold = DEFAULT_TX_COPY_THRESHOLD;
 106         qede->lso_enable = B_TRUE;
 107         qede->lro_enable = B_TRUE;
 108         qede->log_enable = B_TRUE;
 109         qede->ecore_debug_level = DEFAULT_ECORE_DEBUG_LEVEL;
 110         qede->ecore_debug_module = DEFAULT_ECORE_DEBUG_MODULE;
 111 
 112         qede_cfg_get_val(qede, "checksum", 
 113                           &qede->checksum,
 114                           qede->checksum,
 115                           B_FALSE);
 116         switch(qede->checksum) {
 117         case USER_OPTION_CKSUM_L3:
 118         case USER_OPTION_CKSUM_L3_L4:
 119                 qede->checksum = DEFAULT_CKSUM_OFFLOAD;
 120                 break;
 121         }
 122 
 123         qede_cfg_get_val(qede, "mtu", &option,
 124             qede->mtu,
 125             B_FALSE);
 126 
 127         if (option != DEFAULT_JUMBO_MTU &&
 128             option != DEFAULT_MTU) {
 129                 qede->mtu = DEFAULT_MTU;
 130                 qede->jumbo_enable = B_FALSE;
 131         } else {
 132                 if (qede->mtu != option) {
 133                 qede->mtu = option;
 134                 }
 135                 if (option == DEFAULT_JUMBO_MTU) {
 136                     qede->jumbo_enable = B_TRUE;
 137                 }
 138         }
 139 
 140         qede_cfg_get_val(qede, "num_fp", &option,
 141             qede->num_fp,
 142             B_FALSE);
 143         qede->num_fp = (option < MIN_FASTPATH_COUNT) ?
 144             MIN_FASTPATH_COUNT :
 145             (option > MAX_FASTPATH_COUNT) ?
 146             MAX_FASTPATH_COUNT :
 147             option;
 148 
 149         qede_cfg_get_val(qede, "rx_ring_size", &option,
 150             qede->rx_ring_size,
 151             B_FALSE);
 152         qede->rx_ring_size = (option < MIN_RX_RING_SIZE) ?
 153             MIN_RX_RING_SIZE :
 154             (option > MAX_RX_RING_SIZE) ?
 155             MAX_RX_RING_SIZE :
 156             option;
 157         qede_cfg_get_val(qede, "tx_ring_size", &option,
 158             qede->tx_ring_size,
 159             B_FALSE);
 160         qede->tx_ring_size = (option < MIN_TX_RING_SIZE) ?
 161             MIN_TX_RING_SIZE :
 162             (option > MAX_TX_RING_SIZE) ?
 163             MAX_TX_RING_SIZE :
 164             option;
 165         qede_cfg_get_val(qede, "rx_copy_threshold", &option,
 166             qede->rx_copy_threshold,
 167             B_FALSE);
 168         qede_cfg_get_val(qede, "tx_copy_threshold", &option,
 169             qede->tx_bcopy_threshold,
 170             B_FALSE);
 171         qede_cfg_get_val(qede, "tx_recycle_threshold", &option,
 172             qede->tx_bcopy_threshold,
 173             B_FALSE);
 174         qede->tx_recycle_threshold =
 175             (option < 0) ? 0:
 176             (option > qede->tx_ring_size) ?
 177             qede->tx_ring_size : option;
 178         qede_cfg_get_val(qede, "lso_enable", &option,
 179             qede->lso_enable,
 180             B_TRUE);
 181         qede->lso_enable = option;
 182         qede_cfg_get_val(qede, "lro_enable", &option,
 183             qede->lro_enable,
 184             B_TRUE);
 185         qede->lro_enable = option;
 186 
 187         if(qede->checksum != DEFAULT_CKSUM_OFFLOAD) {
 188                 qede->lso_enable = B_FALSE;
 189                 qede->lro_enable = B_FALSE;
 190         }
 191 
 192         qede_cfg_get_val(qede, "log_enable", &option,
 193             qede->log_enable,
 194             B_TRUE);
 195         qede_cfg_get_val(qede, "debug_level", &option,
 196             qede->ecore_debug_level,
 197             B_FALSE);
 198         qede->ecore_debug_level =  (uint32_t)((option < 0) ? 0 : option);
 199 
 200         qede_cfg_get_val(qede, "debug_module", &option,
 201             qede->ecore_debug_module,
 202             B_FALSE);
 203         qede->ecore_debug_module = (uint32_t)((option < 0) ? 0 : option);
 204 }
 205 
 206 
 207 void 
 208 qede_cfg_reset(qede_t *qede)
 209 {
 210         qede->params.link_state = 0;
 211         /* reset the link status */
 212         qede->props.link_speed = 0;
 213         qede->props.link_duplex = B_FALSE;
 214         qede->props.tx_pause = B_FALSE;
 215         qede->props.rx_pause = B_FALSE;
 216         qede->props.uptime = 0;
 217 
 218 }
 219