|
@@ -2749,6 +2749,27 @@ static int cxgb4_mgmt_set_vf_rate(struct net_device *dev, int vf,
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
+ if (max_tx_rate == 0) {
|
|
|
+ /* unbind VF to to any Traffic Class */
|
|
|
+ fw_pfvf =
|
|
|
+ (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_PFVF) |
|
|
|
+ FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_PFVF_SCHEDCLASS_ETH));
|
|
|
+ fw_class = 0xffffffff;
|
|
|
+ ret = t4_set_params(adap, adap->mbox, adap->pf, vf + 1, 1,
|
|
|
+ &fw_pfvf, &fw_class);
|
|
|
+ if (ret) {
|
|
|
+ dev_err(adap->pdev_dev,
|
|
|
+ "Err %d in unbinding PF %d VF %d from TX Rate Limiting\n",
|
|
|
+ ret, adap->pf, vf);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ dev_info(adap->pdev_dev,
|
|
|
+ "PF %d VF %d is unbound from TX Rate Limiting\n",
|
|
|
+ adap->pf, vf);
|
|
|
+ adap->vfinfo[vf].tx_rate = 0;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
ret = t4_get_link_params(pi, &link_ok, &speed, &mtu);
|
|
|
if (ret != FW_SUCCESS) {
|
|
|
dev_err(adap->pdev_dev,
|
|
@@ -2798,8 +2819,8 @@ static int cxgb4_mgmt_set_vf_rate(struct net_device *dev, int vf,
|
|
|
&fw_class);
|
|
|
if (ret) {
|
|
|
dev_err(adap->pdev_dev,
|
|
|
- "Err %d in binding VF %d to Traffic Class %d\n",
|
|
|
- ret, vf, class_id);
|
|
|
+ "Err %d in binding PF %d VF %d to Traffic Class %d\n",
|
|
|
+ ret, adap->pf, vf, class_id);
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
dev_info(adap->pdev_dev, "PF %d VF %d is bound to Class %d\n",
|