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

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

cxgb4/cxgb4vf: Allocate more queues for 25G and 100G adapter



We were missing check for 25G and 100G while checking port speed,
which lead to less number of queues getting allocated for 25G & 100G
adapters and leading to low throughput. Adding the missing check for
both NIC and vNIC driver.

Also fixes port advertisement for 25G and 100G in ethtool output.

Signed-off-by: default avatarHariprasad Shenai <hariprasad@chelsio.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ceb16a90
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -419,8 +419,8 @@ struct link_config {
	unsigned short supported;        /* link capabilities */
	unsigned short supported;        /* link capabilities */
	unsigned short advertising;      /* advertised capabilities */
	unsigned short advertising;      /* advertised capabilities */
	unsigned short lp_advertising;   /* peer advertised capabilities */
	unsigned short lp_advertising;   /* peer advertised capabilities */
	unsigned short requested_speed;  /* speed user has requested */
	unsigned int   requested_speed;  /* speed user has requested */
	unsigned short speed;            /* actual link speed */
	unsigned int   speed;            /* actual link speed */
	unsigned char  requested_fc;     /* flow control user has requested */
	unsigned char  requested_fc;     /* flow control user has requested */
	unsigned char  fc;               /* actual link flow control */
	unsigned char  fc;               /* actual link flow control */
	unsigned char  autoneg;          /* autonegotiating? */
	unsigned char  autoneg;          /* autonegotiating? */
+13 −2
Original line number Original line Diff line number Diff line
@@ -4305,10 +4305,17 @@ static const struct pci_error_handlers cxgb4_eeh = {
	.resume         = eeh_resume,
	.resume         = eeh_resume,
};
};


/* Return true if the Link Configuration supports "High Speeds" (those greater
 * than 1Gb/s).
 */
static inline bool is_x_10g_port(const struct link_config *lc)
static inline bool is_x_10g_port(const struct link_config *lc)
{
{
	return (lc->supported & FW_PORT_CAP_SPEED_10G) != 0 ||
	unsigned int speeds, high_speeds;
	       (lc->supported & FW_PORT_CAP_SPEED_40G) != 0;

	speeds = FW_PORT_CAP_SPEED_V(FW_PORT_CAP_SPEED_G(lc->supported));
	high_speeds = speeds & ~(FW_PORT_CAP_SPEED_100M | FW_PORT_CAP_SPEED_1G);

	return high_speeds != 0;
}
}


static inline void init_rspq(struct adapter *adap, struct sge_rspq *q,
static inline void init_rspq(struct adapter *adap, struct sge_rspq *q,
@@ -4756,8 +4763,12 @@ static void print_port_info(const struct net_device *dev)
		bufp += sprintf(bufp, "1000/");
		bufp += sprintf(bufp, "1000/");
	if (pi->link_cfg.supported & FW_PORT_CAP_SPEED_10G)
	if (pi->link_cfg.supported & FW_PORT_CAP_SPEED_10G)
		bufp += sprintf(bufp, "10G/");
		bufp += sprintf(bufp, "10G/");
	if (pi->link_cfg.supported & FW_PORT_CAP_SPEED_25G)
		bufp += sprintf(bufp, "25G/");
	if (pi->link_cfg.supported & FW_PORT_CAP_SPEED_40G)
	if (pi->link_cfg.supported & FW_PORT_CAP_SPEED_40G)
		bufp += sprintf(bufp, "40G/");
		bufp += sprintf(bufp, "40G/");
	if (pi->link_cfg.supported & FW_PORT_CAP_SPEED_100G)
		bufp += sprintf(bufp, "100G/");
	if (bufp != buf)
	if (bufp != buf)
		--bufp;
		--bufp;
	sprintf(bufp, "BASE-%s", t4_get_port_type_description(pi->port_type));
	sprintf(bufp, "BASE-%s", t4_get_port_type_description(pi->port_type));
+6 −1
Original line number Original line Diff line number Diff line
@@ -3627,7 +3627,8 @@ void t4_ulprx_read_la(struct adapter *adap, u32 *la_buf)
}
}


