/******************************************************************************
 *
 * Copyright(c) 2003 - 2015 Intel Corporation. All rights reserved.
 * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
 * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
 * Copyright(c) 2018 Intel Corporation
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *  * Neither the name Intel Corporation nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *****************************************************************************/
#ifndef SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_PCIE_INTERNAL_H_
#define SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_PCIE_INTERNAL_H_

#include <fuchsia/hardware/pci/c/banjo.h>
#include <lib/ddk/mmio-buffer.h>
#include <lib/sync/completion.h>
#include <threads.h>
#include <zircon/listnode.h>

#include "third_party/iwlwifi/iwl-csr.h"
#include "third_party/iwlwifi/iwl-debug.h"
#include "third_party/iwlwifi/iwl-drv.h"
#include "third_party/iwlwifi/iwl-fh.h"
#include "third_party/iwlwifi/iwl-io.h"
#include "third_party/iwlwifi/iwl-op-mode.h"
#include "third_party/iwlwifi/iwl-trans.h"
#include "third_party/iwlwifi/platform/compiler.h"
#include "third_party/iwlwifi/platform/ieee80211_include.h"
#include "third_party/iwlwifi/platform/irq.h"
#include "third_party/iwlwifi/platform/kernel.h"
#include "third_party/iwlwifi/platform/memory.h"

/* We need 2 entries for the TX command and header, and another one might
 * be needed for potential data in the SKB's head. The remaining ones can
 * be used for frags.
 */
#define IWL_PCIE_MAX_FRAGS(x) (x->max_tbs - 3)

/*
 * RX related structures and functions
 */
#define RX_NUM_QUEUES 1
#define RX_POST_REQ_ALLOC 2
#define RX_CLAIM_REQ_ALLOC 8
#define RX_PENDING_WATERMARK 16
#define FIRST_RX_QUEUE 512

// The reserved space in TxQ before we can insert more packets.
//
// The number comes from the comment of 'DMA-QUEUE-GENERAL-FUNCTIONS' section in the tx.c.
// The driver needs to keep at least 2 empty entries to distinguish the full/empty state.
//
// (Note that this is how the original code does. It looks too conservative. But there might be
//  some hardware/firmware design consideration.
//
#define TX_RESERVED_SPACE 3

struct iwl_host_cmd;

/*This file includes the declaration that are internal to the
 * trans_pcie layer */

/**
 * struct iwl_rx_mem_buffer
 * @io_buf: driver's handle to the rxb memory
 * @invalid: rxb is in driver ownership - not owned by HW
 * @vid: index of this rxb in the global table
 * @size: size used from the buffer
 */
struct iwl_rx_mem_buffer {
  struct iwl_iobuf* io_buf;
  uint16_t vid;
  bool invalid;
  list_node_t list;
  uint32_t size;
};

/**
 * struct isr_statistics - interrupt statistics
 *
 */
struct isr_statistics {
  uint32_t hw;
  uint32_t sw;
  uint32_t err_code;
  uint32_t sch;
  uint32_t alive;
  uint32_t rfkill;
  uint32_t ctkill;
  uint32_t wakeup;
  uint32_t rx;
  uint32_t tx;
  uint32_t unhandled;
};

#define IWL_RX_TD_TYPE_MSK 0xff000000
#define IWL_RX_TD_SIZE_MSK 0x00ffffff
#define IWL_RX_TD_SIZE_2K BIT(11)
#define IWL_RX_TD_TYPE 0

/**
 * struct iwl_rx_transfer_desc - transfer descriptor
 * @type_n_size: buffer type (bit 0: external buff valid,
 *  bit 1: optional footer valid, bit 2-7: reserved)
 *  and buffer size
 * @addr: ptr to free buffer start address
 * @rbid: unique tag of the buffer
 * @reserved: reserved
 */
struct iwl_rx_transfer_desc {
  __le32 type_n_size;
  __le64 addr;
  __le16 rbid;
  __le16 reserved;
} __packed;

#define IWL_RX_CD_SIZE 0xffffff00

/**
 * struct iwl_rx_completion_desc - completion descriptor
 * @type: buffer type (bit 0: external buff valid,
 *  bit 1: optional footer valid, bit 2-7: reserved)
 * @status: status of the completion
 * @reserved1: reserved
 * @rbid: unique tag of the received buffer
 * @size: buffer size, masked by IWL_RX_CD_SIZE
 * @reserved2: reserved
 */
struct iwl_rx_completion_desc {
  uint8_t type;
  uint8_t status;
  __le16 reserved1;
  __le16 rbid;
  __le32 size;
  uint8_t reserved2[22];
} __packed;

/**
 * struct iwl_rxq - Rx queue
 * @id: queue index
 * @descriptors: IO buffer of receive buffer descriptors (rbd).
 *  Address size is 32 bit in pre-9000 devices and 64 bit in 9000 devices.
 *  In 22560 devices it is a pointer to a list of iwl_rx_transfer_desc's
 *  This replaces the former 'bd' and 'bd_dma' fields.
 * @used_descriptors: driver's pointer to buffer of used receive buffer descriptors (rbd).
 *  This replaces the former 'used_bd_dma' field. Its virtual address 'used_bd' is also unioned
 *  with the 'bd_32' field (for 9000 and lower chipsets) and the 'cd' field (for 22000 chipsets).
 * @rb_status: driver's pointer to receive buffer status
 *  This replaces the former 'rb_stts' and 'rb_stts_dma' fields.
 * @tr_tail: driver's pointer to the transmission ring tail buffer
 * @tr_tail_dma: physical address of the buffer for the transmission ring tail
 * @cr_tail: driver's pointer to the completion ring tail buffer
 * @cr_tail_dma: physical address of the buffer for the completion ring tail
 * @read: Shared index to newest available Rx buffer
 * @write: Shared index to oldest written Rx packet
 * @free_count: Number of pre-allocated buffers in rx_free
 * @write_actual:
 * @rx_free: list of RBDs with allocated RB ready for use
 * @need_update: flag to indicate we need to update read/write index
 * @lock:
 * @queue: actual rx queue. Not used for multi-rx queue.
 *
 * NOTE:  rx_free is used as a FIFO for iwl_rx_mem_buffers
 */
