blob: 354eec1a795e0e59765b4c641a01c0f9a4c6631e [file] [log] [blame]
/*
* Copyright (c) 2016-2019 The Linux Foundation. All rights reserved.
*
* 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.
*/
#ifndef __PLD_SDIO_H__
#define __PLD_SDIO_H__
#ifdef CONFIG_PLD_SDIO_CNSS
#include <net/cnss.h>
#endif
#include "pld_common.h"
#ifdef DYNAMIC_SINGLE_CHIP
#define PREFIX DYNAMIC_SINGLE_CHIP "/"
#else
#ifdef MULTI_IF_NAME
#define PREFIX MULTI_IF_NAME "/"
#else
#define PREFIX ""
#endif
#endif
#define PLD_QCA9377_REV1_1_VERSION 0x5020001
#define PLD_QCA9379_REV1_VERSION 0x5040000
#ifndef CONFIG_CNSS
#define PLD_AR6004_VERSION_REV1_3 0x31c8088a
#define PLD_AR9888_REV2_VERSION 0x4100016c
#define PLD_AR6320_REV1_VERSION 0x5000000
#define PLD_AR6320_REV1_1_VERSION 0x5000001
#define PLD_AR6320_REV1_3_VERSION 0x5000003
#define PLD_AR6320_REV2_1_VERSION 0x5010000
#define PLD_AR6320_REV3_VERSION 0x5020000
#define PLD_AR6320_REV3_2_VERSION 0x5030000
#define PLD_AR6320_DEV_VERSION 0x1000000
#endif
#ifndef CONFIG_SDIO
static inline int pld_sdio_register_driver(void)
{
return 0;
}
static inline void pld_sdio_unregister_driver(void)
{
}
static inline
int pld_sdio_get_fw_files_for_target(struct pld_fw_files *pfw_files,
u32 target_type, u32 target_version)
{
return 0;
}
static inline uint8_t *pld_sdio_get_wlan_mac_address(struct device *dev,
uint32_t *num)
{
*num = 0;
return NULL;
}
#else
int pld_sdio_register_driver(void);
void pld_sdio_unregister_driver(void);
int pld_sdio_get_fw_files_for_target(struct pld_fw_files *pfw_files,
u32 target_type, u32 target_version);
#ifdef CONFIG_CNSS
static inline uint8_t *pld_sdio_get_wlan_mac_address(struct device *dev,
uint32_t *num)
{
return cnss_common_get_wlan_mac_address(dev, num);
}
#else
static inline uint8_t *pld_sdio_get_wlan_mac_address(struct device *dev,
uint32_t *num)
{
*num = 0;
return NULL;
}
#endif
#endif
#ifdef CONFIG_PLD_SDIO_CNSS
static inline void *pld_sdio_get_virt_ramdump_mem(struct device *dev,
unsigned long *size)
{
return cnss_common_get_virt_ramdump_mem(dev, size);
}
static inline void pld_sdio_release_virt_ramdump_mem(void *address)
{
}
static inline void pld_sdio_device_crashed(struct device *dev)
{
cnss_common_device_crashed(dev);
}
static inline bool pld_sdio_is_fw_dump_skipped(void)
{
return cnss_get_restart_level() == CNSS_RESET_SUBSYS_COUPLED;
}
static inline void pld_sdio_device_self_recovery(struct device *dev)
{
cnss_common_device_self_recovery(dev);
}
static inline bool pld_sdio_platform_driver_support(void)
{
return true;
}
#else
static inline void *pld_sdio_get_virt_ramdump_mem(struct device *dev,
unsigned long *size)
{
size_t length = 0;
int flags = GFP_KERNEL;
length = TOTAL_DUMP_SIZE;
if (!size)
return NULL;
*size = (unsigned long)length;
if (in_interrupt() || irqs_disabled() || in_atomic())
flags = GFP_ATOMIC;
return kzalloc(length, flags);
}
static inline void pld_sdio_release_virt_ramdump_mem(void *address)
{
kfree(address);
}
static inline void pld_sdio_device_crashed(struct device *dev)
{
}
static inline bool pld_sdio_is_fw_dump_skipped(void)
{
return false;
}
static inline void pld_sdio_device_self_recovery(struct device *dev)
{
}
static inline bool pld_sdio_platform_driver_support(void)
{
return false;
}
#endif
#ifdef CONFIG_PLD_SDIO_CNSS
/**
* pld_hif_sdio_get_virt_ramdump_mem() - Get virtual ramdump memory
* @dev: device
* @size: buffer to virtual memory size
*
* Return: virtual ramdump memory address
*/
static inline void *pld_hif_sdio_get_virt_ramdump_mem(struct device *dev,
unsigned long *size)
{
return cnss_common_get_virt_ramdump_mem(dev, size);
}
/**
* pld_hif_sdio_release_ramdump_mem() - Release virtual ramdump memory
* @address: virtual ramdump memory address
*
* Return: void
*/
static inline void pld_hif_sdio_release_ramdump_mem(unsigned long *address)
{
}
#else
/**
* pld_hif_sdio_get_virt_ramdump_mem() - Get virtual ramdump memory
* @dev: device
* @size: buffer to virtual memory size
*
* Return: virtual ramdump memory address
*/
static inline void *pld_hif_sdio_get_virt_ramdump_mem(struct device *dev,
unsigned long *size)
{
size_t length = 0;
int flags = GFP_KERNEL;
length = TOTAL_DUMP_SIZE;
if (size)
*size = (unsigned long)length;
if (in_interrupt() || irqs_disabled() || in_atomic())
flags = GFP_ATOMIC;
return kzalloc(length, flags);
}
/**
* pld_hif_sdio_release_ramdump_mem() - Release virtual ramdump memory
* @address: virtual ramdump memory address
*
* Return: void
*/
static inline void pld_hif_sdio_release_ramdump_mem(unsigned long *address)
{
if (address)
kfree(address);
}
#endif
#endif