aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorAriel Elior <ariele@broadcom.com>2013-09-04 07:09:22 -0400
committerDavid S. Miller <davem@davemloft.net>2013-09-05 12:44:31 -0400
commit60cad4e67bd6ff400e7ea61fe762b3042b12ae9d (patch)
tree9a1e0816ade7fe233ad5512792a6cc2e8f7e7788 /drivers/net
parentb9871bcfd211d316adee317608dab44c58d6ea2d (diff)
bnx2x: VF RSS support - VF side
In this patch capabilities are added to the Vf driver to request multiple queues over the VF PF channel, and the logic for requesting rss configuration for said queues. Signed-off-by: Ariel Elior <ariele@broadcom.com> Signed-off-by: Eilong Greenstein <eilong@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c85
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h7
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c4
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c27
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.h7
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c75
6 files changed, 145 insertions, 60 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
index e7400d9d60c4..8d726f6e1c52 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
@@ -1942,7 +1942,7 @@ static void bnx2x_set_rx_buf_size(struct bnx2x *bp)
1942 } 1942 }
1943} 1943}
1944 1944
1945static int bnx2x_init_rss_pf(struct bnx2x *bp) 1945static int bnx2x_init_rss(struct bnx2x *bp)
1946{ 1946{
1947 int i; 1947 int i;
1948 u8 num_eth_queues = BNX2X_NUM_ETH_QUEUES(bp); 1948 u8 num_eth_queues = BNX2X_NUM_ETH_QUEUES(bp);
@@ -1966,8 +1966,8 @@ static int bnx2x_init_rss_pf(struct bnx2x *bp)
1966 return bnx2x_config_rss_eth(bp, bp->port.pmf || !CHIP_IS_E1x(bp)); 1966 return bnx2x_config_rss_eth(bp, bp->port.pmf || !CHIP_IS_E1x(bp));
1967} 1967}
1968 1968
1969int bnx2x_config_rss_pf(struct bnx2x *bp, struct bnx2x_rss_config_obj *rss_obj, 1969int bnx2x_rss(struct bnx2x *bp, struct bnx2x_rss_config_obj *rss_obj,
1970 bool config_hash) 1970 bool config_hash, bool enable)
1971{ 1971{
1972 struct bnx2x_config_rss_params params = {NULL}; 1972 struct bnx2x_config_rss_params params = {NULL};
1973 1973
@@ -1982,17 +1982,21 @@ int bnx2x_config_rss_pf(struct bnx2x *bp, struct bnx2x_rss_config_obj *rss_obj,
1982 1982
1983 __set_bit(RAMROD_COMP_WAIT, &params.ramrod_flags); 1983 __set_bit(RAMROD_COMP_WAIT, &params.ramrod_flags);
1984 1984
1985 __set_bit(BNX2X_RSS_MODE_REGULAR, &params.rss_flags); 1985 if (enable) {
1986 1986 __set_bit(BNX2X_RSS_MODE_REGULAR, &params.rss_flags);
1987 /* RSS configuration */ 1987
1988 __set_bit(BNX2X_RSS_IPV4, &params.rss_flags); 1988 /* RSS configuration */
1989 __set_bit(BNX2X_RSS_IPV4_TCP, &params.rss_flags); 1989 __set_bit(BNX2X_RSS_IPV4, &params.rss_flags);
1990 __set_bit(BNX2X_RSS_IPV6, &params.rss_flags); 1990 __set_bit(BNX2X_RSS_IPV4_TCP, &params.rss_flags);
1991 __set_bit(BNX2X_RSS_IPV6_TCP, &params.rss_flags); 1991 __set_bit(BNX2X_RSS_IPV6, &params.rss_flags);
1992 if (rss_obj->udp_rss_v4) 1992 __set_bit(BNX2X_RSS_IPV6_TCP, &params.rss_flags);
1993 __set_bit(BNX2X_RSS_IPV4_UDP, &params.rss_flags); 1993 if (rss_obj->udp_rss_v4)
1994 if (rss_obj->udp_rss_v6) 1994 __set_bit(BNX2X_RSS_IPV4_UDP, &params.rss_flags);
1995 __set_bit(BNX2X_RSS_IPV6_UDP, &params.rss_flags); 1995 if (rss_obj->udp_rss_v6)
1996 __set_bit(BNX2X_RSS_IPV6_UDP, &params.rss_flags);
1997 } else {
1998 __set_bit(BNX2X_RSS_MODE_DISABLED, &params.rss_flags);
1999 }
1996 2000
1997 /* Hash bits */ 2001 /* Hash bits */
1998 params.rss_result_mask = MULTI_MASK; 2002 params.rss_result_mask = MULTI_MASK;
@@ -2001,11 +2005,14 @@ int bnx2x_config_rss_pf(struct bnx2x *bp, struct bnx2x_rss_config_obj *rss_obj,
2001 2005
2002 if (config_hash) { 2006 if (config_hash) {
2003 /* RSS keys */ 2007 /* RSS keys */
2004 prandom_bytes(params.rss_key, sizeof(params.rss_key)); 2008 prandom_bytes(params.rss_key, T_ETH_RSS_KEY * 4);
2005 __set_bit(BNX2X_RSS_SET_SRCH, &params.rss_flags); 2009 __set_bit(BNX2X_RSS_SET_SRCH, &params.rss_flags);
2006 } 2010 }
2007 2011
2008 return bnx2x_config_rss(bp, &params); 2012 if (IS_PF(bp))
2013 return bnx2x_config_rss(bp, &params);
2014 else
2015 return bnx2x_vfpf_config_rss(bp, &params);
2009} 2016}
2010 2017
2011static int bnx2x_init_hw(struct bnx2x *bp, u32 load_code) 2018static int bnx2x_init_hw(struct bnx2x *bp, u32 load_code)
@@ -2645,38 +2652,32 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
2645 2652
2646 /* initialize FW coalescing state machines in RAM */ 2653 /* initialize FW coalescing state machines in RAM */
2647 bnx2x_update_coalesce(bp); 2654 bnx2x_update_coalesce(bp);
2655 }
2648 2656
2649 /* setup the leading queue */ 2657 /* setup the leading queue */
2650 rc = bnx2x_setup_leading(bp); 2658 rc = bnx2x_setup_leading(bp);
2651 if (rc) { 2659 if (rc) {
2652 BNX2X_ERR("Setup leading failed!\n"); 2660 BNX2X_ERR("Setup leading failed!\n");
2653 LOAD_ERROR_EXIT(bp, load_error3); 2661 LOAD_ERROR_EXIT(bp, load_error3);
2654 } 2662 }
2655
2656 /* set up the rest of the queues */
2657 for_each_nondefault_eth_queue(bp, i) {
2658 rc = bnx2x_setup_queue(bp, &bp->fp[i], 0);
2659 if (rc) {
2660 BNX2X_ERR("Queue setup failed\n");
2661 LOAD_ERROR_EXIT(bp, load_error3);
2662 }
2663 }
2664 2663
2665 /* setup rss */ 2664 /* set up the rest of the queues */
2666 rc = bnx2x_init_rss_pf(bp); 2665 for_each_nondefault_eth_queue(bp, i) {
2666 if (IS_PF(bp))
2667 rc = bnx2x_setup_queue(bp, &bp->fp[i], false);
2668 else /* VF */
2669 rc = bnx2x_vfpf_setup_q(bp, &bp->fp[i], false);
2667 if (rc) { 2670 if (rc) {
2668 BNX2X_ERR("PF RSS init failed\n"); 2671 BNX2X_ERR("Queue %d setup failed\n", i);
2669 LOAD_ERROR_EXIT(bp, load_error3); 2672 LOAD_ERROR_EXIT(bp, load_error3);
2670 } 2673 }
2674 }
2671 2675
2672 } else { /* vf */ 2676 /* setup rss */
2673 for_each_eth_queue(bp, i) { 2677 rc = bnx2x_init_rss(bp);
2674 rc = bnx2x_vfpf_setup_q(bp, i); 2678 if (rc) {
2675 if (rc) { 2679 BNX2X_ERR("PF RSS init failed\n");
2676 BNX2X_ERR("Queue setup failed\n"); 2680 LOAD_ERROR_EXIT(bp, load_error3);
2677 LOAD_ERROR_EXIT(bp, load_error3);
2678 }
2679 }
2680 } 2681 }
2681 2682
2682 /* Now when Clients are configured we are ready to work */ 2683 /* Now when Clients are configured we are ready to work */
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h
index affb7646241e..da8fcaa74495 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h
@@ -105,9 +105,10 @@ void bnx2x_send_unload_done(struct bnx2x *bp, bool keep_link);
105 * @rss_obj: RSS object to use 105 * @rss_obj: RSS object to use
106 * @ind_table: indirection table to configure 106 * @ind_table: indirection table to configure
107 * @config_hash: re-configure RSS hash keys configuration 107 * @config_hash: re-configure RSS hash keys configuration
108 * @enable: enabled or disabled configuration
108 */ 109 */
109int bnx2x_config_rss_pf(struct bnx2x *bp, struct bnx2x_rss_config_obj *rss_obj, 110int bnx2x_rss(struct bnx2x *bp, struct bnx2x_rss_config_obj *rss_obj,
110 bool config_hash); 111 bool config_hash, bool enable);
111 112
112/** 113/**
113 * bnx2x__init_func_obj - init function object 114 * bnx2x__init_func_obj - init function object
@@ -980,7 +981,7 @@ static inline int func_by_vn(struct bnx2x *bp, int vn)
980 981
981static inline int bnx2x_config_rss_eth(struct bnx2x *bp, bool config_hash) 982static inline int bnx2x_config_rss_eth(struct bnx2x *bp, bool config_hash)
982{ 983{
983 return bnx2x_config_rss_pf(bp, &bp->rss_conf_obj, config_hash); 984 return bnx2x_rss(bp, &bp->rss_conf_obj, config_hash, true);
984} 985}
985 986
986/** 987/**
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
index c5f225101684..2612e3c715d4 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
@@ -3281,14 +3281,14 @@ static int bnx2x_set_rss_flags(struct bnx2x *bp, struct ethtool_rxnfc *info)
3281 DP(BNX2X_MSG_ETHTOOL, 3281 DP(BNX2X_MSG_ETHTOOL,
3282 "rss re-configured, UDP 4-tupple %s\n", 3282 "rss re-configured, UDP 4-tupple %s\n",
3283 udp_rss_requested ? "enabled" : "disabled"); 3283 udp_rss_requested ? "enabled" : "disabled");
3284 return bnx2x_config_rss_pf(bp, &bp->rss_conf_obj, 0); 3284 return bnx2x_rss(bp, &bp->rss_conf_obj, false, true);
3285 } else if ((info->flow_type == UDP_V6_FLOW) && 3285 } else if ((info->flow_type == UDP_V6_FLOW) &&
3286 (bp->rss_conf_obj.udp_rss_v6 != udp_rss_requested)) { 3286 (bp->rss_conf_obj.udp_rss_v6 != udp_rss_requested)) {
3287 bp->rss_conf_obj.udp_rss_v6 = udp_rss_requested; 3287 bp->rss_conf_obj.udp_rss_v6 = udp_rss_requested;
3288 DP(BNX2X_MSG_ETHTOOL, 3288 DP(BNX2X_MSG_ETHTOOL,
3289 "rss re-configured, UDP 4-tupple %s\n", 3289 "rss re-configured, UDP 4-tupple %s\n",
3290 udp_rss_requested ? "enabled" : "disabled"); 3290 udp_rss_requested ? "enabled" : "disabled");
3291 return bnx2x_config_rss_pf(bp, &bp->rss_conf_obj, 0); 3291 return bnx2x_rss(bp, &bp->rss_conf_obj, false, true);
3292 } 3292 }
3293 return 0; 3293 return 0;
3294 3294
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
index 5729aa7be1d0..c69990d2170e 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
@@ -8060,7 +8060,10 @@ int bnx2x_set_eth_mac(struct bnx2x *bp, bool set)
8060 8060
8061int bnx2x_setup_leading(struct bnx2x *bp) 8061int bnx2x_setup_leading(struct bnx2x *bp)
8062{ 8062{
8063 return bnx2x_setup_queue(bp, &bp->fp[0], 1); 8063 if (IS_PF(bp))
8064 return bnx2x_setup_queue(bp, &bp->fp[0], true);
8065 else /* VF */
8066 return bnx2x_vfpf_setup_q(bp, &bp->fp[0], true);
8064} 8067}
8065 8068
8066/** 8069/**
@@ -8074,8 +8077,10 @@ int bnx2x_set_int_mode(struct bnx2x *bp)
8074{ 8077{
8075 int rc = 0; 8078 int rc = 0;
8076 8079
8077 if (IS_VF(bp) && int_mode != BNX2X_INT_MODE_MSIX) 8080 if (IS_VF(bp) && int_mode != BNX2X_INT_MODE_MSIX) {
8081 BNX2X_ERR("VF not loaded since interrupt mode not msix\n");
8078 return -EINVAL; 8082 return -EINVAL;
8083 }
8079 8084
8080 switch (int_mode) { 8085 switch (int_mode) {
8081 case BNX2X_INT_MODE_MSIX: 8086 case BNX2X_INT_MODE_MSIX:
@@ -11658,9 +11663,11 @@ static int bnx2x_init_bp(struct bnx2x *bp)
11658 * second status block for the L2 queue, and a third status block for 11663 * second status block for the L2 queue, and a third status block for
11659 * CNIC if supported. 11664 * CNIC if supported.
11660 */ 11665 */
11661 if (CNIC_SUPPORT(bp)) 11666 if (IS_VF(bp))
11667 bp->min_msix_vec_cnt = 1;
11668 else if (CNIC_SUPPORT(bp))
11662 bp->min_msix_vec_cnt = 3; 11669 bp->min_msix_vec_cnt = 3;
11663 else 11670 else /* PF w/o cnic */
11664 bp->min_msix_vec_cnt = 2; 11671 bp->min_msix_vec_cnt = 2;
11665 BNX2X_DEV_INFO("bp->min_msix_vec_cnt %d", bp->min_msix_vec_cnt); 11672 BNX2X_DEV_INFO("bp->min_msix_vec_cnt %d", bp->min_msix_vec_cnt);
11666 11673
@@ -12571,8 +12578,7 @@ static int bnx2x_set_qm_cid_count(struct bnx2x *bp)
12571 * @dev: pci device 12578 * @dev: pci device
12572 * 12579 *
12573 */ 12580 */
12574static int bnx2x_get_num_non_def_sbs(struct pci_dev *pdev, 12581static int bnx2x_get_num_non_def_sbs(struct pci_dev *pdev, int cnic_cnt)
12575 int cnic_cnt, bool is_vf)
12576{ 12582{
12577 int index; 12583 int index;
12578 u16 control = 0; 12584 u16 control = 0;
@@ -12598,7 +12604,7 @@ static int bnx2x_get_num_non_def_sbs(struct pci_dev *pdev,
12598 12604
12599 index = control & PCI_MSIX_FLAGS_QSIZE; 12605 index = control & PCI_MSIX_FLAGS_QSIZE;
12600 12606
12601 return is_vf ? index + 1 : index; 12607 return index;
12602} 12608}
12603 12609
12604static int set_max_cos_est(int chip_id) 12610static int set_max_cos_est(int chip_id)
@@ -12678,10 +12684,13 @@ static int bnx2x_init_one(struct pci_dev *pdev,
12678 is_vf = set_is_vf(ent->driver_data); 12684 is_vf = set_is_vf(ent->driver_data);
12679 cnic_cnt = is_vf ? 0 : 1; 12685 cnic_cnt = is_vf ? 0 : 1;
12680 12686
12681 max_non_def_sbs = bnx2x_get_num_non_def_sbs(pdev, cnic_cnt, is_vf); 12687 max_non_def_sbs = bnx2x_get_num_non_def_sbs(pdev, cnic_cnt);
12688
12689 /* add another SB for VF as it has no default SB */
12690 max_non_def_sbs += is_vf ? 1 : 0;
12682 12691
12683 /* Maximum number of RSS queues: one IGU SB goes to CNIC */ 12692 /* Maximum number of RSS queues: one IGU SB goes to CNIC */
12684 rss_count = is_vf ? 1 : max_non_def_sbs - cnic_cnt; 12693 rss_count = max_non_def_sbs - cnic_cnt;
12685 12694
12686 if (rss_count < 1) 12695 if (rss_count < 1)
12687 return -EINVAL; 12696 return -EINVAL;
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.h
index 8e9847fef861..2a8c1dc65d9c 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.h
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.h
@@ -746,9 +746,12 @@ int bnx2x_vfpf_release(struct bnx2x *bp);
746int bnx2x_vfpf_release(struct bnx2x *bp); 746int bnx2x_vfpf_release(struct bnx2x *bp);
747int bnx2x_vfpf_init(struct bnx2x *bp); 747int bnx2x_vfpf_init(struct bnx2x *bp);
748void bnx2x_vfpf_close_vf(struct bnx2x *bp); 748void bnx2x_vfpf_close_vf(struct bnx2x *bp);
749int bnx2x_vfpf_setup_q(struct bnx2x *bp, int fp_idx); 749int bnx2x_vfpf_setup_q(struct bnx2x *bp, struct bnx2x_fastpath *fp,
750 bool is_leading);
750int bnx2x_vfpf_teardown_queue(struct bnx2x *bp, int qidx); 751int bnx2x_vfpf_teardown_queue(struct bnx2x *bp, int qidx);
751int bnx2x_vfpf_config_mac(struct bnx2x *bp, u8 *addr, u8 vf_qid, bool set); 752int bnx2x_vfpf_config_mac(struct bnx2x *bp, u8 *addr, u8 vf_qid, bool set);
753int bnx2x_vfpf_config_rss(struct bnx2x *bp,
754 struct bnx2x_config_rss_params *params);
752int bnx2x_vfpf_set_mcast(struct net_device *dev); 755int bnx2x_vfpf_set_mcast(struct net_device *dev);
753int bnx2x_vfpf_storm_rx_mode(struct bnx2x *bp); 756int bnx2x_vfpf_storm_rx_mode(struct bnx2x *bp);
754 757
@@ -809,7 +812,7 @@ static inline int bnx2x_vfpf_acquire(struct bnx2x *bp,
809static inline int bnx2x_vfpf_release(struct bnx2x *bp) {return 0; } 812static inline int bnx2x_vfpf_release(struct bnx2x *bp) {return 0; }
810static inline int bnx2x_vfpf_init(struct bnx2x *bp) {return 0; } 813static inline int bnx2x_vfpf_init(struct bnx2x *bp) {return 0; }
811static inline void bnx2x_vfpf_close_vf(struct bnx2x *bp) {} 814static inline void bnx2x_vfpf_close_vf(struct bnx2x *bp) {}
812static inline int bnx2x_vfpf_setup_q(struct bnx2x *bp, int fp_idx) {return 0; } 815static inline int bnx2x_vfpf_setup_q(struct bnx2x *bp, struct bnx2x_fastpath *fp, bool is_leading) {return 0; }
813static inline int bnx2x_vfpf_teardown_queue(struct bnx2x *bp, int qidx) {return 0; } 816static inline int bnx2x_vfpf_teardown_queue(struct bnx2x *bp, int qidx) {return 0; }
814static inline int bnx2x_vfpf_config_mac(struct bnx2x *bp, u8 *addr, 817static inline int bnx2x_vfpf_config_mac(struct bnx2x *bp, u8 *addr,
815 u8 vf_qid, bool set) {return 0; } 818 u8 vf_qid, bool set) {return 0; }
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c
index a7e88a405a43..6cfb88732452 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c
@@ -379,6 +379,8 @@ int bnx2x_vfpf_init(struct bnx2x *bp)
379 req->stats_addr = bp->fw_stats_data_mapping + 379 req->stats_addr = bp->fw_stats_data_mapping +
380 offsetof(struct bnx2x_fw_stats_data, queue_stats); 380 offsetof(struct bnx2x_fw_stats_data, queue_stats);
381 381
382 req->stats_stride = sizeof(struct per_queue_stats);
383
382 /* add list termination tlv */ 384 /* add list termination tlv */
383 bnx2x_add_tlv(bp, req, req->first_tlv.tl.length, CHANNEL_TLV_LIST_END, 385 bnx2x_add_tlv(bp, req, req->first_tlv.tl.length, CHANNEL_TLV_LIST_END,
384 sizeof(struct channel_list_end_tlv)); 386 sizeof(struct channel_list_end_tlv));
@@ -506,11 +508,12 @@ static void bnx2x_leading_vfq_init(struct bnx2x *bp, struct bnx2x_virtf *vf,
506} 508}
507 509
508/* ask the pf to open a queue for the vf */ 510/* ask the pf to open a queue for the vf */
509int bnx2x_vfpf_setup_q(struct bnx2x *bp, int fp_idx) 511int bnx2x_vfpf_setup_q(struct bnx2x *bp, struct bnx2x_fastpath *fp,
512 bool is_leading)
510{ 513{
511 struct vfpf_setup_q_tlv *req = &bp->vf2pf_mbox->req.setup_q; 514 struct vfpf_setup_q_tlv *req = &bp->vf2pf_mbox->req.setup_q;
512 struct pfvf_general_resp_tlv *resp = &bp->vf2pf_mbox->resp.general_resp; 515 struct pfvf_general_resp_tlv *resp = &bp->vf2pf_mbox->resp.general_resp;
513 struct bnx2x_fastpath *fp = &bp->fp[fp_idx]; 516 u8 fp_idx = fp->index;
514 u16 tpa_agg_size = 0, flags = 0; 517 u16 tpa_agg_size = 0, flags = 0;
515 int rc; 518 int rc;
516 519
@@ -526,6 +529,9 @@ int bnx2x_vfpf_setup_q(struct bnx2x *bp, int fp_idx)
526 tpa_agg_size = TPA_AGG_SIZE; 529 tpa_agg_size = TPA_AGG_SIZE;
527 } 530 }
528 531
532 if (is_leading)
533 flags |= VFPF_QUEUE_FLG_LEADING_RSS;
534
529 /* calculate queue flags */ 535 /* calculate queue flags */
530 flags |= VFPF_QUEUE_FLG_STATS; 536 flags |= VFPF_QUEUE_FLG_STATS;
531 flags |= VFPF_QUEUE_FLG_CACHE_ALIGN; 537 flags |= VFPF_QUEUE_FLG_CACHE_ALIGN;
@@ -699,6 +705,71 @@ out:
699 return 0; 705 return 0;
700} 706}
701 707
708/* request pf to config rss table for vf queues*/
709int bnx2x_vfpf_config_rss(struct bnx2x *bp,
710 struct bnx2x_config_rss_params *params)
711{
712 struct pfvf_general_resp_tlv *resp = &bp->vf2pf_mbox->resp.general_resp;
713 struct vfpf_rss_tlv *req = &bp->vf2pf_mbox->req.update_rss;
714 int rc = 0;
715
716 /* clear mailbox and prep first tlv */
717 bnx2x_vfpf_prep(bp, &req->first_tlv, CHANNEL_TLV_UPDATE_RSS,
718 sizeof(*req));
719
720 /* add list termination tlv */
721 bnx2x_add_tlv(bp, req, req->first_tlv.tl.length, CHANNEL_TLV_LIST_END,
722 sizeof(struct channel_list_end_tlv));
723
724 memcpy(req->ind_table, params->ind_table, T_ETH_INDIRECTION_TABLE_SIZE);
725 memcpy(req->rss_key, params->rss_key, sizeof(params->rss_key));
726 req->ind_table_size = T_ETH_INDIRECTION_TABLE_SIZE;
727 req->rss_key_size = T_ETH_RSS_KEY;
728 req->rss_result_mask = params->rss_result_mask;
729
730 /* flags handled individually for backward/forward compatability */
731 if (params->rss_flags & (1 << BNX2X_RSS_MODE_DISABLED))
732 req->rss_flags |= VFPF_RSS_MODE_DISABLED;
733 if (params->rss_flags & (1 << BNX2X_RSS_MODE_REGULAR))
734 req->rss_flags |= VFPF_RSS_MODE_REGULAR;
735 if (params->rss_flags & (1 << BNX2X_RSS_SET_SRCH))
736 req->rss_flags |= VFPF_RSS_SET_SRCH;
737 if (params->rss_flags & (1 << BNX2X_RSS_IPV4))
738 req->rss_flags |= VFPF_RSS_IPV4;
739 if (params->rss_flags & (1 << BNX2X_RSS_IPV4_TCP))
740 req->rss_flags |= VFPF_RSS_IPV4_TCP;
741 if (params->rss_flags & (1 << BNX2X_RSS_IPV4_UDP))
742 req->rss_flags |= VFPF_RSS_IPV4_UDP;
743 if (params->rss_flags & (1 << BNX2X_RSS_IPV6))
744 req->rss_flags |= VFPF_RSS_IPV6;
745 if (params->rss_flags & (1 << BNX2X_RSS_IPV6_TCP))
746 req->rss_flags |= VFPF_RSS_IPV6_TCP;
747 if (params->rss_flags & (1 << BNX2X_RSS_IPV6_UDP))
748 req->rss_flags |= VFPF_RSS_IPV6_UDP;
749
750 DP(BNX2X_MSG_IOV, "rss flags %x\n", req->rss_flags);
751
752 /* output tlvs list */
753 bnx2x_dp_tlv_list(bp, req);
754
755 /* send message to pf */
756 rc = bnx2x_send_msg2pf(bp, &resp->hdr.status, bp->vf2pf_mbox_mapping);
757 if (rc) {
758 BNX2X_ERR("failed to send message to pf. rc was %d\n", rc);
759 goto out;
760 }
761
762 if (resp->hdr.status != PFVF_STATUS_SUCCESS) {
763 BNX2X_ERR("failed to send rss message to PF over Vf PF channel %d\n",
764 resp->hdr.status);
765 rc = -EINVAL;
766 }
767out:
768 bnx2x_vfpf_finalize(bp, &req->first_tlv);
769
770 return 0;
771}
772
702int bnx2x_vfpf_set_mcast(struct net_device *dev) 773int bnx2x_vfpf_set_mcast(struct net_device *dev)
703{ 774{
704 struct bnx2x *bp = netdev_priv(dev); 775 struct bnx2x *bp = netdev_priv(dev);