Subject: Re: [PATCH] igb_main：Added invalid mac address handling in igb_probe

From: kernel test robot <[email-masked]>
Date: Thu, 12 May 2022 02:40:17 +0800

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/[email-masked]/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 <[email-masked]>

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