ixgbe sysctl hardware defaults
Added hw.ix.flow_control which enables the default flow_control of all ix interfaces to be set in loader.conf. Added hw.ix.advertise_speed which enables the default advertised_speed of all ix interfaces to be set in loader.conf. Made enable_aim device independent based on hw.ix.enable_aim default. Reviewed by: erj MFC after: 1 week Sponsored by: Multiplay Differential Revision: https://reviews.freebsd.org/D5060
This commit is contained in:
parent
0631608b3c
commit
22b46bda2f
@ -166,12 +166,14 @@ static void ixgbe_unregister_vlan(void *, struct ifnet *, u16);
|
||||
|
||||
static void ixgbe_add_device_sysctls(struct adapter *);
|
||||
static void ixgbe_add_hw_stats(struct adapter *);
|
||||
static int ixgbe_set_flowcntl(struct adapter *, int);
|
||||
static int ixgbe_set_advertise(struct adapter *, int);
|
||||
|
||||
/* Sysctl handlers */
|
||||
static void ixgbe_set_sysctl_value(struct adapter *, const char *,
|
||||
const char *, int *, int);
|
||||
static int ixgbe_set_flowcntl(SYSCTL_HANDLER_ARGS);
|
||||
static int ixgbe_set_advertise(SYSCTL_HANDLER_ARGS);
|
||||
static int ixgbe_sysctl_flowcntl(SYSCTL_HANDLER_ARGS);
|
||||
static int ixgbe_sysctl_advertise(SYSCTL_HANDLER_ARGS);
|
||||
static int ixgbe_sysctl_thermal_test(SYSCTL_HANDLER_ARGS);
|
||||
static int ixgbe_sysctl_dmac(SYSCTL_HANDLER_ARGS);
|
||||
static int ixgbe_sysctl_phy_temp(SYSCTL_HANDLER_ARGS);
|
||||
@ -290,6 +292,16 @@ SYSCTL_INT(_hw_ix, OID_AUTO, tx_process_limit, CTLFLAG_RDTUN,
|
||||
"Maximum number of sent packets to process at a time,"
|
||||
"-1 means unlimited");
|
||||
|
||||
/* Flow control setting, default to full */
|
||||
static int ixgbe_flow_control = ixgbe_fc_full;
|
||||
SYSCTL_INT(_hw_ix, OID_AUTO, flow_control, CTLFLAG_RDTUN,
|
||||
&ixgbe_flow_control, 0, "Default flow control used for all adapters");
|
||||
|
||||
/* Advertise Speed, default to 0 (auto) */
|
||||
static int ixgbe_advertise_speed = 0;
|
||||
SYSCTL_INT(_hw_ix, OID_AUTO, advertise_speed, CTLFLAG_RDTUN,
|
||||
&ixgbe_advertise_speed, 0, "Default advertised speed for all adapters");
|
||||
|
||||
/*
|
||||
** Smart speed setting, default to on
|
||||
** this only works as a compile option
|
||||
@ -568,6 +580,11 @@ ixgbe_attach(device_t dev)
|
||||
break;
|
||||
}
|
||||
|
||||
/* hw.ix defaults init */
|
||||
ixgbe_set_advertise(adapter, ixgbe_advertise_speed);
|
||||
ixgbe_set_flowcntl(adapter, ixgbe_flow_control);
|
||||
adapter->enable_aim = ixgbe_enable_aim;
|
||||
|
||||
if ((adapter->msix > 1) && (ixgbe_enable_msix))
|
||||
error = ixgbe_allocate_msix(adapter);
|
||||
else
|
||||
@ -1553,7 +1570,7 @@ ixgbe_msix_que(void *arg)
|
||||
|
||||
/* Do AIM now? */
|
||||
|
||||
if (ixgbe_enable_aim == FALSE)
|
||||
if (adapter->enable_aim == FALSE)
|
||||
goto no_calc;
|
||||
/*
|
||||
** Do Adaptive Interrupt Moderation:
|
||||
@ -4276,7 +4293,7 @@ ixgbe_add_device_sysctls(struct adapter *adapter)
|
||||
/* Sysctls for all devices */
|
||||
SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "fc",
|
||||
CTLTYPE_INT | CTLFLAG_RW, adapter, 0,
|
||||
ixgbe_set_flowcntl, "I", IXGBE_SYSCTL_DESC_SET_FC);
|
||||
ixgbe_sysctl_flowcntl, "I", IXGBE_SYSCTL_DESC_SET_FC);
|
||||
|
||||
SYSCTL_ADD_INT(ctx, child, OID_AUTO, "enable_aim",
|
||||
CTLFLAG_RW,
|
||||
@ -4284,7 +4301,7 @@ ixgbe_add_device_sysctls(struct adapter *adapter)
|
||||
|
||||
SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "advertise_speed",
|
||||
CTLTYPE_INT | CTLFLAG_RW, adapter, 0,
|
||||
ixgbe_set_advertise, "I", IXGBE_SYSCTL_DESC_ADV_SPEED);
|
||||
ixgbe_sysctl_advertise, "I", IXGBE_SYSCTL_DESC_ADV_SPEED);
|
||||
|
||||
SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "thermal_test",
|
||||
CTLTYPE_INT | CTLFLAG_RW, adapter, 0,
|
||||
@ -4649,41 +4666,51 @@ ixgbe_set_sysctl_value(struct adapter *adapter, const char *name,
|
||||
** 3 - full
|
||||
*/
|
||||
static int
|
||||
ixgbe_set_flowcntl(SYSCTL_HANDLER_ARGS)
|
||||
ixgbe_sysctl_flowcntl(SYSCTL_HANDLER_ARGS)
|
||||
{
|
||||
int error, last;
|
||||
struct adapter *adapter = (struct adapter *) arg1;
|
||||
int error, fc;
|
||||
struct adapter *adapter;
|
||||
|
||||
last = adapter->fc;
|
||||
error = sysctl_handle_int(oidp, &adapter->fc, 0, req);
|
||||
adapter = (struct adapter *) arg1;
|
||||
fc = adapter->fc;
|
||||
|
||||
error = sysctl_handle_int(oidp, &fc, 0, req);
|
||||
if ((error) || (req->newptr == NULL))
|
||||
return (error);
|
||||
|
||||
/* Don't bother if it's not changed */
|
||||
if (adapter->fc == last)
|
||||
if (adapter->fc == fc)
|
||||
return (0);
|
||||
|
||||
switch (adapter->fc) {
|
||||
case ixgbe_fc_rx_pause:
|
||||
case ixgbe_fc_tx_pause:
|
||||
case ixgbe_fc_full:
|
||||
adapter->hw.fc.requested_mode = adapter->fc;
|
||||
if (adapter->num_queues > 1)
|
||||
ixgbe_disable_rx_drop(adapter);
|
||||
break;
|
||||
case ixgbe_fc_none:
|
||||
adapter->hw.fc.requested_mode = ixgbe_fc_none;
|
||||
if (adapter->num_queues > 1)
|
||||
ixgbe_enable_rx_drop(adapter);
|
||||
break;
|
||||
default:
|
||||
adapter->fc = last;
|
||||
return (EINVAL);
|
||||
return ixgbe_set_flowcntl(adapter, fc);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
ixgbe_set_flowcntl(struct adapter *adapter, int fc)
|
||||
{
|
||||
|
||||
switch (fc) {
|
||||
case ixgbe_fc_rx_pause:
|
||||
case ixgbe_fc_tx_pause:
|
||||
case ixgbe_fc_full:
|
||||
adapter->hw.fc.requested_mode = adapter->fc;
|
||||
if (adapter->num_queues > 1)
|
||||
ixgbe_disable_rx_drop(adapter);
|
||||
break;
|
||||
case ixgbe_fc_none:
|
||||
adapter->hw.fc.requested_mode = ixgbe_fc_none;
|
||||
if (adapter->num_queues > 1)
|
||||
ixgbe_enable_rx_drop(adapter);
|
||||
break;
|
||||
default:
|
||||
return (EINVAL);
|
||||
}
|
||||
adapter->fc = fc;
|
||||
/* Don't autoneg if forcing a value */
|
||||
adapter->hw.fc.disable_fc_autoneg = TRUE;
|
||||
ixgbe_fc_enable(&adapter->hw);
|
||||
return error;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -4694,31 +4721,39 @@ ixgbe_set_flowcntl(SYSCTL_HANDLER_ARGS)
|
||||
** 0x4 - advertise 10G
|
||||
*/
|
||||
static int
|
||||
ixgbe_set_advertise(SYSCTL_HANDLER_ARGS)
|
||||
ixgbe_sysctl_advertise(SYSCTL_HANDLER_ARGS)
|
||||
{
|
||||
int error = 0, requested;
|
||||
struct adapter *adapter;
|
||||
device_t dev;
|
||||
struct ixgbe_hw *hw;
|
||||
ixgbe_link_speed speed = 0;
|
||||
int error, advertise;
|
||||
struct adapter *adapter;
|
||||
|
||||
adapter = (struct adapter *) arg1;
|
||||
dev = adapter->dev;
|
||||
hw = &adapter->hw;
|
||||
advertise = adapter->advertise;
|
||||
|
||||
requested = adapter->advertise;
|
||||
error = sysctl_handle_int(oidp, &requested, 0, req);
|
||||
error = sysctl_handle_int(oidp, &advertise, 0, req);
|
||||
if ((error) || (req->newptr == NULL))
|
||||
return (error);
|
||||
|
||||
/* Checks to validate new value */
|
||||
if (adapter->advertise == advertise) /* no change */
|
||||
return (0);
|
||||
|
||||
return ixgbe_set_advertise(adapter, advertise);
|
||||
}
|
||||
|
||||
static int
|
||||
ixgbe_set_advertise(struct adapter *adapter, int advertise)
|
||||
{
|
||||
device_t dev;
|
||||
struct ixgbe_hw *hw;
|
||||
ixgbe_link_speed speed;
|
||||
|
||||
hw = &adapter->hw;
|
||||
dev = adapter->dev;
|
||||
|
||||
/* No speed changes for backplane media */
|
||||
if (hw->phy.media_type == ixgbe_media_type_backplane)
|
||||
return (ENODEV);
|
||||
|
||||
/* Checks to validate new value */
|
||||
if (adapter->advertise == requested) /* no change */
|
||||
return (0);
|
||||
|
||||
if (!((hw->phy.media_type == ixgbe_media_type_copper) ||
|
||||
(hw->phy.multispeed_fiber))) {
|
||||
device_printf(dev,
|
||||
@ -4727,13 +4762,13 @@ ixgbe_set_advertise(SYSCTL_HANDLER_ARGS)
|
||||
return (EINVAL);
|
||||
}
|
||||
|
||||
if (requested < 0x1 || requested > 0x7) {
|
||||
if (advertise < 0x1 || advertise > 0x7) {
|
||||
device_printf(dev,
|
||||
"Invalid advertised speed; valid modes are 0x1 through 0x7\n");
|
||||
return (EINVAL);
|
||||
}
|
||||
|
||||
if ((requested & 0x1)
|
||||
if ((advertise & 0x1)
|
||||
&& (hw->mac.type != ixgbe_mac_X540)
|
||||
&& (hw->mac.type != ixgbe_mac_X550)) {
|
||||
device_printf(dev, "Set Advertise: 100Mb on X540/X550 only\n");
|
||||
@ -4741,18 +4776,19 @@ ixgbe_set_advertise(SYSCTL_HANDLER_ARGS)
|
||||
}
|
||||
|
||||
/* Set new value and report new advertised mode */
|
||||
if (requested & 0x1)
|
||||
speed = 0;
|
||||
if (advertise & 0x1)
|
||||
speed |= IXGBE_LINK_SPEED_100_FULL;
|
||||
if (requested & 0x2)
|
||||
if (advertise & 0x2)
|
||||
speed |= IXGBE_LINK_SPEED_1GB_FULL;
|
||||
if (requested & 0x4)
|
||||
if (advertise & 0x4)
|
||||
speed |= IXGBE_LINK_SPEED_10GB_FULL;
|
||||
adapter->advertise = advertise;
|
||||
|
||||
hw->mac.autotry_restart = TRUE;
|
||||
hw->mac.ops.setup_link(hw, speed, TRUE);
|
||||
adapter->advertise = requested;
|
||||
|
||||
return (error);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -497,6 +497,7 @@ struct adapter {
|
||||
u32 optics;
|
||||
u32 fc; /* local flow ctrl setting */
|
||||
int advertise; /* link speeds */
|
||||
bool enable_aim; /* adaptive interrupt moderation */
|
||||
bool link_active;
|
||||
u16 max_frame_size;
|
||||
u16 num_segs;
|
||||
|
Loading…
Reference in New Issue
Block a user