struct iwl_rxq {
  int id;
  struct iwl_iobuf* descriptors;
  struct iwl_iobuf* used_descriptors;
  struct iwl_iobuf* rb_status;

  //  These fields are only used for multi-rx queue devices.
  union {
    void* used_bd;  // the virtual address of 'used_descriptors'.
    __le32* bd_32;
    struct iwl_rx_completion_desc* cd;
  };

#if 0   // NEEDS_PORTING
  // These fields are only used for 22560 devices and newer.
  __le16* tr_tail;
  dma_addr_t tr_tail_dma;
  __le16* cr_tail;
  dma_addr_t cr_tail_dma;
#endif  // NEEDS_PORTING

  uint32_t read;
  uint32_t write;
  uint32_t free_count;
  uint32_t write_actual;
  uint32_t queue_size;
  list_node_t rx_free;
  bool need_update;
  mtx_t lock;
  struct napi_struct napi;  // TODO(43218): replace with something like mvmvif so that when
                            //              packet is received we know where to dispatch.
  struct iwl_rx_mem_buffer* queue[RX_QUEUE_SIZE];
};

struct iwl_dma_ptr {
  struct iwl_iobuf* io_buf;
  dma_addr_t dma;
  void* addr;
  size_t size;
};

/**
 * iwl_queue_inc_wrap - increment queue index, wrap back to beginning
 * @index -- current index
 */
static inline int iwl_queue_inc_wrap(struct iwl_trans* trans, int index) {
  return ++index & (trans->cfg->base_params->max_tfd_queue_size - 1);
}

/**
 * iwl_get_closed_rb_stts - get closed rb stts from different structs
 * @rxq - the rxq to get the rb stts from
 */
static inline __le16 iwl_get_closed_rb_stts(struct iwl_trans* trans, struct iwl_rxq* rxq) {
  if (trans->cfg->device_family >= IWL_DEVICE_FAMILY_22560) {
    __le16* rb_status = (__le16*)iwl_iobuf_virtual(rxq->rb_status);

    return READ_ONCE(*rb_status);
  } else {
    struct iwl_rb_status* rb_status = (struct iwl_rb_status*)iwl_iobuf_virtual(rxq->rb_status);

    return READ_ONCE(rb_status->closed_rb_num);
  }
}

/**
 * iwl_queue_dec_wrap - decrement queue index, wrap back to end
 * @index -- current index
 */
static inline int iwl_queue_dec_wrap(struct iwl_trans* trans, int index) {
  return --index & (trans->cfg->base_params->max_tfd_queue_size - 1);
}

struct iwl_cmd_meta {
  /* only for SYNC commands, iff the reply skb is wanted */
  struct iwl_host_cmd* source;
  uint32_t flags;
  uint32_t tbs;
};

#define TFD_TX_CMD_SLOTS 256
#define TFD_CMD_SLOTS 32

/*
 * The FH will write back to the first TB only, so we need to copy some data
 * into the buffer regardless of whether it should be mapped or not.
 * This indicates how big the first TB must be to include the scratch buffer
 * and the assigned PN.
 * Since PN location is 8 bytes at offset 12, it's 20 now.
 * If we make it bigger then allocations will be bigger and copy slower, so
 * that's probably not useful.
 */
#define IWL_FIRST_TB_SIZE 20
#define IWL_FIRST_TB_SIZE_ALIGN ROUND_UP(IWL_FIRST_TB_SIZE, 64)

struct iwl_pcie_txq_entry {
  struct iwl_iobuf* cmd;  // Used to store the command
  struct iwl_iobuf* dup_io_buf;
  struct iwl_cmd_meta meta;
};

struct iwl_pcie_first_tb_buf {
  uint8_t buf[IWL_FIRST_TB_SIZE_ALIGN];
};

typedef void(iwlwifi_timer_callback_t)(void* data);

/**
 * struct iwl_txq - Tx Queue for DMA
 * @q: generic Rx/Tx queue descriptor
 * @tfds: transmit frame descriptors (DMA memory)
 * @first_tb_bufs: start of command headers, including scratch buffers, for
 *  the writeback -- this is DMA memory and an array holding one buffer
 *  for each command on the queue
 * @entries: transmit entries (driver state)
 * @lock: queue lock
 * @stuck_timer: timer that fires if queue gets stuck
 * @trans_pcie: pointer back to transport (for timer)
 * @need_update: indicates need to update read/write index
 * @ampdu: true if this queue is an ampdu queue for an specific RA/TID
 * @wd_timeout: queue watchdog timeout - per queue
 * @frozen: tx stuck queue timer is frozen
 * @frozen_expiry_remainder: remember how long until the timer fires
 * @bc_tbl: byte count table of the queue (relevant only for gen2 transport)
 * @write_ptr: 1-st empty entry (index) host_w
 * @read_ptr: last used entry (index) host_r
 * @dma_addr:  physical addr for BD's
 * @n_window: safe queue window
 * @id: queue id
 * @low_mark: low watermark, resume queue if free space more than this
 * @high_mark: high watermark, stop queue if free space less than this
 *
 * A Tx queue consists of circular buffer of BDs (a.k.a. TFDs, transmit frame
 * descriptors) and required locking structures.
 *
 * Note the difference between TFD_QUEUE_SIZE_MAX and n_window: the hardware
 * always assumes 256 descriptors, so TFD_QUEUE_SIZE_MAX is always 256 (unless
 * there might be HW changes in the future). For the normal TX
 * queues, n_window, which is the size of the software queue data
 * is also 256; however, for the command queue, n_window is only
 * 32 since we don't need so many commands pending. Since the HW
 * still uses 256 BDs for DMA though, TFD_QUEUE_SIZE_MAX stays 256.
 * This means that we end up with the following:
 *  HW entries: | 0 | ... | N * 32 | ... | N * 32 + 31 | ... | 255 |
 *  SW entries:           | 0      | ... | 31          |
 * where N is a number between 0 and 7. This means that the SW
 * data is a window overlayed over the HW queue.
 */
