65
66
static DEFINE_RWLOCK(cnic_dev_lock);
66
67
static DEFINE_MUTEX(cnic_lock);
68
static struct cnic_ulp_ops *cnic_ulp_tbl[MAX_CNIC_ULP_TYPE];
69
static struct cnic_ulp_ops __rcu *cnic_ulp_tbl[MAX_CNIC_ULP_TYPE];
71
/* helper function, assuming cnic_lock is held */
72
static inline struct cnic_ulp_ops *cnic_ulp_tbl_prot(int type)
74
return rcu_dereference_protected(cnic_ulp_tbl[type],
75
lockdep_is_held(&cnic_lock));
70
78
static int cnic_service_bnx2(void *, void *);
71
79
static int cnic_service_bnx2x(void *, void *);
2970
static void cnic_ulp_stop_one(struct cnic_local *cp, int if_type)
2972
struct cnic_ulp_ops *ulp_ops;
2974
if (if_type == CNIC_ULP_ISCSI)
2975
cnic_send_nlmsg(cp, ISCSI_KEVENT_IF_DOWN, NULL);
2977
mutex_lock(&cnic_lock);
2978
ulp_ops = rcu_dereference_protected(cp->ulp_ops[if_type],
2979
lockdep_is_held(&cnic_lock));
2981
mutex_unlock(&cnic_lock);
2984
set_bit(ULP_F_CALL_PENDING, &cp->ulp_flags[if_type]);
2985
mutex_unlock(&cnic_lock);
2987
if (test_and_clear_bit(ULP_F_START, &cp->ulp_flags[if_type]))
2988
ulp_ops->cnic_stop(cp->ulp_handle[if_type]);
2990
clear_bit(ULP_F_CALL_PENDING, &cp->ulp_flags[if_type]);
2962
2993
static void cnic_ulp_stop(struct cnic_dev *dev)
2964
2995
struct cnic_local *cp = dev->cnic_priv;
2967
cnic_send_nlmsg(cp, ISCSI_KEVENT_IF_DOWN, NULL);
2969
for (if_type = 0; if_type < MAX_CNIC_ULP_TYPE; if_type++) {
2970
struct cnic_ulp_ops *ulp_ops;
2972
mutex_lock(&cnic_lock);
2973
ulp_ops = cp->ulp_ops[if_type];
2975
mutex_unlock(&cnic_lock);
2978
set_bit(ULP_F_CALL_PENDING, &cp->ulp_flags[if_type]);
2979
mutex_unlock(&cnic_lock);
2981
if (test_and_clear_bit(ULP_F_START, &cp->ulp_flags[if_type]))
2982
ulp_ops->cnic_stop(cp->ulp_handle[if_type]);
2984
clear_bit(ULP_F_CALL_PENDING, &cp->ulp_flags[if_type]);
2998
for (if_type = 0; if_type < MAX_CNIC_ULP_TYPE; if_type++)
2999
cnic_ulp_stop_one(cp, if_type);
2988
3002
static void cnic_ulp_start(struct cnic_dev *dev)
3418
3436
struct dst_entry **dst)
3420
3438
#if defined(CONFIG_IPV6) || (defined(CONFIG_IPV6_MODULE) && defined(MODULE))
3423
memset(&fl, 0, sizeof(fl));
3424
ipv6_addr_copy(&fl.fl6_dst, &dst_addr->sin6_addr);
3425
if (ipv6_addr_type(&fl.fl6_dst) & IPV6_ADDR_LINKLOCAL)
3426
fl.oif = dst_addr->sin6_scope_id;
3428
*dst = ip6_route_output(&init_net, NULL, &fl);
3441
memset(&fl6, 0, sizeof(fl6));
3442
ipv6_addr_copy(&fl6.daddr, &dst_addr->sin6_addr);
3443
if (ipv6_addr_type(&fl6.daddr) & IPV6_ADDR_LINKLOCAL)
3444
fl6.flowi6_oif = dst_addr->sin6_scope_id;
3446
*dst = ip6_route_output(&init_net, NULL, &fl6);
4722
4763
cp->rx_cons = *cp->rx_cons_ptr;
4725
static int cnic_read_bnx2x_iscsi_mac(struct cnic_dev *dev, u32 upper_addr,
4731
val = CNIC_RD(dev, upper_addr);
4733
mac[0] = (u8) (val >> 8);
4736
val = CNIC_RD(dev, lower_addr);
4738
mac[2] = (u8) (val >> 24);
4739
mac[3] = (u8) (val >> 16);
4740
mac[4] = (u8) (val >> 8);
4743
if (is_valid_ether_addr(mac)) {
4744
memcpy(dev->mac_addr, mac, 6);
4751
static void cnic_get_bnx2x_iscsi_info(struct cnic_dev *dev)
4753
struct cnic_local *cp = dev->cnic_priv;
4754
u32 base, base2, addr, addr1, val;
4755
int port = CNIC_PORT(cp);
4757
dev->max_iscsi_conn = 0;
4758
base = CNIC_RD(dev, MISC_REG_SHARED_MEM_ADDR);
4762
base2 = CNIC_RD(dev, (CNIC_PATH(cp) ? MISC_REG_GENERIC_CR_1 :
4763
MISC_REG_GENERIC_CR_0));
4764
addr = BNX2X_SHMEM_ADDR(base,
4765
dev_info.port_hw_config[port].iscsi_mac_upper);
4767
addr1 = BNX2X_SHMEM_ADDR(base,
4768
dev_info.port_hw_config[port].iscsi_mac_lower);
4770
cnic_read_bnx2x_iscsi_mac(dev, addr, addr1);
4772
addr = BNX2X_SHMEM_ADDR(base, validity_map[port]);
4773
val = CNIC_RD(dev, addr);
4775
if (!(val & SHR_MEM_VALIDITY_LIC_NO_KEY_IN_EFFECT)) {
4778
addr = BNX2X_SHMEM_ADDR(base,
4779
drv_lic_key[port].max_iscsi_init_conn);
4780
val16 = CNIC_RD16(dev, addr);
4784
dev->max_iscsi_conn = val16;
4787
if (BNX2X_CHIP_IS_E2(cp->chip_id))
4788
dev->max_fcoe_conn = BNX2X_FCOE_NUM_CONNECTIONS;
4790
if (BNX2X_CHIP_IS_E1H(cp->chip_id) || BNX2X_CHIP_IS_E2(cp->chip_id)) {
4791
int func = CNIC_FUNC(cp);
4794
if (BNX2X_SHMEM2_HAS(base2, mf_cfg_addr))
4795
mf_cfg_addr = CNIC_RD(dev, BNX2X_SHMEM2_ADDR(base2,
4798
mf_cfg_addr = base + BNX2X_SHMEM_MF_BLK_OFFSET;
4800
if (BNX2X_CHIP_IS_E2(cp->chip_id)) {
4801
/* Must determine if the MF is SD vs SI mode */
4802
addr = BNX2X_SHMEM_ADDR(base,
4803
dev_info.shared_feature_config.config);
4804
val = CNIC_RD(dev, addr);
4805
if ((val & SHARED_FEAT_CFG_FORCE_SF_MODE_MASK) ==
4806
SHARED_FEAT_CFG_FORCE_SF_MODE_SWITCH_INDEPT) {
4809
/* MULTI_FUNCTION_SI mode */
4810
addr = BNX2X_MF_CFG_ADDR(mf_cfg_addr,
4811
func_ext_config[func].func_cfg);
4812
val = CNIC_RD(dev, addr);
4813
if (!(val & MACP_FUNC_CFG_FLAGS_ISCSI_OFFLOAD))
4814
dev->max_iscsi_conn = 0;
4816
if (!(val & MACP_FUNC_CFG_FLAGS_FCOE_OFFLOAD))
4817
dev->max_fcoe_conn = 0;
4819
addr = BNX2X_MF_CFG_ADDR(mf_cfg_addr,
4820
func_ext_config[func].
4821
iscsi_mac_addr_upper);
4822
addr1 = BNX2X_MF_CFG_ADDR(mf_cfg_addr,
4823
func_ext_config[func].
4824
iscsi_mac_addr_lower);
4825
rc = cnic_read_bnx2x_iscsi_mac(dev, addr,
4828
dev->max_iscsi_conn = 0;
4834
addr = BNX2X_MF_CFG_ADDR(mf_cfg_addr,
4835
func_mf_config[func].e1hov_tag);
4837
val = CNIC_RD(dev, addr);
4838
val &= FUNC_MF_CFG_E1HOV_TAG_MASK;
4839
if (val != FUNC_MF_CFG_E1HOV_TAG_DEFAULT) {
4840
dev->max_fcoe_conn = 0;
4841
dev->max_iscsi_conn = 0;
4844
if (!is_valid_ether_addr(dev->mac_addr))
4845
dev->max_iscsi_conn = 0;
4848
4766
static void cnic_init_bnx2x_kcq(struct cnic_dev *dev)
4850
4768
struct cnic_local *cp = dev->cnic_priv;