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

Commit a05f99db authored by Vasundhara Volam's avatar Vasundhara Volam Committed by David S. Miller
Browse files

be2net: Use GET_PROFILE_CONFIG V1 cmd for BE3-R



Use GET_PROFILE_CONFIG_V1 cmd for BE3-R, to query the maximum number of
TX rings available per function. On SH-R the same is queried via the
GET_FUNCTION_CONFIG cmd.

Signed-off-by: default avatarVasundhara Volam <vasundhara.volam@emulex.com>
Signed-off-by: default avatarSathya Perla <sathya.perla@emulex.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0ad3157e
Loading
Loading
Loading
Loading
+74 −21
Original line number Diff line number Diff line
@@ -2946,7 +2946,8 @@ static struct be_nic_resource_desc *be_get_nic_desc(u8 *buf, u32 desc_count,
			break;
		}

		if (desc->desc_type == NIC_RESOURCE_DESC_TYPE_ID)
		if (desc->desc_type == NIC_RESOURCE_DESC_TYPE_V0 ||
		    desc->desc_type == NIC_RESOURCE_DESC_TYPE_V1)
			break;

		desc = (void *)desc + desc->desc_len;
@@ -3020,24 +3021,42 @@ int be_cmd_get_func_config(struct be_adapter *adapter)
	return status;
}

 /* Uses sync mcc */
int be_cmd_get_profile_config(struct be_adapter *adapter, u32 *cap_flags,
			      u8 domain)
/* Uses mbox */
int be_cmd_get_profile_config_mbox(struct be_adapter *adapter,
				   u8 domain, struct be_dma_mem *cmd)
{
	struct be_mcc_wrb *wrb;
	struct be_cmd_req_get_profile_config *req;
	int status;
	struct be_dma_mem cmd;

	memset(&cmd, 0, sizeof(struct be_dma_mem));
	cmd.size = sizeof(struct be_cmd_resp_get_profile_config);
	cmd.va = pci_alloc_consistent(adapter->pdev, cmd.size,
				      &cmd.dma);
	if (!cmd.va) {
		dev_err(&adapter->pdev->dev, "Memory alloc failure\n");
		return -ENOMEM;
	if (mutex_lock_interruptible(&adapter->mbox_lock))
		return -1;
	wrb = wrb_from_mbox(adapter);

	req = cmd->va;
	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
			       OPCODE_COMMON_GET_PROFILE_CONFIG,
			       cmd->size, wrb, cmd);

	req->type = ACTIVE_PROFILE_TYPE;
	req->hdr.domain = domain;
	if (!lancer_chip(adapter))
		req->hdr.version = 1;

	status = be_mbox_notify_wait(adapter);

	mutex_unlock(&adapter->mbox_lock);
	return status;
}

/* Uses sync mcc */
int be_cmd_get_profile_config_mccq(struct be_adapter *adapter,
				   u8 domain, struct be_dma_mem *cmd)
{
	struct be_mcc_wrb *wrb;
	struct be_cmd_req_get_profile_config *req;
	int status;

	spin_lock_bh(&adapter->mcc_lock);

	wrb = wrb_from_mccq(adapter);
@@ -3046,16 +3065,47 @@ int be_cmd_get_profile_config(struct be_adapter *adapter, u32 *cap_flags,
		goto err;
	}

	req = cmd.va;

	req = cmd->va;
	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
			       OPCODE_COMMON_GET_PROFILE_CONFIG,
			       cmd.size, wrb, &cmd);
			       cmd->size, wrb, cmd);

	req->type = ACTIVE_PROFILE_TYPE;
	req->hdr.domain = domain;
	if (!lancer_chip(adapter))
		req->hdr.version = 1;

	status = be_mcc_notify_wait(adapter);

err:
	spin_unlock_bh(&adapter->mcc_lock);
	return status;
}

