get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 53138,
    "url": "http://patches.dpdk.org/api/patches/53138/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/78861b0be3a56a2e5d3996467e5eb05bcd395ea6.1556525874.git.igor.russkikh@aquantia.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<78861b0be3a56a2e5d3996467e5eb05bcd395ea6.1556525874.git.igor.russkikh@aquantia.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/78861b0be3a56a2e5d3996467e5eb05bcd395ea6.1556525874.git.igor.russkikh@aquantia.com",
    "date": "2019-04-29T08:20:23",
    "name": "[08/11] net/atlantic: flow control settings synchronization on rx",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "b2685b97c9ca64499a51a3dd6a39820fdf8b0d77",
    "submitter": {
        "id": 1124,
        "url": "http://patches.dpdk.org/api/people/1124/?format=api",
        "name": "Igor Russkikh",
        "email": "igor.russkikh@aquantia.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/78861b0be3a56a2e5d3996467e5eb05bcd395ea6.1556525874.git.igor.russkikh@aquantia.com/mbox/",
    "series": [
        {
            "id": 4499,
            "url": "http://patches.dpdk.org/api/series/4499/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=4499",
            "date": "2019-04-29T08:20:07",
            "name": "Aquantia atlantic bugfixes",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/4499/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/53138/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/53138/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id D64C21B3B7;\n\tMon, 29 Apr 2019 10:20:43 +0200 (CEST)",
            "from NAM04-BN3-obe.outbound.protection.outlook.com\n\t(mail-eopbgr680048.outbound.protection.outlook.com [40.107.68.48])\n\tby dpdk.org (Postfix) with ESMTP id 11B4F1B293;\n\tMon, 29 Apr 2019 10:20:24 +0200 (CEST)",
            "from DM6PR11MB3625.namprd11.prod.outlook.com (20.178.230.149) by\n\tDM6PR11MB2841.namprd11.prod.outlook.com (20.176.100.32) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n\t15.20.1835.13; Mon, 29 Apr 2019 08:20:23 +0000",
            "from DM6PR11MB3625.namprd11.prod.outlook.com\n\t([fe80::f035:2c20:5a61:7653]) by\n\tDM6PR11MB3625.namprd11.prod.outlook.com\n\t([fe80::f035:2c20:5a61:7653%3]) with mapi id 15.20.1835.010;\n\tMon, 29 Apr 2019 08:20:23 +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:X-MS-Exchange-SenderADCheck;\n\tbh=ZoxOdNKP1kKMjLphI+6qcIbD/gU7sU4AQtoaitJQP7E=;\n\tb=KkBKaS+Emgv90JeaArjqnA2D5EhGkMZ6UYT0YeQ5TaZmPvwe1N+W6AAx/wJXGfuI8P10mH1T0CKgkTYWN9dI7sCtxtVgGnT10GUNRAEBXGYmF6KLZrK50comeBelCyeg3BZh0q8tDq+zWPD9GK/M8IcflUOP39JOmbdzsx3vf0k=",
        "From": "Igor Russkikh <Igor.Russkikh@aquantia.com>",
        "To": "\"dev@dpdk.org\" <dev@dpdk.org>",
        "CC": "Pavel Belous <Pavel.Belous@aquantia.com>, Igor Russkikh\n\t<Igor.Russkikh@aquantia.com>, \"stable@dpdk.org\" <stable@dpdk.org>",
        "Thread-Topic": "[PATCH  08/11] net/atlantic: flow control settings\n\tsynchronization on rx",
        "Thread-Index": "AQHU/mRkdclvqqwRRkmP4e/LB8gyiw==",
        "Date": "Mon, 29 Apr 2019 08:20:23 +0000",
        "Message-ID": "<78861b0be3a56a2e5d3996467e5eb05bcd395ea6.1556525874.git.igor.russkikh@aquantia.com>",
        "References": "<cover.1556525874.git.igor.russkikh@aquantia.com>",
        "In-Reply-To": "<cover.1556525874.git.igor.russkikh@aquantia.com>",
        "Accept-Language": "en-US",
        "Content-Language": "en-US",
        "X-MS-Has-Attach": "",
        "X-MS-TNEF-Correlator": "",
        "x-clientproxiedby": "HE1P190CA0016.EURP190.PROD.OUTLOOK.COM\n\t(2603:10a6:3:bc::26)\n\tTo DM6PR11MB3625.namprd11.prod.outlook.com\n\t(2603:10b6:5:13a::21)",
        "authentication-results": "spf=none (sender IP is )\n\tsmtp.mailfrom=Igor.Russkikh@aquantia.com; ",
        "x-ms-exchange-messagesentrepresentingtype": "1",
        "x-mailer": "git-send-email 2.17.1",
        "x-originating-ip": "[95.79.108.179]",
        "x-ms-publictraffictype": "Email",
        "x-ms-office365-filtering-correlation-id": "bd76f106-bfa9-422f-8c2e-08d6cc7b86a6",
        "x-microsoft-antispam": "BCL:0; PCL:0;\n\tRULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600141)(711020)(4605104)(2017052603328)(7193020);\n\tSRVR:DM6PR11MB2841; ",
        "x-ms-traffictypediagnostic": "DM6PR11MB2841:",
        "x-microsoft-antispam-prvs": "<DM6PR11MB2841AC77501CDA8997C495C198390@DM6PR11MB2841.namprd11.prod.outlook.com>",
        "x-ms-oob-tlc-oobclassifiers": "OLM:61;",
        "x-forefront-prvs": "0022134A87",
        "x-forefront-antispam-report": "SFV:NSPM;\n\tSFS:(10009020)(366004)(376002)(396003)(136003)(39840400004)(346002)(199004)(189003)(44832011)(99286004)(186003)(118296001)(478600001)(71200400001)(53936002)(6506007)(71190400001)(446003)(5660300002)(2351001)(14454004)(14444005)(486006)(66556008)(73956011)(66946007)(64756008)(66476007)(66446008)(386003)(52116002)(316002)(11346002)(2616005)(7736002)(476003)(72206003)(54906003)(305945005)(81166006)(1730700003)(2501003)(36756003)(76176011)(81156014)(6486002)(3846002)(66066001)(102836004)(6916009)(97736004)(8936002)(450100002)(86362001)(6116002)(6436002)(26005)(256004)(8676002)(50226002)(2906002)(25786009)(5640700003)(6512007)(68736007)(4326008)(83323001);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:DM6PR11MB2841;\n\tH:DM6PR11MB3625.namprd11.prod.outlook.com; FPR:; SPF:None; LANG:en;\n\tPTR:InfoNoRecords; A:1; MX:1; ",
        "received-spf": "None (protection.outlook.com: aquantia.com does not designate\n\tpermitted sender hosts)",
        "x-ms-exchange-senderadcheck": "1",
        "x-microsoft-antispam-message-info": "nmHE2uS4Ou7CjbiZ60d/wp8Urj6OXjzqwmDCv44HshoCFMyxbQDW+2St+lxxrKI3ottybvi1Mx3jx/eL1zhKHTJ3YGNMGsjSjBC03dBFwUge8C4oEca+ecNDXyj7tRvqsfJw6IU//Qz/oDECgstzGryJA2hHFAakYaZ7yqstK7YfzGBbdwBMessDFRNhQEA3VaVbb30RsJcFggt7+3kyDojocfMN6+2MtBFc69P4siJOH8t68+zltsQTv3dRHdg7P1uXGyrp8borfcvaWO+ceEYaaliSQU666683EgmbJ+Zu2HJGMm9vBZK4vQcgRgtPdJmiMR6aTM07Hkwy3bFJf+uM+49cotS9W3eZ+JWC7715pa33Im4Naby/owFWqomZHwvxwQ6kEdCid4rgLirq7BdD5AUQreQJKrXGXsnwHvM=",
        "Content-Type": "text/plain; charset=\"utf-8\"",
        "Content-Transfer-Encoding": "base64",
        "MIME-Version": "1.0",
        "X-OriginatorOrg": "aquantia.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "bd76f106-bfa9-422f-8c2e-08d6cc7b86a6",
        "X-MS-Exchange-CrossTenant-originalarrivaltime": "29 Apr 2019 08:20:23.4911\n\t(UTC)",
        "X-MS-Exchange-CrossTenant-fromentityheader": "Hosted",
        "X-MS-Exchange-CrossTenant-id": "83e2e134-991c-4ede-8ced-34d47e38e6b1",
        "X-MS-Exchange-CrossTenant-mailboxtype": "HOSTED",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "DM6PR11MB2841",
        "Subject": "[dpdk-dev] [PATCH 08/11] net/atlantic: flow control settings\n\tsynchronization on rx",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Pavel Belous <pavel.belous@aquantia.com>\n\nDriver should track negotiated PHY flow control settings during\nlink state changes and update MAC level flow control configuration.\n\nOtherwise there could be unexpected pause frames generation which\ncould lockup the datapath.\n\nFixes: 4c1c8f76463f (\"net/atlantic: add flow control configuration\")\ncc: stable@dpdk.org\nSigned-off-by: Igor Russkikh <igor.russkikh@aquantia.com>\nSigned-off-by: Pavel Belous <pavel.belous@aquantia.com>\n---\n drivers/net/atlantic/atl_ethdev.c             | 24 +++++++++++++++----\n drivers/net/atlantic/atl_types.h              |  1 +\n drivers/net/atlantic/hw_atl/hw_atl_b0.c       |  6 +++++\n drivers/net/atlantic/hw_atl/hw_atl_b0.h       |  2 ++\n .../net/atlantic/hw_atl/hw_atl_utils_fw2x.c   |  9 +++++++\n 5 files changed, 38 insertions(+), 4 deletions(-)",
    "diff": "diff --git a/drivers/net/atlantic/atl_ethdev.c b/drivers/net/atlantic/atl_ethdev.c\r\nindex 485ef159eb05..6cc8d198041e 100644\r\n--- a/drivers/net/atlantic/atl_ethdev.c\r\n+++ b/drivers/net/atlantic/atl_ethdev.c\r\n@@ -1160,6 +1160,7 @@ atl_dev_link_update(struct rte_eth_dev *dev, int wait __rte_unused)\r\n {\r\n \tstruct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);\r\n \tstruct rte_eth_link link, old;\r\n+\tu32 fc = AQ_NIC_FC_OFF;\r\n \tint err = 0;\r\n \r\n \tlink.link_status = ETH_LINK_DOWN;\r\n@@ -1194,6 +1195,15 @@ atl_dev_link_update(struct rte_eth_dev *dev, int wait __rte_unused)\r\n \tif (link.link_status == old.link_status)\r\n \t\treturn -1;\r\n \r\n+\t/* Driver has to update flow control settings on RX block\r\n+\t * on any link event.\r\n+\t * We should query FW whether it negotiated FC.\r\n+\t */\r\n+\tif (hw->aq_fw_ops->get_flow_control) {\r\n+\t\thw->aq_fw_ops->get_flow_control(hw, &fc);\r\n+\t\thw_atl_b0_set_fc(hw, fc, 0U);\r\n+\t}\r\n+\r\n \tif (rte_eal_alarm_set(1000 * 1000,\r\n \t\t\t      atl_dev_delayed_handler, (void *)dev) < 0)\r\n \t\tPMD_DRV_LOG(ERR, \"rte_eal_alarm_set fail\");\r\n@@ -1496,14 +1506,20 @@ static int\r\n atl_flow_ctrl_get(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)\r\n {\r\n \tstruct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);\r\n+\tu32 fc = AQ_NIC_FC_OFF;\r\n+\r\n+\tif (hw->aq_fw_ops->get_flow_control == NULL)\r\n+\t\treturn -ENOTSUP;\r\n+\r\n+\thw->aq_fw_ops->get_flow_control(hw, &fc);\r\n \r\n-\tif (hw->aq_nic_cfg->flow_control == AQ_NIC_FC_OFF)\r\n+\tif (fc == AQ_NIC_FC_OFF)\r\n \t\tfc_conf->mode = RTE_FC_NONE;\r\n-\telse if (hw->aq_nic_cfg->flow_control & (AQ_NIC_FC_RX | AQ_NIC_FC_TX))\r\n+\telse if (fc & (AQ_NIC_FC_RX | AQ_NIC_FC_TX))\r\n \t\tfc_conf->mode = RTE_FC_FULL;\r\n-\telse if (hw->aq_nic_cfg->flow_control & AQ_NIC_FC_RX)\r\n+\telse if (fc & AQ_NIC_FC_RX)\r\n \t\tfc_conf->mode = RTE_FC_RX_PAUSE;\r\n-\telse if (hw->aq_nic_cfg->flow_control & AQ_NIC_FC_RX)\r\n+\telse if (fc & AQ_NIC_FC_RX)\r\n \t\tfc_conf->mode = RTE_FC_TX_PAUSE;\r\n \r\n \treturn 0;\r\ndiff --git a/drivers/net/atlantic/atl_types.h b/drivers/net/atlantic/atl_types.h\r\nindex 84a4776951db..19aaf37673cd 100644\r\n--- a/drivers/net/atlantic/atl_types.h\r\n+++ b/drivers/net/atlantic/atl_types.h\r\n@@ -169,6 +169,7 @@ struct aq_fw_ops {\r\n \tint (*get_eee_rate)(struct aq_hw_s *self, u32 *rate,\r\n \t\t\tu32 *supported_rates);\r\n \r\n+\tint (*get_flow_control)(struct aq_hw_s *self, u32 *fc);\r\n \tint (*set_flow_control)(struct aq_hw_s *self);\r\n \r\n \tint (*led_control)(struct aq_hw_s *self, u32 mode);\r\ndiff --git a/drivers/net/atlantic/hw_atl/hw_atl_b0.c b/drivers/net/atlantic/hw_atl/hw_atl_b0.c\r\nindex e525a8581e6f..a76268e923e6 100644\r\n--- a/drivers/net/atlantic/hw_atl/hw_atl_b0.c\r\n+++ b/drivers/net/atlantic/hw_atl/hw_atl_b0.c\r\n@@ -26,6 +26,12 @@ int hw_atl_b0_hw_reset(struct aq_hw_s *self)\r\n \treturn err;\r\n }\r\n \r\n+int hw_atl_b0_set_fc(struct aq_hw_s *self, u32 fc, u32 tc)\r\n+{\r\n+\thw_atl_rpb_rx_xoff_en_per_tc_set(self, !!(fc & AQ_NIC_FC_RX), tc);\r\n+\treturn 0;\r\n+}\r\n+\r\n static int hw_atl_b0_hw_qos_set(struct aq_hw_s *self)\r\n {\r\n \tu32 tc = 0U;\r\ndiff --git a/drivers/net/atlantic/hw_atl/hw_atl_b0.h b/drivers/net/atlantic/hw_atl/hw_atl_b0.h\r\nindex 06feb56c1620..d1ba2aceb390 100644\r\n--- a/drivers/net/atlantic/hw_atl/hw_atl_b0.h\r\n+++ b/drivers/net/atlantic/hw_atl/hw_atl_b0.h\r\n@@ -11,6 +11,8 @@\r\n int hw_atl_b0_hw_reset(struct aq_hw_s *self);\r\n int hw_atl_b0_hw_init(struct aq_hw_s *self, u8 *mac_addr);\r\n \r\n+int hw_atl_b0_set_fc(struct aq_hw_s *self, u32 fc, u32 tc);\r\n+\r\n int hw_atl_b0_hw_ring_tx_init(struct aq_hw_s *self, uint64_t base_addr,\r\n \t\tint index, int size, int cpu, int vec);\r\n int hw_atl_b0_hw_ring_rx_init(struct aq_hw_s *self, uint64_t base_addr,\r\ndiff --git a/drivers/net/atlantic/hw_atl/hw_atl_utils_fw2x.c b/drivers/net/atlantic/hw_atl/hw_atl_utils_fw2x.c\r\nindex de4189441fad..e07ed5e3a8c9 100644\r\n--- a/drivers/net/atlantic/hw_atl/hw_atl_utils_fw2x.c\r\n+++ b/drivers/net/atlantic/hw_atl/hw_atl_utils_fw2x.c\r\n@@ -473,7 +473,15 @@ static int aq_fw2x_get_eee_rate(struct aq_hw_s *self, u32 *rate,\r\n \treturn err;\r\n }\r\n \r\n+static int aq_fw2x_get_flow_control(struct aq_hw_s *self, u32 *fc)\r\n+{\r\n+\tu32 mpi_state = aq_hw_read_reg(self, HW_ATL_FW2X_MPI_CONTROL2_ADDR);\r\n+\r\n+\t*fc = ((mpi_state & BIT(CAPS_HI_PAUSE)) ? AQ_NIC_FC_RX : 0) |\r\n+\t      ((mpi_state & BIT(CAPS_HI_ASYMMETRIC_PAUSE)) ? AQ_NIC_FC_TX : 0);\r\n \r\n+\treturn 0;\r\n+}\r\n \r\n static int aq_fw2x_set_flow_control(struct aq_hw_s *self)\r\n {\r\n@@ -714,6 +722,7 @@ const struct aq_fw_ops aq_fw_2x_ops = {\r\n \t.get_cable_len = aq_fw2x_get_cable_len,\r\n \t.set_eee_rate = aq_fw2x_set_eee_rate,\r\n \t.get_eee_rate = aq_fw2x_get_eee_rate,\r\n+\t.get_flow_control = aq_fw2x_get_flow_control,\r\n \t.set_flow_control = aq_fw2x_set_flow_control,\r\n \t.led_control = aq_fw2x_led_control,\r\n \t.get_eeprom = aq_fw2x_get_eeprom,\r\n",
    "prefixes": [
        "08/11"
    ]
}