ethdev: change promiscuous callbacks to return status
[dpdk.git] / drivers / net / e1000 / em_ethdev.c
index 4e890ad..8fe3917 100644 (file)
@@ -11,7 +11,6 @@
 #include <rte_common.h>
 #include <rte_interrupts.h>
 #include <rte_byteorder.h>
-#include <rte_log.h>
 #include <rte_debug.h>
 #include <rte_pci.h>
 #include <rte_bus_pci.h>
@@ -36,8 +35,8 @@ static int eth_em_configure(struct rte_eth_dev *dev);
 static int eth_em_start(struct rte_eth_dev *dev);
 static void eth_em_stop(struct rte_eth_dev *dev);
 static void eth_em_close(struct rte_eth_dev *dev);
-static void eth_em_promiscuous_enable(struct rte_eth_dev *dev);
-static void eth_em_promiscuous_disable(struct rte_eth_dev *dev);
+static int eth_em_promiscuous_enable(struct rte_eth_dev *dev);
+static int eth_em_promiscuous_disable(struct rte_eth_dev *dev);
 static void eth_em_allmulticast_enable(struct rte_eth_dev *dev);
 static void eth_em_allmulticast_disable(struct rte_eth_dev *dev);
 static int eth_em_link_update(struct rte_eth_dev *dev,
@@ -45,7 +44,7 @@ static int eth_em_link_update(struct rte_eth_dev *dev,
 static int eth_em_stats_get(struct rte_eth_dev *dev,
                                struct rte_eth_stats *rte_stats);
 static void eth_em_stats_reset(struct rte_eth_dev *dev);
-static void eth_em_infos_get(struct rte_eth_dev *dev,
+static int eth_em_infos_get(struct rte_eth_dev *dev,
                                struct rte_eth_dev_info *dev_info);
 static int eth_em_flow_ctrl_get(struct rte_eth_dev *dev,
                                struct rte_eth_fc_conf *fc_conf);
@@ -90,14 +89,15 @@ static int eth_em_led_on(struct rte_eth_dev *dev);
 static int eth_em_led_off(struct rte_eth_dev *dev);
 
 static int em_get_rx_buffer_size(struct e1000_hw *hw);
-static int eth_em_rar_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
-                         uint32_t index, uint32_t pool);
+static int eth_em_rar_set(struct rte_eth_dev *dev,
+                       struct rte_ether_addr *mac_addr,
+                       uint32_t index, uint32_t pool);
 static void eth_em_rar_clear(struct rte_eth_dev *dev, uint32_t index);
 static int eth_em_default_mac_addr_set(struct rte_eth_dev *dev,
-                                        struct ether_addr *addr);
+                                        struct rte_ether_addr *addr);
 
 static int eth_em_set_mc_addr_list(struct rte_eth_dev *dev,
-                                  struct ether_addr *mc_addr_set,
+                                  struct rte_ether_addr *mc_addr_set,
                                   uint32_t nb_mc_addr);
 
 #define EM_FC_PAUSE_TIME 0x0680
@@ -106,9 +106,6 @@ static int eth_em_set_mc_addr_list(struct rte_eth_dev *dev,
 
 static enum e1000_fc_mode em_fc_setting = e1000_fc_full;
 
-int e1000_logtype_init;
-int e1000_logtype_driver;
-
 /*
  * The set of PCI devices this driver supports
  */
@@ -287,17 +284,17 @@ eth_em_dev_init(struct rte_eth_dev *eth_dev)
        }
 
        /* Allocate memory for storing MAC addresses */
-       eth_dev->data->mac_addrs = rte_zmalloc("e1000", ETHER_ADDR_LEN *
+       eth_dev->data->mac_addrs = rte_zmalloc("e1000", RTE_ETHER_ADDR_LEN *
                        hw->mac.rar_entry_count, 0);
        if (eth_dev->data->mac_addrs == NULL) {
                PMD_INIT_LOG(ERR, "Failed to allocate %d bytes needed to "
                        "store MAC addresses",
-                       ETHER_ADDR_LEN * hw->mac.rar_entry_count);
+                       RTE_ETHER_ADDR_LEN * hw->mac.rar_entry_count);
                return -ENOMEM;
        }
 
        /* Copy the permanent MAC address */
-       ether_addr_copy((struct ether_addr *) hw->mac.addr,
+       rte_ether_addr_copy((struct rte_ether_addr *)hw->mac.addr,
                eth_dev->data->mac_addrs);
 
        /* initialize the vfta */
@@ -333,9 +330,6 @@ eth_em_dev_uninit(struct rte_eth_dev *eth_dev)
        eth_dev->rx_pkt_burst = NULL;
        eth_dev->tx_pkt_burst = NULL;
 
-       rte_free(eth_dev->data->mac_addrs);
-       eth_dev->data->mac_addrs = NULL;
-
        /* disable uio intr before callback unregister */
        rte_intr_disable(intr_handle);
        rte_intr_callback_unregister(intr_handle,
@@ -358,8 +352,7 @@ static int eth_em_pci_remove(struct rte_pci_device *pci_dev)
 
 static struct rte_pci_driver rte_em_pmd = {
        .id_table = pci_id_em_map,
-       .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC |
-                    RTE_PCI_DRV_IOVA_AS_VA,
+       .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC,
        .probe = eth_em_pci_probe,
        .remove = eth_em_pci_remove,
 };
@@ -582,7 +575,7 @@ eth_em_start(struct rte_eth_dev *dev)
                return -EIO;
        }
 
-       E1000_WRITE_REG(hw, E1000_VET, ETHER_TYPE_VLAN);
+       E1000_WRITE_REG(hw, E1000_VET, RTE_ETHER_TYPE_VLAN);
 
        /* Configure for OS presence */
        em_init_manageability(hw);
@@ -744,6 +737,11 @@ eth_em_stop(struct rte_eth_dev *dev)
        em_lsc_intr_disable(hw);
 
        e1000_reset_hw(hw);
+
+       /* Flush desc rings for i219 */
+       if (hw->mac.type == e1000_pch_spt || hw->mac.type == e1000_pch_cnp)
+               em_flush_desc_rings(dev);
+
        if (hw->mac.type >= e1000_82544)
                E1000_WRITE_REG(hw, E1000_WUC, 0);
 
@@ -827,7 +825,8 @@ em_hardware_init(struct e1000_hw *hw)
         */
        rx_buf_size = em_get_rx_buffer_size(hw);
 
-       hw->fc.high_water = rx_buf_size - PMD_ROUNDUP(ETHER_MAX_LEN * 2, 1024);
+       hw->fc.high_water = rx_buf_size -
+               PMD_ROUNDUP(RTE_ETHER_MAX_LEN * 2, 1024);
        hw->fc.low_water = hw->fc.high_water - 1500;
 
        if (hw->mac.type == e1000_80003es2lan)
@@ -1006,7 +1005,7 @@ eth_em_rx_queue_intr_enable(struct rte_eth_dev *dev, __rte_unused uint16_t queue
        struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
 
        em_rxq_intr_enable(hw);
-       rte_intr_enable(intr_handle);
+       rte_intr_ack(intr_handle);
 
        return 0;
 }
@@ -1043,13 +1042,13 @@ em_get_max_pktlen(struct rte_eth_dev *dev)
                return 0x1000;
        /* Adapters that do not support jumbo frames */
        case e1000_ich8lan:
-               return ETHER_MAX_LEN;
+               return RTE_ETHER_MAX_LEN;
        default:
                return MAX_JUMBO_FRAME_SIZE;
        }
 }
 
