text: /*
   * Copyright (c) 2013-2014,2016-2018 The Linux Foundation. All rights reserved.
   *
   * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
   *
   *
   * Permission to use, copy, modify, and/or distribute this software for
   * any purpose with or without fee is hereby granted, provided that the
   * above copyright notice and this permission notice appear in all
   * copies.
   *
   * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
   * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
   * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
   * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
   * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
   * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
   * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
   * PERFORMANCE OF THIS SOFTWARE.
   */
  
  /*
   * This file was originally distributed by Qualcomm Atheros, Inc.
   * under proprietary terms before Copyright ownership was assigned
   * to the Linux Foundation.
   */
  
  #ifndef HIF_SDIO_INTERNAL_H_
  #define HIF_SDIO_INTERNAL_H_
  
  #include "a_debug.h"
  #include "hif_sdio_dev.h"
  #include "htc_packet.h"
  #include "htc_api.h"
  
  
  #define HIF_SDIO_RX_DATA_OFFSET            64
  
  /* TODO: print output level and mask control */
  #define ATH_DEBUG_IRQ  ATH_DEBUG_MAKE_MODULE_MASK(4)
  #define ATH_DEBUG_XMIT ATH_DEBUG_MAKE_MODULE_MASK(5)
  #define ATH_DEBUG_RECV ATH_DEBUG_MAKE_MODULE_MASK(6)
  
  #define ATH_DEBUG_MAX_MASK 32
  
  #define OTHER_INTS_ENABLED (INT_STATUS_ENABLE_ERROR_MASK |   \
                              INT_STATUS_ENABLE_CPU_MASK   |   \
                              INT_STATUS_ENABLE_COUNTER_MASK)
  
  /* HTC operational parameters */
  #define HTC_TARGET_RESPONSE_TIMEOUT        2000 /* in ms */
  #define HTC_TARGET_DEBUG_INTR_MASK         0x01
  #define HTC_TARGET_CREDIT_INTR_MASK        0xF0
  
  #define INVALID_MAILBOX_NUMBER 0xFF
  #define MAILBOX_COUNT 4
  #define MAILBOX_FOR_BLOCK_SIZE 1
  #define MAILBOX_USED_COUNT 1
  #if defined(SDIO_3_0)
  #define MAILBOX_LOOKAHEAD_SIZE_IN_WORD 2
  #else
  #define MAILBOX_LOOKAHEAD_SIZE_IN_WORD 1
  #endif
  #define AR6K_TARGET_DEBUG_INTR_MASK     0x01
  
  typedef PREPACK struct _MBOX_IRQ_PROC_REGISTERS {
      A_UINT8 host_int_status;
      A_UINT8 cpu_int_status;
      A_UINT8 error_int_status;
      A_UINT8 counter_int_status;
      A_UINT8 mbox_frame;
      A_UINT8 rx_lookahead_valid;
      A_UINT8 host_int_status2;
      A_UINT8 gmbox_rx_avail;
      A_UINT32 rx_lookahead[MAILBOX_LOOKAHEAD_SIZE_IN_WORD * MAILBOX_COUNT];
      A_UINT32 int_status_enable;
  }POSTPACK MBOX_IRQ_PROC_REGISTERS;
  
  typedef PREPACK struct _MBOX_IRQ_ENABLE_REGISTERS {
      A_UINT8 int_status_enable;
      A_UINT8 cpu_int_status_enable;
      A_UINT8 error_status_enable;
      A_UINT8 counter_int_status_enable;
  }POSTPACK MBOX_IRQ_ENABLE_REGISTERS;
  
  #define TOTAL_CREDIT_COUNTER_CNT 4
  
  typedef PREPACK struct _MBOX_COUNTER_REGISTERS {
      A_UINT32 counter[TOTAL_CREDIT_COUNTER_CNT];
  }POSTPACK MBOX_COUNTER_REGISTERS;
  
  #define SDIO_NUM_DATA_RX_BUFFERS  64
  #define SDIO_DATA_RX_SIZE         1664
  
  struct TAG_HIF_SDIO_DEVICE {
      HIF_DEVICE *HIFDevice;
      A_MUTEX_T Lock;
      A_MUTEX_T TxLock;
      A_MUTEX_T RxLock;
      MBOX_IRQ_PROC_REGISTERS IrqProcRegisters;
      MBOX_IRQ_ENABLE_REGISTERS IrqEnableRegisters;
      MBOX_COUNTER_REGISTERS MailBoxCounterRegisters;
      MSG_BASED_HIF_CALLBACKS hif_callbacks;
      HIF_DEVICE_MBOX_INFO MailBoxInfo;
      A_UINT32 BlockSize;
      A_UINT32 BlockMask;
      HIF_DEVICE_IRQ_PROCESSING_MODE HifIRQProcessingMode;
      HIF_DEVICE_IRQ_YIELD_PARAMS HifIRQYieldParams;
      A_BOOL DSRCanYield;
      HIF_MASK_UNMASK_RECV_EVENT HifMaskUmaskRecvEvent;
      int CurrentDSRRecvCount;
      int RecheckIRQStatusCnt;
      A_UINT32 RecvStateFlags;
      void *pTarget;
  #ifdef HIF_RX_THREAD
      struct hif_recv_task* pRecvTask;
  #endif
  };
  
  #ifdef HIF_RX_THREAD
  struct hif_recv_task {
      struct task_struct *rx_completion_task;
      struct semaphore sem_rx_completion;
      int    rx_completion_shutdown;
      struct completion rx_completion_exit;
      spinlock_t rx_bundle_lock;
      spinlock_t rx_sync_completion_lock;
      HTC_PACKET_QUEUE rxBundleQueue;
      HTC_PACKET_QUEUE rxSyncCompletionQueue;
      spinlock_t rx_alloc_lock;
      HTC_PACKET_QUEUE rxAllocQueue;
  };
  #endif
  
  #define LOCK_HIF_DEV(device)    A_MUTEX_LOCK(&(device)->Lock);
  #define UNLOCK_HIF_DEV(device)  A_MUTEX_UNLOCK(&(device)->Lock);
  #define LOCK_HIF_DEV_RX(t)      A_MUTEX_LOCK(&(t)->RxLock);
  #define UNLOCK_HIF_DEV_RX(t)    A_MUTEX_UNLOCK(&(t)->RxLock);
  #define LOCK_HIF_DEV_TX(t)      A_MUTEX_LOCK(&(t)->TxLock);
  #define UNLOCK_HIF_DEV_TX(t)    A_MUTEX_UNLOCK(&(t)->TxLock);
  
  #define DEV_CALC_RECV_PADDED_LEN(pDev, length) (((length) + (pDev)->BlockMask) & (~((pDev)->BlockMask)))
  #define DEV_CALC_SEND_PADDED_LEN(pDev, length) DEV_CALC_RECV_PADDED_LEN(pDev,length)
  #define DEV_IS_LEN_BLOCK_ALIGNED(pDev, length) (((length) % (pDev)->BlockSize) == 0)
  
  #define HTC_RECV_WAIT_BUFFERS        (1 << 0)
  #define HTC_OP_STATE_STOPPING        (1 << 0)
  
  #define HTC_RX_PKT_IGNORE_LOOKAHEAD                         (1 << 0)
  #define HTC_RX_PKT_REFRESH_HDR                              (1 << 1)
  #define HTC_RX_PKT_PART_OF_BUNDLE                           (1 << 2)
  #define HTC_RX_PKT_NO_RECYCLE                               (1 << 3)
  #define HTC_RX_PKT_LAST_BUNDLED_PKT_HAS_ADDTIONAL_BLOCK     (1 << 4)
  
  #define IS_DEV_IRQ_PROCESSING_ASYNC_ALLOWED(pDev) ((pDev)->HifIRQProcessingMode != HIF_DEVICE_IRQ_SYNC_ONLY)
  
  /* hif_sdio_dev.c */
  HTC_PACKET *HIFDevAllocRxBuffer(HIF_SDIO_DEVICE *pDev, size_t length);
  
  A_UINT8 HIFDevMapPipeToMailBox(HIF_SDIO_DEVICE *pDev, A_UINT8 pipeid);
  A_UINT8 HIFDevMapMailBoxToPipe(HIF_SDIO_DEVICE *pDev, A_UINT8 mboxIndex,
          A_BOOL upload);
  
  /* hif_sdio_recv.c */
  A_STATUS HIFDevRWCompletionHandler(void *context, A_STATUS status);
  A_STATUS HIFDevDsrHandler(void *context);
  
  #endif /* HIF_SDIO_INTERNAL_H_ */
  