linux/drivers/net/wireless/ath/ath11k/hif.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: BSD-3-Clause-Clear */
   2/*
   3 * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved.
   4 */
   5
   6#ifndef _HIF_H_
   7#define _HIF_H_
   8
   9#include "core.h"
  10
  11struct ath11k_hif_ops {
  12        u32 (*read32)(struct ath11k_base *sc, u32 address);
  13        void (*write32)(struct ath11k_base *sc, u32 address, u32 data);
  14        void (*irq_enable)(struct ath11k_base *sc);
  15        void (*irq_disable)(struct ath11k_base *sc);
  16        int (*start)(struct ath11k_base *sc);
  17        void (*stop)(struct ath11k_base *sc);
  18        int (*power_up)(struct ath11k_base *sc);
  19        void (*power_down)(struct ath11k_base *sc);
  20        int (*suspend)(struct ath11k_base *ab);
  21        int (*resume)(struct ath11k_base *ab);
  22        int (*map_service_to_pipe)(struct ath11k_base *sc, u16 service_id,
  23                                   u8 *ul_pipe, u8 *dl_pipe);
  24        int (*get_user_msi_vector)(struct ath11k_base *ab, char *user_name,
  25                                   int *num_vectors, u32 *user_base_data,
  26                                   u32 *base_vector);
  27        void (*get_msi_address)(struct ath11k_base *ab, u32 *msi_addr_lo,
  28                                u32 *msi_addr_hi);
  29        void (*ce_irq_enable)(struct ath11k_base *ab);
  30        void (*ce_irq_disable)(struct ath11k_base *ab);
  31        void (*get_ce_msi_idx)(struct ath11k_base *ab, u32 ce_id, u32 *msi_idx);
  32};
  33
  34static inline void ath11k_hif_ce_irq_enable(struct ath11k_base *ab)
  35{
  36        if (ab->hif.ops->ce_irq_enable)
  37                ab->hif.ops->ce_irq_enable(ab);
  38}
  39
  40static inline void ath11k_hif_ce_irq_disable(struct ath11k_base *ab)
  41{
  42        if (ab->hif.ops->ce_irq_disable)
  43                ab->hif.ops->ce_irq_disable(ab);
  44}
  45
  46static inline int ath11k_hif_start(struct ath11k_base *sc)
  47{
  48        return sc->hif.ops->start(sc);
  49}
  50
  51static inline void ath11k_hif_stop(struct ath11k_base *sc)
  52{
  53        sc->hif.ops->stop(sc);
  54}
  55
  56static inline void ath11k_hif_irq_enable(struct ath11k_base *sc)
  57{
  58        sc->hif.ops->irq_enable(sc);
  59}
  60
  61static inline void ath11k_hif_irq_disable(struct ath11k_base *sc)
  62{
  63        sc->hif.ops->irq_disable(sc);
  64}
  65
  66static inline int ath11k_hif_power_up(struct ath11k_base *sc)
  67{
  68        return sc->hif.ops->power_up(sc);
  69}
  70
  71static inline void ath11k_hif_power_down(struct ath11k_base *sc)
  72{
  73        sc->hif.ops->power_down(sc);
  74}
  75
  76static inline int ath11k_hif_suspend(struct ath11k_base *ab)
  77{
  78        if (ab->hif.ops->suspend)
  79                return ab->hif.ops->suspend(ab);
  80
  81        return 0;
  82}
  83
  84static inline int ath11k_hif_resume(struct ath11k_base *ab)
  85{
  86        if (ab->hif.ops->resume)
  87                return ab->hif.ops->resume(ab);
  88
  89        return 0;
  90}
  91
  92static inline u32 ath11k_hif_read32(struct ath11k_base *sc, u32 address)
  93{
  94        return sc->hif.ops->read32(sc, address);
  95}
  96
  97static inline void ath11k_hif_write32(struct ath11k_base *sc, u32 address, u32 data)
  98{
  99        sc->hif.ops->write32(sc, address, data);
 100}
 101
 102static inline int ath11k_hif_map_service_to_pipe(struct ath11k_base *sc, u16 service_id,
 103                                                 u8 *ul_pipe, u8 *dl_pipe)
 104{
 105        return sc->hif.ops->map_service_to_pipe(sc, service_id, ul_pipe, dl_pipe);
 106}
 107
 108static inline int ath11k_get_user_msi_vector(struct ath11k_base *ab, char *user_name,
 109                                             int *num_vectors, u32 *user_base_data,
 110                                             u32 *base_vector)
 111{
 112        if (!ab->hif.ops->get_user_msi_vector)
 113                return -EOPNOTSUPP;
 114
 115        return ab->hif.ops->get_user_msi_vector(ab, user_name, num_vectors,
 116                                                user_base_data,
 117                                                base_vector);
 118}
 119
 120static inline void ath11k_get_msi_address(struct ath11k_base *ab, u32 *msi_addr_lo,
 121                                          u32 *msi_addr_hi)
 122{
 123        if (!ab->hif.ops->get_msi_address)
 124                return;
 125
 126        ab->hif.ops->get_msi_address(ab, msi_addr_lo, msi_addr_hi);
 127}
 128
 129static inline void ath11k_get_ce_msi_idx(struct ath11k_base *ab, u32 ce_id,
 130                                         u32 *msi_data_idx)
 131{
 132        if (ab->hif.ops->get_ce_msi_idx)
 133                ab->hif.ops->get_ce_msi_idx(ab, ce_id, msi_data_idx);
 134        else
 135                *msi_data_idx = ce_id;
 136}
 137#endif /* _HIF_H_ */
 138