netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] igb_main:Added invalid mac address handling in igb_probe
@ 2022-05-11  8:07 lixue liang
  2022-05-11 13:39 ` kernel test robot
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: lixue liang @ 2022-05-11  8:07 UTC (permalink / raw)
  To: jesse.brandeburg, anthony.l.nguyen, kuba, intel-wired-lan, netdev
  Cc: lixue liang

In some cases, when the user uses igb_set_eeprom to modify
the mac address to be invalid, the igb driver will fail to load.
If there is no network card device, the user must modify it to
a valid mac address by other means. It is only the invalid
mac address that causes the driver The fatal problem of
loading failure will cause most users no choice but to trouble.

Since the mac address may be changed to be invalid, it must
also be changed to a valid mac address, then add a random
valid mac address to replace the invalid mac address in the
driver, continue to load the igb network card driver,
and output the relevant log reminder. vital to the user.

Signed-off-by: lixue liang <lianglixue@greatwall.com.cn>
---
 drivers/net/ethernet/intel/igb/igb_main.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index 34b33b21e0dc..a513570c2ad6 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -3359,9 +3359,10 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	eth_hw_addr_set(netdev, hw->mac.addr);
 
 	if (!is_valid_ether_addr(netdev->dev_addr)) {
-		dev_err(&pdev->dev, "Invalid MAC Address\n");
-		err = -EIO;
-		goto err_eeprom;
+		eth_random_addr(netdev->dev_addr);
+		memcpy(hw->mac.addr, netdev->dev_addr, netdev->addr_len);
+		dev_info(&pdev->dev,
+			 "Invalid Mac Address, already got random Mac Address\n");
 	}
 
 	igb_set_default_mac_filter(adapter);
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] igb_main:Added invalid mac address handling in igb_probe
  2022-05-11  8:07 [PATCH] igb_main:Added invalid mac address handling in igb_probe lixue liang
@ 2022-05-11 13:39 ` kernel test robot
  2022-05-11 14:33 ` Alexander H Duyck
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: kernel test robot @ 2022-05-11 13:39 UTC (permalink / raw)
  To: lixue liang, jesse.brandeburg, anthony.l.nguyen, kuba,
	intel-wired-lan, netdev
  Cc: llvm, kbuild-all, lixue liang

Hi lixue,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on tnguy-next-queue/dev-queue]
[also build test ERROR on v5.18-rc6 next-20220511]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/intel-lab-lkp/linux/commits/lixue-liang/igb_main-Added-invalid-mac-address-handling-in-igb_probe/20220511-162855
base:   https://git.kernel.org/pub/scm/linux/kernel/git/tnguy/next-queue.git dev-queue
config: arm-socfpga_defconfig (https://download.01.org/0day-ci/archive/20220511/202205112101.xfpSlc0Z-lkp@intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project 18dd123c56754edf62c7042dcf23185c3727610f)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install arm cross compiling tool for clang build
        # apt-get install binutils-arm-linux-gnueabi
        # https://github.com/intel-lab-lkp/linux/commit/6237ad497b2c8063fe59ba165d5ab87ae15aad0d
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review lixue-liang/igb_main-Added-invalid-mac-address-handling-in-igb_probe/20220511-162855
        git checkout 6237ad497b2c8063fe59ba165d5ab87ae15aad0d
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=arm SHELL=/bin/bash drivers/net/ethernet/intel/igb/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

>> drivers/net/ethernet/intel/igb/igb_main.c:3362:19: error: passing 'const unsigned char *' to parameter of type 'u8 *' (aka 'unsigned char *') discards qualifiers [-Werror,-Wincompatible-pointer-types-discards-qualifiers]
                   eth_random_addr(netdev->dev_addr);
                                   ^~~~~~~~~~~~~~~~
   include/linux/etherdevice.h:230:40: note: passing argument to parameter 'addr' here
   static inline void eth_random_addr(u8 *addr)
                                          ^
   1 error generated.


vim +3362 drivers/net/ethernet/intel/igb/igb_main.c

  3146	
  3147	/**
  3148	 *  igb_probe - Device Initialization Routine
  3149	 *  @pdev: PCI device information struct
  3150	 *  @ent: entry in igb_pci_tbl
  3151	 *
  3152	 *  Returns 0 on success, negative on failure
  3153	 *
  3154	 *  igb_probe initializes an adapter identified by a pci_dev structure.
  3155	 *  The OS initialization, configuring of the adapter private structure,
  3156	 *  and a hardware reset occur.
  3157	 **/
  3158	static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
  3159	{
  3160		struct net_device *netdev;
  3161		struct igb_adapter *adapter;
  3162		struct e1000_hw *hw;
  3163		u16 eeprom_data = 0;
  3164		s32 ret_val;
  3165		static int global_quad_port_a; /* global quad port a indication */
  3166		const struct e1000_info *ei = igb_info_tbl[ent->driver_data];
  3167		u8 part_str[E1000_PBANUM_LENGTH];
  3168		int err;
  3169	
  3170		/* Catch broken hardware that put the wrong VF device ID in
  3171		 * the PCIe SR-IOV capability.
  3172		 */
  3173		if (pdev->is_virtfn) {
  3174			WARN(1, KERN_ERR "%s (%x:%x) should not be a VF!\n",
  3175				pci_name(pdev), pdev->vendor, pdev->device);
  3176			return -EINVAL;
  3177		}
  3178	
  3179		err = pci_enable_device_mem(pdev);
  3180		if (err)
  3181			return err;
  3182	
  3183		err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
  3184		if (err) {
  3185			dev_err(&pdev->dev,
  3186				"No usable DMA configuration, aborting\n");
  3187			goto err_dma;
  3188		}
  3189	
  3190		err = pci_request_mem_regions(pdev, igb_driver_name);
  3191		if (err)
  3192			goto err_pci_reg;
  3193	
  3194		pci_enable_pcie_error_reporting(pdev);
  3195	
  3196		pci_set_master(pdev);
  3197		pci_save_state(pdev);
  3198	
  3199		err = -ENOMEM;
  3200		netdev = alloc_etherdev_mq(sizeof(struct igb_adapter),
  3201					   IGB_MAX_TX_QUEUES);
  3202		if (!netdev)
  3203			goto err_alloc_etherdev;
  3204	
  3205		SET_NETDEV_DEV(netdev, &pdev->dev);
  3206	
  3207		pci_set_drvdata(pdev, netdev);
  3208		adapter = netdev_priv(netdev);
  3209		adapter->netdev = netdev;
  3210		adapter->pdev = pdev;
  3211		hw = &adapter->hw;
  3212		hw->back = adapter;
  3213		adapter->msg_enable = netif_msg_init(debug, DEFAULT_MSG_ENABLE);
  3214	
  3215		err = -EIO;
  3216		adapter->io_addr = pci_iomap(pdev, 0, 0);
  3217		if (!adapter->io_addr)
  3218			goto err_ioremap;
  3219		/* hw->hw_addr can be altered, we'll use adapter->io_addr for unmap */
  3220		hw->hw_addr = adapter->io_addr;
  3221	
  3222		netdev->netdev_ops = &igb_netdev_ops;
  3223		igb_set_ethtool_ops(netdev);
  3224		netdev->watchdog_timeo = 5 * HZ;
  3225	
  3226		strncpy(netdev->name, pci_name(pdev), sizeof(netdev->name) - 1);
  3227	
  3228		netdev->mem_start = pci_resource_start(pdev, 0);
  3229		netdev->mem_end = pci_resource_end(pdev, 0);
  3230	
  3231		/* PCI config space info */
  3232		hw->vendor_id = pdev->vendor;
  3233		hw->device_id = pdev->device;
  3234		hw->revision_id = pdev->revision;
  3235		hw->subsystem_vendor_id = pdev->subsystem_vendor;
  3236		hw->subsystem_device_id = pdev->subsystem_device;
  3237	
  3238		/* Copy the default MAC, PHY and NVM function pointers */
  3239		memcpy(&hw->mac.ops, ei->mac_ops, sizeof(hw->mac.ops));
  3240		memcpy(&hw->phy.ops, ei->phy_ops, sizeof(hw->phy.ops));
  3241		memcpy(&hw->nvm.ops, ei->nvm_ops, sizeof(hw->nvm.ops));
  3242		/* Initialize skew-specific constants */
  3243		err = ei->get_invariants(hw);
  3244		if (err)
  3245			goto err_sw_init;
  3246	
  3247		/* setup the private structure */
  3248		err = igb_sw_init(adapter);
  3249		if (err)
  3250			goto err_sw_init;
  3251	
  3252		igb_get_bus_info_pcie(hw);
  3253	
  3254		hw->phy.autoneg_wait_to_complete = false;
  3255	
  3256		/* Copper options */
  3257		if (hw->phy.media_type == e1000_media_type_copper) {
  3258			hw->phy.mdix = AUTO_ALL_MODES;
  3259			hw->phy.disable_polarity_correction = false;
  3260			hw->phy.ms_type = e1000_ms_hw_default;
  3261		}
  3262	
  3263		if (igb_check_reset_block(hw))
  3264			dev_info(&pdev->dev,
  3265				"PHY reset is blocked due to SOL/IDER session.\n");
  3266	
  3267		/* features is initialized to 0 in allocation, it might have bits
  3268		 * set by igb_sw_init so we should use an or instead of an
  3269		 * assignment.
  3270		 */
  3271		netdev->features |= NETIF_F_SG |
  3272				    NETIF_F_TSO |
  3273				    NETIF_F_TSO6 |
  3274				    NETIF_F_RXHASH |
  3275				    NETIF_F_RXCSUM |
  3276				    NETIF_F_HW_CSUM;
  3277	
  3278		if (hw->mac.type >= e1000_82576)
  3279			netdev->features |= NETIF_F_SCTP_CRC | NETIF_F_GSO_UDP_L4;
  3280	
  3281		if (hw->mac.type >= e1000_i350)
  3282			netdev->features |= NETIF_F_HW_TC;
  3283	
  3284	#define IGB_GSO_PARTIAL_FEATURES (NETIF_F_GSO_GRE | \
  3285					  NETIF_F_GSO_GRE_CSUM | \
  3286					  NETIF_F_GSO_IPXIP4 | \
  3287					  NETIF_F_GSO_IPXIP6 | \
  3288					  NETIF_F_GSO_UDP_TUNNEL | \
  3289					  NETIF_F_GSO_UDP_TUNNEL_CSUM)
  3290	
  3291		netdev->gso_partial_features = IGB_GSO_PARTIAL_FEATURES;
  3292		netdev->features |= NETIF_F_GSO_PARTIAL | IGB_GSO_PARTIAL_FEATURES;
  3293	
  3294		/* copy netdev features into list of user selectable features */
  3295		netdev->hw_features |= netdev->features |
  3296				       NETIF_F_HW_VLAN_CTAG_RX |
  3297				       NETIF_F_HW_VLAN_CTAG_TX |
  3298				       NETIF_F_RXALL;
  3299	
  3300		if (hw->mac.type >= e1000_i350)
  3301			netdev->hw_features |= NETIF_F_NTUPLE;
  3302	
  3303		netdev->features |= NETIF_F_HIGHDMA;
  3304	
  3305		netdev->vlan_features |= netdev->features | NETIF_F_TSO_MANGLEID;
  3306		netdev->mpls_features |= NETIF_F_HW_CSUM;
  3307		netdev->hw_enc_features |= netdev->vlan_features;
  3308	
  3309		/* set this bit last since it cannot be part of vlan_features */
  3310		netdev->features |= NETIF_F_HW_VLAN_CTAG_FILTER |
  3311				    NETIF_F_HW_VLAN_CTAG_RX |
  3312				    NETIF_F_HW_VLAN_CTAG_TX;
  3313	
  3314		netdev->priv_flags |= IFF_SUPP_NOFCS;
  3315	
  3316		netdev->priv_flags |= IFF_UNICAST_FLT;
  3317	
  3318		/* MTU range: 68 - 9216 */
  3319		netdev->min_mtu = ETH_MIN_MTU;
  3320		netdev->max_mtu = MAX_STD_JUMBO_FRAME_SIZE;
  3321	
  3322		adapter->en_mng_pt = igb_enable_mng_pass_thru(hw);
  3323	
  3324		/* before reading the NVM, reset the controller to put the device in a
  3325		 * known good starting state
  3326		 */
  3327		hw->mac.ops.reset_hw(hw);
  3328	
  3329		/* make sure the NVM is good , i211/i210 parts can have special NVM
  3330		 * that doesn't contain a checksum
  3331		 */
  3332		switch (hw->mac.type) {
  3333		case e1000_i210:
  3334		case e1000_i211:
  3335			if (igb_get_flash_presence_i210(hw)) {
  3336				if (hw->nvm.ops.validate(hw) < 0) {
  3337					dev_err(&pdev->dev,
  3338						"The NVM Checksum Is Not Valid\n");
  3339					err = -EIO;
  3340					goto err_eeprom;
  3341				}
  3342			}
  3343			break;
  3344		default:
  3345			if (hw->nvm.ops.validate(hw) < 0) {
  3346				dev_err(&pdev->dev, "The NVM Checksum Is Not Valid\n");
  3347				err = -EIO;
  3348				goto err_eeprom;
  3349			}
  3350			break;
  3351		}
  3352	
  3353		if (eth_platform_get_mac_address(&pdev->dev, hw->mac.addr)) {
  3354			/* copy the MAC address out of the NVM */
  3355			if (hw->mac.ops.read_mac_addr(hw))
  3356				dev_err(&pdev->dev, "NVM Read Error\n");
  3357		}
  3358	
  3359		eth_hw_addr_set(netdev, hw->mac.addr);
  3360	
  3361		if (!is_valid_ether_addr(netdev->dev_addr)) {
> 3362			eth_random_addr(netdev->dev_addr);
  3363			memcpy(hw->mac.addr, netdev->dev_addr, netdev->addr_len);
  3364			dev_info(&pdev->dev,
  3365				 "Invalid Mac Address, already got random Mac Address\n");
  3366		}
  3367	
  3368		igb_set_default_mac_filter(adapter);
  3369	
  3370		/* get firmware version for ethtool -i */
  3371		igb_set_fw_version(adapter);
  3372	
  3373		/* configure RXPBSIZE and TXPBSIZE */
  3374		if (hw->mac.type == e1000_i210) {
  3375			wr32(E1000_RXPBS, I210_RXPBSIZE_DEFAULT);
  3376			wr32(E1000_TXPBS, I210_TXPBSIZE_DEFAULT);
  3377		}
  3378	
  3379		timer_setup(&adapter->watchdog_timer, igb_watchdog, 0);
  3380		timer_setup(&adapter->phy_info_timer, igb_update_phy_info, 0);
  3381	
  3382		INIT_WORK(&adapter->reset_task, igb_reset_task);
  3383		INIT_WORK(&adapter->watchdog_task, igb_watchdog_task);
  3384	
  3385		/* Initialize link properties that are user-changeable */
  3386		adapter->fc_autoneg = true;
  3387		hw->mac.autoneg = true;
  3388		hw->phy.autoneg_advertised = 0x2f;
  3389	
  3390		hw->fc.requested_mode = e1000_fc_default;
  3391		hw->fc.current_mode = e1000_fc_default;
  3392	
  3393		igb_validate_mdi_setting(hw);
  3394	
  3395		/* By default, support wake on port A */
  3396		if (hw->bus.func == 0)
  3397			adapter->flags |= IGB_FLAG_WOL_SUPPORTED;
  3398	
  3399		/* Check the NVM for wake support on non-port A ports */
  3400		if (hw->mac.type >= e1000_82580)
  3401			hw->nvm.ops.read(hw, NVM_INIT_CONTROL3_PORT_A +
  3402					 NVM_82580_LAN_FUNC_OFFSET(hw->bus.func), 1,
  3403					 &eeprom_data);
  3404		else if (hw->bus.func == 1)
  3405			hw->nvm.ops.read(hw, NVM_INIT_CONTROL3_PORT_B, 1, &eeprom_data);
  3406	
  3407		if (eeprom_data & IGB_EEPROM_APME)
  3408			adapter->flags |= IGB_FLAG_WOL_SUPPORTED;
  3409	
  3410		/* now that we have the eeprom settings, apply the special cases where
  3411		 * the eeprom may be wrong or the board simply won't support wake on
  3412		 * lan on a particular port
  3413		 */
  3414		switch (pdev->device) {
  3415		case E1000_DEV_ID_82575GB_QUAD_COPPER:
  3416			adapter->flags &= ~IGB_FLAG_WOL_SUPPORTED;
  3417			break;
  3418		case E1000_DEV_ID_82575EB_FIBER_SERDES:
  3419		case E1000_DEV_ID_82576_FIBER:
  3420		case E1000_DEV_ID_82576_SERDES:
  3421			/* Wake events only supported on port A for dual fiber
  3422			 * regardless of eeprom setting
  3423			 */
  3424			if (rd32(E1000_STATUS) & E1000_STATUS_FUNC_1)
  3425				adapter->flags &= ~IGB_FLAG_WOL_SUPPORTED;
  3426			break;
  3427		case E1000_DEV_ID_82576_QUAD_COPPER:
  3428		case E1000_DEV_ID_82576_QUAD_COPPER_ET2:
  3429			/* if quad port adapter, disable WoL on all but port A */
  3430			if (global_quad_port_a != 0)
  3431				adapter->flags &= ~IGB_FLAG_WOL_SUPPORTED;
  3432			else
  3433				adapter->flags |= IGB_FLAG_QUAD_PORT_A;
  3434			/* Reset for multiple quad port adapters */
  3435			if (++global_quad_port_a == 4)
  3436				global_quad_port_a = 0;
  3437			break;
  3438		default:
  3439			/* If the device can't wake, don't set software support */
  3440			if (!device_can_wakeup(&adapter->pdev->dev))
  3441				adapter->flags &= ~IGB_FLAG_WOL_SUPPORTED;
  3442		}
  3443	
  3444		/* initialize the wol settings based on the eeprom settings */
  3445		if (adapter->flags & IGB_FLAG_WOL_SUPPORTED)
  3446			adapter->wol |= E1000_WUFC_MAG;
  3447	
  3448		/* Some vendors want WoL disabled by default, but still supported */
  3449		if ((hw->mac.type == e1000_i350) &&
  3450		    (pdev->subsystem_vendor == PCI_VENDOR_ID_HP)) {
  3451			adapter->flags |= IGB_FLAG_WOL_SUPPORTED;
  3452			adapter->wol = 0;
  3453		}
  3454	
  3455		/* Some vendors want the ability to Use the EEPROM setting as
  3456		 * enable/disable only, and not for capability
  3457		 */
  3458		if (((hw->mac.type == e1000_i350) ||
  3459		     (hw->mac.type == e1000_i354)) &&
  3460		    (pdev->subsystem_vendor == PCI_VENDOR_ID_DELL)) {
  3461			adapter->flags |= IGB_FLAG_WOL_SUPPORTED;
  3462			adapter->wol = 0;
  3463		}
  3464		if (hw->mac.type == e1000_i350) {
  3465			if (((pdev->subsystem_device == 0x5001) ||
  3466			     (pdev->subsystem_device == 0x5002)) &&
  3467					(hw->bus.func == 0)) {
  3468				adapter->flags |= IGB_FLAG_WOL_SUPPORTED;
  3469				adapter->wol = 0;
  3470			}
  3471			if (pdev->subsystem_device == 0x1F52)
  3472				adapter->flags |= IGB_FLAG_WOL_SUPPORTED;
  3473		}
  3474	
  3475		device_set_wakeup_enable(&adapter->pdev->dev,
  3476					 adapter->flags & IGB_FLAG_WOL_SUPPORTED);
  3477	
  3478		/* reset the hardware with the new settings */
  3479		igb_reset(adapter);
  3480	
  3481		/* Init the I2C interface */
  3482		err = igb_init_i2c(adapter);
  3483		if (err) {
  3484			dev_err(&pdev->dev, "failed to init i2c interface\n");
  3485			goto err_eeprom;
  3486		}
  3487	
  3488		/* let the f/w know that the h/w is now under the control of the
  3489		 * driver.
  3490		 */
  3491		igb_get_hw_control(adapter);
  3492	
  3493		strcpy(netdev->name, "eth%d");
  3494		err = register_netdev(netdev);
  3495		if (err)
  3496			goto err_register;
  3497	
  3498		/* carrier off reporting is important to ethtool even BEFORE open */
  3499		netif_carrier_off(netdev);
  3500	

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] igb_main:Added invalid mac address handling in igb_probe
  2022-05-11  8:07 [PATCH] igb_main:Added invalid mac address handling in igb_probe lixue liang
  2022-05-11 13:39 ` kernel test robot
