Re: [PATCH V4] can: usb: f81604: add Fintek F81604 support
From: kernel test robot
Date: Thu Apr 13 2023 - 07:51:01 EST
Hi Ji-Ze,
kernel test robot noticed the following build warnings:
[auto build test WARNING on mkl-can-next/testing]
[also build test WARNING on linus/master v6.3-rc6 next-20230412]
[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#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Ji-Ze-Hong-Peter-Hong/can-usb-f81604-add-Fintek-F81604-support/20230413-164625
base: https://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next.git testing
patch link: https://lore.kernel.org/r/20230413084253.1524-1-peter_hong%40fintek.com.tw
patch subject: [PATCH V4] can: usb: f81604: add Fintek F81604 support
config: sparc-allyesconfig (https://download.01.org/0day-ci/archive/20230413/202304131914.TQf2Z1pL-lkp@xxxxxxxxx/config)
compiler: sparc64-linux-gcc (GCC) 12.1.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/225b03ddc1d9e5b6a8dac065d29288fc8ceb1357
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Ji-Ze-Hong-Peter-Hong/can-usb-f81604-add-Fintek-F81604-support/20230413-164625
git checkout 225b03ddc1d9e5b6a8dac065d29288fc8ceb1357
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=sparc olddefconfig
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=sparc SHELL=/bin/bash drivers/net/
If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@xxxxxxxxx>
| Link: https://lore.kernel.org/oe-kbuild-all/202304131914.TQf2Z1pL-lkp@xxxxxxxxx/
All warnings (new ones prefixed by >>):
drivers/net/can/usb/f81604.c: In function 'f81604_clear_reg_work':
>> drivers/net/can/usb/f81604.c:894:28: warning: variable 'netdev' set but not used [-Wunused-but-set-variable]
894 | struct net_device *netdev;
| ^~~~~~
drivers/net/can/usb/f81604.c: In function 'f81604_disconnect':
>> drivers/net/can/usb/f81604.c:1086:34: warning: variable 'port_priv' set but not used [-Wunused-but-set-variable]
1086 | struct f81604_port_priv *port_priv;
| ^~~~~~~~~
vim +/netdev +894 drivers/net/can/usb/f81604.c
890
891 static void f81604_clear_reg_work(struct work_struct *work)
892 {
893 struct f81604_port_priv *priv;
> 894 struct net_device *netdev;
895 u8 tmp;
896
897 priv = container_of(work, struct f81604_port_priv, clear_reg_work);
898 netdev = priv->netdev;
899
900 /* dummy read for clear Arbitration lost capture(ALC) register. */
901 if (test_and_clear_bit(F81604_CLEAR_ALC, &priv->clear_flags))
902 f81604_sja1000_read(priv, F81604_SJA1000_ALC, &tmp);
903
904 /* dummy read for clear Error code capture(ECC) register. */
905 if (test_and_clear_bit(F81604_CLEAR_ECC, &priv->clear_flags))
906 f81604_sja1000_read(priv, F81604_SJA1000_ECC, &tmp);
907
908 /* dummy write for clear data overrun flag. */
909 if (test_and_clear_bit(F81604_CLEAR_OVERRUN, &priv->clear_flags))
910 f81604_sja1000_write(priv, F81604_SJA1000_CMR,
911 F81604_SJA1000_CMD_CDO);
912 }
913
914 static netdev_tx_t f81604_start_xmit(struct sk_buff *skb,
915 struct net_device *netdev)
916 {
917 struct can_frame *cf = (struct can_frame *)skb->data;
918 struct f81604_port_priv *priv = netdev_priv(netdev);
919 struct net_device_stats *stats = &netdev->stats;
920 struct f81604_can_frame *frame;
921 u32 id = priv->netdev->dev_id;
922 struct urb *write_urb;
923 u8 *bulk_write_buffer;
924 int ret;
925
926 if (can_dev_dropped_skb(netdev, skb))
927 return NETDEV_TX_OK;
928
929 netif_stop_queue(netdev);
930
931 write_urb = usb_alloc_urb(0, GFP_ATOMIC);
932 if (!write_urb)
933 goto nomem_urb;
934
935 bulk_write_buffer = kzalloc(F81604_DATA_SIZE, GFP_ATOMIC);
936 if (!bulk_write_buffer)
937 goto nomem_buf;
938
939 usb_fill_bulk_urb(write_urb, priv->dev,
940 usb_sndbulkpipe(priv->dev, bulk_out_addr[id]),
941 bulk_write_buffer, F81604_DATA_SIZE,
942 f81604_write_bulk_callback, priv->netdev);
943
944 write_urb->transfer_flags |= URB_FREE_BUFFER;
945
946 frame = (struct f81604_can_frame *)bulk_write_buffer;
947 frame->cmd = F81604_CMD_DATA;
948 frame->dlc = cf->len;
949
950 if (cf->can_id & CAN_RTR_FLAG)
951 frame->dlc |= F81604_DLC_RTR_BIT;
952
953 if (cf->can_id & CAN_EFF_FLAG) {
954 id = (cf->can_id & CAN_EFF_MASK) << 3;
955 put_unaligned_be32(id, &frame->eff.id);
956
957 frame->dlc |= F81604_DLC_EFF_BIT;
958
959 if (!(cf->can_id & CAN_RTR_FLAG))
960 memcpy(&frame->eff.data, cf->data, cf->len);
961 } else {
962 id = (cf->can_id & CAN_SFF_MASK) << 5;
963 put_unaligned_be16(id, &frame->sff.id);
964
965 if (!(cf->can_id & CAN_RTR_FLAG))
966 memcpy(&frame->sff.data, cf->data, cf->len);
967 }
968
969 can_put_echo_skb(skb, netdev, 0, 0);
970
971 ret = usb_submit_urb(write_urb, GFP_ATOMIC);
972 if (ret) {
973 netdev_err(netdev, "%s: failed to resubmit tx bulk urb: %pe\n",
974 __func__, ERR_PTR(ret));
975
976 can_free_echo_skb(netdev, 0, NULL);
977 stats->tx_dropped++;
978
979 if (ret == -ENODEV)
980 netif_device_detach(netdev);
981 else
982 netif_wake_queue(netdev);
983 }
984
985 /* let usb core take care of this urb */
986 usb_free_urb(write_urb);
987
988 return NETDEV_TX_OK;
989
990 nomem_buf:
991 usb_free_urb(write_urb);
992
993 nomem_urb:
994 dev_kfree_skb(skb);
995 stats->tx_dropped++;
996 netif_wake_queue(netdev);
997
998 return NETDEV_TX_OK;
999 }
1000
1001 static int f81604_get_berr_counter(const struct net_device *netdev,
1002 struct can_berr_counter *bec)
1003 {
1004 struct f81604_port_priv *priv = netdev_priv(netdev);
1005 u8 txerr, rxerr;
1006 int ret;
1007
1008 ret = f81604_sja1000_read(priv, F81604_SJA1000_TXERR, &txerr);
1009 if (ret)
1010 return ret;
1011
1012 ret = f81604_sja1000_read(priv, F81604_SJA1000_RXERR, &rxerr);
1013 if (ret)
1014 return ret;
1015
1016 bec->txerr = txerr;
1017 bec->rxerr = rxerr;
1018
1019 return 0;
1020 }
1021
1022 /* Open USB device */
1023 static int f81604_open(struct net_device *netdev)
1024 {
1025 int ret;
1026
1027 ret = open_candev(netdev);
1028 if (ret)
1029 return ret;
1030
1031 ret = f81604_start(netdev);
1032 if (ret)
1033 goto start_failed;
1034
1035 netif_start_queue(netdev);
1036 return 0;
1037
1038 start_failed:
1039 if (ret == -ENODEV)
1040 netif_device_detach(netdev);
1041
1042 close_candev(netdev);
1043
1044 return ret;
1045 }
1046
1047 /* Close USB device */
1048 static int f81604_close(struct net_device *netdev)
1049 {
1050 struct f81604_port_priv *priv = netdev_priv(netdev);
1051
1052 f81604_set_reset_mode(priv);
1053
1054 netif_stop_queue(netdev);
1055 cancel_work_sync(&priv->clear_reg_work);
1056 close_candev(netdev);
1057
1058 f81604_unregister_urbs(priv);
1059
1060 return 0;
1061 }
1062
1063 static const struct net_device_ops f81604_netdev_ops = {
1064 .ndo_open = f81604_open,
1065 .ndo_stop = f81604_close,
1066 .ndo_start_xmit = f81604_start_xmit,
1067 .ndo_change_mtu = can_change_mtu,
1068 };
1069
1070 static const struct can_bittiming_const f81604_bittiming_const = {
1071 .name = KBUILD_MODNAME,
1072 .tseg1_min = 1,
1073 .tseg1_max = 16,
1074 .tseg2_min = 1,
1075 .tseg2_max = 8,
1076 .sjw_max = 4,
1077 .brp_min = 1,
1078 .brp_max = 64,
1079 .brp_inc = 1,
1080 };
1081
1082 /* Called by the usb core when driver is unloaded or device is removed */
1083 static void f81604_disconnect(struct usb_interface *intf)
1084 {
1085 struct f81604_priv *priv = usb_get_intfdata(intf);
> 1086 struct f81604_port_priv *port_priv;
1087 int i;
1088
1089 for (i = 0; i < ARRAY_SIZE(priv->netdev); ++i) {
1090 if (!priv->netdev[i])
1091 continue;
1092
1093 port_priv = netdev_priv(priv->netdev[i]);
1094
1095 unregister_netdev(priv->netdev[i]);
1096 free_candev(priv->netdev[i]);
1097 }
1098 }
1099
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests