Re: [PATCH v3 3/3] remoteproc: Add AVM WASP driver

From: kernel test robot
Date: Fri Jul 22 2022 - 11:45:01 EST


Hi Daniel,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on remoteproc/rproc-next]
[also build test WARNING on robh/for-next linus/master v5.19-rc7 next-20220721]
[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/Daniel-Kestrel/Add-support-for-WASP-SoC-on-AVM-router-boards/20220722-033724
base: git://git.kernel.org/pub/scm/linux/kernel/git/remoteproc/linux.git rproc-next
config: i386-allyesconfig (https://download.01.org/0day-ci/archive/20220722/202207222313.GAofKYST-lkp@xxxxxxxxx/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project 72686d68c137551cce816416190a18d45b4d4e2a)
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/b737a00511b74767e3eb13b2ddfba8e6dfe8e5c2
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Daniel-Kestrel/Add-support-for-WASP-SoC-on-AVM-router-boards/20220722-033724
git checkout b737a00511b74767e3eb13b2ddfba8e6dfe8e5c2
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=i386 SHELL=/bin/bash drivers/remoteproc/

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@xxxxxxxxx>

All warnings (new ones prefixed by >>):

>> drivers/remoteproc/avm_wasp.c:582:6: warning: variable 'ret' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
if (!avmwasp->linux_blob) {
^~~~~~~~~~~~~~~~~~~~
drivers/remoteproc/avm_wasp.c:776:9: note: uninitialized use occurs here
return ret;
^~~
drivers/remoteproc/avm_wasp.c:582:2: note: remove the 'if' if its condition is always false
if (!avmwasp->linux_blob) {
^~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/remoteproc/avm_wasp.c:566:9: note: initialize the variable 'ret' to silence this warning
int ret;
^
= 0
1 warning generated.


vim +582 drivers/remoteproc/avm_wasp.c

545
546 /**
547 * avm_wasp_load_initramfs_image() - load initramfs image to WASP
548 * @avmwasp: pointer to drivers private avm_wasp_rproc structure
549 *
550 * Uses the lan port specified from DT to load the initramfs to
551 * WASP after the network boot firmware was successfully started.
552 * Communication is done by using raw sockets.
553 * There are several commands and status values which are checked.
554 * First a discovery packet is received and then each data packet
555 * is acknowledged by the WASP network boot firmware.
556 * First packet needs to prepend the load address and last packet
557 * needs to append the execution address.
558 *
559 * Return: 0 on Success, -EFAULT if errors with the WASP send protocol
560 * have occurred, -EAGAIN if the wasp network interface is down or the
561 * error returned from the failed operating system function or service
562 */
563 static int avm_wasp_load_initramfs_image(struct avm_wasp_rproc *avmwasp)
564 {
565 bool done = false;
566 int ret;
567 u32 num_chunks, chunk_counter;
568 short interface_flags;
569 const u8 *firmware, *firmware_end;
570 struct device *dev = &avmwasp->pdev->dev;
571 struct kvec socket_kvec;
572 struct msghdr socket_msghdr;
573 struct net_device *send_netdev;
574 struct sockaddr send_sock_addr;
575 struct sockaddr_ll send_socket_address;
576 struct socket *wasp_socket;
577 struct wasp_packet *packet = (struct wasp_packet *)
578 (avmwasp->buffer);
579 struct __kernel_old_timeval timeout;
580 time64_t start_time, current_time;
581
> 582 if (!avmwasp->linux_blob) {
583 dev_err(dev, "error accessing initramfs image\n");
584 goto err;
585 }
586
587 firmware = avmwasp->linux_blob->data;
588 firmware_end = firmware + avmwasp->linux_blob->size;
589
590 ret = sock_create_kern(&init_net, PF_PACKET, SOCK_RAW,
591 htons(ETH_TYPE_ATH_ECPS_FRAME),
592 &wasp_socket);
593 if (ret < 0) {
594 dev_err(dev, "error opening recv socket: %d\n", ret);
595 goto err;
596 }
597
598 timeout.tv_sec = 10;
599 timeout.tv_usec = 0;
600 ret = sock_setsockopt(wasp_socket, SOL_SOCKET, SO_RCVTIMEO_OLD,
601 KERNEL_SOCKPTR(&timeout), sizeof(timeout));
602 if (ret < 0) {
603 dev_err(dev, "error SO_RCVTIMEO recv socket: %d\n", ret);
604 goto err_socket;
605 }
606
607 ret = sock_setsockopt(wasp_socket, SOL_SOCKET, SO_SNDTIMEO_OLD,
608 KERNEL_SOCKPTR(&timeout), sizeof(timeout));
609 if (ret < 0) {
610 dev_err(dev, "error SO_SNDTIMEO send socket: %d\n", ret);
611 goto err_socket;
612 }
613
614 rcu_read_lock();
615 send_netdev = dev_get_by_name_rcu(sock_net(wasp_socket->sk),
616 avmwasp->loader_port);
617 if (send_netdev)
618 interface_flags = (short)dev_get_flags(send_netdev);
619 rcu_read_unlock();
620
621 if (IS_ERR_OR_NULL(send_netdev)) {
622 dev_err(dev, "error accessing net device\n");
623 ret = -ENODEV;
624 goto err_socket;
625 }
626
627 if (!(interface_flags & IFF_UP && interface_flags & IFF_RUNNING)) {
628 dev_err(dev, "error wasp interface %s is down\n",
629 avmwasp->loader_port);
630 ret = -EAGAIN;
631 goto err_socket;
632 }
633
634 avmwasp->ifindex = send_netdev->ifindex;
635 ret = dev_get_mac_address(&send_sock_addr, &init_net,
636 avmwasp->loader_port);
637 if (ret < 0) {
638 dev_err(dev, "error getting mac address: %d\n", ret);
639 goto err_socket;
640 }
641
642 send_socket_address.sll_halen = ETH_ALEN;
643 send_socket_address.sll_ifindex = avmwasp->ifindex;
644 memset(&socket_msghdr, 0, sizeof(socket_msghdr));
645 socket_msghdr.msg_name = (struct sockaddr *)&send_socket_address;
646 socket_msghdr.msg_namelen = sizeof(struct sockaddr_ll);
647
648 start_time = ktime_get_seconds();
649
650 while (!done) {
651 current_time = ktime_get_seconds();
652 if ((current_time - start_time) > ETH_SEND_LOOP_TIMEOUT_SECS) {
653 dev_err(dev,
654 "waiting for packet from WASP timed out\n");
655 ret = -ETIMEDOUT;
656 goto err_socket;
657 }
658
659 socket_kvec.iov_base = avmwasp->buffer;
660 socket_kvec.iov_len = ETH_BUF_SIZE;
661 ret = kernel_recvmsg(wasp_socket,
662 &socket_msghdr, &socket_kvec, 1,
663 ETH_BUF_SIZE, 0);
664
665 if (ret < 0) {
666 dev_err(dev,
667 "error receiving any packet or timeout: %d\n",
668 ret);
669 goto err_socket;
670 }
671
672 if (ret < (sizeof(struct ethhdr) + sizeof(packet->hdr))) {
673 dev_err(dev,
674 "packet too small, discard and continue\n");
675 continue;
676 }
677
678 if (packet->eh.h_proto != ETH_TYPE_ATH_ECPS_FRAME)
679 continue;
680
681 memcpy(wasp_mac, packet->eh.h_source, sizeof(wasp_mac));
682
683 if (packet->hdr.packet_start == ETH_WASP_PACKET_ID) {
684 switch (packet->hdr.response) {
685 case RESP_DISCOVER:
686 chunk_counter = 1;
687 num_chunks = DIV_ROUND_UP(avmwasp->linux_blob->size,
688 ETH_DATA_SIZE);
689 fallthrough;
690 case RESP_OK:
691 memcpy(packet->eh.h_dest, wasp_mac, sizeof(packet->eh.h_dest));
692 packet->eh.h_proto = ETH_TYPE_ATH_ECPS_FRAME;
693 memcpy(packet->eh.h_source, send_sock_addr.sa_data,
694 sizeof(packet->eh.h_source));
695
696 if (firmware < firmware_end) {
697 size_t bytestosend, send_len;
698 u32 data_offset = 0;
699
700 if (chunk_counter == 1) {
701 memcpy(packet->payload,
702 &m_load_addr,
703 sizeof(m_load_addr));
704 data_offset = sizeof(m_load_addr);
705 }
706
707 if ((firmware_end - firmware) >=
708 ETH_DATA_SIZE)
709 bytestosend = ETH_DATA_SIZE;
710 else
711 bytestosend = firmware_end -
712 firmware;
713 memcpy(&packet->payload[data_offset],
714 firmware, bytestosend);
715 firmware = firmware + ETH_DATA_SIZE;
716
717 packet->hdr.packet_start =
718 ETH_WASP_PACKET_ID;
719 if (chunk_counter == num_chunks) {
720 packet->hdr.response =
721 CMD_START_FIRMWARE;
722 memcpy(&packet->payload
723 [data_offset + bytestosend],
724 &m_load_addr,
725 sizeof(m_load_addr));
726 bytestosend += sizeof(m_load_addr);
727 } else {
728 packet->hdr.command =
729 CMD_FIRMWARE_DATA;
730 }
731 packet->hdr.counter =
732 (chunk_counter - 1) * 4;
733
734 send_len = sizeof(struct ethhdr)
735 + sizeof(packet->hdr) + bytestosend +
736 data_offset;
737
738 socket_kvec.iov_len = send_len;
739 socket_kvec.iov_base = avmwasp->buffer;
740
741 ret = kernel_sendmsg(wasp_socket,
742 &socket_msghdr,
743 &socket_kvec,
744 1, send_len);
745 if (ret < 0) {
746 dev_err(dev,
747 "error sending to WASP %d\n",
748 ret);
749 goto err_socket;
750 }
751
752 chunk_counter++;
753 }
754 break;
755 case RESP_ERROR:
756 dev_err(dev,
757 "received an WASP error packet\n");
758 ret = -EFAULT;
759 goto err_socket;
760 case RESP_STARTING:
761 done = true;
762 ret = 0;
763 continue;
764 break;
765 default:
766 dev_err(dev, "unknown packet, continue\n");
767 continue;
768 break;
769 }
770 }
771 }
772
773 err_socket:
774 wasp_socket->ops->release(wasp_socket);
775 err:
776 return ret;
777 }
778

--
0-DAY CI Kernel Test Service
https://01.org/lkp