Commit 7919a57bc608140aa8614c19eac40c6916fb61d2

Authored by Andreas Herrmann
Committed by John W. Linville
1 parent e4b3fdb800

bitops: Provide generic sign_extend32 function

This patch moves code out from wireless drivers where two different
functions are defined in three code locations for the same purpose and
provides a common function to sign extend a 32-bit value.

Signed-off-by: Andreas Herrmann <andreas.herrmann3@amd.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

Showing 7 changed files with 30 additions and 47 deletions Side-by-side Diff

drivers/net/wireless/ath/ath5k/phy.c
... ... @@ -1102,18 +1102,12 @@
1102 1102 PHY calibration
1103 1103 \*****************/
1104 1104  
1105   -static int sign_extend(int val, const int nbits)
1106   -{
1107   - int order = BIT(nbits-1);
1108   - return (val ^ order) - order;
1109   -}
1110   -
1111 1105 static s32 ath5k_hw_read_measured_noise_floor(struct ath5k_hw *ah)
1112 1106 {
1113 1107 s32 val;
1114 1108  
1115 1109 val = ath5k_hw_reg_read(ah, AR5K_PHY_NF);
1116   - return sign_extend(AR5K_REG_MS(val, AR5K_PHY_NF_MINCCA_PWR), 9);
  1110 + return sign_extend32(AR5K_REG_MS(val, AR5K_PHY_NF_MINCCA_PWR), 8);
1117 1111 }
1118 1112  
1119 1113 void ath5k_hw_init_nfcal_hist(struct ath5k_hw *ah)
drivers/net/wireless/ath/ath9k/ar5008_phy.c
... ... @@ -1490,25 +1490,25 @@
1490 1490 int16_t nf;
1491 1491  
1492 1492 nf = MS(REG_READ(ah, AR_PHY_CCA), AR_PHY_MINCCA_PWR);
1493   - nfarray[0] = sign_extend(nf, 9);
  1493 + nfarray[0] = sign_extend32(nf, 8);
1494 1494  
1495 1495 nf = MS(REG_READ(ah, AR_PHY_CH1_CCA), AR_PHY_CH1_MINCCA_PWR);
1496   - nfarray[1] = sign_extend(nf, 9);
  1496 + nfarray[1] = sign_extend32(nf, 8);
1497 1497  
1498 1498 nf = MS(REG_READ(ah, AR_PHY_CH2_CCA), AR_PHY_CH2_MINCCA_PWR);
1499   - nfarray[2] = sign_extend(nf, 9);
  1499 + nfarray[2] = sign_extend32(nf, 8);
1500 1500  
1501 1501 if (!IS_CHAN_HT40(ah->curchan))
1502 1502 return;
1503 1503  
1504 1504 nf = MS(REG_READ(ah, AR_PHY_EXT_CCA), AR_PHY_EXT_MINCCA_PWR);
1505   - nfarray[3] = sign_extend(nf, 9);
  1505 + nfarray[3] = sign_extend32(nf, 8);
1506 1506  
1507 1507 nf = MS(REG_READ(ah, AR_PHY_CH1_EXT_CCA), AR_PHY_CH1_EXT_MINCCA_PWR);
1508   - nfarray[4] = sign_extend(nf, 9);
  1508 + nfarray[4] = sign_extend32(nf, 8);
1509 1509  
1510 1510 nf = MS(REG_READ(ah, AR_PHY_CH2_EXT_CCA), AR_PHY_CH2_EXT_MINCCA_PWR);
1511   - nfarray[5] = sign_extend(nf, 9);
  1511 + nfarray[5] = sign_extend32(nf, 8);
1512 1512 }
1513 1513  
1514 1514 /*
drivers/net/wireless/ath/ath9k/ar9002_phy.c
... ... @@ -473,21 +473,21 @@
473 473 int16_t nf;
474 474  
475 475 nf = MS(REG_READ(ah, AR_PHY_CCA), AR9280_PHY_MINCCA_PWR);
476   - nfarray[0] = sign_extend(nf, 9);
  476 + nfarray[0] = sign_extend32(nf, 8);
477 477  
478 478 nf = MS(REG_READ(ah, AR_PHY_EXT_CCA), AR9280_PHY_EXT_MINCCA_PWR);
479 479 if (IS_CHAN_HT40(ah->curchan))
480   - nfarray[3] = sign_extend(nf, 9);
  480 + nfarray[3] = sign_extend32(nf, 8);
481 481  
482 482 if (AR_SREV_9285(ah) || AR_SREV_9271(ah))
483 483 return;
484 484  
485 485 nf = MS(REG_READ(ah, AR_PHY_CH1_CCA), AR9280_PHY_CH1_MINCCA_PWR);
486   - nfarray[1] = sign_extend(nf, 9);
  486 + nfarray[1] = sign_extend32(nf, 8);
487 487  
488 488 nf = MS(REG_READ(ah, AR_PHY_CH1_EXT_CCA), AR9280_PHY_CH1_EXT_MINCCA_PWR);
489 489 if (IS_CHAN_HT40(ah->curchan))
490   - nfarray[4] = sign_extend(nf, 9);
  490 + nfarray[4] = sign_extend32(nf, 8);
491 491 }
492 492  
493 493 static void ar9002_hw_set_nf_limits(struct ath_hw *ah)
drivers/net/wireless/ath/ath9k/ar9003_phy.c
... ... @@ -1023,25 +1023,25 @@
1023 1023 int16_t nf;
1024 1024  
1025 1025 nf = MS(REG_READ(ah, AR_PHY_CCA_0), AR_PHY_MINCCA_PWR);
1026   - nfarray[0] = sign_extend(nf, 9);
  1026 + nfarray[0] = sign_extend32(nf, 8);
1027 1027  
1028 1028 nf = MS(REG_READ(ah, AR_PHY_CCA_1), AR_PHY_CH1_MINCCA_PWR);
1029   - nfarray[1] = sign_extend(nf, 9);
  1029 + nfarray[1] = sign_extend32(nf, 8);
1030 1030  
1031 1031 nf = MS(REG_READ(ah, AR_PHY_CCA_2), AR_PHY_CH2_MINCCA_PWR);
1032   - nfarray[2] = sign_extend(nf, 9);
  1032 + nfarray[2] = sign_extend32(nf, 8);
1033 1033  
1034 1034 if (!IS_CHAN_HT40(ah->curchan))
1035 1035 return;
1036 1036  
1037 1037 nf = MS(REG_READ(ah, AR_PHY_EXT_CCA), AR_PHY_EXT_MINCCA_PWR);
1038   - nfarray[3] = sign_extend(nf, 9);
  1038 + nfarray[3] = sign_extend32(nf, 8);
1039 1039  
1040 1040 nf = MS(REG_READ(ah, AR_PHY_EXT_CCA_1), AR_PHY_CH1_EXT_MINCCA_PWR);
1041   - nfarray[4] = sign_extend(nf, 9);
  1041 + nfarray[4] = sign_extend32(nf, 8);
1042 1042  
1043 1043 nf = MS(REG_READ(ah, AR_PHY_EXT_CCA_2), AR_PHY_CH2_EXT_MINCCA_PWR);
1044   - nfarray[5] = sign_extend(nf, 9);
  1044 + nfarray[5] = sign_extend32(nf, 8);
1045 1045 }
1046 1046  
1047 1047 static void ar9003_hw_set_nf_limits(struct ath_hw *ah)
drivers/net/wireless/ath/ath9k/hw.h
... ... @@ -825,12 +825,6 @@
825 825 return &ah->ops;
826 826 }
827 827  
828   -static inline int sign_extend(int val, const int nbits)
829   -{
830   - int order = BIT(nbits-1);
831   - return (val ^ order) - order;
832   -}
833   -
834 828 /* Initialization, Detach, Reset */
835 829 const char *ath9k_hw_probe(u16 vendorid, u16 devid);
836 830 void ath9k_hw_deinit(struct ath_hw *ah);
drivers/net/wireless/iwlwifi/iwl-4965.c
... ... @@ -1687,22 +1687,6 @@
1687 1687 }
1688 1688  
1689 1689 /**
1690   - * sign_extend - Sign extend a value using specified bit as sign-bit
1691   - *
1692   - * Example: sign_extend(9, 3) would return -7 as bit3 of 1001b is 1
1693   - * and bit0..2 is 001b which when sign extended to 1111111111111001b is -7.
1694   - *
1695   - * @param oper value to sign extend
1696   - * @param index 0 based bit index (0<=index<32) to sign bit
1697   - */
1698   -static s32 sign_extend(u32 oper, int index)
1699   -{
1700   - u8 shift = 31 - index;
1701   -
1702   - return (s32)(oper << shift) >> shift;
1703   -}
1704   -
1705   -/**
1706 1690 * iwl4965_hw_get_temperature - return the calibrated temperature (in Kelvin)
1707 1691 * @statistics: Provides the temperature reading from the uCode
1708 1692 *
1709 1693  
... ... @@ -1739,9 +1723,9 @@
1739 1723 * "initialize" ALIVE response.
1740 1724 */
1741 1725 if (!test_bit(STATUS_TEMPERATURE, &priv->status))
1742   - vt = sign_extend(R4, 23);
  1726 + vt = sign_extend32(R4, 23);
1743 1727 else
1744   - vt = sign_extend(le32_to_cpu(priv->_agn.statistics.
  1728 + vt = sign_extend32(le32_to_cpu(priv->_agn.statistics.
1745 1729 general.common.temperature), 23);
1746 1730  
1747 1731 IWL_DEBUG_TEMP(priv, "Calib values R[1-3]: %d %d %d R4: %d\n", R1, R2, R3, vt);
include/linux/bitops.h
... ... @@ -109,6 +109,17 @@
109 109 return (word >> shift) | (word << (8 - shift));
110 110 }
111 111  
  112 +/**
  113 + * sign_extend32 - sign extend a 32-bit value using specified bit as sign-bit
  114 + * @value: value to sign extend
  115 + * @index: 0 based bit index (0<=index<32) to sign bit
  116 + */
  117 +static inline __s32 sign_extend32(__u32 value, int index)
  118 +{
  119 + __u8 shift = 31 - index;
  120 + return (__s32)(value << shift) >> shift;
  121 +}
  122 +
112 123 static inline unsigned fls_long(unsigned long l)
113 124 {
114 125 if (sizeof(l) == 4)