ixgbe: Simplify logic for getting traffic class from user priority
authorAlexander Duyck <alexander.h.duyck@intel.com>
Thu, 17 May 2012 05:14:34 +0000 (05:14 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Sat, 14 Jul 2012 21:18:29 +0000 (14:18 -0700)
This patch is meant to help simplify the logic for getting traffic classes
from user priorities. To do this I am adding a function named
ixgbe_dcb_get_tc_from_up that will go through the traffic classes in
reverse order in order to determine which traffic class contains a bit for
a given user priority.

Adding a declaration for this new function to the header so that
we have a centralized means for sorting out traffic classes belonging to
features such as FCoE.

Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com>
Tested-by: Ross Brattain <ross.b.brattain@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ixgbe/ixgbe_dcb.c

index 8bfaaee5ac5b58964a70e54f39c7e21d041178b6..4fd5a0d1e129f0cb510ab4134b61fd407b6bab16 100644 (file)
@@ -231,16 +231,32 @@ void ixgbe_dcb_unpack_prio(struct ixgbe_dcb_config *cfg, int direction,
        }
 }
 
-void ixgbe_dcb_unpack_map(struct ixgbe_dcb_config *cfg, int direction, u8 *map)
+static u8 ixgbe_dcb_get_tc_from_up(struct ixgbe_dcb_config *cfg,
+                                  int direction, u8 up)
 {
-       int i, up;
-       unsigned long bitmap;
+       struct tc_configuration *tc_config = &cfg->tc_config[0];
+       u8 prio_mask = 1 << up;
+       u8 tc;
 
-       for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
-               bitmap = cfg->tc_config[i].path[direction].up_to_tc_bitmap;
-               for_each_set_bit(up, &bitmap, MAX_USER_PRIORITY)
-                       map[up] = i;
+       /*
+        * Test for TCs 7 through 1 and report the first match we find.  If
+        * we find no match we can assume that the TC is 0 since the TC must
+        * be set for all user priorities
+        */
+       for (tc = MAX_TRAFFIC_CLASS - 1; tc; tc--) {
+               if (prio_mask & tc_config[tc].path[direction].up_to_tc_bitmap)
+                       break;
        }
+
+       return tc;
+}
+
+void ixgbe_dcb_unpack_map(struct ixgbe_dcb_config *cfg, int direction, u8 *map)
+{
+       u8 up;
+
+       for (up = 0; up < MAX_USER_PRIORITY; up++)
+               map[up] = ixgbe_dcb_get_tc_from_up(cfg, direction, up);
 }
 
 /**