bnx2x: support classification config query
authorAriel Elior <ariele@broadcom.com>
Mon, 5 Dec 2011 21:52:24 +0000 (21:52 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 6 Dec 2011 18:06:05 +0000 (13:06 -0500)
To support copying MAC addresses to firmware query structure.

[ Fixed up style and formatting errors noted by DaveM and Joe Perches ]

Signed-off-by: Ariel Elior <ariele@broadcom.com>
Signed-off-by: Barak Witkowski <barak@broadcom.com>
Signed-off-by: Eilon Greenstein <eilong@broadcom.com>
Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h

index a34362e..5ac6160 100644 (file)
@@ -30,6 +30,8 @@
 
 #define BNX2X_MAX_EMUL_MULTI           16
 
+#define MAC_LEADING_ZERO_CNT (ALIGN(ETH_ALEN, sizeof(u32)) - ETH_ALEN)
+
 /**** Exe Queue interfaces ****/
 
 /**
@@ -441,6 +443,36 @@ static bool bnx2x_put_credit_vlan_mac(struct bnx2x_vlan_mac_obj *o)
        return true;
 }
 
+static int bnx2x_get_n_elements(struct bnx2x *bp, struct bnx2x_vlan_mac_obj *o,
+                               int n, u8 *buf)
+{
+       struct bnx2x_vlan_mac_registry_elem *pos;
+       u8 *next = buf;
+       int counter = 0;
+
+       /* traverse list */
+       list_for_each_entry(pos, &o->head, link) {
+               if (counter < n) {
+                       /* place leading zeroes in buffer */
+                       memset(next, 0, MAC_LEADING_ZERO_CNT);
+
+                       /* place mac after leading zeroes*/
+                       memcpy(next + MAC_LEADING_ZERO_CNT, pos->u.mac.mac,
+                              ETH_ALEN);
+
+                       /* calculate address of next element and
+                        * advance counter
+                        */
+                       counter++;
+                       next = buf + counter * ALIGN(ETH_ALEN, sizeof(u32));
+
+                       DP(BNX2X_MSG_SP, "copied element number %d to address %p element was %pM\n",
+                          counter, next, pos->u.mac.mac);
+               }
+       }
+       return counter * ETH_ALEN;
+}
+
 /* check_add() callbacks */
 static int bnx2x_check_mac_add(struct bnx2x_vlan_mac_obj *o,
                               union bnx2x_classification_ramrod_data *data)
@@ -1886,6 +1918,7 @@ void bnx2x_init_mac_obj(struct bnx2x *bp,
                mac_obj->check_move        = bnx2x_check_move;
                mac_obj->ramrod_cmd        =
                        RAMROD_CMD_ID_ETH_CLASSIFICATION_RULES;
+               mac_obj->get_n_elements    = bnx2x_get_n_elements;
 
                /* Exe Queue */
                bnx2x_exe_queue_init(bp,
index 9a517c2..992308f 100644 (file)
@@ -285,6 +285,19 @@ struct bnx2x_vlan_mac_obj {
        /* RAMROD command to be used */
        int                             ramrod_cmd;
 
+       /* copy first n elements onto preallocated buffer
+        *
+        * @param n number of elements to get
+        * @param buf buffer preallocated by caller into which elements
+        *            will be copied. Note elements are 4-byte aligned
+        *            so buffer size must be able to accomodate the
+        *            aligned elements.
+        *
+        * @return number of copied bytes
+        */
+       int (*get_n_elements)(struct bnx2x *bp, struct bnx2x_vlan_mac_obj *o,
+                             int n, u8 *buf);
+
        /**
         * Checks if ADD-ramrod with the given params may be performed.
         *