|
@@ -5457,9 +5457,19 @@ static void bnx2x_timer(unsigned long data)
|
|
|
bnx2x_stats_handle(bp, STATS_EVENT_UPDATE);
|
|
|
|
|
|
/* sample pf vf bulletin board for new posts from pf */
|
|
|
- if (IS_VF(bp))
|
|
|
+ if (IS_VF(bp)) {
|
|
|
bnx2x_sample_bulletin(bp);
|
|
|
|
|
|
+ /* if channel is down we need to self destruct */
|
|
|
+ if (bp->old_bulletin.valid_bitmap & 1 << CHANNEL_DOWN) {
|
|
|
+ smp_mb__before_clear_bit();
|
|
|
+ set_bit(BNX2X_SP_RTNL_VFPF_CHANNEL_DOWN,
|
|
|
+ &bp->sp_rtnl_state);
|
|
|
+ smp_mb__after_clear_bit();
|
|
|
+ schedule_delayed_work(&bp->sp_rtnl_task, 0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
mod_timer(&bp->timer, jiffies + bp->current_interval);
|
|
|
}
|
|
|
|
|
@@ -9620,6 +9630,13 @@ sp_rtnl_not_reset:
|
|
|
"sending set mcast vf pf channel message from rtnl sp-task\n");
|
|
|
bnx2x_vfpf_set_mcast(bp->dev);
|
|
|
}
|
|
|
+ if (test_and_clear_bit(BNX2X_SP_RTNL_VFPF_CHANNEL_DOWN,
|
|
|
+ &bp->sp_rtnl_state)){
|
|
|
+ if (!test_bit(__LINK_STATE_NOCARRIER, &bp->dev->state)) {
|
|
|
+ bnx2x_tx_disable(bp);
|
|
|
+ BNX2X_ERR("PF indicated channel is not servicable anymore. This means this VF device is no longer operational\n");
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
if (test_and_clear_bit(BNX2X_SP_RTNL_VFPF_STORM_RX_MODE,
|
|
|
&bp->sp_rtnl_state)) {
|
|
@@ -10541,6 +10558,10 @@ static void bnx2x_link_settings_supported(struct bnx2x *bp, u32 switch_cfg)
|
|
|
if (!(bp->link_params.speed_cap_mask[idx] &
|
|
|
PORT_HW_CFG_SPEED_CAPABILITY_D0_10G))
|
|
|
bp->port.supported[idx] &= ~SUPPORTED_10000baseT_Full;
|
|
|
+
|
|
|
+ if (!(bp->link_params.speed_cap_mask[idx] &
|
|
|
+ PORT_HW_CFG_SPEED_CAPABILITY_D0_20G))
|
|
|
+ bp->port.supported[idx] &= ~SUPPORTED_20000baseKR2_Full;
|
|
|
}
|
|
|
|
|
|
BNX2X_DEV_INFO("supported 0x%x 0x%x\n", bp->port.supported[0],
|
|
@@ -12814,6 +12835,8 @@ static void __bnx2x_remove(struct pci_dev *pdev,
|
|
|
rtnl_unlock();
|
|
|
}
|
|
|
|
|
|
+ bnx2x_iov_remove_one(bp);
|
|
|
+
|
|
|
/* Power on: we can't let PCI layer write to us while we are in D3 */
|
|
|
if (IS_PF(bp))
|
|
|
bnx2x_set_power_state(bp, PCI_D0);
|
|
@@ -12828,8 +12851,6 @@ static void __bnx2x_remove(struct pci_dev *pdev,
|
|
|
/* Make sure RESET task is not scheduled before continuing */
|
|
|
cancel_delayed_work_sync(&bp->sp_rtnl_task);
|
|
|
|
|
|
- bnx2x_iov_remove_one(bp);
|
|
|
-
|
|
|
/* send message via vfpf channel to release the resources of this vf */
|
|
|
if (IS_VF(bp))
|
|
|
bnx2x_vfpf_release(bp);
|