Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ff080603 authored by Rajasekaran Kalidoss's avatar Rajasekaran Kalidoss Committed by Gerrit - the friendly Code Review server
Browse files

cnss2: Add support for USB transport



Changes in state machine and boot flow to support usb bus
based behaviour. Handler functions added to support USB
boot flow.

Change-Id: I51c4751c8d8669a8b54ae692ae3ec1bb32d1e7be
Signed-off-by: default avatarRajasekaran Kalidoss <rkalidos@codeaurora.org>
parent 6df1ece2
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -4,5 +4,6 @@ cnss2-y := main.o
cnss2-y += bus.o
cnss2-y += debug.o
cnss2-y += pci.o
cnss2-y += usb.o
cnss2-y += power.o
cnss2-$(CONFIG_CNSS2_QMI) += qmi.o wlan_firmware_service_v01.o
+40 −0
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@
#include "bus.h"
#include "debug.h"
#include "pci.h"
#include "usb.h"

enum cnss_dev_bus_type cnss_get_dev_bus_type(struct device *dev)
{
@@ -35,12 +36,33 @@ enum cnss_dev_bus_type cnss_get_bus_type(unsigned long device_id)
	case QCA6290_EMULATION_DEVICE_ID:
	case QCA6290_DEVICE_ID:
		return CNSS_BUS_PCI;
	case QCN7605_COMPOSITE_DEVICE_ID:
	case QCN7605_STANDALONE_DEVICE_ID:
		return CNSS_BUS_USB;
	default:
		cnss_pr_err("Unknown device_id: 0x%lx\n", device_id);
		return CNSS_BUS_NONE;
	}
}

bool cnss_bus_req_mem_ind_valid(struct cnss_plat_data *plat_priv)
{
	if (cnss_get_bus_type(plat_priv->device_id) == CNSS_BUS_USB)
		return false;
	else
		return true;
}

bool cnss_bus_dev_cal_rep_valid(struct cnss_plat_data *plat_priv)
{
	bool ret = false;

	if (cnss_get_bus_type(plat_priv->device_id) == CNSS_BUS_USB)
		ret = true;

	return ret;
}

