xref: /illumos-gate/usr/src/uts/common/io/ntxn/unm_ndd.c (revision dda0720a)
19a5557fdSlucy wang - Sun Microsystems - Beijing China /*
29a5557fdSlucy wang - Sun Microsystems - Beijing China  * CDDL HEADER START
39a5557fdSlucy wang - Sun Microsystems - Beijing China  *
49a5557fdSlucy wang - Sun Microsystems - Beijing China  * The contents of this file are subject to the terms of the
59a5557fdSlucy wang - Sun Microsystems - Beijing China  * Common Development and Distribution License (the "License").
69a5557fdSlucy wang - Sun Microsystems - Beijing China  * You may not use this file except in compliance with the License.
79a5557fdSlucy wang - Sun Microsystems - Beijing China  *
89a5557fdSlucy wang - Sun Microsystems - Beijing China  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
99a5557fdSlucy wang - Sun Microsystems - Beijing China  * or http://www.opensolaris.org/os/licensing.
109a5557fdSlucy wang - Sun Microsystems - Beijing China  * See the License for the specific language governing permissions
119a5557fdSlucy wang - Sun Microsystems - Beijing China  * and limitations under the License.
129a5557fdSlucy wang - Sun Microsystems - Beijing China  *
139a5557fdSlucy wang - Sun Microsystems - Beijing China  * When distributing Covered Code, include this CDDL HEADER in each
149a5557fdSlucy wang - Sun Microsystems - Beijing China  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
159a5557fdSlucy wang - Sun Microsystems - Beijing China  * If applicable, add the following below this CDDL HEADER, with the
169a5557fdSlucy wang - Sun Microsystems - Beijing China  * fields enclosed by brackets "[]" replaced with your own identifying
179a5557fdSlucy wang - Sun Microsystems - Beijing China  * information: Portions Copyright [yyyy] [name of copyright owner]
189a5557fdSlucy wang - Sun Microsystems - Beijing China  *
199a5557fdSlucy wang - Sun Microsystems - Beijing China  * CDDL HEADER END
209a5557fdSlucy wang - Sun Microsystems - Beijing China  */
2193833965Sjing xiong ERI-SUN 
229a5557fdSlucy wang - Sun Microsystems - Beijing China /*
239a5557fdSlucy wang - Sun Microsystems - Beijing China  * Copyright 2008 NetXen, Inc.  All rights reserved.
249a5557fdSlucy wang - Sun Microsystems - Beijing China  * Use is subject to license terms.
259a5557fdSlucy wang - Sun Microsystems - Beijing China  */
2693833965Sjing xiong ERI-SUN 
279a5557fdSlucy wang - Sun Microsystems - Beijing China #include "unm_nic.h"
289a5557fdSlucy wang - Sun Microsystems - Beijing China 
299a5557fdSlucy wang - Sun Microsystems - Beijing China static char transfer_speed_propname[] = "transfer-speed";
309a5557fdSlucy wang - Sun Microsystems - Beijing China static char speed_propname[] = "speed";
319a5557fdSlucy wang - Sun Microsystems - Beijing China static char duplex_propname[] = "full-duplex";
329a5557fdSlucy wang - Sun Microsystems - Beijing China 
339a5557fdSlucy wang - Sun Microsystems - Beijing China /*
349a5557fdSlucy wang - Sun Microsystems - Beijing China  * Notes:
359a5557fdSlucy wang - Sun Microsystems - Beijing China  *	The first character of the <name> field encodes the read/write
369a5557fdSlucy wang - Sun Microsystems - Beijing China  *	status of the parameter:
379a5557fdSlucy wang - Sun Microsystems - Beijing China  *		'-' => read-only,
389a5557fdSlucy wang - Sun Microsystems - Beijing China  *		'+' => read/write,
399a5557fdSlucy wang - Sun Microsystems - Beijing China  *		'!' => invisible!
409a5557fdSlucy wang - Sun Microsystems - Beijing China  *
419a5557fdSlucy wang - Sun Microsystems - Beijing China  *	For writable parameters, we check for a driver property with the
429a5557fdSlucy wang - Sun Microsystems - Beijing China  *	same name; if found, and its value is in range, we initialise
439a5557fdSlucy wang - Sun Microsystems - Beijing China  *	the parameter from the property, overriding the default in the
449a5557fdSlucy wang - Sun Microsystems - Beijing China  *	table below.
459a5557fdSlucy wang - Sun Microsystems - Beijing China  *
469a5557fdSlucy wang - Sun Microsystems - Beijing China  *	A NULL in the <name> field terminates the array.
479a5557fdSlucy wang - Sun Microsystems - Beijing China  *
489a5557fdSlucy wang - Sun Microsystems - Beijing China  *	The <info> field is used here to provide the index of the
499a5557fdSlucy wang - Sun Microsystems - Beijing China  *	parameter to be initialised; thus it doesn't matter whether
509a5557fdSlucy wang - Sun Microsystems - Beijing China  *	this table is kept ordered or not.
519a5557fdSlucy wang - Sun Microsystems - Beijing China  *
529a5557fdSlucy wang - Sun Microsystems - Beijing China  *	The <info> field in the per-instance copy, on the other hand,
539a5557fdSlucy wang - Sun Microsystems - Beijing China  *	is used to count assignments so that we can tell when a magic
549a5557fdSlucy wang - Sun Microsystems - Beijing China  *	parameter has been set via ndd (see unm_param_set()).
559a5557fdSlucy wang - Sun Microsystems - Beijing China  */
569a5557fdSlucy wang - Sun Microsystems - Beijing China static const nd_param_t nd_template_10000[] = {
579a5557fdSlucy wang - Sun Microsystems - Beijing China /*	info		min	max	init	r/w+name		*/
589a5557fdSlucy wang - Sun Microsystems - Beijing China 
599a5557fdSlucy wang - Sun Microsystems - Beijing China /* Our hardware capabilities */
609a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_AUTONEG_CAP,	    0,	  1,	1,	"-autoneg_cap"		},
619a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_PAUSE_CAP,	    0,	  1,	1,	"-pause_cap"		},
629a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_ASYM_PAUSE_CAP,	    0,	  1,	1,	"-asym_pause_cap"	},
639a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_10000FDX_CAP,	    0,	  1,	1,	"-10000fdx_cap"		},
649a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_1000FDX_CAP,	    0,	  1,	0,	"-1000fdx_cap"		},
659a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_1000HDX_CAP,	    0,	  1,	0,	"-1000hdx_cap"		},
669a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_100T4_CAP,	    0,	  1,	0,	"-100T4_cap"		},
679a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_100FDX_CAP,	    0,	  1,	0,	"-100fdx_cap"		},
689a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_100HDX_CAP,	    0,	  1,	0,	"-100hdx_cap"		},
699a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_10FDX_CAP,	    0,	  1,	0,	"-10fdx_cap"		},
709a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_10HDX_CAP,	    0,	  1,	0,	"-10hdx_cap"		},
719a5557fdSlucy wang - Sun Microsystems - Beijing China 
729a5557fdSlucy wang - Sun Microsystems - Beijing China /* Our advertised capabilities */
739a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_ADV_AUTONEG_CAP,    0,	  1,	1,	"-adv_autoneg_cap"	},
749a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_ADV_PAUSE_CAP,	    0,	  1,	1,	"+adv_pause_cap"	},
759a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_ADV_ASYM_PAUSE_CAP, 0,	  1,	1,	"+adv_asym_pause_cap"	},
769a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_ADV_10000FDX_CAP,   0,	  1,	1,	"+adv_10000fdx_cap"	},
779a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_ADV_1000FDX_CAP,    0,	  1,	0,	"+adv_1000fdx_cap"	},
789a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_ADV_1000HDX_CAP,    0,	  1,	0,	"-adv_1000hdx_cap"	},
799a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_ADV_100T4_CAP,	    0,	  1,	0,	"-adv_100T4_cap"	},
809a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_ADV_100FDX_CAP,	    0,	  1,	0,	"+adv_100fdx_cap"	},
819a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_ADV_100HDX_CAP,	    0,	  1,	0,	"+adv_100hdx_cap"	},
829a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_ADV_10FDX_CAP,	    0,	  1,	0,	"+adv_10fdx_cap"	},
839a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_ADV_10HDX_CAP,	    0,	  1,	0,	"+adv_10hdx_cap"	},
849a5557fdSlucy wang - Sun Microsystems - Beijing China 
859a5557fdSlucy wang - Sun Microsystems - Beijing China /* Current operating modes */
869a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_LINK_STATUS,	    0,	  1,	0,	"-link_status"		},
879a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_LINK_SPEED,	    0,    10000, 0,	"-link_speed"		},
889a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_LINK_DUPLEX,	    0,	  2,	0,	"-link_duplex"		},
899a5557fdSlucy wang - Sun Microsystems - Beijing China 
909a5557fdSlucy wang - Sun Microsystems - Beijing China /* Loopback status */
919a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_LOOP_MODE,	    0,	  2,	0,	"-loop_mode"		},
929a5557fdSlucy wang - Sun Microsystems - Beijing China 
939a5557fdSlucy wang - Sun Microsystems - Beijing China /* Terminator */
949a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_COUNT,		    0,	  0,	0,	NULL			}
959a5557fdSlucy wang - Sun Microsystems - Beijing China };
969a5557fdSlucy wang - Sun Microsystems - Beijing China 
979a5557fdSlucy wang - Sun Microsystems - Beijing China static const nd_param_t nd_template_1000[] = {
989a5557fdSlucy wang - Sun Microsystems - Beijing China /*	info		min	max	init	r/w+name		*/
999a5557fdSlucy wang - Sun Microsystems - Beijing China 
1009a5557fdSlucy wang - Sun Microsystems - Beijing China /* Our hardware capabilities */
1019a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_AUTONEG_CAP,	    0,	  1,	1,	"-autoneg_cap"		},
1029a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_PAUSE_CAP,	    0,	  1,	1,	"-pause_cap"		},
1039a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_ASYM_PAUSE_CAP,	    0,	  1,	1,	"-asym_pause_cap"	},
1049a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_1000FDX_CAP,	    0,	  1,	1,	"-1000fdx_cap"		},
1059a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_1000HDX_CAP,	    0,	  1,	0,	"-1000hdx_cap"		},
1069a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_100T4_CAP,	    0,	  1,	0,	"-100T4_cap"		},
107*dda0720aSjing xiong ERI-SUN { PARAM_100FDX_CAP,	    0,	  1,	0,	"-100fdx_cap"		},
108*dda0720aSjing xiong ERI-SUN { PARAM_100HDX_CAP,	    0,	  1,	0,	"-100hdx_cap"		},
109*dda0720aSjing xiong ERI-SUN { PARAM_10FDX_CAP,	    0,	  1,	0,	"-10fdx_cap"		},
110*dda0720aSjing xiong ERI-SUN { PARAM_10HDX_CAP,	    0,	  1,	0,	"-10hdx_cap"		},
1119a5557fdSlucy wang - Sun Microsystems - Beijing China 
1129a5557fdSlucy wang - Sun Microsystems - Beijing China /* Our advertised capabilities */
1139a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_ADV_AUTONEG_CAP,    0,	  1,	1,	"-adv_autoneg_cap"	},
1149a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_ADV_PAUSE_CAP,	    0,	  1,	1,	"+adv_pause_cap"	},
1159a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_ADV_ASYM_PAUSE_CAP, 0,	  1,	1,	"+adv_asym_pause_cap"	},
1169a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_ADV_1000FDX_CAP,    0,	  1,	1,	"+adv_1000fdx_cap"	},
1179a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_ADV_1000HDX_CAP,    0,	  1,	0,	"-adv_1000hdx_cap"	},
1189a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_ADV_100T4_CAP,	    0,	  1,	0,	"-adv_100T4_cap"	},
119*dda0720aSjing xiong ERI-SUN { PARAM_ADV_100FDX_CAP,	    0,	  1,	0,	"+adv_100fdx_cap"	},
120*dda0720aSjing xiong ERI-SUN { PARAM_ADV_100HDX_CAP,	    0,	  1,	0,	"+adv_100hdx_cap"	},
121*dda0720aSjing xiong ERI-SUN { PARAM_ADV_10FDX_CAP,	    0,	  1,	0,	"+adv_10fdx_cap"	},
122*dda0720aSjing xiong ERI-SUN { PARAM_ADV_10HDX_CAP,	    0,	  1,	0,	"+adv_10hdx_cap"	},
1239a5557fdSlucy wang - Sun Microsystems - Beijing China 
1249a5557fdSlucy wang - Sun Microsystems - Beijing China /* Current operating modes */
1259a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_LINK_STATUS,	    0,	  1,	0,	"-link_status"		},
1269a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_LINK_SPEED,	    0,    1000,	0,	"-link_speed"		},
1279a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_LINK_DUPLEX,	    0,	  2,	0,	"-link_duplex"		},
1289a5557fdSlucy wang - Sun Microsystems - Beijing China 
1299a5557fdSlucy wang - Sun Microsystems - Beijing China /* Loopback status */
1309a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_LOOP_MODE,	    0,	  2,	0,	"-loop_mode"		},
1319a5557fdSlucy wang - Sun Microsystems - Beijing China 
1329a5557fdSlucy wang - Sun Microsystems - Beijing China /* Terminator */
1339a5557fdSlucy wang - Sun Microsystems - Beijing China { PARAM_COUNT,		    0,	  0,	0,	NULL			}
1349a5557fdSlucy wang - Sun Microsystems - Beijing China };
1359a5557fdSlucy wang - Sun Microsystems - Beijing China 
1369a5557fdSlucy wang - Sun Microsystems - Beijing China /*  ============== NDD Support Functions ===============  */
1379a5557fdSlucy wang - Sun Microsystems - Beijing China 
1389a5557fdSlucy wang - Sun Microsystems - Beijing China /*
1399a5557fdSlucy wang - Sun Microsystems - Beijing China  * Extracts the value from the unm parameter array and prints
1409a5557fdSlucy wang - Sun Microsystems - Beijing China  * the parameter value. cp points to the required parameter.
1419a5557fdSlucy wang - Sun Microsystems - Beijing China  */
1429a5557fdSlucy wang - Sun Microsystems - Beijing China /* ARGSUSED */
1439a5557fdSlucy wang - Sun Microsystems - Beijing China static int
unm_param_get(queue_t * q,mblk_t * mp,caddr_t cp,cred_t * credp)1449a5557fdSlucy wang - Sun Microsystems - Beijing China unm_param_get(queue_t *q, mblk_t *mp, caddr_t cp, cred_t *credp)
1459a5557fdSlucy wang - Sun Microsystems - Beijing China {
1469a5557fdSlucy wang - Sun Microsystems - Beijing China 	nd_param_t *ndp;
1479a5557fdSlucy wang - Sun Microsystems - Beijing China 
1489a5557fdSlucy wang - Sun Microsystems - Beijing China 	ndp = (nd_param_t *)(uintptr_t)cp;
1499a5557fdSlucy wang - Sun Microsystems - Beijing China 	(void) mi_mpprintf(mp, "%d", ndp->ndp_val);
1509a5557fdSlucy wang - Sun Microsystems - Beijing China 
1519a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
1529a5557fdSlucy wang - Sun Microsystems - Beijing China }
1539a5557fdSlucy wang - Sun Microsystems - Beijing China 
1549a5557fdSlucy wang - Sun Microsystems - Beijing China /*
1559a5557fdSlucy wang - Sun Microsystems - Beijing China  * Validates the request to set a UNM parameter to a specific value.
1569a5557fdSlucy wang - Sun Microsystems - Beijing China  * If the request is OK, the parameter is set.  Also the <info> field
1579a5557fdSlucy wang - Sun Microsystems - Beijing China  * is incremented to show that the parameter was touched, even though
1589a5557fdSlucy wang - Sun Microsystems - Beijing China  * it may have been set to the same value it already had.
1599a5557fdSlucy wang - Sun Microsystems - Beijing China  */
1609a5557fdSlucy wang - Sun Microsystems - Beijing China /* ARGSUSED */
1619a5557fdSlucy wang - Sun Microsystems - Beijing China static int
unm_param_set(queue_t * q,mblk_t * mp,char * value,caddr_t cp,cred_t * credp)1629a5557fdSlucy wang - Sun Microsystems - Beijing China unm_param_set(queue_t *q, mblk_t *mp, char *value, caddr_t cp, cred_t *credp)
1639a5557fdSlucy wang - Sun Microsystems - Beijing China {
1649a5557fdSlucy wang - Sun Microsystems - Beijing China 	nd_param_t *ndp;
1659a5557fdSlucy wang - Sun Microsystems - Beijing China 	int new_value;
1669a5557fdSlucy wang - Sun Microsystems - Beijing China 	char *end;
1679a5557fdSlucy wang - Sun Microsystems - Beijing China 
1689a5557fdSlucy wang - Sun Microsystems - Beijing China 	ndp = (nd_param_t *)(uintptr_t)cp;
1699a5557fdSlucy wang - Sun Microsystems - Beijing China 	new_value = mi_strtol(value, &end, 10);
1709a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (end == value)
1719a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (EINVAL);
1729a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (new_value < ndp->ndp_min || new_value > ndp->ndp_max)
1739a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (EINVAL);
1749a5557fdSlucy wang - Sun Microsystems - Beijing China 
1759a5557fdSlucy wang - Sun Microsystems - Beijing China 	ndp->ndp_val = new_value;
1769a5557fdSlucy wang - Sun Microsystems - Beijing China 	ndp->ndp_info += 1;
1779a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
1789a5557fdSlucy wang - Sun Microsystems - Beijing China }
1799a5557fdSlucy wang - Sun Microsystems - Beijing China 
1809a5557fdSlucy wang - Sun Microsystems - Beijing China /*
1819a5557fdSlucy wang - Sun Microsystems - Beijing China  * Initialise the per-instance parameter array from the global prototype,
1829a5557fdSlucy wang - Sun Microsystems - Beijing China  * and register each element with the named dispatch handler using nd_load()
1839a5557fdSlucy wang - Sun Microsystems - Beijing China  */
1849a5557fdSlucy wang - Sun Microsystems - Beijing China static int
unm_param_register(unm_adapter * adapter)1859a5557fdSlucy wang - Sun Microsystems - Beijing China unm_param_register(unm_adapter *adapter)
1869a5557fdSlucy wang - Sun Microsystems - Beijing China {
1879a5557fdSlucy wang - Sun Microsystems - Beijing China 	const nd_param_t *tmplp;
1889a5557fdSlucy wang - Sun Microsystems - Beijing China 	dev_info_t *dip;
1899a5557fdSlucy wang - Sun Microsystems - Beijing China 	nd_param_t *ndp;
1909a5557fdSlucy wang - Sun Microsystems - Beijing China 	caddr_t *nddpp;
1919a5557fdSlucy wang - Sun Microsystems - Beijing China 	pfi_t setfn;
1929a5557fdSlucy wang - Sun Microsystems - Beijing China 	char *nm;
1939a5557fdSlucy wang - Sun Microsystems - Beijing China 	int pval;
1949a5557fdSlucy wang - Sun Microsystems - Beijing China 
1959a5557fdSlucy wang - Sun Microsystems - Beijing China 	dip = adapter->dip;
1969a5557fdSlucy wang - Sun Microsystems - Beijing China 	nddpp = &adapter->nd_data_p;
1979a5557fdSlucy wang - Sun Microsystems - Beijing China 	ASSERT(*nddpp == NULL);
1989a5557fdSlucy wang - Sun Microsystems - Beijing China 
1999a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (adapter->ahw.board_type == UNM_NIC_XGBE)
2009a5557fdSlucy wang - Sun Microsystems - Beijing China 		tmplp = nd_template_10000;
2019a5557fdSlucy wang - Sun Microsystems - Beijing China 	else
2029a5557fdSlucy wang - Sun Microsystems - Beijing China 		tmplp = nd_template_1000;
2039a5557fdSlucy wang - Sun Microsystems - Beijing China 
2049a5557fdSlucy wang - Sun Microsystems - Beijing China 	for (; tmplp->ndp_name != NULL; ++tmplp) {
2059a5557fdSlucy wang - Sun Microsystems - Beijing China 		/*
2069a5557fdSlucy wang - Sun Microsystems - Beijing China 		 * Copy the template from nd_template[] into the
2079a5557fdSlucy wang - Sun Microsystems - Beijing China 		 * proper slot in the per-instance parameters,
2089a5557fdSlucy wang - Sun Microsystems - Beijing China 		 * then register the parameter with nd_load()
2099a5557fdSlucy wang - Sun Microsystems - Beijing China 		 */
2109a5557fdSlucy wang - Sun Microsystems - Beijing China 		ndp = &adapter->nd_params[tmplp->ndp_info];
2119a5557fdSlucy wang - Sun Microsystems - Beijing China 		*ndp = *tmplp;
2129a5557fdSlucy wang - Sun Microsystems - Beijing China 		nm = &ndp->ndp_name[0];
2139a5557fdSlucy wang - Sun Microsystems - Beijing China 		setfn = unm_param_set;
2149a5557fdSlucy wang - Sun Microsystems - Beijing China 
2159a5557fdSlucy wang - Sun Microsystems - Beijing China 		switch (*nm) {
2169a5557fdSlucy wang - Sun Microsystems - Beijing China 		default:
2179a5557fdSlucy wang - Sun Microsystems - Beijing China 		case '!':
2189a5557fdSlucy wang - Sun Microsystems - Beijing China 			continue;
2199a5557fdSlucy wang - Sun Microsystems - Beijing China 
2209a5557fdSlucy wang - Sun Microsystems - Beijing China 		case '+':
2219a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
2229a5557fdSlucy wang - Sun Microsystems - Beijing China 
2239a5557fdSlucy wang - Sun Microsystems - Beijing China 		case '-':
2249a5557fdSlucy wang - Sun Microsystems - Beijing China 			setfn = NULL;
2259a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
2269a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
2279a5557fdSlucy wang - Sun Microsystems - Beijing China 
2289a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (!nd_load(nddpp, ++nm, unm_param_get, setfn, (caddr_t)ndp))
2299a5557fdSlucy wang - Sun Microsystems - Beijing China 			goto nd_fail;
2309a5557fdSlucy wang - Sun Microsystems - Beijing China 
2319a5557fdSlucy wang - Sun Microsystems - Beijing China 		/*
2329a5557fdSlucy wang - Sun Microsystems - Beijing China 		 * If the parameter is writable, and there's a property
2339a5557fdSlucy wang - Sun Microsystems - Beijing China 		 * with the same name, and its value is in range, we use
2349a5557fdSlucy wang - Sun Microsystems - Beijing China 		 * it to initialise the parameter.  If it exists but is
2359a5557fdSlucy wang - Sun Microsystems - Beijing China 		 * out of range, it's ignored.
2369a5557fdSlucy wang - Sun Microsystems - Beijing China 		 */
2379a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (setfn && UNM_PROP_EXISTS(dip, nm)) {
2389a5557fdSlucy wang - Sun Microsystems - Beijing China 			pval = UNM_PROP_GET_INT(dip, nm);
2399a5557fdSlucy wang - Sun Microsystems - Beijing China 			if (pval >= ndp->ndp_min && pval <= ndp->ndp_max)
2409a5557fdSlucy wang - Sun Microsystems - Beijing China 				ndp->ndp_val = pval;
2419a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
2429a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
2439a5557fdSlucy wang - Sun Microsystems - Beijing China 
2449a5557fdSlucy wang - Sun Microsystems - Beijing China 	DPRINTF(1, (CE_WARN, "unm_param_register: OK"));
2459a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (DDI_SUCCESS);
2469a5557fdSlucy wang - Sun Microsystems - Beijing China 
2479a5557fdSlucy wang - Sun Microsystems - Beijing China nd_fail:
2489a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (adapter->ahw.board_type == UNM_NIC_XGBE) {
2499a5557fdSlucy wang - Sun Microsystems - Beijing China 		cmn_err(CE_WARN,
2509a5557fdSlucy wang - Sun Microsystems - Beijing China 		    "unm_param_register: FAILED at index %d [info %d]",
2519a5557fdSlucy wang - Sun Microsystems - Beijing China 		    (int)(tmplp-nd_template_10000), tmplp->ndp_info);
2529a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else {
2539a5557fdSlucy wang - Sun Microsystems - Beijing China 		cmn_err(CE_WARN,
2549a5557fdSlucy wang - Sun Microsystems - Beijing China 		    "unm_param_register: FAILED at index %d [info %d]",
2559a5557fdSlucy wang - Sun Microsystems - Beijing China 		    (int)(tmplp-nd_template_1000), tmplp->ndp_info);
2569a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
2579a5557fdSlucy wang - Sun Microsystems - Beijing China 	nd_free(nddpp);
2589a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (DDI_FAILURE);
2599a5557fdSlucy wang - Sun Microsystems - Beijing China }
2609a5557fdSlucy wang - Sun Microsystems - Beijing China 
2619a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_nd_init(unm_adapter * adapter)2629a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nd_init(unm_adapter *adapter)
2639a5557fdSlucy wang - Sun Microsystems - Beijing China {
2649a5557fdSlucy wang - Sun Microsystems - Beijing China 	dev_info_t *dip;
2659a5557fdSlucy wang - Sun Microsystems - Beijing China 	int duplex;
2669a5557fdSlucy wang - Sun Microsystems - Beijing China 	int speed;
2679a5557fdSlucy wang - Sun Microsystems - Beijing China 
2689a5557fdSlucy wang - Sun Microsystems - Beijing China 	/*
2699a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * Register all the per-instance properties, initialising
2709a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * them from the table above or from driver properties set
2719a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * in the .conf file
2729a5557fdSlucy wang - Sun Microsystems - Beijing China 	 */
2739a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (unm_param_register(adapter) != DDI_SUCCESS)
2749a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
2759a5557fdSlucy wang - Sun Microsystems - Beijing China 
2769a5557fdSlucy wang - Sun Microsystems - Beijing China 	/*
2779a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * The link speed may be forced to 1000 or 10000 Mbps using
2789a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * the property "transfer-speed". This may be done in OBP by
2799a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * using the command "apply transfer-speed=<speed> <device>".
2809a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * The speed may be 1000 or 10000 - any other value will be
2819a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * ignored.  Note that this does *enables* autonegotiation, but
2829a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * restricts it to the speed specified by the property.
2839a5557fdSlucy wang - Sun Microsystems - Beijing China 	 */
2849a5557fdSlucy wang - Sun Microsystems - Beijing China 	dip = adapter->dip;
2859a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (UNM_PROP_EXISTS(dip, transfer_speed_propname)) {
2869a5557fdSlucy wang - Sun Microsystems - Beijing China 
2879a5557fdSlucy wang - Sun Microsystems - Beijing China 		speed = UNM_PROP_GET_INT(dip, transfer_speed_propname);
2889a5557fdSlucy wang - Sun Microsystems - Beijing China 
2899a5557fdSlucy wang - Sun Microsystems - Beijing China 		switch (speed) {
2909a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 10000:
2919a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_autoneg = 1;
2929a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_10000fdx = 1;
2939a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_1000fdx = 0;
2949a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_1000hdx = 0;
2959a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_100fdx = 0;
2969a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_100hdx = 0;
2979a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_10fdx = 0;
2989a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_10hdx = 0;
2999a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
3009a5557fdSlucy wang - Sun Microsystems - Beijing China 
3019a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 1000:
3029a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_autoneg = 1;
3039a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_1000fdx = 1;
3049a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_1000hdx = 1;
3059a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_100fdx = 0;
3069a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_100hdx = 0;
3079a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_10fdx = 0;
3089a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_10hdx = 0;
3099a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
3109a5557fdSlucy wang - Sun Microsystems - Beijing China 
3119a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 100:
3129a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_autoneg = 1;
3139a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_1000fdx = 0;
3149a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_1000hdx = 0;
3159a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_100fdx = 1;
3169a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_100hdx = 1;
3179a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_10fdx = 0;
3189a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_10hdx = 0;
3199a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
3209a5557fdSlucy wang - Sun Microsystems - Beijing China 
3219a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 10:
3229a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_autoneg = 1;
3239a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_1000fdx = 0;
3249a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_1000hdx = 0;
3259a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_100fdx = 0;
3269a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_100hdx = 0;
3279a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_10fdx = 1;
3289a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_10hdx = 1;
3299a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
3309a5557fdSlucy wang - Sun Microsystems - Beijing China 
3319a5557fdSlucy wang - Sun Microsystems - Beijing China 		default:
3329a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
3339a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
3349a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
3359a5557fdSlucy wang - Sun Microsystems - Beijing China 
3369a5557fdSlucy wang - Sun Microsystems - Beijing China 	/*
3379a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * Also check the "speed" and "full-duplex" properties.  Setting
3389a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * these properties will override all other settings and *disable*
3399a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * autonegotiation, so both should be specified if either one is.
3409a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * Otherwise, the unspecified parameter will be set to a default
3419a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * value (10000Mb/s, full-duplex).
3429a5557fdSlucy wang - Sun Microsystems - Beijing China 	 */
3439a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (UNM_PROP_EXISTS(dip, speed_propname) ||
3449a5557fdSlucy wang - Sun Microsystems - Beijing China 	    UNM_PROP_EXISTS(dip, duplex_propname)) {
3459a5557fdSlucy wang - Sun Microsystems - Beijing China 
3469a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->param_adv_autoneg = 0;
3479a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->param_adv_10000fdx = 1;
3489a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->param_adv_1000fdx = 1;
3499a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->param_adv_1000hdx = 1;
3509a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->param_adv_100fdx = 1;
3519a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->param_adv_100hdx = 1;
3529a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->param_adv_10fdx = 1;
3539a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->param_adv_10hdx = 1;
3549a5557fdSlucy wang - Sun Microsystems - Beijing China 
3559a5557fdSlucy wang - Sun Microsystems - Beijing China 		speed = UNM_PROP_GET_INT(dip, speed_propname);
3569a5557fdSlucy wang - Sun Microsystems - Beijing China 		duplex = UNM_PROP_GET_INT(dip, duplex_propname);
3579a5557fdSlucy wang - Sun Microsystems - Beijing China 
3589a5557fdSlucy wang - Sun Microsystems - Beijing China 		switch (speed) {
3599a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 10000:
3609a5557fdSlucy wang - Sun Microsystems - Beijing China 		default:
3619a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_1000fdx = 0;
3629a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_1000hdx = 0;
3639a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_100fdx = 0;
3649a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_100hdx = 0;
3659a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_10fdx = 0;
3669a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_10hdx = 0;
3679a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
3689a5557fdSlucy wang - Sun Microsystems - Beijing China 
3699a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 1000:
3709a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_10000fdx = 0;
3719a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_100fdx = 0;
3729a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_100hdx = 0;
3739a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_10fdx = 0;
3749a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_10hdx = 0;
3759a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
3769a5557fdSlucy wang - Sun Microsystems - Beijing China 
3779a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 100:
3789a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_10000fdx = 0;
3799a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_1000fdx = 0;
3809a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_1000hdx = 0;
3819a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_10fdx = 0;
3829a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_10hdx = 0;
3839a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
3849a5557fdSlucy wang - Sun Microsystems - Beijing China 
3859a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 10:
3869a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_10000fdx = 0;
3879a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_1000fdx = 0;
3889a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_1000hdx = 0;
3899a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_100fdx = 0;
3909a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_100hdx = 0;
3919a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
3929a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
3939a5557fdSlucy wang - Sun Microsystems - Beijing China 
3949a5557fdSlucy wang - Sun Microsystems - Beijing China 		switch (duplex) {
3959a5557fdSlucy wang - Sun Microsystems - Beijing China 		default:
3969a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 1:
3979a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_1000hdx = 0;
3989a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_100hdx = 0;
3999a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_10hdx = 0;
4009a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
4019a5557fdSlucy wang - Sun Microsystems - Beijing China 
4029a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 0:
4039a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_10000fdx = 0;
4049a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_1000fdx = 0;
4059a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_100fdx = 0;
4069a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->param_adv_10fdx = 0;
4079a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
4089a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
4099a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
4109a5557fdSlucy wang - Sun Microsystems - Beijing China 
4119a5557fdSlucy wang - Sun Microsystems - Beijing China 	DPRINTF(1, (CE_WARN, "unm_nd_init: autoneg %d"
4129a5557fdSlucy wang - Sun Microsystems - Beijing China 	    "pause %d asym_pause %d "
4139a5557fdSlucy wang - Sun Microsystems - Beijing China 	    "10000fdx %d "
4149a5557fdSlucy wang - Sun Microsystems - Beijing China 	    "1000fdx %d 1000hdx %d "
4159a5557fdSlucy wang - Sun Microsystems - Beijing China 	    "100fdx %d 100hdx %d "
4169a5557fdSlucy wang - Sun Microsystems - Beijing China 	    "10fdx %d 10hdx %d ",
4179a5557fdSlucy wang - Sun Microsystems - Beijing China 	    adapter->param_adv_autoneg,
4189a5557fdSlucy wang - Sun Microsystems - Beijing China 	    adapter->param_adv_pause, adapter->param_adv_asym_pause,
4199a5557fdSlucy wang - Sun Microsystems - Beijing China 	    adapter->param_adv_10000fdx,
4209a5557fdSlucy wang - Sun Microsystems - Beijing China 	    adapter->param_adv_1000fdx, adapter->param_adv_1000hdx,
4219a5557fdSlucy wang - Sun Microsystems - Beijing China 	    adapter->param_adv_100fdx, adapter->param_adv_100hdx,
4229a5557fdSlucy wang - Sun Microsystems - Beijing China 	    adapter->param_adv_10fdx, adapter->param_adv_10hdx));
4239a5557fdSlucy wang - Sun Microsystems - Beijing China 
4249a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
4259a5557fdSlucy wang - Sun Microsystems - Beijing China }
4269a5557fdSlucy wang - Sun Microsystems - Beijing China 
4279a5557fdSlucy wang - Sun Microsystems - Beijing China enum ioc_reply
unm_nd_ioctl(unm_adapter * adapter,queue_t * wq,mblk_t * mp,struct iocblk * iocp)4289a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nd_ioctl(unm_adapter *adapter, queue_t *wq, mblk_t *mp, struct iocblk *iocp)
4299a5557fdSlucy wang - Sun Microsystems - Beijing China {
4309a5557fdSlucy wang - Sun Microsystems - Beijing China 	boolean_t ok;
4319a5557fdSlucy wang - Sun Microsystems - Beijing China 	int cmd;
4329a5557fdSlucy wang - Sun Microsystems - Beijing China 
4339a5557fdSlucy wang - Sun Microsystems - Beijing China 	DPRINTF(1, (CE_WARN, "unm_nd_ioctl($%p, $%p, $%p, $%p)",
4349a5557fdSlucy wang - Sun Microsystems - Beijing China 	    (void *)adapter, (void *)wq, (void *)mp, (void *)iocp));
4359a5557fdSlucy wang - Sun Microsystems - Beijing China 
4369a5557fdSlucy wang - Sun Microsystems - Beijing China 	cmd = iocp->ioc_cmd;
4379a5557fdSlucy wang - Sun Microsystems - Beijing China 	switch (cmd) {
4389a5557fdSlucy wang - Sun Microsystems - Beijing China 	default:
4399a5557fdSlucy wang - Sun Microsystems - Beijing China 		/* NOTREACHED */
4409a5557fdSlucy wang - Sun Microsystems - Beijing China 		DPRINTF(-1, (CE_WARN, "unm_nd_ioctl: invalid cmd 0x%x", cmd));
4419a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (IOC_INVAL);
4429a5557fdSlucy wang - Sun Microsystems - Beijing China 
4439a5557fdSlucy wang - Sun Microsystems - Beijing China 	case ND_GET:
4449a5557fdSlucy wang - Sun Microsystems - Beijing China 		/*
4459a5557fdSlucy wang - Sun Microsystems - Beijing China 		 * If nd_getset() returns B_FALSE, the command was
4469a5557fdSlucy wang - Sun Microsystems - Beijing China 		 * not valid (e.g. unknown name), so we just tell the
4479a5557fdSlucy wang - Sun Microsystems - Beijing China 		 * top-level ioctl code to send a NAK (with code EINVAL).
4489a5557fdSlucy wang - Sun Microsystems - Beijing China 		 *
4499a5557fdSlucy wang - Sun Microsystems - Beijing China 		 * Otherwise, nd_getset() will have built the reply to
4509a5557fdSlucy wang - Sun Microsystems - Beijing China 		 * be sent (but not actually sent it), so we tell the
4519a5557fdSlucy wang - Sun Microsystems - Beijing China 		 * caller to send the prepared reply.
4529a5557fdSlucy wang - Sun Microsystems - Beijing China 		 */
4539a5557fdSlucy wang - Sun Microsystems - Beijing China 		ok = nd_getset(wq, adapter->nd_data_p, mp);
4549a5557fdSlucy wang - Sun Microsystems - Beijing China 		DPRINTF(1, (CE_WARN, "unm_nd_ioctl: get %s", ok ? "OK" :
4559a5557fdSlucy wang - Sun Microsystems - Beijing China 		    "FAIL"));
4569a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (ok ? IOC_REPLY : IOC_INVAL);
4579a5557fdSlucy wang - Sun Microsystems - Beijing China 
4589a5557fdSlucy wang - Sun Microsystems - Beijing China 	case ND_SET:
4599a5557fdSlucy wang - Sun Microsystems - Beijing China 		/*
4609a5557fdSlucy wang - Sun Microsystems - Beijing China 		 * All adv_* parameters are locked (read-only) while
4619a5557fdSlucy wang - Sun Microsystems - Beijing China 		 * the device is in any sort of loopback mode ...
4629a5557fdSlucy wang - Sun Microsystems - Beijing China 		 */
4639a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (adapter->param_loop_mode != UNM_LOOP_NONE) {
4649a5557fdSlucy wang - Sun Microsystems - Beijing China 			iocp->ioc_error = EBUSY;
4659a5557fdSlucy wang - Sun Microsystems - Beijing China 			return (IOC_INVAL);
4669a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
4679a5557fdSlucy wang - Sun Microsystems - Beijing China 
4689a5557fdSlucy wang - Sun Microsystems - Beijing China 		ok = nd_getset(wq, adapter->nd_data_p, mp);
4699a5557fdSlucy wang - Sun Microsystems - Beijing China 
4709a5557fdSlucy wang - Sun Microsystems - Beijing China 		/*
4719a5557fdSlucy wang - Sun Microsystems - Beijing China 		 * If nd_getset() returns B_FALSE, the command was
4729a5557fdSlucy wang - Sun Microsystems - Beijing China 		 * not valid (e.g. unknown name), so we just tell
4739a5557fdSlucy wang - Sun Microsystems - Beijing China 		 * the top-level ioctl code to send a NAK (with code
4749a5557fdSlucy wang - Sun Microsystems - Beijing China 		 * EINVAL by default).
4759a5557fdSlucy wang - Sun Microsystems - Beijing China 		 *
4769a5557fdSlucy wang - Sun Microsystems - Beijing China 		 * Otherwise, nd_getset() will have built the reply to
4779a5557fdSlucy wang - Sun Microsystems - Beijing China 		 * be sent - but that doesn't imply success!  In some
4789a5557fdSlucy wang - Sun Microsystems - Beijing China 		 * cases, the reply it's built will have a non-zero
4799a5557fdSlucy wang - Sun Microsystems - Beijing China 		 * error code in it (e.g. EPERM if not superuser).
4809a5557fdSlucy wang - Sun Microsystems - Beijing China 		 * So, we also drop out in that case ...
4819a5557fdSlucy wang - Sun Microsystems - Beijing China 		 */
4829a5557fdSlucy wang - Sun Microsystems - Beijing China 		DPRINTF(1, (CE_WARN,
4839a5557fdSlucy wang - Sun Microsystems - Beijing China 		    "unm_nd_ioctl: set %s err %d autoneg %d info %d",
4849a5557fdSlucy wang - Sun Microsystems - Beijing China 		    ok ? "OK" : "FAIL", iocp->ioc_error,
4859a5557fdSlucy wang - Sun Microsystems - Beijing China 		    adapter->nd_params[PARAM_ADV_AUTONEG_CAP].ndp_val,
4869a5557fdSlucy wang - Sun Microsystems - Beijing China 		    adapter->nd_params[PARAM_ADV_AUTONEG_CAP].ndp_info));
4879a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (!ok)
4889a5557fdSlucy wang - Sun Microsystems - Beijing China 			return (IOC_INVAL);
4899a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (iocp->ioc_error)
4909a5557fdSlucy wang - Sun Microsystems - Beijing China 			return (IOC_REPLY);
4919a5557fdSlucy wang - Sun Microsystems - Beijing China 
4929a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (IOC_RESTART_REPLY);
4939a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
4949a5557fdSlucy wang - Sun Microsystems - Beijing China }
4959a5557fdSlucy wang - Sun Microsystems - Beijing China 
4969a5557fdSlucy wang - Sun Microsystems - Beijing China /* Free the Named Dispatch Table by calling nd_free */
4979a5557fdSlucy wang - Sun Microsystems - Beijing China void
unm_nd_cleanup(unm_adapter * adapter)4989a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nd_cleanup(unm_adapter *adapter)
4999a5557fdSlucy wang - Sun Microsystems - Beijing China {
5009a5557fdSlucy wang - Sun Microsystems - Beijing China 	nd_free(&adapter->nd_data_p);
5019a5557fdSlucy wang - Sun Microsystems - Beijing China }
502