Can not compile usbmouse.c : too few arguments to function 'usb_maxpacket'

327 views Asked by At

I am trying to modify and compile usbmouse.c

While compiling it is saying that the function usb_maxpackets requires 3 arguments but the code I copied from the torvald git is passing only 2 arguments to this function

the code can be found here:

https://github.com/torvalds/linux/blob/master/drivers/hid/usbhid/usbmouse.c

I am using debian gnu/linux 10with kernel version 4.19.94-ti-r42

1

There are 1 answers

0
Ian Abbott On BEST ANSWER

The number of parameters of the usb_maxpacket() function was changed from 3 to 2 in Linux kernel 5.19 onwards. The third parameter indicated the direction of the pipe, but that information was redundant because the direction can be derived from the other two parameters.

For compatibility with the 4.19 kernel, the new function call maxp = usb_maxpacket(dev, pipe); needs to be changed to maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));. (usb_pipeout(pipe) is the pipe direction.)

To make the code compatible with old and new kernels, the code can be conditionally compiled according to the kernel version:

#include <linux/version.h>
    /* In the function */
#if LINUX_VERSION_CODE < KERNEL_VERSION(5,19,0)
    maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));
#else
    maxp = usb_maxpacket(dev, pipe);
#endif

Alternatively, some compatibility code could be added before the function that calls usb_maxpacket:

#include <linux/version.h>
#include <linux/usb.h>
#if LINUX_VERSION_CODE < KERNEL_VERSION(5,19,0)
#undef usb_maxpacket
static inline u16 kcompat_usb_maxpacket(struct usb_device *udev, int pipe)
{
    return usb_maxpacket(udev, pipe, usb_pipeout(pipe));
}
#define usb_maxpacket(udev, pipe) kcompat_usb_maxpacket(udev, pipe)
#endif
    /* In the function */
    maxp = usb_maxpacket(dev, pipe);