Introduce common hex_to_bin() helper
Subsystems (9)
cover Introduce common hex_to_bin() helper
Hello.
Here is set of patches related to hex_to_bin() custom implementations. Many of them are changed to newly introduced common method.
The idea published early by Harvey Harrison [1], but was given to me by Alexander Shishkin.
[1] http://lkml.indiana.edu/hypermail/linux/kernel/0805.0/0323.html
This version is just rebase against today's linux kernel.
Andy Shevchenko (10):
lib: introduce common method to convert hex digits
drivers: isdn: use new hex_to_bin() method
usb: atm: speedtch: use new hex_to_bin() method
drivers: net: use new hex_to_bin() method
drivers: net: use new hex_to_bin() method
sysctl: don't use own implementation of hex_to_bin()
staging: rt2860: use new hex_to_bin() method
fs: ldm: don't use own implementation of hex_to_bin()
drivers: wireless: use new hex_to_bin() method
drivers: acpi: don't use own implementation of hex_to_bin()
drivers/acpi/bus.c | 9 +------ drivers/isdn/gigaset/capi.c | 13 +---------- drivers/net/cxgb3/t3_hw.c | 16 +++---------- drivers/net/sb1250-mac.c | 32 +--------------------------- drivers/net/wireless/airo.c | 15 +++---------- drivers/staging/rt2860/common/rtmp_init.c | 15 +----------- drivers/staging/rt2860/rtmp.h | 2 - drivers/usb/atm/speedtch.c | 5 +-- fs/partitions/ldm.c | 18 ++++++++-------- include/linux/kernel.h | 2 + kernel/sysctl_binary.c | 9 ++----- lib/hexdump.c | 19 +++++++++++++++++ 12 files changed, 50 insertions(+), 105 deletions(-)
PATCH 10/10 drivers: acpi: don't use own implementation of hex_to_bin()
In reply to Andy ShevchenkoGet rid of own implementation of hex_to_bin(). It requires to have hex_to_bin() introduced by starter patch in the series.
--- drivers/acpi/bus.c | 9 ++------- 1 files changed, 2 insertions(+), 7 deletions(-)
drivers/acpi/bus.c +2 -7
@@ -363,11 +363,6 @@ static void acpi_print_osc_error(acpi_handle handle,printk ("\n" ); } -static u8 hex_val (unsigned char c) -{ -return isdigit (c) ? c -'0' :toupper (c) -'A' +10 ; -} -static acpi_status acpi_str_to_uuid (char *str,u8 *uuid) {int i;
@@ -384,8 +379,8 @@ static acpi_status acpi_str_to_uuid(char *str, u8 *uuid)return AE_BAD_PARAMETER ; }for (i =0 ; i <16 ; i++) { - uuid[i] =hex_val (str[opc_map_to_uuid[i]]) <<4 ; - uuid[i] |=hex_val (str[opc_map_to_uuid[i] +1 ]); + uuid[i] =hex_to_bin (str[opc_map_to_uuid[i]]) <<4 ; + uuid[i] |=hex_to_bin (str[opc_map_to_uuid[i] +1 ]); }return AE_OK ; }
Signature · 1 line
1.6.3.3
PATCH 7/10 staging: rt2860: use new hex_to_bin() method
In reply to Andy ShevchenkoInstead of using own implementation involve hex_to_bin() function.
--- drivers/staging/rt2860/common/rtmp_init.c | 15 ++------------- drivers/staging/rt2860/rtmp.h | 2 -- 2 files changed, 2 insertions(+), 15 deletions(-)
drivers/staging/rt2860/common/rtmp_init.c +2 -13
@@ -2810,17 +2810,6 @@ void UserCfgInit(struct rt_rtmp_adapter *pAd) }/* IRQL = PASSIVE_LEVEL */ -u8 BtoH (char ch) -{ -if (ch >='0' && ch <='9' ) -return (ch -'0' );/* Handle numerals */ -if (ch >='A' && ch <='F' ) -return (ch -'A' +0xA );/* Handle capitol hex digits */ -if (ch >='a' && ch <='f' ) -return (ch -'a' +0xA );/* Handle small hex digits */ -return (255 ); -} -/* */ /* FUNCTION: AtoH(char *, u8 *, int) */ /* */
@@ -2847,8 +2836,8 @@ void AtoH(char *src, u8 *dest, int destlen) destTemp = (u8 *)dest;while (destlen--) { - *destTemp =BtoH (*srcptr++) <<4 ;/* Put 1st ascii byte in upper nibble. */ - *destTemp +=BtoH (*srcptr++);/* Add 2nd ascii byte to above. */ + *destTemp =hex_to_bin (*srcptr++) <<4 ;/* Put 1st ascii byte in upper nibble. */ + *destTemp +=hex_to_bin (*srcptr++);/* Add 2nd ascii byte to above. */ destTemp++; } }
drivers/staging/rt2860/rtmp.h +0 -2
@@ -2367,8 +2367,6 @@ void RTMPMoveMemory(void *pDest, void *pSrc, unsigned long Length);void AtoH (char *src,u8 *dest,int destlen); -u8 BtoH (char ch); -void RTMPPatchMacBbpBug (struct rt_rtmp_adapter *pAd); void RTMPInitTimer(struct rt_rtmp_adapter *pAd,
Signature · 1 line
1.6.3.3
PATCH 3/10 usb: atm: speedtch: use new hex_to_bin() method
In reply to Andy ShevchenkoInstead of using own implementation which potentialy has bugs involve hex_to_bin() function. It requires to have hex_to_bin() implementation introduced by starter patch in series.
--- drivers/usb/atm/speedtch.c | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-)
drivers/usb/atm/speedtch.c +2 -3
@@ -127,8 +127,6 @@ MODULE_PARM_DESC(ModemOption, "default: 0x10,0x00,0x00,0x00,0x20");#define ENDPOINT_ISOC_DATA 0x07#define ENDPOINT_FIRMWARE 0x05 -#define hex2int (c) ( (c >= '0') && (c <= '9') ? (c - '0') : ((c & 0xf) + 9) ) -struct speedtch_params {unsigned int altsetting;unsigned int BMaxDSL;
@@ -669,7 +667,8 @@ static int speedtch_atm_start(struct usbatm_data *usbatm, struct atm_dev *atm_dememset (atm_dev->esi,0 ,sizeof (atm_dev->esi));if (usb_string (usb_dev, usb_dev->descriptor.iSerialNumber, mac_str,sizeof (mac_str)) ==12 ) {for (i =0 ; i <6 ; i++) - atm_dev->esi[i] = (hex2int (mac_str[i *2 ]) *16 ) + (hex2int (mac_str[i *2 +1 ])); + atm_dev->esi[i] = (hex_to_bin (mac_str[i *2 ]) <<4 ) + +hex_to_bin (mac_str[i *2 +1 ]); }/* Start modem synchronisation */
Signature · 1 line
1.6.3.3
PATCH 9/10 drivers: wireless: use new hex_to_bin() method
In reply to Andy ShevchenkoInstead of using own implementation involve hex_to_bin() function.
--- drivers/net/wireless/airo.c | 15 ++++----------- 1 files changed, 4 insertions(+), 11 deletions(-)
drivers/net/wireless/airo.c +4 -11
@@ -5151,13 +5151,6 @@ static void proc_SSID_on_close(struct inode *inode, struct file *file)enable_MAC (ai,1 ); } -static inline u8 hexVal (char c) { -if (c>='0' && c<='9' )return c -='0' ; -if (c>='a' && c<='f' )return c -='a' -10 ; -if (c>='A' && c<='F' )return c -='A' -10 ; -return 0 ; -} -static void proc_APList_on_close (struct inode *inode,struct file *file ) {struct proc_data *data = (struct proc_data *)file->private_data;struct proc_dir_entry *dp =PDE (inode);
@@ -5177,11 +5170,11 @@ static void proc_APList_on_close( struct inode *inode, struct file *file ) {switch (j%3 ) {case 0 : APList_rid.ap[i][j/3 ]= -hexVal (data->wbuffer[j+i*6 *3 ])<<4 ; +hex_to_bin (data->wbuffer[j+i*6 *3 ])<<4 ;break ;case 1 : APList_rid.ap[i][j/3 ]|= -hexVal (data->wbuffer[j+i*6 *3 ]); +hex_to_bin (data->wbuffer[j+i*6 *3 ]);break ; } }
@@ -5329,10 +5322,10 @@ static void proc_wepkey_on_close( struct inode *inode, struct file *file ) {for ( i =0 ; i <16 *3 && data->wbuffer[i+j]; i++ ) {switch (i%3 ) {case 0 : - key[i/3 ] =hexVal (data->wbuffer[i+j])<<4 ; + key[i/3 ] =hex_to_bin (data->wbuffer[i+j])<<4 ;break ;case 1 : - key[i/3 ] |=hexVal (data->wbuffer[i+j]); + key[i/3 ] |=hex_to_bin (data->wbuffer[i+j]);break ; } }
Signature · 1 line
1.6.3.3
Re: [PATCH 09/10] drivers: wireless: use new hex_to_bin() method
Quoted 5 lines · Andy Shevchenko
Instead of using own implementation involve
hex_to_bin()function.Signed-off-by Andy Shevchenko <[email protected]>Cc John W. Linville <[email protected]>Cc Andrew Morton <[email protected]>
ACK
Signature · 2 lines
John W. Linville Someday the world will need a hero, and you [email protected] might be all we have. Be ready.
PATCH 4/10 drivers: net: use new hex_to_bin() method
In reply to Andy ShevchenkoInstead of using own implementation involve hex_to_bin() function. It requires to have hex_to_bin() introduced by starter patch in series.
--- drivers/net/sb1250-mac.c | 32 ++------------------------------ 1 files changed, 2 insertions(+), 30 deletions(-)
drivers/net/sb1250-mac.c +2 -30
@@ -2184,34 +2184,6 @@ static void sbmac_setmulti(struct sbmac_softc *sc)#if defined(SBMAC_ETH0_HWADDR ) || defined(SBMAC_ETH1_HWADDR ) || defined(SBMAC_ETH2_HWADDR ) || defined(SBMAC_ETH3_HWADDR )/********************************************************************** -* SBMAC_PARSE_XDIGIT(str) -* -* Parse a hex digit, returning its value -* -* Input parameters: -* str - character -* -* Return value: -* hex value, or -1 if invalid -********************************************************************* */ - -static int sbmac_parse_xdigit (char str) -{ -int digit; - -if ((str >='0' ) && (str <='9' )) - digit = str -'0' ; -else if ((str >='a' ) && (str <='f' )) - digit = str -'a' +10 ; -else if ((str >='A' ) && (str <='F' )) - digit = str -'A' +10 ; -else -return -1 ; - -return digit; -} - -/********************************************************************** * SBMAC_PARSE_HWADDR(str,hwaddr) * * Convert a string in the form xx:xx:xx:xx:xx:xx into a 6-byte
@@ -2231,7 +2203,7 @@ static int sbmac_parse_hwaddr(char *str, unsigned char *hwaddr)int idx =6 ;while (*str && (idx >0 )) { - digit1 =sbmac_parse_xdigit (*str); + digit1 =hex_to_bin (*str);if (digit1 <0 )return -1 ; str++;
@@ -2243,7 +2215,7 @@ static int sbmac_parse_hwaddr(char *str, unsigned char *hwaddr) digit1 =0 ; }else { - digit2 =sbmac_parse_xdigit (*str); + digit2 =hex_to_bin (*str);if (digit2 <0 )return -1 ; str++;
Signature · 1 line
1.6.3.3
PATCH 8/10 fs: ldm: don't use own implementation of hex_to_bin()
In reply to Andy ShevchenkoGet rid of own implementation of hex_to_bin().
--- fs/partitions/ldm.c | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-)
fs/partitions/ldm.c +9 -9
@@ -26,6 +26,7 @@#include <linux/slab.h> #include <linux/pagemap.h> #include <linux/stringify.h> +#include <linux/kernel.h> #include "ldm.h" #include "check.h" #include "msdos.h"
@@ -77,17 +78,16 @@ static int ldm_parse_hexbyte (const u8 *src)int h;/* high part */ -if ((x = src[0 ] -'0' ) <='9' -'0' ) h = x; -else if ((x = src[0 ] -'a' ) <='f' -'a' ) h = x+10 ; -else if ((x = src[0 ] -'A' ) <='F' -'A' ) h = x+10 ; -else return -1 ; - h <<=4 ; + x = h =hex_to_bin (src[0 ]); +if (h <0 ) +return -1 ;/* low part */ -if ((x = src[1 ] -'0' ) <='9' -'0' )return h | x; -if ((x = src[1 ] -'a' ) <='f' -'a' )return h | (x+10 ); -if ((x = src[1 ] -'A' ) <='F' -'A' )return h | (x+10 ); -return -1 ; + h =hex_to_bin (src[1 ]); +if (h <0 ) +return -1 ; + +return (x <<4 ) + h; }/**
Signature · 1 line
1.6.3.3
PATCH 6/10 sysctl: don't use own implementation of hex_to_bin()
In reply to Andy ShevchenkoGet rid of own implementation of hex_to_bin().
--- kernel/sysctl_binary.c | 9 +++------ 1 files changed, 3 insertions(+), 6 deletions(-)
kernel/sysctl_binary.c +3 -6
@@ -13,6 +13,7 @@#include <linux/file.h> #include <linux/ctype.h> #include <linux/netdevice.h> +#include <linux/kernel.h> #include <linux/slab.h> #ifdef CONFIG_SYSCTL_SYSCALL
@@ -1125,11 +1126,6 @@ out:return result; } -static unsigned hex_value (int ch) -{ -return isdigit (ch) ? ch -'0' : ((ch |0x20 ) -'a' ) +10 ; -} -static ssize_t bin_uuid (struct file *file,void __user *oldval,size_t oldlen,void __user *newval,size_t newlen) {
@@ -1157,7 +1153,8 @@ static ssize_t bin_uuid(struct file *file,if (!isxdigit (str[0 ]) || !isxdigit (str[1 ])) goto out; - uuid[i] = (hex_value (str[0 ]) <<4 ) |hex_value (str[1 ]); + uuid[i] = (hex_to_bin (str[0 ]) <<4 ) | +hex_to_bin (str[1 ]); str +=2 ;if (*str =='-' ) str++;
Signature · 1 line
1.6.3.3
PATCH 5/10 drivers: net: use new hex_to_bin() method
In reply to Andy ShevchenkoGet rid of own implementation of hex_to_bin(). It requires to have hex_to_bin() introduced by starter patch in series.
--- drivers/net/cxgb3/t3_hw.c | 16 ++++------------ 1 files changed, 4 insertions(+), 12 deletions(-)
drivers/net/cxgb3/t3_hw.c +4 -12
@@ -679,14 +679,6 @@ int t3_seeprom_wp(struct adapter *adapter, int enable)return t3_seeprom_write (adapter,EEPROM_STAT_ADDR , enable ?0xc :0 ); } -/* -* Convert a character holding a hex digit to a number. -*/ -static unsigned int hex2int (unsigned char c) -{ -return isdigit (c) ? c -'0' :toupper (c) -'A' +10 ; -} -/** * get_vpd_params - read VPD parameters from VPD EEPROM * @adapter: adapter to read
@@ -727,15 +719,15 @@ static int get_vpd_params(struct adapter *adapter, struct vpd_params *p) p->port_type[0 ] =uses_xaui (adapter) ?1 :2 ; p->port_type[1 ] =uses_xaui (adapter) ?6 :2 ; }else { - p->port_type[0 ] =hex2int (vpd.port0_data[0 ]); - p->port_type[1 ] =hex2int (vpd.port1_data[0 ]); + p->port_type[0 ] =hex_to_bin (vpd.port0_data[0 ]); + p->port_type[1 ] =hex_to_bin (vpd.port1_data[0 ]); p->xauicfg[0 ] =simple_strtoul (vpd.xaui0cfg_data,NULL ,16 ); p->xauicfg[1 ] =simple_strtoul (vpd.xaui1cfg_data,NULL ,16 ); }for (i =0 ; i <6 ; i++) - p->eth_base[i] =hex2int (vpd.na_data[2 * i]) *16 + -hex2int (vpd.na_data[2 * i +1 ]); + p->eth_base[i] =hex_to_bin (vpd.na_data[2 * i]) *16 + +hex_to_bin (vpd.na_data[2 * i +1 ]);return 0 ; }
Signature · 1 line
1.6.3.3
Andrew Morton
maintainerRe: [PATCH 01/10] lib: introduce common method to convert hex digits
In reply to Andy ShevchenkoQuoted 8 lines · On Fri, 30 Apr 2010 12:34:00 +0300 Andy Shevchenko…
/**
+ *hex_to_bin- convert a hex digit to its real value
+ * @ch: ascii character represents hex digit
+ *
+ *hex_to_bin()converts one hex digit to its actual value or -1 in case of bad
+ * input.
+ */(quoted diff) +1
-0+int hex_to_bin(char ch)
Review
Quoted 10 lines
(quoted diff) +10
-0+{ + if ((ch >= 'a') && (ch <= 'f')) + return ch - 'a' + 10; + if ((ch >= '0') && (ch <= '9')) + return ch - '0'; + if ((ch >= 'A') && (ch <= 'F')) + return ch - 'A' + 10; + return -1; +} +EXPORT_SYMBOL(hex_to_bin);
I had to fiddle with it:
- use tolower(), saving 3 bytes!
- test the more common case first - it's quicker.
lib/hexdump.c renamed from lib/hexdump.c~lib-introduce-common-method-to-convert-hex-digits-fix +3 -4
@@ -24,12 +24,11 @@ EXPORT_SYMBOL(hex_asc);*/ int hex_to_bin (char ch) { -if ((ch >='a' ) && (ch <='f' )) -return ch -'a' +10 ; + ch =tolower (ch);if ((ch >='0' ) && (ch <='9' ))return ch -'0' ; -if ((ch >='A' ) && (ch <='F' )) -return ch -'A' +10 ; +if ((ch >='a' ) && (ch <='f' )) +return ch -'a' +10 ;return -1 ; }EXPORT_SYMBOL (hex_to_bin);
_
Yielding
int hex_to_bin(char ch)
{
ch = tolower(ch);
if ((ch >= '0') && (ch <= '9'))
return ch - '0';
if ((ch >= 'a') && (ch <= 'f'))
return ch - 'a' + 10;
return -1;
}PATCH 2/10 drivers: isdn: use new hex_to_bin() method
In reply to Andy ShevchenkoGet rid of own implementation of hex_to_bin().
--- drivers/isdn/gigaset/capi.c | 13 +------------ 1 files changed, 1 insertions(+), 12 deletions(-)
drivers/isdn/gigaset/capi.c +1 -12
@@ -170,17 +170,6 @@ static inline void ignore_cstruct_param(struct cardstate *cs, _cstruct param, }/* -* convert hex to binary -*/ -static inline u8 hex2bin (char c) -{ -int result = c &0x0f ; -if (c &0x40 ) - result +=9 ; -return result; -} - -/* * convert an IE from Gigaset hex string to ETSI binary representation * including length byte * return value: result length, -1 on error
@@ -191,7 +180,7 @@ static int encode_ie(char *in, u8 *out, int maxlen)while (*in) {if (!isxdigit (in[0 ]) || !isxdigit (in[1 ]) || l >= maxlen)return -1 ; - out[++l] = (hex2bin (in[0 ]) <<4 ) +hex2bin (in[1 ]); + out[++l] = (hex_to_bin (in[0 ]) <<4 ) +hex_to_bin (in[1 ]); in +=2 ; } out[0 ] = l;
Signature · 1 line
1.6.3.3
PATCH 1/10 lib: introduce common method to convert hex digits
In reply to Andy Shevchenkohex_to_bin() is a little method which converts hex digit to its actual value. There are plenty of places where such functionality is needed.
--- include/linux/kernel.h | 2 ++ lib/hexdump.c | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 0 deletions(-)
include/linux/kernel.h +2 -0
@@ -372,6 +372,8 @@ static inline char *pack_hex_byte(char *buf, u8 byte)return buf; } +extern int hex_to_bin (char ch); +#ifndef pr_fmt#define pr_fmt (fmt) fmt#endif
lib/hexdump.c +19 -0
@@ -16,6 +16,25 @@ const char hex_asc[] = "0123456789abcdef";EXPORT_SYMBOL (hex_asc);/** +* hex_to_bin - convert a hex digit to its real value +* @ch: ascii character represents hex digit +* +* hex_to_bin() converts one hex digit to its actual value or -1 in case of bad +* input. +*/ +int hex_to_bin (char ch) +{ +if ((ch >='a' ) && (ch <='f' )) +return ch -'a' +10 ; +if ((ch >='0' ) && (ch <='9' )) +return ch -'0' ; +if ((ch >='A' ) && (ch <='F' )) +return ch -'A' +10 ; +return -1 ; +} +EXPORT_SYMBOL (hex_to_bin); + +/** * hex_dump_to_buffer - convert a blob of data to "hex ASCII" in memory * @buf: data blob to dump * @len: number of bytes in the @buf
Signature · 1 line
1.6.3.3
Re: [PATCH 01/10] lib: introduce common method to convert hex digits
In reply to Andrew MortonQuoted 2 lines · Andrew Morton
I had to fiddle with it:
- usetolower(), saving 3 bytes!
tolower could be done after the 0-9 case as well
int hex_to_bin(char ch)
{
if ((ch >= '0') && (ch <= '9'))
return ch - '0';
ch = tolower(ch);
if ((ch >= 'a') && (ch <= 'f'))
return ch - 'a' + 10;
return -1;
}Re: [PATCH 01/10] lib: introduce common method to convert hex digits
In reply to Andrew MortonQuoted 3 lines · Andrew Morton
I had to fiddle with it:
- usetolower(), saving 3 bytes!
- test the more common case first - it's quicker.
Agreed in conjunction with comment from Joe Perches. I'll resend new patch soon.
Signature · 2 lines
With Best Regards, Andy Shevchenko
Re: [PATCH 05/10] drivers: net: use new hex_to_bin() method
In reply to Andy ShevchenkoQuoted 7 lines · Andy Shevchenko
Get rid of own implementation of
hex_to_bin(). It requires to havehex_to_bin()introduced by starter patch in series.Signed-off-by Andy Shevchenko<[email protected]>Cc Divy Le Ray<[email protected]>Cc Andrew Morton<[email protected]>
Quoted 44 lines
--- drivers/net/cxgb3/t3_hw.c | 16 ++++------------ 1 files changed, 4 insertions(+), 12 deletions(-)drivers/net/cxgb3/t3_hw.c +4
-12@@ -679,14 +679,6 @@ int t3_seeprom_wp(struct adapter *adapter, int enable)return t3_seeprom_write (adapter,EEPROM_STAT_ADDR , enable ?0xc :0 ); } -/* -* Convert a character holding a hex digit to a number. -*/ -static unsigned int hex2int (unsigned char c) -{ -return isdigit (c) ? c -'0' :toupper (c) -'A' +10 ; -} -/** * get_vpd_params - read VPD parameters from VPD EEPROM * @adapter: adapter to read @@ -727,15 +719,15 @@ static int get_vpd_params(struct adapter *adapter, struct vpd_params *p) p->port_type[0 ] =uses_xaui (adapter) ?1 :2 ; p->port_type[1 ] =uses_xaui (adapter) ?6 :2 ; }else { - p->port_type[0 ] =hex2int (vpd.port0_data[0 ]); - p->port_type[1 ] =hex2int (vpd.port1_data[0 ]); + p->port_type[0 ] =hex_to_bin (vpd.port0_data[0 ]); + p->port_type[1 ] =hex_to_bin (vpd.port1_data[0 ]); p->xauicfg[0 ] =simple_strtoul (vpd.xaui0cfg_data,NULL ,16 ); p->xauicfg[1 ] =simple_strtoul (vpd.xaui1cfg_data,NULL ,16 ); }for (i =0 ; i<6 ; i++) - p->eth_base[i] =hex2int (vpd.na_data[2 * i]) *16 + -hex2int (vpd.na_data[2 * i +1 ]); + p->eth_base[i] =hex_to_bin (vpd.na_data[2 * i]) *16 + +hex_to_bin (vpd.na_data[2 * i +1 ]);return 0 ; }