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