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

Commit 6ebd697d authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "cnss2: Add support for USB transport"

parents 398975a3 14cf5fb8
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-$(CONFIG_CNSS2_DEBUG) += genl.o
cnss2-$(CONFIG_CNSS2_QMI) += qmi.o wlan_firmware_service_v01.o
+31 −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)
{
@@ -53,6 +54,10 @@ enum cnss_dev_bus_type cnss_get_bus_type(struct cnss_plat_data *plat_priv)
	case QCA6390_DEVICE_ID:
		bus_type = CNSS_BUS_PCI;
		break;
	case QCN7605_COMPOSITE_DEVICE_ID:
	case QCN7605_STANDALONE_DEVICE_ID:
		bus_type = CNSS_BUS_USB;
		break;
	default:
		cnss_pr_err("Unknown device: 0x%lx\n", plat_priv->device_id);
		break;
@@ -61,6 +66,14 @@ enum cnss_dev_bus_type cnss_get_bus_type(struct cnss_plat_data *plat_priv)
	return bus_type;
}

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

void *cnss_bus_dev_to_bus_priv(struct device *dev)
{
	if (!dev)
@@ -88,6 +101,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;
	}
@@ -101,6 +116,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);
@@ -116,6 +133,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);
@@ -255,6 +274,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);
@@ -270,6 +291,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);
@@ -285,6 +308,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);
@@ -300,6 +325,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);
@@ -345,6 +372,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);
@@ -360,6 +389,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 −1
Original line number Diff line number Diff line
@@ -24,6 +24,15 @@
#define QCA6290_DEVICE_ID		0x1100
#define QCA6390_VENDOR_ID		0x17CB
#define QCA6390_DEVICE_ID		0x1101
#define QCN7605_VENDOR_ID               0x17CB
#define QCN7605_DEVICE_ID               0x1102

#define QCN7605_USB_VENDOR_ID             0x05C6
#define QCN7605_STANDALONE_PRODUCT_ID    0x9900
#define QCN7605_COMPOSITE_PRODUCT_ID     0x9901

#define QCN7605_COMPOSITE_DEVICE_ID     QCN7605_COMPOSITE_PRODUCT_ID
#define QCN7605_STANDALONE_DEVICE_ID    QCN7605_STANDALONE_PRODUCT_ID

enum cnss_dev_bus_type cnss_get_dev_bus_type(struct device *dev);
enum cnss_dev_bus_type cnss_get_bus_type(struct cnss_plat_data *plat_priv);
@@ -52,5 +61,5 @@ 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);

bool cnss_bus_req_mem_ind_valid(struct cnss_plat_data *plat_priv);
#endif /* _CNSS_BUS_H */
+51 −1
Original line number Diff line number Diff line
@@ -431,6 +431,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) {
@@ -448,6 +457,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:
@@ -1031,6 +1044,27 @@ 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,
					void *data)
{
	int ret;
	unsigned int bdf_type;

	ret = cnss_wlfw_server_arrive(plat_priv, data);
	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;
		bdf_type = plat_priv->ctrl_params.bdf_type;
		ret = cnss_wlfw_bdf_dnld_send_sync(plat_priv, bdf_type);
	}
out:
	return ret;
}

int cnss_force_collect_rddm(struct device *dev)
{
	struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(dev);
@@ -1101,7 +1135,13 @@ static int cnss_cold_boot_cal_done_hdlr(struct cnss_plat_data *plat_priv)

	plat_priv->cal_done = true;
	cnss_wlfw_wlan_mode_send_sync(plat_priv, CNSS_OFF);
	if (plat_priv->device_id == QCN7605_DEVICE_ID ||
	    plat_priv->device_id == QCN7605_STANDALONE_DEVICE_ID ||
	    plat_priv->device_id == QCN7605_COMPOSITE_DEVICE_ID)
		goto skip_shutdown;
	cnss_bus_dev_shutdown(plat_priv);

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

@@ -1253,7 +1293,8 @@ 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, event->data);
			ret = cnss_wlfw_server_arrive_hdlr(plat_priv,
							   event->data);
			break;
		case CNSS_DRIVER_EVENT_SERVER_EXIT:
			ret = cnss_wlfw_server_exit(plat_priv);
@@ -1273,6 +1314,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;
@@ -1553,6 +1597,9 @@ 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;
@@ -1571,6 +1618,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;
+3 −0
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@
enum cnss_dev_bus_type {
	CNSS_BUS_NONE = -1,
	CNSS_BUS_PCI,
	CNSS_BUS_USB,
};

struct cnss_vreg_cfg {
@@ -173,6 +174,8 @@ enum cnss_driver_event_type {
	CNSS_DRIVER_EVENT_QDSS_TRACE_REQ_MEM,
	CNSS_DRIVER_EVENT_QDSS_TRACE_SAVE,
	CNSS_DRIVER_EVENT_QDSS_TRACE_FREE,
	CNSS_DRIVER_EVENT_CAL_UPDATE,
	CNSS_DRIVER_EVENT_CAL_DOWNLOAD,
	CNSS_DRIVER_EVENT_MAX,
};

Loading