X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fcxgbe%2Fcxgbe_main.c;h=6dd1bf1f836eaf2fd0452240ff1cef92d3b50b92;hb=1c9e61b3a45321b3cae742e8769b10c06c0324f0;hp=83ad758e8863e99d225c740955dfbbf978addbd7;hpb=df96fd0d73955bdc7ca3909e772ff2ad903249c6;p=dpdk.git diff --git a/drivers/net/cxgbe/cxgbe_main.c b/drivers/net/cxgbe/cxgbe_main.c index 83ad758e88..6dd1bf1f83 100644 --- a/drivers/net/cxgbe/cxgbe_main.c +++ b/drivers/net/cxgbe/cxgbe_main.c @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include @@ -417,13 +416,15 @@ void cxgbe_remove_tid(struct tid_info *t, unsigned int chan, unsigned int tid, if (t->tid_tab[tid]) { t->tid_tab[tid] = NULL; - rte_atomic32_dec(&t->conns_in_use); + __atomic_sub_fetch(&t->conns_in_use, 1, __ATOMIC_RELAXED); if (t->hash_base && tid >= t->hash_base) { if (family == FILTER_TYPE_IPV4) - rte_atomic32_dec(&t->hash_tids_in_use); + __atomic_sub_fetch(&t->hash_tids_in_use, 1, + __ATOMIC_RELAXED); } else { if (family == FILTER_TYPE_IPV4) - rte_atomic32_dec(&t->tids_in_use); + __atomic_sub_fetch(&t->tids_in_use, 1, + __ATOMIC_RELAXED); } } @@ -445,13 +446,15 @@ void cxgbe_insert_tid(struct tid_info *t, void *data, unsigned int tid, t->tid_tab[tid] = data; if (t->hash_base && tid >= t->hash_base) { if (family == FILTER_TYPE_IPV4) - rte_atomic32_inc(&t->hash_tids_in_use); + __atomic_add_fetch(&t->hash_tids_in_use, 1, + __ATOMIC_RELAXED); } else { if (family == FILTER_TYPE_IPV4) - rte_atomic32_inc(&t->tids_in_use); + __atomic_add_fetch(&t->tids_in_use, 1, + __ATOMIC_RELAXED); } - rte_atomic32_inc(&t->conns_in_use); + __atomic_add_fetch(&t->conns_in_use, 1, __ATOMIC_RELAXED); } /** @@ -504,10 +507,8 @@ static int tid_init(struct tid_info *t) t->afree = NULL; t->atids_in_use = 0; - rte_atomic32_init(&t->tids_in_use); - rte_atomic32_set(&t->tids_in_use, 0); - rte_atomic32_init(&t->conns_in_use); - rte_atomic32_set(&t->conns_in_use, 0); + t->tids_in_use = 0; + t->conns_in_use = 0; /* Setup the free list for atid_tab and clear the stid bitmap. */ if (natids) { @@ -1496,6 +1497,24 @@ static int adap_init0(struct adapter *adap) else adap->params.max_tx_coalesce_num = ETH_COALESCE_PKT_NUM; + params[0] = CXGBE_FW_PARAM_DEV(VI_ENABLE_INGRESS_AFTER_LINKUP); + ret = t4_query_params(adap, adap->mbox, adap->pf, 0, 1, params, val); + adap->params.vi_enable_rx = (ret == 0 && val[0] != 0); + + /* Read the RAW MPS entries. In T6, the last 2 TCAM entries + * are reserved for RAW MAC addresses (rawf = 2, one per port). + */ + if (CHELSIO_CHIP_VERSION(adap->params.chip) > CHELSIO_T5) { + params[0] = CXGBE_FW_PARAM_PFVF(RAWF_START); + params[1] = CXGBE_FW_PARAM_PFVF(RAWF_END); + ret = t4_query_params(adap, adap->mbox, adap->pf, 0, 2, + params, val); + if (ret == 0) { + adap->params.rawf_start = val[0]; + adap->params.rawf_size = val[1] - val[0] + 1; + } + } + /* * The MTU/MSS Table is initialized by now, so load their values. If * we're initializing the adapter, then we'll make any modifications @@ -1594,6 +1613,33 @@ void t4_os_portmod_changed(const struct adapter *adap, int port_id) pi->port_id, pi->link_cfg.mod_type); } +void t4_os_link_changed(struct adapter *adap, int port_id) +{ + struct port_info *pi = adap2pinfo(adap, port_id); + + /* If link status has not changed or if firmware doesn't + * support enabling/disabling VI's Rx path during runtime, + * then return. + */ + if (adap->params.vi_enable_rx == 0 || + pi->vi_en_rx == pi->link_cfg.link_ok) + return; + + /* Don't enable VI Rx path, if link has been administratively + * turned off. + */ + if (pi->vi_en_tx == 0 && pi->vi_en_rx == 0) + return; + + /* When link goes down, disable the port's Rx path to drop + * Rx traffic closer to the wire, instead of processing it + * further in the Rx pipeline. The Rx path will be re-enabled + * once the link up message comes in firmware event queue. + */ + pi->vi_en_rx = pi->link_cfg.link_ok; + t4_enable_vi(adap, adap->mbox, pi->viid, pi->vi_en_rx, pi->vi_en_tx); +} + bool cxgbe_force_linkup(struct adapter *adap) { if (is_pf4(adap)) @@ -1638,15 +1684,14 @@ int cxgbe_link_start(struct port_info *pi) if (ret == 0 && is_pf4(adapter)) ret = t4_link_l1cfg(pi, pi->link_cfg.admin_caps); if (ret == 0) { - /* - * Enabling a Virtual Interface can result in an interrupt - * during the processing of the VI Enable command and, in some - * paths, result in an attempt to issue another command in the - * interrupt context. Thus, we disable interrupts during the - * course of the VI Enable command ... + /* Disable VI Rx until link up message is received in + * firmware event queue, if firmware supports enabling/ + * disabling VI Rx at runtime. */ + pi->vi_en_rx = adapter->params.vi_enable_rx ? 0 : 1; + pi->vi_en_tx = 1; ret = t4_enable_vi_params(adapter, adapter->mbox, pi->viid, - true, true, false); + pi->vi_en_rx, pi->vi_en_tx, false); } if (ret == 0 && cxgbe_force_linkup(adapter)) @@ -1923,7 +1968,13 @@ int cxgbe_set_link_status(struct port_info *pi, bool status) struct adapter *adapter = pi->adapter; int err = 0; - err = t4_enable_vi(adapter, adapter->mbox, pi->viid, status, status); + /* Wait for link up message from firmware to enable Rx path, + * if firmware supports enabling/disabling VI Rx at runtime. + */ + pi->vi_en_rx = adapter->params.vi_enable_rx ? 0 : status; + pi->vi_en_tx = status; + err = t4_enable_vi(adapter, adapter->mbox, pi->viid, pi->vi_en_rx, + pi->vi_en_tx); if (err) { dev_err(adapter, "%s: disable_vi failed: %d\n", __func__, err); return err;