X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Focteontx%2Focteontx_ethdev.c;h=5836dbe09ef1ae6510c576c8a89d7a2b71ccf346;hb=914450bace0a5e825576158bbcdcaa865fd33bf4;hp=08c621b4bebff6de1018016b925b7cb74b36ea71;hpb=8b42b07eef49915468cfc9b9684cb274efa42fdd;p=dpdk.git diff --git a/drivers/net/octeontx/octeontx_ethdev.c b/drivers/net/octeontx/octeontx_ethdev.c index 08c621b4be..5836dbe09e 100644 --- a/drivers/net/octeontx/octeontx_ethdev.c +++ b/drivers/net/octeontx/octeontx_ethdev.c @@ -47,24 +47,9 @@ enum octeontx_link_speed { OCTEONTX_LINK_SPEED_RESERVE2 }; -int otx_net_logtype_mbox; -int otx_net_logtype_init; -int otx_net_logtype_driver; - -RTE_INIT(otx_net_init_log) -{ - otx_net_logtype_mbox = rte_log_register("pmd.net.octeontx.mbox"); - if (otx_net_logtype_mbox >= 0) - rte_log_set_level(otx_net_logtype_mbox, RTE_LOG_NOTICE); - - otx_net_logtype_init = rte_log_register("pmd.net.octeontx.init"); - if (otx_net_logtype_init >= 0) - rte_log_set_level(otx_net_logtype_init, RTE_LOG_NOTICE); - - otx_net_logtype_driver = rte_log_register("pmd.net.octeontx.driver"); - if (otx_net_logtype_driver >= 0) - rte_log_set_level(otx_net_logtype_driver, RTE_LOG_NOTICE); -} +RTE_LOG_REGISTER(otx_net_logtype_mbox, pmd.net.octeontx.mbox, NOTICE); +RTE_LOG_REGISTER(otx_net_logtype_init, pmd.net.octeontx.init, NOTICE); +RTE_LOG_REGISTER(otx_net_logtype_driver, pmd.net.octeontx.driver, NOTICE); /* Parse integer from integer argument */ static int @@ -122,6 +107,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; @@ -147,6 +133,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); @@ -231,9 +227,9 @@ octeontx_link_status_poll(void *arg) 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); + rte_eth_dev_callback_process(dev, + RTE_ETH_EVENT_INTR_LSC, + NULL); } } @@ -359,6 +355,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; @@ -372,13 +378,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; @@ -470,7 +478,7 @@ octeontx_dev_configure(struct rte_eth_dev *dev) return 0; } -static void +static int octeontx_dev_close(struct rte_eth_dev *dev) { struct octeontx_txq *txq = NULL; @@ -479,9 +487,13 @@ octeontx_dev_close(struct rte_eth_dev *dev) int ret; PMD_INIT_FUNC_TRACE(); + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + return 0; 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); @@ -499,14 +511,9 @@ octeontx_dev_close(struct rte_eth_dev *dev) rte_free(txq); } - /* Free MAC address table */ - 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; + return 0; } static int @@ -545,7 +552,7 @@ octeontx_dev_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu) if (rc) return rc; - if (frame_size > RTE_ETHER_MAX_LEN) + if (frame_size > OCCTX_L2_MAX_LEN) nic->rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME; else nic->rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME; @@ -666,7 +673,7 @@ error: return ret; } -static void +static int octeontx_dev_stop(struct rte_eth_dev *dev) { struct octeontx_nic *nic = octeontx_pmd_priv(dev); @@ -680,14 +687,14 @@ octeontx_dev_stop(struct rte_eth_dev *dev) if (ret < 0) { octeontx_log_err("failed to req stop port %d res=%d", nic->port_id, ret); - return; + return ret; } ret = octeontx_pki_port_stop(nic->port_id); if (ret < 0) { octeontx_log_err("failed to stop pki port %d res=%d", nic->port_id, ret); - return; + return ret; } ret = octeontx_pko_channel_stop(nic->base_ochan); @@ -695,8 +702,10 @@ octeontx_dev_stop(struct rte_eth_dev *dev) octeontx_log_err("failed to stop channel %d VF%d %d %d", nic->base_ochan, nic->port_id, nic->num_tx_queues, ret); - return; + return ret; } + + return 0; } static int @@ -858,7 +867,6 @@ octeontx_dev_info(struct rte_eth_dev *dev, dev_info->max_mac_addrs = octeontx_bgx_port_mac_entries_get(nic->port_id); - dev_info->max_rx_pktlen = PKI_MAX_PKTLEN; dev_info->max_rx_queues = 1; dev_info->max_tx_queues = PKO_MAX_NUM_DQ; dev_info->min_rx_bufsize = 0; @@ -1208,6 +1216,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; } @@ -1276,6 +1285,8 @@ static const struct eth_dev_ops octeontx_dev_ops = { .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 */ @@ -1350,7 +1361,6 @@ octeontx_create(struct rte_vdev_device *dev, int port, uint8_t evdev, eth_dev->device = &dev->device; eth_dev->intr_handle = NULL; - eth_dev->data->kdrv = RTE_KDRV_NONE; eth_dev->data->numa_node = dev->device.numa_node; data->port_id = eth_dev->data->port_id; @@ -1364,6 +1374,7 @@ octeontx_create(struct rte_vdev_device *dev, int port, uint8_t evdev, data->promiscuous = 0; data->all_multicast = 0; data->scattered_rx = 0; + data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS; /* Get maximum number of supported MAC entries */ max_entries = octeontx_bgx_port_mac_entries_get(nic->port_id); @@ -1407,6 +1418,10 @@ octeontx_create(struct rte_vdev_device *dev, int port, uint8_t evdev, /* 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, @@ -1422,6 +1437,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); @@ -1446,10 +1462,9 @@ octeontx_remove(struct rte_vdev_device *dev) for (i = 0; i < OCTEONTX_VDEV_DEFAULT_MAX_NR_PORT; i++) { sprintf(octtx_name, "eth_octeontx_%d", i); - /* reserve an ethdev entry */ eth_dev = rte_eth_dev_allocated(octtx_name); if (eth_dev == NULL) - return -ENODEV; + continue; /* port already released */ if (rte_eal_process_type() != RTE_PROC_PRIMARY) { rte_eth_dev_release_port(eth_dev); @@ -1459,9 +1474,8 @@ octeontx_remove(struct rte_vdev_device *dev) nic = octeontx_pmd_priv(eth_dev); rte_event_dev_stop(nic->evdev); PMD_INIT_LOG(INFO, "Closing octeontx device %s", octtx_name); - + octeontx_dev_close(eth_dev); rte_eth_dev_release_port(eth_dev); - rte_event_dev_close(nic->evdev); } if (rte_eal_process_type() != RTE_PROC_PRIMARY)