xref: /onnv-gate/usr/src/uts/common/io/xge/hal/xgehal/xgehal-config.c (revision 6937:a5e2c8b5c817)
11256Syl150051 /*
21256Syl150051  * CDDL HEADER START
31256Syl150051  *
41256Syl150051  * The contents of this file are subject to the terms of the
51256Syl150051  * Common Development and Distribution License (the "License").
61256Syl150051  * You may not use this file except in compliance with the License.
71256Syl150051  *
81256Syl150051  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
91256Syl150051  * or http://www.opensolaris.org/os/licensing.
101256Syl150051  * See the License for the specific language governing permissions
111256Syl150051  * and limitations under the License.
121256Syl150051  *
131256Syl150051  * When distributing Covered Code, include this CDDL HEADER in each
141256Syl150051  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
151256Syl150051  * If applicable, add the following below this CDDL HEADER, with the
161256Syl150051  * fields enclosed by brackets "[]" replaced with your own identifying
171256Syl150051  * information: Portions Copyright [yyyy] [name of copyright owner]
181256Syl150051  *
191256Syl150051  * CDDL HEADER END
201256Syl150051  *
213115Syl150051  * Copyright (c) 2002-2006 Neterion, Inc.
221256Syl150051  */
231256Syl150051 
241256Syl150051 #include "xgehal-config.h"
251256Syl150051 #include "xge-debug.h"
261256Syl150051 
271256Syl150051 /*
281256Syl150051  * __hal_tti_config_check - Check tti configuration
291256Syl150051  * @new_config: tti configuration information
301256Syl150051  *
311256Syl150051  * Returns: XGE_HAL_OK - success,
321256Syl150051  * otherwise one of the xge_hal_status_e{} enumerated error codes.
331256Syl150051  */
341256Syl150051 static xge_hal_status_e
__hal_tti_config_check(xge_hal_tti_config_t * new_config)351256Syl150051 __hal_tti_config_check (xge_hal_tti_config_t *new_config)
361256Syl150051 {
371256Syl150051 	if ((new_config->urange_a < XGE_HAL_MIN_TX_URANGE_A) ||
381256Syl150051 		(new_config->urange_a > XGE_HAL_MAX_TX_URANGE_A)) {
391256Syl150051 		return XGE_HAL_BADCFG_TX_URANGE_A;
401256Syl150051 	}
411256Syl150051 
421256Syl150051 	if ((new_config->ufc_a < XGE_HAL_MIN_TX_UFC_A) ||
431256Syl150051 		(new_config->ufc_a > XGE_HAL_MAX_TX_UFC_A)) {
441256Syl150051 		return XGE_HAL_BADCFG_TX_UFC_A;
451256Syl150051 	}
461256Syl150051 
471256Syl150051 	if ((new_config->urange_b < XGE_HAL_MIN_TX_URANGE_B) ||
481256Syl150051 		(new_config->urange_b > XGE_HAL_MAX_TX_URANGE_B)) {
491256Syl150051 		return XGE_HAL_BADCFG_TX_URANGE_B;
501256Syl150051 	}
511256Syl150051 
521256Syl150051 	if ((new_config->ufc_b < XGE_HAL_MIN_TX_UFC_B) ||
531256Syl150051 		(new_config->ufc_b > XGE_HAL_MAX_TX_UFC_B)) {
541256Syl150051 		return XGE_HAL_BADCFG_TX_UFC_B;
551256Syl150051 	}
561256Syl150051 
571256Syl150051 	if ((new_config->urange_c < XGE_HAL_MIN_TX_URANGE_C) ||
581256Syl150051 		(new_config->urange_c > XGE_HAL_MAX_TX_URANGE_C)) {
591256Syl150051 		return XGE_HAL_BADCFG_TX_URANGE_C;
601256Syl150051 	}
611256Syl150051 
621256Syl150051 	if ((new_config->ufc_c < XGE_HAL_MIN_TX_UFC_C) ||
631256Syl150051 		(new_config->ufc_c > XGE_HAL_MAX_TX_UFC_C)) {
641256Syl150051 		return XGE_HAL_BADCFG_TX_UFC_C;
651256Syl150051 	}
661256Syl150051 
671256Syl150051 	if ((new_config->ufc_d < XGE_HAL_MIN_TX_UFC_D) ||
681256Syl150051 		(new_config->ufc_d > XGE_HAL_MAX_TX_UFC_D)) {
691256Syl150051 		return XGE_HAL_BADCFG_TX_UFC_D;
701256Syl150051 	}
711256Syl150051 
721256Syl150051 	if ((new_config->timer_val_us < XGE_HAL_MIN_TX_TIMER_VAL) ||
731256Syl150051 		(new_config->timer_val_us > XGE_HAL_MAX_TX_TIMER_VAL)) {
741256Syl150051 		return XGE_HAL_BADCFG_TX_TIMER_VAL;
751256Syl150051 	}
761256Syl150051 
771256Syl150051 	if ((new_config->timer_ci_en < XGE_HAL_MIN_TX_TIMER_CI_EN) ||
781256Syl150051 		(new_config->timer_ci_en > XGE_HAL_MAX_TX_TIMER_CI_EN)) {
791256Syl150051 		return XGE_HAL_BADCFG_TX_TIMER_CI_EN;
801256Syl150051 	}
811256Syl150051 
821256Syl150051 	if ((new_config->timer_ac_en < XGE_HAL_MIN_TX_TIMER_AC_EN) ||
831256Syl150051 		(new_config->timer_ac_en > XGE_HAL_MAX_TX_TIMER_AC_EN)) {
841256Syl150051 		return XGE_HAL_BADCFG_TX_TIMER_AC_EN;
851256Syl150051 	}
861256Syl150051 
871256Syl150051 	return XGE_HAL_OK;
881256Syl150051 }
891256Syl150051 
901256Syl150051 /*
911256Syl150051  * __hal_rti_config_check - Check rti configuration
921256Syl150051  * @new_config: rti configuration information
931256Syl150051  *
941256Syl150051  * Returns: XGE_HAL_OK - success,
951256Syl150051  * otherwise one of the xge_hal_status_e{} enumerated error codes.
961256Syl150051  */
971256Syl150051 static xge_hal_status_e
__hal_rti_config_check(xge_hal_rti_config_t * new_config)981256Syl150051 __hal_rti_config_check (xge_hal_rti_config_t *new_config)
991256Syl150051 {
1001256Syl150051 	if ((new_config->urange_a < XGE_HAL_MIN_RX_URANGE_A) ||
1011256Syl150051 		(new_config->urange_a > XGE_HAL_MAX_RX_URANGE_A)) {
1021256Syl150051 		return XGE_HAL_BADCFG_RX_URANGE_A;
1031256Syl150051 	}
1041256Syl150051 
1051256Syl150051 	if ((new_config->ufc_a < XGE_HAL_MIN_RX_UFC_A) ||
1061256Syl150051 		(new_config->ufc_a > XGE_HAL_MAX_RX_UFC_A)) {
1071256Syl150051 		return XGE_HAL_BADCFG_RX_UFC_A;
1081256Syl150051 	}
1091256Syl150051 
1101256Syl150051 	if ((new_config->urange_b < XGE_HAL_MIN_RX_URANGE_B) ||
1111256Syl150051 		(new_config->urange_b > XGE_HAL_MAX_RX_URANGE_B)) {
1121256Syl150051 		return XGE_HAL_BADCFG_RX_URANGE_B;
1131256Syl150051 	}
1141256Syl150051 
1151256Syl150051 	if ((new_config->ufc_b < XGE_HAL_MIN_RX_UFC_B) ||
1161256Syl150051 		(new_config->ufc_b > XGE_HAL_MAX_RX_UFC_B)) {
1171256Syl150051 		return XGE_HAL_BADCFG_RX_UFC_B;
1181256Syl150051 	}
1191256Syl150051 
1201256Syl150051 	if ((new_config->urange_c < XGE_HAL_MIN_RX_URANGE_C) ||
1211256Syl150051 		(new_config->urange_c > XGE_HAL_MAX_RX_URANGE_C)) {
1221256Syl150051 		return XGE_HAL_BADCFG_RX_URANGE_C;
1231256Syl150051 	}
1241256Syl150051 
1251256Syl150051 	if ((new_config->ufc_c < XGE_HAL_MIN_RX_UFC_C) ||
1261256Syl150051 		(new_config->ufc_c > XGE_HAL_MAX_RX_UFC_C)) {
1271256Syl150051 		return XGE_HAL_BADCFG_RX_UFC_C;
1281256Syl150051 	}
1291256Syl150051 
1301256Syl150051 	if ((new_config->ufc_d < XGE_HAL_MIN_RX_UFC_D) ||
1311256Syl150051 		(new_config->ufc_d > XGE_HAL_MAX_RX_UFC_D)) {
1321256Syl150051 		return XGE_HAL_BADCFG_RX_UFC_D;
1331256Syl150051 	}
1341256Syl150051 
1351256Syl150051 	if ((new_config->timer_val_us < XGE_HAL_MIN_RX_TIMER_VAL) ||
1361256Syl150051 		(new_config->timer_val_us > XGE_HAL_MAX_RX_TIMER_VAL)) {
1371256Syl150051 		return XGE_HAL_BADCFG_RX_TIMER_VAL;
1381256Syl150051 	}
1391256Syl150051 
1401256Syl150051 	if ((new_config->timer_ac_en < XGE_HAL_MIN_RX_TIMER_AC_EN) ||
1411256Syl150051 		(new_config->timer_ac_en > XGE_HAL_MAX_RX_TIMER_AC_EN)) {
1421256Syl150051 		return XGE_HAL_BADCFG_RX_TIMER_AC_EN;
1431256Syl150051 	}
1441256Syl150051 
1451256Syl150051 	return XGE_HAL_OK;
1461256Syl150051 }
1471256Syl150051 
1481256Syl150051 
1491256Syl150051 /*
1501256Syl150051  * __hal_fifo_queue_check - Check fifo queue configuration
1511256Syl150051  * @new_config: fifo queue configuration information
1521256Syl150051  *
1531256Syl150051  * Returns: XGE_HAL_OK - success,
1541256Syl150051  * otherwise one of the xge_hal_status_e{} enumerated error codes.
1551256Syl150051  */
1561256Syl150051 static xge_hal_status_e
__hal_fifo_queue_check(xge_hal_fifo_config_t * new_config,xge_hal_fifo_queue_t * new_queue)1573115Syl150051 __hal_fifo_queue_check (xge_hal_fifo_config_t *new_config,
1583115Syl150051 			xge_hal_fifo_queue_t *new_queue)
1591256Syl150051 {
1603115Syl150051 	int i;
1613115Syl150051 
1623115Syl150051 	if ((new_queue->initial < XGE_HAL_MIN_FIFO_QUEUE_LENGTH) ||
1633115Syl150051 		(new_queue->initial > XGE_HAL_MAX_FIFO_QUEUE_LENGTH)) {
1641256Syl150051 		return XGE_HAL_BADCFG_FIFO_QUEUE_INITIAL_LENGTH;
1651256Syl150051 	}
1661256Syl150051 
1671256Syl150051 	/* FIXME: queue "grow" feature is not supported.
1681256Syl150051 	 *        Use "initial" queue size as the "maximum";
1691256Syl150051 	 *        Remove the next line when fixed. */
1703115Syl150051 	new_queue->max = new_queue->initial;
1711256Syl150051 
1723115Syl150051 	if ((new_queue->max < XGE_HAL_MIN_FIFO_QUEUE_LENGTH) ||
1733115Syl150051 		(new_queue->max > XGE_HAL_MAX_FIFO_QUEUE_LENGTH)) {
1741256Syl150051 		return XGE_HAL_BADCFG_FIFO_QUEUE_MAX_LENGTH;
1751256Syl150051 	}
1761256Syl150051 
1773115Syl150051 	if (new_queue->max < new_config->reserve_threshold) {
1783115Syl150051 		return XGE_HAL_BADCFG_FIFO_RESERVE_THRESHOLD;
1793115Syl150051 	}
1803115Syl150051 
1813115Syl150051 	if ((new_queue->intr < XGE_HAL_MIN_FIFO_QUEUE_INTR) ||
1823115Syl150051 		(new_queue->intr > XGE_HAL_MAX_FIFO_QUEUE_INTR)) {
1831256Syl150051 		return XGE_HAL_BADCFG_FIFO_QUEUE_INTR;
1841256Syl150051 	}
1851256Syl150051 
186*6937Sxw161283 	if ((new_queue->intr_vector < XGE_HAL_MIN_FIFO_QUEUE_INTR_VECTOR) ||
187*6937Sxw161283 		(new_queue->intr_vector > XGE_HAL_MAX_FIFO_QUEUE_INTR_VECTOR)) {
188*6937Sxw161283 		return XGE_HAL_BADCFG_FIFO_QUEUE_INTR_VECTOR;
189*6937Sxw161283 	}
190*6937Sxw161283 
1913115Syl150051 	for(i = 0;  i < XGE_HAL_MAX_FIFO_TTI_NUM; i++) {
1923115Syl150051 		/*
1933115Syl150051 		 * Validate the tti configuration parameters only if
1943115Syl150051 		 * the TTI feature is enabled.
1953115Syl150051 		 */
1963115Syl150051 		if (new_queue->tti[i].enabled) {
1973115Syl150051 			xge_hal_status_e status;
1983115Syl150051 
1993115Syl150051 			if ((status = __hal_tti_config_check(
2003115Syl150051 				     &new_queue->tti[i])) != XGE_HAL_OK) {
2013115Syl150051 				return status;
2023115Syl150051 			}
2033115Syl150051 		}
2043115Syl150051 	}
2053115Syl150051 
2061256Syl150051 	return XGE_HAL_OK;
2071256Syl150051 }
2081256Syl150051 
2091256Syl150051 /*
2101256Syl150051  * __hal_ring_queue_check - Check ring queue configuration
2111256Syl150051  * @new_config: ring queue configuration information
2121256Syl150051  *
2131256Syl150051  * Returns: XGE_HAL_OK - success,
2141256Syl150051  * otherwise one of the xge_hal_status_e{} enumerated error codes.
2151256Syl150051  */
2161256Syl150051 static xge_hal_status_e
__hal_ring_queue_check(xge_hal_ring_queue_t * new_config)2171256Syl150051 __hal_ring_queue_check (xge_hal_ring_queue_t *new_config)
2181256Syl150051 {
2191256Syl150051 
2201256Syl150051 	if ((new_config->initial < XGE_HAL_MIN_RING_QUEUE_BLOCKS) ||
2211256Syl150051 		(new_config->initial > XGE_HAL_MAX_RING_QUEUE_BLOCKS)) {
2221256Syl150051 		return XGE_HAL_BADCFG_RING_QUEUE_INITIAL_BLOCKS;
2231256Syl150051 	}
2241256Syl150051 
2251256Syl150051 	/* FIXME: queue "grow" feature is not supported.
2261256Syl150051 	 *        Use "initial" queue size as the "maximum";
2271256Syl150051 	 *        Remove the next line when fixed. */
2281256Syl150051 	new_config->max = new_config->initial;
2291256Syl150051 
2301256Syl150051 	if ((new_config->max < XGE_HAL_MIN_RING_QUEUE_BLOCKS) ||
2311256Syl150051 		(new_config->max > XGE_HAL_MAX_RING_QUEUE_BLOCKS)) {
2321256Syl150051 		return XGE_HAL_BADCFG_RING_QUEUE_MAX_BLOCKS;
2331256Syl150051 	}
2341256Syl150051 
2351256Syl150051 	if ((new_config->buffer_mode != XGE_HAL_RING_QUEUE_BUFFER_MODE_1) &&
2361256Syl150051 		(new_config->buffer_mode != XGE_HAL_RING_QUEUE_BUFFER_MODE_3) &&
2371256Syl150051 		(new_config->buffer_mode != XGE_HAL_RING_QUEUE_BUFFER_MODE_5)) {
2381256Syl150051 		return XGE_HAL_BADCFG_RING_QUEUE_BUFFER_MODE;
2391256Syl150051 	}
2401256Syl150051 
2411256Syl150051         /*
2421256Syl150051 	 * Herc has less DRAM; the check is done later inside
2431256Syl150051 	 * device_initialize()
2441256Syl150051 	 */
2451256Syl150051 	if (((new_config->dram_size_mb < XGE_HAL_MIN_RING_QUEUE_SIZE) ||
2461256Syl150051 	     (new_config->dram_size_mb > XGE_HAL_MAX_RING_QUEUE_SIZE_XENA)) &&
2471256Syl150051 	      new_config->dram_size_mb != XGE_HAL_DEFAULT_USE_HARDCODE)
2481256Syl150051 		return XGE_HAL_BADCFG_RING_QUEUE_SIZE;
2491256Syl150051 
2501256Syl150051 	if ((new_config->backoff_interval_us <
2511256Syl150051 			XGE_HAL_MIN_BACKOFF_INTERVAL_US) ||
2521256Syl150051 		(new_config->backoff_interval_us >
2531256Syl150051 			XGE_HAL_MAX_BACKOFF_INTERVAL_US)) {
2541256Syl150051 		return XGE_HAL_BADCFG_BACKOFF_INTERVAL_US;
2551256Syl150051 	}
2561256Syl150051 
2571256Syl150051 	if ((new_config->max_frm_len < XGE_HAL_MIN_MAX_FRM_LEN) ||
2581256Syl150051 		(new_config->max_frm_len > XGE_HAL_MAX_MAX_FRM_LEN)) {
2591256Syl150051 		return XGE_HAL_BADCFG_MAX_FRM_LEN;
2601256Syl150051 	}
2611256Syl150051 
2621256Syl150051 	if ((new_config->priority < XGE_HAL_MIN_RING_PRIORITY) ||
2631256Syl150051 		(new_config->priority > XGE_HAL_MAX_RING_PRIORITY)) {
2641256Syl150051 		return XGE_HAL_BADCFG_RING_PRIORITY;
2651256Syl150051 	}
2661256Syl150051 
2671256Syl150051 	if ((new_config->rth_en < XGE_HAL_MIN_RING_RTH_EN) ||
2681256Syl150051 		(new_config->rth_en > XGE_HAL_MAX_RING_RTH_EN)) {
2691256Syl150051 		return XGE_HAL_BADCFG_RING_RTH_EN;
2701256Syl150051 	}
2711256Syl150051 
2721256Syl150051 	if ((new_config->rts_mac_en < XGE_HAL_MIN_RING_RTS_MAC_EN) ||
2731256Syl150051 		(new_config->rts_mac_en > XGE_HAL_MAX_RING_RTS_MAC_EN)) {
2741256Syl150051 		return XGE_HAL_BADCFG_RING_RTS_MAC_EN;
2751256Syl150051 	}
2761256Syl150051 
277*6937Sxw161283 	if ((new_config->rts_mac_en < XGE_HAL_MIN_RING_RTS_PORT_EN) ||
278*6937Sxw161283 		(new_config->rts_mac_en > XGE_HAL_MAX_RING_RTS_PORT_EN)) {
279*6937Sxw161283 		return XGE_HAL_BADCFG_RING_RTS_PORT_EN;
280*6937Sxw161283 	}
281*6937Sxw161283 
282*6937Sxw161283 	if ((new_config->intr_vector < XGE_HAL_MIN_RING_QUEUE_INTR_VECTOR) ||
283*6937Sxw161283 		(new_config->intr_vector > XGE_HAL_MAX_RING_QUEUE_INTR_VECTOR)) {
284*6937Sxw161283 		return XGE_HAL_BADCFG_RING_QUEUE_INTR_VECTOR;
285*6937Sxw161283 	}
286*6937Sxw161283 
2871256Syl150051 	if (new_config->indicate_max_pkts <
2881256Syl150051 	XGE_HAL_MIN_RING_INDICATE_MAX_PKTS ||
2891256Syl150051 	    new_config->indicate_max_pkts >
2901256Syl150051 	    XGE_HAL_MAX_RING_INDICATE_MAX_PKTS) {
2911256Syl150051 		return XGE_HAL_BADCFG_RING_INDICATE_MAX_PKTS;
2921256Syl150051 	}
2931256Syl150051 
2941256Syl150051 	return __hal_rti_config_check(&new_config->rti);
2951256Syl150051 }
2961256Syl150051 
2971256Syl150051 /*
2981256Syl150051  * __hal_mac_config_check - Check mac configuration
2991256Syl150051  * @new_config: mac configuration information
3001256Syl150051  *
3011256Syl150051  * Returns: XGE_HAL_OK - success,
3021256Syl150051  * otherwise one of the xge_hal_status_e{} enumerated error codes.
3031256Syl150051  */
3041256Syl150051 static xge_hal_status_e
__hal_mac_config_check(xge_hal_mac_config_t * new_config)3051256Syl150051 __hal_mac_config_check (xge_hal_mac_config_t *new_config)
3061256Syl150051 {
3071256Syl150051 	if ((new_config->tmac_util_period < XGE_HAL_MIN_TMAC_UTIL_PERIOD) ||
3081256Syl150051 		(new_config->tmac_util_period > XGE_HAL_MAX_TMAC_UTIL_PERIOD)) {
3091256Syl150051 		return XGE_HAL_BADCFG_TMAC_UTIL_PERIOD;
3101256Syl150051 	}
3111256Syl150051 
3121256Syl150051 	if ((new_config->rmac_util_period < XGE_HAL_MIN_RMAC_UTIL_PERIOD) ||
3131256Syl150051 		(new_config->rmac_util_period > XGE_HAL_MAX_RMAC_UTIL_PERIOD)) {
3141256Syl150051 		return XGE_HAL_BADCFG_RMAC_UTIL_PERIOD;
3151256Syl150051 	}
3161256Syl150051 
3171256Syl150051 	if ((new_config->rmac_bcast_en < XGE_HAL_MIN_RMAC_BCAST_EN) ||
3181256Syl150051 		(new_config->rmac_bcast_en > XGE_HAL_MAX_RMAC_BCAST_EN)) {
3191256Syl150051 		return XGE_HAL_BADCFG_RMAC_BCAST_EN;
3201256Syl150051 	}
3211256Syl150051 
3221256Syl150051 	if ((new_config->rmac_pause_gen_en < XGE_HAL_MIN_RMAC_PAUSE_GEN_EN) ||
3231256Syl150051 		(new_config->rmac_pause_gen_en>XGE_HAL_MAX_RMAC_PAUSE_GEN_EN)) {
3241256Syl150051 		return XGE_HAL_BADCFG_RMAC_PAUSE_GEN_EN;
3251256Syl150051 	}
3261256Syl150051 
3271256Syl150051 	if ((new_config->rmac_pause_rcv_en < XGE_HAL_MIN_RMAC_PAUSE_RCV_EN) ||
3281256Syl150051 		(new_config->rmac_pause_rcv_en>XGE_HAL_MAX_RMAC_PAUSE_RCV_EN)) {
3291256Syl150051 		return XGE_HAL_BADCFG_RMAC_PAUSE_RCV_EN;
3301256Syl150051 	}
3311256Syl150051 
3321256Syl150051 	if ((new_config->rmac_pause_time < XGE_HAL_MIN_RMAC_HIGH_PTIME) ||
3331256Syl150051 		(new_config->rmac_pause_time > XGE_HAL_MAX_RMAC_HIGH_PTIME)) {
3341256Syl150051 		return XGE_HAL_BADCFG_RMAC_HIGH_PTIME;
3351256Syl150051 	}
3361256Syl150051 
3371256Syl150051 	if ((new_config->media < XGE_HAL_MIN_MEDIA) ||
3381256Syl150051 		(new_config->media > XGE_HAL_MAX_MEDIA)) {
3391256Syl150051 		return XGE_HAL_BADCFG_MEDIA;
3401256Syl150051 	}
3411256Syl150051 
3421256Syl150051 	if ((new_config->mc_pause_threshold_q0q3 <
3431256Syl150051 			XGE_HAL_MIN_MC_PAUSE_THRESHOLD_Q0Q3) ||
3441256Syl150051 		(new_config->mc_pause_threshold_q0q3 >
3451256Syl150051 			XGE_HAL_MAX_MC_PAUSE_THRESHOLD_Q0Q3)) {
3461256Syl150051 		return XGE_HAL_BADCFG_MC_PAUSE_THRESHOLD_Q0Q3;
3471256Syl150051 	}
3481256Syl150051 
3491256Syl150051 	if ((new_config->mc_pause_threshold_q4q7 <
3501256Syl150051 			XGE_HAL_MIN_MC_PAUSE_THRESHOLD_Q4Q7) ||
3511256Syl150051 		(new_config->mc_pause_threshold_q4q7 >
3521256Syl150051 			XGE_HAL_MAX_MC_PAUSE_THRESHOLD_Q4Q7)) {
3531256Syl150051 		return XGE_HAL_BADCFG_MC_PAUSE_THRESHOLD_Q4Q7;
3541256Syl150051 	}
3551256Syl150051 
3561256Syl150051 	return XGE_HAL_OK;
3571256Syl150051 }
3581256Syl150051 
3591256Syl150051 /*
3601256Syl150051  * __hal_fifo_config_check - Check fifo configuration
3611256Syl150051  * @new_config: fifo configuration information
3621256Syl150051  *
3631256Syl150051  * Returns: XGE_HAL_OK - success,
3641256Syl150051  * otherwise one of the xge_hal_status_e{} enumerated error codes.
3651256Syl150051  */
3661256Syl150051 static xge_hal_status_e
__hal_fifo_config_check(xge_hal_fifo_config_t * new_config)3671256Syl150051 __hal_fifo_config_check (xge_hal_fifo_config_t *new_config)
3681256Syl150051 {
3691256Syl150051 	int i;
370*6937Sxw161283 	int total_fifo_length = 0;
3711256Syl150051 
3721256Syl150051 	/*
3731256Syl150051 	 * recompute max_frags to be multiple of 4,
3741256Syl150051 	 * which means, multiple of 128 for TxDL
3751256Syl150051 	 */
3761256Syl150051 	new_config->max_frags = ((new_config->max_frags + 3) >> 2) << 2;
3771256Syl150051 
3781256Syl150051 	if ((new_config->max_frags < XGE_HAL_MIN_FIFO_FRAGS) ||
3791256Syl150051 		(new_config->max_frags > XGE_HAL_MAX_FIFO_FRAGS))  {
3801256Syl150051 		return XGE_HAL_BADCFG_FIFO_FRAGS;
3811256Syl150051 	}
3821256Syl150051 
3831256Syl150051 	if ((new_config->reserve_threshold <
3841256Syl150051 			XGE_HAL_MIN_FIFO_RESERVE_THRESHOLD) ||
3851256Syl150051 		(new_config->reserve_threshold >
3861256Syl150051 			XGE_HAL_MAX_FIFO_RESERVE_THRESHOLD)) {
3871256Syl150051 		return XGE_HAL_BADCFG_FIFO_RESERVE_THRESHOLD;
3881256Syl150051 	}
3891256Syl150051 
3901256Syl150051 	if ((new_config->memblock_size < XGE_HAL_MIN_FIFO_MEMBLOCK_SIZE) ||
3911256Syl150051 		(new_config->memblock_size > XGE_HAL_MAX_FIFO_MEMBLOCK_SIZE)) {
3921256Syl150051 		return XGE_HAL_BADCFG_FIFO_MEMBLOCK_SIZE;
3931256Syl150051 	}
3941256Syl150051 
3951256Syl150051 	for(i = 0;  i < XGE_HAL_MAX_FIFO_NUM; i++) {
3961256Syl150051 		xge_hal_status_e status;
3971256Syl150051 
3981256Syl150051 		if (!new_config->queue[i].configured)
3991256Syl150051                         continue;
4001256Syl150051 
4013115Syl150051 		if ((status = __hal_fifo_queue_check(new_config,
4023115Syl150051 				     &new_config->queue[i])) != XGE_HAL_OK) {
4031256Syl150051 			return status;
4041256Syl150051 		}
405*6937Sxw161283 
406*6937Sxw161283 	        total_fifo_length += new_config->queue[i].max;
407*6937Sxw161283 	}
408*6937Sxw161283 
409*6937Sxw161283 	if(total_fifo_length > XGE_HAL_MAX_FIFO_QUEUE_LENGTH){
410*6937Sxw161283 		return XGE_HAL_BADCFG_FIFO_QUEUE_MAX_LENGTH;
4111256Syl150051 	}
4121256Syl150051 
4131256Syl150051 	return XGE_HAL_OK;
4141256Syl150051 }
4151256Syl150051 
4161256Syl150051 /*
4171256Syl150051  * __hal_ring_config_check - Check ring configuration
4181256Syl150051  * @new_config: Ring configuration information
4191256Syl150051  *
4201256Syl150051  * Returns: XGE_HAL_OK - success,
4211256Syl150051  * otherwise one of the xge_hal_status_e{} enumerated error codes.
4221256Syl150051  */
4231256Syl150051 static xge_hal_status_e
__hal_ring_config_check(xge_hal_ring_config_t * new_config)4241256Syl150051 __hal_ring_config_check (xge_hal_ring_config_t *new_config)
4251256Syl150051 {
4261256Syl150051 	int i;
4271256Syl150051 
4281256Syl150051 	if ((new_config->memblock_size < XGE_HAL_MIN_RING_MEMBLOCK_SIZE) ||
4291256Syl150051 		(new_config->memblock_size > XGE_HAL_MAX_RING_MEMBLOCK_SIZE)) {
4301256Syl150051 		return XGE_HAL_BADCFG_RING_MEMBLOCK_SIZE;
4311256Syl150051 	}
4321256Syl150051 
4331256Syl150051 	for(i = 0;  i < XGE_HAL_MAX_RING_NUM; i++) {
4341256Syl150051 		xge_hal_status_e status;
4351256Syl150051 
4361256Syl150051 		if (!new_config->queue[i].configured)
4371256Syl150051                         continue;
4381256Syl150051 
4391256Syl150051 		if ((status = __hal_ring_queue_check(&new_config->queue[i]))
4401256Syl150051 					!= XGE_HAL_OK) {
4411256Syl150051 			return status;
4421256Syl150051 		}
4431256Syl150051 	}
4441256Syl150051 
4451256Syl150051 	return XGE_HAL_OK;
4461256Syl150051 }
4471256Syl150051 
4481256Syl150051 
4491256Syl150051 /*
4501256Syl150051  * __hal_device_config_check_common - Check device configuration.
4511256Syl150051  * @new_config: Device configuration information
4521256Syl150051  *
4531256Syl150051  * Check part of configuration that is common to
4541256Syl150051  * Xframe-I and Xframe-II.
4551256Syl150051  *
4561256Syl150051  * Returns: XGE_HAL_OK - success,
4571256Syl150051  * otherwise one of the xge_hal_status_e{} enumerated error codes.
4581256Syl150051  *
4591256Syl150051  * See also: __hal_device_config_check_xena().
4601256Syl150051  */
4611256Syl150051 xge_hal_status_e
__hal_device_config_check_common(xge_hal_device_config_t * new_config)4621256Syl150051 __hal_device_config_check_common (xge_hal_device_config_t *new_config)
4631256Syl150051 {
4641256Syl150051 	xge_hal_status_e status;
4651256Syl150051 
4661256Syl150051 	if ((new_config->mtu < XGE_HAL_MIN_MTU) ||
4671256Syl150051 		(new_config->mtu > XGE_HAL_MAX_MTU)) {
4681256Syl150051 		return XGE_HAL_BADCFG_MAX_MTU;
4691256Syl150051 	}
4701256Syl150051 
4713115Syl150051 	if ((new_config->bimodal_interrupts < XGE_HAL_BIMODAL_INTR_MIN) ||
4723115Syl150051 		(new_config->bimodal_interrupts > XGE_HAL_BIMODAL_INTR_MAX)) {
4733115Syl150051 		return XGE_HAL_BADCFG_BIMODAL_INTR;
4743115Syl150051 	}
4753115Syl150051 
4763115Syl150051 	if (new_config->bimodal_interrupts &&
4773115Syl150051 	    ((new_config->bimodal_timer_lo_us < XGE_HAL_BIMODAL_TIMER_LO_US_MIN) ||
4783115Syl150051 		(new_config->bimodal_timer_lo_us > XGE_HAL_BIMODAL_TIMER_LO_US_MAX))) {
4793115Syl150051 		return XGE_HAL_BADCFG_BIMODAL_TIMER_LO_US;
4803115Syl150051 	}
4813115Syl150051 
4823115Syl150051 	if (new_config->bimodal_interrupts &&
4833115Syl150051 	    ((new_config->bimodal_timer_hi_us < XGE_HAL_BIMODAL_TIMER_HI_US_MIN) ||
4843115Syl150051 		(new_config->bimodal_timer_hi_us > XGE_HAL_BIMODAL_TIMER_HI_US_MAX))) {
4853115Syl150051 		return XGE_HAL_BADCFG_BIMODAL_TIMER_HI_US;
4863115Syl150051 	}
4873115Syl150051 
4881256Syl150051 	if ((new_config->no_isr_events < XGE_HAL_NO_ISR_EVENTS_MIN) ||
4891256Syl150051 		(new_config->no_isr_events > XGE_HAL_NO_ISR_EVENTS_MAX)) {
4901256Syl150051 		return XGE_HAL_BADCFG_NO_ISR_EVENTS;
4911256Syl150051 	}
4921256Syl150051 
4931256Syl150051 	if ((new_config->isr_polling_cnt < XGE_HAL_MIN_ISR_POLLING_CNT) ||
4941256Syl150051 		(new_config->isr_polling_cnt > XGE_HAL_MAX_ISR_POLLING_CNT)) {
4951256Syl150051 		return XGE_HAL_BADCFG_ISR_POLLING_CNT;
4961256Syl150051 	}
4971256Syl150051 
4981256Syl150051 	if (new_config->latency_timer &&
4991256Syl150051 	    new_config->latency_timer != XGE_HAL_USE_BIOS_DEFAULT_LATENCY) {
5001256Syl150051                 if ((new_config->latency_timer < XGE_HAL_MIN_LATENCY_TIMER) ||
5011256Syl150051 		    (new_config->latency_timer > XGE_HAL_MAX_LATENCY_TIMER)) {
5021256Syl150051                         return XGE_HAL_BADCFG_LATENCY_TIMER;
5031256Syl150051 		}
5041256Syl150051 	}
5051256Syl150051 
5061256Syl150051 	if (new_config->max_splits_trans != XGE_HAL_USE_BIOS_DEFAULT_SPLITS)  {
5071256Syl150051 		if ((new_config->max_splits_trans <
5081256Syl150051 			XGE_HAL_ONE_SPLIT_TRANSACTION) ||
5091256Syl150051 		    (new_config->max_splits_trans >
5101256Syl150051 			XGE_HAL_THIRTYTWO_SPLIT_TRANSACTION))
5111256Syl150051 		return XGE_HAL_BADCFG_MAX_SPLITS_TRANS;
5121256Syl150051 	}
5131256Syl150051 
5141256Syl150051 	if (new_config->mmrb_count != XGE_HAL_DEFAULT_BIOS_MMRB_COUNT)
5151256Syl150051 	{
5161256Syl150051 	    if ((new_config->mmrb_count < XGE_HAL_MIN_MMRB_COUNT) ||
5171256Syl150051 		    (new_config->mmrb_count > XGE_HAL_MAX_MMRB_COUNT)) {
5181256Syl150051     		return XGE_HAL_BADCFG_MMRB_COUNT;
5191256Syl150051 	    }
5201256Syl150051 	}
5211256Syl150051 
5221256Syl150051 	if ((new_config->shared_splits < XGE_HAL_MIN_SHARED_SPLITS) ||
5231256Syl150051 		(new_config->shared_splits > XGE_HAL_MAX_SHARED_SPLITS)) {
5241256Syl150051 		return XGE_HAL_BADCFG_SHARED_SPLITS;
5251256Syl150051 	}
5261256Syl150051 
5271256Syl150051 	if (new_config->stats_refresh_time_sec !=
5281256Syl150051 	        XGE_HAL_STATS_REFRESH_DISABLE)  {
5291256Syl150051 	        if ((new_config->stats_refresh_time_sec <
5301256Syl150051 				        XGE_HAL_MIN_STATS_REFRESH_TIME) ||
5311256Syl150051 	            (new_config->stats_refresh_time_sec >
5321256Syl150051 				        XGE_HAL_MAX_STATS_REFRESH_TIME)) {
5331256Syl150051 		        return XGE_HAL_BADCFG_STATS_REFRESH_TIME;
5341256Syl150051 	        }
5351256Syl150051 	}
5361256Syl150051 
5371256Syl150051 	if ((new_config->intr_mode != XGE_HAL_INTR_MODE_IRQLINE) &&
5381256Syl150051 		(new_config->intr_mode != XGE_HAL_INTR_MODE_MSI) &&
5391256Syl150051 		(new_config->intr_mode != XGE_HAL_INTR_MODE_MSIX)) {
5401256Syl150051 		return XGE_HAL_BADCFG_INTR_MODE;
5411256Syl150051 	}
5421256Syl150051 
5431256Syl150051 	if ((new_config->sched_timer_us < XGE_HAL_SCHED_TIMER_MIN) ||
5441256Syl150051 		(new_config->sched_timer_us > XGE_HAL_SCHED_TIMER_MAX)) {
5451256Syl150051 		return XGE_HAL_BADCFG_SCHED_TIMER_US;
5461256Syl150051 	}
5471256Syl150051 
5481256Syl150051 	if ((new_config->sched_timer_one_shot !=
5491256Syl150051 			XGE_HAL_SCHED_TIMER_ON_SHOT_DISABLE)  &&
5501256Syl150051 		(new_config->sched_timer_one_shot !=
5511256Syl150051 			XGE_HAL_SCHED_TIMER_ON_SHOT_ENABLE)) {
5521256Syl150051 		return XGE_HAL_BADCFG_SCHED_TIMER_ON_SHOT;
5531256Syl150051 	}
5541256Syl150051 
5553115Syl150051 	/*
5563115Syl150051 	 * Check adaptive schema parameters. Note that there are two
5573115Syl150051 	 * configuration variables needs to be enabled in ULD:
5583115Syl150051 	 *
5593115Syl150051 	 *   a) sched_timer_us should not be zero;
5603115Syl150051 	 *   b) rxufca_hi_lim should not be equal to rxufca_lo_lim.
5613115Syl150051 	 *
5623115Syl150051 	 * The code bellow checking for those conditions.
5633115Syl150051 	 */
5643115Syl150051 	if (new_config->sched_timer_us &&
5653115Syl150051 	    new_config->rxufca_hi_lim != new_config->rxufca_lo_lim) {
5661256Syl150051 		if ((new_config->rxufca_intr_thres <
5671256Syl150051 					XGE_HAL_RXUFCA_INTR_THRES_MIN) ||
5681256Syl150051 		    (new_config->rxufca_intr_thres >
5691256Syl150051 					XGE_HAL_RXUFCA_INTR_THRES_MAX)) {
5701256Syl150051 			return XGE_HAL_BADCFG_RXUFCA_INTR_THRES;
5711256Syl150051 		}
5721256Syl150051 
5731256Syl150051 		if ((new_config->rxufca_hi_lim < XGE_HAL_RXUFCA_HI_LIM_MIN) ||
5741256Syl150051 		    (new_config->rxufca_hi_lim > XGE_HAL_RXUFCA_HI_LIM_MAX)) {
5751256Syl150051 			return XGE_HAL_BADCFG_RXUFCA_HI_LIM;
5761256Syl150051 		}
5771256Syl150051 
5781256Syl150051 		if ((new_config->rxufca_lo_lim < XGE_HAL_RXUFCA_LO_LIM_MIN) ||
5791256Syl150051 		    (new_config->rxufca_lo_lim > XGE_HAL_RXUFCA_LO_LIM_MAX) ||
5801256Syl150051 		    (new_config->rxufca_lo_lim > new_config->rxufca_hi_lim)) {
5811256Syl150051 			return XGE_HAL_BADCFG_RXUFCA_LO_LIM;
5821256Syl150051 		}
5831256Syl150051 
5841256Syl150051 		if ((new_config->rxufca_lbolt_period <
5851256Syl150051 					XGE_HAL_RXUFCA_LBOLT_PERIOD_MIN) ||
5861256Syl150051 		    (new_config->rxufca_lbolt_period >
5871256Syl150051 					XGE_HAL_RXUFCA_LBOLT_PERIOD_MAX)) {
5881256Syl150051 			return XGE_HAL_BADCFG_RXUFCA_LBOLT_PERIOD;
5891256Syl150051 		}
5901256Syl150051 	}
5911256Syl150051 
5921256Syl150051 	if ((new_config->link_valid_cnt < XGE_HAL_LINK_VALID_CNT_MIN) ||
5931256Syl150051 		(new_config->link_valid_cnt > XGE_HAL_LINK_VALID_CNT_MAX)) {
5941256Syl150051 		return XGE_HAL_BADCFG_LINK_VALID_CNT;
5951256Syl150051 	}
5961256Syl150051 
5971256Syl150051 	if ((new_config->link_retry_cnt < XGE_HAL_LINK_RETRY_CNT_MIN) ||
5981256Syl150051 		(new_config->link_retry_cnt > XGE_HAL_LINK_RETRY_CNT_MAX)) {
5991256Syl150051 		return XGE_HAL_BADCFG_LINK_RETRY_CNT;
6001256Syl150051 	}
6011256Syl150051 
6021256Syl150051 	if (new_config->link_valid_cnt > new_config->link_retry_cnt)
6031256Syl150051 		return XGE_HAL_BADCFG_LINK_VALID_CNT;
6041256Syl150051 
6051256Syl150051 	if (new_config->link_stability_period != XGE_HAL_DEFAULT_USE_HARDCODE) {
6061256Syl150051 	        if ((new_config->link_stability_period <
6071256Syl150051 				        XGE_HAL_MIN_LINK_STABILITY_PERIOD) ||
6081256Syl150051 		        (new_config->link_stability_period >
6091256Syl150051 				        XGE_HAL_MAX_LINK_STABILITY_PERIOD)) {
6101256Syl150051 		        return XGE_HAL_BADCFG_LINK_STABILITY_PERIOD;
6111256Syl150051 	        }
6121256Syl150051 	}
6131256Syl150051 
6141256Syl150051 	if (new_config->device_poll_millis !=
6151256Syl150051 	                XGE_HAL_DEFAULT_USE_HARDCODE)  {
6161256Syl150051 	        if ((new_config->device_poll_millis <
6171256Syl150051 			        XGE_HAL_MIN_DEVICE_POLL_MILLIS) ||
6181256Syl150051 		        (new_config->device_poll_millis >
6191256Syl150051 			        XGE_HAL_MAX_DEVICE_POLL_MILLIS)) {
6201256Syl150051 		        return XGE_HAL_BADCFG_DEVICE_POLL_MILLIS;
6211256Syl150051 	        }
6221256Syl150051         }
6231256Syl150051 
624*6937Sxw161283 	if ((new_config->rts_port_en < XGE_HAL_MIN_RING_RTS_PORT_EN) ||
625*6937Sxw161283 		(new_config->rts_port_en > XGE_HAL_MAX_RING_RTS_PORT_EN)) {
626*6937Sxw161283 		return XGE_HAL_BADCFG_RTS_PORT_EN;
627*6937Sxw161283 	}
628*6937Sxw161283 
629*6937Sxw161283 	if ((new_config->rts_qos_en < XGE_HAL_RTS_QOS_DISABLE) ||
630*6937Sxw161283 		(new_config->rts_qos_en > XGE_HAL_RTS_QOS_ENABLE)) {
631*6937Sxw161283 		return XGE_HAL_BADCFG_RTS_QOS_EN;
6323115Syl150051 	}
6333115Syl150051 
6343115Syl150051 #if defined(XGE_HAL_CONFIG_LRO)
6353115Syl150051 	if (new_config->lro_sg_size !=
6363115Syl150051 				XGE_HAL_DEFAULT_USE_HARDCODE)  {
6373115Syl150051 		if ((new_config->lro_sg_size < XGE_HAL_LRO_MIN_SG_SIZE) ||
6383115Syl150051 			(new_config->lro_sg_size > XGE_HAL_LRO_MAX_SG_SIZE)) {
6393115Syl150051 			return XGE_HAL_BADCFG_LRO_SG_SIZE;
6403115Syl150051 		}
6413115Syl150051 	}
6423115Syl150051 
6433115Syl150051 	if (new_config->lro_frm_len !=
6443115Syl150051 				XGE_HAL_DEFAULT_USE_HARDCODE)  {
6453115Syl150051 		if ((new_config->lro_frm_len < XGE_HAL_LRO_MIN_FRM_LEN) ||
6463115Syl150051 			(new_config->lro_frm_len > XGE_HAL_LRO_MAX_FRM_LEN)) {
6473115Syl150051 			return XGE_HAL_BADCFG_LRO_FRM_LEN;
6483115Syl150051 		}
6493115Syl150051 	}
6503115Syl150051 #endif
6513115Syl150051 
6521256Syl150051 	if ((status = __hal_ring_config_check(&new_config->ring))
6531256Syl150051 			!= XGE_HAL_OK) {
6541256Syl150051 		return status;
6551256Syl150051 	}
6561256Syl150051 
6571256Syl150051 	if ((status = __hal_mac_config_check(&new_config->mac)) !=
6581256Syl150051 	    XGE_HAL_OK) {
6591256Syl150051 		return status;
6601256Syl150051 	}
6611256Syl150051 
6621256Syl150051 	if ((status = __hal_fifo_config_check(&new_config->fifo)) !=
6631256Syl150051 	    XGE_HAL_OK) {
6641256Syl150051 		return status;
6651256Syl150051 	}
6661256Syl150051 
6671256Syl150051 	return XGE_HAL_OK;
6681256Syl150051 }
6691256Syl150051 
6701256Syl150051 /*
6711256Syl150051  * __hal_device_config_check_xena - Check Xframe-I configuration
6721256Syl150051  * @new_config: Device configuration.
6731256Syl150051  *
6741256Syl150051  * Check part of configuration that is relevant only to Xframe-I.
6751256Syl150051  *
6761256Syl150051  * Returns: XGE_HAL_OK - success,
6771256Syl150051  * otherwise one of the xge_hal_status_e{} enumerated error codes.
6781256Syl150051  *
6791256Syl150051  * See also: __hal_device_config_check_common().
6801256Syl150051  */
6811256Syl150051 xge_hal_status_e
__hal_device_config_check_xena(xge_hal_device_config_t * new_config)6821256Syl150051 __hal_device_config_check_xena (xge_hal_device_config_t *new_config)
6831256Syl150051 {
6841256Syl150051 	if ((new_config->pci_freq_mherz != XGE_HAL_PCI_FREQ_MHERZ_33) &&
6851256Syl150051 		(new_config->pci_freq_mherz != XGE_HAL_PCI_FREQ_MHERZ_66) &&
6861256Syl150051 		(new_config->pci_freq_mherz != XGE_HAL_PCI_FREQ_MHERZ_100) &&
6871256Syl150051 		(new_config->pci_freq_mherz != XGE_HAL_PCI_FREQ_MHERZ_133) &&
6883115Syl150051 		(new_config->pci_freq_mherz != XGE_HAL_PCI_FREQ_MHERZ_266) &&
6893115Syl150051 		(new_config->pci_freq_mherz != XGE_HAL_DEFAULT_USE_HARDCODE)) {
6901256Syl150051 		return XGE_HAL_BADCFG_PCI_FREQ_MHERZ;
6911256Syl150051 	}
6921256Syl150051 
6931256Syl150051 	return XGE_HAL_OK;
6941256Syl150051 }
6951256Syl150051 
6961256Syl150051 /*
6971256Syl150051  * __hal_device_config_check_herc - Check device configuration
6981256Syl150051  * @new_config: Device configuration.
6991256Syl150051  *
7001256Syl150051  * Check part of configuration that is relevant only to Xframe-II.
7011256Syl150051  *
7021256Syl150051  * Returns: XGE_HAL_OK - success,
7031256Syl150051  * otherwise one of the xge_hal_status_e{} enumerated error codes.
7041256Syl150051  *
7051256Syl150051  * See also: __hal_device_config_check_common().
7061256Syl150051  */
7071256Syl150051 xge_hal_status_e
__hal_device_config_check_herc(xge_hal_device_config_t * new_config)7081256Syl150051 __hal_device_config_check_herc (xge_hal_device_config_t *new_config)
7091256Syl150051 {
7101256Syl150051 	return XGE_HAL_OK;
7111256Syl150051 }
7121256Syl150051 
7131256Syl150051 
7143115Syl150051 /*
7151256Syl150051  * __hal_driver_config_check - Check HAL configuration
7161256Syl150051  * @new_config: Driver configuration information
7171256Syl150051  *
7181256Syl150051  * Returns: XGE_HAL_OK - success,
7191256Syl150051  * otherwise one of the xge_hal_status_e{} enumerated error codes.
7201256Syl150051  */
7211256Syl150051 xge_hal_status_e
__hal_driver_config_check(xge_hal_driver_config_t * new_config)7221256Syl150051 __hal_driver_config_check (xge_hal_driver_config_t *new_config)
7231256Syl150051 {
7241256Syl150051 	if ((new_config->queue_size_initial <
7251256Syl150051                 XGE_HAL_MIN_QUEUE_SIZE_INITIAL) ||
7261256Syl150051 	    (new_config->queue_size_initial >
7271256Syl150051                 XGE_HAL_MAX_QUEUE_SIZE_INITIAL)) {
7281256Syl150051 		return XGE_HAL_BADCFG_QUEUE_SIZE_INITIAL;
7291256Syl150051 	}
7301256Syl150051 
7311256Syl150051 	if ((new_config->queue_size_max < XGE_HAL_MIN_QUEUE_SIZE_MAX) ||
7321256Syl150051 		(new_config->queue_size_max > XGE_HAL_MAX_QUEUE_SIZE_MAX)) {
7331256Syl150051 		return XGE_HAL_BADCFG_QUEUE_SIZE_MAX;
7341256Syl150051 	}
7351256Syl150051 
7361256Syl150051 #ifdef XGE_TRACE_INTO_CIRCULAR_ARR
7371256Syl150051 	if ((new_config->tracebuf_size < XGE_HAL_MIN_CIRCULAR_ARR) ||
7381256Syl150051 		(new_config->tracebuf_size > XGE_HAL_MAX_CIRCULAR_ARR)) {
7391256Syl150051 		return XGE_HAL_BADCFG_TRACEBUF_SIZE;
7401256Syl150051 	}
741*6937Sxw161283 	if ((new_config->tracebuf_timestamp_en < XGE_HAL_MIN_TIMESTAMP_EN) ||
742*6937Sxw161283 		(new_config->tracebuf_timestamp_en > XGE_HAL_MAX_TIMESTAMP_EN)) {
743*6937Sxw161283 		return XGE_HAL_BADCFG_TRACEBUF_SIZE;
744*6937Sxw161283 	}
7451256Syl150051 #endif
7461256Syl150051 
7471256Syl150051 	return XGE_HAL_OK;
7481256Syl150051 }
749