Page MenuHomeFreeBSD

D58806.id.diff
No OneTemporary

D58806.id.diff

diff --git a/sys/dev/aq/aq_fw2x.c b/sys/dev/aq/aq_fw2x.c
--- a/sys/dev/aq/aq_fw2x.c
+++ b/sys/dev/aq/aq_fw2x.c
@@ -750,6 +750,9 @@
uint16_t ctrl;
int err;
+ if ((hw->fw_caps & FW2X_CAP_TEMPERATURE) == 0)
+ return (ENOTSUP);
+
mtx_lock(&hw->fw_mtx);
aq_fw2x_phy_id_probe(hw);
err = aq_fw2x_phy_read(hw, AQ_PHY_MMD_GLOBAL, AQ_PHY_THERMAL_CTRL_REG,
diff --git a/sys/dev/aq/aq_main.c b/sys/dev/aq/aq_main.c
--- a/sys/dev/aq/aq_main.c
+++ b/sys/dev/aq/aq_main.c
@@ -109,6 +109,8 @@
"Aquantia AQtion 5Gbit Network Adapter"),
PVID(AQUANTIA_VENDOR_ID, AQ_DEVICE_ID_D109,
"Aquantia AQtion 2.5Gbit Network Adapter"),
+ PVID(AQUANTIA_VENDOR_ID, AQ_DEVICE_ID_D100,
+ "Aquantia AQtion 10Gbit Network Adapter"),
PVID(AQUANTIA_VENDOR_ID, AQ_DEVICE_ID_AQC107,
"Aquantia AQtion 10Gbit Network Adapter"),
@@ -782,10 +784,12 @@
softc->init_retries = 0;
/* aq_hw_init reloads the PHY, resetting the thermal-shutdown arming. */
- if (hw->fw_ops->thermal_arm != NULL &&
- hw->fw_ops->thermal_arm(hw) != 0)
- device_printf(softc->dev,
- "could not arm PHY thermal shutdown\n");
+ if (hw->fw_ops->thermal_arm != NULL) {
+ err = hw->fw_ops->thermal_arm(hw);
+ if (err != 0 && err != ENOTSUP)
+ device_printf(softc->dev,
+ "could not arm PHY thermal shutdown\n");
+ }
aq_if_media_status(ctx, &ifmr);
diff --git a/sys/dev/aq/aq_media.c b/sys/dev/aq/aq_media.c
--- a/sys/dev/aq/aq_media.c
+++ b/sys/dev/aq/aq_media.c
@@ -62,12 +62,12 @@
int ifm_fibre; /* IFM_* subtype, SFP cage */
uint32_t mbps; /* link speed, Mbit/s */
} aq_media_types[] = {
- { AQ_LINK_10M, aq_fw_10M, IFM_10_T, 0, 10 },
- { AQ_LINK_100M, aq_fw_100M, IFM_100_TX, IFM_100_FX, 100 },
- { AQ_LINK_1G, aq_fw_1G, IFM_1000_T, IFM_1000_SX, 1000 },
- { AQ_LINK_2G5, aq_fw_2G5, IFM_2500_T, IFM_2500_SX, 2500 },
- { AQ_LINK_5G, aq_fw_5G, IFM_5000_T, 0, 5000 },
- { AQ_LINK_10G, aq_fw_10G, IFM_10G_T, IFM_10G_SFI, 10000 },
+ { AQ_LINK_10M, aq_fw_10M, IFM_10_T, 0, 10 },
+ { AQ_LINK_100M, aq_fw_100M, IFM_100_TX, IFM_100_SGMII, 100 },
+ { AQ_LINK_1G, aq_fw_1G, IFM_1000_T, IFM_1000_SGMII, 1000 },
+ { AQ_LINK_2G5, aq_fw_2G5, IFM_2500_T, IFM_2500_X, 2500 },
+ { AQ_LINK_5G, aq_fw_5G, IFM_5000_T, 0, 5000 },
+ { AQ_LINK_10G, aq_fw_10G, IFM_10G_T, IFM_10G_SFI, 10000 },
};
/* SFF-8472 table 3.5 compliance bits, relative to SFF_8472_TRANS_START. */
@@ -81,9 +81,16 @@
#define AQ_SFF_1G_LX 0x02
#define AQ_SFF_1G_CX 0x04
#define AQ_SFF_1G_T 0x08
+
#define AQ_SFF_TRANS_CABLE 5 /* byte 8 */
-#define AQ_SFF_CABLE_ACTIVE 0x04
-#define AQ_SFF_CABLE_PASSIVE 0x08
+#define AQ_SFF_CABLE_PASSIVE 0x04
+#define AQ_SFF_CABLE_ACTIVE 0x08
+
+/* SFF-8024 extended codes, the only place a BASE-T module names itself. */
+#define AQ_SFF_EXT_10G_T_SFI 0x16
+#define AQ_SFF_EXT_10G_T_SR 0x1c
+
+static void aq_media_reload(struct aq_dev *aq_dev);
/* Names the medium in the cage, not what the cage could in principle hold. */
static void
@@ -91,7 +98,7 @@
{
struct aq_hw *hw = &aq_dev->hw;
uint8_t code[SFF_8472_TRANS_END - SFF_8472_TRANS_START + 1];
- uint8_t cable;
+ uint8_t cable, ext;
aq_dev->sfp_ifm_1g = 0;
aq_dev->sfp_ifm_10g = 0;
@@ -127,6 +134,11 @@
aq_dev->sfp_ifm_1g = IFM_1000_T;
else if (cable != 0)
aq_dev->sfp_ifm_1g = IFM_1000_CX;
+
+ if (hw->fw_ops->get_module_eeprom(hw, SFF_8472_BASE, SFF_8472_TRANS,
+ sizeof ext, &ext) == 0 &&
+ (ext == AQ_SFF_EXT_10G_T_SFI || ext == AQ_SFF_EXT_10G_T_SR))
+ aq_dev->sfp_ifm_10g = IFM_10G_T;
}
/* Fibre parts prefer what the module reported over the table default. */
@@ -173,8 +185,15 @@
aq_dev->media_active |= IFM_ETH_TXPAUSE;
/* The module can be swapped while the port is down. */
- if (aq_dev->media_type == AQ_MEDIA_TYPE_FIBRE && link_speed != 0)
+ if (aq_dev->media_type == AQ_MEDIA_TYPE_FIBRE && link_speed != 0) {
+ int old_1g = aq_dev->sfp_ifm_1g;
+ int old_10g = aq_dev->sfp_ifm_10g;
+
aq_sfp_scan(aq_dev);
+ if (aq_dev->sfp_ifm_1g != old_1g ||
+ aq_dev->sfp_ifm_10g != old_10g)
+ aq_media_reload(aq_dev);
+ }
for (i = 0; i < nitems(aq_media_types); i++)
if (link_speed == aq_media_types[i].mbps)
@@ -280,16 +299,12 @@
ifmedia_add(aq_dev->media, IFM_ETHER | media_link_speed | IFM_FDX |
IFM_ETH_TXPAUSE, 0, NULL);
}
-void
-aq_initmedia(struct aq_dev *aq_dev)
+
+static void
+aq_media_populate(struct aq_dev *aq_dev)
{
u_int i;
- AQ_DBG_ENTER();
-
- aq_dev->sfp_ifm_1g = 0;
- aq_dev->sfp_ifm_10g = 0;
-
// ifconfig eth0 none
ifmedia_add(aq_dev->media, IFM_ETHER | IFM_NONE, 0, NULL);
@@ -303,6 +318,28 @@
continue;
aq_add_media_types(aq_dev, aq_media_ifm(aq_dev, i));
}
+}
+
+/* A swapped module renames the advertised speeds, so rebuild the list. */
+static void
+aq_media_reload(struct aq_dev *aq_dev)
+{
+ ifmedia_removeall(aq_dev->media);
+ aq_media_populate(aq_dev);
+ ifmedia_set(aq_dev->media,
+ IFM_ETHER | IFM_AUTO | IFM_FDX | IFM_ETH_RXPAUSE | IFM_ETH_TXPAUSE);
+}
+
+void
+aq_initmedia(struct aq_dev *aq_dev)
+{
+
+ AQ_DBG_ENTER();
+
+ aq_dev->sfp_ifm_1g = 0;
+ aq_dev->sfp_ifm_10g = 0;
+
+ aq_media_populate(aq_dev);
// link is initially autoselect
ifmedia_set(aq_dev->media,

File Metadata

Mime Type
text/plain
Expires
Fri, Aug 21, 9:10 AM (3 h, 1 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
36983899
Default Alt Text
D58806.id.diff (5 KB)

Event Timeline