Re: [PATCH v3 10/10] HID: usbhid: Set USB mice as s2idle wakeup resources

From: kernel test robot
Date: Fri Jul 01 2022 - 07:30:49 EST


Hi Mario,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on rafael-pm/linux-next]
[also build test ERROR on drm-misc/drm-misc-next hid/for-next linus/master v5.19-rc4 next-20220701]
[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/intel-lab-lkp/linux/commits/Mario-Limonciello/PM-suspend-Introduce-pm_suspend_preferred_s2idle/20220701-103534
base: https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git linux-next
config: i386-randconfig-a002 (https://download.01.org/0day-ci/archive/20220701/202207011931.a4oqLMtN-lkp@xxxxxxxxx/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project a9119143a2d1f4d0d0bc1fe0d819e5351b4e0deb)
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/54a1cce9cd825e0570d307b44a695f04bba77fd2
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Mario-Limonciello/PM-suspend-Introduce-pm_suspend_preferred_s2idle/20220701-103534
git checkout 54a1cce9cd825e0570d307b44a695f04bba77fd2
# 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/hid/usbhid/

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

All errors (new ones prefixed by >>):

>> drivers/hid/usbhid/hid-core.c:1200:8: error: call to undeclared function 'pm_suspend_preferred_s2idle'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
if (pm_suspend_preferred_s2idle() &&
^
drivers/hid/usbhid/hid-core.c:1200:8: note: did you mean 'pm_suspend_default_s2idle'?
include/linux/suspend.h:343:20: note: 'pm_suspend_default_s2idle' declared here
static inline bool pm_suspend_default_s2idle(void) { return false; }
^
1 error generated.


vim +/pm_suspend_preferred_s2idle +1200 drivers/hid/usbhid/hid-core.c

1060
1061 static int usbhid_start(struct hid_device *hid)
1062 {
1063 struct usb_interface *intf = to_usb_interface(hid->dev.parent);
1064 struct usb_host_interface *interface = intf->cur_altsetting;
1065 struct usb_device *dev = interface_to_usbdev(intf);
1066 struct usbhid_device *usbhid = hid->driver_data;
1067 unsigned int n, insize = 0;
1068 int ret;
1069
1070 mutex_lock(&usbhid->mutex);
1071
1072 clear_bit(HID_DISCONNECTED, &usbhid->iofl);
1073
1074 usbhid->bufsize = HID_MIN_BUFFER_SIZE;
1075 hid_find_max_report(hid, HID_INPUT_REPORT, &usbhid->bufsize);
1076 hid_find_max_report(hid, HID_OUTPUT_REPORT, &usbhid->bufsize);
1077 hid_find_max_report(hid, HID_FEATURE_REPORT, &usbhid->bufsize);
1078
1079 if (usbhid->bufsize > HID_MAX_BUFFER_SIZE)
1080 usbhid->bufsize = HID_MAX_BUFFER_SIZE;
1081
1082 hid_find_max_report(hid, HID_INPUT_REPORT, &insize);
1083
1084 if (insize > HID_MAX_BUFFER_SIZE)
1085 insize = HID_MAX_BUFFER_SIZE;
1086
1087 if (hid_alloc_buffers(dev, hid)) {
1088 ret = -ENOMEM;
1089 goto fail;
1090 }
1091
1092 for (n = 0; n < interface->desc.bNumEndpoints; n++) {
1093 struct usb_endpoint_descriptor *endpoint;
1094 int pipe;
1095 int interval;
1096
1097 endpoint = &interface->endpoint[n].desc;
1098 if (!usb_endpoint_xfer_int(endpoint))
1099 continue;
1100
1101 interval = endpoint->bInterval;
1102
1103 /* Some vendors give fullspeed interval on highspeed devides */
1104 if (hid->quirks & HID_QUIRK_FULLSPEED_INTERVAL &&
1105 dev->speed == USB_SPEED_HIGH) {
1106 interval = fls(endpoint->bInterval*8);
1107 pr_info("%s: Fixing fullspeed to highspeed interval: %d -> %d\n",
1108 hid->name, endpoint->bInterval, interval);
1109 }
1110
1111 /* Change the polling interval of mice, joysticks
1112 * and keyboards.
1113 */
1114 switch (hid->collection->usage) {
1115 case HID_GD_MOUSE:
1116 if (hid_mousepoll_interval > 0)
1117 interval = hid_mousepoll_interval;
1118 break;
1119 case HID_GD_JOYSTICK:
1120 if (hid_jspoll_interval > 0)
1121 interval = hid_jspoll_interval;
1122 break;
1123 case HID_GD_KEYBOARD:
1124 if (hid_kbpoll_interval > 0)
1125 interval = hid_kbpoll_interval;
1126 break;
1127 }
1128
1129 ret = -ENOMEM;
1130 if (usb_endpoint_dir_in(endpoint)) {
1131 if (usbhid->urbin)
1132 continue;
1133 if (!(usbhid->urbin = usb_alloc_urb(0, GFP_KERNEL)))
1134 goto fail;
1135 pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);
1136 usb_fill_int_urb(usbhid->urbin, dev, pipe, usbhid->inbuf, insize,
1137 hid_irq_in, hid, interval);
1138 usbhid->urbin->transfer_dma = usbhid->inbuf_dma;
1139 usbhid->urbin->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1140 } else {
1141 if (usbhid->urbout)
1142 continue;
1143 if (!(usbhid->urbout = usb_alloc_urb(0, GFP_KERNEL)))
1144 goto fail;
1145 pipe = usb_sndintpipe(dev, endpoint->bEndpointAddress);
1146 usb_fill_int_urb(usbhid->urbout, dev, pipe, usbhid->outbuf, 0,
1147 hid_irq_out, hid, interval);
1148 usbhid->urbout->transfer_dma = usbhid->outbuf_dma;
1149 usbhid->urbout->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1150 }
1151 }
1152
1153 usbhid->urbctrl = usb_alloc_urb(0, GFP_KERNEL);
1154 if (!usbhid->urbctrl) {
1155 ret = -ENOMEM;
1156 goto fail;
1157 }
1158
1159 usb_fill_control_urb(usbhid->urbctrl, dev, 0, (void *) usbhid->cr,
1160 usbhid->ctrlbuf, 1, hid_ctrl, hid);
1161 usbhid->urbctrl->transfer_dma = usbhid->ctrlbuf_dma;
1162 usbhid->urbctrl->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1163
1164 set_bit(HID_STARTED, &usbhid->iofl);
1165
1166 if (hid->quirks & HID_QUIRK_ALWAYS_POLL) {
1167 ret = usb_autopm_get_interface(usbhid->intf);
1168 if (ret)
1169 goto fail;
1170 set_bit(HID_IN_POLLING, &usbhid->iofl);
1171 usbhid->intf->needs_remote_wakeup = 1;
1172 ret = hid_start_in(hid);
1173 if (ret) {
1174 dev_err(&hid->dev,
1175 "failed to start in urb: %d\n", ret);
1176 }
1177 usb_autopm_put_interface(usbhid->intf);
1178 }
1179
1180 if (interface->desc.bInterfaceSubClass == USB_INTERFACE_SUBCLASS_BOOT) {
1181 switch (interface->desc.bInterfaceProtocol) {
1182 /* Some keyboards don't work until their LEDs have been set.
1183 * Since BIOSes do set the LEDs, it must be safe for any device
1184 * that supports the keyboard boot protocol.
1185 * In addition, enable remote wakeup by default for all keyboard
1186 * devices supporting the boot protocol.
1187 */
1188 case USB_INTERFACE_PROTOCOL_KEYBOARD:
1189 usbhid_set_leds(hid);
1190 device_set_wakeup_enable(&dev->dev, 1);
1191 break;
1192 /*
1193 * Windows configures USB mice to be a wakeup source from Modern
1194 * Standby, and users have expectations that s2idle wakeup sources
1195 * behave the same. Thus setup remote wakeup by default for mice
1196 * supporting boot protocol if the system supports s2idle and the user
1197 * has not disabled it on the kernel command line.
1198 */
1199 case USB_INTERFACE_PROTOCOL_MOUSE:
> 1200 if (pm_suspend_preferred_s2idle() &&
1201 pm_suspend_default_s2idle())
1202 device_set_wakeup_enable(&dev->dev, 1);
1203 break;
1204 }
1205 }
1206
1207 mutex_unlock(&usbhid->mutex);
1208 return 0;
1209
1210 fail:
1211 usb_free_urb(usbhid->urbin);
1212 usb_free_urb(usbhid->urbout);
1213 usb_free_urb(usbhid->urbctrl);
1214 usbhid->urbin = NULL;
1215 usbhid->urbout = NULL;
1216 usbhid->urbctrl = NULL;
1217 hid_free_buffers(dev, hid);
1218 mutex_unlock(&usbhid->mutex);
1219 return ret;
1220 }
1221

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