-static void
+static int
 eth_em_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 {
        struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
@@ -1108,6 +1107,8 @@ eth_em_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
        dev_info->default_txportconf.nb_queues = 1;
        dev_info->default_txportconf.ring_size = 256;
        dev_info->default_rxportconf.ring_size = 256;
+
+       return 0;
 }
 
 /* return 0 means link status changed, -1 means not changed */
@@ -1262,7 +1263,7 @@ em_release_manageability(struct e1000_hw *hw)
        }
 }
 
-static void
+static int
 eth_em_promiscuous_enable(struct rte_eth_dev *dev)
 {
        struct e1000_hw *hw =
@@ -1272,9 +1273,11 @@ eth_em_promiscuous_enable(struct rte_eth_dev *dev)
        rctl = E1000_READ_REG(hw, E1000_RCTL);
        rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE);
        E1000_WRITE_REG(hw, E1000_RCTL, rctl);
+
+       return 0;
 }
 
-static void
+static int
 eth_em_promiscuous_disable(struct rte_eth_dev *dev)
 {
        struct e1000_hw *hw =
@@ -1288,6 +1291,8 @@ eth_em_promiscuous_disable(struct rte_eth_dev *dev)
        else
                rctl &= (~E1000_RCTL_MPE);
        E1000_WRITE_REG(hw, E1000_RCTL, rctl);
+
+       return 0;
 }
 
 static void
@@ -1448,7 +1453,8 @@ eth_em_interrupt_setup(struct rte_eth_dev *dev)
        /* clear interrupt */
        E1000_READ_REG(hw, E1000_ICR);
        regval = E1000_READ_REG(hw, E1000_IMS);
-       E1000_WRITE_REG(hw, E1000_IMS, regval | E1000_ICR_LSC);
+       E1000_WRITE_REG(hw, E1000_IMS,
+                       regval | E1000_ICR_LSC | E1000_ICR_OTHER);
        return 0;
 }
 
@@ -1498,7 +1504,7 @@ em_rxq_intr_enable(struct e1000_hw *hw)
 static void
 em_lsc_intr_disable(struct e1000_hw *hw)
 {
-       E1000_WRITE_REG(hw, E1000_IMC, E1000_IMS_LSC);
+       E1000_WRITE_REG(hw, E1000_IMC, E1000_IMS_LSC | E1000_IMS_OTHER);
        E1000_WRITE_FLUSH(hw);
 }
 
