RE: [bug report] phy: renesas: phy-rcar-gen2: Add support for r8a77470

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Dan Carpenter,

Thanks for the report.   Yes, the hardcoded check  "channel_num > 2" to be replaced with 
some variable check to fix this issue.

How to reproduce this issue? So that I can I provide a fix.

I tried using smatch tool, but I get a different warning.

biju@be1yocto:/data/biju/linux-next$ make -j8 uImage LOADADDR=80008000 CHECK="/data/biju/smatch/smatch -p=kernel" C=1 | tee warns.txt
  CALL    scripts/atomic/check-atomics.sh
  CALL    scripts/checksyscalls.sh
  CHK     include/generated/compile.h
  CHECK   drivers/phy/renesas/phy-rcar-gen2.c
drivers/phy/renesas/phy-rcar-gen2.c:354 rcar_gen2_phy_probe() warn: passing zero to 'PTR_ERR'
drivers/phy/renesas/phy-rcar-gen2.c:360 rcar_gen2_phy_probe() warn: passing zero to 'PTR_ERR'
drivers/phy/renesas/phy-rcar-gen2.c:409 rcar_gen2_phy_probe() warn: passing zero to 'PTR_ERR'
drivers/phy/renesas/phy-rcar-gen2.c:420 rcar_gen2_phy_probe() warn: passing zero to 'PTR_ERR'
  CC      drivers/phy/renesas/phy-rcar-gen2.o
  AR      drivers/phy/renesas/built-in.a
  AR      drivers/phy/built-in.a
  AR      drivers/built-in.a
  GEN     .version
  CHK     include/generated/compile.h
  UPD     include/generated/compile.h
  CHECK   init/version.c
  CC      init/version.o
  AR      init/built-in.a
  LD      vmlinux.o
  MODPOST vmlinux.o
  KSYM    .tmp_kallsyms1.o
  KSYM    .tmp_kallsyms2.o
  LD      vmlinux
  SORTEX  vmlinux
  SYSMAP  System.map
  OBJCOPY arch/arm/boot/Image
  Kernel: arch/arm/boot/Image is ready
  GZIP    arch/arm/boot/compressed/piggy_data
  AS      arch/arm/boot/compressed/piggy.o
  LD      arch/arm/boot/compressed/vmlinux
  OBJCOPY arch/arm/boot/zImage
  Kernel: arch/arm/boot/zImage is ready
  UIMAGE  arch/arm/boot/uImage
Image Name:   Linux-5.1.0-rc6-next-20190423-00
Created:      Tue May  7 07:40:23 2019
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    4671240 Bytes = 4561.76 kB = 4.45 MB
Load Address: 80008000
Entry Point:  80008000
  Kernel: arch/arm/boot/uImage is ready
biju@be1yocto:/data/biju/linux-next$ /data/biju/smatch/
c2xml           compat/         ctags           Documentation/  graph           obfuscate       smatch_data/    sparse          sparsei         test-dissect    test-lexing     test-parsing    validation/     
cgcc            compile         cwchash/        example         gvpr/           smatch          smatch_scripts/ sparsec         sparse-llvm     test-inspect    test-linearize  test-unssa      
biju@be1yocto:/data/biju/linux-next$ /data/biju/smatch/smatch_scripts/kchecker drivers/phy/renesas/
  CHECK   scripts/mod/empty.c
  CALL    scripts/checksyscalls.sh
  CALL    scripts/atomic/check-atomics.sh
  CHECK   drivers/phy/renesas/phy-rcar-gen2.c
drivers/phy/renesas/phy-rcar-gen2.c:354 rcar_gen2_phy_probe() warn: passing zero to 'PTR_ERR'
drivers/phy/renesas/phy-rcar-gen2.c:360 rcar_gen2_phy_probe() warn: passing zero to 'PTR_ERR'
drivers/phy/renesas/phy-rcar-gen2.c:409 rcar_gen2_phy_probe() warn: passing zero to 'PTR_ERR'
drivers/phy/renesas/phy-rcar-gen2.c:420 rcar_gen2_phy_probe() warn: passing zero to 'PTR_ERR'
  CHECK   drivers/phy/renesas/phy-rcar-gen3-usb2.c
