mirror of
https://github.com/torvalds/linux.git
synced 2024-12-30 14:52:05 +00:00
bnx2x: Implementation for netdev->ndo_fcoe_get_wwn
Signed-off-by: Vladislav Zolotarov <vladz@broadcom.com> Signed-off-by: Eilon Greenstein <eilong@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
7ad711b49e
commit
bf61ee1467
@ -3327,6 +3327,29 @@ int bnx2x_get_link_cfg_idx(struct bnx2x *bp)
|
||||
return LINK_CONFIG_IDX(sel_phy_idx);
|
||||
}
|
||||
|
||||
#if defined(NETDEV_FCOE_WWNN) && defined(BCM_CNIC)
|
||||
int bnx2x_fcoe_get_wwn(struct net_device *dev, u64 *wwn, int type)
|
||||
{
|
||||
struct bnx2x *bp = netdev_priv(dev);
|
||||
struct cnic_eth_dev *cp = &bp->cnic_eth_dev;
|
||||
|
||||
switch (type) {
|
||||
case NETDEV_FCOE_WWNN:
|
||||
*wwn = HILO_U64(cp->fcoe_wwn_node_name_hi,
|
||||
cp->fcoe_wwn_node_name_lo);
|
||||
break;
|
||||
case NETDEV_FCOE_WWPN:
|
||||
*wwn = HILO_U64(cp->fcoe_wwn_port_name_hi,
|
||||
cp->fcoe_wwn_port_name_lo);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* called with rtnl_lock */
|
||||
int bnx2x_change_mtu(struct net_device *dev, int new_mtu)
|
||||
{
|
||||
|
@ -522,6 +522,17 @@ void bnx2x_free_mem_bp(struct bnx2x *bp);
|
||||
*/
|
||||
int bnx2x_change_mtu(struct net_device *dev, int new_mtu);
|
||||
|
||||
#if defined(BCM_CNIC) && (defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE))
|
||||
/**
|
||||
* bnx2x_fcoe_get_wwn - return the requested WWN value for this port
|
||||
*
|
||||
* @dev: net_device
|
||||
* @wwn: output buffer
|
||||
* @type: WWN type: NETDEV_FCOE_WWNN (node) or NETDEV_FCOE_WWPN (port)
|
||||
*
|
||||
*/
|
||||
int bnx2x_fcoe_get_wwn(struct net_device *dev, u64 *wwn, int type);
|
||||
#endif
|
||||
u32 bnx2x_fix_features(struct net_device *dev, u32 features);
|
||||
int bnx2x_set_features(struct net_device *dev, u32 features);
|
||||
|
||||
|
@ -9104,10 +9104,13 @@ static void __devinit bnx2x_get_port_hwinfo(struct bnx2x *bp)
|
||||
#ifdef BCM_CNIC
|
||||
static void __devinit bnx2x_get_cnic_info(struct bnx2x *bp)
|
||||
{
|
||||
int port = BP_PORT(bp);
|
||||
int func = BP_ABS_FUNC(bp);
|
||||
|
||||
u32 max_iscsi_conn = FW_ENCODE_32BIT_PATTERN ^ SHMEM_RD(bp,
|
||||
drv_lic_key[BP_PORT(bp)].max_iscsi_conn);
|
||||
drv_lic_key[port].max_iscsi_conn);
|
||||
u32 max_fcoe_conn = FW_ENCODE_32BIT_PATTERN ^ SHMEM_RD(bp,
|
||||
drv_lic_key[BP_PORT(bp)].max_fcoe_conn);
|
||||
drv_lic_key[port].max_fcoe_conn);
|
||||
|
||||
/* Get the number of maximum allowed iSCSI and FCoE connections */
|
||||
bp->cnic_eth_dev.max_iscsi_conn =
|
||||
@ -9118,11 +9121,59 @@ static void __devinit bnx2x_get_cnic_info(struct bnx2x *bp)
|
||||
(max_fcoe_conn & BNX2X_MAX_FCOE_INIT_CONN_MASK) >>
|
||||
BNX2X_MAX_FCOE_INIT_CONN_SHIFT;
|
||||
|
||||
/* Read the WWN: */
|
||||
if (!IS_MF(bp)) {
|
||||
/* Port info */
|
||||
bp->cnic_eth_dev.fcoe_wwn_port_name_hi =
|
||||
SHMEM_RD(bp,
|
||||
dev_info.port_hw_config[port].
|
||||
fcoe_wwn_port_name_upper);
|
||||
bp->cnic_eth_dev.fcoe_wwn_port_name_lo =
|
||||
SHMEM_RD(bp,
|
||||
dev_info.port_hw_config[port].
|
||||
fcoe_wwn_port_name_lower);
|
||||
|
||||
/* Node info */
|
||||
bp->cnic_eth_dev.fcoe_wwn_node_name_hi =
|
||||
SHMEM_RD(bp,
|
||||
dev_info.port_hw_config[port].
|
||||
fcoe_wwn_node_name_upper);
|
||||
bp->cnic_eth_dev.fcoe_wwn_node_name_lo =
|
||||
SHMEM_RD(bp,
|
||||
dev_info.port_hw_config[port].
|
||||
fcoe_wwn_node_name_lower);
|
||||
} else if (!IS_MF_SD(bp)) {
|
||||
u32 cfg = MF_CFG_RD(bp, func_ext_config[func].func_cfg);
|
||||
|
||||
/*
|
||||
* Read the WWN info only if the FCoE feature is enabled for
|
||||
* this function.
|
||||
*/
|
||||
if (cfg & MACP_FUNC_CFG_FLAGS_FCOE_OFFLOAD) {
|
||||
/* Port info */
|
||||
bp->cnic_eth_dev.fcoe_wwn_port_name_hi =
|
||||
MF_CFG_RD(bp, func_ext_config[func].
|
||||
fcoe_wwn_port_name_upper);
|
||||
bp->cnic_eth_dev.fcoe_wwn_port_name_lo =
|
||||
MF_CFG_RD(bp, func_ext_config[func].
|
||||
fcoe_wwn_port_name_lower);
|
||||
|
||||
/* Node info */
|
||||
bp->cnic_eth_dev.fcoe_wwn_node_name_hi =
|
||||
MF_CFG_RD(bp, func_ext_config[func].
|
||||
fcoe_wwn_node_name_upper);
|
||||
bp->cnic_eth_dev.fcoe_wwn_node_name_lo =
|
||||
MF_CFG_RD(bp, func_ext_config[func].
|
||||
fcoe_wwn_node_name_lower);
|
||||
}
|
||||
}
|
||||
|
||||
BNX2X_DEV_INFO("max_iscsi_conn 0x%x max_fcoe_conn 0x%x\n",
|
||||
bp->cnic_eth_dev.max_iscsi_conn,
|
||||
bp->cnic_eth_dev.max_fcoe_conn);
|
||||
|
||||
/* If mamimum allowed number of connections is zero -
|
||||
/*
|
||||
* If maximum allowed number of connections is zero -
|
||||
* disable the feature.
|
||||
*/
|
||||
if (!bp->cnic_eth_dev.max_iscsi_conn)
|
||||
@ -9993,6 +10044,9 @@ static const struct net_device_ops bnx2x_netdev_ops = {
|
||||
#endif
|
||||
.ndo_setup_tc = bnx2x_setup_tc,
|
||||
|
||||
#if defined(NETDEV_FCOE_WWNN) && defined(BCM_CNIC)
|
||||
.ndo_fcoe_get_wwn = bnx2x_fcoe_get_wwn,
|
||||
#endif
|
||||
};
|
||||
|
||||
static inline int bnx2x_set_coherency_mask(struct bnx2x *bp)
|
||||
|
@ -181,6 +181,11 @@ struct cnic_eth_dev {
|
||||
u32 max_fcoe_conn;
|
||||
u32 max_rdma_conn;
|
||||
u32 fcoe_init_cid;
|
||||
u32 fcoe_wwn_port_name_hi;
|
||||
u32 fcoe_wwn_port_name_lo;
|
||||
u32 fcoe_wwn_node_name_hi;
|
||||
u32 fcoe_wwn_node_name_lo;
|
||||
|
||||
u16 iscsi_l2_client_id;
|
||||
u16 iscsi_l2_cid;
|
||||
u8 iscsi_mac[ETH_ALEN];
|
||||
|
Loading…
Reference in New Issue
Block a user