@@ -1572,7 +1578,7 @@ eth_em_interrupt_action(struct rte_eth_dev *dev,
                return -1;
 
        intr->flags &= ~E1000_FLAG_NEED_LINK_UPDATE;
-       rte_intr_enable(intr_handle);
+       rte_intr_ack(intr_handle);
 
        /* set get_link_status to check register later */
        hw->mac.get_link_status = 1;
@@ -1702,7 +1708,7 @@ eth_em_flow_ctrl_set(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
        PMD_INIT_LOG(DEBUG, "Rx packet buffer size = 0x%x", rx_buf_size);
 
        /* At least reserve one Ethernet frame for watermark */
-       max_high_water = rx_buf_size - ETHER_MAX_LEN;
+       max_high_water = rx_buf_size - RTE_ETHER_MAX_LEN;
        if ((fc_conf->high_water > max_high_water) ||
            (fc_conf->high_water < fc_conf->low_water)) {
                PMD_INIT_LOG(ERR, "e1000 incorrect high/low water value");
@@ -1741,7 +1747,7 @@ eth_em_flow_ctrl_set(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
 }
 
 static int
-eth_em_rar_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
+eth_em_rar_set(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr,
                uint32_t index, __rte_unused uint32_t pool)
 {
        struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
@@ -1752,7 +1758,7 @@ eth_em_rar_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
 static void
 eth_em_rar_clear(struct rte_eth_dev *dev, uint32_t index)
 {
-       uint8_t addr[ETHER_ADDR_LEN];
+       uint8_t addr[RTE_ETHER_ADDR_LEN];
        struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 
        memset(addr, 0, sizeof(addr));
@@ -1762,7 +1768,7 @@ eth_em_rar_clear(struct rte_eth_dev *dev, uint32_t index)
 
 static int
 eth_em_default_mac_addr_set(struct rte_eth_dev *dev,
-                           struct ether_addr *addr)
+                           struct rte_ether_addr *addr)
 {
        eth_em_rar_clear(dev, 0);
 
@@ -1776,12 +1782,17 @@ eth_em_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
        struct e1000_hw *hw;
        uint32_t frame_size;
        uint32_t rctl;
+       int ret;
 
-       eth_em_infos_get(dev, &dev_info);
-       frame_size = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN + VLAN_TAG_SIZE;
+       ret = eth_em_infos_get(dev, &dev_info);
+       if (ret != 0)
+               return ret;
+
+       frame_size = mtu + RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN +
+               VLAN_TAG_SIZE;
 
        /* check that mtu is within the allowed range */
-       if ((mtu < ETHER_MIN_MTU) || (frame_size > dev_info.max_rx_pktlen))
+       if (mtu < RTE_ETHER_MIN_MTU || frame_size > dev_info.max_rx_pktlen)
                return -EINVAL;
 
        /* refuse mtu that requires the support of scattered packets when this
@@ -1794,7 +1805,7 @@ eth_em_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
        rctl = E1000_READ_REG(hw, E1000_RCTL);
 
        /* switch to jumbo mode if needed */
-       if (frame_size > ETHER_MAX_LEN) {
+       if (frame_size > RTE_ETHER_MAX_LEN) {
                dev->data->dev_conf.rxmode.offloads |=
                        DEV_RX_OFFLOAD_JUMBO_FRAME;
                rctl |= E1000_RCTL_LPE;
@@ -1812,7 +1823,7 @@ eth_em_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
 
 static int
 eth_em_set_mc_addr_list(struct rte_eth_dev *dev,
-                       struct ether_addr *mc_addr_set,
+                       struct rte_ether_addr *mc_addr_set,
                        uint32_t nb_mc_addr)
 {
        struct e1000_hw *hw;
@@ -1826,14 +1837,8 @@ RTE_PMD_REGISTER_PCI(net_e1000_em, rte_em_pmd);
 RTE_PMD_REGISTER_PCI_TABLE(net_e1000_em, pci_id_em_map);
 RTE_PMD_REGISTER_KMOD_DEP(net_e1000_em, "* igb_uio | uio_pci_generic | vfio-pci");
 
-RTE_INIT(e1000_init_log);
-static void
-e1000_init_log(void)
+/* see e1000_logs.c */
+RTE_INIT(igb_init_log)
 {
-       e1000_logtype_init = rte_log_register("pmd.net.e1000.init");
-       if (e1000_logtype_init >= 0)
-               rte_log_set_level(e1000_logtype_init, RTE_LOG_NOTICE);
-       e1000_logtype_driver = rte_log_register("pmd.net.e1000.driver");
-       if (e1000_logtype_driver >= 0)
-               rte_log_set_level(e1000_logtype_driver, RTE_LOG_NOTICE);
+       e1000_igb_init_log();
 }