qede: Add get/set rx copy break tunable support
authorManish Chopra <manish.chopra@qlogic.com>
Thu, 30 Jun 2016 06:35:21 +0000 (02:35 -0400)
committerDavid S. Miller <davem@davemloft.net>
Fri, 1 Jul 2016 09:40:53 +0000 (05:40 -0400)
Signed-off-by: Manish <manish.chopra@qlogic.com>
Signed-off-by: Yuval Mintz <Yuval.Mintz@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/qlogic/qede/qede.h
drivers/net/ethernet/qlogic/qede/qede_ethtool.c
drivers/net/ethernet/qlogic/qede/qede_main.c

index 677213e..4e3f1a0 100644 (file)
@@ -143,6 +143,8 @@ struct qede_dev {
        struct mutex                    qede_lock;
        u32                             state; /* Protected by qede_lock */
        u16                             rx_buf_size;
+       u32                             rx_copybreak;
+
        /* L2 header size + 2*VLANs (8 bytes) + LLC SNAP (8 bytes) */
 #define ETH_OVERHEAD                   (ETH_HLEN + 8 + 8)
        /* Max supported alignment is 256 (8 shift)
@@ -333,6 +335,7 @@ void qede_recycle_rx_bd_ring(struct qede_rx_queue *rxq, struct qede_dev *edev,
 #define NUM_TX_BDS_MIN         128
 #define NUM_TX_BDS_DEF         NUM_TX_BDS_MAX
 
+#define QEDE_MIN_PKT_LEN       64
 #define QEDE_RX_HDR_SIZE       256
 #define        for_each_rss(i) for (i = 0; i < edev->num_rss; i++)
 
index 85633cf..f8492ca 100644 (file)
@@ -1185,6 +1185,48 @@ static void qede_self_test(struct net_device *dev,
        }
 }
 
+static int qede_set_tunable(struct net_device *dev,
+                           const struct ethtool_tunable *tuna,
+                           const void *data)
+{
+       struct qede_dev *edev = netdev_priv(dev);
+       u32 val;
+
+       switch (tuna->id) {
+       case ETHTOOL_RX_COPYBREAK:
+               val = *(u32 *)data;
+               if (val < QEDE_MIN_PKT_LEN || val > QEDE_RX_HDR_SIZE) {
+                       DP_VERBOSE(edev, QED_MSG_DEBUG,
+                                  "Invalid rx copy break value, range is [%u, %u]",
+                                  QEDE_MIN_PKT_LEN, QEDE_RX_HDR_SIZE);
+                       return -EINVAL;
+               }
+
+               edev->rx_copybreak = *(u32 *)data;
+               break;
+       default:
+               return -EOPNOTSUPP;
+       }
+
+       return 0;
+}
+
+static int qede_get_tunable(struct net_device *dev,
+                           const struct ethtool_tunable *tuna, void *data)
+{
+       struct qede_dev *edev = netdev_priv(dev);
+
+       switch (tuna->id) {
+       case ETHTOOL_RX_COPYBREAK:
+               *(u32 *)data = edev->rx_copybreak;
+               break;
+       default:
+               return -EOPNOTSUPP;
+       }
+
+       return 0;
+}
+
 static const struct ethtool_ops qede_ethtool_ops = {
        .get_settings = qede_get_settings,
        .set_settings = qede_set_settings,
@@ -1213,6 +1255,8 @@ static const struct ethtool_ops qede_ethtool_ops = {
        .get_channels = qede_get_channels,
        .set_channels = qede_set_channels,
        .self_test = qede_self_test,
+       .get_tunable = qede_get_tunable,
+       .set_tunable = qede_set_tunable,
 };
 
 static const struct ethtool_ops qede_vf_ethtool_ops = {
@@ -1235,6 +1279,8 @@ static const struct ethtool_ops qede_vf_ethtool_ops = {
        .set_rxfh = qede_set_rxfh,
        .get_channels = qede_get_channels,
        .set_channels = qede_set_channels,
+       .get_tunable = qede_get_tunable,
+       .set_tunable = qede_set_tunable,
 };
 
 void qede_set_ethtool_ops(struct net_device *dev)
index ea2df14..91e7bb0 100644 (file)
@@ -1474,7 +1474,7 @@ alloc_skb:
                }
 
                /* Copy data into SKB */
-               if (len + pad <= QEDE_RX_HDR_SIZE) {
+               if (len + pad <= edev->rx_copybreak) {
                        memcpy(skb_put(skb, len),
                               page_address(data) + pad +
                                sw_rx_data->page_offset, len);
@@ -2519,6 +2519,7 @@ static int __qede_probe(struct pci_dev *pdev, u32 dp_module, u8 dp_level,
 
        INIT_DELAYED_WORK(&edev->sp_task, qede_sp_task);
        mutex_init(&edev->qede_lock);
+       edev->rx_copybreak = QEDE_RX_HDR_SIZE;
 
        DP_INFO(edev, "Ending successfully qede probe\n");