qcacmn: [HIF] Add support for QCA9379 on x86 platform

Add support for QCA9379 chip on x86 platform for
USB and SDIO attach.

Change-Id: I1192e47f6ca186bbcaa6d1fb28d40cb16d6dfe0b
CRs-Fixed: 2181012
This commit is contained in:
Nirav Shah
2018-02-26 14:50:25 +05:30
committed by nshrivas
parent 93caac752f
commit d9dce6e18c
30 changed files with 274 additions and 306 deletions

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2013-2017 The Linux Foundation. All rights reserved. * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved.
* *
* Permission to use, copy, modify, and/or distribute this software for * Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the * any purpose with or without fee is hereby granted, provided that the
@@ -49,5 +49,5 @@ int hif_ahb_enable_radio(struct hif_pci_softc *sc,
int hif_ahb_configure_irq(struct hif_pci_softc *sc); int hif_ahb_configure_irq(struct hif_pci_softc *sc);
int hif_ahb_configure_grp_irq(struct hif_softc *scn, int hif_ahb_configure_grp_irq(struct hif_softc *scn,
struct hif_exec_context *hif_ext_grp); struct hif_exec_context *hif_ext_grp);
bool hif_ahb_needs_bmi(struct hif_softc *scn);
#endif #endif

View File

@@ -519,3 +519,10 @@ int hif_apps_wake_irq_enable(struct hif_opaque_softc *hif_ctx)
return 0; return 0;
} }
bool hif_needs_bmi(struct hif_opaque_softc *scn)
{
struct hif_softc *hif_sc = HIF_GET_SOFTC(scn);
return hif_sc->bus_ops.hif_needs_bmi(hif_sc);
}

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2016-2017 The Linux Foundation. All rights reserved. * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved.
* *
* Previously licensed under the ISC license by Qualcomm Atheros, Inc. * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
* *
@@ -88,6 +88,7 @@ struct hif_bus_ops {
int (*hif_bus_reset_resume)(struct hif_softc *hif_ctx); int (*hif_bus_reset_resume)(struct hif_softc *hif_ctx);
int (*hif_map_ce_to_irq)(struct hif_softc *hif_sc, int ce_id); int (*hif_map_ce_to_irq)(struct hif_softc *hif_sc, int ce_id);
int (*hif_addr_in_boundary)(struct hif_softc *scn, uint32_t offset); int (*hif_addr_in_boundary)(struct hif_softc *scn, uint32_t offset);
bool (*hif_needs_bmi)(struct hif_softc *hif_sc);
}; };
#ifdef HIF_SNOC #ifdef HIF_SNOC
@@ -183,6 +184,8 @@ static inline int hif_sdio_get_context_size(void)
} }
#endif /* HIF_SDIO */ #endif /* HIF_SDIO */
int hif_grp_irq_configure(struct hif_softc *hif_sc,
struct hif_exec_context *hif_exec);
#ifdef HIF_USB #ifdef HIF_USB
QDF_STATUS hif_initialize_usb_ops(struct hif_bus_ops *bus_ops); QDF_STATUS hif_initialize_usb_ops(struct hif_bus_ops *bus_ops);
int hif_usb_get_context_size(void); int hif_usb_get_context_size(void);

View File

