bge_ndd.c revision 0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * CDDL HEADER START
088fa5d9eaa83bf4b3d59a64c0519f42a143aaa9Alin Brici * The contents of this file are subject to the terms of the
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * Common Development and Distribution License (the "License").
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * You may not use this file except in compliance with the License.
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * See the License for the specific language governing permissions
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * and limitations under the License.
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * When distributing Covered Code, include this CDDL HEADER in each
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * If applicable, add the following below this CDDL HEADER, with the
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * fields enclosed by brackets "[]" replaced with your own identifying
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * information: Portions Copyright [yyyy] [name of copyright owner]
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * CDDL HEADER END
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * Use is subject to license terms.
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos#pragma ident "%Z%%M% %I% %E% SMI"
a1f638677d6b70887a0eeeab4e30fd2d7dbb5e5eBrendan Mmiller#define BGE_DBG BGE_DBG_NDD /* debug flag for this code */
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * Property names
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordosstatic char transfer_speed_propname[] = "transfer-speed";
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordosstatic char supported_net[] = "supported-network-types";
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * The first character of the <name> field encodes the read/write
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * status of the parameter:
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * '=' => read-only,
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * '-' => read-only and forced to 0 on serdes
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * '?' => read/write on copper, read-only and 0 on serdes
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * '!' => invisible!
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * For writable parameters, we check for a driver property with the
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * same name; if found, and its value is in range, we initialise
fe644a7302b3235c08aec5fd7992a329f2ee1364Laszlo Hordos * the parameter from the property, overriding the default in the
fe644a7302b3235c08aec5fd7992a329f2ee1364Laszlo Hordos * table below.
fe644a7302b3235c08aec5fd7992a329f2ee1364Laszlo Hordos * A NULL in the <name> field terminates the array.
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * The <info> field is used here to provide the index of the
c32fc412b63ff49e61e7748fda8a3d2dab890813Laszlo Hordos * parameter to be initialised; thus it doesn't matter whether
c32fc412b63ff49e61e7748fda8a3d2dab890813Laszlo Hordos * this table is kept ordered or not.
c32fc412b63ff49e61e7748fda8a3d2dab890813Laszlo Hordos * The <info> field in the per-instance copy, on the other hand,
fe644a7302b3235c08aec5fd7992a329f2ee1364Laszlo Hordos * is used to count assignments so that we can tell when a magic
c32fc412b63ff49e61e7748fda8a3d2dab890813Laszlo Hordos * parameter has been set via ndd (see bge_param_set()).
e95ef6b1ae95c5684fc1b20063975a2cb29055b9Laszlo Hordos/* info min max init r/w+name */
c32fc412b63ff49e61e7748fda8a3d2dab890813Laszlo Hordos/* Our hardware capabilities */
51c85743b9d73dedd60a0ecad2402c231f71e39dLaszlo Hordos{ PARAM_AUTONEG_CAP, 0, 1, 1, "=autoneg_cap" },
e95ef6b1ae95c5684fc1b20063975a2cb29055b9Laszlo Hordos{ PARAM_ASYM_PAUSE_CAP, 0, 1, 1, "=asym_pause_cap" },
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos{ PARAM_1000FDX_CAP, 0, 1, 1, "=1000fdx_cap" },
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos{ PARAM_1000HDX_CAP, 0, 1, 1, "=1000hdx_cap" },
a1f638677d6b70887a0eeeab4e30fd2d7dbb5e5eBrendan Mmiller/* Our advertised capabilities */
51c85743b9d73dedd60a0ecad2402c231f71e39dLaszlo Hordos{ PARAM_ADV_AUTONEG_CAP, 0, 1, 1, "+adv_autoneg_cap" },
51c85743b9d73dedd60a0ecad2402c231f71e39dLaszlo Hordos{ PARAM_ADV_PAUSE_CAP, 0, 1, 1, "+adv_pause_cap" },
51c85743b9d73dedd60a0ecad2402c231f71e39dLaszlo Hordos{ PARAM_ADV_ASYM_PAUSE_CAP, 0, 1, 1, "+adv_asym_pause_cap" },
a1f638677d6b70887a0eeeab4e30fd2d7dbb5e5eBrendan Mmiller{ PARAM_ADV_1000FDX_CAP, 0, 1, 1, "+adv_1000fdx_cap" },
51c85743b9d73dedd60a0ecad2402c231f71e39dLaszlo Hordos{ PARAM_ADV_1000HDX_CAP, 0, 1, 1, "+adv_1000hdx_cap" },
51c85743b9d73dedd60a0ecad2402c231f71e39dLaszlo Hordos{ PARAM_ADV_100T4_CAP, 0, 1, 0, "=adv_100T4_cap" },
51c85743b9d73dedd60a0ecad2402c231f71e39dLaszlo Hordos{ PARAM_ADV_100FDX_CAP, 0, 1, 1, "?adv_100fdx_cap" },
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos{ PARAM_ADV_100HDX_CAP, 0, 1, 1, "?adv_100hdx_cap" },
a1f638677d6b70887a0eeeab4e30fd2d7dbb5e5eBrendan Mmiller{ PARAM_ADV_10FDX_CAP, 0, 1, 1, "?adv_10fdx_cap" },
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos{ PARAM_ADV_10HDX_CAP, 0, 1, 1, "?adv_10hdx_cap" },
9797a5587e15fe093b9d962818283cd8e1197ef6Laszlo Hordos/* Partner's advertised capabilities */
27f054fe098cabdf56be9e73e3c689b9ebdacfc5Laszlo Hordos{ PARAM_LP_AUTONEG_CAP, 0, 1, 0, "-lp_autoneg_cap" },
51c85743b9d73dedd60a0ecad2402c231f71e39dLaszlo Hordos{ PARAM_LP_PAUSE_CAP, 0, 1, 0, "-lp_pause_cap" },
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos{ PARAM_LP_ASYM_PAUSE_CAP, 0, 1, 0, "-lp_asym_pause_cap" },
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos{ PARAM_LP_1000FDX_CAP, 0, 1, 0, "-lp_1000fdx_cap" },
9797a5587e15fe093b9d962818283cd8e1197ef6Laszlo Hordos{ PARAM_LP_1000HDX_CAP, 0, 1, 0, "-lp_1000hdx_cap" },
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos{ PARAM_LP_100T4_CAP, 0, 1, 0, "-lp_100T4_cap" },
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos{ PARAM_LP_100FDX_CAP, 0, 1, 0, "-lp_100fdx_cap" },
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos{ PARAM_LP_100HDX_CAP, 0, 1, 0, "-lp_100hdx_cap" },
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos{ PARAM_LP_10FDX_CAP, 0, 1, 0, "-lp_10fdx_cap" },
9797a5587e15fe093b9d962818283cd8e1197ef6Laszlo Hordos{ PARAM_LP_10HDX_CAP, 0, 1, 0, "-lp_10hdx_cap" },
df96152750f1114a1168f7e6e9ea78d579ef35ccLaszlo Hordos/* Current operating modes */
0f6ab51d11efadda72c74d92abc1747773621142Laszlo Hordos{ PARAM_LINK_STATUS, 0, 1, 0, "-link_status" },
df96152750f1114a1168f7e6e9ea78d579ef35ccLaszlo Hordos{ PARAM_LINK_SPEED, 0, 1000, 0, "-link_speed" },
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos{ PARAM_LINK_DUPLEX, 0, 2, 0, "-link_duplex" },
27f054fe098cabdf56be9e73e3c689b9ebdacfc5Laszlo Hordos{ PARAM_LINK_AUTONEG, 0, 1, 0, "-link_autoneg" },
e95ef6b1ae95c5684fc1b20063975a2cb29055b9Laszlo Hordos{ PARAM_LINK_RX_PAUSE, 0, 1, 0, "-link_rx_pause" },
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos{ PARAM_LINK_TX_PAUSE, 0, 1, 0, "-link_tx_pause" },
a1f638677d6b70887a0eeeab4e30fd2d7dbb5e5eBrendan Mmiller/* Loopback status */
e95ef6b1ae95c5684fc1b20063975a2cb29055b9Laszlo Hordos/* MSI count */
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos/* Performance tuning */
a1f638677d6b70887a0eeeab4e30fd2d7dbb5e5eBrendan Mmiller/* Terminator */
a0bf2647c3f5c8bb50b03ab767037b5f90242989Laszlo Hordos/* ============== NDD Support Functions =============== */
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * Extracts the value from the bge parameter array and prints
27f054fe098cabdf56be9e73e3c689b9ebdacfc5Laszlo Hordos * the parameter value. cp points to the required parameter.
f277d0ee6abc01fba581c836571dc390ac349de8Brendan Millerbge_param_get(queue_t *q, mblk_t *mp, caddr_t cp, cred_t *credp)
d90caa300251d7fd09e3f286018ce04356a71e62Laszlo Hordos * Validates the request to set a BGE parameter to a specific value.
22021f13de98c2ef69055bec833d200f16922bc2Laszlo Hordos * If the request is OK, the parameter is set. Also the <info> field
22021f13de98c2ef69055bec833d200f16922bc2Laszlo Hordos * is incremented to show that the parameter was touched, even though
a1f638677d6b70887a0eeeab4e30fd2d7dbb5e5eBrendan Mmiller * it may have been set to the same value it already had.
22021f13de98c2ef69055bec833d200f16922bc2Laszlo Hordosbge_param_set(queue_t *q, mblk_t *mp, char *value, caddr_t cp, cred_t *credp)
9797a5587e15fe093b9d962818283cd8e1197ef6Laszlo Hordos if (new_value < ndp->ndp_min || new_value > ndp->ndp_max)
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * Initialise the per-instance parameter array from the global prototype,
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos * and register each element with the named dispatch handler using nd_load()
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos BGE_TRACE(("bge_param_register($%p)", (void *)bgep));
0fdda69ce3627d501e4bb3103765f676bb1ab061Laszlo Hordos for (tmplp = nd_template; tmplp->ndp_name != NULL; ++tmplp) {
a1f638677d6b70887a0eeeab4e30fd2d7dbb5e5eBrendan Mmiller * Copy the template from nd_template[] into the
968a8ea42a7a90597e80bca047c0e8a70b3b5f5fLaszlo Hordos * proper slot in the per-instance parameters,
df96152750f1114a1168f7e6e9ea78d579ef35ccLaszlo Hordos * then register the parameter with nd_load()
df96152750f1114a1168f7e6e9ea78d579ef35ccLaszlo Hordos if (!nd_load(nddpp, ++nm, bge_param_get, setfn, (caddr_t)ndp))
df96152750f1114a1168f7e6e9ea78d579ef35ccLaszlo Hordos * If the parameter is writable, and there's a property
df96152750f1114a1168f7e6e9ea78d579ef35ccLaszlo Hordos * with the same name, and its value is in range, we use
df96152750f1114a1168f7e6e9ea78d579ef35ccLaszlo Hordos * it to initialise the parameter. If it exists but is
df96152750f1114a1168f7e6e9ea78d579ef35ccLaszlo Hordos * out of range, it's ignored.
fe644a7302b3235c08aec5fd7992a329f2ee1364Laszlo Hordos if (pval >= ndp->ndp_min && pval <= ndp->ndp_max)
df96152750f1114a1168f7e6e9ea78d579ef35ccLaszlo Hordos BGE_DEBUG(("bge_param_register: FAILED at index %d [info %d]",
int duplex;
int speed;
switch (speed) {
switch (speed) {
switch (duplex) {
enum ioc_reply
int info;
int cmd;
switch (cmd) {
return (IOC_INVAL);
case ND_GET:
case ND_SET:
return (IOC_INVAL);
if (!ok)
return (IOC_INVAL);
return (IOC_REPLY);
return (IOC_RESTART_REPLY);