/* Uses sync mcc, if MCCQ is already created otherwise mbox */
int be_cmd_get_profile_config(struct be_adapter *adapter, u32 *cap_flags,
			      u16 *txq_count, u8 domain)
{
	struct be_queue_info *mccq = &adapter->mcc_obj.q;
	struct be_dma_mem cmd;
	int status;

	memset(&cmd, 0, sizeof(struct be_dma_mem));
	if (!lancer_chip(adapter))
		cmd.size = sizeof(struct be_cmd_resp_get_profile_config_v1);
	else
		cmd.size = sizeof(struct be_cmd_resp_get_profile_config);
	cmd.va = pci_alloc_consistent(adapter->pdev, cmd.size,
				      &cmd.dma);
	if (!cmd.va) {
		dev_err(&adapter->pdev->dev, "Memory alloc failure\n");
		return -ENOMEM;
	}

	if (!mccq->created)
		status = be_cmd_get_profile_config_mbox(adapter, domain, &cmd);
	else
		status = be_cmd_get_profile_config_mccq(adapter, domain, &cmd);
	if (!status) {
		struct be_cmd_resp_get_profile_config *resp = cmd.va;
		u32 desc_count = le32_to_cpu(resp->desc_count);
@@ -3068,10 +3118,13 @@ int be_cmd_get_profile_config(struct be_adapter *adapter, u32 *cap_flags,
			status = -EINVAL;
			goto err;
		}
		if (cap_flags)
			*cap_flags = le32_to_cpu(desc->cap_flags);
		if (txq_count)
			*txq_count = le32_to_cpu(desc->txq_count);
	}
err:
	spin_unlock_bh(&adapter->mcc_lock);
	if (cmd.va)
		pci_free_consistent(adapter->pdev, cmd.size,
				    cmd.va, cmd.dma);
	return status;
@@ -3102,7 +3155,7 @@ int be_cmd_set_profile_config(struct be_adapter *adapter, u32 bps,
	req->hdr.domain = domain;
	req->desc_count = cpu_to_le32(1);

	req->nic_desc.desc_type = NIC_RESOURCE_DESC_TYPE_ID;
	req->nic_desc.desc_type = NIC_RESOURCE_DESC_TYPE_V0;
	req->nic_desc.desc_len = RESOURCE_DESC_SIZE;
	req->nic_desc.flags = (1 << QUN) | (1 << IMM) | (1 << NOSV);
	req->nic_desc.pf_num = adapter->pf_number;
+11 −3
Original line number Diff line number Diff line
@@ -1687,9 +1687,11 @@ struct be_cmd_req_set_ext_fat_caps {
	struct be_fat_conf_params set_params;
};

#define RESOURCE_DESC_SIZE			72
#define NIC_RESOURCE_DESC_TYPE_ID		0x41
#define RESOURCE_DESC_SIZE			88
#define NIC_RESOURCE_DESC_TYPE_V0		0x41
#define NIC_RESOURCE_DESC_TYPE_V1		0x51
#define MAX_RESOURCE_DESC			4
#define MAX_RESOURCE_DESC_V1			32

/* QOS unit number */
#define QUN					4
@@ -1755,6 +1757,12 @@ struct be_cmd_resp_get_profile_config {
	u8 func_param[MAX_RESOURCE_DESC * RESOURCE_DESC_SIZE];
};

struct be_cmd_resp_get_profile_config_v1 {
	struct be_cmd_req_hdr hdr;
	u32 desc_count;
	u8 func_param[MAX_RESOURCE_DESC_V1 * RESOURCE_DESC_SIZE];
};

struct be_cmd_req_set_profile_config {
	struct be_cmd_req_hdr hdr;
	u32 rsvd;
@@ -1917,7 +1925,7 @@ extern int lancer_test_and_set_rdy_state(struct be_adapter *adapter);
extern int be_cmd_query_port_name(struct be_adapter *adapter, u8 *port_name);
extern int be_cmd_get_func_config(struct be_adapter *adapter);
extern int be_cmd_get_profile_config(struct be_adapter *adapter, u32 *cap_flags,
				     u8 domain);
				     u16 *txq_count, u8 domain);

extern int be_cmd_set_profile_config(struct be_adapter *adapter, u32 bps,
				     u8 domain);
+8 −2
Original line number Diff line number Diff line
@@ -2719,7 +2719,8 @@ static int be_vfs_if_create(struct be_adapter *adapter)

	for_all_vfs(adapter, vf_cfg, vf) {
		if (!BE3_chip(adapter))
			be_cmd_get_profile_config(adapter, &cap_flags, vf + 1);
			be_cmd_get_profile_config(adapter, &cap_flags,
						  NULL, vf + 1);

		/* If a FW profile exists, then cap_flags are updated */
		en_flags = cap_flags & (BE_IF_FLAGS_UNTAGGED |
@@ -2883,11 +2884,14 @@ static void be_get_resources(struct be_adapter *adapter)
	u16 dev_num_vfs;
	int pos, status;
	bool profile_present = false;
	u16 txq_count = 0;

	if (!BEx_chip(adapter)) {
		status = be_cmd_get_func_config(adapter);
		if (!status)
			profile_present = true;
	} else if (BE3_chip(adapter) && be_physfn(adapter)) {
		be_cmd_get_profile_config(adapter, NULL, &txq_count, 0);
	}

	if (profile_present) {
@@ -2925,7 +2929,9 @@ static void be_get_resources(struct be_adapter *adapter)
			adapter->max_vlans = BE_NUM_VLANS_SUPPORTED;

		adapter->max_mcast_mac = BE_MAX_MC;
		adapter->max_tx_queues = MAX_TX_QS;
		adapter->max_tx_queues = txq_count ? txq_count : MAX_TX_QS;
		adapter->max_tx_queues = min_t(u16, adapter->max_tx_queues,
					       MAX_TX_QS);
		adapter->max_rss_queues = (adapter->be3_native) ?
					   BE3_MAX_RSS_QS : BE2_MAX_RSS_QS;
		adapter->max_event_queues = BE3_MAX_RSS_QS;