get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/537194/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 537194,
    "url": "http://patchwork.ozlabs.org/api/patches/537194/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/1446010391-14421-2-git-send-email-gangfeng.huang@ni.com/",
    "project": {
        "id": 46,
        "url": "http://patchwork.ozlabs.org/api/projects/46/?format=api",
        "name": "Intel Wired Ethernet development",
        "link_name": "intel-wired-lan",
        "list_id": "intel-wired-lan.osuosl.org",
        "list_email": "intel-wired-lan@osuosl.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<1446010391-14421-2-git-send-email-gangfeng.huang@ni.com>",
    "list_archive_url": null,
    "date": "2015-10-28T05:33:10",
    "name": "[net-next,1/2] igb: add function to set I210 transmit mode",
    "commit_ref": null,
    "pull_url": null,
    "state": "rejected",
    "archived": false,
    "hash": "3155bbbf09aae4950f1373ba4320815aee758914",
    "submitter": {
        "id": 67513,
        "url": "http://patchwork.ozlabs.org/api/people/67513/?format=api",
        "name": "Gangfeng Huang",
        "email": "gangfeng.huang@ni.com"
    },
    "delegate": {
        "id": 68,
        "url": "http://patchwork.ozlabs.org/api/users/68/?format=api",
        "username": "jtkirshe",
        "first_name": "Jeff",
        "last_name": "Kirsher",
        "email": "jeffrey.t.kirsher@intel.com"
    },
    "mbox": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/1446010391-14421-2-git-send-email-gangfeng.huang@ni.com/mbox/",
    "series": [],
    "comments": "http://patchwork.ozlabs.org/api/patches/537194/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/537194/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<intel-wired-lan-bounces@lists.osuosl.org>",
        "X-Original-To": [
            "incoming@patchwork.ozlabs.org",
            "intel-wired-lan@lists.osuosl.org"
        ],
        "Delivered-To": [
            "patchwork-incoming@bilbo.ozlabs.org",
            "intel-wired-lan@lists.osuosl.org"
        ],
        "Received": [
            "from silver.osuosl.org (smtp3.osuosl.org [140.211.166.136])\n\tby ozlabs.org (Postfix) with ESMTP id EB17314090A\n\tfor <incoming@patchwork.ozlabs.org>;\n\tWed, 28 Oct 2015 16:33:47 +1100 (AEDT)",
            "from localhost (localhost [127.0.0.1])\n\tby silver.osuosl.org (Postfix) with ESMTP id 422672FBFF;\n\tWed, 28 Oct 2015 05:33:47 +0000 (UTC)",
            "from silver.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id pB36tqSsF4gu; Wed, 28 Oct 2015 05:33:44 +0000 (UTC)",
            "from ash.osuosl.org (ash.osuosl.org [140.211.166.34])\n\tby silver.osuosl.org (Postfix) with ESMTP id 9AC5A320D7;\n\tWed, 28 Oct 2015 05:33:44 +0000 (UTC)",
            "from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137])\n\tby ash.osuosl.org (Postfix) with ESMTP id 3137D1C44B1\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tWed, 28 Oct 2015 05:33:43 +0000 (UTC)",
            "from localhost (localhost [127.0.0.1])\n\tby fraxinus.osuosl.org (Postfix) with ESMTP id 2D86B88701\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tWed, 28 Oct 2015 05:33:43 +0000 (UTC)",
            "from fraxinus.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id hCF4D8cRhC87 for <intel-wired-lan@lists.osuosl.org>;\n\tWed, 28 Oct 2015 05:33:42 +0000 (UTC)",
            "from ni.com (skprod3.natinst.com [130.164.80.24])\n\tby fraxinus.osuosl.org (Postfix) with ESMTPS id D450588654\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tWed, 28 Oct 2015 05:33:41 +0000 (UTC)",
            "from us-aus-mgwout2.amer.corp.natinst.com\n\t(nb-chan1-1338.natinst.com [130.164.19.134])\n\tby us-aus-skprod3.natinst.com (8.15.0.59/8.15.0.59) with ESMTP id\n\tt9S5XeFw024916 for <intel-wired-lan@lists.osuosl.org>;\n\tWed, 28 Oct 2015 00:33:40 -0500",
            "from ni.com ([130.164.14.198])\n\tby us-aus-mgwout2.amer.corp.natinst.com (Lotus Domino Release\n\t8.5.3FP6 HF1218) with ESMTP id 2015102800334012-912693 ;\n\tWed, 28 Oct 2015 00:33:40 -0500 "
        ],
        "X-Virus-Scanned": [
            "amavisd-new at osuosl.org",
            "amavisd-new at osuosl.org"
        ],
        "X-Greylist": "domain auto-whitelisted by SQLgrey-1.7.6",
        "From": "Gangfeng Huang <gangfeng.huang@ni.com>",
        "To": "intel-wired-lan@lists.osuosl.org",
        "Date": "Wed, 28 Oct 2015 13:33:10 +0800",
        "Message-Id": "<1446010391-14421-2-git-send-email-gangfeng.huang@ni.com>",
        "X-Mailer": "git-send-email 1.7.9.5",
        "In-Reply-To": "<1446010391-14421-1-git-send-email-gangfeng.huang@ni.com>",
        "References": "<1446010391-14421-1-git-send-email-gangfeng.huang@ni.com>",
        "X-MIMETrack": "Itemize by SMTP Server on US-AUS-MGWOut2/AUS/H/NIC(Release\n\t8.5.3FP6 HF1218|December 12, 2014) at 10/28/2015 12:33:40 AM,\n\tSerialize by Router on US-AUS-MGWOut2/AUS/H/NIC(Release 8.5.3FP6\n\tHF1218|December 12, 2014) at 10/28/2015 12:33:40 AM,\n\tSerialize complete at 10/28/2015 12:33:40 AM",
        "X-Proofpoint-Virus-Version": "vendor=fsecure engine=2.50.10432:, ,\n\tdefinitions=2015-10-28_05:, , signatures=0",
        "Subject": "[Intel-wired-lan] [PATCH net-next 1/2] igb: add function to set\n\tI210 transmit mode",
        "X-BeenThere": "intel-wired-lan@lists.osuosl.org",
        "X-Mailman-Version": "2.1.18-1",
        "Precedence": "list",
        "List-Id": "Intel Wired Ethernet Linux Kernel Driver Development\n\t<intel-wired-lan.lists.osuosl.org>",
        "List-Unsubscribe": "<http://lists.osuosl.org/mailman/options/intel-wired-lan>, \n\t<mailto:intel-wired-lan-request@lists.osuosl.org?subject=unsubscribe>",
        "List-Archive": "<http://lists.osuosl.org/pipermail/intel-wired-lan/>",
        "List-Post": "<mailto:intel-wired-lan@lists.osuosl.org>",
        "List-Help": "<mailto:intel-wired-lan-request@lists.osuosl.org?subject=help>",
        "List-Subscribe": "<http://lists.osuosl.org/mailman/listinfo/intel-wired-lan>, \n\t<mailto:intel-wired-lan-request@lists.osuosl.org?subject=subscribe>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=\"us-ascii\"",
        "Content-Transfer-Encoding": "7bit",
        "Errors-To": "intel-wired-lan-bounces@lists.osuosl.org",
        "Sender": "\"Intel-wired-lan\" <intel-wired-lan-bounces@lists.osuosl.org>"
    },
    "content": "I210 supports two transmit modes, legacy and Qav. The transmit mode is\nconfigured in TQAVCTRL.QavMode register. Before this patch igb driver\nonly support legacy mode. This patch makes it possible to configure the\ntransmit mode.\n\nExample:\nGet the transmit mode:\n$ echo /sys/class/net/eth0/qav_mode\n0\nSet transmit mode to qav mode\n$ echo 1 > /sys/class/net/eth0/qav_mode\n\nTested:\nSetting /sys/class/net/eth0/qav_mode to Qav mode,\n 1) Switch back and forth between Qav mode and legacy mode\n 2) Send/recv packets in both mode.\n\nSigned-off-by: Gangfeng Huang <gangfeng.huang@ni.com>\n---\n drivers/net/ethernet/intel/igb/e1000_defines.h |   21 +++\n drivers/net/ethernet/intel/igb/e1000_regs.h    |    7 +\n drivers/net/ethernet/intel/igb/igb.h           |    5 +\n drivers/net/ethernet/intel/igb/igb_main.c      |  182 +++++++++++++++++++++++-\n 4 files changed, 213 insertions(+), 2 deletions(-)",
    "diff": "diff --git a/drivers/net/ethernet/intel/igb/e1000_defines.h b/drivers/net/ethernet/intel/igb/e1000_defines.h\nindex f8684aa..f09d016 100644\n--- a/drivers/net/ethernet/intel/igb/e1000_defines.h\n+++ b/drivers/net/ethernet/intel/igb/e1000_defines.h\n@@ -359,6 +359,7 @@\n #define MAX_JUMBO_FRAME_SIZE    0x3F00\n \n /* PBA constants */\n+#define E1000_PBA_32K 0x0020\n #define E1000_PBA_34K 0x0022\n #define E1000_PBA_64K 0x0040    /* 64KB */\n \n@@ -1014,4 +1015,24 @@\n #define E1000_RTTBCNRC_RF_INT_MASK\t\\\n \t(E1000_RTTBCNRC_RF_DEC_MASK << E1000_RTTBCNRC_RF_INT_SHIFT)\n \n+/* Queue mode, 0=strict, 1=SR mode */\n+#define E1000_TQAVCC_QUEUEMODE         0x80000000\n+/* Transmit mode, 0=legacy, 1=QAV */\n+#define E1000_TQAVCTRL_TXMODE          0x00000001\n+/* Report DMA time of tx packets */\n+#define E1000_TQAVCTRL_1588_STAT_EN    0x00000004\n+#define E1000_TQAVCTRL_DATA_FETCH_ARB  0x00000010 /* Data fetch arbitration */\n+#define E1000_TQAVCTRL_DATA_TRAN_ARB   0x00000100 /* Data tx arbitration */\n+#define E1000_TQAVCTRL_DATA_TRAN_TIM   0x00000200 /* Data launch time valid */\n+/* Stall SP to guarantee SR */\n+#define E1000_TQAVCTRL_SP_WAIT_SR      0x00000400\n+#define E1000_TQAVCTRL_FETCH_TM_SHIFT  (16)\n+\n+#define E1000_TXPBSIZE_TX0PB_SHIFT    0\n+#define E1000_TXPBSIZE_TX1PB_SHIFT    6\n+#define E1000_TXPBSIZE_TX2PB_SHIFT    12\n+#define E1000_TXPBSIZE_TX3PB_SHIFT    18\n+\n+#define E1000_DTXMXPKTSZ_DEFAULT 0x00000098\n+\n #endif\ndiff --git a/drivers/net/ethernet/intel/igb/e1000_regs.h b/drivers/net/ethernet/intel/igb/e1000_regs.h\nindex 6f0490d..2c73e7f 100644\n--- a/drivers/net/ethernet/intel/igb/e1000_regs.h\n+++ b/drivers/net/ethernet/intel/igb/e1000_regs.h\n@@ -135,6 +135,12 @@\n #define E1000_FCRTC\t0x02170 /* Flow Control Rx high watermark */\n #define E1000_PCIEMISC\t0x05BB8 /* PCIE misc config register */\n \n+/* High credit registers where _n can be 0 or 1. */\n+#define E1000_TQAVHC(_n)\t(0x300C + 0x40 * (_n))\n+/* QAV Tx mode control registers where _n can be 0 or 1. */\n+#define E1000_TQAVCC(_n)\t(0x3004 + 0x40 * (_n))\n+#define E1000_TQAVCTRL\t0x3570 /* Tx Qav Control registers */\n+\n /* TX Rate Limit Registers */\n #define E1000_RTTDQSEL\t0x3604 /* Tx Desc Plane Queue Select - WO */\n #define E1000_RTTBCNRM\t0x3690 /* Tx BCN Rate-scheduler MMW */\n@@ -201,6 +207,7 @@\n #define E1000_TDFT     0x03418  /* TX Data FIFO Tail - RW */\n #define E1000_TDFHS    0x03420  /* TX Data FIFO Head Saved - RW */\n #define E1000_TDFPC    0x03430  /* TX Data FIFO Packet Count - RW */\n+#define E1000_DTXMXPKT 0x0355C  /* DMA TX Maximum Packet Size */\n #define E1000_DTXCTL   0x03590  /* DMA TX Control - RW */\n #define E1000_CRCERRS  0x04000  /* CRC Error Count - R/clr */\n #define E1000_ALGNERRC 0x04004  /* Alignment Error Count - R/clr */\ndiff --git a/drivers/net/ethernet/intel/igb/igb.h b/drivers/net/ethernet/intel/igb/igb.h\nindex c2bd4f9..b84a266 100644\n--- a/drivers/net/ethernet/intel/igb/igb.h\n+++ b/drivers/net/ethernet/intel/igb/igb.h\n@@ -132,6 +132,9 @@ struct vf_data_storage {\n /* this is the size past which hardware will drop packets when setting LPE=0 */\n #define MAXIMUM_ETHERNET_VLAN_SIZE 1522\n \n+/* In qav mode, the maximum frame size is 1536 */\n+#define IGB_MAX_QAV_FRAME_SIZE 1536\n+\n /* Supported Rx Buffer Sizes */\n #define IGB_RXBUFFER_256\t256\n #define IGB_RXBUFFER_2048\t2048\n@@ -463,6 +466,8 @@ struct igb_adapter {\n \tint copper_tries;\n \tstruct e1000_info ei;\n \tu16 eee_advert;\n+\n+\tbool qav_mode;\n };\n \n #define IGB_FLAG_HAS_MSI\t\t(1 << 0)\ndiff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c\nindex 41e2740..1d00f41 100644\n--- a/drivers/net/ethernet/intel/igb/igb_main.c\n+++ b/drivers/net/ethernet/intel/igb/igb_main.c\n@@ -176,6 +176,17 @@ static int igb_ndo_get_vf_config(struct net_device *netdev, int vf,\n \t\t\t\t struct ifla_vf_info *ivi);\n static void igb_check_vf_rate_limit(struct igb_adapter *);\n \n+/* Switch qav mode and legacy mode by sysfs*/\n+static void igb_setup_qav_mode(struct igb_adapter *adapter);\n+static void igb_setup_normal_mode(struct igb_adapter *adapter);\n+static ssize_t igb_get_qav_mode(struct device *dev,\n+\t\t\t\tstruct device_attribute *attr, char *buf);\n+static ssize_t igb_set_qav_mode(struct device *dev,\n+\t\t\t\tstruct device_attribute *attr,\n+\t\t\t\tconst char *buf, size_t count);\n+static DEVICE_ATTR(qav_mode, S_IRUGO | S_IWUSR,\n+\t\t   igb_get_qav_mode, igb_set_qav_mode);\n+\n #ifdef CONFIG_PCI_IOV\n static int igb_vf_configure(struct igb_adapter *adapter, int vf);\n static int igb_pci_enable_sriov(struct pci_dev *dev, int num_vfs);\n@@ -1600,6 +1611,11 @@ static void igb_configure(struct igb_adapter *adapter)\n \n \tigb_restore_vlan(adapter);\n \n+\tif (adapter->qav_mode)\n+\t\tigb_setup_qav_mode(adapter);\n+\telse\n+\t\tigb_setup_normal_mode(adapter);\n+\n \tigb_setup_tctl(adapter);\n \tigb_setup_mrqc(adapter);\n \tigb_setup_rctl(adapter);\n@@ -1873,8 +1889,10 @@ void igb_reset(struct igb_adapter *adapter)\n \t\tpba = rd32(E1000_RXPBS);\n \t\tpba &= E1000_RXPBS_SIZE_MASK_82576;\n \t\tbreak;\n-\tcase e1000_82575:\n \tcase e1000_i210:\n+\t\tpba = (adapter->qav_mode) ? E1000_PBA_32K : E1000_PBA_34K;\n+\t\tbreak;\n+\tcase e1000_82575:\n \tcase e1000_i211:\n \tdefault:\n \t\tpba = E1000_PBA_34K;\n@@ -2286,6 +2304,7 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)\n \thw = &adapter->hw;\n \thw->back = adapter;\n \tadapter->msg_enable = netif_msg_init(debug, DEFAULT_MSG_ENABLE);\n+\tadapter->qav_mode = false;\n \n \terr = -EIO;\n \thw->hw_addr = pci_iomap(pdev, 0, 0);\n@@ -2531,6 +2550,15 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)\n \tif (err)\n \t\tgoto err_register;\n \n+\tif (hw->mac.type == e1000_i210) {\n+\t\terr = sysfs_create_file(&netdev->dev.kobj,\n+\t\t\t\t\t&dev_attr_qav_mode.attr);\n+\t\tif (err) {\n+\t\t\tnetdev_err(netdev, \"error creating sysfs file\\n\");\n+\t\t\tgoto err_register;\n+\t\t}\n+\t}\n+\n \t/* carrier off reporting is important to ethtool even BEFORE open */\n \tnetif_carrier_off(netdev);\n \n@@ -2805,6 +2833,9 @@ static void igb_remove(struct pci_dev *pdev)\n \t */\n \tigb_release_hw_control(adapter);\n \n+\tif (hw->mac.type == e1000_i210)\n+\t\tsysfs_remove_file(&netdev->dev.kobj, &dev_attr_qav_mode.attr);\n+\n \tunregister_netdev(netdev);\n \n \tigb_clear_interrupt_scheme(adapter);\n@@ -2886,7 +2917,12 @@ static void igb_init_queue_configuration(struct igb_adapter *adapter)\n \t\tbreak;\n \t}\n \n-\tadapter->rss_queues = min_t(u32, max_rss_queues, num_online_cpus());\n+\t/* For QAV mode, always enable all queues */\n+\tif (adapter->qav_mode)\n+\t\tadapter->rss_queues = max_rss_queues;\n+\telse\n+\t\tadapter->rss_queues = min_t(u32, max_rss_queues,\n+\t\t\t\t\t    num_online_cpus());\n \n \t/* Determine if we need to pair queues. */\n \tswitch (hw->mac.type) {\n@@ -5144,6 +5180,10 @@ static int igb_change_mtu(struct net_device *netdev, int new_mtu)\n \t\treturn -EINVAL;\n \t}\n \n+\t/* For i210 Qav mode, the max frame is 1536 */\n+\tif (adapter->qav_mode && max_frame > IGB_MAX_QAV_FRAME_SIZE)\n+\t\treturn -EINVAL;\n+\n #define MAX_STD_JUMBO_FRAME_SIZE 9238\n \tif (max_frame > MAX_STD_JUMBO_FRAME_SIZE) {\n \t\tdev_err(&pdev->dev, \"MTU > 9216 not supported.\\n\");\n@@ -8075,4 +8115,142 @@ int igb_reinit_queues(struct igb_adapter *adapter)\n \n \treturn err;\n }\n+\n+static void igb_setup_qav_mode(struct igb_adapter *adapter)\n+{\n+\tstruct e1000_hw *hw = &adapter->hw;\n+\tu32\ttqavctrl;\n+\tu32\ttqavcc0, tqavcc1;\n+\tu32\ttqavhc0, tqavhc1;\n+\tu32\ttxpbsize;\n+\n+\t/* reconfigure the tx packet buffer allocation */\n+\ttxpbsize = (8);\n+\ttxpbsize |= (8) << E1000_TXPBSIZE_TX1PB_SHIFT;\n+\ttxpbsize |= (4) << E1000_TXPBSIZE_TX2PB_SHIFT;\n+\ttxpbsize |= (4) << E1000_TXPBSIZE_TX3PB_SHIFT;\n+\n+\twr32(E1000_TXPBS, txpbsize);\n+\n+\t/* In Qav mode, the maximum sized frames of 1536 bytes */\n+\twr32(E1000_DTXMXPKT, IGB_MAX_QAV_FRAME_SIZE / 64);\n+\n+\t/* The I210 implements 4 queues, up to two queues are dedicated\n+\t * for stream reservation or priority, strict priority queuing\n+\t * while SR queue are subjected to launch time policy\n+\t */\n+\n+\ttqavcc0 = E1000_TQAVCC_QUEUEMODE; /* no idle slope */\n+\ttqavcc1 = E1000_TQAVCC_QUEUEMODE; /* no idle slope */\n+\ttqavhc0 = 0xFFFFFFFF; /* unlimited credits */\n+\ttqavhc1 = 0xFFFFFFFF; /* unlimited credits */\n+\n+\twr32(E1000_TQAVCC(0), tqavcc0);\n+\twr32(E1000_TQAVCC(1), tqavcc1);\n+\twr32(E1000_TQAVHC(0), tqavhc0);\n+\twr32(E1000_TQAVHC(1), tqavhc1);\n+\n+\ttqavctrl = E1000_TQAVCTRL_TXMODE |\n+\t\t\tE1000_TQAVCTRL_DATA_FETCH_ARB |\n+\t\t\tE1000_TQAVCTRL_DATA_TRAN_TIM |\n+\t\t\tE1000_TQAVCTRL_SP_WAIT_SR;\n+\n+\t/* Default to a 10 usec prefetch delta from launch time - time for\n+\t * a 1500 byte rx frame to be received over the PCIe Gen1 x1 link.\n+\t */\n+\ttqavctrl |= (10 << 5) << E1000_TQAVCTRL_FETCH_TM_SHIFT;\n+\n+\twr32(E1000_TQAVCTRL, tqavctrl);\n+}\n+\n+static void igb_setup_normal_mode(struct igb_adapter *adapter)\n+{\n+\tstruct e1000_hw *hw = &adapter->hw;\n+\n+\twr32(E1000_TXPBS, I210_TXPBSIZE_DEFAULT);\n+\twr32(E1000_DTXMXPKT, E1000_DTXMXPKTSZ_DEFAULT);\n+\twr32(E1000_TQAVCTRL, 0);\n+}\n+\n+static int igb_change_mode(struct igb_adapter *adapter, int request_mode)\n+{\n+\tstruct net_device *netdev;\n+\tint err = 0;\n+\tint current_mode;\n+\n+\tif (NULL == adapter) {\n+\t\tdev_err(&adapter->pdev->dev, \"map to unbound device!\\n\");\n+\t\treturn -ENOENT;\n+\t}\n+\n+\tcurrent_mode = adapter->qav_mode;\n+\n+\tif (request_mode == current_mode)\n+\t\treturn 0;\n+\n+\tnetdev = adapter->netdev;\n+\n+\trtnl_lock();\n+\n+\tif (netif_running(netdev))\n+\t\tigb_close(netdev);\n+\telse\n+\t\tigb_reset(adapter);\n+\n+\tigb_clear_interrupt_scheme(adapter);\n+\n+\tadapter->qav_mode = request_mode;\n+\n+\tigb_init_queue_configuration(adapter);\n+\n+\tif (igb_init_interrupt_scheme(adapter, true)) {\n+\t\tdev_err(&adapter->pdev->dev,\n+\t\t\t\"Unable to allocate memory for queues\\n\");\n+\t\terr = -ENOMEM;\n+\t\tgoto err_out;\n+\t}\n+\n+\tif (netif_running(netdev))\n+\t\tigb_open(netdev);\n+\n+\trtnl_unlock();\n+\n+\treturn err;\n+err_out:\n+\trtnl_unlock();\n+\treturn err;\n+}\n+\n+static ssize_t igb_get_qav_mode(struct device *dev,\n+\t\t\t\tstruct device_attribute *attr, char *buf)\n+{\n+\tstruct net_device *netdev = to_net_dev(dev);\n+\tstruct igb_adapter *adapter = netdev_priv(netdev);\n+\n+\treturn scnprintf(buf, PAGE_SIZE, \"%d\\n\", adapter->qav_mode);\n+}\n+\n+static ssize_t igb_set_qav_mode(struct device *dev,\n+\t\t\t\tstruct device_attribute *attr,\n+\t\t\t\tconst char *buf, size_t len)\n+{\n+\tstruct net_device *netdev = to_net_dev(dev);\n+\tstruct igb_adapter *adapter = netdev_priv(netdev);\n+\tint request_mode, err;\n+\n+\tif (!capable(CAP_NET_ADMIN))\n+\t\treturn -EPERM;\n+\n+\tif (0 > kstrtoint(buf, 0, &request_mode))\n+\t\treturn -EINVAL;\n+\n+\tif (request_mode != 0 && request_mode != 1)\n+\t\treturn -EINVAL;\n+\n+\terr = igb_change_mode(adapter, request_mode);\n+\tif (err)\n+\t\treturn err;\n+\n+\treturn len;\n+}\n /* igb_main.c */\n",
    "prefixes": [
        "net-next",
        "1/2"
    ]
}