X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fsfc%2Fsfc.c;h=390823a8c8c18fde75c7c18364109f4e8a9b4a0c;hb=2fd826a301b5a872cad0b67c807d3011693321c7;hp=457a53eebcef550b9d00be27af61b9e7cf2684e6;hpb=2a5a433ba5f40534c6e05eca3957ac85c79ef758;p=dpdk.git diff --git a/drivers/net/sfc/sfc.c b/drivers/net/sfc/sfc.c index 457a53eebc..390823a8c8 100644 --- a/drivers/net/sfc/sfc.c +++ b/drivers/net/sfc/sfc.c @@ -1,5 +1,7 @@ /*- - * Copyright (c) 2016 Solarflare Communications Inc. + * BSD LICENSE + * + * Copyright (c) 2016-2017 Solarflare Communications Inc. * All rights reserved. * * This software was jointly developed between OKTET Labs (under contract @@ -59,7 +61,7 @@ sfc_dma_alloc(const struct sfc_adapter *sa, const char *name, uint16_t id, return ENOMEM; } - esmp->esm_addr = rte_mem_phy2mch(mz->memseg_id, mz->phys_addr); + esmp->esm_addr = mz->phys_addr; if (esmp->esm_addr == RTE_BAD_PHYS_ADDR) { (void)rte_memzone_free(mz); return EFAULT; @@ -203,6 +205,13 @@ sfc_estimate_resource_limits(struct sfc_adapter *sa) limits.edl_max_txq_count = MIN(encp->enc_txq_limit, limits.edl_max_evq_count - 1 - limits.edl_max_rxq_count); + + if (sa->tso) + limits.edl_max_txq_count = + MIN(limits.edl_max_txq_count, + encp->enc_fw_assisted_tso_v2_n_contexts / + encp->enc_hw_pf_count); + SFC_ASSERT(limits.edl_max_txq_count >= limits.edl_min_rxq_count); /* Configure the minimum required resources needed for the @@ -313,10 +322,17 @@ sfc_start(struct sfc_adapter *sa) if (rc != 0) goto fail_tx_start; + rc = sfc_flow_start(sa); + if (rc != 0) + goto fail_flows_insert; + sa->state = SFC_ADAPTER_STARTED; sfc_log_init(sa, "done"); return 0; +fail_flows_insert: + sfc_tx_stop(sa); + fail_tx_start: sfc_rx_stop(sa); @@ -361,6 +377,7 @@ sfc_stop(struct sfc_adapter *sa) sa->state = SFC_ADAPTER_STOPPING; + sfc_flow_stop(sa); sfc_tx_stop(sa); sfc_rx_stop(sa); sfc_port_stop(sa); @@ -381,50 +398,44 @@ sfc_configure(struct sfc_adapter *sa) SFC_ASSERT(sfc_adapter_is_locked(sa)); - SFC_ASSERT(sa->state == SFC_ADAPTER_INITIALIZED); + SFC_ASSERT(sa->state == SFC_ADAPTER_INITIALIZED || + sa->state == SFC_ADAPTER_CONFIGURED); sa->state = SFC_ADAPTER_CONFIGURING; rc = sfc_check_conf(sa); if (rc != 0) goto fail_check_conf; - rc = sfc_intr_init(sa); + rc = sfc_intr_configure(sa); if (rc != 0) - goto fail_intr_init; + goto fail_intr_configure; - rc = sfc_ev_init(sa); + rc = sfc_port_configure(sa); if (rc != 0) - goto fail_ev_init; + goto fail_port_configure; - rc = sfc_port_init(sa); + rc = sfc_rx_configure(sa); if (rc != 0) - goto fail_port_init; + goto fail_rx_configure; - rc = sfc_rx_init(sa); + rc = sfc_tx_configure(sa); if (rc != 0) - goto fail_rx_init; - - rc = sfc_tx_init(sa); - if (rc != 0) - goto fail_tx_init; + goto fail_tx_configure; sa->state = SFC_ADAPTER_CONFIGURED; sfc_log_init(sa, "done"); return 0; -fail_tx_init: - sfc_rx_fini(sa); - -fail_rx_init: - sfc_port_fini(sa); +fail_tx_configure: + sfc_rx_close(sa); -fail_port_init: - sfc_ev_fini(sa); +fail_rx_configure: + sfc_port_close(sa); -fail_ev_init: - sfc_intr_fini(sa); +fail_port_configure: + sfc_intr_close(sa); -fail_intr_init: +fail_intr_configure: fail_check_conf: sa->state = SFC_ADAPTER_INITIALIZED; sfc_log_init(sa, "failed %d", rc); @@ -441,11 +452,10 @@ sfc_close(struct sfc_adapter *sa) SFC_ASSERT(sa->state == SFC_ADAPTER_CONFIGURED); sa->state = SFC_ADAPTER_CLOSING; - sfc_tx_fini(sa); - sfc_rx_fini(sa); - sfc_port_fini(sa); - sfc_ev_fini(sa); - sfc_intr_fini(sa); + sfc_tx_close(sa); + sfc_rx_close(sa); + sfc_port_close(sa); + sfc_intr_close(sa); sa->state = SFC_ADAPTER_INITIALIZED; sfc_log_init(sa, "done"); @@ -455,7 +465,7 @@ static int sfc_mem_bar_init(struct sfc_adapter *sa) { struct rte_eth_dev *eth_dev = sa->eth_dev; - struct rte_pci_device *pci_dev = SFC_DEV_TO_PCI(eth_dev); + struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); efsys_bar_t *ebp = &sa->mem_bar; unsigned int i; struct rte_mem_resource *res; @@ -491,7 +501,7 @@ sfc_mem_bar_fini(struct sfc_adapter *sa) * and also known to give a uniform distribution * (a good distribution of traffic between different CPUs) */ -static const uint8_t default_rss_key[SFC_RSS_KEY_SIZE] = { +static const uint8_t default_rss_key[EFX_RSS_KEY_SIZE] = { 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, @@ -500,10 +510,10 @@ static const uint8_t default_rss_key[SFC_RSS_KEY_SIZE] = { }; #endif +#if EFSYS_OPT_RX_SCALE static int sfc_set_rss_defaults(struct sfc_adapter *sa) { -#if EFSYS_OPT_RX_SCALE int rc; rc = efx_intr_init(sa->nic, sa->intr.type, NULL); @@ -518,11 +528,11 @@ sfc_set_rss_defaults(struct sfc_adapter *sa) if (rc != 0) goto fail_rx_init; - rc = efx_rx_scale_support_get(sa->nic, &sa->rss_support); + rc = efx_rx_scale_default_support_get(sa->nic, &sa->rss_support); if (rc != 0) goto fail_scale_support_get; - rc = efx_rx_hash_support_get(sa->nic, &sa->hash_support); + rc = efx_rx_hash_default_support_get(sa->nic, &sa->hash_support); if (rc != 0) goto fail_hash_support_get; @@ -546,54 +556,26 @@ fail_ev_init: fail_intr_init: return rc; +} #else +static int +sfc_set_rss_defaults(__rte_unused struct sfc_adapter *sa) +{ return 0; -#endif } +#endif int sfc_attach(struct sfc_adapter *sa) { - struct rte_pci_device *pci_dev = SFC_DEV_TO_PCI(sa->eth_dev); const efx_nic_cfg_t *encp; - efx_nic_t *enp; + efx_nic_t *enp = sa->nic; int rc; sfc_log_init(sa, "entry"); SFC_ASSERT(sfc_adapter_is_locked(sa)); - sa->socket_id = rte_socket_id(); - - sfc_log_init(sa, "init mem bar"); - rc = sfc_mem_bar_init(sa); - if (rc != 0) - goto fail_mem_bar_init; - - sfc_log_init(sa, "get family"); - rc = efx_family(pci_dev->id.vendor_id, pci_dev->id.device_id, - &sa->family); - if (rc != 0) - goto fail_family; - sfc_log_init(sa, "family is %u", sa->family); - - sfc_log_init(sa, "create nic"); - rte_spinlock_init(&sa->nic_lock); - rc = efx_nic_create(sa->family, (efsys_identifier_t *)sa, - &sa->mem_bar, &sa->nic_lock, &enp); - if (rc != 0) - goto fail_nic_create; - sa->nic = enp; - - rc = sfc_mcdi_init(sa); - if (rc != 0) - goto fail_mcdi_init; - - sfc_log_init(sa, "probe nic"); - rc = efx_nic_probe(enp); - if (rc != 0) - goto fail_nic_probe; - efx_mcdi_new_epoch(enp); sfc_log_init(sa, "reset nic"); @@ -601,12 +583,20 @@ sfc_attach(struct sfc_adapter *sa) if (rc != 0) goto fail_nic_reset; + encp = efx_nic_cfg_get(sa->nic); + + if (sa->dp_tx->features & SFC_DP_TX_FEAT_TSO) { + sa->tso = encp->enc_fw_assisted_tso_v2_enabled; + if (!sa->tso) + sfc_warn(sa, + "TSO support isn't available on this adapter"); + } + sfc_log_init(sa, "estimate resource limits"); rc = sfc_estimate_resource_limits(sa); if (rc != 0) goto fail_estimate_rsrc_limits; - encp = efx_nic_cfg_get(sa->nic); sa->txq_max_entries = encp->enc_txq_max_ndescs; SFC_ASSERT(rte_is_power_of_2(sa->txq_max_entries)); @@ -614,26 +604,40 @@ sfc_attach(struct sfc_adapter *sa) if (rc != 0) goto fail_intr_attach; - efx_phy_adv_cap_get(sa->nic, EFX_PHY_CAP_PERM, - &sa->port.phy_adv_cap_mask); + rc = sfc_ev_attach(sa); + if (rc != 0) + goto fail_ev_attach; + + rc = sfc_port_attach(sa); + if (rc != 0) + goto fail_port_attach; rc = sfc_set_rss_defaults(sa); if (rc != 0) goto fail_set_rss_defaults; - sa->tso = efx_nic_cfg_get(sa->nic)->enc_fw_assisted_tso_v2_enabled; - if (!sa->tso) - sfc_warn(sa, "TSO support isn't available on this adapter"); + rc = sfc_filter_attach(sa); + if (rc != 0) + goto fail_filter_attach; sfc_log_init(sa, "fini nic"); efx_nic_fini(enp); + sfc_flow_init(sa); + sa->state = SFC_ADAPTER_INITIALIZED; sfc_log_init(sa, "done"); return 0; +fail_filter_attach: fail_set_rss_defaults: + sfc_port_detach(sa); + +fail_port_attach: + sfc_ev_detach(sa); + +fail_ev_attach: sfc_intr_detach(sa); fail_intr_attach: @@ -641,8 +645,72 @@ fail_intr_attach: fail_estimate_rsrc_limits: fail_nic_reset: - sfc_log_init(sa, "unprobe nic"); - efx_nic_unprobe(enp); + + sfc_log_init(sa, "failed %d", rc); + return rc; +} + +void +sfc_detach(struct sfc_adapter *sa) +{ + sfc_log_init(sa, "entry"); + + SFC_ASSERT(sfc_adapter_is_locked(sa)); + + sfc_flow_fini(sa); + + sfc_filter_detach(sa); + sfc_port_detach(sa); + sfc_ev_detach(sa); + sfc_intr_detach(sa); + + sa->state = SFC_ADAPTER_UNINITIALIZED; +} + +int +sfc_probe(struct sfc_adapter *sa) +{ + struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(sa->eth_dev); + efx_nic_t *enp; + int rc; + + sfc_log_init(sa, "entry"); + + SFC_ASSERT(sfc_adapter_is_locked(sa)); + + sa->socket_id = rte_socket_id(); + + sfc_log_init(sa, "init mem bar"); + rc = sfc_mem_bar_init(sa); + if (rc != 0) + goto fail_mem_bar_init; + + sfc_log_init(sa, "get family"); + rc = efx_family(pci_dev->id.vendor_id, pci_dev->id.device_id, + &sa->family); + if (rc != 0) + goto fail_family; + sfc_log_init(sa, "family is %u", sa->family); + + sfc_log_init(sa, "create nic"); + rte_spinlock_init(&sa->nic_lock); + rc = efx_nic_create(sa->family, (efsys_identifier_t *)sa, + &sa->mem_bar, &sa->nic_lock, &enp); + if (rc != 0) + goto fail_nic_create; + sa->nic = enp; + + rc = sfc_mcdi_init(sa); + if (rc != 0) + goto fail_mcdi_init; + + sfc_log_init(sa, "probe nic"); + rc = efx_nic_probe(enp); + if (rc != 0) + goto fail_nic_probe; + + sfc_log_init(sa, "done"); + return 0; fail_nic_probe: sfc_mcdi_fini(sa); @@ -662,7 +730,7 @@ fail_mem_bar_init: } void -sfc_detach(struct sfc_adapter *sa) +sfc_unprobe(struct sfc_adapter *sa) { efx_nic_t *enp = sa->nic; @@ -670,8 +738,6 @@ sfc_detach(struct sfc_adapter *sa) SFC_ASSERT(sfc_adapter_is_locked(sa)); - sfc_intr_detach(sa); - sfc_log_init(sa, "unprobe nic"); efx_nic_unprobe(enp); @@ -683,5 +749,6 @@ sfc_detach(struct sfc_adapter *sa) sfc_mem_bar_fini(sa); + sfc_flow_fini(sa); sa->state = SFC_ADAPTER_UNINITIALIZED; }