@@ -68,6 +68,7 @@ QDF_STATUS hif_initialize_ahb_ops(struct hif_bus_ops *bus_ops)
&hif_dummy_disable_power_management; &hif_dummy_disable_power_management;
bus_ops->hif_grp_irq_configure = &hif_ahb_configure_grp_irq; bus_ops->hif_grp_irq_configure = &hif_ahb_configure_grp_irq;
bus_ops->hif_addr_in_boundary = &hif_dummy_addr_in_boundary; bus_ops->hif_addr_in_boundary = &hif_dummy_addr_in_boundary;
bus_ops->hif_needs_bmi = &hif_ahb_needs_bmi;
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2016-2017 The Linux Foundation. All rights reserved. * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved.
* *
* Previously licensed under the ISC license by Qualcomm Atheros, Inc. * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
* *
@@ -92,6 +92,7 @@ QDF_STATUS hif_initialize_pci_ops(struct hif_softc *hif_sc)
/* default to legacy mapping handler; override as needed */ /* default to legacy mapping handler; override as needed */
bus_ops->hif_map_ce_to_irq = &hif_pci_legacy_map_ce_to_irq; bus_ops->hif_map_ce_to_irq = &hif_pci_legacy_map_ce_to_irq;
bus_ops->hif_needs_bmi = &hif_pci_needs_bmi;
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2016-2017 The Linux Foundation. All rights reserved. * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved.
* *
* Permission to use, copy, modify, and/or distribute this software for * Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the * any purpose with or without fee is hereby granted, provided that the
@@ -65,6 +65,7 @@ QDF_STATUS hif_initialize_sdio_ops(struct hif_softc *hif_sc)
bus_ops->hif_disable_power_management = bus_ops->hif_disable_power_management =
&hif_dummy_disable_power_management; &hif_dummy_disable_power_management;
bus_ops->hif_addr_in_boundary = &hif_dummy_addr_in_boundary; bus_ops->hif_addr_in_boundary = &hif_dummy_addr_in_boundary;
bus_ops->hif_needs_bmi = &hif_sdio_needs_bmi;
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2016-2017 The Linux Foundation. All rights reserved. * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved.
* *
* Previously licensed under the ISC license by Qualcomm Atheros, Inc. * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
* *
@@ -83,6 +83,7 @@ QDF_STATUS hif_initialize_snoc_ops(struct hif_bus_ops *bus_ops)
&hif_snoc_clear_stats; &hif_snoc_clear_stats;
bus_ops->hif_map_ce_to_irq = &hif_snoc_map_ce_to_irq; bus_ops->hif_map_ce_to_irq = &hif_snoc_map_ce_to_irq;
bus_ops->hif_addr_in_boundary = &hif_dummy_addr_in_boundary; bus_ops->hif_addr_in_boundary = &hif_dummy_addr_in_boundary;
bus_ops->hif_needs_bmi = &hif_snoc_needs_bmi;
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2016-2017 The Linux Foundation. All rights reserved. * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved.
* *
* Permission to use, copy, modify, and/or distribute this software for * Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the * any purpose with or without fee is hereby granted, provided that the
@@ -50,7 +50,6 @@ QDF_STATUS hif_initialize_usb_ops(struct hif_bus_ops *bus_ops)
bus_ops->hif_claim_device = &hif_dummy_claim_device; bus_ops->hif_claim_device = &hif_dummy_claim_device;
bus_ops->hif_shutdown_device = &hif_usb_shutdown_bus_device; bus_ops->hif_shutdown_device = &hif_usb_shutdown_bus_device;
bus_ops->hif_stop = &hif_usb_stop_device; bus_ops->hif_stop = &hif_usb_stop_device;
bus_ops->hif_bus_pkt_dl_len_set = &hif_dummy_bus_pkt_dl_len_set;
bus_ops->hif_cancel_deferred_target_sleep = bus_ops->hif_cancel_deferred_target_sleep =
&hif_dummy_cancel_deferred_target_sleep; &hif_dummy_cancel_deferred_target_sleep;
bus_ops->hif_irq_disable = &hif_usb_irq_disable; bus_ops->hif_irq_disable = &hif_usb_irq_disable;
@@ -58,13 +57,16 @@ QDF_STATUS hif_initialize_usb_ops(struct hif_bus_ops *bus_ops)
bus_ops->hif_dump_registers = &hif_dummy_dump_registers; bus_ops->hif_dump_registers = &hif_dummy_dump_registers;
bus_ops->hif_dump_target_memory = &hif_dummy_dump_target_memory; bus_ops->hif_dump_target_memory = &hif_dummy_dump_target_memory;
bus_ops->hif_ipa_get_ce_resource = &hif_dummy_ipa_get_ce_resource; bus_ops->hif_ipa_get_ce_resource = &hif_dummy_ipa_get_ce_resource;
bus_ops->hif_mask_interrupt_call = &hif_dummy_mask_interrupt_call;
bus_ops->hif_enable_power_management = bus_ops->hif_enable_power_management =
&hif_dummy_enable_power_management; &hif_dummy_enable_power_management;
bus_ops->hif_disable_power_management = bus_ops->hif_disable_power_management =
&hif_dummy_disable_power_management; &hif_dummy_disable_power_management;
bus_ops->hif_set_bundle_mode = hif_usb_set_bundle_mode;
bus_ops->hif_bus_reset_resume = hif_usb_bus_reset_resume;
bus_ops->hif_addr_in_boundary = &hif_dummy_addr_in_boundary; bus_ops->hif_addr_in_boundary = &hif_dummy_addr_in_boundary;
bus_ops->hif_set_bundle_mode = &hif_usb_set_bundle_mode;
bus_ops->hif_bus_reset_resume = &hif_usb_bus_reset_resume;
bus_ops->hif_map_ce_to_irq = &hif_dummy_map_ce_to_irq;
bus_ops->hif_needs_bmi = &hif_usb_needs_bmi;
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2016-2017 The Linux Foundation. All rights reserved. * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved.
* *
* Previously licensed under the ISC license by Qualcomm Atheros, Inc. * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
* *
@@ -59,4 +59,5 @@ int hif_pci_configure_grp_irq(struct hif_softc *scn,
void hif_pci_display_stats(struct hif_softc *hif_ctx); void hif_pci_display_stats(struct hif_softc *hif_ctx);
void hif_pci_clear_stats(struct hif_softc *hif_ctx); void hif_pci_clear_stats(struct hif_softc *hif_ctx);
int hif_pci_legacy_map_ce_to_irq(struct hif_softc *scn, int ce_id); int hif_pci_legacy_map_ce_to_irq(struct hif_softc *scn, int ce_id);
bool hif_pci_needs_bmi(struct hif_softc *scn);
#endif /* _PCI_API_H_ */ #endif /* _PCI_API_H_ */

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2016-2017 The Linux Foundation. All rights reserved. * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved.
* *
* Permission to use, copy, modify, and/or distribute this software for * Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the * any purpose with or without fee is hereby granted, provided that the
@@ -32,3 +32,4 @@ hif_sdio_get_config_item(struct hif_softc *hif_sc,
void hif_sdio_set_mailbox_swap(struct hif_softc *hif_sc); void hif_sdio_set_mailbox_swap(struct hif_softc *hif_sc);
void hif_sdio_claim_device(struct hif_softc *hif_sc); void hif_sdio_claim_device(struct hif_softc *hif_sc);
void hif_sdio_mask_interrupt_call(struct hif_softc *scn); void hif_sdio_mask_interrupt_call(struct hif_softc *scn);
bool hif_sdio_needs_bmi(struct hif_softc *scn);

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2016-2017 The Linux Foundation. All rights reserved. * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved.
* *
* Previously licensed under the ISC license by Qualcomm Atheros, Inc. * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
* *
@@ -47,4 +47,5 @@ int hif_snoc_dump_registers(struct hif_softc *scn);
void hif_snoc_display_stats(struct hif_softc *hif_ctx); void hif_snoc_display_stats(struct hif_softc *hif_ctx);
void hif_snoc_clear_stats(struct hif_softc *hif_ctx); void hif_snoc_clear_stats(struct hif_softc *hif_ctx);
int hif_snoc_map_ce_to_irq(struct hif_softc *scn, int ce_id); int hif_snoc_map_ce_to_irq(struct hif_softc *scn, int ce_id);
bool hif_snoc_needs_bmi(struct hif_softc *scn);
#endif /* _SNOC_API_H_ */ #endif /* _SNOC_API_H_ */

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2016-2017 The Linux Foundation. All rights reserved. * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved.
* *
* Permission to use, copy, modify, and/or distribute this software for * Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the * any purpose with or without fee is hereby granted, provided that the
@@ -17,6 +17,7 @@
*/ */
#ifndef _USB_API_H_ #ifndef _USB_API_H_
#define _USB_API_H_ #define _USB_API_H_
#include "if_usb.h"
QDF_STATUS hif_usb_open(struct hif_softc *hif_ctx, QDF_STATUS hif_usb_open(struct hif_softc *hif_ctx,
enum qdf_bus_type bus_type); enum qdf_bus_type bus_type);
@@ -39,6 +40,10 @@ int hif_usb_bus_resume(struct hif_softc *hif_ctx);
void hif_usb_stop_device(struct hif_softc *hif_sc); void hif_usb_stop_device(struct hif_softc *hif_sc);
void hif_usb_shutdown_bus_device(struct hif_softc *scn); void hif_usb_shutdown_bus_device(struct hif_softc *scn);
int hif_usb_bus_reset_resume(struct hif_softc *hif_ctx); int hif_usb_bus_reset_resume(struct hif_softc *hif_ctx);
void hif_usb_set_bundle_mode(struct hif_opaque_softc *scn, void hif_usb_set_bundle_mode(struct hif_softc *scn,
bool enabled, int rx_bundle_cnt); bool enabled, int rx_bundle_cnt);
void hif_usb_reg_tbl_attach(struct hif_softc *scn);
void hif_fw_assert_ramdump_pattern(struct hif_usb_softc *sc);
void hif_usb_ramdump_handler(struct hif_opaque_softc *scn);
bool hif_usb_needs_bmi(struct hif_softc *scn);
#endif /*_USB_API_H_*/ #endif /*_USB_API_H_*/

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2015-2017 The Linux Foundation. All rights reserved. * Copyright (c) 2015-2018 The Linux Foundation. All rights reserved.
* *
* Permission to use, copy, modify, and/or distribute this software for * Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the * any purpose with or without fee is hereby granted, provided that the
@@ -226,62 +226,9 @@ int hif_exec_event(struct hif_opaque_softc *hif_ctx, enum qca_napi_event event,
NAPI_DEBUG("<--[rc=%d]", rc); NAPI_DEBUG("<--[rc=%d]", rc);
return rc; return rc;
} }
#endif #endif
/**
* hif_napi_correct_cpu() - correct the interrupt affinity for napi if needed
* @napi_info: pointer to qca_napi_info for the napi instance
*
* Return: true => interrupt already on correct cpu, no correction needed
* false => interrupt on wrong cpu, correction done for cpu affinity
* of the interrupt
*/
static inline
bool hif_exec_correct_cpu(struct hif_exec_context *exec_ctx)
{
bool right_cpu = true;
int rc = 0;
cpumask_t cpumask;
int cpu;
struct hif_softc *hif_softc = HIF_GET_SOFTC(exec_ctx->hif);
struct qca_napi_data *napid;
int ind;
napid = &hif_softc->napi_data;
if (!(napid->flags & QCA_NAPI_FEATURE_CPU_CORRECTION))
goto done;
cpu = qdf_get_cpu();
if (likely((cpu == exec_ctx->cpu) ||
hif_exec_cpu_blacklist(napid, BLACKLIST_QUERY) == 0))
goto done;
right_cpu = false;
NAPI_DEBUG("interrupt on wrong CPU, correcting");
cpumask.bits[0] = (0x01 << exec_ctx->cpu);
for (ind = 0; ind < exec_ctx->numirq; ind++) {
if (exec_ctx->os_irq[ind]) {
irq_modify_status(exec_ctx->os_irq[ind],
IRQ_NO_BALANCING, 0);
rc = irq_set_affinity_hint(exec_ctx->os_irq[ind],
&cpumask);
irq_modify_status(exec_ctx->os_irq[ind], 0,
IRQ_NO_BALANCING);
if (rc)
HIF_ERROR("error setting irq affinity hint: %d",
rc);
else
exec_ctx->stats[cpu].cpu_corrected++;
}
}
done:
return right_cpu;
}
/** /**
* hncm_migrate_to() - migrates a NAPI to a CPU * hncm_migrate_to() - migrates a NAPI to a CPU
* @napid: pointer to NAPI block * @napid: pointer to NAPI block

View File

@@ -439,6 +439,24 @@ struct hif_opaque_softc *hif_open(qdf_device_t qdf_ctx, uint32_t mode,
return GET_HIF_OPAQUE_HDL(scn); return GET_HIF_OPAQUE_HDL(scn);
} }
#ifdef ADRASTEA_RRI_ON_DDR
/**
* hif_uninit_rri_on_ddr(): free consistent memory allocated for rri
* @scn: hif context
*
* Return: none
*/
void hif_uninit_rri_on_ddr(struct hif_softc *scn)
{
if (scn->vaddr_rri_on_ddr)
qdf_mem_free_consistent(scn->qdf_dev, scn->qdf_dev->dev,
(CE_COUNT * sizeof(uint32_t)),
scn->vaddr_rri_on_ddr,
scn->paddr_rri_on_ddr, 0);
scn->vaddr_rri_on_ddr = NULL;
}
#endif
/** /**
* hif_close(): hif_close * hif_close(): hif_close
* @hif_ctx: hif_ctx * @hif_ctx: hif_ctx
@@ -466,13 +484,8 @@ void hif_close(struct hif_opaque_softc *hif_ctx)
qdf_mem_free(hw_name); qdf_mem_free(hw_name);
} }
if (scn->vaddr_rri_on_ddr) hif_uninit_rri_on_ddr(scn);
qdf_mem_free_consistent(scn->qdf_dev, scn->qdf_dev->dev,
(CE_COUNT*sizeof(uint32_t)),
scn->vaddr_rri_on_ddr, scn->paddr_rri_on_ddr,
0);
scn->vaddr_rri_on_ddr = NULL;
hif_bus_close(scn); hif_bus_close(scn);
qdf_mem_free(scn); qdf_mem_free(scn);
} }
@@ -820,21 +833,6 @@ end:
return ret; return ret;
} }
/**
* hif_needs_bmi() - return true if the soc needs bmi through the driver
* @hif_ctx: hif context
*
* Return: true if the soc needs driver bmi otherwise false
*/
bool hif_needs_bmi(struct hif_opaque_softc *hif_ctx)
{
struct hif_softc *hif_sc = HIF_GET_SOFTC(hif_ctx);
return (hif_sc->bus_type != QDF_BUS_TYPE_SNOC) &&
!ce_srng_based(hif_sc);
}
qdf_export_symbol(hif_needs_bmi);
/** /**
* hif_get_bus_type() - return the bus type * hif_get_bus_type() - return the bus type
* *
@@ -1030,6 +1028,25 @@ bool hif_is_load_or_unload_in_progress(struct hif_softc *scn)
return false; return false;
} }
/**
* hif_is_recovery_in_progress() - API to query upper layers if recovery in
* progress
* @scn: HIF Context
*
* Return: True/False
*/
bool hif_is_recovery_in_progress(struct hif_softc *scn)
{
struct hif_driver_state_callbacks *cbk = hif_get_callbacks_handle(scn);
if (cbk && cbk->is_recovery_in_progress)
return cbk->is_recovery_in_progress(cbk->context);
return false;
}
#if defined(HIF_PCI) || defined(HIF_SNOC) || defined(HIF_AHB)
/** /**
* hif_update_pipe_callback() - API to register pipe specific callbacks * hif_update_pipe_callback() - API to register pipe specific callbacks
* @osc: Opaque softc * @osc: Opaque softc
@@ -1060,23 +1077,6 @@ void hif_update_pipe_callback(struct hif_opaque_softc *osc,
} }
qdf_export_symbol(hif_update_pipe_callback); qdf_export_symbol(hif_update_pipe_callback);
/**
* hif_is_recovery_in_progress() - API to query upper layers if recovery in
* progress
* @scn: HIF Context
*
* Return: True/False
*/
bool hif_is_recovery_in_progress(struct hif_softc *scn)
{
struct hif_driver_state_callbacks *cbk = hif_get_callbacks_handle(scn);
if (cbk && cbk->is_recovery_in_progress)
return cbk->is_recovery_in_progress(cbk->context);
return false;
}
/** /**
* hif_is_target_ready() - API to query if target is in ready state * hif_is_target_ready() - API to query if target is in ready state
* progress * progress
@@ -1093,7 +1093,7 @@ bool hif_is_target_ready(struct hif_softc *scn)
return false; return false;
} }
#if defined(HIF_PCI) || defined(SNOC) || defined(HIF_AHB)
/** /**
* hif_batch_send() - API to access hif specific function * hif_batch_send() - API to access hif specific function
* ce_batch_send. * ce_batch_send.
@@ -1209,21 +1209,17 @@ uint32_t hif_reg_read(struct hif_opaque_softc *hif_ctx, uint32_t offset)
} }
qdf_export_symbol(hif_reg_read); qdf_export_symbol(hif_reg_read);
#if defined(HIF_USB)
/** /**
* hif_ramdump_handler(): generic ramdump handler * hif_ramdump_handler(): generic ramdump handler
* @scn: struct hif_opaque_softc * @scn: struct hif_opaque_softc
* *
* Return: None * Return: None
*/ */
void hif_ramdump_handler(struct hif_opaque_softc *scn) void hif_ramdump_handler(struct hif_opaque_softc *scn)
{ {
if (hif_get_bus_type == QDF_BUS_TYPE_USB) if (hif_get_bus_type(scn) == QDF_BUS_TYPE_USB)
hif_usb_ramdump_handler(); hif_usb_ramdump_handler(scn);
} }
#endif
#ifdef WLAN_SUSPEND_RESUME_TEST #ifdef WLAN_SUSPEND_RESUME_TEST
irqreturn_t hif_wake_interrupt_handler(int irq, void *context) irqreturn_t hif_wake_interrupt_handler(int irq, void *context)

View File

@@ -272,13 +272,13 @@ int hif_target_sleep_state_adjust(struct hif_softc *scn,
bool sleep_ok, bool sleep_ok,
bool wait_for_it); bool wait_for_it);
int hif_get_rx_ctx_id(int ctx_id, struct hif_opaque_softc *hif_hdl); int hif_get_rx_ctx_id(int ctx_id, struct hif_opaque_softc *hif_hdl);
void hif_ramdump_handler(struct hif_opaque_softc *scn);
#ifdef HIF_USB #ifdef HIF_USB
void hif_usb_get_hw_info(struct hif_softc *scn); void hif_usb_get_hw_info(struct hif_softc *scn);
void hif_ramdump_handler(struct hif_opaque_softc *scn); void hif_usb_ramdump_handler(struct hif_opaque_softc *scn);
#else #else
static inline void hif_usb_get_hw_info(struct hif_softc *scn) {} static inline void hif_usb_get_hw_info(struct hif_softc *scn) {}
static inline void hif_ramdump_handler(struct hif_opaque_softc *scn) {} static inline void hif_usb_ramdump_handler(struct hif_opaque_softc *scn) {}
#endif #endif
/** /**
@@ -299,4 +299,11 @@ bool hif_is_target_register_access_allowed(struct hif_softc *hif_sc)
return true; return true;
} }
#endif #endif
#ifdef ADRASTEA_RRI_ON_DDR
void hif_uninit_rri_on_ddr(struct hif_softc *scn);
#else
static inline
void hif_uninit_rri_on_ddr(struct hif_softc *scn) {}
#endif
#endif /* __HIF_MAIN_H__ */ #endif /* __HIF_MAIN_H__ */

View File

@@ -4480,3 +4480,14 @@ int hif_pci_addr_in_boundary(struct hif_softc *scn, uint32_t offset)
return -EINVAL; return -EINVAL;
} }
/**
* hif_pci_needs_bmi() - return true if the soc needs bmi through the driver
* @scn: hif context
*
* Return: true if soc needs driver bmi otherwise false
*/
bool hif_pci_needs_bmi(struct hif_softc *scn)
{
return !ce_srng_based(scn);
}

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2013-2017 The Linux Foundation. All rights reserved. * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved.
* *
***Previously licensed under the ISC license by Qualcomm Atheros, Inc. ***Previously licensed under the ISC license by Qualcomm Atheros, Inc.
* *
@@ -40,6 +40,7 @@
static bool pending_events_func_check; static bool pending_events_func_check;
static uint32_t command_credits; static uint32_t command_credits;
static uint32_t *p_bmi_cmd_credits = &command_credits; static uint32_t *p_bmi_cmd_credits = &command_credits;
/* BMI Access routines */ /* BMI Access routines */
/** /**
@@ -297,8 +298,10 @@ hif_bmi_buffer_receive(struct hif_sdio_dev *device,
* *
* Return: QDF_STATUS_SUCCESS for success. * Return: QDF_STATUS_SUCCESS for success.
*/ */
QDF_STATUS hif_reg_based_get_target_info(struct hif_opaque_softc *hif_ctx, QDF_STATUS
struct bmi_target_info *targ_info) { hif_reg_based_get_target_info(struct hif_opaque_softc *hif_ctx,
struct bmi_target_info *targ_info)
{
QDF_STATUS status; QDF_STATUS status;
uint32_t cid; uint32_t cid;
struct hif_sdio_softc *scn = HIF_GET_SDIO_SOFTC(hif_ctx); struct hif_sdio_softc *scn = HIF_GET_SDIO_SOFTC(hif_ctx);
@@ -448,9 +451,10 @@ QDF_STATUS hif_exchange_bmi_msg(struct hif_opaque_softc *hif_ctx,
* Return: QDF_STATUS_SUCCESS for success. * Return: QDF_STATUS_SUCCESS for success.
*/ */
static QDF_STATUS QDF_STATUS
hif_bmi_raw_write(struct hif_sdio_dev *device, char *buffer, hif_bmi_raw_write(struct hif_sdio_dev *device, char *buffer,
uint32_t length) { uint32_t length)
{
return hif_bmi_buffer_send(device, buffer, length); return hif_bmi_buffer_send(device, buffer, length);
} }
@@ -463,7 +467,7 @@ hif_bmi_raw_write(struct hif_sdio_dev *device, char *buffer,
* *
* Return: QDF_STATUS_SUCCESS for success. * Return: QDF_STATUS_SUCCESS for success.
*/ */
static QDF_STATUS QDF_STATUS
hif_bmi_raw_read(struct hif_sdio_dev *device, char *buffer, hif_bmi_raw_read(struct hif_sdio_dev *device, char *buffer,
uint32_t length, bool want_timeout) uint32_t length, bool want_timeout)
{ {

View File

@@ -318,8 +318,8 @@ static QDF_STATUS hif_ar6k_read_target_register(struct hif_sdio_dev *hif_device,
* *
* Return: None * Return: None
*/ */
static void hif_ar6k_fetch_target_regs(struct hif_sdio_dev *hif_device, void hif_ar6k_fetch_target_regs(struct hif_sdio_dev *hif_device,
uint32_t *targregs) uint32_t *targregs)
{ {
int i; int i;
uint32_t val; uint32_t val;

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2013-2017 The Linux Foundation. All rights reserved. * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved.
* *
* Previously licensed under the ISC license by Qualcomm Atheros, Inc. * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
* *
@@ -156,7 +156,7 @@ QDF_STATUS hif_dev_send_buffer(struct hif_sdio_device *pdev,
} else { } else {
AR_DEBUG_PRINTF(ATH_DEBUG_ERR, AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
("Allocate send context fail %d\n", ("Allocate send context fail %d\n",
sizeof(struct hif_sendContext) + (int) sizeof(struct hif_sendContext) +
padded_length)); padded_length));
return QDF_STATUS_E_NOMEM; return QDF_STATUS_E_NOMEM;
} }

View File

@@ -47,15 +47,16 @@
#include <cds_api.h> #include <cds_api.h>
#include "regtable_sdio.h" #include "regtable_sdio.h"
#include <hif_debug.h> #include <hif_debug.h>
#include "target_type.h"
#include "epping_main.h"
#include "pld_sdio.h"
#include "targaddrs.h"
#include "sdio_api.h"
#ifndef REMOVE_PKT_LOG #ifndef REMOVE_PKT_LOG
#include "ol_txrx_types.h" #include "ol_txrx_types.h"
#include "pktlog_ac_api.h" #include "pktlog_ac_api.h"
#include "pktlog_ac.h" #include "pktlog_ac.h"
#endif #endif
#include "target_type.h"
#include "epping_main.h"
#include "pld_sdio.h"
#include "targaddrs.h"
#ifndef ATH_BUS_PM #ifndef ATH_BUS_PM
#ifdef CONFIG_PM #ifdef CONFIG_PM
@@ -206,27 +207,6 @@ err_alloc:
return ret; return ret;
} }
/**
* ol_ath_sdio_configure() - configure sdio device
* @hif_sc: pointer to sdio softc structure
* @dev: pointer to net device
* @hif_handle: pointer to sdio function
*
* Return: 0 for success and non-zero for failure
*/
static int
ol_ath_sdio_configure(void *hif_sc, struct net_device *dev,
hif_handle_t *hif_hdl)
{
struct hif_sdio_softc *sc = (struct hif_sdio_softc *)hif_sc;
int ret = 0;
sc->aps_osdev.netdev = dev;
*hif_hdl = sc->hif_handle;
return ret;
}
/** /**
* hif_sdio_remove() - remove sdio device * hif_sdio_remove() - remove sdio device
* @conext: sdio device context * @conext: sdio device context
@@ -340,21 +320,6 @@ static int init_ath_hif_sdio(void)
return 0; return 0;
} }
/**
* hif_targ_is_awake(): check if target is awake
*
* This function returns true if the target is awake
*
* @scn: struct hif_softc
* @mem: mapped mem base
*
* Return: bool
*/
static bool hif_targ_is_awake(struct hif_softc *scn, void *__iomem *mem)
{
return true;
}
/** /**
* hif_sdio_bus_suspend() - suspend the bus * hif_sdio_bus_suspend() - suspend the bus
* *
@@ -401,15 +366,6 @@ void hif_enable_power_gating(void *hif_ctx)
{ {
} }
/**
* hif_disable_aspm() - hif_disable_aspm
*
* Return: n/a
*/
static void hif_disable_aspm(void)
{
}
/** /**
* hif_sdio_close() - hif_bus_close * hif_sdio_close() - hif_bus_close
* *
@@ -446,28 +402,6 @@ QDF_STATUS hif_sdio_open(struct hif_softc *hif_sc,
return status; return status;
} }
/**
* hif_get_target_type() - Get the target type
*
* This function is used to query the target type.
*
* @ol_sc: ol_softc struct pointer
* @dev: device pointer
* @bdev: bus dev pointer
* @bid: bus id pointer
* @hif_type: HIF type such as HIF_TYPE_QCA6180
* @target_type: target type such as TARGET_TYPE_QCA6180
*
* Return: 0 for success
*/
static int hif_get_target_type(struct hif_softc *ol_sc, struct device *dev,
void *bdev, const hif_bus_id *bid, uint32_t *hif_type,
uint32_t *target_type)
{
return 0;
}
void hif_get_target_revision(struct hif_softc *ol_sc) void hif_get_target_revision(struct hif_softc *ol_sc)
{ {
struct hif_softc *ol_sc_local = (struct hif_softc *)ol_sc; struct hif_softc *ol_sc_local = (struct hif_softc *)ol_sc;
@@ -496,8 +430,8 @@ void hif_get_target_revision(struct hif_softc *ol_sc)
* Return: QDF_STATUS * Return: QDF_STATUS
*/ */
QDF_STATUS hif_sdio_enable_bus(struct hif_softc *hif_sc, QDF_STATUS hif_sdio_enable_bus(struct hif_softc *hif_sc,
struct device *dev, void *bdev, const hif_bus_id *bid, struct device *dev, void *bdev, const struct hif_bus_id *bid,
enum hif_enable_type type) enum hif_enable_type type)
{ {
int ret = 0; int ret = 0;
const struct sdio_device_id *id = (const struct sdio_device_id *)bid; const struct sdio_device_id *id = (const struct sdio_device_id *)bid;
@@ -654,13 +588,12 @@ void hif_wlan_disable(struct hif_softc *scn)
} }
/** /**
* hif_config_target() - configure hif bus * hif_sdio_needs_bmi() - return true if the soc needs bmi through the driver
* @hif_hdl: hif handle * @scn: hif context
* @state:
* *
* Return: int * Return: true if soc needs driver bmi otherwise false
*/ */
static int hif_config_target(void *hif_hdl) bool hif_sdio_needs_bmi(struct hif_softc *scn)
{ {
return 0; return true;
} }

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2013-2017 The Linux Foundation. All rights reserved. * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved.
* *
* Previously licensed under the ISC license by Qualcomm Atheros, Inc. * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
* *
@@ -101,4 +101,19 @@ void hif_register_tbl_attach(struct hif_softc *scn,
u32 hif_type); u32 hif_type);
void target_register_tbl_attach(struct hif_softc *scn, void target_register_tbl_attach(struct hif_softc *scn,
u32 target_type); u32 target_type);
void hif_enable_power_gating(void *hif_ctx);
void hif_sdio_close(struct hif_softc *hif_sc);
QDF_STATUS hif_sdio_open(struct hif_softc *hif_sc,
enum qdf_bus_type bus_type);
void hif_ar6k_fetch_target_regs(struct hif_sdio_dev *hif_device,
uint32_t *targregs);
QDF_STATUS hif_reg_based_get_target_info(struct hif_opaque_softc *hif_ctx,
struct bmi_target_info *targ_info);
QDF_STATUS
hif_bmi_raw_write(struct hif_sdio_dev *device, char *buffer,
uint32_t length);
QDF_STATUS
hif_bmi_raw_read(struct hif_sdio_dev *device, char *buffer,
u32 length, bool want_timeout);
#endif /* __IF_SDIO_H__ */ #endif /* __IF_SDIO_H__ */

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2013-2017 The Linux Foundation. All rights reserved. * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved.
* *
* Previously licensed under the ISC license by Qualcomm Atheros, Inc. * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
* *
@@ -144,9 +144,6 @@ MODULE_PARM_DESC(modstrength, "Adjust internal driver strength");
#define dev_to_sdio_func(d) container_of(d, struct sdio_func, dev) #define dev_to_sdio_func(d) container_of(d, struct sdio_func, dev)
#define to_sdio_driver(d) container_of(d, struct sdio_driver, drv) #define to_sdio_driver(d) container_of(d, struct sdio_driver, drv)
static int hif_device_inserted(struct sdio_func *func,
const struct sdio_device_id *id);
static void hif_device_removed(struct sdio_func *func);
static struct hif_sdio_dev *add_hif_device(struct sdio_func *func); static struct hif_sdio_dev *add_hif_device(struct sdio_func *func);
static struct hif_sdio_dev *get_hif_device(struct sdio_func *func); static struct hif_sdio_dev *get_hif_device(struct sdio_func *func);
static void del_hif_device(struct hif_sdio_dev *device); static void del_hif_device(struct hif_sdio_dev *device);
@@ -231,23 +228,6 @@ static const struct sdio_device_id ar6k_id_table[] = {
{ /* null */ }, { /* null */ },
}; };
#ifndef CONFIG_CNSS_SDIO
MODULE_DEVICE_TABLE(sdio, ar6k_id_table);
static struct sdio_driver ar6k_driver = {
.name = "ar6k_wlan",
.id_table = ar6k_id_table,
.probe = hif_device_inserted,
.remove = hif_device_removed,
};
static const struct dev_pm_ops ar6k_device_pm_ops = {
.suspend = hif_device_suspend,
.resume = hif_device_resume,
};
#endif
/* make sure we only unregister when registered. */ /* make sure we only unregister when registered. */
static int registered; static int registered;
@@ -980,8 +960,9 @@ static int sdio_enable4bits(struct hif_sdio_dev *device, int enable)
enable ? enable ?
SDIO_IRQ_MODE_ASYNC_4BIT_IRQ_AR6003 SDIO_IRQ_MODE_ASYNC_4BIT_IRQ_AR6003
: 0); : 0);
} else if (manufacturer_id == MANUFACTURER_ID_AR6320_BASE } else if (manufacturer_id == MANUFACTURER_ID_AR6320_BASE ||
|| manufacturer_id == MANUFACTURER_ID_QCA9377_BASE) { manufacturer_id == MANUFACTURER_ID_QCA9377_BASE ||
manufacturer_id == MANUFACTURER_ID_QCA9379_BASE) {
unsigned char data = 0; unsigned char data = 0;
setAsyncIRQ = 1; setAsyncIRQ = 1;
@@ -1196,6 +1177,7 @@ static void set_extended_mbox_window_info(uint16_t manf_id,
break; break;
} }
case MANUFACTURER_ID_QCA9377_BASE: case MANUFACTURER_ID_QCA9377_BASE:
case MANUFACTURER_ID_QCA9379_BASE:
pinfo->mbox_prop[0].extended_address = pinfo->mbox_prop[0].extended_address =
HIF_MBOX0_EXTENDED_BASE_ADDR_AR6320; HIF_MBOX0_EXTENDED_BASE_ADDR_AR6320;
pinfo->mbox_prop[0].extended_size = pinfo->mbox_prop[0].extended_size =
@@ -1601,6 +1583,21 @@ static void write_cccr(struct sdio_func *func)
} }
} }
#ifdef SDIO_BUS_WIDTH_8BIT
static int hif_cmd52_write_byte_8bit(struct sdio_func *func)
{
return func0_cmd52_write_byte(func->card, SDIO_CCCR_IF,
SDIO_BUS_CD_DISABLE | SDIO_BUS_WIDTH_8BIT);
}
#else
static int hif_cmd52_write_byte_8bit(struct sdio_func *func)
{
AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
("%s: 8BIT Bus Width not supported\n", __func__));
return QDF_STATUS_E_FAILURE;
}
#endif
/** /**
* hif_device_inserted() - hif-sdio driver probe handler * hif_device_inserted() - hif-sdio driver probe handler
* @func: pointer to sdio_func * @func: pointer to sdio_func
@@ -1750,12 +1747,7 @@ static int hif_device_inserted(struct sdio_func *func,
} else if (mmcbuswidth == 8 } else if (mmcbuswidth == 8
&& (device->host-> && (device->host->
caps & MMC_CAP_8_BIT_DATA)) { caps & MMC_CAP_8_BIT_DATA)) {
ret = ret = hif_cmd52_write_byte_8bit(func);
func0_cmd52_write_byte(func->card,
SDIO_CCCR_IF,
SDIO_BUS_CD_DISABLE
|
SDIO_BUS_WIDTH_8BIT);
if (ret) { if (ret) {
AR_DEBUG_PRINTF(ATH_DEBUG_ERR, AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
("%s: CMD52 to bus width failed: %d\n", ("%s: CMD52 to bus width failed: %d\n",
@@ -2061,8 +2053,9 @@ static QDF_STATUS hif_enable_func(struct hif_sdio_dev *device,
func0_cmd52_write_byte(func->card, func0_cmd52_write_byte(func->card,
CCCR_SDIO_IRQ_MODE_REG_AR6003, CCCR_SDIO_IRQ_MODE_REG_AR6003,
SDIO_IRQ_MODE_ASYNC_4BIT_IRQ_AR6003); SDIO_IRQ_MODE_ASYNC_4BIT_IRQ_AR6003);
} else if (manufacturer_id == MANUFACTURER_ID_AR6320_BASE } else if (manufacturer_id == MANUFACTURER_ID_AR6320_BASE ||
|| manufacturer_id == MANUFACTURER_ID_QCA9377_BASE) { manufacturer_id == MANUFACTURER_ID_QCA9377_BASE ||
manufacturer_id == MANUFACTURER_ID_QCA9379_BASE) {
unsigned char data = 0; unsigned char data = 0;
setAsyncIRQ = 1; setAsyncIRQ = 1;
@@ -2607,14 +2600,6 @@ static void reset_all_cards(void)
{ {
} }
static void hif_release_device(struct hif_opaque_softc *hif_ctx)
{
struct hif_sdio_softc *scn = HIF_GET_SDIO_SOFTC(hif_ctx);
struct hif_sdio_dev *hif_device = scn->hif_handle;
hif_device->claimed_ctx = NULL;
}
QDF_STATUS hif_attach_htc(struct hif_sdio_dev *device, QDF_STATUS hif_attach_htc(struct hif_sdio_dev *device,
struct htc_callbacks *callbacks) struct htc_callbacks *callbacks)
{ {
@@ -2730,7 +2715,6 @@ void hif_dump_cccr(struct hif_sdio_dev *hif_device)
AR_DEBUG_PRINTF(ATH_DEBUG_ERROR, ("\n")); AR_DEBUG_PRINTF(ATH_DEBUG_ERROR, ("\n"));
} }
#ifdef CONFIG_CNSS_SDIO
int hif_sdio_device_inserted(struct device *dev, int hif_sdio_device_inserted(struct device *dev,
const struct sdio_device_id *id) const struct sdio_device_id *id)
{ {
@@ -2743,4 +2727,3 @@ void hif_sdio_device_removed(struct sdio_func *func)
{ {
hif_device_removed(func); hif_device_removed(func);
} }
#endif

View File

@@ -25,6 +25,7 @@
* to the Linux Foundation. * to the Linux Foundation.
*/ */
#include "bmi_msg.h"
#include "target_type.h" #include "target_type.h"
#include "cepci.h" #include "cepci.h"

View File

@@ -28,6 +28,7 @@
#include "hif_debug.h" #include "hif_debug.h"
#include "hif_io32.h" #include "hif_io32.h"
#include "ce_main.h" #include "ce_main.h"
#include "ce_api.h"
#include "ce_tasklet.h" #include "ce_tasklet.h"
#include "if_ahb.h" #include "if_ahb.h"
#include "if_pci.h" #include "if_pci.h"
@@ -712,3 +713,13 @@ void hif_ahb_exec_grp_irq_enable(struct hif_exec_context *hif_ext_group)
qdf_spin_unlock_irqrestore(&hif_ext_group->irq_lock); qdf_spin_unlock_irqrestore(&hif_ext_group->irq_lock);
} }
/**
* hif_ahb_needs_bmi() - return true if the soc needs bmi through the driver
* @scn: hif context
*
* Return: true if soc needs driver bmi otherwise false
*/
bool hif_ahb_needs_bmi(struct hif_softc *scn)
{
return !ce_srng_based(scn);
}

View File

@@ -480,3 +480,14 @@ bool hif_is_target_register_access_allowed(struct hif_softc *scn)
else else
return true; return true;
} }
/**
* hif_snoc_needs_bmi() - return true if the soc needs bmi through the driver
* @scn: hif context
*
* Return: true if soc needs driver bmi otherwise false
*/
bool hif_snoc_needs_bmi(struct hif_softc *scn)
{
return false;
}

