summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorRobert Mustacchi <rm@joyent.com>2014-07-28 22:16:45 +0000
committerRobert Mustacchi <rm@joyent.com>2014-07-30 18:02:43 +0000
commit5f23582aac7bf1a0ae70b4954d1e36c079182ced (patch)
treeeb19ab3f6d0f3c45b1890acfc5fa9b031300f23d /usr/src
parent1ee2dceb18f8b2a1680b89a200e1878db0c91dee (diff)
downloadillumos-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.c74
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
};