svn commit: r305713 - in head/sys/dev/cxgbe: . common firmware
Navdeep Parhar
np at FreeBSD.org
Sun Sep 11 23:08:59 UTC 2016
Author: np
Date: Sun Sep 11 23:08:57 2016
New Revision: 305713
URL: https://svnweb.freebsd.org/changeset/base/305713
Log:
cxgbe(4): Add support for additional port types and link speeds.
Sponsored by: Chelsio Communications.
Modified:
head/sys/dev/cxgbe/adapter.h
head/sys/dev/cxgbe/common/t4_hw.c
head/sys/dev/cxgbe/firmware/t4fw_interface.h
head/sys/dev/cxgbe/t4_main.c
Modified: head/sys/dev/cxgbe/adapter.h
==============================================================================
--- head/sys/dev/cxgbe/adapter.h Sun Sep 11 22:13:22 2016 (r305712)
+++ head/sys/dev/cxgbe/adapter.h Sun Sep 11 23:08:57 2016 (r305713)
@@ -1040,12 +1040,26 @@ is_10G_port(const struct port_info *pi)
}
static inline bool
+is_25G_port(const struct port_info *pi)
+{
+
+ return ((pi->link_cfg.supported & FW_PORT_CAP_SPEED_25G) != 0);
+}
+
+static inline bool
is_40G_port(const struct port_info *pi)
{
return ((pi->link_cfg.supported & FW_PORT_CAP_SPEED_40G) != 0);
}
+static inline bool
+is_100G_port(const struct port_info *pi)
+{
+
+ return ((pi->link_cfg.supported & FW_PORT_CAP_SPEED_100G) != 0);
+}
+
static inline int
port_top_speed(const struct port_info *pi)
{
@@ -1054,6 +1068,8 @@ port_top_speed(const struct port_info *p
return (100);
if (pi->link_cfg.supported & FW_PORT_CAP_SPEED_40G)
return (40);
+ if (pi->link_cfg.supported & FW_PORT_CAP_SPEED_25G)
+ return (25);
if (pi->link_cfg.supported & FW_PORT_CAP_SPEED_10G)
return (10);
if (pi->link_cfg.supported & FW_PORT_CAP_SPEED_1G)
Modified: head/sys/dev/cxgbe/common/t4_hw.c
==============================================================================
--- head/sys/dev/cxgbe/common/t4_hw.c Sun Sep 11 22:13:22 2016 (r305712)
+++ head/sys/dev/cxgbe/common/t4_hw.c Sun Sep 11 23:08:57 2016 (r305713)
@@ -3669,8 +3669,9 @@ void t4_ulprx_read_la(struct adapter *ad
}
#define ADVERT_MASK (FW_PORT_CAP_SPEED_100M | FW_PORT_CAP_SPEED_1G |\
- FW_PORT_CAP_SPEED_10G | FW_PORT_CAP_SPEED_40G | \
- FW_PORT_CAP_SPEED_100G | FW_PORT_CAP_ANEG)
+ FW_PORT_CAP_SPEED_10G | FW_PORT_CAP_SPEED_25G | \
+ FW_PORT_CAP_SPEED_40G | FW_PORT_CAP_SPEED_100G | \
+ FW_PORT_CAP_ANEG)
/**
* t4_link_l1cfg - apply link configuration to MAC/PHY
@@ -5775,6 +5776,11 @@ const char *t4_get_port_type_description
"QSA",
"QSFP",
"BP40_BA",
+ "KR4_100G",
+ "CR4_QSFP",
+ "CR_QSFP",
+ "CR2_QSFP",
+ "SFP28",
};
if (port_type < ARRAY_SIZE(port_type_description))
@@ -7462,8 +7468,12 @@ int t4_handle_fw_rpl(struct adapter *ada
speed = 1000;
else if (stat & V_FW_PORT_CMD_LSPEED(FW_PORT_CAP_SPEED_10G))
speed = 10000;
+ else if (stat & V_FW_PORT_CMD_LSPEED(FW_PORT_CAP_SPEED_25G))
+ speed = 25000;
else if (stat & V_FW_PORT_CMD_LSPEED(FW_PORT_CAP_SPEED_40G))
speed = 40000;
+ else if (stat & V_FW_PORT_CMD_LSPEED(FW_PORT_CAP_SPEED_100G))
+ speed = 100000;
for_each_port(adap, i) {
pi = adap2pinfo(adap, i);
Modified: head/sys/dev/cxgbe/firmware/t4fw_interface.h
==============================================================================
--- head/sys/dev/cxgbe/firmware/t4fw_interface.h Sun Sep 11 22:13:22 2016 (r305712)
+++ head/sys/dev/cxgbe/firmware/t4fw_interface.h Sun Sep 11 23:08:57 2016 (r305713)
@@ -6305,7 +6305,7 @@ struct fw_acl_vlan_cmd {
enum fw_port_cap {
FW_PORT_CAP_SPEED_100M = 0x0001,
FW_PORT_CAP_SPEED_1G = 0x0002,
- FW_PORT_CAP_SPEED_2_5G = 0x0004,
+ FW_PORT_CAP_SPEED_25G = 0x0004,
FW_PORT_CAP_SPEED_10G = 0x0008,
FW_PORT_CAP_SPEED_40G = 0x0010,
FW_PORT_CAP_SPEED_100G = 0x0020,
@@ -6776,6 +6776,11 @@ enum fw_port_type {
FW_PORT_TYPE_QSA = 13, /* No, 1, Yes, No, No, No, 10G */
FW_PORT_TYPE_QSFP = 14, /* No, 4, Yes, No, No, No, 40G */
FW_PORT_TYPE_BP40_BA = 15, /* No, 4, No, No, Yes, Yes, 40G/10G/1G, BP ANGE */
+ FW_PORT_TYPE_KR4_100G = 16, /* No, 4, 100G */
+ FW_PORT_TYPE_CR4_QSFP = 17, /* No, 4, 100G */
+ FW_PORT_TYPE_CR_QSFP = 18, /* No, 1, 25G */
+ FW_PORT_TYPE_CR2_QSFP = 19, /* No, 2, 50G */
+ FW_PORT_TYPE_SFP28 = 20, /* No, 1, 25G */
FW_PORT_TYPE_NONE = M_FW_PORT_CMD_PTYPE
};
Modified: head/sys/dev/cxgbe/t4_main.c
==============================================================================
--- head/sys/dev/cxgbe/t4_main.c Sun Sep 11 22:13:22 2016 (r305712)
+++ head/sys/dev/cxgbe/t4_main.c Sun Sep 11 23:08:57 2016 (r305713)
@@ -3460,6 +3460,38 @@ build_medialist(struct port_info *pi, st
}
break;
+ case FW_PORT_TYPE_CR_QSFP:
+ case FW_PORT_TYPE_SFP28:
+ switch (pi->mod_type) {
+
+ case FW_PORT_MOD_TYPE_SR:
+ MPASS(pi->port_type == FW_PORT_TYPE_SFP28);
+ ifmedia_add(media, m | IFM_25G_SR, 0, NULL);
+ ifmedia_set(media, m | IFM_25G_SR);
+ break;
+
+ case FW_PORT_MOD_TYPE_TWINAX_PASSIVE:
+ case FW_PORT_MOD_TYPE_TWINAX_ACTIVE:
+ ifmedia_add(media, m | IFM_25G_CR, 0, NULL);
+ ifmedia_set(media, m | IFM_25G_CR);
+ break;
+
+ case FW_PORT_MOD_TYPE_NONE:
+ m &= ~IFM_FDX;
+ ifmedia_add(media, m | IFM_NONE, 0, NULL);
+ ifmedia_set(media, m | IFM_NONE);
+ break;
+
+ default:
+ device_printf(pi->dev,
+ "unknown port_type (%d), mod_type (%d)\n",
+ pi->port_type, pi->mod_type);
+ ifmedia_add(media, m | IFM_UNKNOWN, 0, NULL);
+ ifmedia_set(media, m | IFM_UNKNOWN);
+ break;
+ }
+ break;
+
case FW_PORT_TYPE_QSFP:
switch (pi->mod_type) {
@@ -3495,6 +3527,67 @@ build_medialist(struct port_info *pi, st
}
break;
+ case FW_PORT_TYPE_CR2_QSFP:
+ switch (pi->mod_type) {
+
+ case FW_PORT_MOD_TYPE_TWINAX_PASSIVE:
+ case FW_PORT_MOD_TYPE_TWINAX_ACTIVE:
+ ifmedia_add(media, m | IFM_50G_CR2, 0, NULL);
+ ifmedia_set(media, m | IFM_50G_CR2);
+ break;
+
+ case FW_PORT_MOD_TYPE_NONE:
+ m &= ~IFM_FDX;
+ ifmedia_add(media, m | IFM_NONE, 0, NULL);
+ ifmedia_set(media, m | IFM_NONE);
+ break;
+
+ default:
+ device_printf(pi->dev,
+ "unknown port_type (%d), mod_type (%d)\n",
+ pi->port_type, pi->mod_type);
+ ifmedia_add(media, m | IFM_UNKNOWN, 0, NULL);
+ ifmedia_set(media, m | IFM_UNKNOWN);
+ break;
+ }
+ break;
+
+ case FW_PORT_TYPE_KR4_100G:
+ case FW_PORT_TYPE_CR4_QSFP:
+ switch (pi->mod_type) {
+
+ case FW_PORT_MOD_TYPE_LR:
+ ifmedia_add(media, m | IFM_100G_LR4, 0, NULL);
+ ifmedia_set(media, m | IFM_100G_LR4);
+ break;
+
+ case FW_PORT_MOD_TYPE_SR:
+ ifmedia_add(media, m | IFM_100G_SR4, 0, NULL);
+ ifmedia_set(media, m | IFM_100G_SR4);
+ break;
+
+ case FW_PORT_MOD_TYPE_TWINAX_PASSIVE:
+ case FW_PORT_MOD_TYPE_TWINAX_ACTIVE:
+ ifmedia_add(media, m | IFM_100G_CR4, 0, NULL);
+ ifmedia_set(media, m | IFM_100G_CR4);
+ break;
+
+ case FW_PORT_MOD_TYPE_NONE:
+ m &= ~IFM_FDX;
+ ifmedia_add(media, m | IFM_NONE, 0, NULL);
+ ifmedia_set(media, m | IFM_NONE);
+ break;
+
+ default:
+ device_printf(pi->dev,
+ "unknown port_type (%d), mod_type (%d)\n",
+ pi->port_type, pi->mod_type);
+ ifmedia_add(media, m | IFM_UNKNOWN, 0, NULL);
+ ifmedia_set(media, m | IFM_UNKNOWN);
+ break;
+ }
+ break;
+
default:
device_printf(pi->dev,
"unknown port_type (%d), mod_type (%d)\n", pi->port_type,
More information about the svn-src-all
mailing list