* [PATCH net-next] qed: Reimplement qed_mcast_bin_from_mac() using library functions
@ 2026-03-16 22:14 Eric Biggers
2026-03-19 2:30 ` patchwork-bot+netdevbpf
0 siblings, 1 reply; 2+ messages in thread
From: Eric Biggers @ 2026-03-16 22:14 UTC (permalink / raw)
To: Andrew Lunn, David S . Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, netdev
Cc: linux-kernel, Eric Biggers
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
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH net-next] qed: Reimplement qed_mcast_bin_from_mac() using library functions
2026-03-16 22:14 [PATCH net-next] qed: Reimplement qed_mcast_bin_from_mac() using library functions Eric Biggers
@ 2026-03-19 2:30 ` patchwork-bot+netdevbpf
0 siblings, 0 replies; 2+ messages in thread
From: patchwork-bot+netdevbpf @ 2026-03-19 2:30 UTC (permalink / raw)
To: Eric Biggers
Cc: andrew+netdev, davem, edumazet, kuba, pabeni, netdev,
linux-kernel
Hello:
This patch was applied to netdev/net-next.git (main)
by Jakub Kicinski <kuba@kernel.org>:
On Mon, 16 Mar 2026 15:14:53 -0700 you wrote:
> 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.
>
> [...]
Here is the summary with links:
- [net-next] qed: Reimplement qed_mcast_bin_from_mac() using library functions
https://git.kernel.org/netdev/net-next/c/d5516452a362
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-03-19 2:30 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-16 22:14 [PATCH net-next] qed: Reimplement qed_mcast_bin_from_mac() using library functions Eric Biggers
2026-03-19 2:30 ` patchwork-bot+netdevbpf
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox