qcacmn: qcn7605: Add support for HIF_RX_CTRL_PIPE

For QCN7605-USB, WMI_CTRL_SERVICE will use an exclusive
IN USB endpoint.

Change-Id: Ia943c9c3741e91f4b13a85719eee770c08ce8379
CRs-Fixed: 2266915
This commit is contained in:
Ajit Pal Singh 2018-06-13 12:25:16 +05:30 • committed by nshrivas
commit cd4a1c4308
5 changed files with 52 additions and 3 deletions

View file

@ -61,6 +61,10 @@ extern "C" {
#ifndef TARGET_TYPE_QCA6290
#define TARGET_TYPE_QCA6290 21
#endif
#ifndef TARGET_TYPE_QCN7605
#define TARGET_TYPE_QCN7605 22
#endif
#ifdef __cplusplus
}

View file

@ -46,4 +46,5 @@ 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);
bool hif_is_supported_rx_ctrl_pipe(struct hif_softc *scn);
#endif /*_USB_API_H_*/

View file

@ -33,6 +33,7 @@
#include "hif_usb_internal.h"
#include "if_usb.h"
#include "usb_api.h"
#include "target_type.h"
#if defined(WLAN_DEBUG) || defined(DEBUG)
static ATH_DEBUG_MASK_DESCRIPTION g_hif_debug_description[] = {
@ -416,6 +417,9 @@ QDF_STATUS hif_usb_device_init(struct hif_usb_softc *sc)
} while (false);
if (hif_is_supported_rx_ctrl_pipe(HIF_GET_SOFTC(sc)))
device->rx_ctrl_pipe_supported = 1;
if (status != QDF_STATUS_SUCCESS)
HIF_ERROR("%s: abnormal condition", __func__);
@ -551,12 +555,16 @@ int hif_map_service_to_pipe(struct hif_opaque_softc *scn, uint16_t svc_id,
int *ul_is_polled, int *dl_is_polled)
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
struct HIF_DEVICE_USB *device = HIF_GET_USB_DEVICE(scn);
switch (svc_id) {
case HTC_CTRL_RSVD_SVC:
case WMI_CONTROL_SVC:
*ul_pipe = HIF_TX_CTRL_PIPE;
*dl_pipe = HIF_RX_DATA_PIPE;
if (device->rx_ctrl_pipe_supported)
*dl_pipe = HIF_RX_CTRL_PIPE;
else
*dl_pipe = HIF_RX_DATA_PIPE;
break;
case WMI_DATA_BE_SVC:
case WMI_DATA_BK_SVC:
@ -927,3 +935,23 @@ void hif_usb_set_bundle_mode(struct hif_softc *scn,
HIF_DBG("athusb bundle %s cnt %d", enabled ? "enabled" : "disabled",
rx_bundle_cnt);
}
/**
* hif_is_supported_rx_ctrl_pipe() - return true if device supports exclusive
* control pipe in the RX direction.
* @scn: hif context
*
* Return: true if device supports RX control pipe.
*/
bool hif_is_supported_rx_ctrl_pipe(struct hif_softc *scn)
{
struct hif_opaque_softc *hif_hdl = GET_HIF_OPAQUE_HDL(scn);
struct hif_target_info *tgt_info = hif_get_target_info_handle(hif_hdl);
switch (tgt_info->target_type) {
case TARGET_TYPE_QCN7605:
return true;
default:
return false;
}
}

View file

@ -127,6 +127,7 @@ struct HIF_DEVICE_USB {
A_BOOL is_bundle_enabled;
uint16_t rx_bundle_cnt;
uint32_t rx_bundle_buf_len;
bool rx_ctrl_pipe_supported;
};
struct hif_usb_softc {

View file

@ -1004,15 +1004,22 @@ static void usb_hif_post_recv_bundle_transfers(struct HIF_USB_PIPE *recv_pipe,
*/
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;
int prestart_cnt = 8;
if (device->rx_ctrl_pipe_supported) {
pipe = &device->pipes[HIF_RX_CTRL_PIPE];
prestart_cnt = 4;
usb_hif_post_recv_prestart_transfers(pipe, prestart_cnt);
}
/*
* USB driver learn to support bundle or not until the firmware
* download and ready. Only allocate some URBs for control message
* communication during the initial phase then start the final
* working pipe after all information understood.
*/
usb_hif_post_recv_prestart_transfers(pipe, 8);
pipe = &device->pipes[HIF_RX_DATA_PIPE];
usb_hif_post_recv_prestart_transfers(pipe, prestart_cnt);
}
/**
@ -1053,6 +1060,14 @@ void usb_hif_start_recv_pipes(struct HIF_DEVICE_USB *device)
usb_hif_post_recv_transfers(pipe, HIF_USB_RX_BUFFER_SIZE);
}
if (device->rx_ctrl_pipe_supported) {
HIF_TRACE("Post URBs to RX_CONTROL_PIPE: %d",
device->pipes[HIF_RX_CTRL_PIPE].urb_cnt);
pipe = &device->pipes[HIF_RX_CTRL_PIPE];
pipe->urb_cnt_thresh = pipe->urb_alloc / 2;
usb_hif_post_recv_transfers(pipe, HIF_USB_RX_BUFFER_SIZE);
}
HIF_EXIT();
}