@ 2022-05-11 14:33 ` Alexander H Duyck
  2022-05-11 14:53 ` [Intel-wired-lan] " Paul Menzel
  2022-05-11 18:40 ` kernel test robot
  3 siblings, 0 replies; 5+ messages in thread
From: Alexander H Duyck @ 2022-05-11 14:33 UTC (permalink / raw)
  To: lixue liang, jesse.brandeburg, anthony.l.nguyen, kuba,
	intel-wired-lan, netdev

On Wed, 2022-05-11 at 08:07 +0000, lixue liang wrote:
> In some cases, when the user uses igb_set_eeprom to modify
> the mac address to be invalid, the igb driver will fail to load.
> If there is no network card device, the user must modify it to
> a valid mac address by other means. It is only the invalid
> mac address that causes the driver The fatal problem of
> loading failure will cause most users no choice but to trouble.
> 
> Since the mac address may be changed to be invalid, it must
> also be changed to a valid mac address, then add a random
> valid mac address to replace the invalid mac address in the
> driver, continue to load the igb network card driver,
> and output the relevant log reminder. vital to the user.
> 
> Signed-off-by: lixue liang <lianglixue@greatwall.com.cn>
> ---
>  drivers/net/ethernet/intel/igb/igb_main.c | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
> index 34b33b21e0dc..a513570c2ad6 100644
> --- a/drivers/net/ethernet/intel/igb/igb_main.c
> +++ b/drivers/net/ethernet/intel/igb/igb_main.c
> @@ -3359,9 +3359,10 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
>  	eth_hw_addr_set(netdev, hw->mac.addr);
>  
>  	if (!is_valid_ether_addr(netdev->dev_addr)) {

It might make sense to look at adding a module parameter to control
this behavior similar to what was done for ixgbe for
"allow_unsupported_sfp". 
Otherwise such a failure is likely to end up causing other issues and
be harder to debug if it is just being automatically worked around as
the user may not see the issue as it is only being reported as 

Basically you could check for it here and either run the old code, or
allow the new code that would assign a random MAC address.

> -		dev_err(&pdev->dev, "Invalid MAC Address\n");
> -		err = -EIO;
> -		goto err_eeprom;
> +		eth_random_addr(netdev->dev_addr);
> +		memcpy(hw->mac.addr, netdev->dev_addr, netdev->addr_len);
> +		dev_info(&pdev->dev,
> +			 "Invalid Mac Address, already got random Mac Address\n");

We would probably want to make this a dev_err instead of just a
dev_info since the MAC address failing is pretty signficant. Also the
message may be better as "Invalid MAC address. Assigned random MAC
address". That way if somebody were to be parsing for the message they
would still find it since "MAC" hasn't been changed.

>  	}
>  
>  	igb_set_default_mac_filter(adapter);




^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Intel-wired-lan] [PATCH] igb_main:Added invalid mac address handling in igb_probe
  2022-05-11  8:07 [PATCH] igb_main:Added invalid mac address handling in igb_probe lixue liang
  2022-05-11 13:39 ` kernel test robot
  2022-05-11 14:33 ` Alexander H Duyck
@ 2022-05-11 14:53 ` Paul Menzel
  2022-05-11 18:40 ` kernel test robot
  3 siblings, 0 replies; 5+ messages in thread
From: Paul Menzel @ 2022-05-11 14:53 UTC (permalink / raw)
  To: lixue liang
  Cc: jesse.brandeburg, anthony.l.nguyen, kuba, intel-wired-lan, netdev

Dear Lixue,


Thank you for the patch. Please tag patch iterations with a version. 
(Use `-v 2` in `git send-email` for example.)

Am 11.05.22 um 10:07 schrieb lixue liang:

Please use the normal colon : in the summary.

Also, please use imperative mood in present tense: Add …

But, in this case

Handle invalid MAC address …

is shorter. Or:

Assign random MAC address instead of fail in case of invalid one

> In some cases, when the user uses igb_set_eeprom to modify
> the mac address to be invalid, the igb driver will fail to load.
> If there is no network card device, the user must modify it to
> a valid mac address by other means. It is only the invalid
> mac address that causes the driver The fatal problem of

… MAC address causing the driver to failure. The fatal …

> loading failure will cause most users no choice but to trouble.

Maybe remove this sentence, or rephrase.

> Since the mac address may be changed to be invalid, it must
> also be changed to a valid mac address, then add a random
> valid mac address to replace the invalid mac address in the
> driver, continue to load the igb network card driver,
> and output the relevant log reminder. vital to the user.

Please reflow for 75 characters per line. (More words fit in one line.)

> Signed-off-by: lixue liang <lianglixue@greatwall.com.cn>
> ---
>   drivers/net/ethernet/intel/igb/igb_main.c | 7 ++++---
>   1 file changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
> index 34b33b21e0dc..a513570c2ad6 100644
> --- a/drivers/net/ethernet/intel/igb/igb_main.c
> +++ b/drivers/net/ethernet/intel/igb/igb_main.c
> @@ -3359,9 +3359,10 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
>   	eth_hw_addr_set(netdev, hw->mac.addr);
>   
>   	if (!is_valid_ether_addr(netdev->dev_addr)) {
> -		dev_err(&pdev->dev, "Invalid MAC Address\n");
> -		err = -EIO;
> -		goto err_eeprom;
> +		eth_random_addr(netdev->dev_addr);
> +		memcpy(hw->mac.addr, netdev->dev_addr, netdev->addr_len);
> +		dev_info(&pdev->dev,
> +			 "Invalid Mac Address, already got random Mac Address\n");

Is there a valid MAC address that should be only used for testing. Maybe 
that can be used. Maybe also log the address.

Lastly, please fully capitalize MAC.

>   	}
>   
>   	igb_set_default_mac_filter(adapter);


Kind regards,

Paul

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] igb_main:Added invalid mac address handling in igb_probe
  2022-05-11  8:07 [PATCH] igb_main:Added invalid mac address handling in igb_probe lixue liang
                   ` (2 preceding siblings ...)
  2022-05-11 14:53 ` [Intel-wired-lan] " Paul Menzel
@ 2022-05-11 18:40 ` kernel test robot
  3 siblings, 0 replies; 5+ messages in thread
