Hi Pratham,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on usb/usb-testing]
[also build test ERROR on linus/master peter-chen-usb/for-usb-next v5.16 next-20220118]
[cannot apply to balbi-usb/testing/next]
[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]
url:
https://github.com/0day-ci/linux/commits/Pratham-Pratap/usb-hub-Power-cyc...
base:
https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-testing
config: alpha-allmodconfig
(
https://download.01.org/0day-ci/archive/20220120/202201200108.JJYDWfTS-lk...)
compiler: alpha-linux-gcc (GCC) 11.2.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/0day-ci/linux/commit/ec4d5f04b268fc19d3b5d2843d1889531...
git remote add linux-review
https://github.com/0day-ci/linux
git fetch --no-tags linux-review
Pratham-Pratap/usb-hub-Power-cycle-root-hub-if-CSC-is-set-during-hub_port_reset/20220119-235321
git checkout ec4d5f04b268fc19d3b5d2843d1889531dafd22f
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir
ARCH=alpha SHELL=/bin/bash drivers/usb/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp(a)intel.com>
All errors (new ones prefixed by >>):
drivers/usb/core/hub.c: In function 'hub_port_wait_reset':
> drivers/usb/core/hub.c:2907:25: error: 'struct
usb_device' has no member named 'reset_resume'
2907 |
if (udev->reset_resume && (!udev->parent &&
hcd->fs_suspend_reset) &&
| ^~
> drivers/usb/core/hub.c:2909:50: error: 'hdev' undeclared
(first use in this function); did you mean 'udev'?
2909 |
usb_hub_port_power_cycle(hdev, hub, port1);
| ^~~~
| udev
drivers/usb/core/hub.c:2909:50: note: each undeclared identifier is reported only once
for each function it appears in
vim +2907 drivers/usb/core/hub.c
2845
2846 static int hub_port_wait_reset(struct usb_hub *hub, int port1,
2847 struct usb_device *udev, unsigned int delay, bool warm)
2848 {
2849 int delay_time, ret;
2850 struct usb_hcd *hcd = bus_to_hcd(udev->bus);
2851 u16 portstatus;
2852 u16 portchange;
2853 u32 ext_portstatus = 0;
2854
2855 for (delay_time = 0;
2856 delay_time < HUB_RESET_TIMEOUT;
2857 delay_time += delay) {
2858 /* wait to give the device a chance to reset */
2859 msleep(delay);
2860
2861 /* read and decode port status */
2862 if (hub_is_superspeedplus(hub->hdev))
2863 ret = hub_ext_port_status(hub, port1,
2864 HUB_EXT_PORT_STATUS,
2865 &portstatus, &portchange,
2866 &ext_portstatus);
2867 else
2868 ret = hub_port_status(hub, port1, &portstatus,
2869 &portchange);
2870 if (ret < 0)
2871 return ret;
2872
2873 /*
2874 * The port state is unknown until the reset completes.
2875 *
2876 * On top of that, some chips may require additional time
2877 * to re-establish a connection after the reset is complete,
2878 * so also wait for the connection to be re-established.
2879 */
2880 if (!(portstatus & USB_PORT_STAT_RESET) &&
2881 (portstatus & USB_PORT_STAT_CONNECTION))
2882 break;
2883
2884 /* switch to the long delay after two short delay failures */
2885 if (delay_time >= 2 * HUB_SHORT_RESET_TIME)
2886 delay = HUB_LONG_RESET_TIME;
2887
2888 dev_dbg(&hub->ports[port1 - 1]->dev,
2889 "not %sreset yet, waiting %dms\n",
2890 warm ? "warm " : "", delay);
2891 }
2892
2893 if ((portstatus & USB_PORT_STAT_RESET))
2894 return -EBUSY;
2895
2896 if (hub_port_warm_reset_required(hub, port1, portstatus))
2897 return -ENOTCONN;
2898
2899 /* Device went away? */
2900 if (!(portstatus & USB_PORT_STAT_CONNECTION)) {
2901 /*
2902 * When a FS device is following a suspend-reset-enumeration-data_transfer
2903 * sequence, sometimes it goes back in suspend just after reset without the
2904 * link entering L0. To fix this when CSC bit is set(because of CCS status
2905 * change) power cycle the root hub.
2906 */
2907 if (udev->reset_resume && (!udev->parent
&& hcd->fs_suspend_reset) &&
2908 (portstatus &
USB_PORT_STAT_CSC)) {
2909 usb_hub_port_power_cycle(hdev, hub, port1);
2910 return -EAGAIN;
2911 }
2912
2913 return -ENOTCONN;
2914 }
2915
2916 /* Retry if connect change is set but status is still connected.
2917 * A USB 3.0 connection may bounce if multiple warm resets were issued,
2918 * but the device may have successfully re-connected. Ignore it.
2919 */
2920 if (!hub_is_superspeed(hub->hdev) &&
2921 (portchange & USB_PORT_STAT_C_CONNECTION)) {
2922 usb_clear_port_feature(hub->hdev, port1,
2923 USB_PORT_FEAT_C_CONNECTION);
2924 return -EAGAIN;
2925 }
2926
2927 if (!(portstatus & USB_PORT_STAT_ENABLE))
2928 return -EBUSY;
2929
2930 if (!udev)
2931 return 0;
2932
2933 if (hub_is_superspeedplus(hub->hdev)) {
2934 /* extended portstatus Rx and Tx lane count are zero based */
2935 udev->rx_lanes = USB_EXT_PORT_RX_LANES(ext_portstatus) + 1;
2936 udev->tx_lanes = USB_EXT_PORT_TX_LANES(ext_portstatus) + 1;
2937 udev->ssp_rate = get_port_ssp_rate(hub->hdev, ext_portstatus);
2938 } else {
2939 udev->rx_lanes = 1;
2940 udev->tx_lanes = 1;
2941 udev->ssp_rate = USB_SSP_GEN_UNKNOWN;
2942 }
2943 if (hub_is_wusb(hub))
2944 udev->speed = USB_SPEED_WIRELESS;
2945 else if (udev->ssp_rate != USB_SSP_GEN_UNKNOWN)
2946 udev->speed = USB_SPEED_SUPER_PLUS;
2947 else if (hub_is_superspeed(hub->hdev))
2948 udev->speed = USB_SPEED_SUPER;
2949 else if (portstatus & USB_PORT_STAT_HIGH_SPEED)
2950 udev->speed = USB_SPEED_HIGH;
2951 else if (portstatus & USB_PORT_STAT_LOW_SPEED)
2952 udev->speed = USB_SPEED_LOW;
2953 else
2954 udev->speed = USB_SPEED_FULL;
2955 return 0;
2956 }
2957
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org