OSDN Git Service

qede: Honor user request for Tx buffers
[uclinux-h8/linux.git] / drivers / net / ethernet / qlogic / qede / qede_main.c
index b9ba23d..766bd37 100644 (file)
@@ -563,6 +563,23 @@ static const struct net_device_ops qede_netdev_ops = {
 #endif
 };
 
+static const struct net_device_ops qede_netdev_vf_ops = {
+       .ndo_open = qede_open,
+       .ndo_stop = qede_close,
+       .ndo_start_xmit = qede_start_xmit,
+       .ndo_set_rx_mode = qede_set_rx_mode,
+       .ndo_set_mac_address = qede_set_mac_addr,
+       .ndo_validate_addr = eth_validate_addr,
+       .ndo_change_mtu = qede_change_mtu,
+       .ndo_vlan_rx_add_vid = qede_vlan_rx_add_vid,
+       .ndo_vlan_rx_kill_vid = qede_vlan_rx_kill_vid,
+       .ndo_set_features = qede_set_features,
+       .ndo_get_stats64 = qede_get_stats64,
+       .ndo_udp_tunnel_add = qede_udp_tunnel_add,
+       .ndo_udp_tunnel_del = qede_udp_tunnel_del,
+       .ndo_features_check = qede_features_check,
+};
+
 /* -------------------------------------------------------------------------
  * START OF PROBE / REMOVE
  * -------------------------------------------------------------------------
@@ -601,6 +618,12 @@ static struct qede_dev *qede_alloc_etherdev(struct qed_dev *cdev,
        memset(&edev->stats, 0, sizeof(edev->stats));
        memcpy(&edev->dev_info, info, sizeof(*info));
 
+       /* As ethtool doesn't have the ability to show WoL behavior as
+        * 'default', if device supports it declare it's enabled.
+        */
+       if (edev->dev_info.common.wol_support)
+               edev->wol_enabled = true;
+
        INIT_LIST_HEAD(&edev->vlan_list);
 
        return edev;
@@ -622,7 +645,10 @@ static void qede_init_ndev(struct qede_dev *edev)
 
        ndev->watchdog_timeo = TX_TIMEOUT;
 
-       ndev->netdev_ops = &qede_netdev_ops;
+       if (IS_VF(edev))
+               ndev->netdev_ops = &qede_netdev_vf_ops;
+       else
+               ndev->netdev_ops = &qede_netdev_ops;
 
        qede_set_ethtool_ops(ndev);
 
@@ -1278,12 +1304,12 @@ static int qede_alloc_mem_txq(struct qede_dev *edev, struct qede_tx_queue *txq)
 
        /* Allocate the parallel driver ring for Tx buffers */
        if (txq->is_xdp) {
-               size = sizeof(*txq->sw_tx_ring.xdp) * TX_RING_SIZE;
+               size = sizeof(*txq->sw_tx_ring.xdp) * txq->num_tx_buffers;
                txq->sw_tx_ring.xdp = kzalloc(size, GFP_KERNEL);
                if (!txq->sw_tx_ring.xdp)
                        goto err;
        } else {
-               size = sizeof(*txq->sw_tx_ring.skbs) * TX_RING_SIZE;
+               size = sizeof(*txq->sw_tx_ring.skbs) * txq->num_tx_buffers;
                txq->sw_tx_ring.skbs = kzalloc(size, GFP_KERNEL);
                if (!txq->sw_tx_ring.skbs)
                        goto err;
@@ -1293,7 +1319,7 @@ static int qede_alloc_mem_txq(struct qede_dev *edev, struct qede_tx_queue *txq)
                                            QED_CHAIN_USE_TO_CONSUME_PRODUCE,
                                            QED_CHAIN_MODE_PBL,
                                            QED_CHAIN_CNT_TYPE_U16,
-                                           TX_RING_SIZE,
+                                           txq->num_tx_buffers,
                                            sizeof(*p_virt), &txq->tx_pbl);
        if (rc)
                goto err;
@@ -1313,6 +1339,9 @@ static void qede_free_mem_fp(struct qede_dev *edev, struct qede_fastpath *fp)
        if (fp->type & QEDE_FASTPATH_RX)
                qede_free_mem_rxq(edev, fp->rxq);
 
+       if (fp->type & QEDE_FASTPATH_XDP)
+               qede_free_mem_txq(edev, fp->xdp_tx);
+
        if (fp->type & QEDE_FASTPATH_TX)
                qede_free_mem_txq(edev, fp->txq);
 }