void *cnss_bus_dev_to_bus_priv(struct device *dev)
{
	if (!dev)
@@ -68,6 +90,8 @@ struct cnss_plat_data *cnss_bus_dev_to_plat_priv(struct device *dev)
	switch (cnss_get_dev_bus_type(dev)) {
	case CNSS_BUS_PCI:
		return cnss_pci_priv_to_plat_priv(bus_priv);
	case CNSS_BUS_USB:
		return cnss_usb_priv_to_plat_priv(bus_priv);
	default:
		return NULL;
	}
@@ -81,6 +105,8 @@ int cnss_bus_init(struct cnss_plat_data *plat_priv)
	switch (plat_priv->bus_type) {
	case CNSS_BUS_PCI:
		return cnss_pci_init(plat_priv);
	case CNSS_BUS_USB:
		return cnss_usb_init(plat_priv);
	default:
		cnss_pr_err("Unsupported bus type: %d\n",
			    plat_priv->bus_type);
@@ -96,6 +122,8 @@ void cnss_bus_deinit(struct cnss_plat_data *plat_priv)
	switch (plat_priv->bus_type) {
	case CNSS_BUS_PCI:
		cnss_pci_deinit(plat_priv);
	case CNSS_BUS_USB:
		cnss_usb_deinit(plat_priv);
	default:
		cnss_pr_err("Unsupported bus type: %d\n",
			    plat_priv->bus_type);
@@ -204,6 +232,8 @@ int cnss_bus_call_driver_probe(struct cnss_plat_data *plat_priv)
	switch (plat_priv->bus_type) {
	case CNSS_BUS_PCI:
		return cnss_pci_call_driver_probe(plat_priv->bus_priv);
	case CNSS_BUS_USB:
		return cnss_usb_call_driver_probe(plat_priv->bus_priv);
	default:
		cnss_pr_err("Unsupported bus type: %d\n",
			    plat_priv->bus_type);
@@ -219,6 +249,8 @@ int cnss_bus_call_driver_remove(struct cnss_plat_data *plat_priv)
	switch (plat_priv->bus_type) {
	case CNSS_BUS_PCI:
		return cnss_pci_call_driver_remove(plat_priv->bus_priv);
	case CNSS_BUS_USB:
		return cnss_usb_call_driver_remove(plat_priv->bus_priv);
	default:
		cnss_pr_err("Unsupported bus type: %d\n",
			    plat_priv->bus_type);
@@ -234,6 +266,8 @@ int cnss_bus_dev_powerup(struct cnss_plat_data *plat_priv)
	switch (plat_priv->bus_type) {
	case CNSS_BUS_PCI:
		return cnss_pci_dev_powerup(plat_priv->bus_priv);
	case CNSS_BUS_USB:
		return 0;
	default:
		cnss_pr_err("Unsupported bus type: %d\n",
			    plat_priv->bus_type);
@@ -249,6 +283,8 @@ int cnss_bus_dev_shutdown(struct cnss_plat_data *plat_priv)
	switch (plat_priv->bus_type) {
	case CNSS_BUS_PCI:
		return cnss_pci_dev_shutdown(plat_priv->bus_priv);
	case CNSS_BUS_USB:
		return 0;
	default:
		cnss_pr_err("Unsupported bus type: %d\n",
			    plat_priv->bus_type);
@@ -294,6 +330,8 @@ int cnss_bus_register_driver_hdlr(struct cnss_plat_data *plat_priv, void *data)
	switch (plat_priv->bus_type) {
	case CNSS_BUS_PCI:
		return cnss_pci_register_driver_hdlr(plat_priv->bus_priv, data);
	case CNSS_BUS_USB:
		return cnss_usb_register_driver_hdlr(plat_priv->bus_priv, data);
	default:
		cnss_pr_err("Unsupported bus type: %d\n",
			    plat_priv->bus_type);
@@ -309,6 +347,8 @@ int cnss_bus_unregister_driver_hdlr(struct cnss_plat_data *plat_priv)
	switch (plat_priv->bus_type) {
	case CNSS_BUS_PCI:
		return cnss_pci_unregister_driver_hdlr(plat_priv->bus_priv);
	case CNSS_BUS_USB:
		return cnss_usb_unregister_driver_hdlr(plat_priv->bus_priv);
	default:
		cnss_pr_err("Unsupported bus type: %d\n",
			    plat_priv->bus_type);
+10 −0
Original line number Diff line number Diff line
@@ -28,6 +28,13 @@
#define QCA6390_EMULATION_DEVICE_ID	0x0108
#define QCA6390_DEVICE_ID		0x1101

#define QCN7605_USB_VENDOR_ID             0x05C6
#define QCN7605_COMPOSITE_DEVICE_ID     QCN7605_COMPOSITE_PRODUCT_ID
#define QCN7605_STANDALONE_DEVICE_ID    QCN7605_STANDALONE_PRODUCT_ID

#define QCN7605_STANDALONE_PRODUCT_ID    0x9900
#define QCN7605_COMPOSITE_PRODUCT_ID     0x9901

enum cnss_dev_bus_type cnss_get_dev_bus_type(struct device *dev);
enum cnss_dev_bus_type cnss_get_bus_type(unsigned long device_id);
void *cnss_bus_dev_to_bus_priv(struct device *dev);
@@ -53,5 +60,8 @@ int cnss_bus_call_driver_modem_status(struct cnss_plat_data *plat_priv,
				      int modem_current_status);
int cnss_bus_update_status(struct cnss_plat_data *plat_priv,
			   enum cnss_driver_status status);
int cnss_bus_recovery_update_status(struct cnss_plat_data *plat_priv);
bool cnss_bus_req_mem_ind_valid(struct cnss_plat_data *plat_priv);
bool cnss_bus_dev_cal_rep_valid(struct cnss_plat_data *plat_priv);

#endif /* _CNSS_BUS_H */
+48 −1
Original line number Diff line number Diff line
@@ -463,6 +463,15 @@ static int cnss_fw_ready_hdlr(struct cnss_plat_data *plat_priv)
	return ret;
}

static int cnss_cal_update_hdlr(struct cnss_plat_data *plat_priv)
{
	/* QCN7605 store the cal data sent by FW to calDB memory area
	 * get out of this after complete data is uploaded. FW is expected
	 * to send cal done
	 */
	return 0;
}

static char *cnss_driver_event_to_str(enum cnss_driver_event_type type)
{
	switch (type) {
@@ -480,6 +489,10 @@ static char *cnss_driver_event_to_str(enum cnss_driver_event_type type)
		return "COLD_BOOT_CAL_START";
	case CNSS_DRIVER_EVENT_COLD_BOOT_CAL_DONE:
		return "COLD_BOOT_CAL_DONE";
	case CNSS_DRIVER_EVENT_CAL_UPDATE:
		return "COLD_BOOT_CAL_DATA_UPDATE";
	case CNSS_DRIVER_EVENT_CAL_DOWNLOAD:
		return "COLD_BOOT_CAL_DATA_DOWNLOAD";
	case CNSS_DRIVER_EVENT_REGISTER_DRIVER:
		return "REGISTER_DRIVER";
	case CNSS_DRIVER_EVENT_UNREGISTER_DRIVER:
@@ -1072,6 +1085,30 @@ int cnss_force_collect_rddm(struct device *dev)
}
EXPORT_SYMBOL(cnss_force_collect_rddm);

static int cnss_wlfw_server_arrive_hdlr(struct cnss_plat_data *plat_priv)
{
	int ret;

	ret = cnss_wlfw_server_arrive(plat_priv);
	if (ret)
		goto out;

	if (!cnss_bus_req_mem_ind_valid(plat_priv)) {
		ret = cnss_wlfw_tgt_cap_send_sync(plat_priv);
		if (ret)
			goto out;

		ret = cnss_wlfw_bdf_dnld_send_sync(plat_priv);
		if (ret)
			goto out;
		/*cnss driver sends  meta data report and waits for FW_READY*/
		if (cnss_bus_dev_cal_rep_valid(plat_priv))
			ret = cnss_wlfw_cal_report_send_sync(plat_priv);
	}
out:
	return ret;
}

static int cnss_cold_boot_cal_start_hdlr(struct cnss_plat_data *plat_priv)
{
	int ret = 0;
@@ -1151,7 +1188,7 @@ static void cnss_driver_event_work(struct work_struct *work)

		switch (event->type) {
		case CNSS_DRIVER_EVENT_SERVER_ARRIVE:
			ret = cnss_wlfw_server_arrive(plat_priv);
			ret = cnss_wlfw_server_arrive_hdlr(plat_priv);
			break;
		case CNSS_DRIVER_EVENT_SERVER_EXIT:
			ret = cnss_wlfw_server_exit(plat_priv);
@@ -1171,6 +1208,9 @@ static void cnss_driver_event_work(struct work_struct *work)
		case CNSS_DRIVER_EVENT_COLD_BOOT_CAL_START:
			ret = cnss_cold_boot_cal_start_hdlr(plat_priv);
			break;
		case CNSS_DRIVER_EVENT_CAL_UPDATE:
			ret = cnss_cal_update_hdlr(plat_priv);
			break;
		case CNSS_DRIVER_EVENT_COLD_BOOT_CAL_DONE:
			ret = cnss_cold_boot_cal_done_hdlr(plat_priv);
			break;
@@ -1440,6 +1480,10 @@ int cnss_register_ramdump(struct cnss_plat_data *plat_priv)
	case QCA6390_DEVICE_ID:
		ret = cnss_register_ramdump_v2(plat_priv);
		break;
	case QCN7605_COMPOSITE_DEVICE_ID:
	case QCN7605_STANDALONE_DEVICE_ID:
		break;

	default:
		cnss_pr_err("Unknown device ID: 0x%lx\n", plat_priv->device_id);
		ret = -ENODEV;
@@ -1460,6 +1504,9 @@ void cnss_unregister_ramdump(struct cnss_plat_data *plat_priv)
	case QCA6390_DEVICE_ID:
		cnss_unregister_ramdump_v2(plat_priv);
		break;
	case QCN7605_COMPOSITE_DEVICE_ID:
	case QCN7605_STANDALONE_DEVICE_ID:
		break;
	default:
		cnss_pr_err("Unknown device ID: 0x%lx\n", plat_priv->device_id);
		break;
+6 −1
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@
enum cnss_dev_bus_type {
	CNSS_BUS_NONE = -1,
	CNSS_BUS_PCI,
	CNSS_BUS_USB,
};

struct cnss_vreg_info {
@@ -160,6 +161,8 @@ enum cnss_driver_event_type {
	CNSS_DRIVER_EVENT_FORCE_FW_ASSERT,
	CNSS_DRIVER_EVENT_POWER_UP,
	CNSS_DRIVER_EVENT_POWER_DOWN,
	CNSS_DRIVER_EVENT_CAL_UPDATE,
	CNSS_DRIVER_EVENT_CAL_DOWNLOAD,
	CNSS_DRIVER_EVENT_MAX,
};

@@ -270,5 +273,7 @@ void cnss_unregister_subsys(struct cnss_plat_data *plat_priv);
int cnss_register_ramdump(struct cnss_plat_data *plat_priv);
void cnss_unregister_ramdump(struct cnss_plat_data *plat_priv);
void cnss_set_pin_connect_status(struct cnss_plat_data *plat_priv);

u32 cnss_get_wake_msi(struct cnss_plat_data *plat_priv);
bool *cnss_get_qmi_bypass(void);
bool is_qcn7605_device(u16 device_id);
#endif /* _CNSS_MAIN_H */
Loading