Commit ddc7740d authored by Hariprasad Shenai's avatar Hariprasad Shenai Committed by David S. Miller

cxgb4: Decode link down reason code obtained from firmware

Signed-off-by: default avatarHariprasad Shenai <hariprasad@chelsio.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 23853a0a
...@@ -396,6 +396,7 @@ struct link_config { ...@@ -396,6 +396,7 @@ struct link_config {
unsigned char fc; /* actual link flow control */ unsigned char fc; /* actual link flow control */
unsigned char autoneg; /* autonegotiating? */ unsigned char autoneg; /* autonegotiating? */
unsigned char link_ok; /* link up? */ unsigned char link_ok; /* link up? */
unsigned char link_down_rc; /* link down reason */
}; };
#define FW_LEN16(fw_struct) FW_CMD_LEN16_V(sizeof(fw_struct) / 16) #define FW_LEN16(fw_struct) FW_CMD_LEN16_V(sizeof(fw_struct) / 16)
......
...@@ -7102,6 +7102,32 @@ int t4_ofld_eq_free(struct adapter *adap, unsigned int mbox, unsigned int pf, ...@@ -7102,6 +7102,32 @@ int t4_ofld_eq_free(struct adapter *adap, unsigned int mbox, unsigned int pf,
return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL); return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
} }
/**
* t4_link_down_rc_str - return a string for a Link Down Reason Code
* @adap: the adapter
* @link_down_rc: Link Down Reason Code
*
* Returns a string representation of the Link Down Reason Code.
*/
static const char *t4_link_down_rc_str(unsigned char link_down_rc)
{
static const char * const reason[] = {
"Link Down",
"Remote Fault",
"Auto-negotiation Failure",
"Reserved",
"Insufficient Airflow",
"Unable To Determine Reason",
"No RX Signal Detected",
"Reserved",
};
if (link_down_rc >= ARRAY_SIZE(reason))
return "Bad Reason Code";
return reason[link_down_rc];
}
/** /**
* t4_handle_get_port_info - process a FW reply message * t4_handle_get_port_info - process a FW reply message
* @pi: the port info * @pi: the port info
...@@ -7142,6 +7168,14 @@ void t4_handle_get_port_info(struct port_info *pi, const __be64 *rpl) ...@@ -7142,6 +7168,14 @@ void t4_handle_get_port_info(struct port_info *pi, const __be64 *rpl)
} }
if (link_ok != lc->link_ok || speed != lc->speed || if (link_ok != lc->link_ok || speed != lc->speed ||
fc != lc->fc) { /* something changed */ fc != lc->fc) { /* something changed */
if (!link_ok && lc->link_ok) {
unsigned char rc = FW_PORT_CMD_LINKDNRC_G(stat);
lc->link_down_rc = rc;
dev_warn(adap->pdev_dev,
"Port %d link down, reason: %s\n",
pi->port_id, t4_link_down_rc_str(rc));
}
lc->link_ok = link_ok; lc->link_ok = link_ok;
lc->speed = speed; lc->speed = speed;
lc->fc = fc; lc->fc = fc;
......
...@@ -2510,6 +2510,11 @@ struct fw_port_cmd { ...@@ -2510,6 +2510,11 @@ struct fw_port_cmd {
#define FW_PORT_CMD_PTYPE_G(x) \ #define FW_PORT_CMD_PTYPE_G(x) \
(((x) >> FW_PORT_CMD_PTYPE_S) & FW_PORT_CMD_PTYPE_M) (((x) >> FW_PORT_CMD_PTYPE_S) & FW_PORT_CMD_PTYPE_M)
#define FW_PORT_CMD_LINKDNRC_S 5
#define FW_PORT_CMD_LINKDNRC_M 0x7
#define FW_PORT_CMD_LINKDNRC_G(x) \
(((x) >> FW_PORT_CMD_LINKDNRC_S) & FW_PORT_CMD_LINKDNRC_M)
#define FW_PORT_CMD_MODTYPE_S 0 #define FW_PORT_CMD_MODTYPE_S 0
#define FW_PORT_CMD_MODTYPE_M 0x1f #define FW_PORT_CMD_MODTYPE_M 0x1f
#define FW_PORT_CMD_MODTYPE_V(x) ((x) << FW_PORT_CMD_MODTYPE_S) #define FW_PORT_CMD_MODTYPE_V(x) ((x) << FW_PORT_CMD_MODTYPE_S)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment