aq_hw_utils.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /*
  2. * aQuantia Corporation Network Driver
  3. * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms and conditions of the GNU General Public License,
  7. * version 2, as published by the Free Software Foundation.
  8. */
  9. /* File aq_hw_utils.c: Definitions of helper functions used across
  10. * hardware layer.
  11. */
  12. #include "aq_hw_utils.h"
  13. #include "aq_hw.h"
  14. #include "aq_nic.h"
  15. void aq_hw_write_reg_bit(struct aq_hw_s *aq_hw, u32 addr, u32 msk,
  16. u32 shift, u32 val)
  17. {
  18. if (msk ^ ~0) {
  19. u32 reg_old, reg_new;
  20. reg_old = aq_hw_read_reg(aq_hw, addr);
  21. reg_new = (reg_old & (~msk)) | (val << shift);
  22. if (reg_old != reg_new)
  23. aq_hw_write_reg(aq_hw, addr, reg_new);
  24. } else {
  25. aq_hw_write_reg(aq_hw, addr, val);
  26. }
  27. }
  28. u32 aq_hw_read_reg_bit(struct aq_hw_s *aq_hw, u32 addr, u32 msk, u32 shift)
  29. {
  30. return ((aq_hw_read_reg(aq_hw, addr) & msk) >> shift);
  31. }
  32. u32 aq_hw_read_reg(struct aq_hw_s *hw, u32 reg)
  33. {
  34. u32 value = readl(hw->mmio + reg);
  35. if ((~0U) == value &&
  36. (~0U) == readl(hw->mmio +
  37. hw->aq_nic_cfg->aq_hw_caps->hw_alive_check_addr))
  38. aq_utils_obj_set(&hw->flags, AQ_HW_FLAG_ERR_UNPLUG);
  39. return value;
  40. }
  41. void aq_hw_write_reg(struct aq_hw_s *hw, u32 reg, u32 value)
  42. {
  43. writel(value, hw->mmio + reg);
  44. }
  45. int aq_hw_err_from_flags(struct aq_hw_s *hw)
  46. {
  47. int err = 0;
  48. if (aq_utils_obj_test(&hw->flags, AQ_HW_FLAG_ERR_UNPLUG)) {
  49. err = -ENXIO;
  50. goto err_exit;
  51. }
  52. if (aq_utils_obj_test(&hw->flags, AQ_HW_FLAG_ERR_HW)) {
  53. err = -EIO;
  54. goto err_exit;
  55. }
  56. err_exit:
  57. return err;
  58. }