drivers/phy/renesas/phy-rcar-gen3-usb2.c:602 rcar_gen3_phy_usb2_probe() warn: passing zero to 'PTR_ERR'
drivers/phy/renesas/phy-rcar-gen3-usb2.c:670 rcar_gen3_phy_usb2_probe() warn: passing zero to 'PTR_ERR'
biju@be1yocto:/data/biju/linux-next$

regards,
Biju

> -----Original Message-----
> From: Dan Carpenter <dan.carpenter@xxxxxxxxxx>
> Sent: 03 May 2019 14:10
> To: Biju Das <biju.das@xxxxxxxxxxxxxx>
> Cc: kernel-janitors@xxxxxxxxxxxxxxx
> Subject: [bug report] phy: renesas: phy-rcar-gen2: Add support for r8a77470
> 
> Hello Biju Das,
> 
> The patch b7187e001a10: "phy: renesas: phy-rcar-gen2: Add support for
> r8a77470" from Apr 10, 2019, leads to the following static checker
> warning:
> 
> 	drivers/phy/renesas/phy-rcar-gen2.c:403 rcar_gen2_phy_probe()
> 	warn: array off by one? 'data->select_value[channel_num]'
> 
> drivers/phy/renesas/phy-rcar-gen2.c
>    262  static const u32 pci_select_value[][PHYS_PER_CHANNEL] = {
>    263          [0]     = { USBHS_UGCTRL2_USB0SEL_PCI,
> USBHS_UGCTRL2_USB0SEL_HS_USB },
>    264          [2]     = { USBHS_UGCTRL2_USB2SEL_PCI,
> USBHS_UGCTRL2_USB2SEL_USB30 },
> 
> This select array has three elements.
> 
>    265  };
>    266
>    267  static const u32 usb20_select_value[][PHYS_PER_CHANNEL] = {
>    268          { USBHS_UGCTRL2_USB0SEL_USB20,
> USBHS_UGCTRL2_USB0SEL_HS_USB20 },
> 
> But this one only has two.
> 
>    269  };
>    270
>    271  static const struct rcar_gen2_phy_data rcar_gen2_usb_phy_data = {
>    272          .gen2_phy_ops = &rcar_gen2_phy_ops,
>    273          .select_value = pci_select_value,
>    274  };
>    275
>    276  static const struct rcar_gen2_phy_data rz_g1c_usb_phy_data = {
>    277          .gen2_phy_ops = &rz_g1c_phy_ops,
>    278          .select_value = usb20_select_value,
>    279  };
> 
> [ snip ]
> 
>    382          for_each_child_of_node(dev->of_node, np) {
>    383                  struct rcar_gen2_channel *channel = drv->channels + i;
>    384                  u32 channel_num;
>    385                  int error, n;
>    386
>    387                  channel->of_node = np;
>    388                  channel->drv = drv;
>    389                  channel->selected_phy = -1;
>    390
>    391                  error = of_property_read_u32(np, "reg", &channel_num);
>    392                  if (error || channel_num > 2) {
>                                      ^^^^^^^^^^^^^^^ The code seems to assume they all
> have 3 elements
> 
>    393                          dev_err(dev, "Invalid \"reg\" property\n");
>    394                          return error;
>    395                  }
>    396                  channel->select_mask = select_mask[channel_num];
>    397
>    398                  for (n = 0; n < PHYS_PER_CHANNEL; n++) {
>    399                          struct rcar_gen2_phy *phy = &channel->phys[n];
>    400
>    401                          phy->channel = channel;
>    402                          phy->number = n;
>    403                          phy->select_value = data->select_value[channel_num][n];
>                                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Smatch
> warning.
> 
>    404
>    405                          phy->phy = devm_phy_create(dev, NULL,
>    406                                                     data->gen2_phy_ops);
>    407                          if (IS_ERR(phy->phy)) {
>    408                                  dev_err(dev, "Failed to create PHY\n");
>    409                                  return PTR_ERR(phy->phy);
>    410                          }
>    411                          phy_set_drvdata(phy->phy, phy);
>    412                  }
>    413
>    414                  i++;
>    415          }
> 
> regards,
> dan carpenter




[Index of Archives]     [Kernel Development]     [Kernel Announce]     [Kernel Newbies]     [Linux Networking Development]     [Share Photos]     [IDE]     [Security]     [Git]     [Netfilter]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Device Mapper]

  Powered by Linux