struct iwl_txq {
  struct iwl_iobuf* tfds;
  struct iwl_iobuf* first_tb_bufs;
  struct iwl_pcie_txq_entry* entries;
  mtx_t lock;
  unsigned long frozen_expiry_remainder;
  struct iwl_irq_timer* stuck_timer;
  struct iwl_trans_pcie* trans_pcie;
  bool need_update;
  bool frozen;
  bool ampdu;
  int block;
  zx_duration_t wd_timeout;
  struct sk_buff_head overflow_q;
  struct iwl_dma_ptr bc_tbl;

  int write_ptr;
  int read_ptr;
  dma_addr_t dma_addr;
  uint16_t n_window;
  uint32_t id;
  int low_mark;
  int high_mark;
};

static inline dma_addr_t iwl_pcie_get_first_tb_dma(struct iwl_txq* txq, int idx) {
  return iwl_iobuf_physical(txq->first_tb_bufs) + (sizeof(struct iwl_pcie_first_tb_buf) * idx);
}

struct iwl_tso_hdr_page {
  struct page* page;
  uint8_t* pos;
};

#ifdef CPTCFG_IWLWIFI_DEBUGFS
/**
 * enum iwl_fw_mon_dbgfs_state - the different states of the monitor_data
 * debugfs file
 *
 * @IWL_FW_MON_DBGFS_STATE_CLOSED: the file is closed.
 * @IWL_FW_MON_DBGFS_STATE_OPEN: the file is open.
 * @IWL_FW_MON_DBGFS_STATE_DISABLED: the file is disabled, once this state is
 *  set the file can no longer be used.
 */
enum iwl_fw_mon_dbgfs_state {
  IWL_FW_MON_DBGFS_STATE_CLOSED,
  IWL_FW_MON_DBGFS_STATE_OPEN,
  IWL_FW_MON_DBGFS_STATE_DISABLED,
};
#endif

/**
 * enum iwl_shared_irq_flags - level of sharing for irq
 * @IWL_SHARED_IRQ_NON_RX: interrupt vector serves non rx causes.
 * @IWL_SHARED_IRQ_FIRST_RSS: interrupt vector serves first RSS queue.
 */
enum iwl_shared_irq_flags {
  IWL_SHARED_IRQ_NON_RX = BIT(0),
  IWL_SHARED_IRQ_FIRST_RSS = BIT(1),
};

/**
 * enum iwl_image_response_code - image response values
 * @IWL_IMAGE_RESP_DEF: the default value of the register
 * @IWL_IMAGE_RESP_SUCCESS: iml was read successfully
 * @IWL_IMAGE_RESP_FAIL: iml reading failed
 */
enum iwl_image_response_code {
  IWL_IMAGE_RESP_DEF = 0,
  IWL_IMAGE_RESP_SUCCESS = 1,
  IWL_IMAGE_RESP_FAIL = 2,
};

/**
 * struct iwl_self_init_dram - dram data used by self init process
 * @fw: lmac and umac dram data
 * @fw_cnt: total number of items in array
 * @paging: paging dram data
 * @paging_cnt: total number of items in array
 */
struct iwl_self_init_dram {
  struct iwl_dram_data* fw;
  int fw_cnt;
  struct iwl_dram_data* paging;
  int paging_cnt;
};

/**
 * struct cont_rec: continuous recording data structure
 * @prev_wr_ptr: the last address that was read in monitor_data
 *  debugfs file
 * @prev_wrap_cnt: the wrap count that was used during the last read in
 *  monitor_data debugfs file
 * @state: the state of monitor_data debugfs file as described
 *  in &iwl_fw_mon_dbgfs_state enum
 * @mutex: locked while reading from monitor_data debugfs file
 */
#ifdef CPTCFG_IWLWIFI_DEBUGFS
struct cont_rec {
  uint32_t prev_wr_ptr;
  uint32_t prev_wrap_cnt;
  uint8_t state;
  /* Used to sync monitor_data debugfs file with driver unload flow */
  struct mutex mutex;
};
#endif

