Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

cxgb4: Decode link down reason code obtained from firmware

parent 23853a0a
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -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)
+34 −0
Original line number Original line Diff line number Diff line
@@ -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;
+5 −0
Original line number Original line Diff line number Diff line
@@ -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)