lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250617151150.GL5000@horms.kernel.org>
Date: Tue, 17 Jun 2025 16:11:50 +0100
From: Simon Horman <horms@...nel.org>
To: Mengyuan Lou <mengyuanlou@...-swift.com>
Cc: netdev@...r.kernel.org, kuba@...nel.org, pabeni@...hat.com,
	andrew+netdev@...n.ch, duanqiangwen@...-swift.com,
	linglingzhang@...stnetic.com, jiawenwu@...-swift.com
Subject: Re: [PATCH net-next 03/12] net: libwx: add wangxun vf common api

On Wed, Jun 11, 2025 at 04:35:50PM +0800, Mengyuan Lou wrote:
> Add common wx_configure_vf and wx_set_mac_vf for
> ngbevf and txgbevf.
> 
> Signed-off-by: Mengyuan Lou <mengyuanlou@...-swift.com>

...

> diff --git a/drivers/net/ethernet/wangxun/libwx/wx_vf.h b/drivers/net/ethernet/wangxun/libwx/wx_vf.h

...

> +#define WX_VXMRQC_PSR(f)         FIELD_PREP(GENMASK(5, 1), f)
> +#define WX_VXMRQC_PSR_MASK       GENMASK(5, 1)
> +#define WX_VXMRQC_PSR_L4HDR      BIT(0)
> +#define WX_VXMRQC_PSR_L3HDR      BIT(1)
> +#define WX_VXMRQC_PSR_L2HDR      BIT(2)
> +#define WX_VXMRQC_PSR_TUNHDR     BIT(3)
> +#define WX_VXMRQC_PSR_TUNMAC     BIT(4)

...

> diff --git a/drivers/net/ethernet/wangxun/libwx/wx_vf_lib.c b/drivers/net/ethernet/wangxun/libwx/wx_vf_lib.c

...

> +/**
> + * wx_configure_tx_ring_vf - Configure Tx ring after Reset
> + * @wx: board private structure
> + * @ring: structure containing ring specific data
> + *
> + * Configure the Tx descriptor ring after a reset.
> + **/
> +static void wx_configure_tx_ring_vf(struct wx *wx, struct wx_ring *ring)
> +{
> +	u8 reg_idx = ring->reg_idx;
> +	u64 tdba = ring->dma;
> +	u32 txdctl = 0;
> +	int ret;
> +
> +	/* disable queue to avoid issues while updating state */
> +	wr32(wx, WX_VXTXDCTL(reg_idx), WX_VXTXDCTL_FLUSH);
> +	wr32(wx, WX_VXTDBAL(reg_idx), tdba & DMA_BIT_MASK(32));
> +	wr32(wx, WX_VXTDBAH(reg_idx), tdba >> 32);
> +
> +	/* enable relaxed ordering */
> +	pcie_capability_clear_and_set_word(wx->pdev, PCI_EXP_DEVCTL,
> +					   0, PCI_EXP_DEVCTL_RELAX_EN);
> +
> +	/* reset head and tail pointers */
> +	wr32(wx, WX_VXTDH(reg_idx), 0);
> +	wr32(wx, WX_VXTDT(reg_idx), 0);
> +	ring->tail = wx->hw_addr + WX_VXTDT(reg_idx);
> +
> +	/* reset ntu and ntc to place SW in sync with hardwdare */

nit: hardware

> +	ring->next_to_clean = 0;
> +	ring->next_to_use = 0;
> +
> +	txdctl |= WX_VXTXDCTL_BUFLEN(wx_buf_len(ring->count));
> +	txdctl |= WX_VXTXDCTL_ENABLE;
> +
> +	/* set WTHRESH to encourage burst writeback, it should not be set
> +	 * higher than 1 when ITR is 0 as it could cause false TX hangs
> +	 *
> +	 * In order to avoid issues WTHRESH + PTHRESH should always be equal
> +	 * to or less than the number of on chip descriptors, which is
> +	 * currently 40.
> +	 */
> +	/* reinitialize tx_buffer_info */
> +	memset(ring->tx_buffer_info, 0,
> +	       sizeof(struct wx_tx_buffer) * ring->count);
> +
> +	wr32(wx, WX_VXTXDCTL(reg_idx), txdctl);
> +	/* poll to verify queue is enabled */
> +	ret = read_poll_timeout(rd32, txdctl, txdctl & WX_VXTXDCTL_ENABLE,
> +				1000, 10000, true, wx, WX_VXTXDCTL(reg_idx));
> +	if (ret == -ETIMEDOUT)
> +		wx_err(wx, "Could not enable Tx Queue %d\n", reg_idx);
> +}

