|
@@ -37,6 +37,7 @@ struct nicpf {
|
|
|
#define NIC_GET_BGX_FROM_VF_LMAC_MAP(map) ((map >> 4) & 0xF)
|
|
|
#define NIC_GET_LMAC_FROM_VF_LMAC_MAP(map) (map & 0xF)
|
|
|
u8 vf_lmac_map[MAX_LMAC];
|
|
|
+ u8 lmac_cnt;
|
|
|
struct delayed_work dwork;
|
|
|
struct workqueue_struct *check_link;
|
|
|
u8 link[MAX_LMAC];
|
|
@@ -279,6 +280,7 @@ static void nic_set_lmac_vf_mapping(struct nicpf *nic)
|
|
|
u64 lmac_credit;
|
|
|
|
|
|
nic->num_vf_en = 0;
|
|
|
+ nic->lmac_cnt = 0;
|
|
|
|
|
|
for (bgx = 0; bgx < NIC_MAX_BGX; bgx++) {
|
|
|
if (!(bgx_map & (1 << bgx)))
|
|
@@ -288,6 +290,7 @@ static void nic_set_lmac_vf_mapping(struct nicpf *nic)
|
|
|
nic->vf_lmac_map[next_bgx_lmac++] =
|
|
|
NIC_SET_VF_LMAC_MAP(bgx, lmac);
|
|
|
nic->num_vf_en += lmac_cnt;
|
|
|
+ nic->lmac_cnt += lmac_cnt;
|
|
|
|
|
|
/* Program LMAC credits */
|
|
|
lmac_credit = (1ull << 1); /* channel credit enable */
|
|
@@ -715,6 +718,13 @@ static void nic_handle_mbx_intr(struct nicpf *nic, int vf)
|
|
|
case NIC_MBOX_MSG_CFG_DONE:
|
|
|
/* Last message of VF config msg sequence */
|
|
|
nic->vf_enabled[vf] = true;
|
|
|
+ if (vf >= nic->lmac_cnt)
|
|
|
+ goto unlock;
|
|
|
+
|
|
|
+ bgx = NIC_GET_BGX_FROM_VF_LMAC_MAP(nic->vf_lmac_map[vf]);
|
|
|
+ lmac = NIC_GET_LMAC_FROM_VF_LMAC_MAP(nic->vf_lmac_map[vf]);
|
|
|
+
|
|
|
+ bgx_lmac_rx_tx_enable(nic->node, bgx, lmac, true);
|
|
|
goto unlock;
|
|
|
case NIC_MBOX_MSG_SHUTDOWN:
|
|
|
/* First msg in VF teardown sequence */
|
|
@@ -722,6 +732,14 @@ static void nic_handle_mbx_intr(struct nicpf *nic, int vf)
|
|
|
if (vf >= nic->num_vf_en)
|
|
|
nic->sqs_used[vf - nic->num_vf_en] = false;
|
|
|
nic->pqs_vf[vf] = 0;
|
|
|
+
|
|
|
+ if (vf >= nic->lmac_cnt)
|
|
|
+ break;
|
|
|
+
|
|
|
+ bgx = NIC_GET_BGX_FROM_VF_LMAC_MAP(nic->vf_lmac_map[vf]);
|
|
|
+ lmac = NIC_GET_LMAC_FROM_VF_LMAC_MAP(nic->vf_lmac_map[vf]);
|
|
|
+
|
|
|
+ bgx_lmac_rx_tx_enable(nic->node, bgx, lmac, false);
|
|
|
break;
|
|
|
case NIC_MBOX_MSG_ALLOC_SQS:
|
|
|
nic_alloc_sqs(nic, &mbx.sqs_alloc);
|
|
@@ -940,7 +958,7 @@ static void nic_poll_for_link(struct work_struct *work)
|
|
|
|
|
|
mbx.link_status.msg = NIC_MBOX_MSG_BGX_LINK_CHANGE;
|
|
|
|
|
|
- for (vf = 0; vf < nic->num_vf_en; vf++) {
|
|
|
+ for (vf = 0; vf < nic->lmac_cnt; vf++) {
|
|
|
/* Poll only if VF is UP */
|
|
|
if (!nic->vf_enabled[vf])
|
|
|
continue;
|