/**
 * struct iwl_trans_pcie - PCIe transport specific data
 * @rxq: all the RX queue data
 * @rx_pool: initial pool of iwl_rx_mem_buffer for all the queues
 * @global_table: table mapping received VID from hw to rxb
 * @rba: allocator for RX replenishing
 * @ctxt_info: context information for FW self init
 * @ctxt_info_gen3: context information for gen3 devices
 * @prph_info: prph info for self init
 * @prph_scratch: prph scratch for self init
 * @ctxt_info_dma_addr: dma addr of context information
 * @prph_info_dma_addr: dma addr of prph info
 * @prph_scratch_dma_addr: dma addr of prph scratch
 * @ctxt_info_dma_addr: dma addr of context information
 * @init_dram: DRAM data of firmware image (including paging).
 *  Context information addresses will be taken from here.
 *  This is driver's local copy for keeping track of size and
 *  count for allocating and freeing the memory.
 * @trans: pointer to the generic transport area
 * @scd_base_addr: scheduler sram base address in SRAM
 * @scd_bc_tbls: pointer to the byte count table of the scheduler
 * @kw: keep warm address
 * @pci_dev: basic pci-network driver stuff
 * @pci: PCI protocol
 * @mmio: PCI memory mapped IO
 * @ucode_write_complete: indicates that the ucode has been copied.
 * @ucode_write_waitq: wait queue for uCode load
 * @cmd_queue - command queue number
 * @def_rx_queue - default rx queue number
 * @rx_buf_size: Rx buffer size
 * @bc_table_dword: true if the BC table expects DWORD (as opposed to bytes)
 * @scd_set_active: should the transport configure the SCD for HCMD queue
 * @sw_csum_tx: if true, then the transport will compute the csum of the TXed
 *  frame.
 * @rx_page_order: page order for receive buffer size
 * @reg_lock: protect hw register access
 * @mutex: to protect stop_device / start_fw / start_hw
 * @cmd_in_flight: true when we have a host command in flight
#ifdef CPTCFG_IWLWIFI_DEBUGFS
 * @fw_mon_data: fw continuous recording data
#endif
 * @msix_entries: array of MSI-X entries
 * @msix_enabled: true if managed to enable MSI-X
 * @shared_vec_mask: the type of causes the shared vector handles
 *  (see iwl_shared_irq_flags).
 * @alloc_vecs: the number of interrupt vectors allocated by the OS
 * @def_irq: default irq for non rx causes
 * @fh_init_mask: initial unmasked fh causes
 * @hw_init_mask: initial unmasked hw causes
 * @fh_mask: current unmasked fh causes
 * @hw_mask: current unmasked hw causes
 * @in_rescan: true if we have triggered a device rescan
 */
struct iwl_trans_pcie {
  struct iwl_rxq* rxq;
  struct iwl_rx_mem_buffer rx_pool[RX_POOL_SIZE];
  struct iwl_rx_mem_buffer* global_table[RX_POOL_SIZE];
  union {
    struct iwl_context_info* ctxt_info;
    struct iwl_context_info_gen3* ctxt_info_gen3;
  };
  struct iwl_prph_info* prph_info;
  struct iwl_prph_scratch* prph_scratch;
  dma_addr_t ctxt_info_dma_addr;
  dma_addr_t prph_info_dma_addr;
  dma_addr_t prph_scratch_dma_addr;
  dma_addr_t iml_dma_addr;
  struct iwl_self_init_dram init_dram;
  struct iwl_trans* trans;

#if 0   // NEEDS_PORTING
    struct net_device napi_dev;

    struct __percpu iwl_tso_hdr_page* tso_hdr_page;
#endif  // NEEDS_PORTING

  /* INT ICT Table */
  struct iwl_iobuf* ict_tbl;
  int ict_index;
  bool use_ict;
  bool is_down, opmode_down;
  bool debug_rfkill;
  struct isr_statistics isr_stats;

  zx_handle_t irq_handle;
  thrd_t irq_thread;
  mtx_t irq_lock;
  mtx_t mutex;
  uint32_t inta_mask;
  uint32_t scd_base_addr;
  struct iwl_dma_ptr scd_bc_tbls;
  struct iwl_dma_ptr kw;

  struct iwl_txq* txq_memory;
  struct iwl_txq* txq[IWL_MAX_TVQM_QUEUES];
  unsigned long queue_used[BITS_TO_LONGS(IWL_MAX_TVQM_QUEUES)];
  unsigned long queue_stopped[BITS_TO_LONGS(IWL_MAX_TVQM_QUEUES)];

  /* PCI bus related data */
  struct iwl_pci_dev* pci_dev;
  pci_protocol_t* pci;
  pci_irq_mode_t irq_mode;
  mmio_buffer_t mmio;

  bool ucode_write_complete;
  sync_completion_t ucode_write_waitq;
  sync_completion_t wait_command_queue;
#if 0   // NEEDS_PORTING
    wait_queue_head_t d0i3_waitq;
#endif  // NEEDS_PORTING

  uint8_t page_offs, dev_cmd_offs;

  uint8_t cmd_queue;
  uint8_t def_rx_queue;
  uint8_t cmd_fifo;
  unsigned int cmd_q_wdg_timeout;
  uint8_t n_no_reclaim_cmds;
  uint8_t no_reclaim_cmds[MAX_NO_RECLAIM_CMDS];
  uint8_t max_tbs;
  uint16_t tfd_size;

  enum iwl_amsdu_size rx_buf_size;
  bool bc_table_dword;
  bool scd_set_active;
  bool sw_csum_tx;
  bool pcie_dbg_dumped_once;
  uint32_t rx_page_order;

  /*protect hw register */
  mtx_t reg_lock;
  bool cmd_hold_nic_awake;
  bool ref_cmd_in_flight;

#ifdef CPTCFG_IWLWIFI_DEBUGFS
  struct cont_rec fw_mon_data;
#endif

#if 0   // NEEDS_PORTING
    struct msix_entry msix_entries[IWL_MAX_RX_HW_QUEUES];
#endif  // NEEDS_PORTING
  bool msix_enabled;
  uint8_t shared_vec_mask;
  uint32_t alloc_vecs;
  uint32_t def_irq;
  uint32_t fh_init_mask;
  uint32_t hw_init_mask;
  uint32_t fh_mask;
  uint32_t hw_mask;
#if 0   // NEEDS_PORTING
    cpumask_t affinity_mask[IWL_MAX_RX_HW_QUEUES];
#endif  // NEEDS_PORTING
  bool in_rescan;
};