#define ADVERT_MASK (FW_PORT_CAP_SPEED_100M | FW_PORT_CAP_SPEED_1G |\
#define ADVERT_MASK (FW_PORT_CAP_SPEED_100M | FW_PORT_CAP_SPEED_1G |\
		     FW_PORT_CAP_SPEED_10G | FW_PORT_CAP_SPEED_40G | \
		     FW_PORT_CAP_SPEED_10G | FW_PORT_CAP_SPEED_25G | \
		     FW_PORT_CAP_SPEED_40G | FW_PORT_CAP_SPEED_100G | \
		     FW_PORT_CAP_ANEG)
		     FW_PORT_CAP_ANEG)


/**
/**
@@ -7196,8 +7197,12 @@ void t4_handle_get_port_info(struct port_info *pi, const __be64 *rpl)
		speed = 1000;
		speed = 1000;
	else if (stat & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_10G))
	else if (stat & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_10G))
		speed = 10000;
		speed = 10000;
	else if (stat & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_25G))
		speed = 25000;
	else if (stat & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_40G))
	else if (stat & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_40G))
		speed = 40000;
		speed = 40000;
	else if (stat & FW_PORT_CMD_LSPEED_V(FW_PORT_CAP_SPEED_100G))
		speed = 100000;


	lc = &pi->link_cfg;
	lc = &pi->link_cfg;


+6 −0
Original line number Original line Diff line number Diff line
@@ -2265,6 +2265,12 @@ enum fw_port_cap {
	FW_PORT_CAP_802_3_ASM_DIR	= 0x8000,
	FW_PORT_CAP_802_3_ASM_DIR	= 0x8000,
};
};


#define FW_PORT_CAP_SPEED_S     0
#define FW_PORT_CAP_SPEED_M     0x3f
#define FW_PORT_CAP_SPEED_V(x)  ((x) << FW_PORT_CAP_SPEED_S)
#define FW_PORT_CAP_SPEED_G(x) \
	(((x) >> FW_PORT_CAP_SPEED_S) & FW_PORT_CAP_SPEED_M)

enum fw_port_mdi {
enum fw_port_mdi {
	FW_PORT_CAP_MDI_UNCHANGED,
	FW_PORT_CAP_MDI_UNCHANGED,
	FW_PORT_CAP_MDI_AUTO,
	FW_PORT_CAP_MDI_AUTO,
+11 −4
Original line number Original line Diff line number Diff line
@@ -108,8 +108,8 @@ struct link_config {
	unsigned int   supported;        /* link capabilities */
	unsigned int   supported;        /* link capabilities */
	unsigned int   advertising;      /* advertised capabilities */
	unsigned int   advertising;      /* advertised capabilities */
	unsigned short lp_advertising;   /* peer advertised capabilities */
	unsigned short lp_advertising;   /* peer advertised capabilities */
	unsigned short requested_speed;  /* speed user has requested */
	unsigned int   requested_speed;  /* speed user has requested */
	unsigned short speed;            /* actual link speed */
	unsigned int   speed;            /* actual link speed */
	unsigned char  requested_fc;     /* flow control user has requested */
	unsigned char  requested_fc;     /* flow control user has requested */
	unsigned char  fc;               /* actual link flow control */
	unsigned char  fc;               /* actual link flow control */
	unsigned char  autoneg;          /* autonegotiating? */
	unsigned char  autoneg;          /* autonegotiating? */
@@ -271,10 +271,17 @@ static inline bool is_10g_port(const struct link_config *lc)
	return (lc->supported & FW_PORT_CAP_SPEED_10G) != 0;
	return (lc->supported & FW_PORT_CAP_SPEED_10G) != 0;
}
}


/* Return true if the Link Configuration supports "High Speeds" (those greater
 * than 1Gb/s).
 */
static inline bool is_x_10g_port(const struct link_config *lc)
static inline bool is_x_10g_port(const struct link_config *lc)
{
{
	return (lc->supported & FW_PORT_CAP_SPEED_10G) != 0 ||
	unsigned int speeds, high_speeds;
		(lc->supported & FW_PORT_CAP_SPEED_40G) != 0;

	speeds = FW_PORT_CAP_SPEED_V(FW_PORT_CAP_SPEED_G(lc->supported));
	high_speeds = speeds & ~(FW_PORT_CAP_SPEED_100M | FW_PORT_CAP_SPEED_1G);

	return high_speeds != 0;
}
}


static inline unsigned int core_ticks_per_usec(const struct adapter *adapter)
static inline unsigned int core_ticks_per_usec(const struct adapter *adapter)
Loading