|
@@ -16,6 +16,7 @@
|
|
|
#define QLC_VF_FLOOD_BIT BIT_16
|
|
|
#define QLC_FLOOD_MODE 0x5
|
|
|
#define QLC_SRIOV_ALLOW_VLAN0 BIT_19
|
|
|
+#define QLC_INTR_COAL_TYPE_MASK 0x7
|
|
|
|
|
|
static int qlcnic_sriov_pf_get_vport_handle(struct qlcnic_adapter *, u8);
|
|
|
|
|
@@ -1178,19 +1179,41 @@ static int qlcnic_sriov_validate_cfg_intrcoal(struct qlcnic_adapter *adapter,
|
|
|
{
|
|
|
struct qlcnic_nic_intr_coalesce *coal = &adapter->ahw->coal;
|
|
|
u16 ctx_id, pkts, time;
|
|
|
+ int err = -EINVAL;
|
|
|
+ u8 type;
|
|
|
|
|
|
+ type = cmd->req.arg[1] & QLC_INTR_COAL_TYPE_MASK;
|
|
|
ctx_id = cmd->req.arg[1] >> 16;
|
|
|
pkts = cmd->req.arg[2] & 0xffff;
|
|
|
time = cmd->req.arg[2] >> 16;
|
|
|
|
|
|
- if (ctx_id != vf->rx_ctx_id)
|
|
|
- return -EINVAL;
|
|
|
- if (pkts > coal->rx_packets)
|
|
|
- return -EINVAL;
|
|
|
- if (time < coal->rx_time_us)
|
|
|
- return -EINVAL;
|
|
|
+ switch (type) {
|
|
|
+ case QLCNIC_INTR_COAL_TYPE_RX:
|
|
|
+ if (ctx_id != vf->rx_ctx_id || pkts > coal->rx_packets ||
|
|
|
+ time < coal->rx_time_us)
|
|
|
+ goto err_label;
|
|
|
+ break;
|
|
|
+ case QLCNIC_INTR_COAL_TYPE_TX:
|
|
|
+ if (ctx_id != vf->tx_ctx_id || pkts > coal->tx_packets ||
|
|
|
+ time < coal->tx_time_us)
|
|
|
+ goto err_label;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ netdev_err(adapter->netdev, "Invalid coalescing type 0x%x received\n",
|
|
|
+ type);
|
|
|
+ return err;
|
|
|
+ }
|
|
|
|
|
|
return 0;
|
|
|
+
|
|
|
+err_label:
|
|
|
+ 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",
|
|
|
+ vf->rx_ctx_id, coal->rx_packets, coal->rx_time_us,
|
|
|
+ vf->tx_ctx_id, coal->tx_packets, coal->tx_time_us);
|
|
|
+ netdev_err(adapter->netdev, "Received: ctx_id 0x%x packets 0x%x time_us 0x%x type 0x%x\n",
|
|
|
+ ctx_id, pkts, time, type);
|
|
|
+
|
|
|
+ return err;
|
|
|
}
|
|
|
|
|
|
static int qlcnic_sriov_pf_cfg_intrcoal_cmd(struct qlcnic_bc_trans *tran,
|