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

Commit 85edf1b9 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "cnss2: Add support for USB transport"

parents 2a72f7f7 616ea9d0
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ 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-y += qmi.o
cnss2-y += 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)
{
@@ -36,12 +37,33 @@ enum cnss_dev_bus_type cnss_get_bus_type(unsigned long device_id)
	case QCA6290_DEVICE_ID:
	case QCN7605_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)
@@ -69,6 +91,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;
	}
@@ -82,6 +106,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);
@@ -97,6 +123,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);
@@ -212,6 +240,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);
@@ -227,6 +257,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);
@@ -242,6 +274,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);
@@ -257,6 +291,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);
@@ -302,6 +338,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);
@@ -317,6 +355,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);
+9 −0
Original line number Diff line number Diff line
@@ -27,6 +27,13 @@
#define QCN7605_VENDOR_ID		0x17CB
#define QCN7605_DEVICE_ID		0x1102

#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);
@@ -50,4 +57,6 @@ int cnss_bus_unregister_driver_hdlr(struct cnss_plat_data *plat_priv);
int cnss_bus_call_driver_modem_status(struct cnss_plat_data *plat_priv,
				      int modem_current_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 */
+51 −2
Original line number Diff line number Diff line
@@ -559,6 +559,15 @@ out:
	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) {
@@ -576,6 +585,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:
@@ -1127,6 +1140,30 @@ int cnss_force_fw_assert(struct device *dev)
}
EXPORT_SYMBOL(cnss_force_fw_assert);

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;
@@ -1146,9 +1183,9 @@ static int cnss_cold_boot_cal_done_hdlr(struct cnss_plat_data *plat_priv)
	if (plat_priv->device_id == QCN7605_DEVICE_ID)
		goto skip_shutdown;
	cnss_bus_dev_shutdown(plat_priv);

skip_shutdown:
	clear_bit(CNSS_COLD_BOOT_CAL, &plat_priv->driver_state);

	return 0;
}

@@ -1194,7 +1231,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);
@@ -1214,6 +1251,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;
@@ -1278,6 +1318,8 @@ int cnss_register_subsys(struct cnss_plat_data *plat_priv)
		subsys_info->subsys_desc.name = "QCA6290";
		break;
	case QCN7605_DEVICE_ID:
	case QCN7605_STANDALONE_DEVICE_ID:
	case QCN7605_COMPOSITE_DEVICE_ID:
		subsys_info->subsys_desc.name = "QCN7605";
		break;
	default:
@@ -1498,6 +1540,10 @@ int cnss_register_ramdump(struct cnss_plat_data *plat_priv)
	case QCN7605_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;
@@ -1516,6 +1562,9 @@ void cnss_unregister_ramdump(struct cnss_plat_data *plat_priv)
	case QCA6290_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;
+4 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@
enum cnss_dev_bus_type {
	CNSS_BUS_NONE = -1,
	CNSS_BUS_PCI,
	CNSS_BUS_USB,
};

struct cnss_vreg_info {
@@ -124,6 +125,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,
};

@@ -245,4 +248,5 @@ 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