View File

@@ -38,6 +38,9 @@
#define ATH_MODULE_NAME hif #define ATH_MODULE_NAME hif
#include <a_debug.h> #include <a_debug.h>
#include "qdf_module.h" #include "qdf_module.h"
#include "hif_usb_internal.h"
#include "if_usb.h"
#include "usb_api.h"
#if defined(WLAN_DEBUG) || defined(DEBUG) #if defined(WLAN_DEBUG) || defined(DEBUG)
static ATH_DEBUG_MASK_DESCRIPTION g_hif_debug_description[] = { static ATH_DEBUG_MASK_DESCRIPTION g_hif_debug_description[] = {
@@ -74,9 +77,10 @@ unsigned int hif_usb_disable_rxdata2 = 1;
*/ */
static void usb_hif_usb_transmit_complete(struct urb *urb) static void usb_hif_usb_transmit_complete(struct urb *urb)
{ {
HIF_URB_CONTEXT *urb_context = (HIF_URB_CONTEXT *) urb->context; struct HIF_URB_CONTEXT *urb_context =
(struct HIF_URB_CONTEXT *)urb->context;
qdf_nbuf_t buf; qdf_nbuf_t buf;
HIF_USB_PIPE *pipe = urb_context->pipe; struct HIF_USB_PIPE *pipe = urb_context->pipe;
struct hif_usb_send_context *send_context; struct hif_usb_send_context *send_context;
HIF_DBG("+%s: pipe: %d, stat:%d, len:%d", __func__, HIF_DBG("+%s: pipe: %d, stat:%d, len:%d", __func__,
@@ -103,7 +107,7 @@ static void usb_hif_usb_transmit_complete(struct urb *urb)
/* note: queue implements a lock */ /* note: queue implements a lock */
skb_queue_tail(&pipe->io_comp_queue, buf); skb_queue_tail(&pipe->io_comp_queue, buf);
HIF_USB_SCHEDULE_WORK(pipe) HIF_USB_SCHEDULE_WORK(pipe);
HIF_DBG("-%s", __func__); HIF_DBG("-%s", __func__);
} }
@@ -118,15 +122,15 @@ static void usb_hif_usb_transmit_complete(struct urb *urb)
* *
* Return: QDF_STATUS_SUCCESS on success and error QDF status on failure * Return: QDF_STATUS_SUCCESS on success and error QDF status on failure
*/ */
static QDF_STATUS hif_send_internal(HIF_DEVICE_USB *hif_usb_device, static QDF_STATUS hif_send_internal(struct HIF_DEVICE_USB *hif_usb_device,
uint8_t pipe_id, uint8_t pipe_id,
qdf_nbuf_t hdr_buf, qdf_nbuf_t hdr_buf,
qdf_nbuf_t buf, unsigned int nbytes) qdf_nbuf_t buf, unsigned int nbytes)
{ {
QDF_STATUS status = QDF_STATUS_SUCCESS; QDF_STATUS status = QDF_STATUS_SUCCESS;
HIF_DEVICE_USB *device = hif_usb_device; struct HIF_DEVICE_USB *device = hif_usb_device;
HIF_USB_PIPE *pipe = &device->pipes[pipe_id]; struct HIF_USB_PIPE *pipe = &device->pipes[pipe_id];
HIF_URB_CONTEXT *urb_context; struct HIF_URB_CONTEXT *urb_context;
uint8_t *data; uint8_t *data;
uint32_t len; uint32_t len;
struct urb *urb; struct urb *urb;
@@ -285,7 +289,7 @@ QDF_STATUS hif_send_head(struct hif_opaque_softc *scn, uint8_t pipe_id,
qdf_nbuf_t wbuf, uint32_t data_attr) qdf_nbuf_t wbuf, uint32_t data_attr)
{ {
QDF_STATUS status = QDF_STATUS_SUCCESS; QDF_STATUS status = QDF_STATUS_SUCCESS;
HIF_DEVICE_USB *device = HIF_GET_USB_DEVICE(scn); struct HIF_DEVICE_USB *device = HIF_GET_USB_DEVICE(scn);
HIF_TRACE("+%s", __func__); HIF_TRACE("+%s", __func__);
status = hif_send_internal(device, pipe_id, NULL, wbuf, nbytes); status = hif_send_internal(device, pipe_id, NULL, wbuf, nbytes);
@@ -303,7 +307,7 @@ QDF_STATUS hif_send_head(struct hif_opaque_softc *scn, uint8_t pipe_id,
uint16_t hif_get_free_queue_number(struct hif_opaque_softc *scn, uint16_t hif_get_free_queue_number(struct hif_opaque_softc *scn,
uint8_t pipe_id) uint8_t pipe_id)
{ {
HIF_DEVICE_USB *device = HIF_GET_USB_DEVICE(scn); struct HIF_DEVICE_USB *device = HIF_GET_USB_DEVICE(scn);
return device->pipes[pipe_id].urb_cnt; return device->pipes[pipe_id].urb_cnt;
} }
@@ -319,7 +323,7 @@ uint16_t hif_get_free_queue_number(struct hif_opaque_softc *scn,
void hif_post_init(struct hif_opaque_softc *scn, void *target, void hif_post_init(struct hif_opaque_softc *scn, void *target,
struct hif_msg_callbacks *callbacks) struct hif_msg_callbacks *callbacks)
{ {
HIF_DEVICE_USB *device = HIF_GET_USB_DEVICE(scn); struct HIF_DEVICE_USB *device = HIF_GET_USB_DEVICE(scn);
qdf_mem_copy(&device->htc_callbacks, callbacks, qdf_mem_copy(&device->htc_callbacks, callbacks,
sizeof(device->htc_callbacks)); sizeof(device->htc_callbacks));
@@ -333,7 +337,7 @@ void hif_post_init(struct hif_opaque_softc *scn, void *target,
*/ */
void hif_detach_htc(struct hif_opaque_softc *scn) void hif_detach_htc(struct hif_opaque_softc *scn)
{ {
HIF_DEVICE_USB *device = HIF_GET_USB_DEVICE(scn); struct HIF_DEVICE_USB *device = HIF_GET_USB_DEVICE(scn);
usb_hif_flush_all(device); usb_hif_flush_all(device);
qdf_mem_zero(&device->htc_callbacks, sizeof(device->htc_callbacks)); qdf_mem_zero(&device->htc_callbacks, sizeof(device->htc_callbacks));
@@ -347,7 +351,7 @@ void hif_detach_htc(struct hif_opaque_softc *scn)
*/ */
void hif_usb_device_deinit(struct hif_usb_softc *sc) void hif_usb_device_deinit(struct hif_usb_softc *sc)
{ {
HIF_DEVICE_USB *device = &sc->hif_hdl; struct HIF_DEVICE_USB *device = &sc->hif_hdl;
HIF_TRACE("+%s", __func__); HIF_TRACE("+%s", __func__);
@@ -373,11 +377,11 @@ void hif_usb_device_deinit(struct hif_usb_softc *sc)
QDF_STATUS hif_usb_device_init(struct hif_usb_softc *sc) QDF_STATUS hif_usb_device_init(struct hif_usb_softc *sc)
{ {
int i; int i;
HIF_DEVICE_USB *device = &sc->hif_hdl; struct HIF_DEVICE_USB *device = &sc->hif_hdl;
struct usb_interface *interface = sc->interface; struct usb_interface *interface = sc->interface;
struct usb_device *dev = interface_to_usbdev(interface); struct usb_device *dev = interface_to_usbdev(interface);
QDF_STATUS status = QDF_STATUS_SUCCESS; QDF_STATUS status = QDF_STATUS_SUCCESS;
HIF_USB_PIPE *pipe; struct HIF_USB_PIPE *pipe;
HIF_TRACE("+%s", __func__); HIF_TRACE("+%s", __func__);
@@ -435,7 +439,7 @@ QDF_STATUS hif_usb_device_init(struct hif_usb_softc *sc)
*/ */
QDF_STATUS hif_start(struct hif_opaque_softc *scn) QDF_STATUS hif_start(struct hif_opaque_softc *scn)
{ {
HIF_DEVICE_USB *device = HIF_GET_USB_DEVICE(scn); struct HIF_DEVICE_USB *device = HIF_GET_USB_DEVICE(scn);
int i; int i;
HIF_TRACE("+%s", __func__); HIF_TRACE("+%s", __func__);
@@ -459,7 +463,7 @@ QDF_STATUS hif_start(struct hif_opaque_softc *scn)
*/ */
void hif_usb_stop_device(struct hif_softc *hif_sc) void hif_usb_stop_device(struct hif_softc *hif_sc)
{ {
HIF_DEVICE_USB *device = HIF_GET_USB_DEVICE(hif_sc); struct HIF_DEVICE_USB *device = HIF_GET_USB_DEVICE(hif_sc);
HIF_TRACE("+%s", __func__); HIF_TRACE("+%s", __func__);
@@ -625,13 +629,13 @@ int hif_map_service_to_pipe(struct hif_opaque_softc *scn, uint16_t svc_id,
* *
* Return: QDF_STATUS_SUCCESS if success else an appropriate QDF_STATUS error * Return: QDF_STATUS_SUCCESS if success else an appropriate QDF_STATUS error
*/ */
static QDF_STATUS hif_ctrl_msg_exchange(HIF_DEVICE_USB *macp, static QDF_STATUS hif_ctrl_msg_exchange(struct HIF_DEVICE_USB *macp,
uint8_t send_req_val, uint8_t send_req_val,
uint8_t *send_msg, uint8_t *send_msg,
uint32_t len, uint32_t len,
uint8_t response_req_val, uint8_t response_req_val,
uint8_t *response_msg, uint8_t *response_msg,
uint32_t *response_len) uint32_t *response_len)
{ {
QDF_STATUS status; QDF_STATUS status;
@@ -681,7 +685,7 @@ QDF_STATUS hif_exchange_bmi_msg(struct hif_opaque_softc *scn,
uint32_t *bmi_response_lengthp, uint32_t *bmi_response_lengthp,
uint32_t timeout_ms) uint32_t timeout_ms)
{ {
HIF_DEVICE_USB *macp = HIF_GET_USB_DEVICE(scn); struct HIF_DEVICE_USB *macp = HIF_GET_USB_DEVICE(scn);
return hif_ctrl_msg_exchange(macp, return hif_ctrl_msg_exchange(macp,
USB_CONTROL_REQ_SEND_BMI_CMD, USB_CONTROL_REQ_SEND_BMI_CMD,
@@ -702,7 +706,7 @@ QDF_STATUS hif_exchange_bmi_msg(struct hif_opaque_softc *scn,
QDF_STATUS hif_diag_read_access(struct hif_opaque_softc *scn, uint32_t address, QDF_STATUS hif_diag_read_access(struct hif_opaque_softc *scn, uint32_t address,
uint32_t *data) uint32_t *data)
{ {
HIF_DEVICE_USB *macp = HIF_GET_USB_DEVICE(scn); struct HIF_DEVICE_USB *macp = HIF_GET_USB_DEVICE(scn);
QDF_STATUS status; QDF_STATUS status;
USB_CTRL_DIAG_CMD_READ *cmd; USB_CTRL_DIAG_CMD_READ *cmd;
uint32_t respLength; uint32_t respLength;
@@ -745,7 +749,7 @@ QDF_STATUS hif_diag_write_access(struct hif_opaque_softc *scn,
uint32_t address, uint32_t address,
uint32_t data) uint32_t data)
{ {
HIF_DEVICE_USB *macp = HIF_GET_USB_DEVICE(scn); struct HIF_DEVICE_USB *macp = HIF_GET_USB_DEVICE(scn);
USB_CTRL_DIAG_CMD_WRITE *cmd; USB_CTRL_DIAG_CMD_WRITE *cmd;
cmd = (USB_CTRL_DIAG_CMD_WRITE *) macp->diag_cmd_buffer; cmd = (USB_CTRL_DIAG_CMD_WRITE *) macp->diag_cmd_buffer;
@@ -769,8 +773,8 @@ QDF_STATUS hif_diag_write_access(struct hif_opaque_softc *scn,
*/ */
void hif_dump_info(struct hif_opaque_softc *scn) void hif_dump_info(struct hif_opaque_softc *scn)
{ {
HIF_DEVICE_USB *device = HIF_GET_USB_DEVICE(scn); struct HIF_DEVICE_USB *device = HIF_GET_USB_DEVICE(scn);
HIF_USB_PIPE *pipe = NULL; struct HIF_USB_PIPE *pipe = NULL;
struct usb_host_interface *iface_desc = NULL; struct usb_host_interface *iface_desc = NULL;
struct usb_endpoint_descriptor *ep_desc; struct usb_endpoint_descriptor *ep_desc;
uint8_t i = 0; uint8_t i = 0;
@@ -918,7 +922,7 @@ void hif_suspend_wow(struct hif_opaque_softc *scn)
void hif_usb_set_bundle_mode(struct hif_softc *scn, void hif_usb_set_bundle_mode(struct hif_softc *scn,
bool enabled, int rx_bundle_cnt) bool enabled, int rx_bundle_cnt)
{ {
HIF_DEVICE_USB *device = HIF_GET_USB_DEVICE(scn); struct HIF_DEVICE_USB *device = HIF_GET_USB_DEVICE(scn);
device->is_bundle_enabled = enabled; device->is_bundle_enabled = enabled;
device->rx_bundle_cnt = rx_bundle_cnt; device->rx_bundle_cnt = rx_bundle_cnt;

View File

@@ -36,6 +36,7 @@
#include "epping_main.h" #include "epping_main.h"
#include "hif_main.h" #include "hif_main.h"
#include "qwlan_version.h" #include "qwlan_version.h"
#include "usb_api.h"
#define DELAY_FOR_TARGET_READY 200 /* 200ms */ #define DELAY_FOR_TARGET_READY 200 /* 200ms */
@@ -327,7 +328,7 @@ void hif_usb_disable_bus(struct hif_softc *hif_ctx)
int hif_usb_bus_suspend(struct hif_softc *hif_ctx) int hif_usb_bus_suspend(struct hif_softc *hif_ctx)
{ {
struct hif_usb_softc *sc = HIF_GET_USB_SOFTC(hif_ctx); struct hif_usb_softc *sc = HIF_GET_USB_SOFTC(hif_ctx);
HIF_DEVICE_USB *device = HIF_GET_USB_DEVICE(hif_ctx); struct HIF_DEVICE_USB *device = HIF_GET_USB_DEVICE(hif_ctx);
HIF_ENTER(); HIF_ENTER();
sc->suspend_state = 1; sc->suspend_state = 1;
@@ -348,7 +349,7 @@ int hif_usb_bus_suspend(struct hif_softc *hif_ctx)
int hif_usb_bus_resume(struct hif_softc *hif_ctx) int hif_usb_bus_resume(struct hif_softc *hif_ctx)
{ {
struct hif_usb_softc *sc = HIF_GET_USB_SOFTC(hif_ctx); struct hif_usb_softc *sc = HIF_GET_USB_SOFTC(hif_ctx);
HIF_DEVICE_USB *device = HIF_GET_USB_DEVICE(hif_ctx); struct HIF_DEVICE_USB *device = HIF_GET_USB_DEVICE(hif_ctx);
HIF_ENTER(); HIF_ENTER();
sc->suspend_state = 0; sc->suspend_state = 0;
@@ -723,3 +724,13 @@ int hif_check_fw_reg(struct hif_opaque_softc *scn)
} }
#endif #endif
/**
* hif_usb_needs_bmi() - return true if the soc needs bmi through the driver
* @scn: hif context
*
* Return: true if soc needs driver bmi otherwise false
*/
bool hif_usb_needs_bmi(struct hif_softc *scn)
{
return true;
}

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2013-2017 The Linux Foundation. All rights reserved. * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved.
* *
* Previously licensed under the ISC license by Qualcomm Atheros, Inc. * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
* *
@@ -108,7 +108,7 @@ struct HIF_USB_PIPE {
uint32_t flags; uint32_t flags;
uint8_t ep_address; uint8_t ep_address;
uint8_t logical_pipe_num; uint8_t logical_pipe_num;
struct _HIF_DEVICE_USB *device; struct HIF_DEVICE_USB *device;
uint16_t max_packet_size; uint16_t max_packet_size;
#ifdef HIF_USB_TASKLET #ifdef HIF_USB_TASKLET
struct tasklet_struct io_complete_tasklet; struct tasklet_struct io_complete_tasklet;
@@ -138,7 +138,7 @@ struct HIF_DEVICE_USB {
}; };
struct hif_usb_softc { struct hif_usb_softc {
struct _HIF_DEVICE_USB hif_hdl; struct HIF_DEVICE_USB hif_hdl;
/* For efficiency, should be first in struct */ /* For efficiency, should be first in struct */
struct device *dev; struct device *dev;
struct usb_dev *pdev; struct usb_dev *pdev;
@@ -159,4 +159,20 @@ struct hif_usb_softc {
/* enable FW self-recovery for Rome USB */ /* enable FW self-recovery for Rome USB */
bool enable_self_recovery; bool enable_self_recovery;
}; };
/**
* hif_dump_info() - dump info about all HIF pipes and endpoints
* @scn: pointer to hif_opaque_softc
*
* Return: none
*/
void hif_dump_info(struct hif_opaque_softc *scn);
/**
* hif_suspend_wow() - Send wow suspend command
* @scn: pointer to hif_opaque_softc
*
* Return: none
*/
void hif_suspend_wow(struct hif_opaque_softc *scn);
#endif /* __ATH_USB_H__ */ #endif /* __ATH_USB_H__ */

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2013-2017 The Linux Foundation. All rights reserved. * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved.
* *
* Previously licensed under the ISC license by Qualcomm Atheros, Inc. * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
* *
@@ -245,7 +245,7 @@ static void usb_hif_free_pipe_resources(struct HIF_USB_PIPE *pipe)
* Return: uint8_t pipe number corresponding to ep_address * Return: uint8_t pipe number corresponding to ep_address
*/ */
static uint8_t usb_hif_get_logical_pipe_num static uint8_t usb_hif_get_logical_pipe_num
(HIF_DEVICE_USB *device, (struct HIF_DEVICE_USB *device,
uint8_t ep_address, uint8_t ep_address,
int *urb_count) int *urb_count)
{ {
@@ -298,7 +298,7 @@ static uint8_t usb_hif_get_logical_pipe_num
* *
* Return: QDF_STATUS_SUCCESS if success else an appropriate QDF_STATUS error * Return: QDF_STATUS_SUCCESS if success else an appropriate QDF_STATUS error
*/ */
QDF_STATUS usb_hif_setup_pipe_resources(HIF_DEVICE_USB *device) QDF_STATUS usb_hif_setup_pipe_resources(struct HIF_DEVICE_USB *device)
{ {
struct usb_interface *interface = device->interface; struct usb_interface *interface = device->interface;
struct usb_host_interface *iface_desc = interface->cur_altsetting; struct usb_host_interface *iface_desc = interface->cur_altsetting;
@@ -409,7 +409,7 @@ QDF_STATUS usb_hif_setup_pipe_resources(HIF_DEVICE_USB *device)
* *
* Return: none * Return: none
*/ */
void usb_hif_cleanup_pipe_resources(HIF_DEVICE_USB *device) void usb_hif_cleanup_pipe_resources(struct HIF_DEVICE_USB *device)
{ {
int i; int i;
@@ -453,7 +453,7 @@ static void usb_hif_flush_pending_transfers(struct HIF_USB_PIPE *pipe)
* *
* Return: none * Return: none
*/ */
void usb_hif_flush_all(HIF_DEVICE_USB *device) void usb_hif_flush_all(struct HIF_DEVICE_USB *device)
{ {
int i; int i;
struct HIF_USB_PIPE *pipe; struct HIF_USB_PIPE *pipe;
@@ -1011,7 +1011,7 @@ static void usb_hif_post_recv_bundle_transfers(struct HIF_USB_PIPE *recv_pipe,
* *
* Return: none * Return: none
*/ */
void usb_hif_prestart_recv_pipes(HIF_DEVICE_USB *device) void usb_hif_prestart_recv_pipes(struct HIF_DEVICE_USB *device)
{ {
struct HIF_USB_PIPE *pipe = &device->pipes[HIF_RX_DATA_PIPE]; struct HIF_USB_PIPE *pipe = &device->pipes[HIF_RX_DATA_PIPE];
@@ -1032,7 +1032,7 @@ void usb_hif_prestart_recv_pipes(HIF_DEVICE_USB *device)
* *
* Return: none * Return: none
*/ */
void usb_hif_start_recv_pipes(HIF_DEVICE_USB *device) void usb_hif_start_recv_pipes(struct HIF_DEVICE_USB *device)
{ {
struct HIF_USB_PIPE *pipe; struct HIF_USB_PIPE *pipe;
uint32_t buf_len; uint32_t buf_len;
@@ -1076,12 +1076,9 @@ void usb_hif_start_recv_pipes(HIF_DEVICE_USB *device)
* *
* Return: QDF_STATUS_SUCCESS if success else an appropriate QDF_STATUS error * Return: QDF_STATUS_SUCCESS if success else an appropriate QDF_STATUS error
*/ */
QDF_STATUS usb_hif_submit_ctrl_out(HIF_DEVICE_USB *device, QDF_STATUS usb_hif_submit_ctrl_out(struct HIF_DEVICE_USB *device,
uint8_t req, uint8_t req, uint16_t value, uint16_t index,
uint16_t value, void *data, uint32_t size)
uint16_t index,
void *data,
uint32_t size)
{ {
int32_t result = 0; int32_t result = 0;
QDF_STATUS ret = QDF_STATUS_SUCCESS; QDF_STATUS ret = QDF_STATUS_SUCCESS;
@@ -1132,12 +1129,9 @@ QDF_STATUS usb_hif_submit_ctrl_out(HIF_DEVICE_USB *device,
* *
* Return: QDF_STATUS_SUCCESS if success else an appropriate QDF_STATUS error * Return: QDF_STATUS_SUCCESS if success else an appropriate QDF_STATUS error
*/ */
QDF_STATUS usb_hif_submit_ctrl_in(HIF_DEVICE_USB *device, QDF_STATUS usb_hif_submit_ctrl_in(struct HIF_DEVICE_USB *device,
uint8_t req, uint8_t req, uint16_t value, uint16_t index,
uint16_t value, void *data, uint32_t size)
uint16_t index,
void *data,
uint32_t size)
{ {
int32_t result = 0; int32_t result = 0;
QDF_STATUS ret = QDF_STATUS_SUCCESS; QDF_STATUS ret = QDF_STATUS_SUCCESS;
@@ -1185,10 +1179,10 @@ QDF_STATUS usb_hif_submit_ctrl_in(HIF_DEVICE_USB *device,
* *
* Return: none * Return: none
*/ */
void usb_hif_io_complete(struct HIF_USB_PIPE *pipe) static void usb_hif_io_complete(struct HIF_USB_PIPE *pipe)
{ {
qdf_nbuf_t buf; qdf_nbuf_t buf;
HIF_DEVICE_USB *device; struct HIF_DEVICE_USB *device;
HTC_FRAME_HDR *HtcHdr; HTC_FRAME_HDR *HtcHdr;
uint8_t *data; uint8_t *data;
uint32_t len; uint32_t len;

View File

@@ -1633,7 +1633,7 @@ QDF_STATUS htc_send_data_pkt(HTC_HANDLE HTCHandle, HTC_PACKET *pPacket,
QDF_NBUF_UPDATE_TX_PKT_COUNT(netbuf, QDF_NBUF_TX_PKT_HTC); QDF_NBUF_UPDATE_TX_PKT_COUNT(netbuf, QDF_NBUF_TX_PKT_HTC);
DPTRACE(qdf_dp_trace(netbuf, QDF_DP_TRACE_HTC_PACKET_PTR_RECORD, DPTRACE(qdf_dp_trace(netbuf, QDF_DP_TRACE_HTC_PACKET_PTR_RECORD,
qdf_nbuf_data_addr(netbuf), QDF_TRACE_DEFAULT_PDEV_ID, qdf_nbuf_data_addr(netbuf),
sizeof(qdf_nbuf_data(netbuf)), QDF_TX)); sizeof(qdf_nbuf_data(netbuf)), QDF_TX));
} else { } else {
LOCK_HTC_TX(target); LOCK_HTC_TX(target);