1a23fd118Syl /*
2a23fd118Syl  * CDDL HEADER START
3a23fd118Syl  *
4a23fd118Syl  * The contents of this file are subject to the terms of the
5a23fd118Syl  * Common Development and Distribution License (the "License").
6a23fd118Syl  * You may not use this file except in compliance with the License.
7a23fd118Syl  *
8a23fd118Syl  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9a23fd118Syl  * or http://www.opensolaris.org/os/licensing.
10a23fd118Syl  * See the License for the specific language governing permissions
11a23fd118Syl  * and limitations under the License.
12a23fd118Syl  *
13a23fd118Syl  * When distributing Covered Code, include this CDDL HEADER in each
14a23fd118Syl  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15a23fd118Syl  * If applicable, add the following below this CDDL HEADER, with the
16a23fd118Syl  * fields enclosed by brackets "[]" replaced with your own identifying
17a23fd118Syl  * information: Portions Copyright [yyyy] [name of copyright owner]
18a23fd118Syl  *
19a23fd118Syl  * CDDL HEADER END
20a23fd118Syl  *
218347601bSyl  * Copyright (c) 2002-2006 Neterion, Inc.
22a23fd118Syl  */
23a23fd118Syl 
24a23fd118Syl #include "xgehal-config.h"
25a23fd118Syl #include "xge-debug.h"
26a23fd118Syl 
27a23fd118Syl /*
28a23fd118Syl  * __hal_tti_config_check - Check tti configuration
29a23fd118Syl  * @new_config: tti configuration information
30a23fd118Syl  *
31a23fd118Syl  * Returns: XGE_HAL_OK - success,
32a23fd118Syl  * otherwise one of the xge_hal_status_e{} enumerated error codes.
33a23fd118Syl  */
34a23fd118Syl static xge_hal_status_e
__hal_tti_config_check(xge_hal_tti_config_t * new_config)35a23fd118Syl __hal_tti_config_check (xge_hal_tti_config_t *new_config)
36a23fd118Syl {
37a23fd118Syl 	if ((new_config->urange_a < XGE_HAL_MIN_TX_URANGE_A) ||
38a23fd118Syl 		(new_config->urange_a > XGE_HAL_MAX_TX_URANGE_A)) {
39a23fd118Syl 		return XGE_HAL_BADCFG_TX_URANGE_A;
40a23fd118Syl 	}
41a23fd118Syl 
42a23fd118Syl 	if ((new_config->ufc_a < XGE_HAL_MIN_TX_UFC_A) ||
43a23fd118Syl 		(new_config->ufc_a > XGE_HAL_MAX_TX_UFC_A)) {
44a23fd118Syl 		return XGE_HAL_BADCFG_TX_UFC_A;
45a23fd118Syl 	}
46a23fd118Syl 
47a23fd118Syl 	if ((new_config->urange_b < XGE_HAL_MIN_TX_URANGE_B) ||
48a23fd118Syl 		(new_config->urange_b > XGE_HAL_MAX_TX_URANGE_B)) {
49a23fd118Syl 		return XGE_HAL_BADCFG_TX_URANGE_B;
50a23fd118Syl 	}
51a23fd118Syl 
52a23fd118Syl 	if ((new_config->ufc_b < XGE_HAL_MIN_TX_UFC_B) ||
53a23fd118Syl 		(new_config->ufc_b > XGE_HAL_MAX_TX_UFC_B)) {
54a23fd118Syl 		return XGE_HAL_BADCFG_TX_UFC_B;
55a23fd118Syl 	}
56a23fd118Syl 
57a23fd118Syl 	if ((new_config->urange_c < XGE_HAL_MIN_TX_URANGE_C) ||
58a23fd118Syl 		(new_config->urange_c > XGE_HAL_MAX_TX_URANGE_C)) {
59a23fd118Syl 		return XGE_HAL_BADCFG_TX_URANGE_C;
60a23fd118Syl 	}
61a23fd118Syl 
62a23fd118Syl 	if ((new_config->ufc_c < XGE_HAL_MIN_TX_UFC_C) ||
63a23fd118Syl 		(new_config->ufc_c > XGE_HAL_MAX_TX_UFC_C)) {
64a23fd118Syl 		return XGE_HAL_BADCFG_TX_UFC_C;
65a23fd118Syl 	}
66a23fd118Syl 
67a23fd118Syl 	if ((new_config->ufc_d < XGE_HAL_MIN_TX_UFC_D) ||
68a23fd118Syl 		(new_config->ufc_d > XGE_HAL_MAX_TX_UFC_D)) {
69a23fd118Syl 		return XGE_HAL_BADCFG_TX_UFC_D;
70a23fd118Syl 	}
71a23fd118Syl 
72a23fd118Syl 	if ((new_config->timer_val_us < XGE_HAL_MIN_TX_TIMER_VAL) ||
73a23fd118Syl 		(new_config->timer_val_us > XGE_HAL_MAX_TX_TIMER_VAL)) {
74a23fd118Syl 		return XGE_HAL_BADCFG_TX_TIMER_VAL;
75a23fd118Syl 	}
76a23fd118Syl 
77a23fd118Syl 	if ((new_config->timer_ci_en < XGE_HAL_MIN_TX_TIMER_CI_EN) ||
78a23fd118Syl 		(new_config->timer_ci_en > XGE_HAL_MAX_TX_TIMER_CI_EN)) {
79a23fd118Syl 		return XGE_HAL_BADCFG_TX_TIMER_CI_EN;
80a23fd118Syl 	}
81a23fd118Syl 
82a23fd118Syl 	if ((new_config->timer_ac_en < XGE_HAL_MIN_TX_TIMER_AC_EN) ||
83a23fd118Syl 		(new_config->timer_ac_en > XGE_HAL_MAX_TX_TIMER_AC_EN)) {
84a23fd118Syl 		return XGE_HAL_BADCFG_TX_TIMER_AC_EN;
85a23fd118Syl 	}
86a23fd118Syl 
87a23fd118Syl 	return XGE_HAL_OK;
88a23fd118Syl }
89a23fd118Syl 
90a23fd118Syl /*
91a23fd118Syl  * __hal_rti_config_check - Check rti configuration
92a23fd118Syl  * @new_config: rti configuration information
93a23fd118Syl  *
94a23fd118Syl  * Returns: XGE_HAL_OK - success,
95a23fd118Syl  * otherwise one of the xge_hal_status_e{} enumerated error codes.
96a23fd118Syl  */
97a23fd118Syl static xge_hal_status_e
__hal_rti_config_check(xge_hal_rti_config_t * new_config)98a23fd118Syl __hal_rti_config_check (xge_hal_rti_config_t *new_config)
99a23fd118Syl {
100a23fd118Syl 	if ((new_config->urange_a < XGE_HAL_MIN_RX_URANGE_A) ||
101a23fd118Syl 		(new_config->urange_a > XGE_HAL_MAX_RX_URANGE_A)) {
102a23fd118Syl 		return XGE_HAL_BADCFG_RX_URANGE_A;
103a23fd118Syl 	}
104a23fd118Syl 
105a23fd118Syl 	if ((new_config->ufc_a < XGE_HAL_MIN_RX_UFC_A) ||
106a23fd118Syl 		(new_config->ufc_a > XGE_HAL_MAX_RX_UFC_A)) {
107a23fd118Syl 		return XGE_HAL_BADCFG_RX_UFC_A;
108a23fd118Syl 	}
109a23fd118Syl 
110a23fd118Syl 	if ((new_config->urange_b < XGE_HAL_MIN_RX_URANGE_B) ||
111a23fd118Syl 		(new_config->urange_b > XGE_HAL_MAX_RX_URANGE_B)) {
112a23fd118Syl 		return XGE_HAL_BADCFG_RX_URANGE_B;
113a23fd118Syl 	}
114a23fd118Syl 
115a23fd118Syl 	if ((new_config->ufc_b < XGE_HAL_MIN_RX_UFC_B) ||
116a23fd118Syl 		(new_config->ufc_b > XGE_HAL_MAX_RX_UFC_B)) {
117a23fd118Syl 		return XGE_HAL_BADCFG_RX_UFC_B;
118a23fd118Syl 	}
119a23fd118Syl 
120a23fd118Syl 	if ((new_config->urange_c < XGE_HAL_MIN_RX_URANGE_C) ||
121a23fd118Syl 		(new_config->urange_c > XGE_HAL_MAX_RX_URANGE_C)) {
122a23fd118Syl 		return XGE_HAL_BADCFG_RX_URANGE_C;
123a23fd118Syl 	}
124a23fd118Syl 
125a23fd118Syl 	if ((new_config->ufc_c < XGE_HAL_MIN_RX_UFC_C) ||
126a23fd118Syl 		(new_config->ufc_c > XGE_HAL_MAX_RX_UFC_C)) {
127a23fd118Syl 		return XGE_HAL_BADCFG_RX_UFC_C;
128a23fd118Syl 	}
129a23fd118Syl 
130a23fd118Syl 	if ((new_config->ufc_d < XGE_HAL_MIN_RX_UFC_D) ||
131a23fd118Syl 		(new_config->ufc_d > XGE_HAL_MAX_RX_UFC_D)) {
132a23fd118Syl 		return XGE_HAL_BADCFG_RX_UFC_D;
133a23fd118Syl 	}
134a23fd118Syl 
135a23fd118Syl 	if ((new_config->timer_val_us < XGE_HAL_MIN_RX_TIMER_VAL) ||
136a23fd118Syl 		(new_config->timer_val_us > XGE_HAL_MAX_RX_TIMER_VAL)) {
137a23fd118Syl 		return XGE_HAL_BADCFG_RX_TIMER_VAL;
138a23fd118Syl 	}
139a23fd118Syl 
140a23fd118Syl 	if ((new_config->timer_ac_en < XGE_HAL_MIN_RX_TIMER_AC_EN) ||
141a23fd118Syl 		(new_config->timer_ac_en > XGE_HAL_MAX_RX_TIMER_AC_EN)) {
142a23fd118Syl 		return XGE_HAL_BADCFG_RX_TIMER_AC_EN;
143a23fd118Syl 	}
144a23fd118Syl 
145a23fd118Syl 	return XGE_HAL_OK;
146a23fd118Syl }
147a23fd118Syl 
148a23fd118Syl 
149a23fd118Syl /*
150a23fd118Syl  * __hal_fifo_queue_check - Check fifo queue configuration
151a23fd118Syl  * @new_config: fifo queue configuration information
152a23fd118Syl  *
153a23fd118Syl  * Returns: XGE_HAL_OK - success,
154a23fd118Syl  * otherwise one of the xge_hal_status_e{} enumerated error codes.
155a23fd118Syl  */
156a23fd118Syl static xge_hal_status_e
__hal_fifo_queue_check(xge_hal_fifo_config_t * new_config,xge_hal_fifo_queue_t * new_queue)1578347601bSyl __hal_fifo_queue_check (xge_hal_fifo_config_t *new_config,
1588347601bSyl 			xge_hal_fifo_queue_t *new_queue)
159a23fd118Syl {
1608347601bSyl 	int i;
1618347601bSyl 
1628347601bSyl 	if ((new_queue->initial < XGE_HAL_MIN_FIFO_QUEUE_LENGTH) ||
1638347601bSyl 		(new_queue->initial > XGE_HAL_MAX_FIFO_QUEUE_LENGTH)) {
164a23fd118Syl 		return XGE_HAL_BADCFG_FIFO_QUEUE_INITIAL_LENGTH;
165a23fd118Syl 	}
166a23fd118Syl 
167a23fd118Syl 	/* FIXME: queue "grow" feature is not supported.
168a23fd118Syl 	 *        Use "initial" queue size as the "maximum";
169a23fd118Syl 	 *        Remove the next line when fixed. */
1708347601bSyl 	new_queue->max = new_queue->initial;
171a23fd118Syl 
1728347601bSyl 	if ((new_queue->max < XGE_HAL_MIN_FIFO_QUEUE_LENGTH) ||
1738347601bSyl 		(new_queue->max > XGE_HAL_MAX_FIFO_QUEUE_LENGTH)) {
174a23fd118Syl 		return XGE_HAL_BADCFG_FIFO_QUEUE_MAX_LENGTH;
175a23fd118Syl 	}
176a23fd118Syl 
1778347601bSyl 	if (new_queue->max < new_config->reserve_threshold) {
1788347601bSyl 		return XGE_HAL_BADCFG_FIFO_RESERVE_THRESHOLD;
1798347601bSyl 	}
1808347601bSyl 
1818347601bSyl 	if ((new_queue->intr < XGE_HAL_MIN_FIFO_QUEUE_INTR) ||
1828347601bSyl 		(new_queue->intr > XGE_HAL_MAX_FIFO_QUEUE_INTR)) {
183a23fd118Syl 		return XGE_HAL_BADCFG_FIFO_QUEUE_INTR;
184a23fd118Syl 	}
185a23fd118Syl 
1867eced415Sxw 	if ((new_queue->intr_vector < XGE_HAL_MIN_FIFO_QUEUE_INTR_VECTOR) ||
1877eced415Sxw 		(new_queue->intr_vector > XGE_HAL_MAX_FIFO_QUEUE_INTR_VECTOR)) {
1887eced415Sxw 		return XGE_HAL_BADCFG_FIFO_QUEUE_INTR_VECTOR;
1897eced415Sxw 	}
1907eced415Sxw 
1918347601bSyl 	for(i = 0;  i < XGE_HAL_MAX_FIFO_TTI_NUM; i++) {
1928347601bSyl 		/*
1938347601bSyl 		 * Validate the tti configuration parameters only if
1948347601bSyl 		 * the TTI feature is enabled.
1958347601bSyl 		 */
1968347601bSyl 		if (new_queue->tti[i].enabled) {
1978347601bSyl 			xge_hal_status_e status;
1988347601bSyl 
1998347601bSyl 			if ((status = __hal_tti_config_check(
2008347601bSyl 				     &new_queue->tti[i])) != XGE_HAL_OK) {
2018347601bSyl 				return status;
2028347601bSyl 			}
2038347601bSyl 		}
2048347601bSyl 	}
2058347601bSyl 
206a23fd118Syl 	return XGE_HAL_OK;
207a23fd118Syl }
208a23fd118Syl 
209a23fd118Syl /*
210a23fd118Syl  * __hal_ring_queue_check - Check ring queue configuration
211a23fd118Syl  * @new_config: ring queue configuration information
212a23fd118Syl  *
213a23fd118Syl  * Returns: XGE_HAL_OK - success,
214a23fd118Syl  * otherwise one of the xge_hal_status_e{} enumerated error codes.
215a23fd118Syl  */
216a23fd118Syl static xge_hal_status_e
__hal_ring_queue_check(xge_hal_ring_queue_t * new_config)217a23fd118Syl __hal_ring_queue_check (xge_hal_ring_queue_t *new_config)
218a23fd118Syl {
219a23fd118Syl 
220a23fd118Syl 	if ((new_config->initial < XGE_HAL_MIN_RING_QUEUE_BLOCKS) ||
221a23fd118Syl 		(new_config->initial > XGE_HAL_MAX_RING_QUEUE_BLOCKS)) {
222a23fd118Syl 		return XGE_HAL_BADCFG_RING_QUEUE_INITIAL_BLOCKS;
223a23fd118Syl 	}
224a23fd118Syl 
225a23fd118Syl 	/* FIXME: queue "grow" feature is not supported.
226a23fd118Syl 	 *        Use "initial" queue size as the "maximum";
227a23fd118Syl 	 *        Remove the next line when fixed. */
228a23fd118Syl 	new_config->max = new_config->initial;
229a23fd118Syl 
230a23fd118Syl 	if ((new_config->max < XGE_HAL_MIN_RING_QUEUE_BLOCKS) ||
231a23fd118Syl 		(new_config->max > XGE_HAL_MAX_RING_QUEUE_BLOCKS)) {
232a23fd118Syl 		return XGE_HAL_BADCFG_RING_QUEUE_MAX_BLOCKS;
233a23fd118Syl 	}
234a23fd118Syl 
235a23fd118Syl 	if ((new_config->buffer_mode != XGE_HAL_RING_QUEUE_BUFFER_MODE_1) &&
236a23fd118Syl 		(new_config->buffer_mode != XGE_HAL_RING_QUEUE_BUFFER_MODE_3) &&
237a23fd118Syl 		(new_config->buffer_mode != XGE_HAL_RING_QUEUE_BUFFER_MODE_5)) {
238a23fd118Syl 		return XGE_HAL_BADCFG_RING_QUEUE_BUFFER_MODE;
239a23fd118Syl 	}
240a23fd118Syl 
241a23fd118Syl         /*
242a23fd118Syl 	 * Herc has less DRAM; the check is done later inside
243a23fd118Syl 	 * device_initialize()
244a23fd118Syl 	 */
245a23fd118Syl 	if (((new_config->dram_size_mb < XGE_HAL_MIN_RING_QUEUE_SIZE) ||
246a23fd118Syl 	     (new_config->dram_size_mb > XGE_HAL_MAX_RING_QUEUE_SIZE_XENA)) &&
247a23fd118Syl 	      new_config->dram_size_mb != XGE_HAL_DEFAULT_USE_HARDCODE)
248a23fd118Syl 		return XGE_HAL_BADCFG_RING_QUEUE_SIZE;
249a23fd118Syl 
250a23fd118Syl 	if ((new_config->backoff_interval_us <
251a23fd118Syl 			XGE_HAL_MIN_BACKOFF_INTERVAL_US) ||
252a23fd118Syl 		(new_config->backoff_interval_us >
253a23fd118Syl 			XGE_HAL_MAX_BACKOFF_INTERVAL_US)) {
254a23fd118Syl 		return XGE_HAL_BADCFG_BACKOFF_INTERVAL_US;
255a23fd118Syl 	}
256a23fd118Syl 
257a23fd118Syl 	if ((new_config->max_frm_len < XGE_HAL_MIN_MAX_FRM_LEN) ||
258a23fd118Syl 		(new_config->max_frm_len > XGE_HAL_MAX_MAX_FRM_LEN)) {
259a23fd118Syl 		return XGE_HAL_BADCFG_MAX_FRM_LEN;
260a23fd118Syl 	}
261a23fd118Syl 
262a23fd118Syl 	if ((new_config->priority < XGE_HAL_MIN_RING_PRIORITY) ||
263a23fd118Syl 		(new_config->priority > XGE_HAL_MAX_RING_PRIORITY)) {
264a23fd118Syl 		return XGE_HAL_BADCFG_RING_PRIORITY;
265a23fd118Syl 	}
266a23fd118Syl 
267a23fd118Syl 	if ((new_config->rth_en < XGE_HAL_MIN_RING_RTH_EN) ||
268a23fd118Syl 		(new_config->rth_en > XGE_HAL_MAX_RING_RTH_EN)) {
269a23fd118Syl 		return XGE_HAL_BADCFG_RING_RTH_EN;
270a23fd118Syl 	}
271a23fd118Syl 
272a23fd118Syl 	if ((new_config->rts_mac_en < XGE_HAL_MIN_RING_RTS_MAC_EN) ||
273a23fd118Syl 		(new_config->rts_mac_en > XGE_HAL_MAX_RING_RTS_MAC_EN)) {
274a23fd118Syl 		return XGE_HAL_BADCFG_RING_RTS_MAC_EN;
275a23fd118Syl 	}
276a23fd118Syl 
2777eced415Sxw 	if ((new_config->rts_mac_en < XGE_HAL_MIN_RING_RTS_PORT_EN) ||
2787eced415Sxw 		(new_config->rts_mac_en > XGE_HAL_MAX_RING_RTS_PORT_EN)) {
2797eced415Sxw 		return XGE_HAL_BADCFG_RING_RTS_PORT_EN;
2807eced415Sxw 	}
2817eced415Sxw 
2827eced415Sxw 	if ((new_config->intr_vector < XGE_HAL_MIN_RING_QUEUE_INTR_VECTOR) ||
2837eced415Sxw 		(new_config->intr_vector > XGE_HAL_MAX_RING_QUEUE_INTR_VECTOR)) {
2847eced415Sxw 		return XGE_HAL_BADCFG_RING_QUEUE_INTR_VECTOR;
2857eced415Sxw 	}
2867eced415Sxw 
287a23fd118Syl 	if (new_config->indicate_max_pkts <
288a23fd118Syl 	XGE_HAL_MIN_RING_INDICATE_MAX_PKTS ||
289a23fd118Syl 	    new_config->indicate_max_pkts >
290a23fd118Syl 	    XGE_HAL_MAX_RING_INDICATE_MAX_PKTS) {
291a23fd118Syl 		return XGE_HAL_BADCFG_RING_INDICATE_MAX_PKTS;
292a23fd118Syl 	}
293a23fd118Syl 
294a23fd118Syl 	return __hal_rti_config_check(&new_config->rti);
295a23fd118Syl }
296a23fd118Syl 
297a23fd118Syl /*
298a23fd118Syl  * __hal_mac_config_check - Check mac configuration
299a23fd118Syl  * @new_config: mac configuration information
300a23fd118Syl  *
301a23fd118Syl  * Returns: XGE_HAL_OK - success,
302a23fd118Syl  * otherwise one of the xge_hal_status_e{} enumerated error codes.
303a23fd118Syl  */
304a23fd118Syl static xge_hal_status_e
__hal_mac_config_check(xge_hal_mac_config_t * new_config)305a23fd118Syl __hal_mac_config_check (xge_hal_mac_config_t *new_config)
306a23fd118Syl {
307a23fd118Syl 	if ((new_config->tmac_util_period < XGE_HAL_MIN_TMAC_UTIL_PERIOD) ||
308a23fd118Syl 		(new_config->tmac_util_period > XGE_HAL_MAX_TMAC_UTIL_PERIOD)) {
309a23fd118Syl 		return XGE_HAL_BADCFG_TMAC_UTIL_PERIOD;
310a23fd118Syl 	}
311a23fd118Syl 
312a23fd118Syl 	if ((new_config->rmac_util_period < XGE_HAL_MIN_RMAC_UTIL_PERIOD) ||
313a23fd118Syl 		(new_config->rmac_util_period > XGE_HAL_MAX_RMAC_UTIL_PERIOD)) {
314a23fd118Syl 		return XGE_HAL_BADCFG_RMAC_UTIL_PERIOD;
315a23fd118Syl 	}
316a23fd118Syl 
317a23fd118Syl 	if ((new_config->rmac_bcast_en < XGE_HAL_MIN_RMAC_BCAST_EN) ||
318a23fd118Syl 		(new_config->rmac_bcast_en > XGE_HAL_MAX_RMAC_BCAST_EN)) {
319a23fd118Syl 		return XGE_HAL_BADCFG_RMAC_BCAST_EN;
320a23fd118Syl 	}
321a23fd118Syl 
322a23fd118Syl 	if ((new_config->rmac_pause_gen_en < XGE_HAL_MIN_RMAC_PAUSE_GEN_EN) ||
323a23fd118Syl 		(new_config->rmac_pause_gen_en>XGE_HAL_MAX_RMAC_PAUSE_GEN_EN)) {
324a23fd118Syl 		return XGE_HAL_BADCFG_RMAC_PAUSE_GEN_EN;
325a23fd118Syl 	}
326a23fd118Syl 
327a23fd118Syl 	if ((new_config->rmac_pause_rcv_en < XGE_HAL_MIN_RMAC_PAUSE_RCV_EN) ||
328a23fd118Syl 		(new_config->rmac_pause_rcv_en>XGE_HAL_MAX_RMAC_PAUSE_RCV_EN)) {
329a23fd118Syl 		return XGE_HAL_BADCFG_RMAC_PAUSE_RCV_EN;
330a23fd118Syl 	}
331a23fd118Syl 
332a23fd118Syl 	if ((new_config->rmac_pause_time < XGE_HAL_MIN_RMAC_HIGH_PTIME) ||
333a23fd118Syl 		(new_config->rmac_pause_time > XGE_HAL_MAX_RMAC_HIGH_PTIME)) {
334a23fd118Syl 		return XGE_HAL_BADCFG_RMAC_HIGH_PTIME;
335a23fd118Syl 	}
336a23fd118Syl 
337a23fd118Syl 	if ((new_config->media < XGE_HAL_MIN_MEDIA) ||
338a23fd118Syl 		(new_config->media > XGE_HAL_MAX_MEDIA)) {
339a23fd118Syl 		return XGE_HAL_BADCFG_MEDIA;
340a23fd118Syl 	}
341a23fd118Syl 
342a23fd118Syl 	if ((new_config->mc_pause_threshold_q0q3 <
343a23fd118Syl 			XGE_HAL_MIN_MC_PAUSE_THRESHOLD_Q0Q3) ||
344a23fd118Syl 		(new_config->mc_pause_threshold_q0q3 >
345a23fd118Syl 			XGE_HAL_MAX_MC_PAUSE_THRESHOLD_Q0Q3)) {
346a23fd118Syl 		return XGE_HAL_BADCFG_MC_PAUSE_THRESHOLD_Q0Q3;
347a23fd118Syl 	}
348a23fd118Syl 
349a23fd118Syl 	if ((new_config->mc_pause_threshold_q4q7 <
350a23fd118Syl 			XGE_HAL_MIN_MC_PAUSE_THRESHOLD_Q4Q7) ||
351a23fd118Syl 		(new_config->mc_pause_threshold_q4q7 >
352a23fd118Syl 			XGE_HAL_MAX_MC_PAUSE_THRESHOLD_Q4Q7)) {
353a23fd118Syl 		return XGE_HAL_BADCFG_MC_PAUSE_THRESHOLD_Q4Q7;
354a23fd118Syl 	}
355a23fd118Syl 
356a23fd118Syl 	return XGE_HAL_OK;
357a23fd118Syl }
358a23fd118Syl 
359a23fd118Syl /*
360a23fd118Syl  * __hal_fifo_config_check - Check fifo configuration
361a23fd118Syl  * @new_config: fifo configuration information
362a23fd118Syl  *
363a23fd118Syl  * Returns: XGE_HAL_OK - success,
364a23fd118Syl  * otherwise one of the xge_hal_status_e{} enumerated error codes.
365a23fd118Syl  */
366a23fd118Syl static xge_hal_status_e
__hal_fifo_config_check(xge_hal_fifo_config_t * new_config)367a23fd118Syl __hal_fifo_config_check (xge_hal_fifo_config_t *new_config)
368a23fd118Syl {
369a23fd118Syl 	int i;
3707eced415Sxw 	int total_fifo_length = 0;
371a23fd118Syl 
372a23fd118Syl 	/*
373a23fd118Syl 	 * recompute max_frags to be multiple of 4,
374a23fd118Syl 	 * which means, multiple of 128 for TxDL
375a23fd118Syl 	 */
376a23fd118Syl 	new_config->max_frags = ((new_config->max_frags + 3) >> 2) << 2;
377a23fd118Syl 
378a23fd118Syl 	if ((new_config->max_frags < XGE_HAL_MIN_FIFO_FRAGS) ||
379a23fd118Syl 		(new_config->max_frags > XGE_HAL_MAX_FIFO_FRAGS))  {
380a23fd118Syl 		return XGE_HAL_BADCFG_FIFO_FRAGS;
381a23fd118Syl 	}
382a23fd118Syl 
383a23fd118Syl 	if ((new_config->reserve_threshold <
384a23fd118Syl 			XGE_HAL_MIN_FIFO_RESERVE_THRESHOLD) ||
385a23fd118Syl 		(new_config->reserve_threshold >
386a23fd118Syl 			XGE_HAL_MAX_FIFO_RESERVE_THRESHOLD)) {
387a23fd118Syl 		return XGE_HAL_BADCFG_FIFO_RESERVE_THRESHOLD;
388a23fd118Syl 	}
389a23fd118Syl 
390a23fd118Syl 	if ((new_config->memblock_size < XGE_HAL_MIN_FIFO_MEMBLOCK_SIZE) ||
391a23fd118Syl 		(new_config->memblock_size > XGE_HAL_MAX_FIFO_MEMBLOCK_SIZE)) {
392a23fd118Syl 		return XGE_HAL_BADCFG_FIFO_MEMBLOCK_SIZE;
393a23fd118Syl 	}
394a23fd118Syl 
395a23fd118Syl 	for(i = 0;  i < XGE_HAL_MAX_FIFO_NUM; i++) {
396a23fd118Syl 		xge_hal_status_e status;
397a23fd118Syl 
398a23fd118Syl 		if (!new_config->queue[i].configured)
399a23fd118Syl                         continue;
400a23fd118Syl 
4018347601bSyl 		if ((status = __hal_fifo_queue_check(new_config,
4028347601bSyl 				     &new_config->queue[i])) != XGE_HAL_OK) {
403a23fd118Syl 			return status;
404a23fd118Syl 		}
4057eced415Sxw 
4067eced415Sxw 	        total_fifo_length += new_config->queue[i].max;
4077eced415Sxw 	}
4087eced415Sxw 
4097eced415Sxw 	if(total_fifo_length > XGE_HAL_MAX_FIFO_QUEUE_LENGTH){
4107eced415Sxw 		return XGE_HAL_BADCFG_FIFO_QUEUE_MAX_LENGTH;
411a23fd118Syl 	}
412a23fd118Syl 
413a23fd118Syl 	return XGE_HAL_OK;
414a23fd118Syl }
415a23fd118Syl 
416a23fd118Syl /*
417a23fd118Syl  * __hal_ring_config_check - Check ring configuration
418a23fd118Syl  * @new_config: Ring configuration information
419a23fd118Syl  *
420a23fd118Syl  * Returns: XGE_HAL_OK - success,
421a23fd118Syl  * otherwise one of the xge_hal_status_e{} enumerated error codes.
422a23fd118Syl  */
423a23fd118Syl static xge_hal_status_e
__hal_ring_config_check(xge_hal_ring_config_t * new_config)424a23fd118Syl __hal_ring_config_check (xge_hal_ring_config_t *new_config)
425a23fd118Syl {
426a23fd118Syl 	int i;
427a23fd118Syl 
428a23fd118Syl 	if ((new_config->memblock_size < XGE_HAL_MIN_RING_MEMBLOCK_SIZE) ||
429a23fd118Syl 		(new_config->memblock_size > XGE_HAL_MAX_RING_MEMBLOCK_SIZE)) {
430a23fd118Syl 		return XGE_HAL_BADCFG_RING_MEMBLOCK_SIZE;
431a23fd118Syl 	}
432a23fd118Syl 
433a23fd118Syl 	for(i = 0;  i < XGE_HAL_MAX_RING_NUM; i++) {
434a23fd118Syl 		xge_hal_status_e status;
435a23fd118Syl 
436a23fd118Syl 		if (!new_config->queue[i].configured)
437a23fd118Syl                         continue;
438a23fd118Syl 
439a23fd118Syl 		if ((status = __hal_ring_queue_check(&new_config->queue[i]))
440a23fd118Syl 					!= XGE_HAL_OK) {
441a23fd118Syl 			return status;
442a23fd118Syl 		}
443a23fd118Syl 	}
444a23fd118Syl 
445a23fd118Syl 	return XGE_HAL_OK;
446a23fd118Syl }
447a23fd118Syl 
448a23fd118Syl 
449a23fd118Syl /*
450a23fd118Syl  * __hal_device_config_check_common - Check device configuration.
451a23fd118Syl  * @new_config: Device configuration information
452a23fd118Syl  *
453a23fd118Syl  * Check part of configuration that is common to
454a23fd118Syl  * Xframe-I and Xframe-II.
455a23fd118Syl  *
456a23fd118Syl  * Returns: XGE_HAL_OK - success,
457a23fd118Syl  * otherwise one of the xge_hal_status_e{} enumerated error codes.
458a23fd118Syl  *
459a23fd118Syl  * See also: __hal_device_config_check_xena().
460a23fd118Syl  */
461a23fd118Syl xge_hal_status_e
__hal_device_config_check_common(xge_hal_device_config_t * new_config)462a23fd118Syl __hal_device_config_check_common (xge_hal_device_config_t *new_config)
463a23fd118Syl {
464a23fd118Syl 	xge_hal_status_e status;
465a23fd118Syl 
466a23fd118Syl 	if ((new_config->mtu < XGE_HAL_MIN_MTU) ||
467a23fd118Syl 		(new_config->mtu > XGE_HAL_MAX_MTU)) {
468a23fd118Syl 		return XGE_HAL_BADCFG_MAX_MTU;
469a23fd118Syl 	}
470a23fd118Syl 
4718347601bSyl 	if ((new_config->bimodal_interrupts < XGE_HAL_BIMODAL_INTR_MIN) ||
4728347601bSyl 		(new_config->bimodal_interrupts > XGE_HAL_BIMODAL_INTR_MAX)) {
4738347601bSyl 		return XGE_HAL_BADCFG_BIMODAL_INTR;
4748347601bSyl 	}
4758347601bSyl 
4768347601bSyl 	if (new_config->bimodal_interrupts &&
4778347601bSyl 	    ((new_config->bimodal_timer_lo_us < XGE_HAL_BIMODAL_TIMER_LO_US_MIN) ||
4788347601bSyl 		(new_config->bimodal_timer_lo_us > XGE_HAL_BIMODAL_TIMER_LO_US_MAX))) {
4798347601bSyl 		return XGE_HAL_BADCFG_BIMODAL_TIMER_LO_US;
4808347601bSyl 	}
4818347601bSyl 
4828347601bSyl 	if (new_config->bimodal_interrupts &&
4838347601bSyl 	    ((new_config->bimodal_timer_hi_us < XGE_HAL_BIMODAL_TIMER_HI_US_MIN) ||
4848347601bSyl 		(new_config->bimodal_timer_hi_us > XGE_HAL_BIMODAL_TIMER_HI_US_MAX))) {
4858347601bSyl 		return XGE_HAL_BADCFG_BIMODAL_TIMER_HI_US;
4868347601bSyl 	}
4878347601bSyl 
488a23fd118Syl 	if ((new_config->no_isr_events < XGE_HAL_NO_ISR_EVENTS_MIN) ||
489a23fd118Syl 		(new_config->no_isr_events > XGE_HAL_NO_ISR_EVENTS_MAX)) {
490a23fd118Syl 		return XGE_HAL_BADCFG_NO_ISR_EVENTS;
491a23fd118Syl 	}
492a23fd118Syl 
493a23fd118Syl 	if ((new_config->isr_polling_cnt < XGE_HAL_MIN_ISR_POLLING_CNT) ||
494a23fd118Syl 		(new_config->isr_polling_cnt > XGE_HAL_MAX_ISR_POLLING_CNT)) {
495a23fd118Syl 		return XGE_HAL_BADCFG_ISR_POLLING_CNT;
496a23fd118Syl 	}
497a23fd118Syl 
498a23fd118Syl 	if (new_config->latency_timer &&
499a23fd118Syl 	    new_config->latency_timer != XGE_HAL_USE_BIOS_DEFAULT_LATENCY) {
500a23fd118Syl                 if ((new_config->latency_timer < XGE_HAL_MIN_LATENCY_TIMER) ||
501a23fd118Syl 		    (new_config->latency_timer > XGE_HAL_MAX_LATENCY_TIMER)) {
502a23fd118Syl                         return XGE_HAL_BADCFG_LATENCY_TIMER;
503a23fd118Syl 		}
504a23fd118Syl 	}
505a23fd118Syl 
506a23fd118Syl 	if (new_config->max_splits_trans != XGE_HAL_USE_BIOS_DEFAULT_SPLITS)  {
507a23fd118Syl 		if ((new_config->max_splits_trans <
508a23fd118Syl 			XGE_HAL_ONE_SPLIT_TRANSACTION) ||
509a23fd118Syl 		    (new_config->max_splits_trans >
510a23fd118Syl 			XGE_HAL_THIRTYTWO_SPLIT_TRANSACTION))
511a23fd118Syl 		return XGE_HAL_BADCFG_MAX_SPLITS_TRANS;
512a23fd118Syl 	}
513a23fd118Syl 
514*55fea89dSDan Cross 	if (new_config->mmrb_count != XGE_HAL_DEFAULT_BIOS_MMRB_COUNT)
515a23fd118Syl 	{
516a23fd118Syl 	    if ((new_config->mmrb_count < XGE_HAL_MIN_MMRB_COUNT) ||
517a23fd118Syl 		    (new_config->mmrb_count > XGE_HAL_MAX_MMRB_COUNT)) {
518a23fd118Syl     		return XGE_HAL_BADCFG_MMRB_COUNT;
519a23fd118Syl 	    }
520a23fd118Syl 	}
521a23fd118Syl 
522a23fd118Syl 	if ((new_config->shared_splits < XGE_HAL_MIN_SHARED_SPLITS) ||
523a23fd118Syl 		(new_config->shared_splits > XGE_HAL_MAX_SHARED_SPLITS)) {
524a23fd118Syl 		return XGE_HAL_BADCFG_SHARED_SPLITS;
525a23fd118Syl 	}
526a23fd118Syl 
527a23fd118Syl 	if (new_config->stats_refresh_time_sec !=
528a23fd118Syl 	        XGE_HAL_STATS_REFRESH_DISABLE)  {
529a23fd118Syl 	        if ((new_config->stats_refresh_time_sec <
530a23fd118Syl 				        XGE_HAL_MIN_STATS_REFRESH_TIME) ||
531a23fd118Syl 	            (new_config->stats_refresh_time_sec >
532a23fd118Syl 				        XGE_HAL_MAX_STATS_REFRESH_TIME)) {
533a23fd118Syl 		        return XGE_HAL_BADCFG_STATS_REFRESH_TIME;
534a23fd118Syl 	        }
535a23fd118Syl 	}
536a23fd118Syl 
537a23fd118Syl 	if ((new_config->intr_mode != XGE_HAL_INTR_MODE_IRQLINE) &&
538a23fd118Syl 		(new_config->intr_mode != XGE_HAL_INTR_MODE_MSI) &&
539a23fd118Syl 		(new_config->intr_mode != XGE_HAL_INTR_MODE_MSIX)) {
540a23fd118Syl 		return XGE_HAL_BADCFG_INTR_MODE;
541a23fd118Syl 	}
542a23fd118Syl 
543a23fd118Syl 	if ((new_config->sched_timer_us < XGE_HAL_SCHED_TIMER_MIN) ||
544a23fd118Syl 		(new_config->sched_timer_us > XGE_HAL_SCHED_TIMER_MAX)) {
545a23fd118Syl 		return XGE_HAL_BADCFG_SCHED_TIMER_US;
546a23fd118Syl 	}
547a23fd118Syl 
548a23fd118Syl 	if ((new_config->sched_timer_one_shot !=
549a23fd118Syl 			XGE_HAL_SCHED_TIMER_ON_SHOT_DISABLE)  &&
550a23fd118Syl 		(new_config->sched_timer_one_shot !=
551a23fd118Syl 			XGE_HAL_SCHED_TIMER_ON_SHOT_ENABLE)) {
552a23fd118Syl 		return XGE_HAL_BADCFG_SCHED_TIMER_ON_SHOT;
553a23fd118Syl 	}
554a23fd118Syl 
5558347601bSyl 	/*
5568347601bSyl 	 * Check adaptive schema parameters. Note that there are two
5578347601bSyl 	 * configuration variables needs to be enabled in ULD:
5588347601bSyl 	 *
5598347601bSyl 	 *   a) sched_timer_us should not be zero;
5608347601bSyl 	 *   b) rxufca_hi_lim should not be equal to rxufca_lo_lim.
5618347601bSyl 	 *
5628347601bSyl 	 * The code bellow checking for those conditions.
5638347601bSyl 	 */
5648347601bSyl 	if (new_config->sched_timer_us &&
5658347601bSyl 	    new_config->rxufca_hi_lim != new_config->rxufca_lo_lim) {
566a23fd118Syl 		if ((new_config->rxufca_intr_thres <
567a23fd118Syl 					XGE_HAL_RXUFCA_INTR_THRES_MIN) ||
568a23fd118Syl 		    (new_config->rxufca_intr_thres >
569a23fd118Syl 					XGE_HAL_RXUFCA_INTR_THRES_MAX)) {
570a23fd118Syl 			return XGE_HAL_BADCFG_RXUFCA_INTR_THRES;
571a23fd118Syl 		}
572a23fd118Syl 
573a23fd118Syl 		if ((new_config->rxufca_hi_lim < XGE_HAL_RXUFCA_HI_LIM_MIN) ||
574a23fd118Syl 		    (new_config->rxufca_hi_lim > XGE_HAL_RXUFCA_HI_LIM_MAX)) {
575a23fd118Syl 			return XGE_HAL_BADCFG_RXUFCA_HI_LIM;
576a23fd118Syl 		}
577a23fd118Syl 
578a23fd118Syl 		if ((new_config->rxufca_lo_lim < XGE_HAL_RXUFCA_LO_LIM_MIN) ||
579a23fd118Syl 		    (new_config->rxufca_lo_lim > XGE_HAL_RXUFCA_LO_LIM_MAX) ||
580a23fd118Syl 		    (new_config->rxufca_lo_lim > new_config->rxufca_hi_lim)) {
581a23fd118Syl 			return XGE_HAL_BADCFG_RXUFCA_LO_LIM;
582a23fd118Syl 		}
583a23fd118Syl 
584a23fd118Syl 		if ((new_config->rxufca_lbolt_period <
585a23fd118Syl 					XGE_HAL_RXUFCA_LBOLT_PERIOD_MIN) ||
586a23fd118Syl 		    (new_config->rxufca_lbolt_period >
587a23fd118Syl 					XGE_HAL_RXUFCA_LBOLT_PERIOD_MAX)) {
588a23fd118Syl 			return XGE_HAL_BADCFG_RXUFCA_LBOLT_PERIOD;
589a23fd118Syl 		}
590a23fd118Syl 	}
591a23fd118Syl 
592a23fd118Syl 	if ((new_config->link_valid_cnt < XGE_HAL_LINK_VALID_CNT_MIN) ||
593a23fd118Syl 		(new_config->link_valid_cnt > XGE_HAL_LINK_VALID_CNT_MAX)) {
594a23fd118Syl 		return XGE_HAL_BADCFG_LINK_VALID_CNT;
595a23fd118Syl 	}
596a23fd118Syl 
597a23fd118Syl 	if ((new_config->link_retry_cnt < XGE_HAL_LINK_RETRY_CNT_MIN) ||
598a23fd118Syl 		(new_config->link_retry_cnt > XGE_HAL_LINK_RETRY_CNT_MAX)) {
599a23fd118Syl 		return XGE_HAL_BADCFG_LINK_RETRY_CNT;
600a23fd118Syl 	}
601a23fd118Syl 
602a23fd118Syl 	if (new_config->link_valid_cnt > new_config->link_retry_cnt)
603a23fd118Syl 		return XGE_HAL_BADCFG_LINK_VALID_CNT;
604a23fd118Syl 
605a23fd118Syl 	if (new_config->link_stability_period != XGE_HAL_DEFAULT_USE_HARDCODE) {
606a23fd118Syl 	        if ((new_config->link_stability_period <
607a23fd118Syl 				        XGE_HAL_MIN_LINK_STABILITY_PERIOD) ||
608a23fd118Syl 		        (new_config->link_stability_period >
609a23fd118Syl 				        XGE_HAL_MAX_LINK_STABILITY_PERIOD)) {
610a23fd118Syl 		        return XGE_HAL_BADCFG_LINK_STABILITY_PERIOD;
611a23fd118Syl 	        }
612a23fd118Syl 	}
613a23fd118Syl 
614a23fd118Syl 	if (new_config->device_poll_millis !=
615a23fd118Syl 	                XGE_HAL_DEFAULT_USE_HARDCODE)  {
616a23fd118Syl 	        if ((new_config->device_poll_millis <
617a23fd118Syl 			        XGE_HAL_MIN_DEVICE_POLL_MILLIS) ||
618a23fd118Syl 		        (new_config->device_poll_millis >
619a23fd118Syl 			        XGE_HAL_MAX_DEVICE_POLL_MILLIS)) {
620a23fd118Syl 		        return XGE_HAL_BADCFG_DEVICE_POLL_MILLIS;
621a23fd118Syl 	        }
622a23fd118Syl         }
623a23fd118Syl 
6247eced415Sxw 	if ((new_config->rts_port_en < XGE_HAL_MIN_RING_RTS_PORT_EN) ||
6257eced415Sxw 		(new_config->rts_port_en > XGE_HAL_MAX_RING_RTS_PORT_EN)) {
6267eced415Sxw 		return XGE_HAL_BADCFG_RTS_PORT_EN;
6277eced415Sxw 	}
6287eced415Sxw 
6297eced415Sxw 	if ((new_config->rts_qos_en < XGE_HAL_RTS_QOS_DISABLE) ||
6307eced415Sxw 		(new_config->rts_qos_en > XGE_HAL_RTS_QOS_ENABLE)) {
6317eced415Sxw 		return XGE_HAL_BADCFG_RTS_QOS_EN;
6328347601bSyl 	}
6338347601bSyl 
6348347601bSyl #if defined(XGE_HAL_CONFIG_LRO)
6358347601bSyl 	if (new_config->lro_sg_size !=
6368347601bSyl 				XGE_HAL_DEFAULT_USE_HARDCODE)  {
6378347601bSyl 		if ((new_config->lro_sg_size < XGE_HAL_LRO_MIN_SG_SIZE) ||
6388347601bSyl 			(new_config->lro_sg_size > XGE_HAL_LRO_MAX_SG_SIZE)) {
6398347601bSyl 			return XGE_HAL_BADCFG_LRO_SG_SIZE;
6408347601bSyl 		}
6418347601bSyl 	}
6428347601bSyl 
6438347601bSyl 	if (new_config->lro_frm_len !=
6448347601bSyl 				XGE_HAL_DEFAULT_USE_HARDCODE)  {
6458347601bSyl 		if ((new_config->lro_frm_len < XGE_HAL_LRO_MIN_FRM_LEN) ||
6468347601bSyl 			(new_config->lro_frm_len > XGE_HAL_LRO_MAX_FRM_LEN)) {
6478347601bSyl 			return XGE_HAL_BADCFG_LRO_FRM_LEN;
6488347601bSyl 		}
6498347601bSyl 	}
6508347601bSyl #endif
6518347601bSyl 
652a23fd118Syl 	if ((status = __hal_ring_config_check(&new_config->ring))
653a23fd118Syl 			!= XGE_HAL_OK) {
654a23fd118Syl 		return status;
655a23fd118Syl 	}
656a23fd118Syl 
657a23fd118Syl 	if ((status = __hal_mac_config_check(&new_config->mac)) !=
658a23fd118Syl 	    XGE_HAL_OK) {
659a23fd118Syl 		return status;
660a23fd118Syl 	}
661a23fd118Syl 
662a23fd118Syl 	if ((status = __hal_fifo_config_check(&new_config->fifo)) !=
663a23fd118Syl 	    XGE_HAL_OK) {
664a23fd118Syl 		return status;
665a23fd118Syl 	}
666a23fd118Syl 
667a23fd118Syl 	return XGE_HAL_OK;
668a23fd118Syl }
669a23fd118Syl 
670a23fd118Syl /*
671a23fd118Syl  * __hal_device_config_check_xena - Check Xframe-I configuration
672a23fd118Syl  * @new_config: Device configuration.
673a23fd118Syl  *
674a23fd118Syl  * Check part of configuration that is relevant only to Xframe-I.
675a23fd118Syl  *
676a23fd118Syl  * Returns: XGE_HAL_OK - success,
677a23fd118Syl  * otherwise one of the xge_hal_status_e{} enumerated error codes.
678a23fd118Syl  *
679a23fd118Syl  * See also: __hal_device_config_check_common().
680a23fd118Syl  */
681a23fd118Syl xge_hal_status_e
__hal_device_config_check_xena(xge_hal_device_config_t * new_config)682a23fd118Syl __hal_device_config_check_xena (xge_hal_device_config_t *new_config)
683a23fd118Syl {
684a23fd118Syl 	if ((new_config->pci_freq_mherz != XGE_HAL_PCI_FREQ_MHERZ_33) &&
685a23fd118Syl 		(new_config->pci_freq_mherz != XGE_HAL_PCI_FREQ_MHERZ_66) &&
686a23fd118Syl 		(new_config->pci_freq_mherz != XGE_HAL_PCI_FREQ_MHERZ_100) &&
687a23fd118Syl 		(new_config->pci_freq_mherz != XGE_HAL_PCI_FREQ_MHERZ_133) &&
6888347601bSyl 		(new_config->pci_freq_mherz != XGE_HAL_PCI_FREQ_MHERZ_266) &&
6898347601bSyl 		(new_config->pci_freq_mherz != XGE_HAL_DEFAULT_USE_HARDCODE)) {
690a23fd118Syl 		return XGE_HAL_BADCFG_PCI_FREQ_MHERZ;
691a23fd118Syl 	}
692a23fd118Syl 
693a23fd118Syl 	return XGE_HAL_OK;
694a23fd118Syl }
695a23fd118Syl 
696a23fd118Syl /*
697a23fd118Syl  * __hal_device_config_check_herc - Check device configuration
698a23fd118Syl  * @new_config: Device configuration.
699a23fd118Syl  *
700a23fd118Syl  * Check part of configuration that is relevant only to Xframe-II.
701a23fd118Syl  *
702a23fd118Syl  * Returns: XGE_HAL_OK - success,
703a23fd118Syl  * otherwise one of the xge_hal_status_e{} enumerated error codes.
704a23fd118Syl  *
705a23fd118Syl  * See also: __hal_device_config_check_common().
706a23fd118Syl  */
707a23fd118Syl xge_hal_status_e
__hal_device_config_check_herc(xge_hal_device_config_t * new_config)708a23fd118Syl __hal_device_config_check_herc (xge_hal_device_config_t *new_config)
709a23fd118Syl {
710a23fd118Syl 	return XGE_HAL_OK;
711a23fd118Syl }
712a23fd118Syl 
713a23fd118Syl 
7148347601bSyl /*
715a23fd118Syl  * __hal_driver_config_check - Check HAL configuration
716a23fd118Syl  * @new_config: Driver configuration information
717a23fd118Syl  *
718a23fd118Syl  * Returns: XGE_HAL_OK - success,
719a23fd118Syl  * otherwise one of the xge_hal_status_e{} enumerated error codes.
720a23fd118Syl  */
721a23fd118Syl xge_hal_status_e
__hal_driver_config_check(xge_hal_driver_config_t * new_config)722a23fd118Syl __hal_driver_config_check (xge_hal_driver_config_t *new_config)
723a23fd118Syl {
724a23fd118Syl 	if ((new_config->queue_size_initial <
725a23fd118Syl                 XGE_HAL_MIN_QUEUE_SIZE_INITIAL) ||
726a23fd118Syl 	    (new_config->queue_size_initial >
727a23fd118Syl                 XGE_HAL_MAX_QUEUE_SIZE_INITIAL)) {
728a23fd118Syl 		return XGE_HAL_BADCFG_QUEUE_SIZE_INITIAL;
729a23fd118Syl 	}
730a23fd118Syl 
731a23fd118Syl 	if ((new_config->queue_size_max < XGE_HAL_MIN_QUEUE_SIZE_MAX) ||
732a23fd118Syl 		(new_config->queue_size_max > XGE_HAL_MAX_QUEUE_SIZE_MAX)) {
733a23fd118Syl 		return XGE_HAL_BADCFG_QUEUE_SIZE_MAX;
734a23fd118Syl 	}
735a23fd118Syl 
736a23fd118Syl #ifdef XGE_TRACE_INTO_CIRCULAR_ARR
737a23fd118Syl 	if ((new_config->tracebuf_size < XGE_HAL_MIN_CIRCULAR_ARR) ||
738a23fd118Syl 		(new_config->tracebuf_size > XGE_HAL_MAX_CIRCULAR_ARR)) {
739a23fd118Syl 		return XGE_HAL_BADCFG_TRACEBUF_SIZE;
740a23fd118Syl 	}
7417eced415Sxw 	if ((new_config->tracebuf_timestamp_en < XGE_HAL_MIN_TIMESTAMP_EN) ||
7427eced415Sxw 		(new_config->tracebuf_timestamp_en > XGE_HAL_MAX_TIMESTAMP_EN)) {
7437eced415Sxw 		return XGE_HAL_BADCFG_TRACEBUF_SIZE;
7447eced415Sxw 	}
745a23fd118Syl #endif
746a23fd118Syl 
747a23fd118Syl 	return XGE_HAL_OK;
748a23fd118Syl }
749