get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 818068,
    "url": "http://patchwork.ozlabs.org/api/patches/818068/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/netdev/patch/741eecf97fcc91809cf25252ea25cfe128182b59.1506324091.git.igor.russkikh@aquantia.com/",
    "project": {
        "id": 7,
        "url": "http://patchwork.ozlabs.org/api/projects/7/?format=api",
        "name": "Linux network development",
        "link_name": "netdev",
        "list_id": "netdev.vger.kernel.org",
        "list_email": "netdev@vger.kernel.org",
        "web_url": null,
        "scm_url": null,
        "webscm_url": null,
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<741eecf97fcc91809cf25252ea25cfe128182b59.1506324091.git.igor.russkikh@aquantia.com>",
    "list_archive_url": null,
    "date": "2017-09-25T07:48:48",
    "name": "[net,v2,2/4] net:ethernet:aquantia: Fix Tx queue hangups",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "b3520ec3197f0e44046d2920d4dd08173bf4d623",
    "submitter": {
        "id": 72409,
        "url": "http://patchwork.ozlabs.org/api/people/72409/?format=api",
        "name": "Igor Russkikh",
        "email": "igor.russkikh@aquantia.com"
    },
    "delegate": {
        "id": 34,
        "url": "http://patchwork.ozlabs.org/api/users/34/?format=api",
        "username": "davem",
        "first_name": "David",
        "last_name": "Miller",
        "email": "davem@davemloft.net"
    },
    "mbox": "http://patchwork.ozlabs.org/project/netdev/patch/741eecf97fcc91809cf25252ea25cfe128182b59.1506324091.git.igor.russkikh@aquantia.com/mbox/",
    "series": [
        {
            "id": 4883,
            "url": "http://patchwork.ozlabs.org/api/series/4883/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/netdev/list/?series=4883",
            "date": "2017-09-25T07:48:46",
            "name": "net:ethernet:aquantia: Atlantic driver bugfixes und improvements",
            "version": 2,
            "mbox": "http://patchwork.ozlabs.org/series/4883/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/818068/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/818068/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<netdev-owner@vger.kernel.org>",
        "X-Original-To": "patchwork-incoming@ozlabs.org",
        "Delivered-To": "patchwork-incoming@ozlabs.org",
        "Authentication-Results": [
            "ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=netdev-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)",
            "ozlabs.org; dkim=pass (1024-bit key;\n\tunprotected) header.d=AQUANTIA1COM.onmicrosoft.com\n\theader.i=@AQUANTIA1COM.onmicrosoft.com header.b=\"n1F1XVSr\"; \n\tdkim-atps=neutral",
            "spf=none (sender IP is )\n\tsmtp.mailfrom=Igor.Russkikh@aquantia.com; "
        ],
        "Received": [
            "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3y0x7P5TgJz9t1G\n\tfor <patchwork-incoming@ozlabs.org>;\n\tMon, 25 Sep 2017 17:49:37 +1000 (AEST)",
            "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S933960AbdIYHtg (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tMon, 25 Sep 2017 03:49:36 -0400",
            "from mail-bn3nam01on0088.outbound.protection.outlook.com\n\t([104.47.33.88]:41441\n\t\"EHLO NAM01-BN3-obe.outbound.protection.outlook.com\"\n\trhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP\n\tid S933208AbdIYHte (ORCPT <rfc822;netdev@vger.kernel.org>);\n\tMon, 25 Sep 2017 03:49:34 -0400",
            "from ubuntubox.rdc.aquantia.com (95.79.108.179) by\n\tCY1PR0701MB1964.namprd07.prod.outlook.com (10.163.141.18) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id\n\t15.20.77.7; Mon, 25 Sep 2017 07:49:25 +0000"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=AQUANTIA1COM.onmicrosoft.com; s=selector1-aquantia-com;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version;\n\tbh=MocPL7sxYaTLX+yGdRgPO5fDv018hju63sGXdICvylA=;\n\tb=n1F1XVSrbH92cNjXSwbZEKtw3HapLNPM7r2m3I73JawW5X2N31gDafixTOEp0vzsjNySZ+BrPALrhC46hXqDl7tPTjSqZ6gfyFwMi7bgQZaux+NpaETx1ZQM0sG7sEPdD3yg2droKpII7M4JOk+Skgq1hB2pqmDPdpG6zlwc7Rc=",
        "From": "Igor Russkikh <igor.russkikh@aquantia.com>",
        "To": "\"David S . Miller\" <davem@davemloft.net>",
        "Cc": "netdev@vger.kernel.org, David Arcari <darcari@redhat.com>,\n\tPavel Belous <pavel.belous@aquantia.com>,\n\tNadezhda Krupnina <Nadezhda.Krupnina@aquantia.com>,\n\tSimon Edelhaus <simon.edelhaus@aquantia.com>,\n\tIgor Russkikh <igor.russkikh@aquantia.com>,\n\tPavel Belous <Pavel.Belous@aquantia.com>",
        "Subject": "[PATCH net v2 2/4] net:ethernet:aquantia: Fix Tx queue hangups",
        "Date": "Mon, 25 Sep 2017 10:48:48 +0300",
        "Message-Id": "<741eecf97fcc91809cf25252ea25cfe128182b59.1506324091.git.igor.russkikh@aquantia.com>",
        "X-Mailer": "git-send-email 2.7.4",
        "In-Reply-To": "<cover.1506324091.git.igor.russkikh@aquantia.com>",
        "References": "<cover.1506324091.git.igor.russkikh@aquantia.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[95.79.108.179]",
        "X-ClientProxiedBy": "DB6PR0202CA0008.eurprd02.prod.outlook.com (10.169.218.18)\n\tTo CY1PR0701MB1964.namprd07.prod.outlook.com\n\t(10.163.141.18)",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-Correlation-Id": "80174abb-c4e5-4b13-5777-08d503e9f57f",
        "X-Microsoft-Antispam": "UriScan:; BCL:0; PCL:0;\n\tRULEID:(22001)(2017030254152)(2017052603199)(201703131423075)(201703031133081)(201702281549075);\n\tSRVR:CY1PR0701MB1964; ",
        "X-Microsoft-Exchange-Diagnostics": [
            "1; CY1PR0701MB1964;\n\t3:4qJT3x+lxgWPBZBllfSb+BHbgaGqtVPzanyrIwWoc+GxrAtA05ppyOvYVZfHOLgICzddcqqWvRn+0Nlxrw4NhjD19k+4Y8wdZe11lx7ynmClxoEIGhuOHlCEp2t6jNGagZPya3zeT9iRnERUUsre6TyedoO1Bk0YBpVQm5/3E5qZ+67whHrjpYOQ9zv1P10KG+Apu7qAEqJzb8Uy3u747T1ryQJEH+crlkTiSgUZWX9UjfKRYhvXXM13IzfphXaH;\n\t25:i6iNWpZ2gjea+oMD3WxZx+aWhQiB4gr6Q53ZdFAswBaRWE8vvyZv8Kb07zTVba5je8bO336wNH5rH5ib1iBFZwzYBIeEERFcjjNgCSdxs2EqeG59SVsxE28xGJeenRV+v+K7lI6IyovmfbZ15tyQLqSQ2rA4ZAf5rtrIkmp8+yY1tGR3atowNsU6sKSLQppYhLlL48/nfOHApxZk0jbghgbz7MDw0B3XXP0hhvywHTnnfxdapQlLrn8g3XsgH52VzJkZJTzhwffeQ4YETQqGWsFzQ+cKgvdQGinYwiYoiVJO69NHmc+8gzXFulJ1K+CEC1aqahQ0yNbExlgHTq+V3w==;\n\t31:/E2tp7u7ORaCuq4sQ1hXbkgnAHElNsLPD8sEeIzWvvnpeDpBNCy9HH530qUingWm37AG21zUmzaSNcLsQ83nqJmsBYqKxcifg+AjR/GyWnsDoTA1mm2SHgTP2Dd0pMR+dJE9tXF08h6cG89jnIpcmrMpz9xp9nUl2/EibcdVpf+OWl4g4CVDHf7kDHysNiTg/ZmxGJ7VAJUjxe/Vt+4fVD7R0c98JD67vc8LVZyWPaM=",
            "1; CY1PR0701MB1964;\n\t20:crtpcAgt6d2+3p/uH/PtKzB6U4VcDfZoPU6gJNPz6yNWmDrdSDGJrNbwW13s3g0Vl3CDYGMw+97rNrCEFXUpfjYZbMyduR9yOT7q+LJI2PzdVYAa+tdv/i9p9NTXBOnrZtmgh6iCTsuuUVrzEcaChr0z81LbGnT9c7MPf23OOQvbhRnZS4JJIAQ+D+YMfcoCX5sor2adCDRtlWu66boDGaTkPpS+UtcnnbCPMXnjjNyCtoLtpq3NQvJTtGsvU/0yte9nZfUXzKLnRf0hFNdjwwpVlPZpGaTe4AtzlTYI8NyXxJ2yG6iqGk01Axx7aSxDkYgCc8JPV2WlBxhVp0krCLY04cpbCr7hC6jBnVdGKu6KA/QRUCPpAdv1iQ3E1KNN2+7mf1KQzldbI0/MLCYmxeX/E/9WI6ZR86JX3YXTSqE3qIrUazEaMTVJVQ+SHT8wnYOTFIXc+SMpwvd94XK03e6i9JUsPxvzPi0ETlIseEBRBE0SHPyCKS0tp+8Wdg2R;\n\t4:l3ha6IlwlUcv9X77PRymnkakrvJ3kCDjKqcmLupZKrK3Osr+1l3tr90/WhiVbccuM3OYcySJW0kw+h3B0SMvg4mdLGR4mUQi2Ed0Jc9vsfR3eMhG8wZ0iEZLbprEb1AloPxFmkDfHUsSaRTvRG3ONzdPeaHWvw2RHQ6YN7SND+Vfb/69MZzSxiSaFOmtQxn0LUCkwxJoFGL3T9vIIthEXxFwh+GwxkmiTtZAziV1qCFa0ULarqODKBbJvmjIBaBS",
            "1; CY1PR0701MB1964;\n\t23:486UD46Lb9uXslVHHyWiqqweP51i6pAUziY/DGLhMWHd6wcTuWX5EqG/804mQSTu2HrPG7wjiNiF7IbOnB02Zphk7+H7Rm+rvp519vVXzbdhuJeU69B8OH958GQv5QVuEbC1igCRtPgI5ef0NqSc91UFxh3VztHKu2wtnrtccu1+Ldzmy4n1jS0B7Ct5hKpXCMkVAdlVxg0wh73KKSu2fuFvfK5C8p3vqTdKEUXWSbXC9tMRB/w/aLlC+y4AgCCbAiHwpwvVDpVt/WstVmd/kXaH/OnYsMUUWogmyz6fUZLNXVnoLT2oVG5x6yuMGc5/hvEMecsj72eeYRb8cVD0O1xOfmg0cmO6sNiJXKixqGlrKeFVKqeuaIwuogjGTHJG/OPTfk7adl6HTLsP75b0ZyAZrb1uc6lPkrcnJEGNXOJt0CRY64zo8hqyqfjnoqxl0Z7r2c3Suv2QlER5AhaYEfOL9CVzu9fJvDuLc2NOi/Hh6AptDHn4j6e73k6FH2U7xRw6/4kCUIpkpXb4eEDp0gacaviCRhDE2urbMV9qsSST7UoCCqBzU/kJ7fkdjBuYa9ICChd8kY98zMjasBdUyOMJgliWh+9D1DXFpqQEZ/xo0umhk79RxCGY2O/UoVZXaizDnNurRDJ4co00UcYUY5vKKoTR1WHI7txjzEo1UHybL+BbYaz67paron9XC4qSrTrRvPg5FrGufvda54Q4Q3Z0+6b47yr/8OWewd3Fo7QXZcNDp952yXeivJ8qLJZfajytlsPsZ3e3XQSUwo6vSQALzT8/vkBTJkl/yoRPDAD24qnC557w7g+RMrwz6OcaV624LVIHKebW4TANtSmCaie77VxEovh86SVS8isK4gasvJ4iyyFCjdpBnaccPd50RWKepsOKkOfHvB3lFP2ZX39kvZIJOQqZNPZNrJVkaSH0ysVRJWSHAOAgFa3qjzGZjNvqpskLPG6SoDv393s4wCOz3jlbH0GVZKeoZvYMIu59NM89qeSllfqOGi8Tfoss5yWSs3FSV5jiI/dwS+z27tXxi1Fukr+BxXRHEUl9Z8Mn4ql7zu4tNtIxb+G7Oxy+eFXN4wMDSpG/tDS5bNUYQgHkk4nKTvnuVkXJpm1A+SysYuuxrffFA/mG+EV1hnnw",
            "1; CY1PR0701MB1964;\n\t6:mV6xJcTjLonKURMz1BhHeutmaXkmrDHn6Iw4rrMeW8q0Mhl92+080eE/uTi+mLnL9PLIPe+NYf+D9pLDdy9mlq8NZ55877cKxcSFnkvVAh8i9eRmpq7DVIV52wKtBilBC93T6vkKRMUfMdXsgCiBv8P3hY18uVR4J2nIoXdcuQxb2UAHF89i+jgbznacX1a4A4/byrqptFDVaLGGVLWMAgO2o99fYZiiPpbt+3gByDZ3hXkQ74ohvBwW3940Clu9PJrjSEp6nEut7vXAGborCuFutfwpvg7EdMBzWQh49Th6XXZfy+xPC3HdlpCatS8RdmdPpqfErXQdc2owKJTLCg==;\n\t5:XqJVOL65v9kp/5F4KZKcAf3nyrpPRZIIhdt4S5Omx6LZdLwUk/Lcf20F+d5v7ecgJv3+c+NGiDQ1pZSkmEK+kNohHJyfRvnrvq+Mwr+ki3HH6pSPuk8/dzZuQ5JdvLu5jh9xu+vesLbV1KrVkEvolQ==;\n\t24:o2qTFbHZz9ZOMOTaVHpUAF2P5AbxsvKECqXQ9AkFCKItFI0KobQbiLhdq6R4eRPRh/TuSq4QGruxtBnNWjlWC4A9BahD6hiVyRuzLSoygzw=;\n\t7:Cc+yhzJx7RMIRCQUgw4SEbIAmyG3sDbi8G/9MUGg4M/uhFnxJL4h5ITjrrHB8EY7atydg7GA3FQXdAhEmjDkq1UD+g0gbJEv8YjTTI5sE5SwpsA4xNY4laLA9FQ62ETd1SmL5mznBhZP5sKIGNMVMB0JS5WPbaspkH1dnQ3MtrLXNroIzHXN6RwauyRu+g4NNbwiIm7zyj2B1B6a29X6RqL02v1anyTfQW2osQnh15c="
        ],
        "X-MS-TrafficTypeDiagnostic": "CY1PR0701MB1964:",
        "X-Exchange-Antispam-Report-Test": "UriScan:;",
        "X-Microsoft-Antispam-PRVS": "<CY1PR0701MB196492133BD46BC55CA46A08987A0@CY1PR0701MB1964.namprd07.prod.outlook.com>",
        "X-Exchange-Antispam-Report-CFA-Test": "BCL:0; PCL:0;\n\tRULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(5005006)(8121501046)(10201501046)(3002001)(100000703101)(100105400095)(93006095)(93001095)(6041248)(20161123560025)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123555025)(20161123564025)(20161123562025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);\n\tSRVR:CY1PR0701MB1964; BCL:0; PCL:0;\n\tRULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);\n\tSRVR:CY1PR0701MB1964; ",
        "X-Forefront-PRVS": "04410E544A",
        "X-Forefront-Antispam-Report": "SFV:NSPM;\n\tSFS:(10009020)(6009001)(376002)(39830400002)(346002)(199003)(189002)(5003940100001)(53936002)(50986999)(86362001)(316002)(6486002)(16526017)(36756003)(16586007)(81166006)(106356001)(7736002)(107886003)(54906003)(6916009)(189998001)(50226002)(72206003)(48376002)(118296001)(101416001)(105586002)(81156014)(2950100002)(478600001)(8676002)(68736007)(3846002)(6116002)(50466002)(6666003)(76176999)(66066001)(5660300001)(47776003)(25786009)(97736004)(4326008)(8936002)(305945005)(2906002)(33646002);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR0701MB1964;\n\tH:ubuntubox.rdc.aquantia.com; FPR:; SPF:None;\n\tPTR:InfoNoRecords; A:1; MX:1; LANG:en; ",
        "Received-SPF": "None (protection.outlook.com: aquantia.com does not designate\n\tpermitted sender hosts)",
        "SpamDiagnosticOutput": "1:99",
        "SpamDiagnosticMetadata": "NSPM",
        "X-OriginatorOrg": "aquantia.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "25 Sep 2017 07:49:25.4129\n\t(UTC)",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "83e2e134-991c-4ede-8ced-34d47e38e6b1",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "CY1PR0701MB1964",
        "Sender": "netdev-owner@vger.kernel.org",
        "Precedence": "bulk",
        "List-ID": "<netdev.vger.kernel.org>",
        "X-Mailing-List": "netdev@vger.kernel.org"
    },
    "content": "Driver did a poor job in managing its Tx queues: Sometimes it could stop\ntx queues due to link down condition in aq_nic_xmit - but never waked up\nthem. That led to Tx path total suspend.\nThis patch fixes this and improves generic queue management:\n- introduces queue restart counter\n- uses generic netif_ interface to disable and enable tx path\n- refactors link up/down condition and introduces dmesg log event when\n  link changes.\n- introduces new constant for minimum descriptors count required for queue\n  wakeup\n\nSigned-off-by: Pavel Belous <Pavel.Belous@aquantia.com>\nSigned-off-by: Igor Russkikh <igor.russkikh@aquantia.com>\n---\n drivers/net/ethernet/aquantia/atlantic/aq_cfg.h  |  4 ++\n drivers/net/ethernet/aquantia/atlantic/aq_nic.c  | 91 +++++++++++-------------\n drivers/net/ethernet/aquantia/atlantic/aq_nic.h  |  2 -\n drivers/net/ethernet/aquantia/atlantic/aq_ring.c | 26 +++++++\n drivers/net/ethernet/aquantia/atlantic/aq_ring.h |  4 ++\n drivers/net/ethernet/aquantia/atlantic/aq_vec.c  |  8 +--\n 6 files changed, 76 insertions(+), 59 deletions(-)",
    "diff": "diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h b/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h\nindex 2149864..0fdaaa6 100644\n--- a/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h\n+++ b/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h\n@@ -51,6 +51,10 @@\n \n #define AQ_CFG_SKB_FRAGS_MAX   32U\n \n+/* Number of descriptors available in one ring to resume this ring queue\n+ */\n+#define AQ_CFG_RESTART_DESC_THRES   (AQ_CFG_SKB_FRAGS_MAX * 2)\n+\n #define AQ_CFG_NAPI_WEIGHT     64U\n \n #define AQ_CFG_MULTICAST_ADDRESS_MAX     32U\ndiff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c\nindex bf26a59..072a550 100644\n--- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c\n+++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c\n@@ -119,6 +119,35 @@ int aq_nic_cfg_start(struct aq_nic_s *self)\n \treturn 0;\n }\n \n+static int aq_nic_update_link_status(struct aq_nic_s *self)\n+{\n+\tint err = self->aq_hw_ops.hw_get_link_status(self->aq_hw);\n+\n+\tif (err)\n+\t\treturn err;\n+\n+\tif (self->link_status.mbps != self->aq_hw->aq_link_status.mbps)\n+\t\tpr_info(\"%s: link change old %d new %d\\n\",\n+\t\t\tAQ_CFG_DRV_NAME, self->link_status.mbps,\n+\t\t\tself->aq_hw->aq_link_status.mbps);\n+\n+\tself->link_status = self->aq_hw->aq_link_status;\n+\tif (!netif_carrier_ok(self->ndev) && self->link_status.mbps) {\n+\t\taq_utils_obj_set(&self->header.flags,\n+\t\t\t\t AQ_NIC_FLAG_STARTED);\n+\t\taq_utils_obj_clear(&self->header.flags,\n+\t\t\t\t   AQ_NIC_LINK_DOWN);\n+\t\tnetif_carrier_on(self->ndev);\n+\t\tnetif_tx_wake_all_queues(self->ndev);\n+\t}\n+\tif (netif_carrier_ok(self->ndev) && !self->link_status.mbps) {\n+\t\tnetif_carrier_off(self->ndev);\n+\t\tnetif_tx_disable(self->ndev);\n+\t\taq_utils_obj_set(&self->header.flags, AQ_NIC_LINK_DOWN);\n+\t}\n+\treturn 0;\n+}\n+\n static void aq_nic_service_timer_cb(unsigned long param)\n {\n \tstruct aq_nic_s *self = (struct aq_nic_s *)param;\n@@ -131,26 +160,13 @@ static void aq_nic_service_timer_cb(unsigned long param)\n \tif (aq_utils_obj_test(&self->header.flags, AQ_NIC_FLAGS_IS_NOT_READY))\n \t\tgoto err_exit;\n \n-\terr = self->aq_hw_ops.hw_get_link_status(self->aq_hw);\n-\tif (err < 0)\n+\terr = aq_nic_update_link_status(self);\n+\tif (err)\n \t\tgoto err_exit;\n \n-\tself->link_status = self->aq_hw->aq_link_status;\n-\n \tself->aq_hw_ops.hw_interrupt_moderation_set(self->aq_hw,\n \t\t    self->aq_nic_cfg.is_interrupt_moderation);\n \n-\tif (self->link_status.mbps) {\n-\t\taq_utils_obj_set(&self->header.flags,\n-\t\t\t\t AQ_NIC_FLAG_STARTED);\n-\t\taq_utils_obj_clear(&self->header.flags,\n-\t\t\t\t   AQ_NIC_LINK_DOWN);\n-\t\tnetif_carrier_on(self->ndev);\n-\t} else {\n-\t\tnetif_carrier_off(self->ndev);\n-\t\taq_utils_obj_set(&self->header.flags, AQ_NIC_LINK_DOWN);\n-\t}\n-\n \tmemset(&stats_rx, 0U, sizeof(struct aq_ring_stats_rx_s));\n \tmemset(&stats_tx, 0U, sizeof(struct aq_ring_stats_tx_s));\n \tfor (i = AQ_DIMOF(self->aq_vec); i--;) {\n@@ -240,7 +256,6 @@ struct aq_nic_s *aq_nic_alloc_cold(const struct net_device_ops *ndev_ops,\n int aq_nic_ndev_register(struct aq_nic_s *self)\n {\n \tint err = 0;\n-\tunsigned int i = 0U;\n \n \tif (!self->ndev) {\n \t\terr = -EINVAL;\n@@ -262,8 +277,7 @@ int aq_nic_ndev_register(struct aq_nic_s *self)\n \n \tnetif_carrier_off(self->ndev);\n \n-\tfor (i = AQ_CFG_VECS_MAX; i--;)\n-\t\taq_nic_ndev_queue_stop(self, i);\n+\tnetif_tx_disable(self->ndev);\n \n \terr = register_netdev(self->ndev);\n \tif (err < 0)\n@@ -318,12 +332,8 @@ struct aq_nic_s *aq_nic_alloc_hot(struct net_device *ndev)\n \t\terr = -EINVAL;\n \t\tgoto err_exit;\n \t}\n-\tif (netif_running(ndev)) {\n-\t\tunsigned int i;\n-\n-\t\tfor (i = AQ_CFG_VECS_MAX; i--;)\n-\t\t\tnetif_stop_subqueue(ndev, i);\n-\t}\n+\tif (netif_running(ndev))\n+\t\tnetif_tx_disable(ndev);\n \n \tfor (self->aq_vecs = 0; self->aq_vecs < self->aq_nic_cfg.vecs;\n \t\tself->aq_vecs++) {\n@@ -383,16 +393,6 @@ int aq_nic_init(struct aq_nic_s *self)\n \treturn err;\n }\n \n-void aq_nic_ndev_queue_start(struct aq_nic_s *self, unsigned int idx)\n-{\n-\tnetif_start_subqueue(self->ndev, idx);\n-}\n-\n-void aq_nic_ndev_queue_stop(struct aq_nic_s *self, unsigned int idx)\n-{\n-\tnetif_stop_subqueue(self->ndev, idx);\n-}\n-\n int aq_nic_start(struct aq_nic_s *self)\n {\n \tstruct aq_vec_s *aq_vec = NULL;\n@@ -451,10 +451,6 @@ int aq_nic_start(struct aq_nic_s *self)\n \t\t\tgoto err_exit;\n \t}\n \n-\tfor (i = 0U, aq_vec = self->aq_vec[0];\n-\t\tself->aq_vecs > i; ++i, aq_vec = self->aq_vec[i])\n-\t\taq_nic_ndev_queue_start(self, i);\n-\n \terr = netif_set_real_num_tx_queues(self->ndev, self->aq_vecs);\n \tif (err < 0)\n \t\tgoto err_exit;\n@@ -463,6 +459,8 @@ int aq_nic_start(struct aq_nic_s *self)\n \tif (err < 0)\n \t\tgoto err_exit;\n \n+\tnetif_tx_start_all_queues(self->ndev);\n+\n err_exit:\n \treturn err;\n }\n@@ -602,7 +600,6 @@ int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb)\n \tunsigned int vec = skb->queue_mapping % self->aq_nic_cfg.vecs;\n \tunsigned int tc = 0U;\n \tint err = NETDEV_TX_OK;\n-\tbool is_nic_in_bad_state;\n \n \tfrags = skb_shinfo(skb)->nr_frags + 1;\n \n@@ -613,13 +610,10 @@ int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb)\n \t\tgoto err_exit;\n \t}\n \n-\tis_nic_in_bad_state = aq_utils_obj_test(&self->header.flags,\n-\t\t\t\t\t\tAQ_NIC_FLAGS_IS_NOT_TX_READY) ||\n-\t\t\t\t\t\t(aq_ring_avail_dx(ring) <\n-\t\t\t\t\t\tAQ_CFG_SKB_FRAGS_MAX);\n+\taq_ring_update_queue_state(ring);\n \n-\tif (is_nic_in_bad_state) {\n-\t\taq_nic_ndev_queue_stop(self, ring->idx);\n+\t/* Above status update may stop the queue. Check this. */\n+\tif (__netif_subqueue_stopped(self->ndev, ring->idx)) {\n \t\terr = NETDEV_TX_BUSY;\n \t\tgoto err_exit;\n \t}\n@@ -631,9 +625,6 @@ int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb)\n \t\t\t\t\t\t      ring,\n \t\t\t\t\t\t      frags);\n \t\tif (err >= 0) {\n-\t\t\tif (aq_ring_avail_dx(ring) < AQ_CFG_SKB_FRAGS_MAX + 1)\n-\t\t\t\taq_nic_ndev_queue_stop(self, ring->idx);\n-\n \t\t\t++ring->stats.tx.packets;\n \t\t\tring->stats.tx.bytes += skb->len;\n \t\t}\n@@ -898,9 +889,7 @@ int aq_nic_stop(struct aq_nic_s *self)\n \tstruct aq_vec_s *aq_vec = NULL;\n \tunsigned int i = 0U;\n \n-\tfor (i = 0U, aq_vec = self->aq_vec[0];\n-\t\tself->aq_vecs > i; ++i, aq_vec = self->aq_vec[i])\n-\t\taq_nic_ndev_queue_stop(self, i);\n+\tnetif_tx_disable(self->ndev);\n \n \tdel_timer_sync(&self->service_timer);\n \ndiff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.h b/drivers/net/ethernet/aquantia/atlantic/aq_nic.h\nindex 7fc2a5e..0ddd556 100644\n--- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.h\n+++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.h\n@@ -83,8 +83,6 @@ struct net_device *aq_nic_get_ndev(struct aq_nic_s *self);\n int aq_nic_init(struct aq_nic_s *self);\n int aq_nic_cfg_start(struct aq_nic_s *self);\n int aq_nic_ndev_register(struct aq_nic_s *self);\n-void aq_nic_ndev_queue_start(struct aq_nic_s *self, unsigned int idx);\n-void aq_nic_ndev_queue_stop(struct aq_nic_s *self, unsigned int idx);\n void aq_nic_ndev_free(struct aq_nic_s *self);\n int aq_nic_start(struct aq_nic_s *self);\n int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb);\ndiff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c\nindex 4eee199..02f79b0 100644\n--- a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c\n+++ b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c\n@@ -104,6 +104,32 @@ int aq_ring_init(struct aq_ring_s *self)\n \treturn 0;\n }\n \n+void aq_ring_update_queue_state(struct aq_ring_s *ring)\n+{\n+\tif (aq_ring_avail_dx(ring) <= AQ_CFG_SKB_FRAGS_MAX)\n+\t\taq_ring_queue_stop(ring);\n+\telse if (aq_ring_avail_dx(ring) > AQ_CFG_RESTART_DESC_THRES)\n+\t\taq_ring_queue_wake(ring);\n+}\n+\n+void aq_ring_queue_wake(struct aq_ring_s *ring)\n+{\n+\tstruct net_device *ndev = aq_nic_get_ndev(ring->aq_nic);\n+\n+\tif (__netif_subqueue_stopped(ndev, ring->idx)) {\n+\t\tnetif_wake_subqueue(ndev, ring->idx);\n+\t\tring->stats.tx.queue_restarts++;\n+\t}\n+}\n+\n+void aq_ring_queue_stop(struct aq_ring_s *ring)\n+{\n+\tstruct net_device *ndev = aq_nic_get_ndev(ring->aq_nic);\n+\n+\tif (!__netif_subqueue_stopped(ndev, ring->idx))\n+\t\tnetif_stop_subqueue(ndev, ring->idx);\n+}\n+\n void aq_ring_tx_clean(struct aq_ring_s *self)\n {\n \tstruct device *dev = aq_nic_get_dev(self->aq_nic);\ndiff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ring.h b/drivers/net/ethernet/aquantia/atlantic/aq_ring.h\nindex 782176c..24523b5 100644\n--- a/drivers/net/ethernet/aquantia/atlantic/aq_ring.h\n+++ b/drivers/net/ethernet/aquantia/atlantic/aq_ring.h\n@@ -94,6 +94,7 @@ struct aq_ring_stats_tx_s {\n \tu64 errors;\n \tu64 packets;\n \tu64 bytes;\n+\tu64 queue_restarts;\n };\n \n union aq_ring_stats_s {\n@@ -147,6 +148,9 @@ struct aq_ring_s *aq_ring_rx_alloc(struct aq_ring_s *self,\n int aq_ring_init(struct aq_ring_s *self);\n void aq_ring_rx_deinit(struct aq_ring_s *self);\n void aq_ring_free(struct aq_ring_s *self);\n+void aq_ring_update_queue_state(struct aq_ring_s *ring);\n+void aq_ring_queue_wake(struct aq_ring_s *ring);\n+void aq_ring_queue_stop(struct aq_ring_s *ring);\n void aq_ring_tx_clean(struct aq_ring_s *self);\n int aq_ring_rx_clean(struct aq_ring_s *self,\n \t\t     struct napi_struct *napi,\ndiff --git a/drivers/net/ethernet/aquantia/atlantic/aq_vec.c b/drivers/net/ethernet/aquantia/atlantic/aq_vec.c\nindex ebf5880..305ff8f 100644\n--- a/drivers/net/ethernet/aquantia/atlantic/aq_vec.c\n+++ b/drivers/net/ethernet/aquantia/atlantic/aq_vec.c\n@@ -59,12 +59,7 @@ static int aq_vec_poll(struct napi_struct *napi, int budget)\n \t\t\tif (ring[AQ_VEC_TX_ID].sw_head !=\n \t\t\t    ring[AQ_VEC_TX_ID].hw_head) {\n \t\t\t\taq_ring_tx_clean(&ring[AQ_VEC_TX_ID]);\n-\n-\t\t\t\tif (aq_ring_avail_dx(&ring[AQ_VEC_TX_ID]) >\n-\t\t\t\t    AQ_CFG_SKB_FRAGS_MAX) {\n-\t\t\t\t\taq_nic_ndev_queue_start(self->aq_nic,\n-\t\t\t\t\t\tring[AQ_VEC_TX_ID].idx);\n-\t\t\t\t}\n+\t\t\t\taq_ring_update_queue_state(&ring[AQ_VEC_TX_ID]);\n \t\t\t\twas_tx_cleaned = true;\n \t\t\t}\n \n@@ -364,6 +359,7 @@ void aq_vec_add_stats(struct aq_vec_s *self,\n \t\tstats_tx->packets += tx->packets;\n \t\tstats_tx->bytes += tx->bytes;\n \t\tstats_tx->errors += tx->errors;\n+\t\tstats_tx->queue_restarts += tx->queue_restarts;\n \t}\n }\n \n",
    "prefixes": [
        "net",
        "v2",
        "2/4"
    ]
}