Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F170635378
D54523.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
6 KB
Referenced Files
None
Subscribers
None
D54523.diff
View Options
diff --git a/sys/dev/bnxt/bnxt_en/bnxt.h b/sys/dev/bnxt/bnxt_en/bnxt.h
--- a/sys/dev/bnxt/bnxt_en/bnxt.h
+++ b/sys/dev/bnxt/bnxt_en/bnxt.h
@@ -455,6 +455,7 @@
uint16_t req_link_speed;
uint8_t module_status;
struct hwrm_port_phy_qcfg_output phy_qcfg_resp;
+ uint8_t active_lanes;
};
enum bnxt_phy_type {
@@ -1269,6 +1270,7 @@
#define BNXT_PHY_FL_NO_PAUSE (HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS2_PAUSE_UNSUPPORTED << 8)
#define BNXT_PHY_FL_NO_PFC (HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS2_PFC_UNSUPPORTED << 8)
#define BNXT_PHY_FL_BANK_SEL (HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS2_BANK_ADDR_SUPPORTED << 8)
+#define BNXT_PHY_FL_SPEEDS2 (HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS2_SPEEDS2_SUPPORTED << 8)
struct bnxt_aux_dev *aux_dev;
struct net_device *net_dev;
struct mtx en_ops_lock;
diff --git a/sys/dev/bnxt/bnxt_en/bnxt_hwrm.c b/sys/dev/bnxt/bnxt_en/bnxt_hwrm.c
--- a/sys/dev/bnxt/bnxt_en/bnxt_hwrm.c
+++ b/sys/dev/bnxt/bnxt_en/bnxt_hwrm.c
@@ -2917,10 +2917,14 @@
}
link_info->duplex_setting = resp->duplex_cfg;
- if (link_info->phy_link_status == HWRM_PORT_PHY_QCFG_OUTPUT_LINK_LINK)
+ if (link_info->phy_link_status == HWRM_PORT_PHY_QCFG_OUTPUT_LINK_LINK) {
link_info->link_speed = le16toh(resp->link_speed);
- else
+ if (softc->phy_flags & BNXT_PHY_FL_SPEEDS2)
+ link_info->active_lanes = resp->active_lanes;
+ } else {
link_info->link_speed = 0;
+ link_info->active_lanes = 0;
+ }
link_info->force_link_speed = le16toh(resp->force_link_speed);
link_info->auto_link_speeds = le16toh(resp->auto_link_speed);
link_info->support_speeds = le16toh(resp->support_speeds);
diff --git a/sys/dev/bnxt/bnxt_en/bnxt_ulp.h b/sys/dev/bnxt/bnxt_en/bnxt_ulp.h
--- a/sys/dev/bnxt/bnxt_en/bnxt_ulp.h
+++ b/sys/dev/bnxt/bnxt_en/bnxt_ulp.h
@@ -126,6 +126,7 @@
struct bnxt_dbr *en_dbr;
struct bnxt_bar_info hwrm_bar;
u32 espeed;
+ uint8_t lanes;
};
struct bnxt_en_ops {
diff --git a/sys/dev/bnxt/bnxt_en/if_bnxt.c b/sys/dev/bnxt/bnxt_en/if_bnxt.c
--- a/sys/dev/bnxt/bnxt_en/if_bnxt.c
+++ b/sys/dev/bnxt/bnxt_en/if_bnxt.c
@@ -4794,9 +4794,11 @@
const char *duplex = NULL, *flow_ctrl = NULL;
const char *signal_mode = "";
- if(softc->edev)
+ if(softc->edev) {
softc->edev->espeed =
bnxt_fw_to_ethtool_speed(link_info->link_speed);
+ softc->edev->lanes = link_info->active_lanes;
+ }
if (link_info->link_up == link_info->last_link_up) {
if (!link_info->link_up)
diff --git a/sys/dev/bnxt/bnxt_re/bnxt_re.h b/sys/dev/bnxt/bnxt_re/bnxt_re.h
--- a/sys/dev/bnxt/bnxt_re/bnxt_re.h
+++ b/sys/dev/bnxt/bnxt_re/bnxt_re.h
@@ -535,6 +535,7 @@
bool is_virtfn;
u32 num_vfs;
u32 espeed;
+ u8 lanes;
/*
* For storing the speed of slave interfaces.
* Same as espeed when bond is not configured
diff --git a/sys/dev/bnxt/bnxt_re/ib_verbs.h b/sys/dev/bnxt/bnxt_re/ib_verbs.h
--- a/sys/dev/bnxt/bnxt_re/ib_verbs.h
+++ b/sys/dev/bnxt/bnxt_re/ib_verbs.h
@@ -49,10 +49,22 @@
#define SPEED_1000 1000
#endif
+#ifndef SPEED_2500
+#define SPEED_2500 2500
+#endif
+
+#ifndef SPEED_5000
+#define SPEED_5000 5000
+#endif
+
#ifndef SPEED_10000
#define SPEED_10000 10000
#endif
+#ifndef SPEED_14000
+#define SPEED_14000 14000
+#endif
+
#ifndef SPEED_20000
#define SPEED_20000 20000
#endif
diff --git a/sys/dev/bnxt/bnxt_re/ib_verbs.c b/sys/dev/bnxt/bnxt_re/ib_verbs.c
--- a/sys/dev/bnxt/bnxt_re/ib_verbs.c
+++ b/sys/dev/bnxt/bnxt_re/ib_verbs.c
@@ -241,50 +241,99 @@
return 0;
}
-static void __to_ib_speed_width(u32 espeed, u8 *speed, u8 *width)
+static void __to_ib_speed_width(u32 espeed, u8 lanes, u8 *speed, u8 *width)
{
- switch (espeed) {
- case SPEED_1000:
- *speed = IB_SPEED_SDR;
+ if (!lanes) {
+ switch (espeed) {
+ case SPEED_1000:
+ *speed = IB_SPEED_SDR;
+ *width = IB_WIDTH_1X;
+ break;
+ case SPEED_10000:
+ *speed = IB_SPEED_QDR;
+ *width = IB_WIDTH_1X;
+ break;
+ case SPEED_20000:
+ *speed = IB_SPEED_DDR;
+ *width = IB_WIDTH_4X;
+ break;
+ case SPEED_25000:
+ *speed = IB_SPEED_EDR;
+ *width = IB_WIDTH_1X;
+ break;
+ case SPEED_40000:
+ *speed = IB_SPEED_QDR;
+ *width = IB_WIDTH_4X;
+ break;
+ case SPEED_50000:
+ *speed = IB_SPEED_EDR;
+ *width = IB_WIDTH_2X;
+ break;
+ case SPEED_100000:
+ *speed = IB_SPEED_EDR;
+ *width = IB_WIDTH_4X;
+ break;
+ case SPEED_200000:
+ *speed = IB_SPEED_HDR;
+ *width = IB_WIDTH_4X;
+ break;
+ case SPEED_400000:
+ *speed = IB_SPEED_NDR;
+ *width = IB_WIDTH_4X;
+ break;
+ default:
+ *speed = IB_SPEED_SDR;
+ *width = IB_WIDTH_1X;
+ break;
+ }
+ return;
+ }
+
+ switch (lanes) {
+ case 1:
*width = IB_WIDTH_1X;
break;
- case SPEED_10000:
- *speed = IB_SPEED_QDR;
- *width = IB_WIDTH_1X;
+ case 2:
+ *width = IB_WIDTH_2X;
break;
- case SPEED_20000:
- *speed = IB_SPEED_DDR;
+ case 4:
*width = IB_WIDTH_4X;
break;
- case SPEED_25000:
- *speed = IB_SPEED_EDR;
+ case 8:
+ *width = IB_WIDTH_8X;
+ break;
+ case 12:
+ *width = IB_WIDTH_12X;
+ break;
+ default:
*width = IB_WIDTH_1X;
+ }
+
+ switch (espeed / lanes) {
+ case SPEED_2500:
+ *speed = IB_SPEED_SDR;
break;
- case SPEED_40000:
- *speed = IB_SPEED_QDR;
- *width = IB_WIDTH_4X;
+ case SPEED_5000:
+ *speed = IB_SPEED_DDR;
break;
- case SPEED_50000:
- *speed = IB_SPEED_EDR;
- *width = IB_WIDTH_2X;
+ case SPEED_10000:
+ *speed = IB_SPEED_FDR10;
break;
- case SPEED_100000:
+ case SPEED_14000:
+ *speed = IB_SPEED_FDR;
+ break;
+ case SPEED_25000:
*speed = IB_SPEED_EDR;
- *width = IB_WIDTH_4X;
break;
- case SPEED_200000:
+ case SPEED_50000:
*speed = IB_SPEED_HDR;
- *width = IB_WIDTH_4X;
break;
- case SPEED_400000:
+ case SPEED_100000:
*speed = IB_SPEED_NDR;
- *width = IB_WIDTH_4X;
break;
default:
*speed = IB_SPEED_SDR;
- *width = IB_WIDTH_1X;
- break;
- }
+ }
}
/* Port */
@@ -322,9 +371,10 @@
port_attr->subnet_timeout = 0;
port_attr->init_type_reply = 0;
rdev->espeed = rdev->en_dev->espeed;
+ rdev->lanes = rdev->en_dev->lanes;
if (test_bit(BNXT_RE_FLAG_IBDEV_REGISTERED, &rdev->flags))
- __to_ib_speed_width(rdev->espeed, &active_speed,
+ __to_ib_speed_width(rdev->espeed, rdev->lanes, &active_speed,
&active_width);
port_attr->active_speed = active_speed;
diff --git a/sys/dev/bnxt/bnxt_re/main.c b/sys/dev/bnxt/bnxt_re/main.c
--- a/sys/dev/bnxt/bnxt_re/main.c
+++ b/sys/dev/bnxt/bnxt_re/main.c
@@ -3818,6 +3818,7 @@
void bnxt_re_get_link_speed(struct bnxt_re_dev *rdev)
{
rdev->espeed = rdev->en_dev->espeed;
+ rdev->lanes = rdev->en_dev->lanes;
return;
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Sep 6, 6:06 PM (7 h, 35 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
38390322
Default Alt Text
D54523.diff (6 KB)
Attached To
Mode
D54523: bnxt_re: Fix active_speed value when two ports are aggregated
Attached
Detach File
Event Timeline
Log In to Comment