static inline struct iwl_trans_pcie* IWL_TRANS_GET_PCIE_TRANS(struct iwl_trans* trans) {
  return (struct iwl_trans_pcie*)trans->trans_specific;
}

#if 0   // NEEDS_PORTING
static inline void iwl_pcie_clear_irq(struct iwl_trans* trans, struct msix_entry* entry) {
    /*
     * Before sending the interrupt the HW disables it to prevent
     * a nested interrupt. This is done by writing 1 to the corresponding
     * bit in the mask register. After handling the interrupt, it should be
     * re-enabled by clearing this bit. This register is defined as
     * write 1 clear (W1C) register, meaning that it's being clear
     * by writing 1 to the bit.
     */
    iwl_write32(trans, CSR_MSIX_AUTOMASK_ST_AD, BIT(entry->entry));
}
#endif  // NEEDS_PORTING

static inline struct iwl_trans* iwl_trans_pcie_get_trans(struct iwl_trans_pcie* trans_pcie) {
  return containerof(trans_pcie, struct iwl_trans, trans_specific);
}

/*
 * Convention: trans API functions: iwl_trans_pcie_XXX
 *  Other functions: iwl_pcie_XXX
 */
struct iwl_trans* iwl_trans_pcie_alloc(struct iwl_pci_dev* pdev,
                                       const struct iwl_pci_device_id* ent,
                                       const struct iwl_cfg* cfg);
void iwl_trans_pcie_free(struct iwl_trans* trans);

/*****************************************************
 * RX
 ******************************************************/
zx_status_t iwl_pcie_rx_init(struct iwl_trans* trans);
int iwl_pcie_gen2_rx_init(struct iwl_trans* trans);
int iwl_pcie_irq_handler(void* arg);
zx_status_t iwl_pcie_isr(struct iwl_trans* trans);
#if 0   // NEEDS_PORTING
irqreturn_t iwl_pcie_msix_isr(int irq, void* data);
irqreturn_t iwl_pcie_irq_msix_handler(int irq, void* dev_id);
irqreturn_t iwl_pcie_irq_rx_msix_handler(int irq, void* dev_id);
#endif  // NEEDS_PORTING
int iwl_pcie_rx_stop(struct iwl_trans* trans);
void iwl_pcie_rx_free(struct iwl_trans* trans);
int iwl_pcie_dummy_napi_poll(struct napi_struct* napi, int budget);

/*****************************************************
 * ICT - interrupt handling
 ******************************************************/
zx_status_t iwl_pcie_alloc_ict(struct iwl_trans* trans);
void iwl_pcie_free_ict(struct iwl_trans* trans);
void iwl_pcie_reset_ict(struct iwl_trans* trans);
void iwl_pcie_disable_ict(struct iwl_trans* trans);

// Exposed for tests only.
uint32_t iwl_pcie_int_cause_ict(struct iwl_trans* trans);

/*****************************************************
 * TX / HCMD
 ******************************************************/
zx_status_t iwl_pcie_tx_init(struct iwl_trans* trans);
int iwl_pcie_gen2_tx_init(struct iwl_trans* trans, int txq_id, int queue_size);
void iwl_pcie_tx_start(struct iwl_trans* trans, uint32_t scd_base_addr);
zx_status_t iwl_pcie_tx_stop(struct iwl_trans* trans);
void iwl_pcie_tx_free(struct iwl_trans* trans);
bool iwl_trans_pcie_txq_enable(struct iwl_trans* trans, int queue, uint16_t ssn,
                               const struct iwl_trans_txq_scd_cfg* cfg, zx_duration_t wdg_timeout);
void iwl_trans_pcie_txq_disable(struct iwl_trans* trans, int queue, bool configure_scd);
void iwl_trans_pcie_txq_set_shared_mode(struct iwl_trans* trans, uint32_t txq_id, bool shared_mode);
void iwl_trans_pcie_log_scd_error(struct iwl_trans* trans, struct iwl_txq* txq);
zx_status_t iwl_trans_pcie_tx(struct iwl_trans* trans, struct ieee80211_mac_packet* pkt,
                              const struct iwl_device_cmd* dev_cmd, int txq_id);
void iwl_pcie_txq_check_wrptrs(struct iwl_trans* trans);
zx_status_t iwl_trans_pcie_send_hcmd(struct iwl_trans* trans, struct iwl_host_cmd* cmd);
zx_status_t iwl_pcie_cmdq_reclaim(struct iwl_trans* trans, int txq_id, uint32_t idx);
void iwl_pcie_gen2_txq_inc_wr_ptr(struct iwl_trans* trans, struct iwl_txq* txq);
void iwl_pcie_hcmd_complete(struct iwl_trans* trans, struct iwl_rx_cmd_buffer* rxb);
void iwl_trans_pcie_reclaim(struct iwl_trans* trans, int txq_id, int ssn);
void iwl_trans_pcie_tx_reset(struct iwl_trans* trans);
void iwl_pcie_gen2_update_byte_tbl(struct iwl_trans_pcie* trans_pcie, struct iwl_txq* txq,
                                   uint16_t byte_cnt, int num_tbs);

