Print this page
6064 ixgbe needs X550 support
*** 295,311 ****
--- 295,322 ----
int err = 0;
uint32_t flow_control;
uint32_t cur_mtu, new_mtu;
uint32_t rx_size;
uint32_t tx_size;
+ ixgbe_link_speed speeds = 0;
mutex_enter(&ixgbe->gen_lock);
if (ixgbe->ixgbe_state & IXGBE_SUSPENDED) {
mutex_exit(&ixgbe->gen_lock);
return (ECANCELED);
}
+ /*
+ * We cannot always rely on the common code maintaining
+ * hw->phy.speeds_supported, therefore we fall back to use the recorded
+ * supported speeds which were obtained during instance init in
+ * ixgbe_init_params().
+ */
+ speeds = hw->phy.speeds_supported;
+ if (speeds == 0)
+ speeds = ixgbe->speeds_supported;
+
if (ixgbe->loopback_mode != IXGBE_LB_NONE &&
ixgbe_param_locked(pr_num)) {
/*
* All en_* parameters are locked (read-only)
* while the device is in any sort of loopback mode.
*** 312,354 ****
*/
mutex_exit(&ixgbe->gen_lock);
return (EBUSY);
}
switch (pr_num) {
case MAC_PROP_EN_10GFDX_CAP:
! /* read/write on copper, read-only on serdes */
! if (ixgbe->hw.phy.media_type != ixgbe_media_type_copper) {
! err = ENOTSUP;
! break;
! } else {
ixgbe->param_en_10000fdx_cap = *(uint8_t *)pr_val;
- ixgbe->param_adv_10000fdx_cap = *(uint8_t *)pr_val;
goto setup_link;
}
! case MAC_PROP_EN_1000FDX_CAP:
! /* read/write on copper, read-only on serdes */
! if (ixgbe->hw.phy.media_type != ixgbe_media_type_copper) {
err = ENOTSUP;
break;
} else {
ixgbe->param_en_1000fdx_cap = *(uint8_t *)pr_val;
- ixgbe->param_adv_1000fdx_cap = *(uint8_t *)pr_val;
goto setup_link;
! }
! case MAC_PROP_EN_100FDX_CAP:
! /* read/write on copper, read-only on serdes */
! if (ixgbe->hw.phy.media_type != ixgbe_media_type_copper) {
err = ENOTSUP;
break;
! } else {
ixgbe->param_en_100fdx_cap = *(uint8_t *)pr_val;
- ixgbe->param_adv_100fdx_cap = *(uint8_t *)pr_val;
goto setup_link;
}
case MAC_PROP_AUTONEG:
- /* read/write on copper, read-only on serdes */
if (ixgbe->hw.phy.media_type != ixgbe_media_type_copper) {
err = ENOTSUP;
break;
} else {
ixgbe->param_adv_autoneg_cap = *(uint8_t *)pr_val;
--- 323,383 ----
*/
mutex_exit(&ixgbe->gen_lock);
return (EBUSY);
}
+ /*
+ * We allow speed changes only on baseT PHYs. MAC_PROP_EN_* are marked
+ * read-only on non-baseT PHYs.
+ */
switch (pr_num) {
case MAC_PROP_EN_10GFDX_CAP:
! if (hw->phy.media_type == ixgbe_media_type_copper &&
! speeds & IXGBE_LINK_SPEED_10GB_FULL) {
ixgbe->param_en_10000fdx_cap = *(uint8_t *)pr_val;
goto setup_link;
+ } else {
+ err = ENOTSUP;
+ break;
}
! case MAC_PROP_EN_5000FDX_CAP:
! if (hw->phy.media_type == ixgbe_media_type_copper &&
! speeds & IXGBE_LINK_SPEED_5GB_FULL) {
! ixgbe->param_en_5000fdx_cap = *(uint8_t *)pr_val;
! goto setup_link;
! } else {
err = ENOTSUP;
break;
+ }
+ case MAC_PROP_EN_2500FDX_CAP:
+ if (hw->phy.media_type == ixgbe_media_type_copper &&
+ speeds & IXGBE_LINK_SPEED_2_5GB_FULL) {
+ ixgbe->param_en_2500fdx_cap = *(uint8_t *)pr_val;
+ goto setup_link;
} else {
+ err = ENOTSUP;
+ break;
+ }
+ case MAC_PROP_EN_1000FDX_CAP:
+ if (hw->phy.media_type == ixgbe_media_type_copper &&
+ speeds & IXGBE_LINK_SPEED_1GB_FULL) {
ixgbe->param_en_1000fdx_cap = *(uint8_t *)pr_val;
goto setup_link;
! } else {
err = ENOTSUP;
break;
! }
! case MAC_PROP_EN_100FDX_CAP:
! if (hw->phy.media_type == ixgbe_media_type_copper &&
! speeds & IXGBE_LINK_SPEED_100_FULL) {
ixgbe->param_en_100fdx_cap = *(uint8_t *)pr_val;
goto setup_link;
+ } else {
+ err = ENOTSUP;
+ break;
}
case MAC_PROP_AUTONEG:
if (ixgbe->hw.phy.media_type != ixgbe_media_type_copper) {
err = ENOTSUP;
break;
} else {
ixgbe->param_adv_autoneg_cap = *(uint8_t *)pr_val;
*** 380,389 ****
--- 409,420 ----
IXGBE_SUCCESS)
err = EINVAL;
}
break;
case MAC_PROP_ADV_10GFDX_CAP:
+ case MAC_PROP_ADV_5000FDX_CAP:
+ case MAC_PROP_ADV_2500FDX_CAP:
case MAC_PROP_ADV_1000FDX_CAP:
case MAC_PROP_ADV_100FDX_CAP:
case MAC_PROP_STATUS:
case MAC_PROP_SPEED:
case MAC_PROP_DUPLEX:
*** 446,456 ****
--- 477,498 ----
ixgbe_t *ixgbe = (ixgbe_t *)arg;
struct ixgbe_hw *hw = &ixgbe->hw;
int err = 0;
uint32_t flow_control;
uint64_t tmp = 0;
+ ixgbe_link_speed speeds = 0;
+ /*
+ * We cannot always rely on the common code maintaining
+ * hw->phy.speeds_supported, therefore we fall back to use the recorded
+ * supported speeds which were obtained during instance init in
+ * ixgbe_init_params().
+ */
+ speeds = hw->phy.speeds_supported;
+ if (speeds == 0)
+ speeds = ixgbe->speeds_supported;
+
switch (pr_num) {
case MAC_PROP_DUPLEX:
ASSERT(pr_valsize >= sizeof (link_duplex_t));
bcopy(&ixgbe->link_duplex, pr_val,
sizeof (link_duplex_t));
*** 481,506 ****
--- 523,590 ----
break;
}
bcopy(&flow_control, pr_val, sizeof (flow_control));
break;
case MAC_PROP_ADV_10GFDX_CAP:
+ if (speeds & IXGBE_LINK_SPEED_10GB_FULL)
*(uint8_t *)pr_val = ixgbe->param_adv_10000fdx_cap;
+ else
+ err = ENOTSUP;
break;
case MAC_PROP_EN_10GFDX_CAP:
+ if (speeds & IXGBE_LINK_SPEED_10GB_FULL)
*(uint8_t *)pr_val = ixgbe->param_en_10000fdx_cap;
+ else
+ err = ENOTSUP;
break;
+ case MAC_PROP_ADV_5000FDX_CAP:
+ if (speeds & IXGBE_LINK_SPEED_5GB_FULL)
+ *(uint8_t *)pr_val = ixgbe->param_adv_5000fdx_cap;
+ else
+ err = ENOTSUP;
+ break;
+ case MAC_PROP_EN_5000FDX_CAP:
+ if (speeds & IXGBE_LINK_SPEED_5GB_FULL)
+ *(uint8_t *)pr_val = ixgbe->param_en_5000fdx_cap;
+ else
+ err = ENOTSUP;
+ break;
+ case MAC_PROP_ADV_2500FDX_CAP:
+ if (speeds & IXGBE_LINK_SPEED_2_5GB_FULL)
+ *(uint8_t *)pr_val = ixgbe->param_adv_2500fdx_cap;
+ else
+ err = ENOTSUP;
+ break;
+ case MAC_PROP_EN_2500FDX_CAP:
+ if (speeds & IXGBE_LINK_SPEED_2_5GB_FULL)
+ *(uint8_t *)pr_val = ixgbe->param_en_2500fdx_cap;
+ else
+ err = ENOTSUP;
+ break;
case MAC_PROP_ADV_1000FDX_CAP:
+ if (speeds & IXGBE_LINK_SPEED_1GB_FULL)
*(uint8_t *)pr_val = ixgbe->param_adv_1000fdx_cap;
+ else
+ err = ENOTSUP;
break;
case MAC_PROP_EN_1000FDX_CAP:
+ if (speeds & IXGBE_LINK_SPEED_1GB_FULL)
*(uint8_t *)pr_val = ixgbe->param_en_1000fdx_cap;
+ else
+ err = ENOTSUP;
break;
case MAC_PROP_ADV_100FDX_CAP:
+ if (speeds & IXGBE_LINK_SPEED_100_FULL)
*(uint8_t *)pr_val = ixgbe->param_adv_100fdx_cap;
+ else
+ err = ENOTSUP;
break;
case MAC_PROP_EN_100FDX_CAP:
+ if (speeds & IXGBE_LINK_SPEED_100_FULL)
*(uint8_t *)pr_val = ixgbe->param_en_100fdx_cap;
+ else
+ err = ENOTSUP;
break;
case MAC_PROP_PRIVATE:
err = ixgbe_get_priv_prop(ixgbe, pr_name,
pr_valsize, pr_val);
break;
*** 514,546 ****
void
ixgbe_m_propinfo(void *arg, const char *pr_name, mac_prop_id_t pr_num,
mac_prop_info_handle_t prh)
{
ixgbe_t *ixgbe = (ixgbe_t *)arg;
uint_t perm;
switch (pr_num) {
case MAC_PROP_DUPLEX:
case MAC_PROP_SPEED:
mac_prop_info_set_perm(prh, MAC_PROP_PERM_READ);
break;
case MAC_PROP_ADV_100FDX_CAP:
case MAC_PROP_ADV_1000FDX_CAP:
case MAC_PROP_ADV_10GFDX_CAP:
mac_prop_info_set_perm(prh, MAC_PROP_PERM_READ);
! mac_prop_info_set_default_uint8(prh, 1);
break;
case MAC_PROP_AUTONEG:
case MAC_PROP_EN_10GFDX_CAP:
case MAC_PROP_EN_1000FDX_CAP:
case MAC_PROP_EN_100FDX_CAP:
! perm = (ixgbe->hw.phy.media_type == ixgbe_media_type_copper) ?
MAC_PROP_PERM_RW : MAC_PROP_PERM_READ;
mac_prop_info_set_perm(prh, perm);
mac_prop_info_set_default_uint8(prh, 1);
break;
case MAC_PROP_FLOWCTRL:
mac_prop_info_set_default_link_flowctrl(prh,
LINK_FLOWCTRL_NONE);
--- 598,712 ----
void
ixgbe_m_propinfo(void *arg, const char *pr_name, mac_prop_id_t pr_num,
mac_prop_info_handle_t prh)
{
ixgbe_t *ixgbe = (ixgbe_t *)arg;
+ struct ixgbe_hw *hw = &ixgbe->hw;
uint_t perm;
+ uint8_t value;
+ ixgbe_link_speed speeds = 0;
+ /*
+ * We cannot always rely on the common code maintaining
+ * hw->phy.speeds_supported, therefore we fall back to use the
+ * recorded supported speeds which were obtained during instance init in
+ * ixgbe_init_params().
+ */
+ speeds = hw->phy.speeds_supported;
+ if (speeds == 0)
+ speeds = ixgbe->speeds_supported;
+
switch (pr_num) {
case MAC_PROP_DUPLEX:
case MAC_PROP_SPEED:
mac_prop_info_set_perm(prh, MAC_PROP_PERM_READ);
break;
case MAC_PROP_ADV_100FDX_CAP:
+ mac_prop_info_set_perm(prh, MAC_PROP_PERM_READ);
+ value = (speeds & IXGBE_LINK_SPEED_100_FULL) ? 1 : 0;
+ mac_prop_info_set_default_uint8(prh, value);
+ break;
+
case MAC_PROP_ADV_1000FDX_CAP:
+ mac_prop_info_set_perm(prh, MAC_PROP_PERM_READ);
+ value = (speeds & IXGBE_LINK_SPEED_1GB_FULL) ? 1 : 0;
+ mac_prop_info_set_default_uint8(prh, value);
+ break;
+
+ case MAC_PROP_ADV_2500FDX_CAP:
+ mac_prop_info_set_perm(prh, MAC_PROP_PERM_READ);
+ value = (speeds & IXGBE_LINK_SPEED_2_5GB_FULL) ? 1 : 0;
+ mac_prop_info_set_default_uint8(prh, value);
+ break;
+
+ case MAC_PROP_ADV_5000FDX_CAP:
+ mac_prop_info_set_perm(prh, MAC_PROP_PERM_READ);
+ value = (speeds & IXGBE_LINK_SPEED_5GB_FULL) ? 1 : 0;
+ mac_prop_info_set_default_uint8(prh, value);
+ break;
+
case MAC_PROP_ADV_10GFDX_CAP:
mac_prop_info_set_perm(prh, MAC_PROP_PERM_READ);
! value = (speeds & IXGBE_LINK_SPEED_10GB_FULL) ? 1 : 0;
! mac_prop_info_set_default_uint8(prh, value);
break;
+ /*
+ * We allow speed changes only on baseT PHYs. MAC_PROP_EN_* are marked
+ * read-only on non-baseT (SFP) PHYs.
+ */
case MAC_PROP_AUTONEG:
+ perm = (hw->phy.media_type == ixgbe_media_type_copper) ?
+ MAC_PROP_PERM_RW : MAC_PROP_PERM_READ;
+ mac_prop_info_set_perm(prh, perm);
+ mac_prop_info_set_default_uint8(prh, 1);
+ break;
+
case MAC_PROP_EN_10GFDX_CAP:
+ if (speeds & IXGBE_LINK_SPEED_10GB_FULL) {
+ perm = (hw->phy.media_type == ixgbe_media_type_copper) ?
+ MAC_PROP_PERM_RW : MAC_PROP_PERM_READ;
+ mac_prop_info_set_perm(prh, perm);
+ mac_prop_info_set_default_uint8(prh, 1);
+ }
+ break;
+
+ case MAC_PROP_EN_5000FDX_CAP:
+ if (speeds & IXGBE_LINK_SPEED_5GB_FULL) {
+ perm = (hw->phy.media_type == ixgbe_media_type_copper) ?
+ MAC_PROP_PERM_RW : MAC_PROP_PERM_READ;
+ mac_prop_info_set_perm(prh, perm);
+ mac_prop_info_set_default_uint8(prh, 1);
+ }
+ break;
+
+ case MAC_PROP_EN_2500FDX_CAP:
+ if (speeds & IXGBE_LINK_SPEED_2_5GB_FULL) {
+ perm = (hw->phy.media_type == ixgbe_media_type_copper) ?
+ MAC_PROP_PERM_RW : MAC_PROP_PERM_READ;
+ mac_prop_info_set_perm(prh, perm);
+ mac_prop_info_set_default_uint8(prh, 1);
+ }
+ break;
+
case MAC_PROP_EN_1000FDX_CAP:
+ if (speeds & IXGBE_LINK_SPEED_1GB_FULL) {
+ perm = (hw->phy.media_type == ixgbe_media_type_copper) ?
+ MAC_PROP_PERM_RW : MAC_PROP_PERM_READ;
+ mac_prop_info_set_perm(prh, perm);
+ mac_prop_info_set_default_uint8(prh, 1);
+ }
+ break;
+
case MAC_PROP_EN_100FDX_CAP:
! if (speeds & IXGBE_LINK_SPEED_100_FULL) {
! perm = (hw->phy.media_type == ixgbe_media_type_copper) ?
MAC_PROP_PERM_RW : MAC_PROP_PERM_READ;
mac_prop_info_set_perm(prh, perm);
mac_prop_info_set_default_uint8(prh, 1);
+ }
break;
case MAC_PROP_FLOWCTRL:
mac_prop_info_set_default_link_flowctrl(prh,
LINK_FLOWCTRL_NONE);
*** 593,602 ****
--- 759,770 ----
* All en_* parameters are locked (read-only) while
* the device is in any sort of loopback mode ...
*/
switch (pr_num) {
case MAC_PROP_EN_10GFDX_CAP:
+ case MAC_PROP_EN_5000FDX_CAP:
+ case MAC_PROP_EN_2500FDX_CAP:
case MAC_PROP_EN_1000FDX_CAP:
case MAC_PROP_EN_100FDX_CAP:
case MAC_PROP_AUTONEG:
case MAC_PROP_FLOWCTRL:
return (B_TRUE);
*** 710,725 ****
err = EINVAL;
else {
ixgbe->intr_throttling[0] = (uint32_t)result;
/*
! * 82599 and X540 require the interrupt throttling
* rate is a multiple of 8. This is enforced by the
* register definiton.
*/
if (hw->mac.type == ixgbe_mac_82599EB ||
! hw->mac.type == ixgbe_mac_X540) {
ixgbe->intr_throttling[0] =
ixgbe->intr_throttling[0] & 0xFF8;
}
for (i = 0; i < MAX_INTR_VECTOR; i++)
--- 878,895 ----
err = EINVAL;
else {
ixgbe->intr_throttling[0] = (uint32_t)result;
/*
! * 82599, X540 and X550 require the interrupt throttling
* rate is a multiple of 8. This is enforced by the
* register definiton.
*/
if (hw->mac.type == ixgbe_mac_82599EB ||
! hw->mac.type == ixgbe_mac_X540 ||
! hw->mac.type == ixgbe_mac_X550 ||
! hw->mac.type == ixgbe_mac_X550EM_x) {
ixgbe->intr_throttling[0] =
ixgbe->intr_throttling[0] & 0xFF8;
}
for (i = 0; i < MAX_INTR_VECTOR; i++)