...

> +void wx_setup_psrtype_vf(struct wx *wx)
> +{
> +	/* PSRTYPE must be initialized */
> +	u32 psrtype = WX_VXMRQC_PSR_L2HDR |
> +		      WX_VXMRQC_PSR_L3HDR |
> +		      WX_VXMRQC_PSR_L4HDR |
> +		      WX_VXMRQC_PSR_TUNHDR |
> +		      WX_VXMRQC_PSR_TUNMAC;
> +
> +	if (wx->num_rx_queues > 1)
> +		psrtype |= BIT(14);

Here bit 14 of psrtype may be set (what is bit 14?).

> +
> +	wr32m(wx, WX_VXMRQC, WX_VXMRQC_PSR_MASK, WX_VXMRQC_PSR(psrtype));

But WX_VXMRQC_PSR() uses a mask that limits psrtype to 5 bits.

This is flagged by W=1 builds with gcc-8.5.0 on x86_64
(but curiously not gcc-15.1.0 builds). It is flagged like this:

  CC [M]  drivers/net/ethernet/wangxun/libwx/wx_vf_lib.o
In file included from <command-line>:
drivers/net/ethernet/wangxun/libwx/wx_vf_lib.c: In function 'wx_setup_psrtype_vf':
././include/linux/compiler_types.h:568:38: error: call to '__compiletime_assert_1833' declared with attribute error: FIELD_PREP: value too large for the field
  _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
                                      ^
././include/linux/compiler_types.h:549:4: note: in definition of macro '__compiletime_assert'
    prefix ## suffix();    \
    ^~~~~~
././include/linux/compiler_types.h:568:2: note: in expansion of macro '_compiletime_assert'
  _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
  ^~~~~~~~~~~~~~~~~~~
./include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert'
 #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
                                     ^~~~~~~~~~~~~~~~~~
./include/linux/bitfield.h:68:3: note: in expansion of macro 'BUILD_BUG_ON_MSG'
   BUILD_BUG_ON_MSG(__builtin_constant_p(_val) ?  \
   ^~~~~~~~~~~~~~~~
./include/linux/bitfield.h:115:3: note: in expansion of macro '__BF_FIELD_CHECK'
   __BF_FIELD_CHECK(_mask, 0ULL, _val, "FIELD_PREP: "); \
   ^~~~~~~~~~~~~~~~
drivers/net/ethernet/wangxun/libwx/wx_vf.h:73:34: note: in expansion of macro 'FIELD_PREP'
 #define WX_VXMRQC_PSR(f)         FIELD_PREP(GENMASK(5, 1), f)
                                  ^~~~~~~~~~
drivers/net/ethernet/wangxun/libwx/wx_vf_lib.c:195:43: note: in expansion of macro 'WX_VXMRQC_PSR'
  wr32m(wx, WX_VXMRQC, WX_VXMRQC_PSR_MASK, WX_VXMRQC_PSR(psrtype));
                                           ^~~~~~~~~~~~~
make[7]: *** [scripts/Makefile.build:203:
drivers/net/ethernet/wangxun/libwx/wx_vf_lib.o] Error 1:

> +}

...

> +void wx_configure_rx_ring_vf(struct wx *wx, struct wx_ring *ring)
> +{
> +	u8 reg_idx = ring->reg_idx;
> +	union wx_rx_desc *rx_desc;
> +	u64 rdba = ring->dma;
> +	u32 rxdctl;
> +
> +	/* disable queue to avoid issues while updating state */
> +	rxdctl = rd32(wx, WX_VXRXDCTL(reg_idx));
> +	wx_disable_rx_queue(wx, ring);
> +
> +	wr32(wx, WX_VXRDBAL(reg_idx), rdba & DMA_BIT_MASK(32));
> +	wr32(wx, WX_VXRDBAH(reg_idx), rdba >> 32);
> +
> +	/* enable relaxed ordering */
> +	pcie_capability_clear_and_set_word(wx->pdev, PCI_EXP_DEVCTL,
> +					   0, PCI_EXP_DEVCTL_RELAX_EN);
> +
> +	/* reset head and tail pointers */
> +	wr32(wx, WX_VXRDH(reg_idx), 0);
> +	wr32(wx, WX_VXRDT(reg_idx), 0);
> +	ring->tail = wx->hw_addr + WX_VXRDT(reg_idx);
> +
> +	/* initialize rx_buffer_info */
> +	memset(ring->rx_buffer_info, 0,
> +	       sizeof(struct wx_rx_buffer) * ring->count);
> +
> +	/* initialize Rx descriptor 0 */
> +	rx_desc = WX_RX_DESC(ring, 0);
> +	rx_desc->wb.upper.length = 0;
> +
> +	/* reset ntu and ntc to place SW in sync with hardwdare */

nit: hardware

> +	ring->next_to_clean = 0;
> +	ring->next_to_use = 0;
> +	ring->next_to_alloc = 0;
> +
> +	wx_configure_srrctl_vf(wx, ring, reg_idx);
> +
> +	/* allow any size packet since we can handle overflow */
> +	rxdctl &= ~WX_VXRXDCTL_BUFLEN_MASK;
> +	rxdctl |= WX_VXRXDCTL_BUFLEN(wx_buf_len(ring->count));
> +	rxdctl |= WX_VXRXDCTL_ENABLE | WX_VXRXDCTL_VLAN;
> +
> +	/* enable RSC */
> +	rxdctl &= ~WX_VXRXDCTL_RSCMAX_MASK;
> +	rxdctl |= WX_VXRXDCTL_RSCMAX(0);
> +	rxdctl |= WX_VXRXDCTL_RSCEN;
> +
> +	wr32(wx, WX_VXRXDCTL(reg_idx), rxdctl);
> +
> +	/* pf/vf reuse */
> +	wx_enable_rx_queue(wx, ring);
> +	wx_alloc_rx_buffers(ring, wx_desc_unused(ring));
> +}
> diff --git a/drivers/net/ethernet/wangxun/libwx/wx_vf_lib.h b/drivers/net/ethernet/wangxun/libwx/wx_vf_lib.h
> new file mode 100644
> index 000000000000..43ea126b79eb
> --- /dev/null
> +++ b/drivers/net/ethernet/wangxun/libwx/wx_vf_lib.h
> @@ -0,0 +1,14 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/* Copyright (c) 2015 - 2025 Beijing WangXun Technology Co., Ltd. */
> +
> +#ifndef _WX_VF_LIB_H_
> +#define _WX_VF_LIB_H_
> +
> +void wx_configure_msix_vf(struct wx *wx);
> +int wx_write_uc_addr_list_vf(struct net_device *netdev);
> +void wx_setup_psrtype_vf(struct wx *wx);
> +void wx_setup_vfmrqc_vf(struct wx *wx);
> +void wx_configure_tx_vf(struct wx *wx);
> +void wx_configure_rx_ring_vf(struct wx *wx, struct wx_ring *ring);
> +
> +#endif /* _WX_VF_LIB_H_ */
> -- 
> 2.30.1
> 

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