X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fliquidio%2Flio_ethdev.c;h=90ffe31b9fda68ecb88435d34efd79b389838647;hb=f9f0b5121f62d8701165d20bfdd14638bc72654d;hp=d13ab06c0567fbec595943c613ad3d610f023d8f;hpb=e16adf08e54d5b1ff3b1116c372bbca279fced9d;p=dpdk.git diff --git a/drivers/net/liquidio/lio_ethdev.c b/drivers/net/liquidio/lio_ethdev.c index d13ab06c05..90ffe31b9f 100644 --- a/drivers/net/liquidio/lio_ethdev.c +++ b/drivers/net/liquidio/lio_ethdev.c @@ -2,8 +2,9 @@ * Copyright(c) 2017 Cavium, Inc */ -#include -#include +#include +#include +#include #include #include #include @@ -14,9 +15,6 @@ #include "lio_ethdev.h" #include "lio_rxtx.h" -int lio_logtype_init; -int lio_logtype_driver; - /* Default RSS key in use */ static uint8_t lio_rss_key[40] = { 0x6D, 0x5A, 0x56, 0xDA, 0x25, 0x5B, 0x0E, 0xC2, @@ -242,17 +240,18 @@ lio_dev_xstats_get_names(struct rte_eth_dev *eth_dev, } /* Reset hw stats for the port */ -static void +static int lio_dev_xstats_reset(struct rte_eth_dev *eth_dev) { struct lio_device *lio_dev = LIO_DEV(eth_dev); struct lio_dev_ctrl_cmd ctrl_cmd; struct lio_ctrl_pkt ctrl_pkt; + int ret; if (!lio_dev->intf_open) { lio_dev_err(lio_dev, "Port %d down\n", lio_dev->port_id); - return; + return -EINVAL; } /* flush added to prevent cmd failure @@ -269,19 +268,21 @@ lio_dev_xstats_reset(struct rte_eth_dev *eth_dev) ctrl_pkt.ncmd.s.cmd = LIO_CMD_CLEAR_STATS; ctrl_pkt.ctrl_cmd = &ctrl_cmd; - if (lio_send_ctrl_pkt(lio_dev, &ctrl_pkt)) { + ret = lio_send_ctrl_pkt(lio_dev, &ctrl_pkt); + if (ret != 0) { lio_dev_err(lio_dev, "Failed to send clear stats command\n"); - return; + return ret; } - if (lio_wait_for_ctrl_cmd(lio_dev, &ctrl_cmd)) { + ret = lio_wait_for_ctrl_cmd(lio_dev, &ctrl_cmd); + if (ret != 0) { lio_dev_err(lio_dev, "Clear stats command timed out\n"); - return; + return ret; } /* clear stored per queue stats */ - RTE_FUNC_PTR_OR_RET(*eth_dev->dev_ops->stats_reset); - (*eth_dev->dev_ops->stats_reset)(eth_dev); + RTE_FUNC_PTR_OR_ERR_RET(*eth_dev->dev_ops->stats_reset, 0); + return (*eth_dev->dev_ops->stats_reset)(eth_dev); } /* Retrieve the device statistics (# packets in/out, # bytes in/out, etc */ @@ -337,7 +338,7 @@ lio_dev_stats_get(struct rte_eth_dev *eth_dev, return 0; } -static void +static int lio_dev_stats_reset(struct rte_eth_dev *eth_dev) { struct lio_device *lio_dev = LIO_DEV(eth_dev); @@ -364,9 +365,11 @@ lio_dev_stats_reset(struct rte_eth_dev *eth_dev) memset(oq_stats, 0, sizeof(struct lio_droq_stats)); } } + + return 0; } -static void +static int lio_dev_info_get(struct rte_eth_dev *eth_dev, struct rte_eth_dev_info *devinfo) { @@ -381,17 +384,18 @@ lio_dev_info_get(struct rte_eth_dev *eth_dev, case PCI_SUBSYS_DEV_ID_CN2360_210SVPN3: case PCI_SUBSYS_DEV_ID_CN2350_210SVPT: case PCI_SUBSYS_DEV_ID_CN2360_210SVPT: - devinfo->speed_capa = ETH_LINK_SPEED_10G; + devinfo->speed_capa = RTE_ETH_LINK_SPEED_10G; break; /* CN23xx 25G cards */ case PCI_SUBSYS_DEV_ID_CN2350_225: case PCI_SUBSYS_DEV_ID_CN2360_225: - devinfo->speed_capa = ETH_LINK_SPEED_25G; + devinfo->speed_capa = RTE_ETH_LINK_SPEED_25G; break; default: - devinfo->speed_capa = ETH_LINK_SPEED_10G; + devinfo->speed_capa = RTE_ETH_LINK_SPEED_10G; lio_dev_err(lio_dev, "Unknown CN23XX subsystem device id. Setting 10G as default link speed.\n"); + return -EINVAL; } devinfo->max_rx_queues = lio_dev->max_rx_queues; @@ -402,34 +406,34 @@ lio_dev_info_get(struct rte_eth_dev *eth_dev, devinfo->max_mac_addrs = 1; - devinfo->rx_offload_capa = (DEV_RX_OFFLOAD_IPV4_CKSUM | - DEV_RX_OFFLOAD_UDP_CKSUM | - DEV_RX_OFFLOAD_TCP_CKSUM | - DEV_RX_OFFLOAD_VLAN_STRIP); - devinfo->tx_offload_capa = (DEV_TX_OFFLOAD_IPV4_CKSUM | - DEV_TX_OFFLOAD_UDP_CKSUM | - DEV_TX_OFFLOAD_TCP_CKSUM | - DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM); + devinfo->rx_offload_capa = (RTE_ETH_RX_OFFLOAD_IPV4_CKSUM | + RTE_ETH_RX_OFFLOAD_UDP_CKSUM | + RTE_ETH_RX_OFFLOAD_TCP_CKSUM | + RTE_ETH_RX_OFFLOAD_VLAN_STRIP | + RTE_ETH_RX_OFFLOAD_RSS_HASH); + devinfo->tx_offload_capa = (RTE_ETH_TX_OFFLOAD_IPV4_CKSUM | + RTE_ETH_TX_OFFLOAD_UDP_CKSUM | + RTE_ETH_TX_OFFLOAD_TCP_CKSUM | + RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM); devinfo->rx_desc_lim = lio_rx_desc_lim; devinfo->tx_desc_lim = lio_tx_desc_lim; devinfo->reta_size = LIO_RSS_MAX_TABLE_SZ; devinfo->hash_key_size = LIO_RSS_MAX_KEY_SZ; - devinfo->flow_type_rss_offloads = (ETH_RSS_IPV4 | - ETH_RSS_NONFRAG_IPV4_TCP | - ETH_RSS_IPV6 | - ETH_RSS_NONFRAG_IPV6_TCP | - ETH_RSS_IPV6_EX | - ETH_RSS_IPV6_TCP_EX); + devinfo->flow_type_rss_offloads = (RTE_ETH_RSS_IPV4 | + RTE_ETH_RSS_NONFRAG_IPV4_TCP | + RTE_ETH_RSS_IPV6 | + RTE_ETH_RSS_NONFRAG_IPV6_TCP | + RTE_ETH_RSS_IPV6_EX | + RTE_ETH_RSS_IPV6_TCP_EX); + return 0; } static int lio_dev_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu) { struct lio_device *lio_dev = LIO_DEV(eth_dev); - uint16_t pf_mtu = lio_dev->linfo.link.s.mtu; - uint32_t frame_len = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN; struct lio_dev_ctrl_cmd ctrl_cmd; struct lio_ctrl_pkt ctrl_pkt; @@ -441,15 +445,6 @@ lio_dev_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu) return -EINVAL; } - /* check if VF MTU is within allowed range. - * New value should not exceed PF MTU. - */ - if ((mtu < ETHER_MIN_MTU) || (mtu > pf_mtu)) { - lio_dev_err(lio_dev, "VF MTU should be >= %d and <= %d\n", - ETHER_MIN_MTU, pf_mtu); - return -EINVAL; - } - /* flush added to prevent cmd failure * incase the queue is full */ @@ -475,16 +470,6 @@ lio_dev_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu) return -1; } - if (frame_len > ETHER_MAX_LEN) - eth_dev->data->dev_conf.rxmode.offloads |= - DEV_RX_OFFLOAD_JUMBO_FRAME; - else - eth_dev->data->dev_conf.rxmode.offloads &= - ~DEV_RX_OFFLOAD_JUMBO_FRAME; - - eth_dev->data->dev_conf.rxmode.max_rx_pkt_len = frame_len; - eth_dev->data->mtu = mtu; - return 0; } @@ -534,10 +519,10 @@ lio_dev_rss_reta_update(struct rte_eth_dev *eth_dev, rss_param->param.flags &= ~LIO_RSS_PARAM_ITABLE_UNCHANGED; rss_param->param.itablesize = LIO_RSS_MAX_TABLE_SZ; - for (i = 0; i < (reta_size / RTE_RETA_GROUP_SIZE); i++) { - for (j = 0; j < RTE_RETA_GROUP_SIZE; j++) { + for (i = 0; i < (reta_size / RTE_ETH_RETA_GROUP_SIZE); i++) { + for (j = 0; j < RTE_ETH_RETA_GROUP_SIZE; j++) { if ((reta_conf[i].mask) & ((uint64_t)1 << j)) { - index = (i * RTE_RETA_GROUP_SIZE) + j; + index = (i * RTE_ETH_RETA_GROUP_SIZE) + j; rss_state->itable[index] = reta_conf[i].reta[j]; } } @@ -577,12 +562,12 @@ lio_dev_rss_reta_query(struct rte_eth_dev *eth_dev, return -EINVAL; } - num = reta_size / RTE_RETA_GROUP_SIZE; + num = reta_size / RTE_ETH_RETA_GROUP_SIZE; for (i = 0; i < num; i++) { memcpy(reta_conf->reta, - &rss_state->itable[i * RTE_RETA_GROUP_SIZE], - RTE_RETA_GROUP_SIZE); + &rss_state->itable[i * RTE_ETH_RETA_GROUP_SIZE], + RTE_ETH_RETA_GROUP_SIZE); reta_conf++; } @@ -610,17 +595,17 @@ lio_dev_rss_hash_conf_get(struct rte_eth_dev *eth_dev, memcpy(hash_key, rss_state->hash_key, rss_state->hash_key_size); if (rss_state->ip) - rss_hf |= ETH_RSS_IPV4; + rss_hf |= RTE_ETH_RSS_IPV4; if (rss_state->tcp_hash) - rss_hf |= ETH_RSS_NONFRAG_IPV4_TCP; + rss_hf |= RTE_ETH_RSS_NONFRAG_IPV4_TCP; if (rss_state->ipv6) - rss_hf |= ETH_RSS_IPV6; + rss_hf |= RTE_ETH_RSS_IPV6; if (rss_state->ipv6_tcp_hash) - rss_hf |= ETH_RSS_NONFRAG_IPV6_TCP; + rss_hf |= RTE_ETH_RSS_NONFRAG_IPV6_TCP; if (rss_state->ipv6_ex) - rss_hf |= ETH_RSS_IPV6_EX; + rss_hf |= RTE_ETH_RSS_IPV6_EX; if (rss_state->ipv6_tcp_ex_hash) - rss_hf |= ETH_RSS_IPV6_TCP_EX; + rss_hf |= RTE_ETH_RSS_IPV6_TCP_EX; rss_conf->rss_hf = rss_hf; @@ -688,42 +673,42 @@ lio_dev_rss_hash_update(struct rte_eth_dev *eth_dev, if (rss_state->hash_disable) return -EINVAL; - if (rss_conf->rss_hf & ETH_RSS_IPV4) { + if (rss_conf->rss_hf & RTE_ETH_RSS_IPV4) { hashinfo |= LIO_RSS_HASH_IPV4; rss_state->ip = 1; } else { rss_state->ip = 0; } - if (rss_conf->rss_hf & ETH_RSS_NONFRAG_IPV4_TCP) { + if (rss_conf->rss_hf & RTE_ETH_RSS_NONFRAG_IPV4_TCP) { hashinfo |= LIO_RSS_HASH_TCP_IPV4; rss_state->tcp_hash = 1; } else { rss_state->tcp_hash = 0; } - if (rss_conf->rss_hf & ETH_RSS_IPV6) { + if (rss_conf->rss_hf & RTE_ETH_RSS_IPV6) { hashinfo |= LIO_RSS_HASH_IPV6; rss_state->ipv6 = 1; } else { rss_state->ipv6 = 0; } - if (rss_conf->rss_hf & ETH_RSS_NONFRAG_IPV6_TCP) { + if (rss_conf->rss_hf & RTE_ETH_RSS_NONFRAG_IPV6_TCP) { hashinfo |= LIO_RSS_HASH_TCP_IPV6; rss_state->ipv6_tcp_hash = 1; } else { rss_state->ipv6_tcp_hash = 0; } - if (rss_conf->rss_hf & ETH_RSS_IPV6_EX) { + if (rss_conf->rss_hf & RTE_ETH_RSS_IPV6_EX) { hashinfo |= LIO_RSS_HASH_IPV6_EX; rss_state->ipv6_ex = 1; } else { rss_state->ipv6_ex = 0; } - if (rss_conf->rss_hf & ETH_RSS_IPV6_TCP_EX) { + if (rss_conf->rss_hf & RTE_ETH_RSS_IPV6_TCP_EX) { hashinfo |= LIO_RSS_HASH_TCP_IPV6_EX; rss_state->ipv6_tcp_ex_hash = 1; } else { @@ -772,7 +757,7 @@ lio_dev_udp_tunnel_add(struct rte_eth_dev *eth_dev, if (udp_tnl == NULL) return -EINVAL; - if (udp_tnl->prot_type != RTE_TUNNEL_TYPE_VXLAN) { + if (udp_tnl->prot_type != RTE_ETH_TUNNEL_TYPE_VXLAN) { lio_dev_err(lio_dev, "Unsupported tunnel type\n"); return -1; } @@ -829,7 +814,7 @@ lio_dev_udp_tunnel_del(struct rte_eth_dev *eth_dev, if (udp_tnl == NULL) return -EINVAL; - if (udp_tnl->prot_type != RTE_TUNNEL_TYPE_VXLAN) { + if (udp_tnl->prot_type != RTE_ETH_TUNNEL_TYPE_VXLAN) { lio_dev_err(lio_dev, "Unsupported tunnel type\n"); return -1; } @@ -927,10 +912,10 @@ lio_dev_link_update(struct rte_eth_dev *eth_dev, /* Initialize */ memset(&link, 0, sizeof(link)); - link.link_status = ETH_LINK_DOWN; - link.link_speed = ETH_SPEED_NUM_NONE; - link.link_duplex = ETH_LINK_HALF_DUPLEX; - link.link_autoneg = ETH_LINK_AUTONEG; + link.link_status = RTE_ETH_LINK_DOWN; + link.link_speed = RTE_ETH_SPEED_NUM_NONE; + link.link_duplex = RTE_ETH_LINK_HALF_DUPLEX; + link.link_autoneg = RTE_ETH_LINK_AUTONEG; /* Return what we found */ if (lio_dev->linfo.link.s.link_up == 0) { @@ -938,18 +923,18 @@ lio_dev_link_update(struct rte_eth_dev *eth_dev, return rte_eth_linkstatus_set(eth_dev, &link); } - link.link_status = ETH_LINK_UP; /* Interface is up */ - link.link_duplex = ETH_LINK_FULL_DUPLEX; + link.link_status = RTE_ETH_LINK_UP; /* Interface is up */ + link.link_duplex = RTE_ETH_LINK_FULL_DUPLEX; switch (lio_dev->linfo.link.s.speed) { case LIO_LINK_SPEED_10000: - link.link_speed = ETH_SPEED_NUM_10G; + link.link_speed = RTE_ETH_SPEED_NUM_10G; break; case LIO_LINK_SPEED_25000: - link.link_speed = ETH_SPEED_NUM_25G; + link.link_speed = RTE_ETH_SPEED_NUM_25G; break; default: - link.link_speed = ETH_SPEED_NUM_NONE; - link.link_duplex = ETH_LINK_HALF_DUPLEX; + link.link_speed = RTE_ETH_SPEED_NUM_NONE; + link.link_duplex = RTE_ETH_LINK_HALF_DUPLEX; } return rte_eth_linkstatus_set(eth_dev, &link); @@ -958,8 +943,12 @@ lio_dev_link_update(struct rte_eth_dev *eth_dev, /** * \brief Net device enable, disable allmulticast * @param eth_dev Pointer to the structure rte_eth_dev + * + * @return + * On success return 0 + * On failure return negative errno */ -static void +static int lio_change_dev_flag(struct rte_eth_dev *eth_dev) { struct lio_device *lio_dev = LIO_DEV(eth_dev); @@ -984,14 +973,18 @@ lio_change_dev_flag(struct rte_eth_dev *eth_dev) if (lio_send_ctrl_pkt(lio_dev, &ctrl_pkt)) { lio_dev_err(lio_dev, "Failed to send change flag message\n"); - return; + return -EAGAIN; } - if (lio_wait_for_ctrl_cmd(lio_dev, &ctrl_cmd)) + if (lio_wait_for_ctrl_cmd(lio_dev, &ctrl_cmd)) { lio_dev_err(lio_dev, "Change dev flag command timed out\n"); + return -ETIMEDOUT; + } + + return 0; } -static void +static int lio_dev_promiscuous_enable(struct rte_eth_dev *eth_dev) { struct lio_device *lio_dev = LIO_DEV(eth_dev); @@ -999,20 +992,20 @@ lio_dev_promiscuous_enable(struct rte_eth_dev *eth_dev) if (strcmp(lio_dev->firmware_version, LIO_VF_TRUST_MIN_VERSION) < 0) { lio_dev_err(lio_dev, "Require firmware version >= %s\n", LIO_VF_TRUST_MIN_VERSION); - return; + return -EAGAIN; } if (!lio_dev->intf_open) { lio_dev_err(lio_dev, "Port %d down, can't enable promiscuous\n", lio_dev->port_id); - return; + return -EAGAIN; } lio_dev->ifflags |= LIO_IFFLAG_PROMISC; - lio_change_dev_flag(eth_dev); + return lio_change_dev_flag(eth_dev); } -static void +static int lio_dev_promiscuous_disable(struct rte_eth_dev *eth_dev) { struct lio_device *lio_dev = LIO_DEV(eth_dev); @@ -1020,20 +1013,20 @@ lio_dev_promiscuous_disable(struct rte_eth_dev *eth_dev) if (strcmp(lio_dev->firmware_version, LIO_VF_TRUST_MIN_VERSION) < 0) { lio_dev_err(lio_dev, "Require firmware version >= %s\n", LIO_VF_TRUST_MIN_VERSION); - return; + return -EAGAIN; } if (!lio_dev->intf_open) { lio_dev_err(lio_dev, "Port %d down, can't disable promiscuous\n", lio_dev->port_id); - return; + return -EAGAIN; } lio_dev->ifflags &= ~LIO_IFFLAG_PROMISC; - lio_change_dev_flag(eth_dev); + return lio_change_dev_flag(eth_dev); } -static void +static int lio_dev_allmulticast_enable(struct rte_eth_dev *eth_dev) { struct lio_device *lio_dev = LIO_DEV(eth_dev); @@ -1041,14 +1034,14 @@ lio_dev_allmulticast_enable(struct rte_eth_dev *eth_dev) if (!lio_dev->intf_open) { lio_dev_err(lio_dev, "Port %d down, can't enable multicast\n", lio_dev->port_id); - return; + return -EAGAIN; } lio_dev->ifflags |= LIO_IFFLAG_ALLMULTI; - lio_change_dev_flag(eth_dev); + return lio_change_dev_flag(eth_dev); } -static void +static int lio_dev_allmulticast_disable(struct rte_eth_dev *eth_dev) { struct lio_device *lio_dev = LIO_DEV(eth_dev); @@ -1056,11 +1049,11 @@ lio_dev_allmulticast_disable(struct rte_eth_dev *eth_dev) if (!lio_dev->intf_open) { lio_dev_err(lio_dev, "Port %d down, can't disable multicast\n", lio_dev->port_id); - return; + return -EAGAIN; } lio_dev->ifflags &= ~LIO_IFFLAG_ALLMULTI; - lio_change_dev_flag(eth_dev); + return lio_change_dev_flag(eth_dev); } static void @@ -1093,8 +1086,8 @@ lio_dev_rss_configure(struct rte_eth_dev *eth_dev) q_idx = (uint8_t)((eth_dev->data->nb_rx_queues > 1) ? i % eth_dev->data->nb_rx_queues : 0); - conf_idx = i / RTE_RETA_GROUP_SIZE; - reta_idx = i % RTE_RETA_GROUP_SIZE; + conf_idx = i / RTE_ETH_RETA_GROUP_SIZE; + reta_idx = i % RTE_ETH_RETA_GROUP_SIZE; reta_conf[conf_idx].reta[reta_idx] = q_idx; reta_conf[conf_idx].mask |= ((uint64_t)1 << reta_idx); } @@ -1110,10 +1103,10 @@ lio_dev_mq_rx_configure(struct rte_eth_dev *eth_dev) struct rte_eth_rss_conf rss_conf; switch (eth_dev->data->dev_conf.rxmode.mq_mode) { - case ETH_MQ_RX_RSS: + case RTE_ETH_MQ_RX_RSS: lio_dev_rss_configure(eth_dev); break; - case ETH_MQ_RX_NONE: + case RTE_ETH_MQ_RX_NONE: /* if mq_mode is none, disable rss mode. */ default: memset(&rss_conf, 0, sizeof(rss_conf)); @@ -1168,7 +1161,7 @@ lio_dev_rx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t q_no, /* Free previous allocation if any */ if (eth_dev->data->rx_queues[q_no] != NULL) { - lio_dev_rx_queue_release(eth_dev->data->rx_queues[q_no]); + lio_dev_rx_queue_release(eth_dev, q_no); eth_dev->data->rx_queues[q_no] = NULL; } @@ -1190,16 +1183,18 @@ lio_dev_rx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t q_no, * Release the receive queue/ringbuffer. Called by * the upper layers. * - * @param rxq - * Opaque pointer to the receive queue to release + * @param eth_dev + * Pointer to Ethernet device structure. + * @param q_no + * Receive queue index. * * @return * - nothing */ void -lio_dev_rx_queue_release(void *rxq) +lio_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t q_no) { - struct lio_droq *droq = rxq; + struct lio_droq *droq = dev->data->rx_queues[q_no]; int oq_no; if (droq) { @@ -1248,7 +1243,7 @@ lio_dev_tx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t q_no, /* Free previous allocation if any */ if (eth_dev->data->tx_queues[q_no] != NULL) { - lio_dev_tx_queue_release(eth_dev->data->tx_queues[q_no]); + lio_dev_tx_queue_release(eth_dev, q_no); eth_dev->data->tx_queues[q_no] = NULL; } @@ -1278,16 +1273,18 @@ lio_dev_tx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t q_no, * Release the transmit queue/ringbuffer. Called by * the upper layers. * - * @param txq - * Opaque pointer to the transmit queue to release + * @param eth_dev + * Pointer to Ethernet device structure. + * @param q_no + * Transmit queue index. * * @return * - nothing */ void -lio_dev_tx_queue_release(void *txq) +lio_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t q_no) { - struct lio_instr_queue *tq = txq; + struct lio_instr_queue *tq = dev->data->tx_queues[q_no]; uint32_t fw_mapped_iq_no; @@ -1384,8 +1381,6 @@ lio_sync_link_state_check(void *eth_dev) static int lio_dev_start(struct rte_eth_dev *eth_dev) { - uint16_t mtu; - uint32_t frame_len = eth_dev->data->dev_conf.rxmode.max_rx_pkt_len; struct lio_device *lio_dev = LIO_DEV(eth_dev); uint16_t timeout = LIO_MAX_CMD_TIMEOUT; int ret = 0; @@ -1428,15 +1423,9 @@ lio_dev_start(struct rte_eth_dev *eth_dev) goto dev_mtu_set_error; } - mtu = (uint16_t)(frame_len - ETHER_HDR_LEN - ETHER_CRC_LEN); - if (mtu < ETHER_MIN_MTU) - mtu = ETHER_MIN_MTU; - - if (eth_dev->data->mtu != mtu) { - ret = lio_dev_mtu_set(eth_dev, mtu); - if (ret) - goto dev_mtu_set_error; - } + ret = lio_dev_mtu_set(eth_dev, eth_dev->data->mtu); + if (ret != 0) + goto dev_mtu_set_error; return 0; @@ -1451,12 +1440,13 @@ dev_lsc_handle_error: } /* Stop device and disable input/output functions */ -static void +static int lio_dev_stop(struct rte_eth_dev *eth_dev) { struct lio_device *lio_dev = LIO_DEV(eth_dev); lio_dev_info(lio_dev, "Stopping port %d\n", eth_dev->data->port_id); + eth_dev->data->dev_started = 0; lio_dev->intf_open = 0; rte_mb(); @@ -1469,6 +1459,8 @@ lio_dev_stop(struct rte_eth_dev *eth_dev) /* Clear recorded link status */ lio_dev->linfo.link.link_status64 = 0; + + return 0; } static int @@ -1492,7 +1484,7 @@ lio_dev_set_link_up(struct rte_eth_dev *eth_dev) } lio_dev->linfo.link.s.link_up = 1; - eth_dev->data->dev_link.link_status = ETH_LINK_UP; + eth_dev->data->dev_link.link_status = RTE_ETH_LINK_UP; return 0; } @@ -1513,11 +1505,11 @@ lio_dev_set_link_down(struct rte_eth_dev *eth_dev) } lio_dev->linfo.link.s.link_up = 0; - eth_dev->data->dev_link.link_status = ETH_LINK_DOWN; + eth_dev->data->dev_link.link_status = RTE_ETH_LINK_DOWN; if (lio_send_rx_ctrl_cmd(eth_dev, 0)) { lio_dev->linfo.link.s.link_up = 1; - eth_dev->data->dev_link.link_status = ETH_LINK_UP; + eth_dev->data->dev_link.link_status = RTE_ETH_LINK_UP; lio_dev_err(lio_dev, "Unable to set Link Down\n"); return -1; } @@ -1536,20 +1528,24 @@ lio_dev_set_link_down(struct rte_eth_dev *eth_dev) * @return * - nothing */ -static void +static int lio_dev_close(struct rte_eth_dev *eth_dev) { struct lio_device *lio_dev = LIO_DEV(eth_dev); + int ret = 0; + + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + return 0; lio_dev_info(lio_dev, "closing port %d\n", eth_dev->data->port_id); if (lio_dev->intf_open) - lio_dev_stop(eth_dev); + ret = lio_dev_stop(eth_dev); /* Reset ioq regs */ lio_dev->fn_list.setup_device_regs(lio_dev); - if (lio_dev->pci_dev->kdrv == RTE_KDRV_IGB_UIO) { + if (lio_dev->pci_dev->kdrv == RTE_PCI_KDRV_IGB_UIO) { cn23xx_vf_ask_pf_to_do_flr(lio_dev); rte_delay_ms(LIO_PCI_FLR_WAIT); } @@ -1567,6 +1563,8 @@ lio_dev_close(struct rte_eth_dev *eth_dev) /* Delete all queues */ lio_dev_clear_queues(eth_dev); + + return ret; } /** @@ -1684,6 +1682,7 @@ static int lio_reconf_queues(struct rte_eth_dev *eth_dev, int num_txq, int num_rxq) { struct lio_device *lio_dev = LIO_DEV(eth_dev); + int ret; if (lio_dev->nb_rx_queues != num_rxq || lio_dev->nb_tx_queues != num_txq) { @@ -1693,8 +1692,11 @@ lio_reconf_queues(struct rte_eth_dev *eth_dev, int num_txq, int num_rxq) lio_dev->nb_tx_queues = num_txq; } - if (lio_dev->intf_open) - lio_dev_stop(eth_dev); + if (lio_dev->intf_open) { + ret = lio_dev_stop(eth_dev); + if (ret != 0) + return ret; + } /* Reset ioq registers */ if (lio_dev->fn_list.setup_device_regs(lio_dev)) { @@ -1711,7 +1713,7 @@ lio_dev_configure(struct rte_eth_dev *eth_dev) struct lio_device *lio_dev = LIO_DEV(eth_dev); uint16_t timeout = LIO_MAX_CMD_TIMEOUT; int retval, num_iqueues, num_oqueues; - uint8_t mac[ETHER_ADDR_LEN], i; + uint8_t mac[RTE_ETHER_ADDR_LEN], i; struct lio_if_cfg_resp *resp; struct lio_soft_command *sc; union lio_if_cfg if_cfg; @@ -1719,6 +1721,10 @@ lio_dev_configure(struct rte_eth_dev *eth_dev) PMD_INIT_FUNC_TRACE(); + if (eth_dev->data->dev_conf.rxmode.mq_mode & RTE_ETH_MQ_RX_RSS_FLAG) + eth_dev->data->dev_conf.rxmode.offloads |= + RTE_ETH_RX_OFFLOAD_RSS_HASH; + /* Inform firmware about change in number of queues to use. * Disable IO queues and reset registers for re-configuration. */ @@ -1781,8 +1787,8 @@ lio_dev_configure(struct rte_eth_dev *eth_dev) goto nic_config_fail; } - snprintf(lio_dev->firmware_version, LIO_FW_VERSION_LENGTH, "%s", - resp->cfg_info.lio_firmware_version); + strlcpy(lio_dev->firmware_version, + resp->cfg_info.lio_firmware_version, LIO_FW_VERSION_LENGTH); lio_swap_8B_data((uint64_t *)(&resp->cfg_info), sizeof(struct octeon_if_cfg_info) >> 3); @@ -1829,12 +1835,13 @@ lio_dev_configure(struct rte_eth_dev *eth_dev) /* 64-bit swap required on LE machines */ lio_swap_8B_data(&lio_dev->linfo.hw_addr, 1); - for (i = 0; i < ETHER_ADDR_LEN; i++) + for (i = 0; i < RTE_ETHER_ADDR_LEN; i++) mac[i] = *((uint8_t *)(((uint8_t *)&lio_dev->linfo.hw_addr) + 2 + i)); /* Copy the permanent MAC address */ - ether_addr_copy((struct ether_addr *)mac, ð_dev->data->mac_addrs[0]); + rte_ether_addr_copy((struct rte_ether_addr *)mac, + ð_dev->data->mac_addrs[0]); /* enable firmware checksum support for tunnel packets */ lio_enable_hw_tunnel_rx_checksum(eth_dev); @@ -1993,7 +2000,7 @@ lio_first_time_init(struct lio_device *lio_dev, goto error; /* Request and wait for device reset. */ - if (pdev->kdrv == RTE_KDRV_IGB_UIO) { + if (pdev->kdrv == RTE_PCI_KDRV_IGB_UIO) { cn23xx_vf_ask_pf_to_do_flr(lio_dev); /* FLR wait time doubled as a precaution. */ rte_delay_ms(LIO_PCI_FLR_WAIT * 2); @@ -2043,10 +2050,6 @@ lio_eth_dev_uninit(struct rte_eth_dev *eth_dev) /* lio_free_sc_buffer_pool */ lio_free_sc_buffer_pool(lio_dev); - eth_dev->dev_ops = NULL; - eth_dev->rx_pkt_burst = NULL; - eth_dev->tx_pkt_burst = NULL; - return 0; } @@ -2088,7 +2091,7 @@ lio_eth_dev_init(struct rte_eth_dev *eth_dev) } eth_dev->dev_ops = &liovf_eth_dev_ops; - eth_dev->data->mac_addrs = rte_zmalloc("lio", ETHER_ADDR_LEN, 0); + eth_dev->data->mac_addrs = rte_zmalloc("lio", RTE_ETHER_ADDR_LEN, 0); if (eth_dev->data->mac_addrs == NULL) { lio_dev_err(lio_dev, "MAC addresses memory allocation failed\n"); @@ -2139,13 +2142,5 @@ static struct rte_pci_driver rte_liovf_pmd = { RTE_PMD_REGISTER_PCI(net_liovf, rte_liovf_pmd); RTE_PMD_REGISTER_PCI_TABLE(net_liovf, pci_id_liovf_map); RTE_PMD_REGISTER_KMOD_DEP(net_liovf, "* igb_uio | vfio-pci"); - -RTE_INIT(lio_init_log) -{ - lio_logtype_init = rte_log_register("pmd.net.liquidio.init"); - if (lio_logtype_init >= 0) - rte_log_set_level(lio_logtype_init, RTE_LOG_NOTICE); - lio_logtype_driver = rte_log_register("pmd.net.liquidio.driver"); - if (lio_logtype_driver >= 0) - rte_log_set_level(lio_logtype_driver, RTE_LOG_NOTICE); -} +RTE_LOG_REGISTER_SUFFIX(lio_logtype_init, init, NOTICE); +RTE_LOG_REGISTER_SUFFIX(lio_logtype_driver, driver, NOTICE);