bnx2x: ETS changes
authorYaniv Rosner <yanivr@broadcom.com>
Mon, 28 Nov 2011 00:49:46 +0000 (00:49 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 29 Nov 2011 00:02:22 +0000 (19:02 -0500)
Fix a problem when new traffic class is created with 0% BW, the ETS is not conforming.

Signed-off-by: Yaniv Rosner <yanivr@broadcom.com>
Signed-off-by: Eilon Greenstein <eilong@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h

index 8e6909a6a2c6bfa299fa1191fcc280159a90b8e4..de03730ae5607e73a0a52708146f52406a5042cc 100644 (file)
@@ -874,23 +874,36 @@ static int bnx2x_ets_e3b0_set_cos_bw(struct bnx2x *bp,
 ******************************************************************************/
 static int bnx2x_ets_e3b0_get_total_bw(
        const struct link_params *params,
-       const struct bnx2x_ets_params *ets_params,
+       struct bnx2x_ets_params *ets_params,
        u16 *total_bw)
 {
        struct bnx2x *bp = params->bp;
        u8 cos_idx = 0;
+       u8 is_bw_cos_exist = 0;
 
        *total_bw = 0 ;
+
        /* Calculate total BW requested */
        for (cos_idx = 0; cos_idx < ets_params->num_of_cos; cos_idx++) {
                if (bnx2x_cos_state_bw == ets_params->cos[cos_idx].state) {
+                       is_bw_cos_exist = 1;
+                       if (!ets_params->cos[cos_idx].params.bw_params.bw) {
+                               DP(NETIF_MSG_LINK, "bnx2x_ets_E3B0_config BW"
+                                                  "was set to 0\n");
+                               /*
+                                * This is to prevent a state when ramrods
+                                * can't be sent
+                               */
+                               ets_params->cos[cos_idx].params.bw_params.bw
+                                        = 1;
+                       }
                        *total_bw +=
                                ets_params->cos[cos_idx].params.bw_params.bw;
                }
        }
 
        /* Check total BW is valid */
-       if ((100 != *total_bw) || (0 == *total_bw)) {
+       if ((1 == is_bw_cos_exist) && (100 != *total_bw)) {
                if (0 == *total_bw) {
                        DP(NETIF_MSG_LINK,
                           "bnx2x_ets_E3B0_config toatl BW shouldn't be 0\n");
@@ -1100,7 +1113,7 @@ static int bnx2x_ets_e3b0_sp_set_pri_cli_reg(const struct link_params *params,
 ******************************************************************************/
 int bnx2x_ets_e3b0_config(const struct link_params *params,
                         const struct link_vars *vars,
-                        const struct bnx2x_ets_params *ets_params)
+                        struct bnx2x_ets_params *ets_params)
 {
        struct bnx2x *bp = params->bp;
        int bnx2x_status = 0;
index 2a46e633abe9c7992566c2e0fe0b89fa32816d8c..e02a68a7fb85f112953384bb96154547f8a8c2d5 100644 (file)
@@ -479,7 +479,7 @@ int bnx2x_ets_strict(const struct link_params *params, const u8 strict_cos);
 /*  Configure the COS to ETS according to BW and SP settings.*/
 int bnx2x_ets_e3b0_config(const struct link_params *params,
                         const struct link_vars *vars,
-                        const struct bnx2x_ets_params *ets_params);
+                        struct bnx2x_ets_params *ets_params);
 /* Read pfc statistic*/
 void bnx2x_pfc_statistic(struct link_params *params, struct link_vars *vars,
                                                 u32 pfc_frames_sent[2],