|
@@ -2517,6 +2517,20 @@ static void bnx2x_bz_fp(struct bnx2x *bp, int index)
|
|
fp->mode = TPA_MODE_DISABLED;
|
|
fp->mode = TPA_MODE_DISABLED;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void bnx2x_set_os_driver_state(struct bnx2x *bp, u32 state)
|
|
|
|
+{
|
|
|
|
+ u32 cur;
|
|
|
|
+
|
|
|
|
+ if (!IS_MF_BD(bp) || !SHMEM2_HAS(bp, os_driver_state) || IS_VF(bp))
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ cur = SHMEM2_RD(bp, os_driver_state[BP_FW_MB_IDX(bp)]);
|
|
|
|
+ DP(NETIF_MSG_IFUP, "Driver state %08x-->%08x\n",
|
|
|
|
+ cur, state);
|
|
|
|
+
|
|
|
|
+ SHMEM2_WR(bp, os_driver_state[BP_FW_MB_IDX(bp)], state);
|
|
|
|
+}
|
|
|
|
+
|
|
int bnx2x_load_cnic(struct bnx2x *bp)
|
|
int bnx2x_load_cnic(struct bnx2x *bp)
|
|
{
|
|
{
|
|
int i, rc, port = BP_PORT(bp);
|
|
int i, rc, port = BP_PORT(bp);
|
|
@@ -2880,6 +2894,8 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
|
|
/* mark driver is loaded in shmem2 */
|
|
/* mark driver is loaded in shmem2 */
|
|
u32 val;
|
|
u32 val;
|
|
val = SHMEM2_RD(bp, drv_capabilities_flag[BP_FW_MB_IDX(bp)]);
|
|
val = SHMEM2_RD(bp, drv_capabilities_flag[BP_FW_MB_IDX(bp)]);
|
|
|
|
+ val &= ~DRV_FLAGS_MTU_MASK;
|
|
|
|
+ val |= (bp->dev->mtu << DRV_FLAGS_MTU_SHIFT);
|
|
SHMEM2_WR(bp, drv_capabilities_flag[BP_FW_MB_IDX(bp)],
|
|
SHMEM2_WR(bp, drv_capabilities_flag[BP_FW_MB_IDX(bp)],
|
|
val | DRV_FLAGS_CAPABILITIES_LOADED_SUPPORTED |
|
|
val | DRV_FLAGS_CAPABILITIES_LOADED_SUPPORTED |
|
|
DRV_FLAGS_CAPABILITIES_LOADED_L2);
|
|
DRV_FLAGS_CAPABILITIES_LOADED_L2);
|
|
@@ -2896,6 +2912,9 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
|
|
if (bp->port.pmf && (bp->state != BNX2X_STATE_DIAG))
|
|
if (bp->port.pmf && (bp->state != BNX2X_STATE_DIAG))
|
|
bnx2x_dcbx_init(bp, false);
|
|
bnx2x_dcbx_init(bp, false);
|
|
|
|
|
|
|
|
+ if (!IS_MF_SD_STORAGE_PERSONALITY_ONLY(bp))
|
|
|
|
+ bnx2x_set_os_driver_state(bp, OS_DRIVER_STATE_ACTIVE);
|
|
|
|
+
|
|
DP(NETIF_MSG_IFUP, "Ending successfully NIC load\n");
|
|
DP(NETIF_MSG_IFUP, "Ending successfully NIC load\n");
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
@@ -2963,6 +2982,9 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode, bool keep_link)
|
|
|
|
|
|
DP(NETIF_MSG_IFUP, "Starting NIC unload\n");
|
|
DP(NETIF_MSG_IFUP, "Starting NIC unload\n");
|
|
|
|
|
|
|
|
+ if (!IS_MF_SD_STORAGE_PERSONALITY_ONLY(bp))
|
|
|
|
+ bnx2x_set_os_driver_state(bp, OS_DRIVER_STATE_DISABLED);
|
|
|
|
+
|
|
/* mark driver is unloaded in shmem2 */
|
|
/* mark driver is unloaded in shmem2 */
|
|
if (IS_PF(bp) && SHMEM2_HAS(bp, drv_capabilities_flag)) {
|
|
if (IS_PF(bp) && SHMEM2_HAS(bp, drv_capabilities_flag)) {
|
|
u32 val;
|
|
u32 val;
|
|
@@ -4191,6 +4213,41 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
return NETDEV_TX_OK;
|
|
return NETDEV_TX_OK;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void bnx2x_get_c2s_mapping(struct bnx2x *bp, u8 *c2s_map, u8 *c2s_default)
|
|
|
|
+{
|
|
|
|
+ int mfw_vn = BP_FW_MB_IDX(bp);
|
|
|
|
+ u32 tmp;
|
|
|
|
+
|
|
|
|
+ /* If the shmem shouldn't affect configuration, reflect */
|
|
|
|
+ if (!IS_MF_BD(bp)) {
|
|
|
|
+ int i;
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < BNX2X_MAX_PRIORITY; i++)
|
|
|
|
+ c2s_map[i] = i;
|
|
|
|
+ *c2s_default = 0;
|
|
|
|
+
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ tmp = SHMEM2_RD(bp, c2s_pcp_map_lower[mfw_vn]);
|
|
|
|
+ tmp = (__force u32)be32_to_cpu((__force __be32)tmp);
|
|
|
|
+ c2s_map[0] = tmp & 0xff;
|
|
|
|
+ c2s_map[1] = (tmp >> 8) & 0xff;
|
|
|
|
+ c2s_map[2] = (tmp >> 16) & 0xff;
|
|
|
|
+ c2s_map[3] = (tmp >> 24) & 0xff;
|
|
|
|
+
|
|
|
|
+ tmp = SHMEM2_RD(bp, c2s_pcp_map_upper[mfw_vn]);
|
|
|
|
+ tmp = (__force u32)be32_to_cpu((__force __be32)tmp);
|
|
|
|
+ c2s_map[4] = tmp & 0xff;
|
|
|
|
+ c2s_map[5] = (tmp >> 8) & 0xff;
|
|
|
|
+ c2s_map[6] = (tmp >> 16) & 0xff;
|
|
|
|
+ c2s_map[7] = (tmp >> 24) & 0xff;
|
|
|
|
+
|
|
|
|
+ tmp = SHMEM2_RD(bp, c2s_pcp_map_default[mfw_vn]);
|
|
|
|
+ tmp = (__force u32)be32_to_cpu((__force __be32)tmp);
|
|
|
|
+ *c2s_default = (tmp >> (8 * mfw_vn)) & 0xff;
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* bnx2x_setup_tc - routine to configure net_device for multi tc
|
|
* bnx2x_setup_tc - routine to configure net_device for multi tc
|
|
*
|
|
*
|
|
@@ -4201,8 +4258,9 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
*/
|
|
*/
|
|
int bnx2x_setup_tc(struct net_device *dev, u8 num_tc)
|
|
int bnx2x_setup_tc(struct net_device *dev, u8 num_tc)
|
|
{
|
|
{
|
|
- int cos, prio, count, offset;
|
|
|
|
struct bnx2x *bp = netdev_priv(dev);
|
|
struct bnx2x *bp = netdev_priv(dev);
|
|
|
|
+ u8 c2s_map[BNX2X_MAX_PRIORITY], c2s_def;
|
|
|
|
+ int cos, prio, count, offset;
|
|
|
|
|
|
/* setup tc must be called under rtnl lock */
|
|
/* setup tc must be called under rtnl lock */
|
|
ASSERT_RTNL();
|
|
ASSERT_RTNL();
|
|
@@ -4226,12 +4284,16 @@ int bnx2x_setup_tc(struct net_device *dev, u8 num_tc)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ bnx2x_get_c2s_mapping(bp, c2s_map, &c2s_def);
|
|
|
|
+
|
|
/* configure priority to traffic class mapping */
|
|
/* configure priority to traffic class mapping */
|
|
for (prio = 0; prio < BNX2X_MAX_PRIORITY; prio++) {
|
|
for (prio = 0; prio < BNX2X_MAX_PRIORITY; prio++) {
|
|
- netdev_set_prio_tc_map(dev, prio, bp->prio_to_cos[prio]);
|
|
|
|
|
|
+ int outer_prio = c2s_map[prio];
|
|
|
|
+
|
|
|
|
+ netdev_set_prio_tc_map(dev, prio, bp->prio_to_cos[outer_prio]);
|
|
DP(BNX2X_MSG_SP | NETIF_MSG_IFUP,
|
|
DP(BNX2X_MSG_SP | NETIF_MSG_IFUP,
|
|
"mapping priority %d to tc %d\n",
|
|
"mapping priority %d to tc %d\n",
|
|
- prio, bp->prio_to_cos[prio]);
|
|
|
|
|
|
+ outer_prio, bp->prio_to_cos[outer_prio]);
|
|
}
|
|
}
|
|
|
|
|
|
/* Use this configuration to differentiate tc0 from other COSes
|
|
/* Use this configuration to differentiate tc0 from other COSes
|
|
@@ -4285,6 +4347,9 @@ int bnx2x_change_mac_addr(struct net_device *dev, void *p)
|
|
if (netif_running(dev))
|
|
if (netif_running(dev))
|
|
rc = bnx2x_set_eth_mac(bp, true);
|
|
rc = bnx2x_set_eth_mac(bp, true);
|
|
|
|
|
|
|
|
+ if (IS_PF(bp) && SHMEM2_HAS(bp, curr_cfg))
|
|
|
|
+ SHMEM2_WR(bp, curr_cfg, CURR_CFG_MET_OS);
|
|
|
|
+
|
|
return rc;
|
|
return rc;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -4838,6 +4903,9 @@ int bnx2x_change_mtu(struct net_device *dev, int new_mtu)
|
|
*/
|
|
*/
|
|
dev->mtu = new_mtu;
|
|
dev->mtu = new_mtu;
|
|
|
|
|
|
|
|
+ if (IS_PF(bp) && SHMEM2_HAS(bp, curr_cfg))
|
|
|
|
+ SHMEM2_WR(bp, curr_cfg, CURR_CFG_MET_OS);
|
|
|
|
+
|
|
return bnx2x_reload_if_running(dev);
|
|
return bnx2x_reload_if_running(dev);
|
|
}
|
|
}
|
|
|
|
|