static inline uint16_t iwl_pcie_tfd_tb_get_len(struct iwl_trans* trans, void* _tfd, uint8_t idx) {
    if (trans->cfg->use_tfh) {
      struct iwl_tfh_tfd* tfd = (struct iwl_tfh_tfd*)_tfd;
      struct iwl_tfh_tb* tb = &tfd->tbs[idx];

      return le16_to_cpu(tb->tb_len);
    } else {
      struct iwl_tfd* tfd = (struct iwl_tfd*)_tfd;
      struct iwl_tfd_tb* tb = &tfd->tbs[idx];

      return le16_to_cpu(tb->hi_n_len) >> 4;
    }
}

/*****************************************************
 * Error handling
 ******************************************************/
void iwl_pcie_dump_csr(struct iwl_trans* trans);

/*****************************************************
 * Helpers
 ******************************************************/
static inline void _iwl_disable_interrupts(struct iwl_trans* trans) {
  struct iwl_trans_pcie* trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);

  clear_bit(STATUS_INT_ENABLED, &trans->status);
  if (!trans_pcie->msix_enabled) {
    /* disable interrupts from uCode/NIC to host */
    iwl_write32(trans, CSR_INT_MASK, 0x00000000);

    /* acknowledge/clear/reset any interrupts still pending
     * from uCode or flow handler (Rx/Tx DMA) */
    iwl_write32(trans, CSR_INT, 0xffffffff);
    iwl_write32(trans, CSR_FH_INT_STATUS, 0xffffffff);
  } else {
    /* disable all the interrupt we might use */
    iwl_write32(trans, CSR_MSIX_FH_INT_MASK_AD, trans_pcie->fh_init_mask);
    iwl_write32(trans, CSR_MSIX_HW_INT_MASK_AD, trans_pcie->hw_init_mask);
  }
  IWL_DEBUG_ISR(trans, "Disabled interrupts\n");
}
#if 0  // NEEDS_PORTING

#define IWL_NUM_OF_COMPLETION_RINGS 31
#define IWL_NUM_OF_TRANSFER_RINGS 527

static inline int iwl_pcie_get_num_sections(const struct fw_img* fw, int start) {
    int i = 0;

    while (start < fw->num_sec && fw->sec[start].offset != CPU1_CPU2_SEPARATOR_SECTION &&
            fw->sec[start].offset != PAGING_SEPARATOR_SECTION) {
        start++;
        i++;
    }

    return i;
}

static inline int iwl_pcie_ctxt_info_alloc_dma(struct iwl_trans* trans, const struct fw_desc* sec,
        struct iwl_dram_data* dram) {
    dram->block = dma_alloc_coherent(trans->dev, sec->len, &dram->physical, GFP_KERNEL);
    if (!dram->block) {
        return -ENOMEM;
    }

    dram->size = sec->len;
    memcpy(dram->block, sec->data, sec->len);

    return 0;
}

static inline void iwl_pcie_ctxt_info_free_fw_img(struct iwl_trans* trans) {
    struct iwl_trans_pcie* trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
    struct iwl_self_init_dram* dram = &trans_pcie->init_dram;
    int i;

    if (!dram->fw) {
        WARN_ON(dram->fw_cnt);
        return;
    }

    for (i = 0; i < dram->fw_cnt; i++) {
        dma_free_coherent(trans->dev, dram->fw[i].size, dram->fw[i].block, dram->fw[i].physical);
    }

    kfree(dram->fw);
    dram->fw_cnt = 0;
    dram->fw = NULL;
}
#endif  // NEEDS_PORTING

static inline void iwl_disable_interrupts(struct iwl_trans* trans) {
  struct iwl_trans_pcie* trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);

  mtx_lock(&trans_pcie->irq_lock);
  _iwl_disable_interrupts(trans);
  mtx_unlock(&trans_pcie->irq_lock);
}

static inline void _iwl_enable_interrupts(struct iwl_trans* trans) {
  struct iwl_trans_pcie* trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);

  IWL_DEBUG_ISR(trans, "Enabling interrupts\n");
  set_bit(STATUS_INT_ENABLED, &trans->status);
  if (!trans_pcie->msix_enabled) {
    trans_pcie->inta_mask = CSR_INI_SET_MASK;
    iwl_write32(trans, CSR_INT_MASK, trans_pcie->inta_mask);
  } else {
    /*
     * fh/hw_mask keeps all the unmasked causes.
     * Unlike msi, in msix cause is enabled when it is unset.
     */
    trans_pcie->hw_mask = trans_pcie->hw_init_mask;
    trans_pcie->fh_mask = trans_pcie->fh_init_mask;
    iwl_write32(trans, CSR_MSIX_FH_INT_MASK_AD, ~trans_pcie->fh_mask);
    iwl_write32(trans, CSR_MSIX_HW_INT_MASK_AD, ~trans_pcie->hw_mask);
  }
}

static inline void iwl_enable_interrupts(struct iwl_trans* trans) {
  struct iwl_trans_pcie* trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);

  mtx_lock(&trans_pcie->irq_lock);
  _iwl_enable_interrupts(trans);
  mtx_unlock(&trans_pcie->irq_lock);
}

static inline void iwl_enable_hw_int_msk_msix(struct iwl_trans* trans, uint32_t msk) {
  struct iwl_trans_pcie* trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);

  iwl_write32(trans, CSR_MSIX_HW_INT_MASK_AD, ~msk);
  trans_pcie->hw_mask = msk;
}

static inline void iwl_enable_fh_int_msk_msix(struct iwl_trans* trans, uint32_t msk) {
  struct iwl_trans_pcie* trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);

  iwl_write32(trans, CSR_MSIX_FH_INT_MASK_AD, ~msk);
  trans_pcie->fh_mask = msk;
}

