diff options
author | Robert Mustacchi <rm@joyent.com> | 2014-07-28 22:16:45 +0000 |
---|---|---|
committer | Robert Mustacchi <rm@joyent.com> | 2014-07-30 18:02:43 +0000 |
commit | 5f23582aac7bf1a0ae70b4954d1e36c079182ced (patch) | |
tree | eb19ab3f6d0f3c45b1890acfc5fa9b031300f23d /usr/src | |
parent | 1ee2dceb18f8b2a1680b89a200e1878db0c91dee (diff) | |
download | illumos-joyent-5f23582aac7bf1a0ae70b4954d1e36c079182ced.tar.gz |
OS-3255 myri10ge should allow you to tune its mtu
Reviewed by: Keith M Wesolowski <wesolows@foobazco.org>
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/common/io/myri10ge/drv/myri10ge.c | 74 |
1 files changed, 71 insertions, 3 deletions
diff --git a/usr/src/uts/common/io/myri10ge/drv/myri10ge.c b/usr/src/uts/common/io/myri10ge/drv/myri10ge.c index 791d6cb54c..42793c3a26 100644 --- a/usr/src/uts/common/io/myri10ge/drv/myri10ge.c +++ b/usr/src/uts/common/io/myri10ge/drv/myri10ge.c @@ -41,6 +41,8 @@ static const char __idstring[] = #include "mcp_gen_header.h" #define MYRI10GE_MAX_ETHER_MTU 9014 +#define MYRI10GE_MAX_GLD_MTU 9000 +#define MYRI10GE_MIN_GLD_MTU 1500 #define MYRI10GE_ETH_STOPPED 0 #define MYRI10GE_ETH_STOPPING 1 @@ -193,8 +195,10 @@ static void myri10ge_watchdog(void *arg); #ifdef MYRICOM_PRIV int myri10ge_mtu = MYRI10GE_MAX_ETHER_MTU + MXGEFW_PAD + VLAN_TAGSZ; +#define MYRI10GE_DEFAULT_GLD_MTU MYRI10GE_MAX_GLD_MTU #else int myri10ge_mtu = ETHERMAX + MXGEFW_PAD + VLAN_TAGSZ; +#define MYRI10GE_DEFAULT_GLD_MTU MYRI10GE_MIN_GLD_MTU #endif int myri10ge_bigbufs_initial = 1024; int myri10ge_bigbufs_max = 4096; @@ -4697,7 +4701,8 @@ myri10ge_get_props(dev_info_t *dip) myri10ge_mtu_override = ddi_prop_get_int(DDI_DEV_T_ANY, dip, 0, "myri10ge_mtu_override", myri10ge_mtu_override); - if (myri10ge_mtu_override >= 1500 && myri10ge_mtu_override <= 9000) + if (myri10ge_mtu_override >= MYRI10GE_MIN_GLD_MTU && + myri10ge_mtu_override <= MYRI10GE_MAX_GLD_MTU) myri10ge_mtu = myri10ge_mtu_override + sizeof (struct ether_header) + MXGEFW_PAD + VLAN_TAGSZ; else if (myri10ge_mtu_override != 0) { @@ -5367,8 +5372,66 @@ myri10ge_m_stat(void *arg, uint_t stat, uint64_t *val) return (0); } +/* ARGSUSED */ +static void +myri10ge_m_propinfo(void *arg, const char *pr_name, + mac_prop_id_t pr_num, mac_prop_info_handle_t prh) +{ + switch (pr_num) { + case MAC_PROP_MTU: + mac_prop_info_set_default_uint32(prh, MYRI10GE_DEFAULT_GLD_MTU); + mac_prop_info_set_range_uint32(prh, MYRI10GE_MIN_GLD_MTU, + MYRI10GE_MAX_GLD_MTU); + break; + default: + break; + } +} + +/*ARGSUSED*/ +static int +myri10ge_m_setprop(void *arg, const char *pr_name, mac_prop_id_t pr_num, + uint_t pr_valsize, const void *pr_val) +{ + int err = 0; + struct myri10ge_priv *mgp = arg; + + switch (pr_num) { + case MAC_PROP_MTU: { + uint32_t mtu; + if (pr_valsize < sizeof (mtu)) { + err = EINVAL; + break; + } + bcopy(pr_val, &mtu, sizeof (mtu)); + if (mtu > MYRI10GE_MAX_GLD_MTU || + mtu < MYRI10GE_MIN_GLD_MTU) { + err = EINVAL; + break; + } + + mutex_enter(&mgp->intrlock); + if (mgp->running != MYRI10GE_ETH_STOPPED) { + err = EBUSY; + mutex_exit(&mgp->intrlock); + break; + } + + myri10ge_mtu = mtu + sizeof (struct ether_header) + + MXGEFW_PAD + VLAN_TAGSZ; + mutex_exit(&mgp->intrlock); + break; + } + default: + err = ENOTSUP; + break; + } + + return (err); +} + static mac_callbacks_t myri10ge_m_callbacks = { - (MC_IOCTL | MC_GETCAPAB), + (MC_IOCTL | MC_GETCAPAB | MC_SETPROP | MC_PROPINFO), myri10ge_m_stat, myri10ge_m_start, myri10ge_m_stop, @@ -5378,7 +5441,12 @@ static mac_callbacks_t myri10ge_m_callbacks = { NULL, NULL, myri10ge_m_ioctl, - myri10ge_m_getcapab + myri10ge_m_getcapab, + NULL, + NULL, + myri10ge_m_setprop, + NULL, + myri10ge_m_propinfo }; |