cxgb4: Decode link down reason code obtained from firmware
Signed-off-by: Hariprasad Shenai <hariprasad@chelsio.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
23853a0a9a
commit
ddc7740d9a
@ -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,
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
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 {
|
|||||||
#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)
|
||||||
|
Loading…
Reference in New Issue
Block a user