static inline void iwl_enable_fw_load_int(struct iwl_trans* trans) {
  struct iwl_trans_pcie* trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);

  IWL_DEBUG_ISR(trans, "Enabling FW load interrupt\n");
  if (!trans_pcie->msix_enabled) {
    trans_pcie->inta_mask = CSR_INT_BIT_FH_TX;
    iwl_write32(trans, CSR_INT_MASK, trans_pcie->inta_mask);
  } else {
    iwl_write32(trans, CSR_MSIX_HW_INT_MASK_AD, trans_pcie->hw_init_mask);
    iwl_enable_fh_int_msk_msix(trans, MSIX_FH_INT_CAUSES_D2S_CH0_NUM);
  }
}

static inline uint16_t iwl_pcie_get_cmd_index(const struct iwl_txq* q, uint32_t index) {
  return index & (q->n_window - 1);
}

static inline void* iwl_pcie_get_tfd(struct iwl_trans* trans, struct iwl_txq* txq, int idx) {
  struct iwl_trans_pcie* trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);

  if (trans->cfg->use_tfh) {
    idx = iwl_pcie_get_cmd_index(txq, idx);
  }

  char* ptr = (char*)iwl_iobuf_virtual(txq->tfds);
  return ptr + trans_pcie->tfd_size * idx;
}

#if 0   // NEEDS_PORTING
static inline const char* queue_name(struct device* dev, struct iwl_trans_pcie* trans_p, int i) {
    if (trans_p->shared_vec_mask) {
        int vec = trans_p->shared_vec_mask & IWL_SHARED_IRQ_FIRST_RSS ? 1 : 0;

        if (i == 0) {
            return DRV_NAME ": shared IRQ";
        }

        return devm_kasprintf(dev, GFP_KERNEL, DRV_NAME ": queue %d", i + vec);
    }
    if (i == 0) {
        return DRV_NAME ": default queue";
    }

    if (i == trans_p->alloc_vecs - 1) {
        return DRV_NAME ": exception";
    }

    return devm_kasprintf(dev, GFP_KERNEL, DRV_NAME ": queue %d", i);
}
#endif  // NEEDS_PORTING

static inline void iwl_enable_rfkill_int(struct iwl_trans* trans) {
  struct iwl_trans_pcie* trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);

  IWL_DEBUG_ISR(trans, "Enabling rfkill interrupt\n");
  if (!trans_pcie->msix_enabled) {
    trans_pcie->inta_mask = CSR_INT_BIT_RF_KILL;
    iwl_write32(trans, CSR_INT_MASK, trans_pcie->inta_mask);
  } else {
    iwl_write32(trans, CSR_MSIX_FH_INT_MASK_AD, trans_pcie->fh_init_mask);
    iwl_enable_hw_int_msk_msix(trans, MSIX_HW_INT_CAUSES_REG_RF_KILL);
  }

  if (trans->cfg->device_family == IWL_DEVICE_FAMILY_9000) {
    /*
     * On 9000-series devices this bit isn't enabled by default, so
     * when we power down the device we need set the bit to allow it
     * to wake up the PCI-E bus for RF-kill interrupts.
     */
    iwl_set_bit(trans, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_RFKILL_WAKE_L1A_EN);
  }
}

void iwl_pcie_handle_rfkill_irq(struct iwl_trans* trans);

// The hardware queue is available now, start queueing packet to hardware.  iwl_mvm_mac_itxq_xmit()
// is called then.
static inline void iwl_wake_queue(struct iwl_trans* trans, struct iwl_txq* txq) {
  struct iwl_trans_pcie* trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);

  if (test_and_clear_bit(txq->id, trans_pcie->queue_stopped)) {
    IWL_DEBUG_TX_QUEUES(trans, "Wake hwq %d\n", txq->id);
    iwl_op_mode_queue_not_full(trans->op_mode, txq->id);
  }
}

// Hardware Tx queue is full, stop queueing packets from MLME.
static inline void iwl_stop_queue(struct iwl_trans* trans, struct iwl_txq* txq) {
  struct iwl_trans_pcie* trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);

  if (!test_and_set_bit(txq->id, trans_pcie->queue_stopped)) {
    iwl_op_mode_queue_full(trans->op_mode, txq->id);
    IWL_DEBUG_TX_QUEUES(trans, "Stop hwq %d\n", txq->id);
  } else {
    IWL_DEBUG_TX_QUEUES(trans, "hwq %d already stopped\n", txq->id);
  }
}

static inline bool iwl_queue_used(const struct iwl_txq* q, int i) {
  int index = iwl_pcie_get_cmd_index(q, i);
  int r = iwl_pcie_get_cmd_index(q, q->read_ptr);
  int w = iwl_pcie_get_cmd_index(q, q->write_ptr);

  return w >= r ? (index >= r && index < w) : !(index < r && index >= w);
}

static inline bool iwl_is_rfkill_set(struct iwl_trans* trans) {
  struct iwl_trans_pcie* trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);

  if (trans_pcie->debug_rfkill) {
    return true;
  }

  return !(iwl_read32(trans, CSR_GP_CNTRL) & CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW);
}

static inline void __iwl_trans_pcie_set_bits_mask(struct iwl_trans* trans, uint32_t reg,
                                                  uint32_t mask, uint32_t value) {
  uint32_t v;

#ifdef CPTCFG_IWLWIFI_DEBUG
  WARN_ON_ONCE(value & ~mask);
#endif

  v = iwl_read32(trans, reg);
  v &= ~mask;
  v |= value;
  iwl_write32(trans, reg, v);
}

