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

Commit d5c18473 authored by Padmanabh Ratnakar's avatar Padmanabh Ratnakar Committed by David S. Miller
Browse files

be2net: Fix setting QoS for VF for Lancer



Use Lancer specific command to set QoS for VF.

Signed-off-by: default avatarPadmanabh Ratnakar <padmanabh.ratnakar@emulex.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent abb93951
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -444,6 +444,7 @@ struct be_adapter {
	u16 max_vlans;
	u16 max_event_queues;
	u32 if_cap_flags;
	u8 pf_number;
};

#define be_physfn(adapter)		(!adapter->virtfn)
+58 −0
Original line number Diff line number Diff line
@@ -2862,6 +2862,7 @@ int be_cmd_get_func_config(struct be_adapter *adapter)
			goto err;
		}

		adapter->pf_number = desc->pf_num;
		adapter->max_pmac_cnt = le16_to_cpu(desc->unicast_mac_count);
		adapter->max_vlans = le16_to_cpu(desc->vlan_count);
		adapter->max_mcast_mac = le16_to_cpu(desc->mcast_mac_count);
@@ -2936,6 +2937,63 @@ err:
	return status;
}

/* Uses sync mcc */
int be_cmd_set_profile_config(struct be_adapter *adapter, u32 bps,
			      u8 domain)
{
	struct be_mcc_wrb *wrb;
	struct be_cmd_req_set_profile_config *req;
	int status;

	spin_lock_bh(&adapter->mcc_lock);

	wrb = wrb_from_mccq(adapter);
	if (!wrb) {
		status = -EBUSY;
		goto err;
	}

	req = embedded_payload(wrb);

	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
			       OPCODE_COMMON_SET_PROFILE_CONFIG, sizeof(*req),
			       wrb, NULL);

	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_len = RESOURCE_DESC_SIZE;
	req->nic_desc.flags = (1 << QUN) | (1 << IMM) | (1 << NOSV);
	req->nic_desc.pf_num = adapter->pf_number;
	req->nic_desc.vf_num = domain;

	/* Mark fields invalid */
	req->nic_desc.unicast_mac_count = 0xFFFF;
	req->nic_desc.mcc_count = 0xFFFF;
	req->nic_desc.vlan_count = 0xFFFF;
	req->nic_desc.mcast_mac_count = 0xFFFF;
	req->nic_desc.txq_count = 0xFFFF;
	req->nic_desc.rq_count = 0xFFFF;
	req->nic_desc.rssq_count = 0xFFFF;
	req->nic_desc.lro_count = 0xFFFF;
	req->nic_desc.cq_count = 0xFFFF;
	req->nic_desc.toe_conn_count = 0xFFFF;
	req->nic_desc.eq_count = 0xFFFF;
	req->nic_desc.link_param = 0xFF;
	req->nic_desc.bw_min = 0xFFFFFFFF;
	req->nic_desc.acpi_params = 0xFF;
	req->nic_desc.wol_param = 0x0F;

	/* Change BW */
	req->nic_desc.bw_min = cpu_to_le32(bps);
	req->nic_desc.bw_max = cpu_to_le32(bps);
	status = be_mcc_notify_wait(adapter);
err:
	spin_unlock_bh(&adapter->mcc_lock);
	return status;
}

int be_roce_mcc_cmd(void *netdev_handle, void *wrb_payload,
			int wrb_payload_size, u16 *cmd_status, u16 *ext_status)
{
+23 −0
Original line number Diff line number Diff line
@@ -198,6 +198,7 @@ struct be_mcc_mailbox {
#define OPCODE_COMMON_GET_HSW_CONFIG			152
#define OPCODE_COMMON_GET_FUNC_CONFIG			160
#define OPCODE_COMMON_GET_PROFILE_CONFIG		164
#define OPCODE_COMMON_SET_PROFILE_CONFIG		165
#define OPCODE_COMMON_SET_HSW_CONFIG			153
#define OPCODE_COMMON_READ_OBJECT			171
#define OPCODE_COMMON_WRITE_OBJECT			172
@@ -1689,6 +1690,14 @@ struct be_cmd_req_set_ext_fat_caps {
#define RESOURCE_DESC_SIZE			72
#define NIC_RESOURCE_DESC_TYPE_ID		0x41
#define MAX_RESOURCE_DESC			4

/* QOS unit number */
#define QUN					4
/* Immediate */
#define IMM					6
/* No save */
#define NOSV					7

struct be_nic_resource_desc {
	u8 desc_type;
	u8 desc_len;
@@ -1746,6 +1755,17 @@ struct be_cmd_resp_get_profile_config {
	u8 func_param[MAX_RESOURCE_DESC * RESOURCE_DESC_SIZE];
};

struct be_cmd_req_set_profile_config {
	struct be_cmd_req_hdr hdr;
	u32 rsvd;
	u32 desc_count;
	struct be_nic_resource_desc nic_desc;
};

struct be_cmd_resp_set_profile_config {
	struct be_cmd_req_hdr hdr;
};

extern int be_pci_fnum_get(struct be_adapter *adapter);
extern int be_fw_wait_ready(struct be_adapter *adapter);
extern int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr,
@@ -1863,3 +1883,6 @@ 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);

extern int be_cmd_set_profile_config(struct be_adapter *adapter, u32 bps,
				     u8 domain);
+4 −1
Original line number Diff line number Diff line
@@ -1062,6 +1062,9 @@ static int be_set_vf_tx_rate(struct net_device *netdev,
		return -EINVAL;
	}

	if (lancer_chip(adapter))
		status = be_cmd_set_profile_config(adapter, rate / 10, vf + 1);
	else
		status = be_cmd_set_qos(adapter, rate / 10, vf + 1);

	if (status)