LCOV - code coverage report
Current view: top level - drivers/net/ethernet/aquantia/atlantic - aq_hw_utils.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 30 35 85.7 %
Date: 2022-04-01 13:59:58 Functions: 6 6 100.0 %
Branches: 9 12 75.0 %

           Branch data     Line data    Source code
       1                 :            : // SPDX-License-Identifier: GPL-2.0-only
       2                 :            : /*
       3                 :            :  * aQuantia Corporation Network Driver
       4                 :            :  * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
       5                 :            :  */
       6                 :            : 
       7                 :            : /* File aq_hw_utils.c: Definitions of helper functions used across
       8                 :            :  * hardware layer.
       9                 :            :  */
      10                 :            : 
      11                 :            : #include "aq_hw_utils.h"
      12                 :            : #include "aq_hw.h"
      13                 :            : #include "aq_nic.h"
      14                 :            : 
      15                 :      15478 : void aq_hw_write_reg_bit(struct aq_hw_s *aq_hw, u32 addr, u32 msk,
      16                 :            :                          u32 shift, u32 val)
      17                 :            : {
      18         [ +  - ]:      15478 :         if (msk ^ ~0) {
      19                 :      15478 :                 u32 reg_old, reg_new;
      20                 :            : 
      21                 :      15478 :                 reg_old = aq_hw_read_reg(aq_hw, addr);
      22                 :      15478 :                 reg_new = (reg_old & (~msk)) | (val << shift);
      23                 :            : 
      24         [ +  + ]:      15478 :                 if (reg_old != reg_new)
      25                 :       8910 :                         aq_hw_write_reg(aq_hw, addr, reg_new);
      26                 :            :         } else {
      27                 :          0 :                 aq_hw_write_reg(aq_hw, addr, val);
      28                 :            :         }
      29                 :      15478 : }
      30                 :            : 
      31                 :       5897 : u32 aq_hw_read_reg_bit(struct aq_hw_s *aq_hw, u32 addr, u32 msk, u32 shift)
      32                 :            : {
      33                 :       5897 :         return ((aq_hw_read_reg(aq_hw, addr) & msk) >> shift);
      34                 :            : }
      35                 :            : 
      36                 :     686647 : u32 aq_hw_read_reg(struct aq_hw_s *hw, u32 reg)
      37                 :            : {
      38                 :     686647 :         u32 value = readl(hw->mmio + reg);
      39                 :            : 
      40   [ +  +  +  + ]:     687018 :         if ((~0U) == value &&
      41                 :        371 :             (~0U) == readl(hw->mmio +
      42                 :        371 :                            hw->aq_nic_cfg->aq_hw_caps->hw_alive_check_addr))
      43                 :          1 :                 aq_utils_obj_set(&hw->flags, AQ_HW_FLAG_ERR_UNPLUG);
      44                 :            : 
      45                 :     686647 :         return value;
      46                 :            : }
      47                 :            : 
      48                 :      27899 : void aq_hw_write_reg(struct aq_hw_s *hw, u32 reg, u32 value)
      49                 :            : {
      50                 :      27899 :         writel(value, hw->mmio + reg);
      51                 :       8910 : }
      52                 :            : 
      53                 :            : /* Most of 64-bit registers are in LSW, MSW form.
      54                 :            :    Counters are normally implemented by HW as latched pairs:
      55                 :            :    reading LSW first locks MSW, to overcome LSW overflow
      56                 :            :  */
      57                 :        468 : u64 aq_hw_read_reg64(struct aq_hw_s *hw, u32 reg)
      58                 :            : {
      59                 :        468 :         u64 value = aq_hw_read_reg(hw, reg);
      60                 :            : 
      61                 :        468 :         value |= (u64)aq_hw_read_reg(hw, reg + 4) << 32;
      62                 :            : 
      63                 :        468 :         return value;
      64                 :            : }
      65                 :            : 
      66                 :      14808 : int aq_hw_err_from_flags(struct aq_hw_s *hw)
      67                 :            : {
      68                 :      14808 :         int err = 0;
      69                 :            : 
      70         [ -  + ]:      14808 :         if (aq_utils_obj_test(&hw->flags, AQ_HW_FLAG_ERR_UNPLUG)) {
      71                 :          0 :                 err = -ENXIO;
      72                 :          0 :                 goto err_exit;
      73                 :            :         }
      74         [ +  - ]:      14808 :         if (aq_utils_obj_test(&hw->flags, AQ_HW_FLAG_ERR_HW)) {
      75                 :          0 :                 err = -EIO;
      76                 :          0 :                 goto err_exit;
      77                 :            :         }
      78                 :            : 
      79                 :      14808 : err_exit:
      80                 :      14808 :         return err;
      81                 :            : }

Generated by: LCOV version 1.14