提交 96305234 编写于 作者: D Dmitry Kravkov 提交者: David S. Miller

bnx2x: change to the rss engine

This patch revises the way by which rss are configured, removing
an unnecessary module paramater and unrequired modes.
Signed-off-by: NDmitry Kravkov <dmitry@broadcom.com>
Signed-off-by: NYuval Mintz <yuvalmin@broadcom.com>
Signed-off-by: NEilon Greenstein <eilong@broadcom.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 b475d78f
...@@ -1382,7 +1382,6 @@ struct bnx2x { ...@@ -1382,7 +1382,6 @@ struct bnx2x {
#define BNX2X_STATE_DIAG 0xe000 #define BNX2X_STATE_DIAG 0xe000
#define BNX2X_STATE_ERROR 0xf000 #define BNX2X_STATE_ERROR 0xf000
int multi_mode;
#define BNX2X_MAX_PRIORITY 8 #define BNX2X_MAX_PRIORITY 8
#define BNX2X_MAX_ENTRIES_PER_PRI 16 #define BNX2X_MAX_ENTRIES_PER_PRI 16
#define BNX2X_MAX_COS 3 #define BNX2X_MAX_COS 3
......
...@@ -1460,20 +1460,11 @@ u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb) ...@@ -1460,20 +1460,11 @@ u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb)
return __skb_tx_hash(dev, skb, BNX2X_NUM_ETH_QUEUES(bp)); return __skb_tx_hash(dev, skb, BNX2X_NUM_ETH_QUEUES(bp));
} }
void bnx2x_set_num_queues(struct bnx2x *bp) void bnx2x_set_num_queues(struct bnx2x *bp)
{ {
switch (bp->multi_mode) { /* RSS queues */
case ETH_RSS_MODE_DISABLED: bp->num_queues = bnx2x_calc_num_queues(bp);
bp->num_queues = 1;
break;
case ETH_RSS_MODE_REGULAR:
bp->num_queues = bnx2x_calc_num_queues(bp);
break;
default:
bp->num_queues = 1;
break;
}
#ifdef BCM_CNIC #ifdef BCM_CNIC
/* override in STORAGE SD mode */ /* override in STORAGE SD mode */
...@@ -1572,16 +1563,13 @@ static inline int bnx2x_init_rss_pf(struct bnx2x *bp) ...@@ -1572,16 +1563,13 @@ static inline int bnx2x_init_rss_pf(struct bnx2x *bp)
u8 ind_table[T_ETH_INDIRECTION_TABLE_SIZE] = {0}; u8 ind_table[T_ETH_INDIRECTION_TABLE_SIZE] = {0};
u8 num_eth_queues = BNX2X_NUM_ETH_QUEUES(bp); u8 num_eth_queues = BNX2X_NUM_ETH_QUEUES(bp);
/* /* Prepare the initial contents fo the indirection table if RSS is
* Prepare the inital contents fo the indirection table if RSS is
* enabled * enabled
*/ */
if (bp->multi_mode != ETH_RSS_MODE_DISABLED) { for (i = 0; i < sizeof(ind_table); i++)
for (i = 0; i < sizeof(ind_table); i++) ind_table[i] =
ind_table[i] = bp->fp->cl_id +
bp->fp->cl_id + ethtool_rxfh_indir_default(i, num_eth_queues);
ethtool_rxfh_indir_default(i, num_eth_queues);
}
/* /*
* For 57710 and 57711 SEARCHER configuration (rss_keys) is * For 57710 and 57711 SEARCHER configuration (rss_keys) is
...@@ -1591,11 +1579,12 @@ static inline int bnx2x_init_rss_pf(struct bnx2x *bp) ...@@ -1591,11 +1579,12 @@ static inline int bnx2x_init_rss_pf(struct bnx2x *bp)
* For 57712 and newer on the other hand it's a per-function * For 57712 and newer on the other hand it's a per-function
* configuration. * configuration.
*/ */
return bnx2x_config_rss_pf(bp, ind_table, return bnx2x_config_rss_eth(bp, ind_table,
bp->port.pmf || !CHIP_IS_E1x(bp)); bp->port.pmf || !CHIP_IS_E1x(bp));
} }
int bnx2x_config_rss_pf(struct bnx2x *bp, u8 *ind_table, bool config_hash) int bnx2x_config_rss_pf(struct bnx2x *bp, struct bnx2x_rss_config_obj *rss_obj,
u8 *ind_table, bool config_hash)
{ {
struct bnx2x_config_rss_params params = {NULL}; struct bnx2x_config_rss_params params = {NULL};
int i; int i;
...@@ -1607,52 +1596,29 @@ int bnx2x_config_rss_pf(struct bnx2x *bp, u8 *ind_table, bool config_hash) ...@@ -1607,52 +1596,29 @@ int bnx2x_config_rss_pf(struct bnx2x *bp, u8 *ind_table, bool config_hash)
* bp->multi_mode = ETH_RSS_MODE_DISABLED; * bp->multi_mode = ETH_RSS_MODE_DISABLED;
*/ */
params.rss_obj = &bp->rss_conf_obj; params.rss_obj = rss_obj;
__set_bit(RAMROD_COMP_WAIT, &params.ramrod_flags); __set_bit(RAMROD_COMP_WAIT, &params.ramrod_flags);
/* RSS mode */ __set_bit(BNX2X_RSS_MODE_REGULAR, &params.rss_flags);
switch (bp->multi_mode) {
case ETH_RSS_MODE_DISABLED:
__set_bit(BNX2X_RSS_MODE_DISABLED, &params.rss_flags);
break;
case ETH_RSS_MODE_REGULAR:
__set_bit(BNX2X_RSS_MODE_REGULAR, &params.rss_flags);
break;
case ETH_RSS_MODE_VLAN_PRI:
__set_bit(BNX2X_RSS_MODE_VLAN_PRI, &params.rss_flags);
break;
case ETH_RSS_MODE_E1HOV_PRI:
__set_bit(BNX2X_RSS_MODE_E1HOV_PRI, &params.rss_flags);
break;
case ETH_RSS_MODE_IP_DSCP:
__set_bit(BNX2X_RSS_MODE_IP_DSCP, &params.rss_flags);
break;
default:
BNX2X_ERR("Unknown multi_mode: %d\n", bp->multi_mode);
return -EINVAL;
}
/* If RSS is enabled */ /* RSS configuration */
if (bp->multi_mode != ETH_RSS_MODE_DISABLED) { __set_bit(BNX2X_RSS_IPV4, &params.rss_flags);
/* RSS configuration */ __set_bit(BNX2X_RSS_IPV4_TCP, &params.rss_flags);
__set_bit(BNX2X_RSS_IPV4, &params.rss_flags); __set_bit(BNX2X_RSS_IPV6, &params.rss_flags);
__set_bit(BNX2X_RSS_IPV4_TCP, &params.rss_flags); __set_bit(BNX2X_RSS_IPV6_TCP, &params.rss_flags);
__set_bit(BNX2X_RSS_IPV6, &params.rss_flags);
__set_bit(BNX2X_RSS_IPV6_TCP, &params.rss_flags);
/* Hash bits */ /* Hash bits */
params.rss_result_mask = MULTI_MASK; params.rss_result_mask = MULTI_MASK;
memcpy(params.ind_table, ind_table, sizeof(params.ind_table)); memcpy(params.ind_table, ind_table, sizeof(params.ind_table));
if (config_hash) { if (config_hash) {
/* RSS keys */ /* RSS keys */
for (i = 0; i < sizeof(params.rss_key) / 4; i++) for (i = 0; i < sizeof(params.rss_key) / 4; i++)
params.rss_key[i] = random32(); params.rss_key[i] = random32();
__set_bit(BNX2X_RSS_SET_SRCH, &params.rss_flags); __set_bit(BNX2X_RSS_SET_SRCH, &params.rss_flags);
}
} }
return bnx2x_config_rss(bp, &params); return bnx2x_config_rss(bp, &params);
......
...@@ -86,13 +86,15 @@ u32 bnx2x_send_unload_req(struct bnx2x *bp, int unload_mode); ...@@ -86,13 +86,15 @@ u32 bnx2x_send_unload_req(struct bnx2x *bp, int unload_mode);
void bnx2x_send_unload_done(struct bnx2x *bp); void bnx2x_send_unload_done(struct bnx2x *bp);
/** /**
* bnx2x_config_rss_pf - configure RSS parameters. * bnx2x_config_rss_pf - configure RSS parameters in a PF.
* *
* @bp: driver handle * @bp: driver handle
* @rss_obj RSS object to use
* @ind_table: indirection table to configure * @ind_table: indirection table to configure
* @config_hash: re-configure RSS hash keys configuration * @config_hash: re-configure RSS hash keys configuration
*/ */
int bnx2x_config_rss_pf(struct bnx2x *bp, u8 *ind_table, bool config_hash); int bnx2x_config_rss_pf(struct bnx2x *bp, struct bnx2x_rss_config_obj *rss_obj,
u8 *ind_table, bool config_hash);
/** /**
* bnx2x__init_func_obj - init function object * bnx2x__init_func_obj - init function object
...@@ -970,6 +972,13 @@ static inline int func_by_vn(struct bnx2x *bp, int vn) ...@@ -970,6 +972,13 @@ static inline int func_by_vn(struct bnx2x *bp, int vn)
return 2 * vn + BP_PORT(bp); return 2 * vn + BP_PORT(bp);
} }
static inline int bnx2x_config_rss_eth(struct bnx2x *bp, u8 *ind_table,
bool config_hash)
{
return bnx2x_config_rss_pf(bp, &bp->rss_conf_obj, ind_table,
config_hash);
}
/** /**
* bnx2x_func_start - init function * bnx2x_func_start - init function
* *
......
...@@ -2393,10 +2393,7 @@ static int bnx2x_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *info, ...@@ -2393,10 +2393,7 @@ static int bnx2x_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *info,
static u32 bnx2x_get_rxfh_indir_size(struct net_device *dev) static u32 bnx2x_get_rxfh_indir_size(struct net_device *dev)
{ {
struct bnx2x *bp = netdev_priv(dev); return T_ETH_INDIRECTION_TABLE_SIZE;
return (bp->multi_mode == ETH_RSS_MODE_DISABLED ?
0 : T_ETH_INDIRECTION_TABLE_SIZE);
} }
static int bnx2x_get_rxfh_indir(struct net_device *dev, u32 *indir) static int bnx2x_get_rxfh_indir(struct net_device *dev, u32 *indir)
...@@ -2442,7 +2439,7 @@ static int bnx2x_set_rxfh_indir(struct net_device *dev, const u32 *indir) ...@@ -2442,7 +2439,7 @@ static int bnx2x_set_rxfh_indir(struct net_device *dev, const u32 *indir)
ind_table[i] = indir[i] + bp->fp->cl_id; ind_table[i] = indir[i] + bp->fp->cl_id;
} }
return bnx2x_config_rss_pf(bp, ind_table, false); return bnx2x_config_rss_eth(bp, ind_table, false);
} }
static const struct ethtool_ops bnx2x_ethtool_ops = { static const struct ethtool_ops bnx2x_ethtool_ops = {
......
...@@ -92,15 +92,11 @@ MODULE_FIRMWARE(FW_FILE_NAME_E1); ...@@ -92,15 +92,11 @@ MODULE_FIRMWARE(FW_FILE_NAME_E1);
MODULE_FIRMWARE(FW_FILE_NAME_E1H); MODULE_FIRMWARE(FW_FILE_NAME_E1H);
MODULE_FIRMWARE(FW_FILE_NAME_E2); MODULE_FIRMWARE(FW_FILE_NAME_E2);
static int multi_mode = 1;
module_param(multi_mode, int, 0);
MODULE_PARM_DESC(multi_mode, " Multi queue mode "
"(0 Disable; 1 Enable (default))");
int num_queues; int num_queues;
module_param(num_queues, int, 0); module_param(num_queues, int, 0);
MODULE_PARM_DESC(num_queues, " Number of queues for multi_mode=1" MODULE_PARM_DESC(num_queues,
" (default is as a number of CPUs)"); " Set number of queues (default is as a number of CPUs)");
static int disable_tpa; static int disable_tpa;
module_param(disable_tpa, int, 0); module_param(disable_tpa, int, 0);
...@@ -10244,8 +10240,6 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp) ...@@ -10244,8 +10240,6 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp)
if (BP_NOMCP(bp) && (func == 0)) if (BP_NOMCP(bp) && (func == 0))
dev_err(&bp->pdev->dev, "MCP disabled, must load devices in order!\n"); dev_err(&bp->pdev->dev, "MCP disabled, must load devices in order!\n");
bp->multi_mode = multi_mode;
bp->disable_tpa = disable_tpa; bp->disable_tpa = disable_tpa;
#ifdef BCM_CNIC #ifdef BCM_CNIC
......
...@@ -4090,12 +4090,6 @@ static int bnx2x_setup_rss(struct bnx2x *bp, ...@@ -4090,12 +4090,6 @@ static int bnx2x_setup_rss(struct bnx2x *bp,
rss_mode = ETH_RSS_MODE_DISABLED; rss_mode = ETH_RSS_MODE_DISABLED;
else if (test_bit(BNX2X_RSS_MODE_REGULAR, &p->rss_flags)) else if (test_bit(BNX2X_RSS_MODE_REGULAR, &p->rss_flags))
rss_mode = ETH_RSS_MODE_REGULAR; rss_mode = ETH_RSS_MODE_REGULAR;
else if (test_bit(BNX2X_RSS_MODE_VLAN_PRI, &p->rss_flags))
rss_mode = ETH_RSS_MODE_VLAN_PRI;
else if (test_bit(BNX2X_RSS_MODE_E1HOV_PRI, &p->rss_flags))
rss_mode = ETH_RSS_MODE_E1HOV_PRI;
else if (test_bit(BNX2X_RSS_MODE_IP_DSCP, &p->rss_flags))
rss_mode = ETH_RSS_MODE_IP_DSCP;
data->rss_mode = rss_mode; data->rss_mode = rss_mode;
......
...@@ -685,9 +685,6 @@ enum { ...@@ -685,9 +685,6 @@ enum {
/* RSS_MODE bits are mutually exclusive */ /* RSS_MODE bits are mutually exclusive */
BNX2X_RSS_MODE_DISABLED, BNX2X_RSS_MODE_DISABLED,
BNX2X_RSS_MODE_REGULAR, BNX2X_RSS_MODE_REGULAR,
BNX2X_RSS_MODE_VLAN_PRI,
BNX2X_RSS_MODE_E1HOV_PRI,
BNX2X_RSS_MODE_IP_DSCP,
BNX2X_RSS_SET_SRCH, /* Setup searcher, E1x specific flag */ BNX2X_RSS_SET_SRCH, /* Setup searcher, E1x specific flag */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册