oe-kbuild-all.lists.linux.dev archive mirror
 help / color / mirror / Atom feed
* [linux-next:master 2592/5283] drivers/net/ethernet/cadence/macb_main.c:4107 macb_taprio_setup_replace() warn: unsigned 'start_time' is never less than zero.
@ 2025-08-31 12:38 kernel test robot
  0 siblings, 0 replies; only message in thread
From: kernel test robot @ 2025-08-31 12:38 UTC (permalink / raw)
  To: Vineeth Karumanchi; +Cc: oe-kbuild-all, Paolo Abeni

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
head:   3cace99d63192a7250461b058279a42d91075d0c
commit: 89934dbf169e358b57c2b394bb51a57d3f259dc0 [2592/5283] net: macb: Add TAPRIO traffic scheduling support
config: i386-randconfig-r073-20250831 (https://download.01.org/0day-ci/archive/20250831/202508312039.APF4zkL7-lkp@intel.com/config)
compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202508312039.APF4zkL7-lkp@intel.com/

smatch warnings:
drivers/net/ethernet/cadence/macb_main.c:4107 macb_taprio_setup_replace() warn: unsigned 'start_time' is never less than zero.

vim +/start_time +4107 drivers/net/ethernet/cadence/macb_main.c

  4087	
  4088	static int macb_taprio_setup_replace(struct net_device *ndev,
  4089					     struct tc_taprio_qopt_offload *conf)
  4090	{
  4091		u64 total_on_time = 0, start_time_sec = 0, start_time = conf->base_time;
  4092		u32 configured_queues = 0, speed = 0, start_time_nsec;
  4093		struct macb_queue_enst_config *enst_queue;
  4094		struct tc_taprio_sched_entry *entry;
  4095		struct macb *bp = netdev_priv(ndev);
  4096		struct ethtool_link_ksettings kset;
  4097		struct macb_queue *queue;
  4098		size_t i;
  4099		int err;
  4100	
  4101		if (conf->num_entries > bp->num_queues) {
  4102			netdev_err(ndev, "Too many TAPRIO entries: %zu > %d queues\n",
  4103				   conf->num_entries, bp->num_queues);
  4104			return -EINVAL;
  4105		}
  4106	
> 4107		if (start_time < 0) {
  4108			netdev_err(ndev, "Invalid base_time: must be 0 or positive, got %lld\n",
  4109				   conf->base_time);
  4110			return -ERANGE;
  4111		}
  4112	
  4113		/* Get the current link speed */
  4114		err = phylink_ethtool_ksettings_get(bp->phylink, &kset);
  4115		if (unlikely(err)) {
  4116			netdev_err(ndev, "Failed to get link settings: %d\n", err);
  4117			return err;
  4118		}
  4119	
  4120		speed = kset.base.speed;
  4121		if (unlikely(speed <= 0)) {
  4122			netdev_err(ndev, "Invalid speed: %d\n", speed);
  4123			return -EINVAL;
  4124		}
  4125	
  4126		enst_queue = kcalloc(conf->num_entries, sizeof(*enst_queue), GFP_KERNEL);
  4127		if (unlikely(!enst_queue))
  4128			return -ENOMEM;
  4129	
  4130		/* Pre-validate all entries before making any hardware changes */
  4131		for (i = 0; i < conf->num_entries; i++) {
  4132			entry = &conf->entries[i];
  4133	
  4134			if (entry->command != TC_TAPRIO_CMD_SET_GATES) {
  4135				netdev_err(ndev, "Entry %zu: unsupported command %d\n",
  4136					   i, entry->command);
  4137				err = -EOPNOTSUPP;
  4138				goto cleanup;
  4139			}
  4140	
  4141			/* Validate gate_mask: must be nonzero, single queue, and within range */
  4142			if (!is_power_of_2(entry->gate_mask)) {
  4143				netdev_err(ndev, "Entry %zu: gate_mask 0x%x is not a power of 2 (only one queue per entry allowed)\n",
  4144					   i, entry->gate_mask);
  4145				err = -EINVAL;
  4146				goto cleanup;
  4147			}
  4148	
  4149			/* gate_mask must not select queues outside the valid queue_mask */
  4150			if (entry->gate_mask & ~bp->queue_mask) {
  4151				netdev_err(ndev, "Entry %zu: gate_mask 0x%x exceeds queue range (max_queues=%d)\n",
  4152					   i, entry->gate_mask, bp->num_queues);
  4153				err = -EINVAL;
  4154				goto cleanup;
  4155			}
  4156	
  4157			/* Check for start time limits */
  4158			start_time_sec = start_time;
  4159			start_time_nsec = do_div(start_time_sec, NSEC_PER_SEC);
  4160			if (start_time_sec > GENMASK(GEM_START_TIME_SEC_SIZE - 1, 0)) {
  4161				netdev_err(ndev, "Entry %zu: Start time %llu s exceeds hardware limit\n",
  4162					   i, start_time_sec);
  4163				err = -ERANGE;
  4164				goto cleanup;
  4165			}
  4166	
  4167			/* Check for on time limit */
  4168			if (entry->interval > enst_max_hw_interval(speed)) {
  4169				netdev_err(ndev, "Entry %zu: interval %u ns exceeds hardware limit %llu ns\n",
  4170					   i, entry->interval, enst_max_hw_interval(speed));
  4171				err = -ERANGE;
  4172				goto cleanup;
  4173			}
  4174	
  4175			/* Check for off time limit*/
  4176			if ((conf->cycle_time - entry->interval) > enst_max_hw_interval(speed)) {
  4177				netdev_err(ndev, "Entry %zu: off_time %llu ns exceeds hardware limit %llu ns\n",
  4178					   i, conf->cycle_time - entry->interval,
  4179					   enst_max_hw_interval(speed));
  4180				err = -ERANGE;
  4181				goto cleanup;
  4182			}
  4183	
  4184			enst_queue[i].queue_id = order_base_2(entry->gate_mask);
  4185			enst_queue[i].start_time_mask =
  4186				(start_time_sec << GEM_START_TIME_SEC_OFFSET) |
  4187				start_time_nsec;
  4188			enst_queue[i].on_time_bytes =
  4189				enst_ns_to_hw_units(entry->interval, speed);
  4190			enst_queue[i].off_time_bytes =
  4191				enst_ns_to_hw_units(conf->cycle_time - entry->interval, speed);
  4192	
  4193			configured_queues |= entry->gate_mask;
  4194			total_on_time += entry->interval;
  4195			start_time += entry->interval;
  4196		}
  4197	
  4198		/* Check total interval doesn't exceed cycle time */
  4199		if (total_on_time > conf->cycle_time) {
  4200			netdev_err(ndev, "Total ON %llu ns exceeds cycle time %llu ns\n",
  4201				   total_on_time, conf->cycle_time);
  4202			err = -EINVAL;
  4203			goto cleanup;
  4204		}
  4205	
  4206		netdev_dbg(ndev, "TAPRIO setup: %zu entries, base_time=%lld ns, cycle_time=%llu ns\n",
  4207			   conf->num_entries, conf->base_time, conf->cycle_time);
  4208	
  4209		/* All validations passed - proceed with hardware configuration */
  4210		scoped_guard(spinlock_irqsave, &bp->lock) {
  4211			/* Disable ENST queues if running before configuring */
  4212			gem_writel(bp, ENST_CONTROL,
  4213				   bp->queue_mask << GEM_ENST_DISABLE_QUEUE_OFFSET);
  4214	
  4215			for (i = 0; i < conf->num_entries; i++) {
  4216				queue = &bp->queues[enst_queue[i].queue_id];
  4217				/* Configure queue timing registers */
  4218				queue_writel(queue, ENST_START_TIME,
  4219					     enst_queue[i].start_time_mask);
  4220				queue_writel(queue, ENST_ON_TIME,
  4221					     enst_queue[i].on_time_bytes);
  4222				queue_writel(queue, ENST_OFF_TIME,
  4223					     enst_queue[i].off_time_bytes);
  4224			}
  4225	
  4226			/* Enable ENST for all configured queues in one write */
  4227			gem_writel(bp, ENST_CONTROL, configured_queues);
  4228		}
  4229	
  4230		netdev_info(ndev, "TAPRIO configuration completed successfully: %zu entries, %d queues configured\n",
  4231			    conf->num_entries, hweight32(configured_queues));
  4232	
  4233	cleanup:
  4234		kfree(enst_queue);
  4235		return err;
  4236	}
  4237	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2025-08-31 12:39 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-31 12:38 [linux-next:master 2592/5283] drivers/net/ethernet/cadence/macb_main.c:4107 macb_taprio_setup_replace() warn: unsigned 'start_time' is never less than zero 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).