X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;ds=sidebyside;f=drivers%2Fnet%2Focteontx%2Focteontx_ethdev.c;h=d5371ae07d5d47ad872850b28c4e02db7ae10f46;hb=5037d2e076a284b7e73ee3262164e9f9c42bd877;hp=5dd40bc042aa71372be0b4c8c9bde6979909a35a;hpb=56139e85abec19ac9e91aed610abdb0c3629a638;p=dpdk.git diff --git a/drivers/net/octeontx/octeontx_ethdev.c b/drivers/net/octeontx/octeontx_ethdev.c index 5dd40bc042..d5371ae07d 100644 --- a/drivers/net/octeontx/octeontx_ethdev.c +++ b/drivers/net/octeontx/octeontx_ethdev.c @@ -11,6 +11,8 @@ #include #include +#include +#include #include #include #include @@ -18,7 +20,6 @@ #include #include #include -#include #include "octeontx_ethdev.h" #include "octeontx_rxtx.h" @@ -121,6 +122,7 @@ static int octeontx_port_open(struct octeontx_nic *nic) { octeontx_mbox_bgx_port_conf_t bgx_port_conf; + octeontx_mbox_bgx_port_fifo_cfg_t fifo_cfg; int res; res = 0; @@ -146,6 +148,16 @@ octeontx_port_open(struct octeontx_nic *nic) nic->mcast_mode = bgx_port_conf.mcast_mode; nic->speed = bgx_port_conf.mode; + memset(&fifo_cfg, 0x0, sizeof(fifo_cfg)); + + res = octeontx_bgx_port_get_fifo_cfg(nic->port_id, &fifo_cfg); + if (res < 0) { + octeontx_log_err("failed to get port %d fifo cfg", res); + return res; + } + + nic->fc.rx_fifosz = fifo_cfg.rx_fifosz; + memcpy(&nic->mac_addr[0], &bgx_port_conf.macaddr[0], RTE_ETHER_ADDR_LEN); @@ -153,11 +165,102 @@ octeontx_port_open(struct octeontx_nic *nic) return res; } +static void +octeontx_link_status_print(struct rte_eth_dev *eth_dev, + struct rte_eth_link *link) +{ + if (link && link->link_status) + octeontx_log_info("Port %u: Link Up - speed %u Mbps - %s", + (eth_dev->data->port_id), + link->link_speed, + link->link_duplex == ETH_LINK_FULL_DUPLEX ? + "full-duplex" : "half-duplex"); + else + octeontx_log_info("Port %d: Link Down", + (int)(eth_dev->data->port_id)); +} + +static void +octeontx_link_status_update(struct octeontx_nic *nic, + struct rte_eth_link *link) +{ + memset(link, 0, sizeof(*link)); + + link->link_status = nic->link_up ? ETH_LINK_UP : ETH_LINK_DOWN; + + switch (nic->speed) { + case OCTEONTX_LINK_SPEED_SGMII: + link->link_speed = ETH_SPEED_NUM_1G; + break; + + case OCTEONTX_LINK_SPEED_XAUI: + link->link_speed = ETH_SPEED_NUM_10G; + break; + + case OCTEONTX_LINK_SPEED_RXAUI: + case OCTEONTX_LINK_SPEED_10G_R: + link->link_speed = ETH_SPEED_NUM_10G; + break; + case OCTEONTX_LINK_SPEED_QSGMII: + link->link_speed = ETH_SPEED_NUM_5G; + break; + case OCTEONTX_LINK_SPEED_40G_R: + link->link_speed = ETH_SPEED_NUM_40G; + break; + + case OCTEONTX_LINK_SPEED_RESERVE1: + case OCTEONTX_LINK_SPEED_RESERVE2: + default: + link->link_speed = ETH_SPEED_NUM_NONE; + octeontx_log_err("incorrect link speed %d", nic->speed); + break; + } + + link->link_duplex = ETH_LINK_FULL_DUPLEX; + link->link_autoneg = ETH_LINK_AUTONEG; +} + +static void +octeontx_link_status_poll(void *arg) +{ + struct octeontx_nic *nic = arg; + struct rte_eth_link link; + struct rte_eth_dev *dev; + int res; + + PMD_INIT_FUNC_TRACE(); + + dev = nic->dev; + + res = octeontx_bgx_port_link_status(nic->port_id); + if (res < 0) { + octeontx_log_err("Failed to get port %d link status", + nic->port_id); + } else { + if (nic->link_up != (uint8_t)res) { + nic->link_up = (uint8_t)res; + octeontx_link_status_update(nic, &link); + octeontx_link_status_print(dev, &link); + rte_eth_linkstatus_set(dev, &link); + _rte_eth_dev_callback_process(dev, + RTE_ETH_EVENT_INTR_LSC, + NULL); + } + } + + res = rte_eal_alarm_set(OCCTX_INTR_POLL_INTERVAL_MS * 1000, + octeontx_link_status_poll, nic); + if (res < 0) + octeontx_log_err("Failed to restart alarm for port %d, err: %d", + nic->port_id, res); +} + static void octeontx_port_close(struct octeontx_nic *nic) { PMD_INIT_FUNC_TRACE(); + rte_eal_alarm_cancel(octeontx_link_status_poll, nic); octeontx_bgx_port_close(nic->port_id); octeontx_log_dbg("port closed %d", nic->port_id); } @@ -267,6 +370,16 @@ octeontx_tx_offload_flags(struct rte_eth_dev *eth_dev) struct octeontx_nic *nic = octeontx_pmd_priv(eth_dev); uint16_t flags = 0; + if (nic->tx_offloads & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM || + nic->tx_offloads & DEV_TX_OFFLOAD_OUTER_UDP_CKSUM) + flags |= OCCTX_TX_OFFLOAD_OL3_OL4_CSUM_F; + + if (nic->tx_offloads & DEV_TX_OFFLOAD_IPV4_CKSUM || + nic->tx_offloads & DEV_TX_OFFLOAD_TCP_CKSUM || + nic->tx_offloads & DEV_TX_OFFLOAD_UDP_CKSUM || + nic->tx_offloads & DEV_TX_OFFLOAD_SCTP_CKSUM) + flags |= OCCTX_TX_OFFLOAD_L3_L4_CSUM_F; + if (!(nic->tx_offloads & DEV_TX_OFFLOAD_MBUF_FAST_FREE)) flags |= OCCTX_TX_OFFLOAD_MBUF_NOFF_F; @@ -280,13 +393,15 @@ static uint16_t octeontx_rx_offload_flags(struct rte_eth_dev *eth_dev) { struct octeontx_nic *nic = octeontx_pmd_priv(eth_dev); - struct rte_eth_dev_data *data = eth_dev->data; - struct rte_eth_conf *conf = &data->dev_conf; - struct rte_eth_rxmode *rxmode = &conf->rxmode; uint16_t flags = 0; - if (rxmode->mq_mode == ETH_MQ_RX_RSS) - flags |= OCCTX_RX_OFFLOAD_RSS_F; + if (nic->rx_offloads & (DEV_RX_OFFLOAD_TCP_CKSUM | + DEV_RX_OFFLOAD_UDP_CKSUM)) + flags |= OCCTX_RX_OFFLOAD_CSUM_F; + + if (nic->rx_offloads & (DEV_RX_OFFLOAD_IPV4_CKSUM | + DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM)) + flags |= OCCTX_RX_OFFLOAD_CSUM_F; if (nic->rx_offloads & DEV_RX_OFFLOAD_SCATTER) { flags |= OCCTX_RX_MULTI_SEG_F; @@ -390,6 +505,8 @@ octeontx_dev_close(struct rte_eth_dev *dev) rte_event_dev_close(nic->evdev); + octeontx_dev_flow_ctrl_fini(dev); + octeontx_dev_vlan_offload_fini(dev); ret = octeontx_pko_channel_close(nic->base_ochan); @@ -411,6 +528,8 @@ octeontx_dev_close(struct rte_eth_dev *dev) rte_free(dev->data->mac_addrs); dev->data->mac_addrs = NULL; + octeontx_port_close(nic); + dev->tx_pkt_burst = NULL; dev->rx_pkt_burst = NULL; } @@ -503,7 +622,7 @@ octeontx_dev_start(struct rte_eth_dev *dev) { struct octeontx_nic *nic = octeontx_pmd_priv(dev); struct octeontx_rxq *rxq; - int ret = 0, i; + int ret, i; PMD_INIT_FUNC_TRACE(); /* Rechecking if any new offload set to update @@ -636,7 +755,10 @@ octeontx_port_link_status(struct octeontx_nic *nic) return res; } - nic->link_up = (uint8_t)res; + if (nic->link_up != (uint8_t)res || nic->print_flag == -1) { + nic->link_up = (uint8_t)res; + nic->print_flag = 1; + } octeontx_log_dbg("port %d link status %d", nic->port_id, nic->link_up); return res; @@ -661,39 +783,12 @@ octeontx_dev_link_update(struct rte_eth_dev *dev, return res; } - link.link_status = nic->link_up; - - switch (nic->speed) { - case OCTEONTX_LINK_SPEED_SGMII: - link.link_speed = ETH_SPEED_NUM_1G; - break; - - case OCTEONTX_LINK_SPEED_XAUI: - link.link_speed = ETH_SPEED_NUM_10G; - break; - - case OCTEONTX_LINK_SPEED_RXAUI: - case OCTEONTX_LINK_SPEED_10G_R: - link.link_speed = ETH_SPEED_NUM_10G; - break; - case OCTEONTX_LINK_SPEED_QSGMII: - link.link_speed = ETH_SPEED_NUM_5G; - break; - case OCTEONTX_LINK_SPEED_40G_R: - link.link_speed = ETH_SPEED_NUM_40G; - break; - - case OCTEONTX_LINK_SPEED_RESERVE1: - case OCTEONTX_LINK_SPEED_RESERVE2: - default: - link.link_speed = ETH_SPEED_NUM_NONE; - octeontx_log_err("incorrect link speed %d", nic->speed); - break; + octeontx_link_status_update(nic, &link); + if (nic->print_flag) { + octeontx_link_status_print(nic->dev, &link); + nic->print_flag = 0; } - link.link_duplex = ETH_LINK_FULL_DUPLEX; - link.link_autoneg = ETH_LINK_AUTONEG; - return rte_eth_linkstatus_set(dev, &link); } @@ -855,7 +950,7 @@ close_port: return res; } -static int +int octeontx_dev_tx_queue_start(struct rte_eth_dev *dev, uint16_t qidx) { struct octeontx_nic *nic = octeontx_pmd_priv(dev); @@ -881,7 +976,7 @@ octeontx_vf_stop_tx_queue(struct rte_eth_dev *dev, struct octeontx_nic *nic, return ret; } -static int +int octeontx_dev_tx_queue_stop(struct rte_eth_dev *dev, uint16_t qidx) { struct octeontx_nic *nic = octeontx_pmd_priv(dev); @@ -1138,6 +1233,7 @@ octeontx_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t qidx, octeontx_recheck_rx_offloads(rxq); dev->data->rx_queues[qidx] = rxq; dev->data->rx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STOPPED; + return 0; } @@ -1201,9 +1297,13 @@ static const struct eth_dev_ops octeontx_dev_ops = { .tx_queue_release = octeontx_dev_tx_queue_release, .rx_queue_setup = octeontx_dev_rx_queue_setup, .rx_queue_release = octeontx_dev_rx_queue_release, + .dev_set_link_up = octeontx_dev_set_link_up, + .dev_set_link_down = octeontx_dev_set_link_down, .dev_supported_ptypes_get = octeontx_dev_supported_ptypes_get, .mtu_set = octeontx_dev_mtu_set, .pool_ops_supported = octeontx_pool_ops, + .flow_ctrl_get = octeontx_dev_flow_ctrl_get, + .flow_ctrl_set = octeontx_dev_flow_ctrl_set, }; /* Create Ethdev interface per BGX LMAC ports */ @@ -1285,6 +1385,7 @@ octeontx_create(struct rte_vdev_device *dev, int port, uint8_t evdev, nic->ev_queues = 1; nic->ev_ports = 1; + nic->print_flag = -1; data->dev_link.link_status = ETH_LINK_DOWN; data->dev_started = 0; @@ -1321,12 +1422,23 @@ octeontx_create(struct rte_vdev_device *dev, int port, uint8_t evdev, goto free_mac_addrs; } + res = rte_eal_alarm_set(OCCTX_INTR_POLL_INTERVAL_MS * 1000, + octeontx_link_status_poll, nic); + if (res) { + octeontx_log_err("Failed to start link polling alarm"); + goto err; + } + /* Update port_id mac to eth_dev */ memcpy(data->mac_addrs, nic->mac_addr, RTE_ETHER_ADDR_LEN); /* Update same mac address to BGX CAM table at index 0 */ octeontx_bgx_port_mac_add(nic->port_id, nic->mac_addr, 0); + res = octeontx_dev_flow_ctrl_init(eth_dev); + if (res < 0) + goto err; + PMD_INIT_LOG(DEBUG, "ethdev info: "); PMD_INIT_LOG(DEBUG, "port %d, port_ena %d ochan %d num_ochan %d tx_q %d", nic->port_id, nic->port_ena, @@ -1342,6 +1454,7 @@ octeontx_create(struct rte_vdev_device *dev, int port, uint8_t evdev, free_mac_addrs: rte_free(data->mac_addrs); + data->mac_addrs = NULL; err: if (nic) octeontx_port_close(nic);