From: kernel test robot @ 2022-05-11 18:40 UTC (permalink / raw)
  To: lixue liang, jesse.brandeburg, anthony.l.nguyen, kuba,
	intel-wired-lan, netdev
  Cc: kbuild-all, lixue liang

Hi lixue,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on tnguy-next-queue/dev-queue]
[also build test WARNING on v5.18-rc6 next-20220511]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/intel-lab-lkp/linux/commits/lixue-liang/igb_main-Added-invalid-mac-address-handling-in-igb_probe/20220511-162855
base:   https://git.kernel.org/pub/scm/linux/kernel/git/tnguy/next-queue.git dev-queue
config: ia64-allmodconfig (https://download.01.org/0day-ci/archive/20220512/202205120241.e57SFKBu-lkp@intel.com/config)
compiler: ia64-linux-gcc (GCC) 11.3.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/intel-lab-lkp/linux/commit/6237ad497b2c8063fe59ba165d5ab87ae15aad0d
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review lixue-liang/igb_main-Added-invalid-mac-address-handling-in-igb_probe/20220511-162855
        git checkout 6237ad497b2c8063fe59ba165d5ab87ae15aad0d
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.3.0 make.cross W=1 O=build_dir ARCH=ia64 SHELL=/bin/bash drivers/net/ethernet/intel/igb/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

   drivers/net/ethernet/intel/igb/igb_main.c: In function 'igb_probe':
>> drivers/net/ethernet/intel/igb/igb_main.c:3362:39: warning: passing argument 1 of 'eth_random_addr' discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
    3362 |                 eth_random_addr(netdev->dev_addr);
         |                                 ~~~~~~^~~~~~~~~~
   In file included from include/linux/if_vlan.h:11,
                    from include/net/pkt_sched.h:7,
                    from drivers/net/ethernet/intel/igb/igb_main.c:17:
   include/linux/etherdevice.h:230:40: note: expected 'u8 *' {aka 'unsigned char *'} but argument is of type 'const unsigned char *'
     230 | static inline void eth_random_addr(u8 *addr)
         |                                    ~~~~^~~~
   {standard input}: Assembler messages:
   {standard input}:45068: Error: Register number out of range 0..4
   {standard input}:45069: Error: Register number out of range 0..4
   {standard input}:45069: Warning: Use of 'mov' violates WAW dependency 'GR%, % in 1 - 127' (impliedf), specific resource number is 45
   {standard input}:45069: Warning: Only the first path encountering the conflict is reported
   {standard input}:45068: Warning: This is the location of the conflicting usage
   {standard input}:45073: Error: Register number out of range 0..4


vim +3362 drivers/net/ethernet/intel/igb/igb_main.c

  3146	
  3147	/**
  3148	 *  igb_probe - Device Initialization Routine
  3149	 *  @pdev: PCI device information struct
  3150	 *  @ent: entry in igb_pci_tbl
  3151	 *
  3152	 *  Returns 0 on success, negative on failure
  3153	 *
  3154	 *  igb_probe initializes an adapter identified by a pci_dev structure.
  3155	 *  The OS initialization, configuring of the adapter private structure,
  3156	 *  and a hardware reset occur.
  3157	 **/
  3158	static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
  3159	{
  3160		struct net_device *netdev;
  3161		struct igb_adapter *adapter;
  3162		struct e1000_hw *hw;
  3163		u16 eeprom_data = 0;
  3164		s32 ret_val;
  3165		static int global_quad_port_a; /* global quad port a indication */
  3166		const struct e1000_info *ei = igb_info_tbl[ent->driver_data];
  3167		u8 part_str[E1000_PBANUM_LENGTH];
  3168		int err;
  3169	
  3170		/* Catch broken hardware that put the wrong VF device ID in
  3171		 * the PCIe SR-IOV capability.
  3172		 */
  3173		if (pdev->is_virtfn) {
  3174			WARN(1, KERN_ERR "%s (%x:%x) should not be a VF!\n",
  3175				pci_name(pdev), pdev->vendor, pdev->device);
  3176			return -EINVAL;
  3177		}
  3178	
  3179		err = pci_enable_device_mem(pdev);
  3180		if (err)
  3181			return err;
  3182	
  3183		err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
  3184		if (err) {
  3185			dev_err(&pdev->dev,
  3186				"No usable DMA configuration, aborting\n");
  3187			goto err_dma;
  3188		}
  3189	
  3190		err = pci_request_mem_regions(pdev, igb_driver_name);
  3191		if (err)
  3192			goto err_pci_reg;
  3193	
  3194		pci_enable_pcie_error_reporting(pdev);
  3195	
  3196		pci_set_master(pdev);
  3197		pci_save_state(pdev);
  3198	
  3199		err = -ENOMEM;
  3200		netdev = alloc_etherdev_mq(sizeof(struct igb_adapter),
  3201					   IGB_MAX_TX_QUEUES);
  3202		if (!netdev)
  3203			goto err_alloc_etherdev;
  3204	
  3205		SET_NETDEV_DEV(netdev, &pdev->dev);
  3206	
  3207		pci_set_drvdata(pdev, netdev);
  3208		adapter = netdev_priv(netdev);
  3209		adapter->netdev = netdev;
  3210		adapter->pdev = pdev;
  3211		hw = &adapter->hw;
  3212		hw->back = adapter;
  3213		adapter->msg_enable = netif_msg_init(debug, DEFAULT_MSG_ENABLE);
  3214	
  3215		err = -EIO;
  3216		adapter->io_addr = pci_iomap(pdev, 0, 0);
  3217		if (!adapter->io_addr)
  3218			goto err_ioremap;
  3219		/* hw->hw_addr can be altered, we'll use adapter->io_addr for unmap */
  3220		hw->hw_addr = adapter->io_addr;
  3221	
  3222		netdev->netdev_ops = &igb_netdev_ops;
  3223		igb_set_ethtool_ops(netdev);
  3224		netdev->watchdog_timeo = 5 * HZ;
  3225	
  3226		strncpy(netdev->name, pci_name(pdev), sizeof(netdev->name) - 1);
  3227	
  3228		netdev->mem_start = pci_resource_start(pdev, 0);
  3229		netdev->mem_end = pci_resource_end(pdev, 0);
  3230	
  3231		/* PCI config space info */
  3232		hw->vendor_id = pdev->vendor;
  3233		hw->device_id = pdev->device;
  3234		hw->revision_id = pdev->revision;
  3235		hw->subsystem_vendor_id = pdev->subsystem_vendor;
  3236		hw->subsystem_device_id = pdev->subsystem_device;
  3237	
  3238		/* Copy the default MAC, PHY and NVM function pointers */
  3239		memcpy(&hw->mac.ops, ei->mac_ops, sizeof(hw->mac.ops));
  3240		memcpy(&hw->phy.ops, ei->phy_ops, sizeof(hw->phy.ops));
  3241		memcpy(&hw->nvm.ops, ei->nvm_ops, sizeof(hw->nvm.ops));
  3242		/* Initialize skew-specific constants */
  3243		err = ei->get_invariants(hw);
  3244		if (err)
  3245			goto err_sw_init;
  3246	
  3247		/* setup the private structure */
  3248		err = igb_sw_init(adapter);
  3249		if (err)
  3250			goto err_sw_init;
  3251	
  3252		igb_get_bus_info_pcie(hw);
  3253	
  3254		hw->phy.autoneg_wait_to_complete = false;
  3255	
  3256		/* Copper options */
  3257		if (hw->phy.media_type == e1000_media_type_copper) {
  3258			hw->phy.mdix = AUTO_ALL_MODES;
  3259			hw->phy.disable_polarity_correction = false;
  3260			hw->phy.ms_type = e1000_ms_hw_default;
  3261		}
  3262	
  3263		if (igb_check_reset_block(hw))
  3264			dev_info(&pdev->dev,
  3265				"PHY reset is blocked due to SOL/IDER session.\n");
  3266	
  3267		/* features is initialized to 0 in allocation, it might have bits
  3268		 * set by igb_sw_init so we should use an or instead of an
  3269		 * assignment.
  3270		 */
  3271		netdev->features |= NETIF_F_SG |
  3272				    NETIF_F_TSO |
  3273				    NETIF_F_TSO6 |
  3274				    NETIF_F_RXHASH |
  3275				    NETIF_F_RXCSUM |
  3276				    NETIF_F_HW_CSUM;
  3277	
  3278		if (hw->mac.type >= e1000_82576)
  3279			netdev->features |= NETIF_F_SCTP_CRC | NETIF_F_GSO_UDP_L4;
  3280	
  3281		if (hw->mac.type >= e1000_i350)
  3282			netdev->features |= NETIF_F_HW_TC;
  3283	
  3284	#define IGB_GSO_PARTIAL_FEATURES (NETIF_F_GSO_GRE | \
  3285					  NETIF_F_GSO_GRE_CSUM | \
  3286					  NETIF_F_GSO_IPXIP4 | \
  3287					  NETIF_F_GSO_IPXIP6 | \
  3288					  NETIF_F_GSO_UDP_TUNNEL | \
  3289					  NETIF_F_GSO_UDP_TUNNEL_CSUM)
  3290	
  3291		netdev->gso_partial_features = IGB_GSO_PARTIAL_FEATURES;
  3292		netdev->features |= NETIF_F_GSO_PARTIAL | IGB_GSO_PARTIAL_FEATURES;
  3293	
  3294		/* copy netdev features into list of user selectable features */
  3295		netdev->hw_features |= netdev->features |
  3296				       NETIF_F_HW_VLAN_CTAG_RX |
  3297				       NETIF_F_HW_VLAN_CTAG_TX |
  3298				       NETIF_F_RXALL;
  3299	
  3300		if (hw->mac.type >= e1000_i350)
  3301			netdev->hw_features |= NETIF_F_NTUPLE;
  3302	
  3303		netdev->features |= NETIF_F_HIGHDMA;
  3304	
  3305		netdev->vlan_features |= netdev->features | NETIF_F_TSO_MANGLEID;
  3306		netdev->mpls_features |= NETIF_F_HW_CSUM;
  3307		netdev->hw_enc_features |= netdev->vlan_features;
  3308	
  3309		/* set this bit last since it cannot be part of vlan_features */
  3310		netdev->features |= NETIF_F_HW_VLAN_CTAG_FILTER |
  3311				    NETIF_F_HW_VLAN_CTAG_RX |
  3312				    NETIF_F_HW_VLAN_CTAG_TX;
  3313	
  3314		netdev->priv_flags |= IFF_SUPP_NOFCS;
  3315	
  3316		netdev->priv_flags |= IFF_UNICAST_FLT;
  3317	
  3318		/* MTU range: 68 - 9216 */
  3319		netdev->min_mtu = ETH_MIN_MTU;
  3320		netdev->max_mtu = MAX_STD_JUMBO_FRAME_SIZE;
  3321	
  3322		adapter->en_mng_pt = igb_enable_mng_pass_thru(hw);
  3323	
  3324		/* before reading the NVM, reset the controller to put the device in a
  3325		 * known good starting state
  3326		 */
  3327		hw->mac.ops.reset_hw(hw);
  3328	
  3329		/* make sure the NVM is good , i211/i210 parts can have special NVM
  3330		 * that doesn't contain a checksum
  3331		 */
  3332		switch (hw->mac.type) {
  3333		case e1000_i210:
  3334		case e1000_i211:
  3335			if (igb_get_flash_presence_i210(hw)) {
  3336				if (hw->nvm.ops.validate(hw) < 0) {
  3337					dev_err(&pdev->dev,
  3338						"The NVM Checksum Is Not Valid\n");
  3339					err = -EIO;
  3340					goto err_eeprom;
  3341				}
  3342			}
  3343			break;
  3344		default:
  3345			if (hw->nvm.ops.validate(hw) < 0) {
  3346				dev_err(&pdev->dev, "The NVM Checksum Is Not Valid\n");
  3347				err = -EIO;
  3348				goto err_eeprom;
  3349			}
  3350			break;
  3351		}
  3352	
  3353		if (eth_platform_get_mac_address(&pdev->dev, hw->mac.addr)) {
  3354			/* copy the MAC address out of the NVM */
  3355			if (hw->mac.ops.read_mac_addr(hw))
  3356				dev_err(&pdev->dev, "NVM Read Error\n");
  3357		}
  3358	
  3359		eth_hw_addr_set(netdev, hw->mac.addr);
  3360	
  3361		if (!is_valid_ether_addr(netdev->dev_addr)) {
> 3362			eth_random_addr(netdev->dev_addr);
  3363			memcpy(hw->mac.addr, netdev->dev_addr, netdev->addr_len);
  3364			dev_info(&pdev->dev,
  3365				 "Invalid Mac Address, already got random Mac Address\n");
  3366		}
  3367	
  3368		igb_set_default_mac_filter(adapter);
  3369	
  3370		/* get firmware version for ethtool -i */
  3371		igb_set_fw_version(adapter);
  3372	
  3373		/* configure RXPBSIZE and TXPBSIZE */
  3374		if (hw->mac.type == e1000_i210) {
  3375			wr32(E1000_RXPBS, I210_RXPBSIZE_DEFAULT);
  3376			wr32(E1000_TXPBS, I210_TXPBSIZE_DEFAULT);
  3377		}
  3378	
  3379		timer_setup(&adapter->watchdog_timer, igb_watchdog, 0);
  3380		timer_setup(&adapter->phy_info_timer, igb_update_phy_info, 0);
  3381	
  3382		INIT_WORK(&adapter->reset_task, igb_reset_task);
  3383		INIT_WORK(&adapter->watchdog_task, igb_watchdog_task);
  3384	
  3385		/* Initialize link properties that are user-changeable */
  3386		adapter->fc_autoneg = true;
  3387		hw->mac.autoneg = true;
  3388		hw->phy.autoneg_advertised = 0x2f;
  3389	
  3390		hw->fc.requested_mode = e1000_fc_default;
  3391		hw->fc.current_mode = e1000_fc_default;
  3392	
  3393		igb_validate_mdi_setting(hw);
  3394	
  3395		/* By default, support wake on port A */
  3396		if (hw->bus.func == 0)
  3397			adapter->flags |= IGB_FLAG_WOL_SUPPORTED;
  3398	
  3399		/* Check the NVM for wake support on non-port A ports */
  3400		if (hw->mac.type >= e1000_82580)
  3401			hw->nvm.ops.read(hw, NVM_INIT_CONTROL3_PORT_A +
  3402					 NVM_82580_LAN_FUNC_OFFSET(hw->bus.func), 1,
  3403					 &eeprom_data);
  3404		else if (hw->bus.func == 1)
  3405			hw->nvm.ops.read(hw, NVM_INIT_CONTROL3_PORT_B, 1, &eeprom_data);
  3406	
  3407		if (eeprom_data & IGB_EEPROM_APME)
  3408			adapter->flags |= IGB_FLAG_WOL_SUPPORTED;
  3409	
  3410		/* now that we have the eeprom settings, apply the special cases where
  3411		 * the eeprom may be wrong or the board simply won't support wake on
  3412		 * lan on a particular port
  3413		 */
  3414		switch (pdev->device) {
  3415		case E1000_DEV_ID_82575GB_QUAD_COPPER:
  3416			adapter->flags &= ~IGB_FLAG_WOL_SUPPORTED;
  3417			break;
  3418		case E1000_DEV_ID_82575EB_FIBER_SERDES:
  3419		case E1000_DEV_ID_82576_FIBER:
  3420		case E1000_DEV_ID_82576_SERDES:
  3421			/* Wake events only supported on port A for dual fiber
  3422			 * regardless of eeprom setting
  3423			 */
  3424			if (rd32(E1000_STATUS) & E1000_STATUS_FUNC_1)
  3425				adapter->flags &= ~IGB_FLAG_WOL_SUPPORTED;
  3426			break;
  3427		case E1000_DEV_ID_82576_QUAD_COPPER:
  3428		case E1000_DEV_ID_82576_QUAD_COPPER_ET2:
  3429			/* if quad port adapter, disable WoL on all but port A */
  3430			if (global_quad_port_a != 0)
  3431				adapter->flags &= ~IGB_FLAG_WOL_SUPPORTED;
  3432			else
  3433				adapter->flags |= IGB_FLAG_QUAD_PORT_A;
  3434			/* Reset for multiple quad port adapters */
  3435			if (++global_quad_port_a == 4)
  3436				global_quad_port_a = 0;
  3437			break;
  3438		default:
  3439			/* If the device can't wake, don't set software support */
  3440			if (!device_can_wakeup(&adapter->pdev->dev))
  3441				adapter->flags &= ~IGB_FLAG_WOL_SUPPORTED;
  3442		}
  3443	
  3444		/* initialize the wol settings based on the eeprom settings */
  3445		if (adapter->flags & IGB_FLAG_WOL_SUPPORTED)
  3446			adapter->wol |= E1000_WUFC_MAG;
  3447	
  3448		/* Some vendors want WoL disabled by default, but still supported */
  3449		if ((hw->mac.type == e1000_i350) &&
  3450		    (pdev->subsystem_vendor == PCI_VENDOR_ID_HP)) {
  3451			adapter->flags |= IGB_FLAG_WOL_SUPPORTED;
  3452			adapter->wol = 0;
  3453		}
  3454	
  3455		/* Some vendors want the ability to Use the EEPROM setting as
  3456		 * enable/disable only, and not for capability
  3457		 */
  3458		if (((hw->mac.type == e1000_i350) ||
  3459		     (hw->mac.type == e1000_i354)) &&
  3460		    (pdev->subsystem_vendor == PCI_VENDOR_ID_DELL)) {
  3461			adapter->flags |= IGB_FLAG_WOL_SUPPORTED;
  3462			adapter->wol = 0;
  3463		}
  3464		if (hw->mac.type == e1000_i350) {
  3465			if (((pdev->subsystem_device == 0x5001) ||
  3466			     (pdev->subsystem_device == 0x5002)) &&
  3467					(hw->bus.func == 0)) {
  3468				adapter->flags |= IGB_FLAG_WOL_SUPPORTED;
  3469				adapter->wol = 0;
  3470			}
  3471			if (pdev->subsystem_device == 0x1F52)
  3472				adapter->flags |= IGB_FLAG_WOL_SUPPORTED;
  3473		}
  3474	
  3475		device_set_wakeup_enable(&adapter->pdev->dev,
  3476					 adapter->flags & IGB_FLAG_WOL_SUPPORTED);
  3477	
  3478		/* reset the hardware with the new settings */
  3479		igb_reset(adapter);
  3480	
  3481		/* Init the I2C interface */
  3482		err = igb_init_i2c(adapter);
  3483		if (err) {
  3484			dev_err(&pdev->dev, "failed to init i2c interface\n");
  3485			goto err_eeprom;
  3486		}
  3487	
  3488		/* let the f/w know that the h/w is now under the control of the
  3489		 * driver.
  3490		 */
  3491		igb_get_hw_control(adapter);
  3492	
  3493		strcpy(netdev->name, "eth%d");
  3494		err = register_netdev(netdev);
  3495		if (err)
  3496			goto err_register;
  3497	
  3498		/* carrier off reporting is important to ethtool even BEFORE open */
  3499		netif_carrier_off(netdev);
  3500	

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2022-05-11 18:41 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-11  8:07 [PATCH] igb_main:Added invalid mac address handling in igb_probe lixue liang
2022-05-11 13:39 ` kernel test robot
2022-05-11 14:33 ` Alexander H Duyck
2022-05-11 14:53 ` [Intel-wired-lan] " Paul Menzel
2022-05-11 18:40 ` kernel test robot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).