ethdev: remove Rx interrupt switch
[dpdk.git] / lib / librte_ether / rte_ethdev.c
index 94104ce..b309309 100644 (file)
@@ -505,7 +505,7 @@ rte_eth_dev_is_detachable(uint8_t port_id)
 {
        uint32_t drv_flags;
 
-       if (port_id >= RTE_MAX_ETHPORTS) {
+       if (!rte_eth_dev_is_valid_port(port_id)) {
                PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
                return -EINVAL;
        }
@@ -2954,9 +2954,10 @@ rte_eth_dev_callback_register(uint8_t port_id,
        }
 
        /* create a new callback. */
-       if (user_cb == NULL &&
-           (user_cb = rte_zmalloc("INTR_USER_CALLBACK",
-                                  sizeof(struct rte_eth_dev_callback), 0))) {
+       if (user_cb == NULL)
+               user_cb = rte_zmalloc("INTR_USER_CALLBACK",
+                                     sizeof(struct rte_eth_dev_callback), 0);
+       if (user_cb != NULL) {
                user_cb->cb_fn = cb_fn;
                user_cb->cb_arg = cb_arg;
                user_cb->event = event;
@@ -3031,6 +3032,113 @@ _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
        }
        rte_spinlock_unlock(&rte_eth_dev_cb_lock);
 }
+
+int
+rte_eth_dev_rx_intr_ctl(uint8_t port_id, int epfd, int op, void *data)
+{
+       uint32_t vec;
+       struct rte_eth_dev *dev;
+       struct rte_intr_handle *intr_handle;
+       uint16_t qid;
+       int rc;
+
+       if (!rte_eth_dev_is_valid_port(port_id)) {
+               PMD_DEBUG_TRACE("Invalid port_id=%u\n", port_id);
+               return -ENODEV;
+       }
+
+       dev = &rte_eth_devices[port_id];
+       intr_handle = &dev->pci_dev->intr_handle;
+       if (!intr_handle->intr_vec) {
+               PMD_DEBUG_TRACE("RX Intr vector unset\n");
+               return -EPERM;
+       }
+
+       for (qid = 0; qid < dev->data->nb_rx_queues; qid++) {
+               vec = intr_handle->intr_vec[qid];
+               rc = rte_intr_rx_ctl(intr_handle, epfd, op, vec, data);
+               if (rc && rc != -EEXIST) {
+                       PMD_DEBUG_TRACE("p %u q %u rx ctl error"
+                                       " op %d epfd %d vec %u\n",
+                                       port_id, qid, op, epfd, vec);
+               }
+       }
+
+       return 0;
+}
+
+int
+rte_eth_dev_rx_intr_ctl_q(uint8_t port_id, uint16_t queue_id,
+                         int epfd, int op, void *data)
+{
+       uint32_t vec;
+       struct rte_eth_dev *dev;
+       struct rte_intr_handle *intr_handle;
+       int rc;
+
+       if (!rte_eth_dev_is_valid_port(port_id)) {
+               PMD_DEBUG_TRACE("Invalid port_id=%u\n", port_id);
+               return -ENODEV;
+       }
+
+       dev = &rte_eth_devices[port_id];
+       if (queue_id >= dev->data->nb_rx_queues) {
+               PMD_DEBUG_TRACE("Invalid RX queue_id=%u\n", queue_id);
+               return -EINVAL;
+       }
+
+       intr_handle = &dev->pci_dev->intr_handle;
+       if (!intr_handle->intr_vec) {
+               PMD_DEBUG_TRACE("RX Intr vector unset\n");
+               return -EPERM;
+       }
+
+       vec = intr_handle->intr_vec[queue_id];
+       rc = rte_intr_rx_ctl(intr_handle, epfd, op, vec, data);
+       if (rc && rc != -EEXIST) {
+               PMD_DEBUG_TRACE("p %u q %u rx ctl error"
+                               " op %d epfd %d vec %u\n",
+                               port_id, queue_id, op, epfd, vec);
+               return rc;
+       }
+
+       return 0;
+}
+
+int
+rte_eth_dev_rx_intr_enable(uint8_t port_id,
+                          uint16_t queue_id)
+{
+       struct rte_eth_dev *dev;
+
+       if (!rte_eth_dev_is_valid_port(port_id)) {
+               PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
+               return -ENODEV;
+       }
+
+       dev = &rte_eth_devices[port_id];
+
+       FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_intr_enable, -ENOTSUP);
+       return (*dev->dev_ops->rx_queue_intr_enable)(dev, queue_id);
+}
+
+int
+rte_eth_dev_rx_intr_disable(uint8_t port_id,
+                           uint16_t queue_id)
+{
+       struct rte_eth_dev *dev;
+
+       if (!rte_eth_dev_is_valid_port(port_id)) {
+               PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
+               return -ENODEV;
+       }
+
+       dev = &rte_eth_devices[port_id];
+
+       FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_intr_disable, -ENOTSUP);
+       return (*dev->dev_ops->rx_queue_intr_disable)(dev, queue_id);
+}
+
 #ifdef RTE_NIC_BYPASS
 int rte_eth_dev_bypass_init(uint8_t port_id)
 {