X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fsfc%2Fsfc_ethdev.c;h=fadcdb56a49dc679fa19d49546dd930cb37415a4;hb=6d13ea8e8e49ab957deae2bba5ecf4a4bfe747d1;hp=6c33601e7330c1736b6cf6fb32cc111337be045f;hpb=07685524c94af5068953c2e9e2356b00939ca343;p=dpdk.git diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c index 6c33601e73..fadcdb56a4 100644 --- a/drivers/net/sfc/sfc_ethdev.c +++ b/drivers/net/sfc/sfc_ethdev.c @@ -14,6 +14,7 @@ #include #include #include +#include #include "efx.h" @@ -92,6 +93,9 @@ sfc_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) sfc_log_init(sa, "entry"); + dev_info->min_mtu = ETHER_MIN_MTU; + dev_info->max_mtu = EFX_MAC_SDU_MAX; + dev_info->max_rx_pktlen = EFX_MAC_PDU_MAX; /* Autonegotiation may be disabled */ @@ -861,6 +865,34 @@ fail_inval: return -rc; } +static int +sfc_check_scatter_on_all_rx_queues(struct sfc_adapter *sa, size_t pdu) +{ + struct sfc_adapter_shared * const sas = sfc_sa2shared(sa); + const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic); + boolean_t scatter_enabled; + const char *error; + unsigned int i; + + for (i = 0; i < sas->rxq_count; i++) { + if ((sas->rxq_info[i].state & SFC_RXQ_INITIALIZED) == 0) + continue; + + scatter_enabled = (sas->rxq_info[i].type_flags & + EFX_RXQ_FLAG_SCATTER); + + if (!sfc_rx_check_scatter(pdu, sa->rxq_ctrl[i].buf_size, + encp->enc_rx_prefix_size, + scatter_enabled, &error)) { + sfc_err(sa, "MTU check for RxQ %u failed: %s", i, + error); + return EINVAL; + } + } + + return 0; +} + static int sfc_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu) { @@ -887,6 +919,10 @@ sfc_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu) sfc_adapter_lock(sa); + rc = sfc_check_scatter_on_all_rx_queues(sa, pdu); + if (rc != 0) + goto fail_check_scatter; + if (pdu != sa->port.pdu) { if (sa->state == SFC_ADAPTER_STARTED) { sfc_stop(sa); @@ -923,6 +959,8 @@ fail_start: sfc_err(sa, "cannot start with neither new (%u) nor old (%u) " "PDU max size - port is stopped", (unsigned int)pdu, (unsigned int)old_pdu); + +fail_check_scatter: sfc_adapter_unlock(sa); fail_inval: @@ -931,12 +969,12 @@ fail_inval: return -rc; } static int -sfc_mac_addr_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr) +sfc_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr) { struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev); const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic); struct sfc_port *port = &sa->port; - struct ether_addr *old_addr = &dev->data->mac_addrs[0]; + struct rte_ether_addr *old_addr = &dev->data->mac_addrs[0]; int rc = 0; sfc_adapter_lock(sa); @@ -1015,8 +1053,8 @@ unlock: static int -sfc_set_mc_addr_list(struct rte_eth_dev *dev, struct ether_addr *mc_addr_set, - uint32_t nb_mc_addr) +sfc_set_mc_addr_list(struct rte_eth_dev *dev, + struct rte_ether_addr *mc_addr_set, uint32_t nb_mc_addr) { struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev); struct sfc_port *port = &sa->port; @@ -2015,7 +2053,7 @@ sfc_eth_dev_init(struct rte_eth_dev *dev) struct sfc_adapter *sa; int rc; const efx_nic_cfg_t *encp; - const struct ether_addr *from; + const struct rte_ether_addr *from; sfc_register_dp(); @@ -2087,7 +2125,7 @@ sfc_eth_dev_init(struct rte_eth_dev *dev) * The arguments are really reverse order in comparison to * Linux kernel. Copy from NIC config to Ethernet device data. */ - from = (const struct ether_addr *)(encp->enc_mac_addr); + from = (const struct rte_ether_addr *)(encp->enc_mac_addr); ether_addr_copy(from, &dev->data->mac_addrs[0]); sfc_adapter_unlock(sa);