Hi Mauro,

I love your patch! Perhaps something to improve:

[auto build test WARNING on linuxtv-media/master]
[also build test WARNING on v4.18-rc3 next-20180704]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improve the system]

url:    
https://github.com/0day-ci/linux/commits/Mauro-Carvalho-Chehab/DVB-represent-frequencies-at-tuner-frontend-info-in-Hz/20180705-105703
base:   git://linuxtv.org/media_tree.git master
config: x86_64-randconfig-x004-201826 (attached as .config)
compiler: gcc-7 (Debian 7.3.0-16) 7.3.0
reproduce:
        # save the attached .config to linux build tree
        make ARCH=x86_64 

All warnings (new ones prefixed by >>):

   drivers/media/dvb-core/dvb_frontend.c: In function 
'dvb_frontend_handle_ioctl':
>> drivers/media/dvb-core/dvb_frontend.c:2396:25: warning: argument to 'sizeof' 
>> in 'memset' call is the same expression as the destination; did you mean to 
>> dereference it? [-Wsizeof-pointer-memaccess]
      memset(info, 0, sizeof(info));
                            ^

vim +2396 drivers/media/dvb-core/dvb_frontend.c

  2295  
  2296  static int dvb_frontend_handle_ioctl(struct file *file,
  2297                                       unsigned int cmd, void *parg)
  2298  {
  2299          struct dvb_device *dvbdev = file->private_data;
  2300          struct dvb_frontend *fe = dvbdev->priv;
  2301          struct dvb_frontend_private *fepriv = fe->frontend_priv;
  2302          struct dtv_frontend_properties *c = &fe->dtv_property_cache;
  2303          int i, err = -ENOTSUPP;
  2304  
  2305          dev_dbg(fe->dvb->device, "%s:\n", __func__);
  2306  
  2307          switch (cmd) {
  2308          case FE_SET_PROPERTY: {
  2309                  struct dtv_properties *tvps = parg;
  2310                  struct dtv_property *tvp = NULL;
  2311  
  2312                  dev_dbg(fe->dvb->device, "%s: properties.num = %d\n",
  2313                          __func__, tvps->num);
  2314                  dev_dbg(fe->dvb->device, "%s: properties.props = %p\n",
  2315                          __func__, tvps->props);
  2316  
  2317                  /*
  2318                   * Put an arbitrary limit on the number of messages 
that can
  2319                   * be sent at once
  2320                   */
  2321                  if (!tvps->num || (tvps->num > DTV_IOCTL_MAX_MSGS))
  2322                          return -EINVAL;
  2323  
  2324                  tvp = memdup_user((void __user *)tvps->props, tvps->num 
* sizeof(*tvp));
  2325                  if (IS_ERR(tvp))
  2326                          return PTR_ERR(tvp);
  2327  
  2328                  for (i = 0; i < tvps->num; i++) {
  2329                          err = dtv_property_process_set(fe, file,
  2330                                                         (tvp + i)->cmd,
  2331                                                         (tvp + 
i)->u.data);
  2332                          if (err < 0) {
  2333                                  kfree(tvp);
  2334                                  return err;
  2335                          }
  2336                  }
  2337                  kfree(tvp);
  2338                  err = 0;
  2339                  break;
  2340          }
  2341          case FE_GET_PROPERTY: {
  2342                  struct dtv_properties *tvps = parg;
  2343                  struct dtv_property *tvp = NULL;
  2344                  struct dtv_frontend_properties getp = 
fe->dtv_property_cache;
  2345  
  2346                  dev_dbg(fe->dvb->device, "%s: properties.num = %d\n",
  2347                          __func__, tvps->num);
  2348                  dev_dbg(fe->dvb->device, "%s: properties.props = %p\n",
  2349                          __func__, tvps->props);
  2350  
  2351                  /*
  2352                   * Put an arbitrary limit on the number of messages 
that can
  2353                   * be sent at once
  2354                   */
  2355                  if (!tvps->num || (tvps->num > DTV_IOCTL_MAX_MSGS))
  2356                          return -EINVAL;
  2357  
  2358                  tvp = memdup_user((void __user *)tvps->props, tvps->num 
* sizeof(*tvp));
  2359                  if (IS_ERR(tvp))
  2360                          return PTR_ERR(tvp);
  2361  
  2362                  /*
  2363                   * Let's use our own copy of property cache, in order to
  2364                   * avoid mangling with DTV zigzag logic, as drivers 
might
  2365                   * return crap, if they don't check if the data is 
available
  2366                   * before updating the properties cache.
  2367                   */
  2368                  if (fepriv->state != FESTATE_IDLE) {
  2369                          err = dtv_get_frontend(fe, &getp, NULL);
  2370                          if (err < 0) {
  2371                                  kfree(tvp);
  2372                                  return err;
  2373                          }
  2374                  }
  2375                  for (i = 0; i < tvps->num; i++) {
  2376                          err = dtv_property_process_get(fe, &getp,
  2377                                                         tvp + i, file);
  2378                          if (err < 0) {
  2379                                  kfree(tvp);
  2380                                  return err;
  2381                          }
  2382                  }
  2383  
  2384                  if (copy_to_user((void __user *)tvps->props, tvp,
  2385                                   tvps->num * sizeof(struct 
dtv_property))) {
  2386                          kfree(tvp);
  2387                          return -EFAULT;
  2388                  }
  2389                  kfree(tvp);
  2390                  err = 0;
  2391                  break;
  2392          }
  2393  
  2394          case FE_GET_INFO: {
  2395                  struct dvb_frontend_info *info = parg;
> 2396                  memset(info, 0, sizeof(info));
  2397  
  2398                  dvb_frontend_get_frequency_limits(fe, 
&info->frequency_min, &info->frequency_max);
  2399                  strcpy(info->name, fe->ops.info.name);
  2400                  info->frequency_stepsize = 
fe->ops.info.frequency_stepsize_hz;
  2401                  info->frequency_tolerance = 
fe->ops.info.frequency_tolerance_hz;
  2402                  info->symbol_rate_min = fe->ops.info.symbol_rate_min;
  2403                  info->symbol_rate_max = fe->ops.info.symbol_rate_max;
  2404                  info->symbol_rate_tolerance = 
fe->ops.info.symbol_rate_tolerance;
  2405                  info->caps = fe->ops.info.caps;
  2406  
  2407                  /* If the standard is for satellite, convert 
frequencies to kHz */
  2408                  switch (c->delivery_system) {
  2409                  case SYS_DVBS:
  2410                  case SYS_DVBS2:
  2411                  case SYS_TURBO:
  2412                  case SYS_ISDBS:
  2413                          info->frequency_stepsize = 
fe->ops.info.frequency_stepsize_hz / kHz;
  2414                          info->frequency_tolerance = 
fe->ops.info.frequency_tolerance_hz / kHz;
  2415                          break;
  2416                  default:
  2417                          info->frequency_stepsize = 
fe->ops.info.frequency_stepsize_hz;
  2418                          info->frequency_tolerance = 
fe->ops.info.frequency_tolerance_hz;
  2419                          break;
  2420                  }
  2421  
  2422                  /*
  2423                   * Associate the 4 delivery systems supported by DVBv3
  2424                   * API with their DVBv5 counterpart. For the other 
standards,
  2425                   * use the closest type, assuming that it would 
hopefully
  2426                   * work with a DVBv3 application.
  2427                   * It should be noticed that, on multi-frontend devices 
with
  2428                   * different types (terrestrial and cable, for example),
  2429                   * a pure DVBv3 application won't be able to use all 
delivery
  2430                   * systems. Yet, changing the DVBv5 cache to the other 
delivery
  2431                   * system should be enough for making it work.
  2432                   */
  2433                  switch (dvbv3_type(c->delivery_system)) {
  2434                  case DVBV3_QPSK:
  2435                          info->type = FE_QPSK;
  2436                          break;
  2437                  case DVBV3_ATSC:
  2438                          info->type = FE_ATSC;
  2439                          break;
  2440                  case DVBV3_QAM:
  2441                          info->type = FE_QAM;
  2442                          break;
  2443                  case DVBV3_OFDM:
  2444                          info->type = FE_OFDM;
  2445                          break;
  2446                  default:
  2447                          dev_err(fe->dvb->device,
  2448                                  "%s: doesn't know how to handle a DVBv3 
call to delivery system %i\n",
  2449                                  __func__, c->delivery_system);
  2450                          info->type = FE_OFDM;
  2451                  }
  2452                  dev_dbg(fe->dvb->device, "%s: current delivery system 
on cache: %d, V3 type: %d\n",
  2453                          __func__, c->delivery_system, info->type);
  2454  
  2455                  /* Set CAN_INVERSION_AUTO bit on in other than oneshot 
mode */
  2456                  if (!(fepriv->tune_mode_flags & FE_TUNE_MODE_ONESHOT))
  2457                          info->caps |= FE_CAN_INVERSION_AUTO;
  2458                  err = 0;
  2459                  break;
  2460          }
  2461  
  2462          case FE_READ_STATUS: {
  2463                  enum fe_status *status = parg;
  2464  
  2465                  /* if retune was requested but hasn't occurred yet, 
prevent
  2466                   * that user get signal state from previous tuning */
  2467                  if (fepriv->state == FESTATE_RETUNE ||
  2468                      fepriv->state == FESTATE_ERROR) {
  2469                          err = 0;
  2470                          *status = 0;
  2471                          break;
  2472                  }
  2473  
  2474                  if (fe->ops.read_status)
  2475                          err = fe->ops.read_status(fe, status);
  2476                  break;
  2477          }
  2478  
  2479          case FE_DISEQC_RESET_OVERLOAD:
  2480                  if (fe->ops.diseqc_reset_overload) {
  2481                          err = fe->ops.diseqc_reset_overload(fe);
  2482                          fepriv->state = FESTATE_DISEQC;
  2483                          fepriv->status = 0;
  2484                  }
  2485                  break;
  2486  
  2487          case FE_DISEQC_SEND_MASTER_CMD:
  2488                  if (fe->ops.diseqc_send_master_cmd) {
  2489                          struct dvb_diseqc_master_cmd *cmd = parg;
  2490  
  2491                          if (cmd->msg_len > sizeof(cmd->msg)) {
  2492                                  err = -EINVAL;
  2493                                  break;
  2494                          }
  2495                          err = fe->ops.diseqc_send_master_cmd(fe, cmd);
  2496                          fepriv->state = FESTATE_DISEQC;
  2497                          fepriv->status = 0;
  2498                  }
  2499                  break;
  2500  
  2501          case FE_DISEQC_SEND_BURST:
  2502                  if (fe->ops.diseqc_send_burst) {
  2503                          err = fe->ops.diseqc_send_burst(fe,
  2504                                                  (enum 
fe_sec_mini_cmd)parg);
  2505                          fepriv->state = FESTATE_DISEQC;
  2506                          fepriv->status = 0;
  2507                  }
  2508                  break;
  2509  
  2510          case FE_SET_TONE:
  2511                  if (fe->ops.set_tone) {
  2512                          err = fe->ops.set_tone(fe,
  2513                                                 (enum 
fe_sec_tone_mode)parg);
  2514                          fepriv->tone = (enum fe_sec_tone_mode)parg;
  2515                          fepriv->state = FESTATE_DISEQC;
  2516                          fepriv->status = 0;
  2517                  }
  2518                  break;
  2519  
  2520          case FE_SET_VOLTAGE:
  2521                  if (fe->ops.set_voltage) {
  2522                          err = fe->ops.set_voltage(fe,
  2523                                                    (enum 
fe_sec_voltage)parg);
  2524                          fepriv->voltage = (enum fe_sec_voltage)parg;
  2525                          fepriv->state = FESTATE_DISEQC;
  2526                          fepriv->status = 0;
  2527                  }
  2528                  break;
  2529  
  2530          case FE_DISEQC_RECV_SLAVE_REPLY:
  2531                  if (fe->ops.diseqc_recv_slave_reply)
  2532                          err = fe->ops.diseqc_recv_slave_reply(fe, parg);
  2533                  break;
  2534  
  2535          case FE_ENABLE_HIGH_LNB_VOLTAGE:
  2536                  if (fe->ops.enable_high_lnb_voltage)
  2537                          err = fe->ops.enable_high_lnb_voltage(fe, 
(long)parg);
  2538                  break;
  2539  
  2540          case FE_SET_FRONTEND_TUNE_MODE:
  2541                  fepriv->tune_mode_flags = (unsigned long)parg;
  2542                  err = 0;
  2543                  break;
  2544  
  2545          /* DEPRECATED dish control ioctls */
  2546  
  2547          case FE_DISHNETWORK_SEND_LEGACY_CMD:
  2548                  if (fe->ops.dishnetwork_send_legacy_command) {
  2549                          err = 
fe->ops.dishnetwork_send_legacy_command(fe,
  2550                                                           (unsigned 
long)parg);
  2551                          fepriv->state = FESTATE_DISEQC;
  2552                          fepriv->status = 0;
  2553                  } else if (fe->ops.set_voltage) {
  2554                          /*
  2555                           * NOTE: This is a fallback condition.  Some 
frontends
  2556                           * (stv0299 for instance) take longer than 
8msec to
  2557                           * respond to a set_voltage command.  Those 
switches
  2558                           * need custom routines to switch properly.  
For all
  2559                           * other frontends, the following should work 
ok.
  2560                           * Dish network legacy switches (as used by 
Dish500)
  2561                           * are controlled by sending 9-bit command words
  2562                           * spaced 8msec apart.
  2563                           * the actual command word is switch/port 
dependent
  2564                           * so it is up to the userspace application to 
send
  2565                           * the right command.
  2566                           * The command must always start with a '0' 
after
  2567                           * initialization, so parg is 8 bits and does 
not
  2568                           * include the initialization or start bit
  2569                           */
  2570                          unsigned long swcmd = ((unsigned long)parg) << 
1;
  2571                          ktime_t nexttime;
  2572                          ktime_t tv[10];
  2573                          int i;
  2574                          u8 last = 1;
  2575  
  2576                          if (dvb_frontend_debug)
  2577                                  dprintk("%s switch command: 0x%04lx\n",
  2578                                          __func__, swcmd);
  2579                          nexttime = ktime_get_boottime();
  2580                          if (dvb_frontend_debug)
  2581                                  tv[0] = nexttime;
  2582                          /* before sending a command, initialize by 
sending
  2583                           * a 32ms 18V to the switch
  2584                           */
  2585                          fe->ops.set_voltage(fe, SEC_VOLTAGE_18);
  2586                          dvb_frontend_sleep_until(&nexttime, 32000);
  2587  
  2588                          for (i = 0; i < 9; i++) {
  2589                                  if (dvb_frontend_debug)
  2590                                          tv[i + 1] = 
ktime_get_boottime();
  2591                                  if ((swcmd & 0x01) != last) {
  2592                                          /* set voltage to (last ? 13V : 
18V) */
  2593                                          fe->ops.set_voltage(fe, (last) 
? SEC_VOLTAGE_13 : SEC_VOLTAGE_18);
  2594                                          last = (last) ? 0 : 1;
  2595                                  }
  2596                                  swcmd = swcmd >> 1;
  2597                                  if (i != 8)
  2598                                          
dvb_frontend_sleep_until(&nexttime, 8000);
  2599                          }
  2600                          if (dvb_frontend_debug) {
  2601                                  dprintk("%s(%d): switch delay (should 
be 32k followed by all 8k)\n",
  2602                                          __func__, fe->dvb->num);
  2603                                  for (i = 1; i < 10; i++)
  2604                                          pr_info("%d: %d\n", i,
  2605                                                  
(int)ktime_us_delta(tv[i], tv[i - 1]));
  2606                          }
  2607                          err = 0;
  2608                          fepriv->state = FESTATE_DISEQC;
  2609                          fepriv->status = 0;
  2610                  }
  2611                  break;
  2612  
  2613          /* DEPRECATED statistics ioctls */
  2614  
  2615          case FE_READ_BER:
  2616                  if (fe->ops.read_ber) {
  2617                          if (fepriv->thread)
  2618                                  err = fe->ops.read_ber(fe, parg);
  2619                          else
  2620                                  err = -EAGAIN;
  2621                  }
  2622                  break;
  2623  
  2624          case FE_READ_SIGNAL_STRENGTH:
  2625                  if (fe->ops.read_signal_strength) {
  2626                          if (fepriv->thread)
  2627                                  err = fe->ops.read_signal_strength(fe, 
parg);
  2628                          else
  2629                                  err = -EAGAIN;
  2630                  }
  2631                  break;
  2632  
  2633          case FE_READ_SNR:
  2634                  if (fe->ops.read_snr) {
  2635                          if (fepriv->thread)
  2636                                  err = fe->ops.read_snr(fe, parg);
  2637                          else
  2638                                  err = -EAGAIN;
  2639                  }
  2640                  break;
  2641  
  2642          case FE_READ_UNCORRECTED_BLOCKS:
  2643                  if (fe->ops.read_ucblocks) {
  2644                          if (fepriv->thread)
  2645                                  err = fe->ops.read_ucblocks(fe, parg);
  2646                          else
  2647                                  err = -EAGAIN;
  2648                  }
  2649                  break;
  2650  
  2651          /* DEPRECATED DVBv3 ioctls */
  2652  
  2653          case FE_SET_FRONTEND:
  2654                  err = dvbv3_set_delivery_system(fe);
  2655                  if (err)
  2656                          break;
  2657  
  2658                  err = dtv_property_cache_sync(fe, c, parg);
  2659                  if (err)
  2660                          break;
  2661                  err = dtv_set_frontend(fe);
  2662                  break;
  2663          case FE_GET_EVENT:
  2664                  err = dvb_frontend_get_event(fe, parg, file->f_flags);
  2665                  break;
  2666  
  2667          case FE_GET_FRONTEND: {
  2668                  struct dtv_frontend_properties getp = 
fe->dtv_property_cache;
  2669  
  2670                  /*
  2671                   * Let's use our own copy of property cache, in order to
  2672                   * avoid mangling with DTV zigzag logic, as drivers 
might
  2673                   * return crap, if they don't check if the data is 
available
  2674                   * before updating the properties cache.
  2675                   */
  2676                  err = dtv_get_frontend(fe, &getp, parg);
  2677                  break;
  2678          }
  2679  
  2680          default:
  2681                  return -ENOTSUPP;
  2682          } /* switch */
  2683  
  2684          return err;
  2685  }
  2686  

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

Attachment: .config.gz
Description: application/gzip

Reply via email to