static inline void __iwl_trans_pcie_clear_bit(struct iwl_trans* trans, uint32_t reg,
                                              uint32_t mask) {
  __iwl_trans_pcie_set_bits_mask(trans, reg, mask, 0);
}

static inline void __iwl_trans_pcie_set_bit(struct iwl_trans* trans, uint32_t reg, uint32_t mask) {
  __iwl_trans_pcie_set_bits_mask(trans, reg, mask, mask);
}

static inline bool iwl_pcie_dbg_on(struct iwl_trans* trans) {
  return (trans->dbg_dest_tlv || trans->ini_valid);
}

void iwl_trans_pcie_rf_kill(struct iwl_trans* trans, bool state);
void iwl_trans_pcie_dump_regs(struct iwl_trans* trans);

#ifdef CPTCFG_IWLWIFI_DEBUGFS
int iwl_trans_pcie_dbgfs_register(struct iwl_trans* trans);
#else
static inline int iwl_trans_pcie_dbgfs_register(struct iwl_trans* trans) { return 0; }
#endif
#if 0   // NEEDS_PORTING

int iwl_pci_fw_exit_d0i3(struct iwl_trans* trans);
int iwl_pci_fw_enter_d0i3(struct iwl_trans* trans);

void iwl_pcie_rx_allocator_work(struct work_struct* data);
#endif  // NEEDS_PORTING

/* common functions that are used by gen2 transport */
int iwl_pcie_gen2_apm_init(struct iwl_trans* trans);
void iwl_pcie_apm_config(struct iwl_trans* trans);
int iwl_pcie_prepare_card_hw(struct iwl_trans* trans);
void iwl_pcie_synchronize_irqs(struct iwl_trans* trans);
bool iwl_pcie_check_hw_rf_kill(struct iwl_trans* trans);
void iwl_trans_pcie_handle_stop_rfkill(struct iwl_trans* trans, bool was_in_rfkill);
void iwl_pcie_txq_free_tfd(struct iwl_trans* trans, struct iwl_txq* txq);
int iwl_queue_space(struct iwl_trans* trans, const struct iwl_txq* q);
void iwl_pcie_apm_stop_master(struct iwl_trans* trans);
void iwl_pcie_conf_msix_hw(struct iwl_trans_pcie* trans_pcie);
zx_status_t iwl_pcie_txq_init(struct iwl_trans* trans, struct iwl_txq* txq, uint16_t slots_num,
                              bool cmd_queue);
zx_status_t iwl_pcie_txq_alloc(struct iwl_trans* trans, struct iwl_txq* txq, uint16_t slots_num,
                               bool cmd_queue);
zx_status_t iwl_pcie_alloc_dma_ptr(struct iwl_trans* trans, struct iwl_dma_ptr* ptr, size_t size);
void iwl_pcie_free_dma_ptr(struct iwl_trans* trans, struct iwl_dma_ptr* ptr);
int iwl_trans_pcie_power_device_off(struct iwl_trans_pcie* trans_pcie);
void iwl_pcie_apply_destination(struct iwl_trans* trans);
void iwl_pcie_free_tso_page(struct iwl_trans_pcie* trans_pcie, struct sk_buff* skb);
void iwl_pcie_txq_unmap(struct iwl_trans* trans, int txq_id);  // for testing
#ifdef CONFIG_INET
struct iwl_tso_hdr_page* get_page_hdr(struct iwl_trans* trans, size_t len);
#endif

/* common functions that are used by gen3 transport */
void iwl_pcie_alloc_fw_monitor(struct iwl_trans* trans, uint8_t max_power);

#if 0   // NEEDS_PORTING
/* transport gen 2 exported functions */
int iwl_trans_pcie_gen2_start_fw(struct iwl_trans* trans, const struct fw_img* fw,
                                 bool run_in_rfkill);
void iwl_trans_pcie_gen2_fw_alive(struct iwl_trans* trans, uint32_t scd_addr);
void iwl_pcie_gen2_txq_free_memory(struct iwl_trans* trans, struct iwl_txq* txq);
int iwl_trans_pcie_dyn_txq_alloc_dma(struct iwl_trans* trans, struct iwl_txq** intxq, int size,
                                     unsigned int timeout);
int iwl_trans_pcie_txq_alloc_response(struct iwl_trans* trans, struct iwl_txq* txq,
                                      struct iwl_host_cmd* hcmd);
int iwl_trans_pcie_dyn_txq_alloc(struct iwl_trans* trans, __le16 flags, uint8_t sta_id, uint8_t tid,
                                 int cmd_id, int size, unsigned int timeout);
void iwl_trans_pcie_dyn_txq_free(struct iwl_trans* trans, int queue);
int iwl_trans_pcie_gen2_tx(struct iwl_trans* trans, struct sk_buff* skb,
                           struct iwl_device_cmd* dev_cmd, int txq_id);
int iwl_trans_pcie_gen2_send_hcmd(struct iwl_trans* trans, struct iwl_host_cmd* cmd);
void iwl_trans_pcie_gen2_stop_device(struct iwl_trans* trans, bool low_power);
void _iwl_trans_pcie_gen2_stop_device(struct iwl_trans* trans, bool low_power);
void iwl_pcie_gen2_txq_unmap(struct iwl_trans* trans, int txq_id);
void iwl_pcie_gen2_tx_free(struct iwl_trans* trans);
void iwl_pcie_gen2_tx_stop(struct iwl_trans* trans);
#endif  // NEEDS_PORTING

#endif  // SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_PCIE_INTERNAL_H_
