X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fionic%2Fionic_ethdev.c;h=cffe899c078c870ab76128a122890f6149843f7e;hb=8ec5ad7f8028830ef46c0d57315a32d0032af9c3;hp=838e93ef75587ee7e436bcb9fbad6c97ae131e99;hpb=c3ab74fcc86911aafcaf73f7684971337b19e0e8;p=dpdk.git diff --git a/drivers/net/ionic/ionic_ethdev.c b/drivers/net/ionic/ionic_ethdev.c index 838e93ef75..cffe899c07 100644 --- a/drivers/net/ionic/ionic_ethdev.c +++ b/drivers/net/ionic/ionic_ethdev.c @@ -5,9 +5,9 @@ #include #include #include -#include +#include #include -#include +#include #include "ionic_logs.h" #include "ionic.h" @@ -70,12 +70,12 @@ static const struct rte_eth_desc_lim rx_desc_lim = { .nb_align = 1, }; -static const struct rte_eth_desc_lim tx_desc_lim = { +static const struct rte_eth_desc_lim tx_desc_lim_v1 = { .nb_max = IONIC_MAX_RING_DESC, .nb_min = IONIC_MIN_RING_DESC, .nb_align = 1, - .nb_seg_max = IONIC_TX_MAX_SG_ELEMS, - .nb_mtu_seg_max = IONIC_TX_MAX_SG_ELEMS, + .nb_seg_max = IONIC_TX_MAX_SG_ELEMS_V1 + 1, + .nb_mtu_seg_max = IONIC_TX_MAX_SG_ELEMS_V1 + 1, }; static const struct eth_dev_ops ionic_eth_dev_ops = { @@ -207,8 +207,7 @@ static const struct rte_ionic_xstats_name_off rte_ionic_xstats_strings[] = { tx_desc_data_error)}, }; -#define IONIC_NB_HW_STATS (sizeof(rte_ionic_xstats_strings) / \ - sizeof(rte_ionic_xstats_strings[0])) +#define IONIC_NB_HW_STATS RTE_DIM(rte_ionic_xstats_strings) static int ionic_dev_fw_version_get(struct rte_eth_dev *eth_dev, @@ -276,7 +275,10 @@ ionic_dev_link_update(struct rte_eth_dev *eth_dev, /* Initialize */ memset(&link, 0, sizeof(link)); - link.link_autoneg = ETH_LINK_AUTONEG; + + if (adapter->idev.port_info->config.an_enable) { + link.link_autoneg = ETH_LINK_AUTONEG; + } if (!adapter->link_up || !(lif->state & IONIC_LIF_F_UP)) { @@ -371,13 +373,15 @@ ionic_dev_info_get(struct rte_eth_dev *eth_dev, struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); struct ionic_adapter *adapter = lif->adapter; struct ionic_identity *ident = &adapter->ident; + union ionic_lif_config *cfg = &ident->lif.eth.config; IONIC_PRINT_CALL(); dev_info->max_rx_queues = (uint16_t) - ident->lif.eth.config.queue_count[IONIC_QTYPE_RXQ]; + rte_le_to_cpu_32(cfg->queue_count[IONIC_QTYPE_RXQ]); dev_info->max_tx_queues = (uint16_t) - ident->lif.eth.config.queue_count[IONIC_QTYPE_TXQ]; + rte_le_to_cpu_32(cfg->queue_count[IONIC_QTYPE_TXQ]); + /* Also add ETHER_CRC_LEN if the adapter is able to keep CRC */ dev_info->min_rx_bufsize = IONIC_MIN_MTU + RTE_ETHER_HDR_LEN; dev_info->max_rx_pktlen = IONIC_MAX_MTU + RTE_ETHER_HDR_LEN; @@ -386,7 +390,7 @@ ionic_dev_info_get(struct rte_eth_dev *eth_dev, dev_info->max_mtu = IONIC_MAX_MTU; dev_info->hash_key_size = IONIC_RSS_HASH_KEY_SIZE; - dev_info->reta_size = ident->lif.eth.rss_ind_tbl_sz; + dev_info->reta_size = rte_le_to_cpu_16(ident->lif.eth.rss_ind_tbl_sz); dev_info->flow_type_rss_offloads = IONIC_ETH_RSS_OFFLOAD_ALL; dev_info->speed_capa = @@ -436,7 +440,7 @@ ionic_dev_info_get(struct rte_eth_dev *eth_dev, 0; dev_info->rx_desc_lim = rx_desc_lim; - dev_info->tx_desc_lim = tx_desc_lim; + dev_info->tx_desc_lim = tx_desc_lim_v1; /* Driver-preferred Rx/Tx parameters */ dev_info->default_rxportconf.burst_size = 32; @@ -531,6 +535,7 @@ ionic_dev_rss_reta_update(struct rte_eth_dev *eth_dev, struct ionic_adapter *adapter = lif->adapter; struct ionic_identity *ident = &adapter->ident; uint32_t i, j, index, num; + uint16_t tbl_sz = rte_le_to_cpu_16(ident->lif.eth.rss_ind_tbl_sz); IONIC_PRINT_CALL(); @@ -540,15 +545,15 @@ ionic_dev_rss_reta_update(struct rte_eth_dev *eth_dev, return -EINVAL; } - if (reta_size != ident->lif.eth.rss_ind_tbl_sz) { + if (reta_size != tbl_sz) { IONIC_PRINT(ERR, "The size of hash lookup table configured " "(%d) does not match the number hardware can support " "(%d)", - reta_size, ident->lif.eth.rss_ind_tbl_sz); + reta_size, tbl_sz); return -EINVAL; } - num = lif->adapter->ident.lif.eth.rss_ind_tbl_sz / RTE_RETA_GROUP_SIZE; + num = tbl_sz / RTE_RETA_GROUP_SIZE; for (i = 0; i < num; i++) { for (j = 0; j < RTE_RETA_GROUP_SIZE; j++) { @@ -571,14 +576,15 @@ ionic_dev_rss_reta_query(struct rte_eth_dev *eth_dev, struct ionic_adapter *adapter = lif->adapter; struct ionic_identity *ident = &adapter->ident; int i, num; + uint16_t tbl_sz = rte_le_to_cpu_16(ident->lif.eth.rss_ind_tbl_sz); IONIC_PRINT_CALL(); - if (reta_size != ident->lif.eth.rss_ind_tbl_sz) { + if (reta_size != tbl_sz) { IONIC_PRINT(ERR, "The size of hash lookup table configured " "(%d) does not match the number hardware can support " "(%d)", - reta_size, ident->lif.eth.rss_ind_tbl_sz); + reta_size, tbl_sz); return -EINVAL; } @@ -869,7 +875,8 @@ ionic_dev_start(struct rte_eth_dev *eth_dev) struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); struct ionic_adapter *adapter = lif->adapter; struct ionic_dev *idev = &adapter->idev; - uint32_t allowed_speeds; + uint32_t speed = 0, allowed_speeds; + uint8_t an_enable; int err; IONIC_PRINT_CALL(); @@ -896,11 +903,23 @@ ionic_dev_start(struct rte_eth_dev *eth_dev) return err; } - if (eth_dev->data->dev_conf.link_speeds & ETH_LINK_SPEED_FIXED) { - uint32_t speed = ionic_parse_link_speeds(dev_conf->link_speeds); + /* Configure link */ + an_enable = (dev_conf->link_speeds & ETH_LINK_SPEED_FIXED) == 0; - if (speed) - ionic_dev_cmd_port_speed(idev, speed); + ionic_dev_cmd_port_autoneg(idev, an_enable); + err = ionic_dev_cmd_wait_check(idev, IONIC_DEVCMD_TIMEOUT); + if (err) + IONIC_PRINT(WARNING, "Failed to %s autonegotiation", + an_enable ? "enable" : "disable"); + + if (!an_enable) + speed = ionic_parse_link_speeds(dev_conf->link_speeds); + if (speed) { + ionic_dev_cmd_port_speed(idev, speed); + err = ionic_dev_cmd_wait_check(idev, IONIC_DEVCMD_TIMEOUT); + if (err) + IONIC_PRINT(WARNING, "Failed to set link speed %u", + speed); } ionic_dev_link_update(eth_dev, 0); @@ -1212,11 +1231,12 @@ eth_ionic_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, goto err_free_adapter; } - adapter->max_mac_addrs = adapter->ident.lif.eth.max_ucast_filters; + adapter->max_mac_addrs = + rte_le_to_cpu_32(adapter->ident.lif.eth.max_ucast_filters); - if (adapter->ident.dev.nlifs != 1) { + if (rte_le_to_cpu_32(adapter->ident.dev.nlifs) != 1) { IONIC_PRINT(ERR, "Unexpected request for %d LIFs", - adapter->ident.dev.nlifs); + rte_le_to_cpu_32(adapter->ident.dev.nlifs)); goto err_free_adapter; }