public inbox for netdev@vger.kernel.org
 help / color / mirror / Atom feed
From: Eric Biggers <ebiggers@kernel.org>
To: Andrew Lunn <andrew+netdev@lunn.ch>,
	"David S . Miller" <davem@davemloft.net>,
	Eric Dumazet <edumazet@google.com>,
	Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
	netdev@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, Eric Biggers <ebiggers@kernel.org>
Subject: [PATCH net-next] qed: Reimplement qed_mcast_bin_from_mac() using library functions
Date: Mon, 16 Mar 2026 15:14:53 -0700	[thread overview]
Message-ID: <20260316221453.66078-1-ebiggers@kernel.org> (raw)

The calculation done by qed_calc_crc32c() is the standard
least-significant-bit-first CRC-32C except it uses
most-significant-bit-first order for the actual CRC variable.  That is
equivalent to bit-reflecting the input and output CRC.  Replace it with
equivalent calls to the corresponding library functions.

Tested with a simple userspace program which tested that the old and new
implementations of qed_mcast_bin_from_mac() produce the same outputs.

Signed-off-by: Eric Biggers <ebiggers@kernel.org>
---
 drivers/net/ethernet/qlogic/qed/qed_l2.c | 53 +++++-------------------
 1 file changed, 11 insertions(+), 42 deletions(-)

diff --git a/drivers/net/ethernet/qlogic/qed/qed_l2.c b/drivers/net/ethernet/qlogic/qed/qed_l2.c
index 0f6905e33df6..2d873a596261 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_l2.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_l2.c
@@ -5,10 +5,11 @@
  */
 
 #include <linux/types.h>
 #include <asm/byteorder.h>
 #include <asm/param.h>
+#include <linux/crc32.h>
 #include <linux/delay.h>
 #include <linux/dma-mapping.h>
 #include <linux/etherdevice.h>
 #include <linux/interrupt.h>
 #include <linux/kernel.h>
@@ -37,11 +38,10 @@
 #include "qed_reg_addr.h"
 #include "qed_sp.h"
 #include "qed_sriov.h"
 
 #define QED_MAX_SGES_NUM 16
-#define CRC32_POLY 0x1edc6f41
 
 struct qed_l2_info {
 	u32 queues;
 	unsigned long **pp_qid_usage;
 
@@ -1410,54 +1410,23 @@ int qed_sp_eth_filter_ucast(struct qed_hwfn *p_hwfn,
 		   p_filter_cmd->vlan);
 
 	return 0;
 }
 
-/*******************************************************************************
- * Description:
- *         Calculates crc 32 on a buffer
- *         Note: crc32_length MUST be aligned to 8
- * Return:
- ******************************************************************************/
-static u32 qed_calc_crc32c(u8 *crc32_packet,
-			   u32 crc32_length, u32 crc32_seed, u8 complement)
-{
-	u32 byte = 0, bit = 0, crc32_result = crc32_seed;
-	u8 msb = 0, current_byte = 0;
-
-	if ((!crc32_packet) ||
-	    (crc32_length == 0) ||
-	    ((crc32_length % 8) != 0))
-		return crc32_result;
-	for (byte = 0; byte < crc32_length; byte++) {
-		current_byte = crc32_packet[byte];
-		for (bit = 0; bit < 8; bit++) {
-			msb = (u8)(crc32_result >> 31);
-			crc32_result = crc32_result << 1;
-			if (msb != (0x1 & (current_byte >> bit))) {
-				crc32_result = crc32_result ^ CRC32_POLY;
-				crc32_result |= 1; /*crc32_result[0] = 1;*/
-			}
-		}
-	}
-	return crc32_result;
-}
-
-static u32 qed_crc32c_le(u32 seed, u8 *mac, u32 len)
-{
-	u32 packet_buf[2] = { 0 };
-
-	memcpy((u8 *)(&packet_buf[0]), &mac[0], 6);
-	return qed_calc_crc32c((u8 *)packet_buf, 8, seed, 0);
-}
-
 u8 qed_mcast_bin_from_mac(u8 *mac)
 {
-	u32 crc = qed_crc32c_le(ETH_MULTICAST_BIN_FROM_MAC_SEED,
-				mac, ETH_ALEN);
+	u8 padded_mac[8] = {};
+	u32 crc;
 
-	return crc & 0xff;
+	memcpy(padded_mac, mac, ETH_ALEN);
+	/*
+	 * This uses the standard CRC-32C, but with the input and output CRCs
+	 * bit-reflected and the bit-reflected output CRC truncated to 8 bits.
+	 */
+	crc = crc32c(bitrev32(ETH_MULTICAST_BIN_FROM_MAC_SEED), padded_mac,
+		     sizeof(padded_mac));
+	return bitrev8(crc >> 24);
 }
 
 static int
 qed_sp_eth_filter_mcast(struct qed_hwfn *p_hwfn,
 			u16 opaque_fid,

base-commit: 5446b8691eb8278f10deca92048fad84ffd1e4d5
-- 
2.53.0


             reply	other threads:[~2026-03-16 22:16 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-16 22:14 Eric Biggers [this message]
2026-03-19  2:30 ` [PATCH net-next] qed: Reimplement qed_mcast_bin_from_mac() using library functions patchwork-bot+netdevbpf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260316221453.66078-1-ebiggers@kernel.org \
    --to=ebiggers@kernel.org \
    --cc=andrew+netdev@lunn.ch \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox