util.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
  2. /* Copyright(c) 2018-2019 Realtek Corporation
  3. */
  4. #include "main.h"
  5. #include "util.h"
  6. #include "reg.h"
  7. bool check_hw_ready(struct rtw_dev *rtwdev, u32 addr, u32 mask, u32 target)
  8. {
  9. u32 cnt;
  10. for (cnt = 0; cnt < 1000; cnt++) {
  11. if (rtw_read32_mask(rtwdev, addr, mask) == target)
  12. return true;
  13. udelay(10);
  14. }
  15. return false;
  16. }
  17. EXPORT_SYMBOL(check_hw_ready);
  18. bool ltecoex_read_reg(struct rtw_dev *rtwdev, u16 offset, u32 *val)
  19. {
  20. const struct rtw_chip_info *chip = rtwdev->chip;
  21. const struct rtw_ltecoex_addr *ltecoex = chip->ltecoex_addr;
  22. if (!check_hw_ready(rtwdev, ltecoex->ctrl, LTECOEX_READY, 1))
  23. return false;
  24. rtw_write32(rtwdev, ltecoex->ctrl, 0x800F0000 | offset);
  25. *val = rtw_read32(rtwdev, ltecoex->rdata);
  26. return true;
  27. }
  28. bool ltecoex_reg_write(struct rtw_dev *rtwdev, u16 offset, u32 value)
  29. {
  30. const struct rtw_chip_info *chip = rtwdev->chip;
  31. const struct rtw_ltecoex_addr *ltecoex = chip->ltecoex_addr;
  32. if (!check_hw_ready(rtwdev, ltecoex->ctrl, LTECOEX_READY, 1))
  33. return false;
  34. rtw_write32(rtwdev, ltecoex->wdata, value);
  35. rtw_write32(rtwdev, ltecoex->ctrl, 0xC00F0000 | offset);
  36. return true;
  37. }
  38. void rtw_restore_reg(struct rtw_dev *rtwdev,
  39. struct rtw_backup_info *bckp, u32 num)
  40. {
  41. u8 len;
  42. u32 reg;
  43. u32 val;
  44. int i;
  45. for (i = 0; i < num; i++, bckp++) {
  46. len = bckp->len;
  47. reg = bckp->reg;
  48. val = bckp->val;
  49. switch (len) {
  50. case 1:
  51. rtw_write8(rtwdev, reg, (u8)val);
  52. break;
  53. case 2:
  54. rtw_write16(rtwdev, reg, (u16)val);
  55. break;
  56. case 4:
  57. rtw_write32(rtwdev, reg, (u32)val);
  58. break;
  59. default:
  60. break;
  61. }
  62. }
  63. }
  64. EXPORT_SYMBOL(rtw_restore_reg);
  65. void rtw_desc_to_mcsrate(u16 rate, u8 *mcs, u8 *nss)
  66. {
  67. if (rate <= DESC_RATE54M)
  68. return;
  69. if (rate >= DESC_RATEVHT1SS_MCS0 &&
  70. rate <= DESC_RATEVHT1SS_MCS9) {
  71. *nss = 1;
  72. *mcs = rate - DESC_RATEVHT1SS_MCS0;
  73. } else if (rate >= DESC_RATEVHT2SS_MCS0 &&
  74. rate <= DESC_RATEVHT2SS_MCS9) {
  75. *nss = 2;
  76. *mcs = rate - DESC_RATEVHT2SS_MCS0;
  77. } else if (rate >= DESC_RATEVHT3SS_MCS0 &&
  78. rate <= DESC_RATEVHT3SS_MCS9) {
  79. *nss = 3;
  80. *mcs = rate - DESC_RATEVHT3SS_MCS0;
  81. } else if (rate >= DESC_RATEVHT4SS_MCS0 &&
  82. rate <= DESC_RATEVHT4SS_MCS9) {
  83. *nss = 4;
  84. *mcs = rate - DESC_RATEVHT4SS_MCS0;
  85. } else if (rate >= DESC_RATEMCS0 &&
  86. rate <= DESC_RATEMCS15) {
  87. *mcs = rate - DESC_RATEMCS0;
  88. }
  89. }