cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

qlcnic_sriov_pf.c (51135B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * QLogic qlcnic NIC Driver
      4 * Copyright (c) 2009-2013 QLogic Corporation
      5 */
      6
      7#include <linux/types.h>
      8
      9#include "qlcnic_sriov.h"
     10#include "qlcnic.h"
     11
     12#define QLCNIC_SRIOV_VF_MAX_MAC 7
     13#define QLC_VF_MIN_TX_RATE	100
     14#define QLC_VF_MAX_TX_RATE	9999
     15#define QLC_MAC_OPCODE_MASK	0x7
     16#define QLC_VF_FLOOD_BIT	BIT_16
     17#define QLC_FLOOD_MODE		0x5
     18#define QLC_SRIOV_ALLOW_VLAN0	BIT_19
     19#define QLC_INTR_COAL_TYPE_MASK	0x7
     20
     21static int qlcnic_sriov_pf_get_vport_handle(struct qlcnic_adapter *, u8);
     22
     23struct qlcnic_sriov_cmd_handler {
     24	int (*fn) (struct qlcnic_bc_trans *, struct qlcnic_cmd_args *);
     25};
     26
     27struct qlcnic_sriov_fw_cmd_handler {
     28	u32 cmd;
     29	int (*fn) (struct qlcnic_bc_trans *, struct qlcnic_cmd_args *);
     30};
     31
     32static int qlcnic_sriov_pf_set_vport_info(struct qlcnic_adapter *adapter,
     33					  struct qlcnic_info *npar_info,
     34					  u16 vport_id)
     35{
     36	struct qlcnic_cmd_args cmd;
     37	int err;
     38
     39	if (qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_NIC_INFO))
     40		return -ENOMEM;
     41
     42	cmd.req.arg[1] = (vport_id << 16) | 0x1;
     43	cmd.req.arg[2] = npar_info->bit_offsets;
     44	cmd.req.arg[2] |= npar_info->min_tx_bw << 16;
     45	cmd.req.arg[3] = npar_info->max_tx_bw | (npar_info->max_tx_ques << 16);
     46	cmd.req.arg[4] = npar_info->max_tx_mac_filters;
     47	cmd.req.arg[4] |= npar_info->max_rx_mcast_mac_filters << 16;
     48	cmd.req.arg[5] = npar_info->max_rx_ucast_mac_filters |
     49			 (npar_info->max_rx_ip_addr << 16);
     50	cmd.req.arg[6] = npar_info->max_rx_lro_flow |
     51			 (npar_info->max_rx_status_rings << 16);
     52	cmd.req.arg[7] = npar_info->max_rx_buf_rings |
     53			 (npar_info->max_rx_ques << 16);
     54	cmd.req.arg[8] = npar_info->max_tx_vlan_keys;
     55	cmd.req.arg[8] |= npar_info->max_local_ipv6_addrs << 16;
     56	cmd.req.arg[9] = npar_info->max_remote_ipv6_addrs;
     57
     58	err = qlcnic_issue_cmd(adapter, &cmd);
     59	if (err)
     60		dev_err(&adapter->pdev->dev,
     61			"Failed to set vport info, err=%d\n", err);
     62
     63	qlcnic_free_mbx_args(&cmd);
     64	return err;
     65}
     66
     67static int qlcnic_sriov_pf_cal_res_limit(struct qlcnic_adapter *adapter,
     68					 struct qlcnic_info *info, u16 func)
     69{
     70	struct qlcnic_sriov *sriov = adapter->ahw->sriov;
     71	struct qlcnic_resources *res = &sriov->ff_max;
     72	u16 num_macs = sriov->num_allowed_vlans + 1;
     73	int ret = -EIO, vpid, id;
     74	struct qlcnic_vport *vp;
     75	u32 num_vfs, max, temp;
     76
     77	vpid = qlcnic_sriov_pf_get_vport_handle(adapter, func);
     78	if (vpid < 0)
     79		return -EINVAL;
     80
     81	num_vfs = sriov->num_vfs;
     82	max = num_vfs + 1;
     83	info->bit_offsets = 0xffff;
     84	info->max_tx_ques = res->num_tx_queues / max;
     85
     86	if (qlcnic_83xx_pf_check(adapter))
     87		num_macs = QLCNIC_83XX_SRIOV_VF_MAX_MAC;
     88
     89	info->max_rx_mcast_mac_filters = res->num_rx_mcast_mac_filters;
     90
     91	if (adapter->ahw->pci_func == func) {
     92		info->min_tx_bw = 0;
     93		info->max_tx_bw = MAX_BW;
     94
     95		temp = res->num_rx_ucast_mac_filters - num_macs * num_vfs;
     96		info->max_rx_ucast_mac_filters = temp;
     97		temp = res->num_tx_mac_filters - num_macs * num_vfs;
     98		info->max_tx_mac_filters = temp;
     99		temp = num_macs * num_vfs * QLCNIC_SRIOV_VF_MAX_MAC;
    100		temp = res->num_rx_mcast_mac_filters - temp;
    101		info->max_rx_mcast_mac_filters = temp;
    102
    103		info->max_tx_ques = res->num_tx_queues - sriov->num_vfs;
    104	} else {
    105		id = qlcnic_sriov_func_to_index(adapter, func);
    106		if (id < 0)
    107			return id;
    108		vp = sriov->vf_info[id].vp;
    109		info->min_tx_bw = vp->min_tx_bw;
    110		info->max_tx_bw = vp->max_tx_bw;
    111
    112		info->max_rx_ucast_mac_filters = num_macs;
    113		info->max_tx_mac_filters = num_macs;
    114		temp = num_macs * QLCNIC_SRIOV_VF_MAX_MAC;
    115		info->max_rx_mcast_mac_filters = temp;
    116
    117		info->max_tx_ques = QLCNIC_SINGLE_RING;
    118	}
    119
    120	info->max_rx_ip_addr = res->num_destip / max;
    121	info->max_rx_status_rings = res->num_rx_status_rings / max;
    122	info->max_rx_buf_rings = res->num_rx_buf_rings / max;
    123	info->max_rx_ques = res->num_rx_queues / max;
    124	info->max_rx_lro_flow = res->num_lro_flows_supported / max;
    125	info->max_tx_vlan_keys = res->num_txvlan_keys;
    126	info->max_local_ipv6_addrs = res->max_local_ipv6_addrs;
    127	info->max_remote_ipv6_addrs = res->max_remote_ipv6_addrs;
    128
    129	ret = qlcnic_sriov_pf_set_vport_info(adapter, info, vpid);
    130	if (ret)
    131		return ret;
    132
    133	return 0;
    134}
    135
    136static void qlcnic_sriov_pf_set_ff_max_res(struct qlcnic_adapter *adapter,
    137					   struct qlcnic_info *info)
    138{
    139	struct qlcnic_resources *ff_max = &adapter->ahw->sriov->ff_max;
    140
    141	ff_max->num_tx_mac_filters = info->max_tx_mac_filters;
    142	ff_max->num_rx_ucast_mac_filters = info->max_rx_ucast_mac_filters;
    143	ff_max->num_rx_mcast_mac_filters = info->max_rx_mcast_mac_filters;
    144	ff_max->num_txvlan_keys = info->max_tx_vlan_keys;
    145	ff_max->num_rx_queues = info->max_rx_ques;
    146	ff_max->num_tx_queues = info->max_tx_ques;
    147	ff_max->num_lro_flows_supported = info->max_rx_lro_flow;
    148	ff_max->num_destip = info->max_rx_ip_addr;
    149	ff_max->num_rx_buf_rings = info->max_rx_buf_rings;
    150	ff_max->num_rx_status_rings = info->max_rx_status_rings;
    151	ff_max->max_remote_ipv6_addrs = info->max_remote_ipv6_addrs;
    152	ff_max->max_local_ipv6_addrs = info->max_local_ipv6_addrs;
    153}
    154
    155static void qlcnic_sriov_set_vf_max_vlan(struct qlcnic_adapter *adapter,
    156					 struct qlcnic_info *npar_info)
    157{
    158	struct qlcnic_sriov *sriov = adapter->ahw->sriov;
    159	int temp, total_fn;
    160
    161	temp = npar_info->max_rx_mcast_mac_filters;
    162	total_fn = sriov->num_vfs + 1;
    163
    164	temp = temp / (QLCNIC_SRIOV_VF_MAX_MAC * total_fn);
    165	sriov->num_allowed_vlans = temp - 1;
    166
    167	if (qlcnic_83xx_pf_check(adapter))
    168		sriov->num_allowed_vlans = 1;
    169
    170	netdev_info(adapter->netdev, "Max Guest VLANs supported per VF = %d\n",
    171		    sriov->num_allowed_vlans);
    172}
    173
    174static int qlcnic_sriov_get_pf_info(struct qlcnic_adapter *adapter,
    175				    struct qlcnic_info *npar_info)
    176{
    177	int err;
    178	struct qlcnic_cmd_args cmd;
    179
    180	if (qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_NIC_INFO))
    181		return -ENOMEM;
    182
    183	cmd.req.arg[1] = 0x2;
    184	err = qlcnic_issue_cmd(adapter, &cmd);
    185	if (err) {
    186		dev_err(&adapter->pdev->dev,
    187			"Failed to get PF info, err=%d\n", err);
    188		goto out;
    189	}
    190
    191	npar_info->total_pf = cmd.rsp.arg[2] & 0xff;
    192	npar_info->total_rss_engines = (cmd.rsp.arg[2] >> 8) & 0xff;
    193	npar_info->max_vports = MSW(cmd.rsp.arg[2]);
    194	npar_info->max_tx_ques =  LSW(cmd.rsp.arg[3]);
    195	npar_info->max_tx_mac_filters = MSW(cmd.rsp.arg[3]);
    196	npar_info->max_rx_mcast_mac_filters = LSW(cmd.rsp.arg[4]);
    197	npar_info->max_rx_ucast_mac_filters = MSW(cmd.rsp.arg[4]);
    198	npar_info->max_rx_ip_addr = LSW(cmd.rsp.arg[5]);
    199	npar_info->max_rx_lro_flow = MSW(cmd.rsp.arg[5]);
    200	npar_info->max_rx_status_rings = LSW(cmd.rsp.arg[6]);
    201	npar_info->max_rx_buf_rings = MSW(cmd.rsp.arg[6]);
    202	npar_info->max_rx_ques = LSW(cmd.rsp.arg[7]);
    203	npar_info->max_tx_vlan_keys = MSW(cmd.rsp.arg[7]);
    204	npar_info->max_local_ipv6_addrs = LSW(cmd.rsp.arg[8]);
    205	npar_info->max_remote_ipv6_addrs = MSW(cmd.rsp.arg[8]);
    206
    207	qlcnic_sriov_set_vf_max_vlan(adapter, npar_info);
    208	qlcnic_sriov_pf_set_ff_max_res(adapter, npar_info);
    209	dev_info(&adapter->pdev->dev,
    210		 "\n\ttotal_pf: %d,\n"
    211		 "\n\ttotal_rss_engines: %d max_vports: %d max_tx_ques %d,\n"
    212		 "\tmax_tx_mac_filters: %d max_rx_mcast_mac_filters: %d,\n"
    213		 "\tmax_rx_ucast_mac_filters: 0x%x, max_rx_ip_addr: %d,\n"
    214		 "\tmax_rx_lro_flow: %d max_rx_status_rings: %d,\n"
    215		 "\tmax_rx_buf_rings: %d, max_rx_ques: %d, max_tx_vlan_keys %d\n"
    216		 "\tmax_local_ipv6_addrs: %d, max_remote_ipv6_addrs: %d\n",
    217		 npar_info->total_pf, npar_info->total_rss_engines,
    218		 npar_info->max_vports, npar_info->max_tx_ques,
    219		 npar_info->max_tx_mac_filters,
    220		 npar_info->max_rx_mcast_mac_filters,
    221		 npar_info->max_rx_ucast_mac_filters, npar_info->max_rx_ip_addr,
    222		 npar_info->max_rx_lro_flow, npar_info->max_rx_status_rings,
    223		 npar_info->max_rx_buf_rings, npar_info->max_rx_ques,
    224		 npar_info->max_tx_vlan_keys, npar_info->max_local_ipv6_addrs,
    225		 npar_info->max_remote_ipv6_addrs);
    226
    227out:
    228	qlcnic_free_mbx_args(&cmd);
    229	return err;
    230}
    231
    232static void qlcnic_sriov_pf_reset_vport_handle(struct qlcnic_adapter *adapter,
    233					       u8 func)
    234{
    235	struct qlcnic_sriov  *sriov = adapter->ahw->sriov;
    236	struct qlcnic_vport *vp;
    237	int index;
    238
    239	if (adapter->ahw->pci_func == func) {
    240		sriov->vp_handle = 0;
    241	} else {
    242		index = qlcnic_sriov_func_to_index(adapter, func);
    243		if (index < 0)
    244			return;
    245		vp = sriov->vf_info[index].vp;
    246		vp->handle = 0;
    247	}
    248}
    249
    250static void qlcnic_sriov_pf_set_vport_handle(struct qlcnic_adapter *adapter,
    251					     u16 vport_handle, u8 func)
    252{
    253	struct qlcnic_sriov  *sriov = adapter->ahw->sriov;
    254	struct qlcnic_vport *vp;
    255	int index;
    256
    257	if (adapter->ahw->pci_func == func) {
    258		sriov->vp_handle = vport_handle;
    259	} else {
    260		index = qlcnic_sriov_func_to_index(adapter, func);
    261		if (index < 0)
    262			return;
    263		vp = sriov->vf_info[index].vp;
    264		vp->handle = vport_handle;
    265	}
    266}
    267
    268static int qlcnic_sriov_pf_get_vport_handle(struct qlcnic_adapter *adapter,
    269					    u8 func)
    270{
    271	struct qlcnic_sriov  *sriov = adapter->ahw->sriov;
    272	struct qlcnic_vf_info *vf_info;
    273	int index;
    274
    275	if (adapter->ahw->pci_func == func) {
    276		return sriov->vp_handle;
    277	} else {
    278		index = qlcnic_sriov_func_to_index(adapter, func);
    279		if (index >= 0) {
    280			vf_info = &sriov->vf_info[index];
    281			return vf_info->vp->handle;
    282		}
    283	}
    284
    285	return -EINVAL;
    286}
    287
    288static int qlcnic_sriov_pf_config_vport(struct qlcnic_adapter *adapter,
    289					u8 flag, u16 func)
    290{
    291	struct qlcnic_cmd_args cmd;
    292	int ret;
    293	int vpid;
    294
    295	if (qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIG_VPORT))
    296		return -ENOMEM;
    297
    298	if (flag) {
    299		cmd.req.arg[3] = func << 8;
    300	} else {
    301		vpid = qlcnic_sriov_pf_get_vport_handle(adapter, func);
    302		if (vpid < 0) {
    303			ret = -EINVAL;
    304			goto out;
    305		}
    306		cmd.req.arg[3] = ((vpid & 0xffff) << 8) | 1;
    307	}
    308
    309	ret = qlcnic_issue_cmd(adapter, &cmd);
    310	if (ret) {
    311		dev_err(&adapter->pdev->dev,
    312			"Failed %s vport, err %d for func 0x%x\n",
    313			(flag ? "enable" : "disable"), ret, func);
    314		goto out;
    315	}
    316
    317	if (flag) {
    318		vpid = cmd.rsp.arg[2] & 0xffff;
    319		qlcnic_sriov_pf_set_vport_handle(adapter, vpid, func);
    320	} else {
    321		qlcnic_sriov_pf_reset_vport_handle(adapter, func);
    322	}
    323
    324out:
    325	qlcnic_free_mbx_args(&cmd);
    326	return ret;
    327}
    328
    329static int qlcnic_sriov_pf_cfg_vlan_filtering(struct qlcnic_adapter *adapter,
    330					      u8 enable)
    331{
    332	struct qlcnic_cmd_args cmd;
    333	int err;
    334
    335	err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_NIC_INFO);
    336	if (err)
    337		return err;
    338
    339	cmd.req.arg[1] = 0x4;
    340	if (enable) {
    341		adapter->flags |= QLCNIC_VLAN_FILTERING;
    342		cmd.req.arg[1] |= BIT_16;
    343		if (qlcnic_84xx_check(adapter))
    344			cmd.req.arg[1] |= QLC_SRIOV_ALLOW_VLAN0;
    345	} else {
    346		adapter->flags &= ~QLCNIC_VLAN_FILTERING;
    347	}
    348
    349	err = qlcnic_issue_cmd(adapter, &cmd);
    350	if (err)
    351		dev_err(&adapter->pdev->dev,
    352			"Failed to configure VLAN filtering, err=%d\n", err);
    353
    354	qlcnic_free_mbx_args(&cmd);
    355	return err;
    356}
    357
    358/* On configuring VF flood bit, PFD will receive traffic from all VFs */
    359static int qlcnic_sriov_pf_cfg_flood(struct qlcnic_adapter *adapter)
    360{
    361	struct qlcnic_cmd_args cmd;
    362	int err;
    363
    364	err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_NIC_INFO);
    365	if (err)
    366		return err;
    367
    368	cmd.req.arg[1] = QLC_FLOOD_MODE | QLC_VF_FLOOD_BIT;
    369
    370	err = qlcnic_issue_cmd(adapter, &cmd);
    371	if (err)
    372		dev_err(&adapter->pdev->dev,
    373			"Failed to configure VF Flood bit on PF, err=%d\n",
    374			err);
    375
    376	qlcnic_free_mbx_args(&cmd);
    377	return err;
    378}
    379
    380static int qlcnic_sriov_pf_cfg_eswitch(struct qlcnic_adapter *adapter,
    381				       u8 func, u8 enable)
    382{
    383	struct qlcnic_cmd_args cmd;
    384	int err = -EIO;
    385
    386	if (qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_TOGGLE_ESWITCH))
    387		return -ENOMEM;
    388
    389	cmd.req.arg[0] |= (3 << 29);
    390	cmd.req.arg[1] = ((func & 0xf) << 2) | BIT_6 | BIT_1;
    391	if (enable)
    392		cmd.req.arg[1] |= BIT_0;
    393
    394	err = qlcnic_issue_cmd(adapter, &cmd);
    395
    396	if (err != QLCNIC_RCODE_SUCCESS) {
    397		dev_err(&adapter->pdev->dev,
    398			"Failed to enable sriov eswitch%d\n", err);
    399		err = -EIO;
    400	}
    401
    402	qlcnic_free_mbx_args(&cmd);
    403	return err;
    404}
    405
    406static void qlcnic_sriov_pf_del_flr_queue(struct qlcnic_adapter *adapter)
    407{
    408	struct qlcnic_sriov *sriov = adapter->ahw->sriov;
    409	struct qlcnic_back_channel *bc = &sriov->bc;
    410	int i;
    411
    412	for (i = 0; i < sriov->num_vfs; i++)
    413		cancel_work_sync(&sriov->vf_info[i].flr_work);
    414
    415	destroy_workqueue(bc->bc_flr_wq);
    416}
    417
    418static int qlcnic_sriov_pf_create_flr_queue(struct qlcnic_adapter *adapter)
    419{
    420	struct qlcnic_back_channel *bc = &adapter->ahw->sriov->bc;
    421	struct workqueue_struct *wq;
    422
    423	wq = create_singlethread_workqueue("qlcnic-flr");
    424	if (wq == NULL) {
    425		dev_err(&adapter->pdev->dev, "Cannot create FLR workqueue\n");
    426		return -ENOMEM;
    427	}
    428
    429	bc->bc_flr_wq =  wq;
    430	return 0;
    431}
    432
    433void qlcnic_sriov_pf_cleanup(struct qlcnic_adapter *adapter)
    434{
    435	u8 func = adapter->ahw->pci_func;
    436
    437	if (!qlcnic_sriov_enable_check(adapter))
    438		return;
    439
    440	qlcnic_sriov_pf_del_flr_queue(adapter);
    441	qlcnic_sriov_cfg_bc_intr(adapter, 0);
    442	qlcnic_sriov_pf_config_vport(adapter, 0, func);
    443	qlcnic_sriov_pf_cfg_eswitch(adapter, func, 0);
    444	qlcnic_sriov_pf_cfg_vlan_filtering(adapter, 0);
    445	__qlcnic_sriov_cleanup(adapter);
    446	adapter->ahw->op_mode = QLCNIC_MGMT_FUNC;
    447	clear_bit(__QLCNIC_SRIOV_ENABLE, &adapter->state);
    448}
    449
    450void qlcnic_sriov_pf_disable(struct qlcnic_adapter *adapter)
    451{
    452	if (!qlcnic_sriov_pf_check(adapter))
    453		return;
    454
    455	if (!qlcnic_sriov_enable_check(adapter))
    456		return;
    457
    458	pci_disable_sriov(adapter->pdev);
    459	netdev_info(adapter->netdev,
    460		    "SR-IOV is disabled successfully on port %d\n",
    461		    adapter->portnum);
    462}
    463
    464static int qlcnic_pci_sriov_disable(struct qlcnic_adapter *adapter)
    465{
    466	struct net_device *netdev = adapter->netdev;
    467
    468	if (pci_vfs_assigned(adapter->pdev)) {
    469		netdev_err(adapter->netdev,
    470			   "SR-IOV VFs belonging to port %d are assigned to VMs. SR-IOV can not be disabled on this port\n",
    471			   adapter->portnum);
    472		netdev_info(adapter->netdev,
    473			    "Please detach SR-IOV VFs belonging to port %d from VMs, and then try to disable SR-IOV on this port\n",
    474			    adapter->portnum);
    475		return -EPERM;
    476	}
    477
    478	qlcnic_sriov_pf_disable(adapter);
    479
    480	rtnl_lock();
    481	if (netif_running(netdev))
    482		__qlcnic_down(adapter, netdev);
    483
    484	qlcnic_sriov_free_vlans(adapter);
    485
    486	qlcnic_sriov_pf_cleanup(adapter);
    487
    488	/* After disabling SRIOV re-init the driver in default mode
    489	   configure opmode based on op_mode of function
    490	 */
    491	if (qlcnic_83xx_configure_opmode(adapter)) {
    492		rtnl_unlock();
    493		return -EIO;
    494	}
    495
    496	if (netif_running(netdev))
    497		__qlcnic_up(adapter, netdev);
    498
    499	rtnl_unlock();
    500	return 0;
    501}
    502
    503static int qlcnic_sriov_pf_init(struct qlcnic_adapter *adapter)
    504{
    505	struct qlcnic_hardware_context *ahw = adapter->ahw;
    506	struct qlcnic_info nic_info, pf_info, vp_info;
    507	int err;
    508	u8 func = ahw->pci_func;
    509
    510	if (!qlcnic_sriov_enable_check(adapter))
    511		return 0;
    512
    513	err = qlcnic_sriov_pf_cfg_vlan_filtering(adapter, 1);
    514	if (err)
    515		return err;
    516
    517	if (qlcnic_84xx_check(adapter)) {
    518		err = qlcnic_sriov_pf_cfg_flood(adapter);
    519		if (err)
    520			goto disable_vlan_filtering;
    521	}
    522
    523	err = qlcnic_sriov_pf_cfg_eswitch(adapter, func, 1);
    524	if (err)
    525		goto disable_vlan_filtering;
    526
    527	err = qlcnic_sriov_pf_config_vport(adapter, 1, func);
    528	if (err)
    529		goto disable_eswitch;
    530
    531	err = qlcnic_sriov_get_pf_info(adapter, &pf_info);
    532	if (err)
    533		goto delete_vport;
    534
    535	err = qlcnic_get_nic_info(adapter, &nic_info, func);
    536	if (err)
    537		goto delete_vport;
    538
    539	err = qlcnic_sriov_pf_cal_res_limit(adapter, &vp_info, func);
    540	if (err)
    541		goto delete_vport;
    542
    543	err = qlcnic_sriov_cfg_bc_intr(adapter, 1);
    544	if (err)
    545		goto delete_vport;
    546
    547	ahw->physical_port = (u8) nic_info.phys_port;
    548	ahw->switch_mode = nic_info.switch_mode;
    549	ahw->max_mtu = nic_info.max_mtu;
    550	ahw->capabilities = nic_info.capabilities;
    551	ahw->nic_mode = QLC_83XX_SRIOV_MODE;
    552	return err;
    553
    554delete_vport:
    555	qlcnic_sriov_pf_config_vport(adapter, 0, func);
    556
    557disable_eswitch:
    558	qlcnic_sriov_pf_cfg_eswitch(adapter, func, 0);
    559
    560disable_vlan_filtering:
    561	qlcnic_sriov_pf_cfg_vlan_filtering(adapter, 0);
    562
    563	return err;
    564}
    565
    566static int qlcnic_sriov_pf_enable(struct qlcnic_adapter *adapter, int num_vfs)
    567{
    568	int err;
    569
    570	if (!qlcnic_sriov_enable_check(adapter))
    571		return 0;
    572
    573	err = pci_enable_sriov(adapter->pdev, num_vfs);
    574	if (err)
    575		qlcnic_sriov_pf_cleanup(adapter);
    576
    577	return err;
    578}
    579
    580static int __qlcnic_pci_sriov_enable(struct qlcnic_adapter *adapter,
    581				     int num_vfs)
    582{
    583	int err = 0;
    584
    585	set_bit(__QLCNIC_SRIOV_ENABLE, &adapter->state);
    586	adapter->ahw->op_mode = QLCNIC_SRIOV_PF_FUNC;
    587
    588	err = qlcnic_sriov_init(adapter, num_vfs);
    589	if (err)
    590		goto clear_op_mode;
    591
    592	err = qlcnic_sriov_pf_create_flr_queue(adapter);
    593	if (err)
    594		goto sriov_cleanup;
    595
    596	err = qlcnic_sriov_pf_init(adapter);
    597	if (err)
    598		goto del_flr_queue;
    599
    600	err = qlcnic_sriov_alloc_vlans(adapter);
    601	if (err)
    602		goto del_flr_queue;
    603
    604	return err;
    605
    606del_flr_queue:
    607	qlcnic_sriov_pf_del_flr_queue(adapter);
    608
    609sriov_cleanup:
    610	__qlcnic_sriov_cleanup(adapter);
    611
    612clear_op_mode:
    613	clear_bit(__QLCNIC_SRIOV_ENABLE, &adapter->state);
    614	adapter->ahw->op_mode = QLCNIC_MGMT_FUNC;
    615	return err;
    616}
    617
    618static int qlcnic_pci_sriov_enable(struct qlcnic_adapter *adapter, int num_vfs)
    619{
    620	struct net_device *netdev = adapter->netdev;
    621	int err;
    622
    623	if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) {
    624		netdev_err(netdev,
    625			   "SR-IOV cannot be enabled, when legacy interrupts are enabled\n");
    626		return -EIO;
    627	}
    628
    629	rtnl_lock();
    630	if (netif_running(netdev))
    631		__qlcnic_down(adapter, netdev);
    632
    633	err = __qlcnic_pci_sriov_enable(adapter, num_vfs);
    634	if (err)
    635		goto error;
    636
    637	if (netif_running(netdev))
    638		__qlcnic_up(adapter, netdev);
    639
    640	rtnl_unlock();
    641	err = qlcnic_sriov_pf_enable(adapter, num_vfs);
    642	if (!err) {
    643		netdev_info(netdev,
    644			    "SR-IOV is enabled successfully on port %d\n",
    645			    adapter->portnum);
    646		/* Return number of vfs enabled */
    647		return num_vfs;
    648	}
    649
    650	rtnl_lock();
    651	if (netif_running(netdev))
    652		__qlcnic_down(adapter, netdev);
    653
    654error:
    655	if (!qlcnic_83xx_configure_opmode(adapter)) {
    656		if (netif_running(netdev))
    657			__qlcnic_up(adapter, netdev);
    658	}
    659
    660	rtnl_unlock();
    661	netdev_info(netdev, "Failed to enable SR-IOV on port %d\n",
    662		    adapter->portnum);
    663
    664	return err;
    665}
    666
    667int qlcnic_pci_sriov_configure(struct pci_dev *dev, int num_vfs)
    668{
    669	struct qlcnic_adapter *adapter = pci_get_drvdata(dev);
    670	int err;
    671
    672	if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
    673		return -EBUSY;
    674
    675	if (num_vfs == 0)
    676		err = qlcnic_pci_sriov_disable(adapter);
    677	else
    678		err = qlcnic_pci_sriov_enable(adapter, num_vfs);
    679
    680	clear_bit(__QLCNIC_RESETTING, &adapter->state);
    681	return err;
    682}
    683
    684static int qlcnic_sriov_set_vf_acl(struct qlcnic_adapter *adapter, u8 func)
    685{
    686	struct qlcnic_cmd_args cmd;
    687	struct qlcnic_vport *vp;
    688	int err, id;
    689	u8 *mac;
    690
    691	id = qlcnic_sriov_func_to_index(adapter, func);
    692	if (id < 0)
    693		return id;
    694
    695	vp = adapter->ahw->sriov->vf_info[id].vp;
    696	err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_NIC_INFO);
    697	if (err)
    698		return err;
    699
    700	cmd.req.arg[1] = 0x3 | func << 16;
    701	if (vp->spoofchk == true) {
    702		mac = vp->mac;
    703		cmd.req.arg[2] |= BIT_1 | BIT_3 | BIT_8;
    704		cmd.req.arg[4] = mac[5] | mac[4] << 8 | mac[3] << 16 |
    705				 mac[2] << 24;
    706		cmd.req.arg[5] = mac[1] | mac[0] << 8;
    707	}
    708
    709	if (vp->vlan_mode == QLC_PVID_MODE) {
    710		cmd.req.arg[2] |= BIT_6;
    711		cmd.req.arg[3] |= vp->pvid << 8;
    712	}
    713
    714	err = qlcnic_issue_cmd(adapter, &cmd);
    715	if (err)
    716		dev_err(&adapter->pdev->dev, "Failed to set ACL, err=%d\n",
    717			err);
    718
    719	qlcnic_free_mbx_args(&cmd);
    720	return err;
    721}
    722
    723static int qlcnic_sriov_set_vf_vport_info(struct qlcnic_adapter *adapter,
    724					  u16 func)
    725{
    726	struct qlcnic_info defvp_info;
    727	int err;
    728
    729	err = qlcnic_sriov_pf_cal_res_limit(adapter, &defvp_info, func);
    730	if (err)
    731		return -EIO;
    732
    733	err = qlcnic_sriov_set_vf_acl(adapter, func);
    734	if (err)
    735		return err;
    736
    737	return 0;
    738}
    739
    740static int qlcnic_sriov_pf_channel_cfg_cmd(struct qlcnic_bc_trans *trans,
    741					   struct qlcnic_cmd_args *cmd)
    742{
    743	struct qlcnic_vf_info *vf = trans->vf;
    744	struct qlcnic_vport *vp = vf->vp;
    745	struct qlcnic_adapter *adapter;
    746	struct qlcnic_sriov *sriov;
    747	u16 func = vf->pci_func;
    748	size_t size;
    749	int err;
    750
    751	adapter = vf->adapter;
    752	sriov = adapter->ahw->sriov;
    753
    754	if (trans->req_hdr->cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT) {
    755		err = qlcnic_sriov_pf_config_vport(adapter, 1, func);
    756		if (!err) {
    757			err = qlcnic_sriov_set_vf_vport_info(adapter, func);
    758			if (err)
    759				qlcnic_sriov_pf_config_vport(adapter, 0, func);
    760		}
    761	} else {
    762		if (vp->vlan_mode == QLC_GUEST_VLAN_MODE) {
    763			size = sizeof(*vf->sriov_vlans);
    764			size = size * sriov->num_allowed_vlans;
    765			memset(vf->sriov_vlans, 0, size);
    766		}
    767
    768		err = qlcnic_sriov_pf_config_vport(adapter, 0, func);
    769	}
    770
    771	if (err)
    772		goto err_out;
    773
    774	cmd->rsp.arg[0] |= (1 << 25);
    775
    776	if (trans->req_hdr->cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT)
    777		set_bit(QLC_BC_VF_STATE, &vf->state);
    778	else
    779		clear_bit(QLC_BC_VF_STATE, &vf->state);
    780
    781	return err;
    782
    783err_out:
    784	cmd->rsp.arg[0] |= (2 << 25);
    785	return err;
    786}
    787
    788static int qlcnic_sriov_cfg_vf_def_mac(struct qlcnic_adapter *adapter,
    789				       struct qlcnic_vf_info *vf,
    790				       u16 vlan, u8 op)
    791{
    792	struct qlcnic_cmd_args *cmd;
    793	struct qlcnic_macvlan_mbx mv;
    794	struct qlcnic_vport *vp;
    795	u8 *addr;
    796	int err;
    797	u32 *buf;
    798	int vpid;
    799
    800	vp = vf->vp;
    801
    802	cmd = kzalloc(sizeof(*cmd), GFP_ATOMIC);
    803	if (!cmd)
    804		return -ENOMEM;
    805
    806	err = qlcnic_alloc_mbx_args(cmd, adapter, QLCNIC_CMD_CONFIG_MAC_VLAN);
    807	if (err)
    808		goto free_cmd;
    809
    810	cmd->type = QLC_83XX_MBX_CMD_NO_WAIT;
    811	vpid = qlcnic_sriov_pf_get_vport_handle(adapter, vf->pci_func);
    812	if (vpid < 0) {
    813		err = -EINVAL;
    814		goto free_args;
    815	}
    816
    817	if (vlan)
    818		op = ((op == QLCNIC_MAC_ADD || op == QLCNIC_MAC_VLAN_ADD) ?
    819		      QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_VLAN_DEL);
    820
    821	cmd->req.arg[1] = op | (1 << 8) | (3 << 6);
    822	cmd->req.arg[1] |= ((vpid & 0xffff) << 16) | BIT_31;
    823
    824	addr = vp->mac;
    825	mv.vlan = vlan;
    826	mv.mac_addr0 = addr[0];
    827	mv.mac_addr1 = addr[1];
    828	mv.mac_addr2 = addr[2];
    829	mv.mac_addr3 = addr[3];
    830	mv.mac_addr4 = addr[4];
    831	mv.mac_addr5 = addr[5];
    832	buf = &cmd->req.arg[2];
    833	memcpy(buf, &mv, sizeof(struct qlcnic_macvlan_mbx));
    834
    835	err = qlcnic_issue_cmd(adapter, cmd);
    836
    837	if (!err)
    838		return err;
    839
    840free_args:
    841	qlcnic_free_mbx_args(cmd);
    842free_cmd:
    843	kfree(cmd);
    844	return err;
    845}
    846
    847static int qlcnic_sriov_validate_create_rx_ctx(struct qlcnic_cmd_args *cmd)
    848{
    849	if ((cmd->req.arg[0] >> 29) != 0x3)
    850		return -EINVAL;
    851
    852	return 0;
    853}
    854
    855static void qlcnic_83xx_cfg_default_mac_vlan(struct qlcnic_adapter *adapter,
    856					     struct qlcnic_vf_info *vf,
    857					     int opcode)
    858{
    859	struct qlcnic_sriov *sriov;
    860	u16 vlan;
    861	int i;
    862
    863	sriov = adapter->ahw->sriov;
    864
    865	spin_lock_bh(&vf->vlan_list_lock);
    866	if (vf->num_vlan) {
    867		for (i = 0; i < sriov->num_allowed_vlans; i++) {
    868			vlan = vf->sriov_vlans[i];
    869			if (vlan)
    870				qlcnic_sriov_cfg_vf_def_mac(adapter, vf, vlan,
    871							    opcode);
    872		}
    873	}
    874	spin_unlock_bh(&vf->vlan_list_lock);
    875
    876	if (vf->vp->vlan_mode != QLC_PVID_MODE) {
    877		if (qlcnic_83xx_pf_check(adapter) &&
    878		    qlcnic_sriov_check_any_vlan(vf))
    879			return;
    880		qlcnic_sriov_cfg_vf_def_mac(adapter, vf, 0, opcode);
    881	}
    882}
    883
    884static int qlcnic_sriov_pf_create_rx_ctx_cmd(struct qlcnic_bc_trans *tran,
    885					     struct qlcnic_cmd_args *cmd)
    886{
    887	struct qlcnic_vf_info *vf = tran->vf;
    888	struct qlcnic_adapter *adapter = vf->adapter;
    889	struct qlcnic_rcv_mbx_out *mbx_out;
    890	int err;
    891
    892	err = qlcnic_sriov_validate_create_rx_ctx(cmd);
    893	if (err) {
    894		cmd->rsp.arg[0] |= (0x6 << 25);
    895		return err;
    896	}
    897
    898	cmd->req.arg[6] = vf->vp->handle;
    899	err = qlcnic_issue_cmd(adapter, cmd);
    900
    901	if (!err) {
    902		mbx_out = (struct qlcnic_rcv_mbx_out *)&cmd->rsp.arg[1];
    903		vf->rx_ctx_id = mbx_out->ctx_id;
    904		qlcnic_83xx_cfg_default_mac_vlan(adapter, vf, QLCNIC_MAC_ADD);
    905	} else {
    906		vf->rx_ctx_id = 0;
    907	}
    908
    909	return err;
    910}
    911
    912static int qlcnic_sriov_pf_mac_address_cmd(struct qlcnic_bc_trans *trans,
    913					   struct qlcnic_cmd_args *cmd)
    914{
    915	struct qlcnic_vf_info *vf = trans->vf;
    916	u8 type, *mac;
    917
    918	type = cmd->req.arg[1];
    919	switch (type) {
    920	case QLCNIC_SET_STATION_MAC:
    921	case QLCNIC_SET_FAC_DEF_MAC:
    922		cmd->rsp.arg[0] = (2 << 25);
    923		break;
    924	case QLCNIC_GET_CURRENT_MAC:
    925		cmd->rsp.arg[0] = (1 << 25);
    926		mac = vf->vp->mac;
    927		cmd->rsp.arg[2] = mac[1] | ((mac[0] << 8) & 0xff00);
    928		cmd->rsp.arg[1] = mac[5] | ((mac[4] << 8) & 0xff00) |
    929				  ((mac[3]) << 16 & 0xff0000) |
    930				  ((mac[2]) << 24 & 0xff000000);
    931	}
    932
    933	return 0;
    934}
    935
    936static int qlcnic_sriov_validate_create_tx_ctx(struct qlcnic_cmd_args *cmd)
    937{
    938	if ((cmd->req.arg[0] >> 29) != 0x3)
    939		return -EINVAL;
    940
    941	return 0;
    942}
    943
    944static int qlcnic_sriov_pf_create_tx_ctx_cmd(struct qlcnic_bc_trans *trans,
    945					     struct qlcnic_cmd_args *cmd)
    946{
    947	struct qlcnic_vf_info *vf = trans->vf;
    948	struct qlcnic_adapter *adapter = vf->adapter;
    949	struct qlcnic_tx_mbx_out *mbx_out;
    950	int err;
    951
    952	err = qlcnic_sriov_validate_create_tx_ctx(cmd);
    953	if (err) {
    954		cmd->rsp.arg[0] |= (0x6 << 25);
    955		return err;
    956	}
    957
    958	cmd->req.arg[5] |= vf->vp->handle << 16;
    959	err = qlcnic_issue_cmd(adapter, cmd);
    960	if (!err) {
    961		mbx_out = (struct qlcnic_tx_mbx_out *)&cmd->rsp.arg[2];
    962		vf->tx_ctx_id = mbx_out->ctx_id;
    963	} else {
    964		vf->tx_ctx_id = 0;
    965	}
    966
    967	return err;
    968}
    969
    970static int qlcnic_sriov_validate_del_rx_ctx(struct qlcnic_vf_info *vf,
    971					    struct qlcnic_cmd_args *cmd)
    972{
    973	if ((cmd->req.arg[0] >> 29) != 0x3)
    974		return -EINVAL;
    975
    976	if ((cmd->req.arg[1] & 0xffff) != vf->rx_ctx_id)
    977		return -EINVAL;
    978
    979	return 0;
    980}
    981
    982static int qlcnic_sriov_pf_del_rx_ctx_cmd(struct qlcnic_bc_trans *trans,
    983					  struct qlcnic_cmd_args *cmd)
    984{
    985	struct qlcnic_vf_info *vf = trans->vf;
    986	struct qlcnic_adapter *adapter = vf->adapter;
    987	int err;
    988
    989	err = qlcnic_sriov_validate_del_rx_ctx(vf, cmd);
    990	if (err) {
    991		cmd->rsp.arg[0] |= (0x6 << 25);
    992		return err;
    993	}
    994
    995	qlcnic_83xx_cfg_default_mac_vlan(adapter, vf, QLCNIC_MAC_DEL);
    996	cmd->req.arg[1] |= vf->vp->handle << 16;
    997	err = qlcnic_issue_cmd(adapter, cmd);
    998
    999	if (!err)
   1000		vf->rx_ctx_id = 0;
   1001
   1002	return err;
   1003}
   1004
   1005static int qlcnic_sriov_validate_del_tx_ctx(struct qlcnic_vf_info *vf,
   1006					    struct qlcnic_cmd_args *cmd)
   1007{
   1008	if ((cmd->req.arg[0] >> 29) != 0x3)
   1009		return -EINVAL;
   1010
   1011	if ((cmd->req.arg[1] & 0xffff) != vf->tx_ctx_id)
   1012		return -EINVAL;
   1013
   1014	return 0;
   1015}
   1016
   1017static int qlcnic_sriov_pf_del_tx_ctx_cmd(struct qlcnic_bc_trans *trans,
   1018					  struct qlcnic_cmd_args *cmd)
   1019{
   1020	struct qlcnic_vf_info *vf = trans->vf;
   1021	struct qlcnic_adapter *adapter = vf->adapter;
   1022	int err;
   1023
   1024	err = qlcnic_sriov_validate_del_tx_ctx(vf, cmd);
   1025	if (err) {
   1026		cmd->rsp.arg[0] |= (0x6 << 25);
   1027		return err;
   1028	}
   1029
   1030	cmd->req.arg[1] |= vf->vp->handle << 16;
   1031	err = qlcnic_issue_cmd(adapter, cmd);
   1032
   1033	if (!err)
   1034		vf->tx_ctx_id = 0;
   1035
   1036	return err;
   1037}
   1038
   1039static int qlcnic_sriov_validate_cfg_lro(struct qlcnic_vf_info *vf,
   1040					 struct qlcnic_cmd_args *cmd)
   1041{
   1042	if ((cmd->req.arg[1] >> 16) != vf->rx_ctx_id)
   1043		return -EINVAL;
   1044
   1045	return 0;
   1046}
   1047
   1048static int qlcnic_sriov_pf_cfg_lro_cmd(struct qlcnic_bc_trans *trans,
   1049				       struct qlcnic_cmd_args *cmd)
   1050{
   1051	struct qlcnic_vf_info *vf = trans->vf;
   1052	struct qlcnic_adapter *adapter = vf->adapter;
   1053	int err;
   1054
   1055	err = qlcnic_sriov_validate_cfg_lro(vf, cmd);
   1056	if (err) {
   1057		cmd->rsp.arg[0] |= (0x6 << 25);
   1058		return err;
   1059	}
   1060
   1061	err = qlcnic_issue_cmd(adapter, cmd);
   1062	return err;
   1063}
   1064
   1065static int qlcnic_sriov_pf_cfg_ip_cmd(struct qlcnic_bc_trans *trans,
   1066				      struct qlcnic_cmd_args *cmd)
   1067{
   1068	struct qlcnic_vf_info *vf = trans->vf;
   1069	struct qlcnic_adapter *adapter = vf->adapter;
   1070	int err;
   1071
   1072	cmd->req.arg[1] |= vf->vp->handle << 16;
   1073	cmd->req.arg[1] |= BIT_31;
   1074
   1075	err = qlcnic_issue_cmd(adapter, cmd);
   1076	return err;
   1077}
   1078
   1079static int qlcnic_sriov_validate_cfg_intrpt(struct qlcnic_vf_info *vf,
   1080					    struct qlcnic_cmd_args *cmd)
   1081{
   1082	if (((cmd->req.arg[1] >> 8) & 0xff) != vf->pci_func)
   1083		return -EINVAL;
   1084
   1085	if (!(cmd->req.arg[1] & BIT_16))
   1086		return -EINVAL;
   1087
   1088	if ((cmd->req.arg[1] & 0xff) != 0x1)
   1089		return -EINVAL;
   1090
   1091	return 0;
   1092}
   1093
   1094static int qlcnic_sriov_pf_cfg_intrpt_cmd(struct qlcnic_bc_trans *trans,
   1095					  struct qlcnic_cmd_args *cmd)
   1096{
   1097	struct qlcnic_vf_info *vf = trans->vf;
   1098	struct qlcnic_adapter *adapter = vf->adapter;
   1099	int err;
   1100
   1101	err = qlcnic_sriov_validate_cfg_intrpt(vf, cmd);
   1102	if (err)
   1103		cmd->rsp.arg[0] |= (0x6 << 25);
   1104	else
   1105		err = qlcnic_issue_cmd(adapter, cmd);
   1106
   1107	return err;
   1108}
   1109
   1110static int qlcnic_sriov_validate_mtu(struct qlcnic_adapter *adapter,
   1111				     struct qlcnic_vf_info *vf,
   1112				     struct qlcnic_cmd_args *cmd)
   1113{
   1114	if (cmd->req.arg[1] != vf->rx_ctx_id)
   1115		return -EINVAL;
   1116
   1117	if (cmd->req.arg[2] > adapter->ahw->max_mtu)
   1118		return -EINVAL;
   1119
   1120	return 0;
   1121}
   1122
   1123static int qlcnic_sriov_pf_set_mtu_cmd(struct qlcnic_bc_trans *trans,
   1124				       struct qlcnic_cmd_args *cmd)
   1125{
   1126	struct qlcnic_vf_info *vf = trans->vf;
   1127	struct qlcnic_adapter *adapter = vf->adapter;
   1128	int err;
   1129
   1130	err = qlcnic_sriov_validate_mtu(adapter, vf, cmd);
   1131	if (err)
   1132		cmd->rsp.arg[0] |= (0x6 << 25);
   1133	else
   1134		err = qlcnic_issue_cmd(adapter, cmd);
   1135
   1136	return err;
   1137}
   1138
   1139static int qlcnic_sriov_validate_get_nic_info(struct qlcnic_vf_info *vf,
   1140					      struct qlcnic_cmd_args *cmd)
   1141{
   1142	if (cmd->req.arg[1] & BIT_31) {
   1143		if (((cmd->req.arg[1] >> 16) & 0x7fff) != vf->pci_func)
   1144			return -EINVAL;
   1145	} else {
   1146		cmd->req.arg[1] |= vf->vp->handle << 16;
   1147	}
   1148
   1149	return 0;
   1150}
   1151
   1152static int qlcnic_sriov_pf_get_nic_info_cmd(struct qlcnic_bc_trans *trans,
   1153					    struct qlcnic_cmd_args *cmd)
   1154{
   1155	struct qlcnic_vf_info *vf = trans->vf;
   1156	struct qlcnic_adapter *adapter = vf->adapter;
   1157	int err;
   1158
   1159	err = qlcnic_sriov_validate_get_nic_info(vf, cmd);
   1160	if (err) {
   1161		cmd->rsp.arg[0] |= (0x6 << 25);
   1162		return err;
   1163	}
   1164
   1165	err = qlcnic_issue_cmd(adapter, cmd);
   1166	return err;
   1167}
   1168
   1169static int qlcnic_sriov_validate_cfg_rss(struct qlcnic_vf_info *vf,
   1170					 struct qlcnic_cmd_args *cmd)
   1171{
   1172	if (cmd->req.arg[1] != vf->rx_ctx_id)
   1173		return -EINVAL;
   1174
   1175	return 0;
   1176}
   1177
   1178static int qlcnic_sriov_pf_cfg_rss_cmd(struct qlcnic_bc_trans *trans,
   1179				       struct qlcnic_cmd_args *cmd)
   1180{
   1181	struct qlcnic_vf_info *vf = trans->vf;
   1182	struct qlcnic_adapter *adapter = vf->adapter;
   1183	int err;
   1184
   1185	err = qlcnic_sriov_validate_cfg_rss(vf, cmd);
   1186	if (err)
   1187		cmd->rsp.arg[0] |= (0x6 << 25);
   1188	else
   1189		err = qlcnic_issue_cmd(adapter, cmd);
   1190
   1191	return err;
   1192}
   1193
   1194static int qlcnic_sriov_validate_cfg_intrcoal(struct qlcnic_adapter *adapter,
   1195					      struct qlcnic_vf_info *vf,
   1196					      struct qlcnic_cmd_args *cmd)
   1197{
   1198	struct qlcnic_nic_intr_coalesce *coal = &adapter->ahw->coal;
   1199	u16 ctx_id, pkts, time;
   1200	int err = -EINVAL;
   1201	u8 type;
   1202
   1203	type = cmd->req.arg[1] & QLC_INTR_COAL_TYPE_MASK;
   1204	ctx_id = cmd->req.arg[1] >> 16;
   1205	pkts = cmd->req.arg[2] & 0xffff;
   1206	time = cmd->req.arg[2] >> 16;
   1207
   1208	switch (type) {
   1209	case QLCNIC_INTR_COAL_TYPE_RX:
   1210		if (ctx_id != vf->rx_ctx_id || pkts > coal->rx_packets ||
   1211		    time < coal->rx_time_us)
   1212			goto err_label;
   1213		break;
   1214	case QLCNIC_INTR_COAL_TYPE_TX:
   1215		if (ctx_id != vf->tx_ctx_id || pkts > coal->tx_packets ||
   1216		    time < coal->tx_time_us)
   1217			goto err_label;
   1218		break;
   1219	default:
   1220		netdev_err(adapter->netdev, "Invalid coalescing type 0x%x received\n",
   1221			   type);
   1222		return err;
   1223	}
   1224
   1225	return 0;
   1226
   1227err_label:
   1228	netdev_err(adapter->netdev, "Expected: rx_ctx_id 0x%x rx_packets 0x%x rx_time_us 0x%x tx_ctx_id 0x%x tx_packets 0x%x tx_time_us 0x%x\n",
   1229		   vf->rx_ctx_id, coal->rx_packets, coal->rx_time_us,
   1230		   vf->tx_ctx_id, coal->tx_packets, coal->tx_time_us);
   1231	netdev_err(adapter->netdev, "Received: ctx_id 0x%x packets 0x%x time_us 0x%x type 0x%x\n",
   1232		   ctx_id, pkts, time, type);
   1233
   1234	return err;
   1235}
   1236
   1237static int qlcnic_sriov_pf_cfg_intrcoal_cmd(struct qlcnic_bc_trans *tran,
   1238					    struct qlcnic_cmd_args *cmd)
   1239{
   1240	struct qlcnic_vf_info *vf = tran->vf;
   1241	struct qlcnic_adapter *adapter = vf->adapter;
   1242	int err;
   1243
   1244	err = qlcnic_sriov_validate_cfg_intrcoal(adapter, vf, cmd);
   1245	if (err) {
   1246		cmd->rsp.arg[0] |= (0x6 << 25);
   1247		return err;
   1248	}
   1249
   1250	err = qlcnic_issue_cmd(adapter, cmd);
   1251	return err;
   1252}
   1253
   1254static int qlcnic_sriov_validate_cfg_macvlan(struct qlcnic_adapter *adapter,
   1255					     struct qlcnic_vf_info *vf,
   1256					     struct qlcnic_cmd_args *cmd)
   1257{
   1258	struct qlcnic_vport *vp = vf->vp;
   1259	u8 op, new_op;
   1260
   1261	if (!(cmd->req.arg[1] & BIT_8))
   1262		return -EINVAL;
   1263
   1264	cmd->req.arg[1] |= (vf->vp->handle << 16);
   1265	cmd->req.arg[1] |= BIT_31;
   1266
   1267	if (vp->vlan_mode == QLC_PVID_MODE) {
   1268		op = cmd->req.arg[1] & 0x7;
   1269		cmd->req.arg[1] &= ~0x7;
   1270		new_op = (op == QLCNIC_MAC_ADD || op == QLCNIC_MAC_VLAN_ADD) ?
   1271			 QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_VLAN_DEL;
   1272		cmd->req.arg[3] |= vp->pvid << 16;
   1273		cmd->req.arg[1] |= new_op;
   1274	}
   1275
   1276	return 0;
   1277}
   1278
   1279static int qlcnic_sriov_pf_cfg_macvlan_cmd(struct qlcnic_bc_trans *trans,
   1280					   struct qlcnic_cmd_args *cmd)
   1281{
   1282	struct qlcnic_vf_info *vf = trans->vf;
   1283	struct qlcnic_adapter *adapter = vf->adapter;
   1284	int err;
   1285
   1286	err = qlcnic_sriov_validate_cfg_macvlan(adapter, vf, cmd);
   1287	if (err) {
   1288		cmd->rsp.arg[0] |= (0x6 << 25);
   1289		return err;
   1290	}
   1291
   1292	err = qlcnic_issue_cmd(adapter, cmd);
   1293	return err;
   1294}
   1295
   1296static int qlcnic_sriov_validate_linkevent(struct qlcnic_vf_info *vf,
   1297					   struct qlcnic_cmd_args *cmd)
   1298{
   1299	if ((cmd->req.arg[1] >> 16) != vf->rx_ctx_id)
   1300		return -EINVAL;
   1301
   1302	return 0;
   1303}
   1304
   1305static int qlcnic_sriov_pf_linkevent_cmd(struct qlcnic_bc_trans *trans,
   1306					 struct qlcnic_cmd_args *cmd)
   1307{
   1308	struct qlcnic_vf_info *vf = trans->vf;
   1309	struct qlcnic_adapter *adapter = vf->adapter;
   1310	int err;
   1311
   1312	err = qlcnic_sriov_validate_linkevent(vf, cmd);
   1313	if (err) {
   1314		cmd->rsp.arg[0] |= (0x6 << 25);
   1315		return err;
   1316	}
   1317
   1318	err = qlcnic_issue_cmd(adapter, cmd);
   1319	return err;
   1320}
   1321
   1322static int qlcnic_sriov_pf_cfg_promisc_cmd(struct qlcnic_bc_trans *trans,
   1323					   struct qlcnic_cmd_args *cmd)
   1324{
   1325	struct qlcnic_vf_info *vf = trans->vf;
   1326	struct qlcnic_adapter *adapter = vf->adapter;
   1327	int err;
   1328
   1329	cmd->req.arg[1] |= vf->vp->handle << 16;
   1330	cmd->req.arg[1] |= BIT_31;
   1331	err = qlcnic_issue_cmd(adapter, cmd);
   1332	return err;
   1333}
   1334
   1335static int qlcnic_sriov_pf_get_acl_cmd(struct qlcnic_bc_trans *trans,
   1336				       struct qlcnic_cmd_args *cmd)
   1337{
   1338	struct qlcnic_vf_info *vf = trans->vf;
   1339	struct qlcnic_vport *vp = vf->vp;
   1340	u8 mode = vp->vlan_mode;
   1341	struct qlcnic_adapter *adapter;
   1342	struct qlcnic_sriov *sriov;
   1343
   1344	adapter = vf->adapter;
   1345	sriov = adapter->ahw->sriov;
   1346
   1347	cmd->rsp.arg[0] |= 1 << 25;
   1348
   1349	/* For 84xx adapter in case of PVID , PFD should send vlan mode as
   1350	 * QLC_NO_VLAN_MODE to VFD which is zero in mailbox response
   1351	 */
   1352	if (qlcnic_84xx_check(adapter) && mode == QLC_PVID_MODE)
   1353		return 0;
   1354
   1355	switch (mode) {
   1356	case QLC_GUEST_VLAN_MODE:
   1357		cmd->rsp.arg[1] = mode | 1 << 8;
   1358		cmd->rsp.arg[2] = sriov->num_allowed_vlans << 16;
   1359		break;
   1360	case QLC_PVID_MODE:
   1361		cmd->rsp.arg[1] = mode | 1 << 8 | vp->pvid << 16;
   1362		break;
   1363	}
   1364
   1365	return 0;
   1366}
   1367
   1368static int qlcnic_sriov_pf_del_guest_vlan(struct qlcnic_adapter *adapter,
   1369					  struct qlcnic_vf_info *vf,
   1370					  struct qlcnic_cmd_args *cmd)
   1371{
   1372	struct qlcnic_sriov *sriov = adapter->ahw->sriov;
   1373	u16 vlan;
   1374
   1375	if (!qlcnic_sriov_check_any_vlan(vf))
   1376		return -EINVAL;
   1377
   1378	vlan = cmd->req.arg[1] >> 16;
   1379	if (!vf->rx_ctx_id) {
   1380		qlcnic_sriov_del_vlan_id(sriov, vf, vlan);
   1381		return 0;
   1382	}
   1383
   1384	qlcnic_sriov_cfg_vf_def_mac(adapter, vf, vlan, QLCNIC_MAC_DEL);
   1385	qlcnic_sriov_del_vlan_id(sriov, vf, vlan);
   1386
   1387	if (qlcnic_83xx_pf_check(adapter))
   1388		qlcnic_sriov_cfg_vf_def_mac(adapter, vf,
   1389					    0, QLCNIC_MAC_ADD);
   1390	return 0;
   1391}
   1392
   1393static int qlcnic_sriov_pf_add_guest_vlan(struct qlcnic_adapter *adapter,
   1394					  struct qlcnic_vf_info *vf,
   1395					  struct qlcnic_cmd_args *cmd)
   1396{
   1397	struct qlcnic_sriov *sriov = adapter->ahw->sriov;
   1398	int err = -EIO;
   1399	u16 vlan;
   1400
   1401	if (qlcnic_83xx_pf_check(adapter) && qlcnic_sriov_check_any_vlan(vf))
   1402		return err;
   1403
   1404	vlan = cmd->req.arg[1] >> 16;
   1405
   1406	if (!vf->rx_ctx_id) {
   1407		qlcnic_sriov_add_vlan_id(sriov, vf, vlan);
   1408		return 0;
   1409	}
   1410
   1411	if (qlcnic_83xx_pf_check(adapter)) {
   1412		err = qlcnic_sriov_cfg_vf_def_mac(adapter, vf, 0,
   1413						  QLCNIC_MAC_DEL);
   1414		if (err)
   1415			return err;
   1416	}
   1417
   1418	err = qlcnic_sriov_cfg_vf_def_mac(adapter, vf, vlan, QLCNIC_MAC_ADD);
   1419
   1420	if (err) {
   1421		if (qlcnic_83xx_pf_check(adapter))
   1422			qlcnic_sriov_cfg_vf_def_mac(adapter, vf, 0,
   1423						    QLCNIC_MAC_ADD);
   1424		return err;
   1425	}
   1426
   1427	qlcnic_sriov_add_vlan_id(sriov, vf, vlan);
   1428	return err;
   1429}
   1430
   1431static int qlcnic_sriov_pf_cfg_guest_vlan_cmd(struct qlcnic_bc_trans *tran,
   1432					      struct qlcnic_cmd_args *cmd)
   1433{
   1434	struct qlcnic_vf_info  *vf = tran->vf;
   1435	struct qlcnic_adapter *adapter =  vf->adapter;
   1436	struct qlcnic_vport *vp = vf->vp;
   1437	int err = -EIO;
   1438	u8 op;
   1439
   1440	if (vp->vlan_mode != QLC_GUEST_VLAN_MODE) {
   1441		cmd->rsp.arg[0] |= 2 << 25;
   1442		return err;
   1443	}
   1444
   1445	op = cmd->req.arg[1] & 0xf;
   1446
   1447	if (op)
   1448		err = qlcnic_sriov_pf_add_guest_vlan(adapter, vf, cmd);
   1449	else
   1450		err = qlcnic_sriov_pf_del_guest_vlan(adapter, vf, cmd);
   1451
   1452	cmd->rsp.arg[0] |= err ? 2 << 25 : 1 << 25;
   1453	return err;
   1454}
   1455
   1456static const int qlcnic_pf_passthru_supp_cmds[] = {
   1457	QLCNIC_CMD_GET_STATISTICS,
   1458	QLCNIC_CMD_GET_PORT_CONFIG,
   1459	QLCNIC_CMD_GET_LINK_STATUS,
   1460	QLCNIC_CMD_INIT_NIC_FUNC,
   1461	QLCNIC_CMD_STOP_NIC_FUNC,
   1462};
   1463
   1464static const struct qlcnic_sriov_cmd_handler qlcnic_pf_bc_cmd_hdlr[] = {
   1465	[QLCNIC_BC_CMD_CHANNEL_INIT] = {&qlcnic_sriov_pf_channel_cfg_cmd},
   1466	[QLCNIC_BC_CMD_CHANNEL_TERM] = {&qlcnic_sriov_pf_channel_cfg_cmd},
   1467	[QLCNIC_BC_CMD_GET_ACL]	= {&qlcnic_sriov_pf_get_acl_cmd},
   1468	[QLCNIC_BC_CMD_CFG_GUEST_VLAN]	= {&qlcnic_sriov_pf_cfg_guest_vlan_cmd},
   1469};
   1470
   1471static const struct qlcnic_sriov_fw_cmd_handler qlcnic_pf_fw_cmd_hdlr[] = {
   1472	{QLCNIC_CMD_CREATE_RX_CTX, qlcnic_sriov_pf_create_rx_ctx_cmd},
   1473	{QLCNIC_CMD_CREATE_TX_CTX, qlcnic_sriov_pf_create_tx_ctx_cmd},
   1474	{QLCNIC_CMD_MAC_ADDRESS, qlcnic_sriov_pf_mac_address_cmd},
   1475	{QLCNIC_CMD_DESTROY_RX_CTX, qlcnic_sriov_pf_del_rx_ctx_cmd},
   1476	{QLCNIC_CMD_DESTROY_TX_CTX, qlcnic_sriov_pf_del_tx_ctx_cmd},
   1477	{QLCNIC_CMD_CONFIGURE_HW_LRO, qlcnic_sriov_pf_cfg_lro_cmd},
   1478	{QLCNIC_CMD_CONFIGURE_IP_ADDR, qlcnic_sriov_pf_cfg_ip_cmd},
   1479	{QLCNIC_CMD_CONFIG_INTRPT, qlcnic_sriov_pf_cfg_intrpt_cmd},
   1480	{QLCNIC_CMD_SET_MTU, qlcnic_sriov_pf_set_mtu_cmd},
   1481	{QLCNIC_CMD_GET_NIC_INFO, qlcnic_sriov_pf_get_nic_info_cmd},
   1482	{QLCNIC_CMD_CONFIGURE_RSS, qlcnic_sriov_pf_cfg_rss_cmd},
   1483	{QLCNIC_CMD_CONFIG_INTR_COAL, qlcnic_sriov_pf_cfg_intrcoal_cmd},
   1484	{QLCNIC_CMD_CONFIG_MAC_VLAN, qlcnic_sriov_pf_cfg_macvlan_cmd},
   1485	{QLCNIC_CMD_GET_LINK_EVENT, qlcnic_sriov_pf_linkevent_cmd},
   1486	{QLCNIC_CMD_CONFIGURE_MAC_RX_MODE, qlcnic_sriov_pf_cfg_promisc_cmd},
   1487};
   1488
   1489void qlcnic_sriov_pf_process_bc_cmd(struct qlcnic_adapter *adapter,
   1490				    struct qlcnic_bc_trans *trans,
   1491				    struct qlcnic_cmd_args *cmd)
   1492{
   1493	u8 size, cmd_op;
   1494
   1495	cmd_op = trans->req_hdr->cmd_op;
   1496
   1497	if (trans->req_hdr->op_type == QLC_BC_CMD) {
   1498		size = ARRAY_SIZE(qlcnic_pf_bc_cmd_hdlr);
   1499		if (cmd_op < size) {
   1500			qlcnic_pf_bc_cmd_hdlr[cmd_op].fn(trans, cmd);
   1501			return;
   1502		}
   1503	} else {
   1504		int i;
   1505		size = ARRAY_SIZE(qlcnic_pf_fw_cmd_hdlr);
   1506		for (i = 0; i < size; i++) {
   1507			if (cmd_op == qlcnic_pf_fw_cmd_hdlr[i].cmd) {
   1508				qlcnic_pf_fw_cmd_hdlr[i].fn(trans, cmd);
   1509				return;
   1510			}
   1511		}
   1512
   1513		size = ARRAY_SIZE(qlcnic_pf_passthru_supp_cmds);
   1514		for (i = 0; i < size; i++) {
   1515			if (cmd_op == qlcnic_pf_passthru_supp_cmds[i]) {
   1516				qlcnic_issue_cmd(adapter, cmd);
   1517				return;
   1518			}
   1519		}
   1520	}
   1521
   1522	cmd->rsp.arg[0] |= (0x9 << 25);
   1523}
   1524
   1525void qlcnic_pf_set_interface_id_create_rx_ctx(struct qlcnic_adapter *adapter,
   1526					     u32 *int_id)
   1527{
   1528	u16 vpid;
   1529
   1530	vpid = qlcnic_sriov_pf_get_vport_handle(adapter,
   1531						adapter->ahw->pci_func);
   1532	*int_id |= vpid;
   1533}
   1534
   1535void qlcnic_pf_set_interface_id_del_rx_ctx(struct qlcnic_adapter *adapter,
   1536					   u32 *int_id)
   1537{
   1538	u16 vpid;
   1539
   1540	vpid = qlcnic_sriov_pf_get_vport_handle(adapter,
   1541						adapter->ahw->pci_func);
   1542	*int_id |= vpid << 16;
   1543}
   1544
   1545void qlcnic_pf_set_interface_id_create_tx_ctx(struct qlcnic_adapter *adapter,
   1546					      u32 *int_id)
   1547{
   1548	int vpid;
   1549
   1550	vpid = qlcnic_sriov_pf_get_vport_handle(adapter,
   1551						adapter->ahw->pci_func);
   1552	*int_id |= vpid << 16;
   1553}
   1554
   1555void qlcnic_pf_set_interface_id_del_tx_ctx(struct qlcnic_adapter *adapter,
   1556					   u32 *int_id)
   1557{
   1558	u16 vpid;
   1559
   1560	vpid = qlcnic_sriov_pf_get_vport_handle(adapter,
   1561						adapter->ahw->pci_func);
   1562	*int_id |= vpid << 16;
   1563}
   1564
   1565void qlcnic_pf_set_interface_id_promisc(struct qlcnic_adapter *adapter,
   1566					u32 *int_id)
   1567{
   1568	u16 vpid;
   1569
   1570	vpid = qlcnic_sriov_pf_get_vport_handle(adapter,
   1571						adapter->ahw->pci_func);
   1572	*int_id |= (vpid << 16) | BIT_31;
   1573}
   1574
   1575void qlcnic_pf_set_interface_id_ipaddr(struct qlcnic_adapter *adapter,
   1576				       u32 *int_id)
   1577{
   1578	u16 vpid;
   1579
   1580	vpid = qlcnic_sriov_pf_get_vport_handle(adapter,
   1581						adapter->ahw->pci_func);
   1582	*int_id |= (vpid << 16) | BIT_31;
   1583}
   1584
   1585void qlcnic_pf_set_interface_id_macaddr(struct qlcnic_adapter *adapter,
   1586					u32 *int_id)
   1587{
   1588	u16 vpid;
   1589
   1590	vpid = qlcnic_sriov_pf_get_vport_handle(adapter,
   1591						adapter->ahw->pci_func);
   1592	*int_id |= (vpid << 16) | BIT_31;
   1593}
   1594
   1595static void qlcnic_sriov_del_rx_ctx(struct qlcnic_adapter *adapter,
   1596				    struct qlcnic_vf_info *vf)
   1597{
   1598	struct qlcnic_cmd_args cmd;
   1599	int vpid;
   1600
   1601	if (!vf->rx_ctx_id)
   1602		return;
   1603
   1604	if (qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_DESTROY_RX_CTX))
   1605		return;
   1606
   1607	vpid = qlcnic_sriov_pf_get_vport_handle(adapter, vf->pci_func);
   1608	if (vpid >= 0) {
   1609		cmd.req.arg[1] = vf->rx_ctx_id | (vpid & 0xffff) << 16;
   1610		if (qlcnic_issue_cmd(adapter, &cmd))
   1611			dev_err(&adapter->pdev->dev,
   1612				"Failed to delete Tx ctx in firmware for func 0x%x\n",
   1613				vf->pci_func);
   1614		else
   1615			vf->rx_ctx_id = 0;
   1616	}
   1617
   1618	qlcnic_free_mbx_args(&cmd);
   1619}
   1620
   1621static void qlcnic_sriov_del_tx_ctx(struct qlcnic_adapter *adapter,
   1622				    struct qlcnic_vf_info *vf)
   1623{
   1624	struct qlcnic_cmd_args cmd;
   1625	int vpid;
   1626
   1627	if (!vf->tx_ctx_id)
   1628		return;
   1629
   1630	if (qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_DESTROY_TX_CTX))
   1631		return;
   1632
   1633	vpid = qlcnic_sriov_pf_get_vport_handle(adapter, vf->pci_func);
   1634	if (vpid >= 0) {
   1635		cmd.req.arg[1] |= vf->tx_ctx_id | (vpid & 0xffff) << 16;
   1636		if (qlcnic_issue_cmd(adapter, &cmd))
   1637			dev_err(&adapter->pdev->dev,
   1638				"Failed to delete Tx ctx in firmware for func 0x%x\n",
   1639				vf->pci_func);
   1640		else
   1641			vf->tx_ctx_id = 0;
   1642	}
   1643
   1644	qlcnic_free_mbx_args(&cmd);
   1645}
   1646
   1647static int qlcnic_sriov_add_act_list_irqsave(struct qlcnic_sriov *sriov,
   1648					     struct qlcnic_vf_info *vf,
   1649					     struct qlcnic_bc_trans *trans)
   1650{
   1651	struct qlcnic_trans_list *t_list = &vf->rcv_act;
   1652	unsigned long flag;
   1653
   1654	spin_lock_irqsave(&t_list->lock, flag);
   1655
   1656	__qlcnic_sriov_add_act_list(sriov, vf, trans);
   1657
   1658	spin_unlock_irqrestore(&t_list->lock, flag);
   1659	return 0;
   1660}
   1661
   1662static void __qlcnic_sriov_process_flr(struct qlcnic_vf_info *vf)
   1663{
   1664	struct qlcnic_adapter *adapter = vf->adapter;
   1665
   1666	qlcnic_sriov_cleanup_list(&vf->rcv_pend);
   1667	cancel_work_sync(&vf->trans_work);
   1668	qlcnic_sriov_cleanup_list(&vf->rcv_act);
   1669
   1670	if (test_bit(QLC_BC_VF_SOFT_FLR, &vf->state)) {
   1671		qlcnic_sriov_del_tx_ctx(adapter, vf);
   1672		qlcnic_sriov_del_rx_ctx(adapter, vf);
   1673	}
   1674
   1675	qlcnic_sriov_pf_config_vport(adapter, 0, vf->pci_func);
   1676
   1677	clear_bit(QLC_BC_VF_FLR, &vf->state);
   1678	if (test_bit(QLC_BC_VF_SOFT_FLR, &vf->state)) {
   1679		qlcnic_sriov_add_act_list_irqsave(adapter->ahw->sriov, vf,
   1680						  vf->flr_trans);
   1681		clear_bit(QLC_BC_VF_SOFT_FLR, &vf->state);
   1682		vf->flr_trans = NULL;
   1683	}
   1684}
   1685
   1686static void qlcnic_sriov_pf_process_flr(struct work_struct *work)
   1687{
   1688	struct qlcnic_vf_info *vf;
   1689
   1690	vf = container_of(work, struct qlcnic_vf_info, flr_work);
   1691	__qlcnic_sriov_process_flr(vf);
   1692	return;
   1693}
   1694
   1695static void qlcnic_sriov_schedule_flr(struct qlcnic_sriov *sriov,
   1696				      struct qlcnic_vf_info *vf,
   1697				      work_func_t func)
   1698{
   1699	if (test_bit(__QLCNIC_RESETTING, &vf->adapter->state))
   1700		return;
   1701
   1702	INIT_WORK(&vf->flr_work, func);
   1703	queue_work(sriov->bc.bc_flr_wq, &vf->flr_work);
   1704}
   1705
   1706static void qlcnic_sriov_handle_soft_flr(struct qlcnic_adapter *adapter,
   1707					 struct qlcnic_bc_trans *trans,
   1708					 struct qlcnic_vf_info *vf)
   1709{
   1710	struct qlcnic_sriov *sriov = adapter->ahw->sriov;
   1711
   1712	set_bit(QLC_BC_VF_FLR, &vf->state);
   1713	clear_bit(QLC_BC_VF_STATE, &vf->state);
   1714	set_bit(QLC_BC_VF_SOFT_FLR, &vf->state);
   1715	vf->flr_trans = trans;
   1716	qlcnic_sriov_schedule_flr(sriov, vf, qlcnic_sriov_pf_process_flr);
   1717	netdev_info(adapter->netdev, "Software FLR for PCI func %d\n",
   1718		    vf->pci_func);
   1719}
   1720
   1721bool qlcnic_sriov_soft_flr_check(struct qlcnic_adapter *adapter,
   1722				 struct qlcnic_bc_trans *trans,
   1723				 struct qlcnic_vf_info *vf)
   1724{
   1725	struct qlcnic_bc_hdr *hdr = trans->req_hdr;
   1726
   1727	if ((hdr->cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT) &&
   1728	    (hdr->op_type == QLC_BC_CMD) &&
   1729	     test_bit(QLC_BC_VF_STATE, &vf->state)) {
   1730		qlcnic_sriov_handle_soft_flr(adapter, trans, vf);
   1731		return true;
   1732	}
   1733
   1734	return false;
   1735}
   1736
   1737void qlcnic_sriov_pf_handle_flr(struct qlcnic_sriov *sriov,
   1738				struct qlcnic_vf_info *vf)
   1739{
   1740	struct net_device *dev = vf->adapter->netdev;
   1741	struct qlcnic_vport *vp = vf->vp;
   1742
   1743	if (!test_and_clear_bit(QLC_BC_VF_STATE, &vf->state)) {
   1744		clear_bit(QLC_BC_VF_FLR, &vf->state);
   1745		return;
   1746	}
   1747
   1748	if (test_and_set_bit(QLC_BC_VF_FLR, &vf->state)) {
   1749		netdev_info(dev, "FLR for PCI func %d in progress\n",
   1750			    vf->pci_func);
   1751		return;
   1752	}
   1753
   1754	if (vp->vlan_mode == QLC_GUEST_VLAN_MODE)
   1755		memset(vf->sriov_vlans, 0,
   1756		       sizeof(*vf->sriov_vlans) * sriov->num_allowed_vlans);
   1757
   1758	qlcnic_sriov_schedule_flr(sriov, vf, qlcnic_sriov_pf_process_flr);
   1759	netdev_info(dev, "FLR received for PCI func %d\n", vf->pci_func);
   1760}
   1761
   1762void qlcnic_sriov_pf_reset(struct qlcnic_adapter *adapter)
   1763{
   1764	struct qlcnic_hardware_context *ahw = adapter->ahw;
   1765	struct qlcnic_sriov *sriov = ahw->sriov;
   1766	struct qlcnic_vf_info *vf;
   1767	u16 num_vfs = sriov->num_vfs;
   1768	int i;
   1769
   1770	for (i = 0; i < num_vfs; i++) {
   1771		vf = &sriov->vf_info[i];
   1772		vf->rx_ctx_id = 0;
   1773		vf->tx_ctx_id = 0;
   1774		cancel_work_sync(&vf->flr_work);
   1775		__qlcnic_sriov_process_flr(vf);
   1776		clear_bit(QLC_BC_VF_STATE, &vf->state);
   1777	}
   1778
   1779	qlcnic_sriov_pf_reset_vport_handle(adapter, ahw->pci_func);
   1780	QLCWRX(ahw, QLCNIC_MBX_INTR_ENBL, (ahw->num_msix - 1) << 8);
   1781}
   1782
   1783int qlcnic_sriov_pf_reinit(struct qlcnic_adapter *adapter)
   1784{
   1785	struct qlcnic_hardware_context *ahw = adapter->ahw;
   1786	int err;
   1787
   1788	if (!qlcnic_sriov_enable_check(adapter))
   1789		return 0;
   1790
   1791	ahw->op_mode = QLCNIC_SRIOV_PF_FUNC;
   1792
   1793	err = qlcnic_sriov_pf_init(adapter);
   1794	if (err)
   1795		return err;
   1796
   1797	dev_info(&adapter->pdev->dev, "%s: op_mode %d\n",
   1798		 __func__, ahw->op_mode);
   1799	return err;
   1800}
   1801
   1802int qlcnic_sriov_set_vf_mac(struct net_device *netdev, int vf, u8 *mac)
   1803{
   1804	struct qlcnic_adapter *adapter = netdev_priv(netdev);
   1805	struct qlcnic_sriov *sriov = adapter->ahw->sriov;
   1806	int i, num_vfs;
   1807	struct qlcnic_vf_info *vf_info;
   1808	u8 *curr_mac;
   1809
   1810	if (!qlcnic_sriov_pf_check(adapter))
   1811		return -EOPNOTSUPP;
   1812
   1813	num_vfs = sriov->num_vfs;
   1814
   1815	if (!is_valid_ether_addr(mac) || vf >= num_vfs)
   1816		return -EINVAL;
   1817
   1818	if (ether_addr_equal(adapter->mac_addr, mac)) {
   1819		netdev_err(netdev, "MAC address is already in use by the PF\n");
   1820		return -EINVAL;
   1821	}
   1822
   1823	for (i = 0; i < num_vfs; i++) {
   1824		vf_info = &sriov->vf_info[i];
   1825		if (ether_addr_equal(vf_info->vp->mac, mac)) {
   1826			netdev_err(netdev,
   1827				   "MAC address is already in use by VF %d\n",
   1828				   i);
   1829			return -EINVAL;
   1830		}
   1831	}
   1832
   1833	vf_info = &sriov->vf_info[vf];
   1834	curr_mac = vf_info->vp->mac;
   1835
   1836	if (test_bit(QLC_BC_VF_STATE, &vf_info->state)) {
   1837		netdev_err(netdev,
   1838			   "MAC address change failed for VF %d, as VF driver is loaded. Please unload VF driver and retry the operation\n",
   1839			   vf);
   1840		return -EOPNOTSUPP;
   1841	}
   1842
   1843	memcpy(curr_mac, mac, netdev->addr_len);
   1844	netdev_info(netdev, "MAC Address %pM  is configured for VF %d\n",
   1845		    mac, vf);
   1846	return 0;
   1847}
   1848
   1849int qlcnic_sriov_set_vf_tx_rate(struct net_device *netdev, int vf,
   1850				int min_tx_rate, int max_tx_rate)
   1851{
   1852	struct qlcnic_adapter *adapter = netdev_priv(netdev);
   1853	struct qlcnic_sriov *sriov = adapter->ahw->sriov;
   1854	struct qlcnic_vf_info *vf_info;
   1855	struct qlcnic_info nic_info;
   1856	struct qlcnic_vport *vp;
   1857	u16 vpid;
   1858
   1859	if (!qlcnic_sriov_pf_check(adapter))
   1860		return -EOPNOTSUPP;
   1861
   1862	if (vf >= sriov->num_vfs)
   1863		return -EINVAL;
   1864
   1865	vf_info = &sriov->vf_info[vf];
   1866	vp = vf_info->vp;
   1867	vpid = vp->handle;
   1868
   1869	if (!min_tx_rate)
   1870		min_tx_rate = QLC_VF_MIN_TX_RATE;
   1871
   1872	if (max_tx_rate &&
   1873	    (max_tx_rate >= 10000 || max_tx_rate < min_tx_rate)) {
   1874		netdev_err(netdev,
   1875			   "Invalid max Tx rate, allowed range is [%d - %d]",
   1876			   min_tx_rate, QLC_VF_MAX_TX_RATE);
   1877		return -EINVAL;
   1878	}
   1879
   1880	if (!max_tx_rate)
   1881		max_tx_rate = 10000;
   1882
   1883	if (min_tx_rate &&
   1884	    (min_tx_rate > max_tx_rate || min_tx_rate < QLC_VF_MIN_TX_RATE)) {
   1885		netdev_err(netdev,
   1886			   "Invalid min Tx rate, allowed range is [%d - %d]",
   1887			   QLC_VF_MIN_TX_RATE, max_tx_rate);
   1888		return -EINVAL;
   1889	}
   1890
   1891	if (test_bit(QLC_BC_VF_STATE, &vf_info->state)) {
   1892		if (qlcnic_sriov_get_vf_vport_info(adapter, &nic_info, vpid))
   1893			return -EIO;
   1894
   1895		nic_info.max_tx_bw = max_tx_rate / 100;
   1896		nic_info.min_tx_bw = min_tx_rate / 100;
   1897		nic_info.bit_offsets = BIT_0;
   1898
   1899		if (qlcnic_sriov_pf_set_vport_info(adapter, &nic_info, vpid))
   1900			return -EIO;
   1901	}
   1902
   1903	vp->max_tx_bw = max_tx_rate / 100;
   1904	netdev_info(netdev,
   1905		    "Setting Max Tx rate %d (Mbps), %d %% of PF bandwidth, for VF %d\n",
   1906		    max_tx_rate, vp->max_tx_bw, vf);
   1907	vp->min_tx_bw = min_tx_rate / 100;
   1908	netdev_info(netdev,
   1909		    "Setting Min Tx rate %d (Mbps), %d %% of PF bandwidth, for VF %d\n",
   1910		    min_tx_rate, vp->min_tx_bw, vf);
   1911	return 0;
   1912}
   1913
   1914int qlcnic_sriov_set_vf_vlan(struct net_device *netdev, int vf,
   1915			     u16 vlan, u8 qos, __be16 vlan_proto)
   1916{
   1917	struct qlcnic_adapter *adapter = netdev_priv(netdev);
   1918	struct qlcnic_sriov *sriov = adapter->ahw->sriov;
   1919	struct qlcnic_vf_info *vf_info;
   1920	struct qlcnic_vport *vp;
   1921
   1922	if (!qlcnic_sriov_pf_check(adapter))
   1923		return -EOPNOTSUPP;
   1924
   1925	if (vf >= sriov->num_vfs || qos > 7)
   1926		return -EINVAL;
   1927
   1928	if (vlan_proto != htons(ETH_P_8021Q))
   1929		return -EPROTONOSUPPORT;
   1930
   1931	if (vlan > MAX_VLAN_ID) {
   1932		netdev_err(netdev,
   1933			   "Invalid VLAN ID, allowed range is [0 - %d]\n",
   1934			   MAX_VLAN_ID);
   1935		return -EINVAL;
   1936	}
   1937
   1938	vf_info = &sriov->vf_info[vf];
   1939	vp = vf_info->vp;
   1940	if (test_bit(QLC_BC_VF_STATE, &vf_info->state)) {
   1941		netdev_err(netdev,
   1942			   "VLAN change failed for VF %d, as VF driver is loaded. Please unload VF driver and retry the operation\n",
   1943			   vf);
   1944		return -EOPNOTSUPP;
   1945	}
   1946
   1947	memset(vf_info->sriov_vlans, 0,
   1948	       sizeof(*vf_info->sriov_vlans) * sriov->num_allowed_vlans);
   1949
   1950	switch (vlan) {
   1951	case 4095:
   1952		vp->vlan_mode = QLC_GUEST_VLAN_MODE;
   1953		break;
   1954	case 0:
   1955		vp->vlan_mode = QLC_NO_VLAN_MODE;
   1956		vp->qos = 0;
   1957		break;
   1958	default:
   1959		vp->vlan_mode = QLC_PVID_MODE;
   1960		qlcnic_sriov_add_vlan_id(sriov, vf_info, vlan);
   1961		vp->qos = qos;
   1962		vp->pvid = vlan;
   1963	}
   1964
   1965	netdev_info(netdev, "Setting VLAN %d, QoS %d, for VF %d\n",
   1966		    vlan, qos, vf);
   1967	return 0;
   1968}
   1969
   1970static __u32 qlcnic_sriov_get_vf_vlan(struct qlcnic_adapter *adapter,
   1971				      struct qlcnic_vport *vp, int vf)
   1972{
   1973	__u32 vlan = 0;
   1974
   1975	switch (vp->vlan_mode) {
   1976	case QLC_PVID_MODE:
   1977		vlan = vp->pvid;
   1978		break;
   1979	case QLC_GUEST_VLAN_MODE:
   1980		vlan = MAX_VLAN_ID;
   1981		break;
   1982	case QLC_NO_VLAN_MODE:
   1983		vlan = 0;
   1984		break;
   1985	default:
   1986		netdev_info(adapter->netdev, "Invalid VLAN mode = %d for VF %d\n",
   1987			    vp->vlan_mode, vf);
   1988	}
   1989
   1990	return vlan;
   1991}
   1992
   1993int qlcnic_sriov_get_vf_config(struct net_device *netdev,
   1994			       int vf, struct ifla_vf_info *ivi)
   1995{
   1996	struct qlcnic_adapter *adapter = netdev_priv(netdev);
   1997	struct qlcnic_sriov *sriov = adapter->ahw->sriov;
   1998	struct qlcnic_vport *vp;
   1999
   2000	if (!qlcnic_sriov_pf_check(adapter))
   2001		return -EOPNOTSUPP;
   2002
   2003	if (vf >= sriov->num_vfs)
   2004		return -EINVAL;
   2005
   2006	vp = sriov->vf_info[vf].vp;
   2007	memcpy(&ivi->mac, vp->mac, ETH_ALEN);
   2008	ivi->vlan = qlcnic_sriov_get_vf_vlan(adapter, vp, vf);
   2009	ivi->qos = vp->qos;
   2010	ivi->spoofchk = vp->spoofchk;
   2011	if (vp->max_tx_bw == MAX_BW)
   2012		ivi->max_tx_rate = 0;
   2013	else
   2014		ivi->max_tx_rate = vp->max_tx_bw * 100;
   2015	if (vp->min_tx_bw == MIN_BW)
   2016		ivi->min_tx_rate = 0;
   2017	else
   2018		ivi->min_tx_rate = vp->min_tx_bw * 100;
   2019
   2020	ivi->vf = vf;
   2021	return 0;
   2022}
   2023
   2024int qlcnic_sriov_set_vf_spoofchk(struct net_device *netdev, int vf, bool chk)
   2025{
   2026	struct qlcnic_adapter *adapter = netdev_priv(netdev);
   2027	struct qlcnic_sriov *sriov = adapter->ahw->sriov;
   2028	struct qlcnic_vf_info *vf_info;
   2029	struct qlcnic_vport *vp;
   2030
   2031	if (!qlcnic_sriov_pf_check(adapter))
   2032		return -EOPNOTSUPP;
   2033
   2034	if (vf >= sriov->num_vfs)
   2035		return -EINVAL;
   2036
   2037	vf_info = &sriov->vf_info[vf];
   2038	vp = vf_info->vp;
   2039	if (test_bit(QLC_BC_VF_STATE, &vf_info->state)) {
   2040		netdev_err(netdev,
   2041			   "Spoof check change failed for VF %d, as VF driver is loaded. Please unload VF driver and retry the operation\n",
   2042			   vf);
   2043		return -EOPNOTSUPP;
   2044	}
   2045
   2046	vp->spoofchk = chk;
   2047	return 0;
   2048}