Commit b53d657d authored by Sebastian Andrzej Siewior's avatar Sebastian Andrzej Siewior Committed by Greg Kroah-Hartman

usb/core: use bin2bcd() for bcdDevice in RH

The kernel's version number is used as decimal in the bcdDevice field of
the RH descriptor. For kernel version v3.12 we would see 3.0c in lsusb.
I am not sure how important it is to stick with bcd values since this is
this way since we started git history and nobody complained (however back
then we reported only 2.6).
Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 8a424bf4
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
* Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
#include <linux/bcd.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/version.h> #include <linux/version.h>
#include <linux/kernel.h> #include <linux/kernel.h>
...@@ -123,9 +124,8 @@ static inline int is_root_hub(struct usb_device *udev) ...@@ -123,9 +124,8 @@ static inline int is_root_hub(struct usb_device *udev)
*/ */
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
#define KERNEL_REL bin2bcd(((LINUX_VERSION_CODE >> 16) & 0x0ff))
#define KERNEL_REL ((LINUX_VERSION_CODE >> 16) & 0x0ff) #define KERNEL_VER bin2bcd(((LINUX_VERSION_CODE >> 8) & 0x0ff))
#define KERNEL_VER ((LINUX_VERSION_CODE >> 8) & 0x0ff)
/* usb 3.0 root hub device descriptor */ /* usb 3.0 root hub device descriptor */
static const u8 usb3_rh_dev_descriptor[18] = { static const u8 usb3_rh_dev_descriptor[18] = {
......
...@@ -3,7 +3,20 @@ ...@@ -3,7 +3,20 @@
#include <linux/compiler.h> #include <linux/compiler.h>
unsigned bcd2bin(unsigned char val) __attribute_const__; #define bcd2bin(x) \
unsigned char bin2bcd(unsigned val) __attribute_const__; (__builtin_constant_p((u8 )(x)) ? \
const_bcd2bin(x) : \
_bcd2bin(x))
#define bin2bcd(x) \
(__builtin_constant_p((u8 )(x)) ? \
const_bin2bcd(x) : \
_bin2bcd(x))
#define const_bcd2bin(x) (((x) & 0x0f) + ((x) >> 4) * 10)
#define const_bin2bcd(x) ((((x) / 10) << 4) + (x) % 10)
unsigned _bcd2bin(unsigned char val) __attribute_const__;
unsigned char _bin2bcd(unsigned val) __attribute_const__;
#endif /* _BCD_H */ #endif /* _BCD_H */
#include <linux/bcd.h> #include <linux/bcd.h>
#include <linux/export.h> #include <linux/export.h>
unsigned bcd2bin(unsigned char val) unsigned _bcd2bin(unsigned char val)
{ {
return (val & 0x0f) + (val >> 4) * 10; return (val & 0x0f) + (val >> 4) * 10;
} }
EXPORT_SYMBOL(bcd2bin); EXPORT_SYMBOL(_bcd2bin);
unsigned char bin2bcd(unsigned val) unsigned char _bin2bcd(unsigned val)
{ {
return ((val / 10) << 4) + val % 10; return ((val / 10) << 4) + val % 10;
} }
EXPORT_SYMBOL(bin2bcd); EXPORT_SYMBOL(_bin2bcd);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment