get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 817741,
    "url": "http://patchwork.ozlabs.org/api/patches/817741/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/netdev/patch/20170923001243.GA1485@felix-thinkpad.cavium.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": "<20170923001243.GA1485@felix-thinkpad.cavium.com>",
    "list_archive_url": null,
    "date": "2017-09-23T00:12:43",
    "name": "[net-next,1/3] liquidio: allow override of firmware present in flash",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "996d9a947e39f3345ea1340458c9915098e9575e",
    "submitter": {
        "id": 70599,
        "url": "http://patchwork.ozlabs.org/api/people/70599/?format=api",
        "name": "Manlunas, Felix",
        "email": "felix.manlunas@cavium.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/20170923001243.GA1485@felix-thinkpad.cavium.com/mbox/",
    "series": [
        {
            "id": 4724,
            "url": "http://patchwork.ozlabs.org/api/series/4724/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/netdev/list/?series=4724",
            "date": "2017-09-23T00:12:06",
            "name": "liquidio: firmware loading",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/4724/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/817741/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/817741/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=CAVIUMNETWORKS.onmicrosoft.com\n\theader.i=@CAVIUMNETWORKS.onmicrosoft.com header.b=\"JiRsSN6y\"; \n\tdkim-atps=neutral",
            "spf=none (sender IP is )\n\tsmtp.mailfrom=Felix.Manlunas@cavium.com; "
        ],
        "Received": [
            "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xzW5q19bLz9t16\n\tfor <patchwork-incoming@ozlabs.org>;\n\tSat, 23 Sep 2017 10:13:19 +1000 (AEST)",
            "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1752158AbdIWAMv (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tFri, 22 Sep 2017 20:12:51 -0400",
            "from mail-dm3nam03on0043.outbound.protection.outlook.com\n\t([104.47.41.43]:10627\n\t\"EHLO NAM03-DM3-obe.outbound.protection.outlook.com\"\n\trhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP\n\tid S1751845AbdIWAMu (ORCPT <rfc822;netdev@vger.kernel.org>);\n\tFri, 22 Sep 2017 20:12:50 -0400",
            "from localhost (50.233.148.156) by\n\tMWHPR07MB3181.namprd07.prod.outlook.com (10.172.96.139) 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; Sat, 23 Sep 2017 00:12:46 +0000"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version;\n\tbh=ZSqSPgWXjX6IlQwKmuNHyzZLhC+158uztgCzxYj1VQw=;\n\tb=JiRsSN6yk6hZknfxjpWndNTLaFFm8bQjRlEC+d4vXCkFiVFmYtt6UwJ0pP1Z50TU3xuvn3s8Fx4aDaC91kh0KUDjrXb2UyLJYizlnlpan2W2rR/GnbWW84MaNoSx/gLp+IeKElAPM/rgHx157x1vgxVq9a6eZ1m8xzkJwnZKWwQ=",
        "Date": "Fri, 22 Sep 2017 17:12:43 -0700",
        "From": "Felix Manlunas <felix.manlunas@cavium.com>",
        "To": "davem@davemloft.net",
        "Cc": "netdev@vger.kernel.org, raghu.vatsavayi@cavium.com,\n\tderek.chickles@cavium.com, satananda.burla@cavium.com,\n\tricardo.farrington@cavium.com",
        "Subject": "[PATCH net-next 1/3] liquidio: allow override of firmware present in\n\tflash",
        "Message-ID": "<20170923001243.GA1485@felix-thinkpad.cavium.com>",
        "References": "<20170923001206.GA1458@felix-thinkpad.cavium.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=us-ascii",
        "Content-Disposition": "inline",
        "In-Reply-To": "<20170923001206.GA1458@felix-thinkpad.cavium.com>",
        "User-Agent": "Mutt/1.6.1 (2016-04-27)",
        "X-Originating-IP": "[50.233.148.156]",
        "X-ClientProxiedBy": "MWHPR04CA0087.namprd04.prod.outlook.com (10.174.173.28) To\n\tMWHPR07MB3181.namprd07.prod.outlook.com (10.172.96.139)",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-Correlation-Id": "9e4e164e-8444-4bfe-a00e-08d50217d1a6",
        "X-Microsoft-Antispam": "UriScan:; BCL:0; PCL:0;\n\tRULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254152)(300000503095)(300135400095)(2017052603199)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);\n\tSRVR:MWHPR07MB3181; ",
        "X-Microsoft-Exchange-Diagnostics": [
            "1; MWHPR07MB3181;\n\t3:2v00CWsjCgKolHhunanXIFe1v7yVoYBc+eQFUo/XDDHVhSrOic7KYXJUMBUoJGi+0++aWV4NnkAis78qDPFkoHxoGfXHbTl4XnvbCBkSggjozIdkFtUZ4t4EU5tTYNLRIt5aAIGlMVmWeeEspX75CfYHw4EywdfopCwOnQAniOJcqhOLDZdqw7X7p3n4oj5fNJ4VkmHSyh42m3mS7cuBzoASARW1F13o6EP7hdOeT8FZiNq5XKINL+N7q+ZerAY5;\n\t25:SYliZFp0pZ8L9JxyAsw+W+wF9/A+i6iEXi/r4oARIchr4CkIii3ABdiKH/2cLi11LYy6tGoPSXdgcE7ok8RhluGprsfOhX3fI3kEhG3VDAowJtv/906p0WLs+oYGs8j+1K0JvNDm37evmyfxjJfBuoTZPISZErDznY0oFFSYZmwORBrnISU3Uo1xfipTSDPMg2L/7vkY4osrilNF4X4O12W5KGrgu0itj6L4LOOXZ265UBOrcbvOW2L1bx4VsPBA83iTlcOj+daNrMYxTktqa7ioNbfHApH5gRgUrxpeWY3STk89plGNwmqROVywXuZClknViAf+H/HKCH0emdED5g==;\n\t31:8+S3M8lB+wQTRUd33ZvLkbICos417CCKwR/NeMThbIbETYhrScpM+LR+kupoXY50niAu8nYVzHlYFDaB3NkGWyaeq64xV044Ovb138B5WBQvPxdUOWEKmcYCFIEUQSnI2wJu05EqbQ/7ng3ha9HnKfRjx5yaskBikbuKL2q42vBbbbl5E6BYCPa932T6Rq0bvzp9DRvOeqJvPx8jea22T3jQQwHVAn7deHxBiJQaijw=",
            "1; MWHPR07MB3181;\n\t20:9zXjLG5A+Hfj0tc5N2e17PZJfS9qK/JjuV5oH4r/iV522F3Nrvpoz2W18jHEm04aaz0esP0dqacf/cXa4YT7Fbg6Cybvr5xVapr14/xDfDGxuQEqY+q2JKu2pElBbK/EnYEu3mwQ3mxUeh5AiEToJtfWhVBD1IFcJ1xduXG/GK28F1/XQ3hz5YQTBmdUsZgHZBcTHhzgrjaq0md549U6/fnB8d08I+H8AIcpxATfqk4b3D6cNcTZPabdmYcpXAzNXHf0lo4s+rhR/ArKNZPjOTH+gBU0z/Q4wzXbsfWc8EUZcUzBULtia3jdOK2D7hgtJupH63qxcT+9YSTvQt/trOwMAmYKW34lZGSFiwmi4Aiei5oqHMEGkG0XjHBUijR9Ep9w1OBB5zTcdv8hxtK7uhjE4DeWC3v8mcLLzR8fBg0DNH5WrfJwwdjGcPFD8mVz84jqY/1QR59B2bfwy3G1V0nuLRA233FbP9Q1MJC+trQbLgOJGa5d36VUyeeoi129;\n\t4:xVMVr7UEQ92RIQ7AhsRe66b62gaTUH6W/yGtZYB3eSjSzdfE0aurG8VW/QCCfCNba5L92JJZ0vuF/ARcap8xWLz3SLPuay/9tKCtphj1i2V7wYZd58E8+fZQ92UyFKtOm8KGZh0zuIStNynhtuyipPq1qEv3pqmHJJTCOsiYEaHuqWqskBANJKQTAzHXeQBgOZ064yAVcmaNBmx5ZdDHP5pNV7UqtwmffNiLBQT6xP85w8Wf1YNdwLcZ2jSBarT9",
            "1; MWHPR07MB3181;\n\t23:x5NR5kDHU9y4DFubjvQp7y3bKW61c2OvmEjFerinWwCHZlYP1PSThhT93aIEfbclzeBXq4X7Lbi5VzE5YbncTgiJrWB4KXICvl/20ygWe4KahZ7IfXivtRhNJL3PEWb7VLvIeZgD7IF/tQROKrMjfPld3nBduktue+ek8XPd+2qb9s5oZdxiHWZbbEZYi35lFN7y0lRpQqDpoO8nFVpNJsV13OQkR1e5nt8/aZCCMQUox6pU/RwNGhITqForr8R/lLLQI2z12Edw9ZxS7QrbOpcaUIWn9lyivmWEqmY0zkLs6VAL62TpZ/QdyKEHdMMsdHsJ6lFRvtvKFuOtaNY9agDlMA7j0G4Xof0Re6dNTVWOHuPoFnTq2RiVKNM5WC6bjJUhuldURD9TyNKvuHIN2bed212bOASfwlPkUi4D6N+bqjwQt1r/CfoGuX21d7AdLwbMRvc7Q6qpWBOz6iEwnqgkbH5YuWotD7/u5TCmuEOLgppKla0adMp1QaGT+X1+UOR8fq79VvKrwytZO9tF6nAFxF6R+UI9CWJYqj2hQHIzWQDD5uB1L3iEAnKrTcAHnuLs77pmQJT4svN5FgCU6KScQvwhoY9toJFFsT9uA5tCKYV6izBJ+2AP0HmJPyBnmVqPo/QTrjf1oA/ej15/1VoDPRzgDw/4FHGIfEXk/NfSAEFEGLij8W+gQt3XyimlTkM4ua02rNXOCVJyPaCb6jgSYQ57vA36ETXZfqrmE8jg+TB7JCeDp4+QfOLgKyLiuLDjOGSYBYh62G1UEH3QMahv+g+5Qc6SOY+svqGn11ld+pVESLmBOMRSpfdTs0brCiEBz5osmYiRzncriKg1xQk+XF20/VQvDtO0207PytOw1D55NZlKoIIAcfidJnZNFMpTlCHC5gu6I/Kwz21DPa0DJt1RDrDa/6p9LN6r9Dpo4dLIfV7mqC1i4ckfLlKwAZ7ZZiXciVAAnbSIl2DB13/i97TmkLytB5WhUGJGwQxllBWs0RZZblqe9a1DAozAHUuemvvseYYnvyz8BWz85LryB8Kmkq7QzJTMv4f0OY51Gvfs8/34dfOIquzBN9LCGcPvFGTXRpLwLfkLX0yOWC9n/k+jX8MdCUKbSbkRI4RxgRpQ4x6PT4bVYZ7//t07M9rMDUZO/3DbNvi+LtqhP1hpfx2ExwLWvKD/aMRVIKjOOLry7qd0yU4eCQ+xnASh",
            "1; MWHPR07MB3181;\n\t6:gvLgTV3g1SqirtUAMZBNl+cgqJ0iRaKmM7zvZI19b+/skqhw8US0jzloUp5cI58B1N5w7JRlMmctjqHV/WOy8RenMDCXTpIt5X7Mmi87THkxTQDz03hKcN4YWYFi8Ys0rn8dLNakGoMTQTUTHG4BFc5l9XczmFZYuaLp+vB3hHe8ZLgIFzUmjEkzLUv1isqBd2uYFPVB8sryCz1xcWt8hgJYXPtr6Ll/y8MY1epHeqv4fBeYNTmyQwn5IgNG3pIYxovMrC1I4hXaLLKbaqBMI5eTZgpaF6gofinYQ6FRwA5W/y1gckXKlqZkt5lZOv0kxbvW+lsGgMjYRTo0wEL6Uw==;\n\t5:UPrSlQooeliaSGywp6bJ6G2LowEFRnEIRDqC1PLVXNWQ4EuiubGblValF14253+Ne2SRRhGGciBGycmwWinGjZiWdyX0S9uD1ckYd/qomp2TAe8z/GAFNu6EC/qKYoVs2Ng7Gn2Nu1jWObyUSUFKrA==;\n\t24:3RnooTAVT4x+YKQ/o+XTaNHMD6pO7kDmP7prOplAh7yhnpv87xDY2YY2Qxw10ZvjEad7YusxBzy1GXBgZgJlGrP7yEXbQFjIFgJMaM3cJJE=;\n\t7:UXtclTI3p+yS+al7Vd3LuSqMBwvBDbwyGrKANe8ZIrPB41XuCilBEUZpVNQ1Q8UuIaJI8y+npbnAW7QN09nU0SDD6Qu9J6DbSkL4C9/RswRPAkq15e57hFNttCNv/yuOYJ88SjAIoRQJJsD1P7Slk+BizV7xyPtWcyfz9EM7uWQsJnRFCFjnjyoBmOj4Vt7ja7/aaz8YaPt6wswU/tVYVKBwY1q+3QZu8OchFQSwKs0="
        ],
        "X-MS-TrafficTypeDiagnostic": "MWHPR07MB3181:",
        "X-Exchange-Antispam-Report-Test": "UriScan:;",
        "X-Microsoft-Antispam-PRVS": "<MWHPR07MB3181F93876046FC6D4F7A7BEE7640@MWHPR07MB3181.namprd07.prod.outlook.com>",
        "X-Exchange-Antispam-Report-CFA-Test": "BCL:0; PCL:0;\n\tRULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(8121501046)(5005006)(10201501046)(93006095)(93001095)(3002001)(100000703101)(100105400095)(6041248)(20161123558100)(20161123555025)(20161123562025)(20161123564025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123560025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);\n\tSRVR:MWHPR07MB3181; BCL:0; PCL:0;\n\tRULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);\n\tSRVR:MWHPR07MB3181; ",
        "X-Forefront-PRVS": "0439571D1D",
        "X-Forefront-Antispam-Report": "SFV:NSPM;\n\tSFS:(10009020)(6069001)(6009001)(376002)(346002)(199003)(189002)(76176999)(6666003)(189998001)(6486002)(83506001)(50466002)(2361001)(47776003)(2351001)(105586002)(106356001)(2906002)(76506005)(16586007)(86362001)(58126008)(66066001)(33656002)(68736007)(316002)(16526017)(107886003)(4326008)(101416001)(478600001)(7736002)(5660300001)(54356999)(8676002)(97736004)(1076002)(50986999)(3846002)(72206003)(6916009)(81166006)(8936002)(25786009)(2950100002)(6116002)(6496005)(23726003)(81156014)(53936002)(305945005)(18370500001);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:MWHPR07MB3181; H:localhost;\n\tFPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; ",
        "Received-SPF": "None (protection.outlook.com: cavium.com does not designate\n\tpermitted sender hosts)",
        "SpamDiagnosticOutput": "1:99",
        "SpamDiagnosticMetadata": "NSPM",
        "X-OriginatorOrg": "cavium.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "23 Sep 2017 00:12:46.6560\n\t(UTC)",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "711e4ccf-2e9b-4bcf-a551-4094005b6194",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "MWHPR07MB3181",
        "Sender": "netdev-owner@vger.kernel.org",
        "Precedence": "bulk",
        "List-ID": "<netdev.vger.kernel.org>",
        "X-Mailing-List": "netdev@vger.kernel.org"
    },
    "content": "From: Rick Farrington <ricardo.farrington@cavium.com>\n\nSigned-off-by: Rick Farrington <ricardo.farrington@cavium.com>\nSigned-off-by: Felix Manlunas <felix.manlunas@cavium.com>\n---\n drivers/net/ethernet/cavium/liquidio/lio_main.c    | 68 ++++++++++++++--------\n .../net/ethernet/cavium/liquidio/liquidio_image.h  |  1 +\n .../net/ethernet/cavium/liquidio/octeon_device.c   | 11 +++-\n .../net/ethernet/cavium/liquidio/octeon_device.h   | 10 ++++\n 4 files changed, 64 insertions(+), 26 deletions(-)",
    "diff": "diff --git a/drivers/net/ethernet/cavium/liquidio/lio_main.c b/drivers/net/ethernet/cavium/liquidio/lio_main.c\nindex e7f5494..ce08f71 100644\n--- a/drivers/net/ethernet/cavium/liquidio/lio_main.c\n+++ b/drivers/net/ethernet/cavium/liquidio/lio_main.c\n@@ -59,9 +59,9 @@\n module_param(debug, int, 0644);\n MODULE_PARM_DESC(debug, \"NETIF_MSG debug bits\");\n \n-static char fw_type[LIO_MAX_FW_TYPE_LEN] = LIO_FW_NAME_TYPE_NIC;\n+static char fw_type[LIO_MAX_FW_TYPE_LEN] = LIO_FW_NAME_TYPE_AUTO;\n module_param_string(fw_type, fw_type, sizeof(fw_type), 0444);\n-MODULE_PARM_DESC(fw_type, \"Type of firmware to be loaded. Default \\\"nic\\\".  Use \\\"none\\\" to load firmware from flash.\");\n+MODULE_PARM_DESC(fw_type, \"Type of firmware to be loaded (default is \\\"auto\\\"), which uses firmware in flash, if present, else loads \\\"nic\\\".\");\n \n static u32 console_bitmask;\n module_param(console_bitmask, int, 0644);\n@@ -1115,10 +1115,10 @@ static int liquidio_watchdog(void *param)\n \treturn 0;\n }\n \n-static bool fw_type_is_none(void)\n+static bool fw_type_is_auto(void)\n {\n-\treturn strncmp(fw_type, LIO_FW_NAME_TYPE_NONE,\n-\t\t       sizeof(LIO_FW_NAME_TYPE_NONE)) == 0;\n+\treturn strncmp(fw_type, LIO_FW_NAME_TYPE_AUTO,\n+\t\t       sizeof(LIO_FW_NAME_TYPE_AUTO)) == 0;\n }\n \n /**\n@@ -1302,7 +1302,7 @@ static void octeon_destroy_resources(struct octeon_device *oct)\n \t\t * Implementation note: only soft-reset the device\n \t\t * if it is a CN6XXX OR the LAST CN23XX device.\n \t\t */\n-\t\tif (fw_type_is_none())\n+\t\tif (atomic_read(oct->adapter_fw_state) == FW_IS_PRELOADED)\n \t\t\tocteon_pci_flr(oct);\n \t\telse if (OCTEON_CN6XXX(oct) || !refcount)\n \t\t\toct->fn_list.soft_reset(oct);\n@@ -1934,7 +1934,7 @@ static int load_firmware(struct octeon_device *oct)\n \tchar fw_name[LIO_MAX_FW_FILENAME_LEN];\n \tchar *tmp_fw_type;\n \n-\tif (fw_type[0] == '\\0')\n+\tif (fw_type_is_auto())\n \t\ttmp_fw_type = LIO_FW_NAME_TYPE_NIC;\n \telse\n \t\ttmp_fw_type = fw_type;\n@@ -3882,9 +3882,9 @@ static void nic_starter(struct work_struct *work)\n static int octeon_device_init(struct octeon_device *octeon_dev)\n {\n \tint j, ret;\n-\tint fw_loaded = 0;\n \tchar bootcmd[] = \"\\n\";\n \tchar *dbg_enb = NULL;\n+\tenum lio_fw_state fw_state;\n \tstruct octeon_device_priv *oct_priv =\n \t\t(struct octeon_device_priv *)octeon_dev->priv;\n \tatomic_set(&octeon_dev->status, OCT_DEV_BEGIN_STATE);\n@@ -3916,24 +3916,40 @@ static int octeon_device_init(struct octeon_device *octeon_dev)\n \n \tocteon_dev->app_mode = CVM_DRV_INVALID_APP;\n \n-\tif (OCTEON_CN23XX_PF(octeon_dev)) {\n-\t\tif (!cn23xx_fw_loaded(octeon_dev) && !fw_type_is_none()) {\n-\t\t\tfw_loaded = 0;\n-\t\t\t/* Do a soft reset of the Octeon device. */\n-\t\t\tif (octeon_dev->fn_list.soft_reset(octeon_dev))\n-\t\t\t\treturn 1;\n-\t\t\t/* things might have changed */\n-\t\t\tif (!cn23xx_fw_loaded(octeon_dev))\n-\t\t\t\tfw_loaded = 0;\n-\t\t\telse\n-\t\t\t\tfw_loaded = 1;\n-\t\t} else {\n-\t\t\tfw_loaded = 1;\n-\t\t}\n-\t} else if (octeon_dev->fn_list.soft_reset(octeon_dev)) {\n-\t\treturn 1;\n+\t/* CN23XX supports preloaded firmware if the following is true:\n+\t *\n+\t * The adapter indicates that firmware is currently running AND\n+\t * 'fw_type' is 'auto'.\n+\t *\n+\t * (default state is NEEDS_TO_BE_LOADED, override it if appropriate).\n+\t */\n+\tif (OCTEON_CN23XX_PF(octeon_dev) &&\n+\t    cn23xx_fw_loaded(octeon_dev) && fw_type_is_auto()) {\n+\t\tatomic_cmpxchg(octeon_dev->adapter_fw_state,\n+\t\t\t       FW_NEEDS_TO_BE_LOADED, FW_IS_PRELOADED);\n \t}\n \n+\t/* If loading firmware, only first device of adapter needs to do so. */\n+\tfw_state = atomic_cmpxchg(octeon_dev->adapter_fw_state,\n+\t\t\t\t  FW_NEEDS_TO_BE_LOADED,\n+\t\t\t\t  FW_IS_BEING_LOADED);\n+\n+\t/* Here, [local variable] 'fw_state' is set to one of:\n+\t *\n+\t *   FW_IS_PRELOADED:       No firmware is to be loaded (see above)\n+\t *   FW_NEEDS_TO_BE_LOADED: The driver's first instance will load\n+\t *                          firmware to the adapter.\n+\t *   FW_IS_BEING_LOADED:    The driver's second instance will not load\n+\t *                          firmware to the adapter.\n+\t */\n+\n+\t/* Prior to f/w load, perform a soft reset of the Octeon device;\n+\t * if error resetting, return w/error.\n+\t */\n+\tif (fw_state == FW_NEEDS_TO_BE_LOADED)\n+\t\tif (octeon_dev->fn_list.soft_reset(octeon_dev))\n+\t\t\treturn 1;\n+\n \t/* Initialize the dispatch mechanism used to push packets arriving on\n \t * Octeon Output queues.\n \t */\n@@ -4063,7 +4079,7 @@ static int octeon_device_init(struct octeon_device *octeon_dev)\n \n \tatomic_set(&octeon_dev->status, OCT_DEV_IO_QUEUES_DONE);\n \n-\tif ((!OCTEON_CN23XX_PF(octeon_dev)) || !fw_loaded) {\n+\tif (fw_state == FW_NEEDS_TO_BE_LOADED) {\n \t\tdev_dbg(&octeon_dev->pci_dev->dev, \"Waiting for DDR initialization...\\n\");\n \t\tif (!ddr_timeout) {\n \t\t\tdev_info(&octeon_dev->pci_dev->dev,\n@@ -4125,6 +4141,8 @@ static int octeon_device_init(struct octeon_device *octeon_dev)\n \t\t\tdev_err(&octeon_dev->pci_dev->dev, \"Could not load firmware to board\\n\");\n \t\t\treturn 1;\n \t\t}\n+\n+\t\tatomic_set(octeon_dev->adapter_fw_state, FW_HAS_BEEN_LOADED);\n \t}\n \n \thandshake[octeon_dev->octeon_id].init_ok = 1;\ndiff --git a/drivers/net/ethernet/cavium/liquidio/liquidio_image.h b/drivers/net/ethernet/cavium/liquidio/liquidio_image.h\nindex 78a3685..5bf5e87 100644\n--- a/drivers/net/ethernet/cavium/liquidio/liquidio_image.h\n+++ b/drivers/net/ethernet/cavium/liquidio/liquidio_image.h\n@@ -24,6 +24,7 @@\n #define LIO_FW_BASE_NAME        \"lio_\"\n #define LIO_FW_NAME_SUFFIX      \".bin\"\n #define LIO_FW_NAME_TYPE_NIC    \"nic\"\n+#define LIO_FW_NAME_TYPE_AUTO   \"auto\"\n #define LIO_FW_NAME_TYPE_NONE   \"none\"\n #define LIO_MAX_FIRMWARE_VERSION_LEN 16\n \ndiff --git a/drivers/net/ethernet/cavium/liquidio/octeon_device.c b/drivers/net/ethernet/cavium/liquidio/octeon_device.c\nindex 29d53b1..e4aa339 100644\n--- a/drivers/net/ethernet/cavium/liquidio/octeon_device.c\n+++ b/drivers/net/ethernet/cavium/liquidio/octeon_device.c\n@@ -541,6 +541,7 @@\n \n static struct octeon_device *octeon_device[MAX_OCTEON_DEVICES];\n static atomic_t adapter_refcounts[MAX_OCTEON_DEVICES];\n+static atomic_t adapter_fw_states[MAX_OCTEON_DEVICES];\n \n static u32 octeon_device_count;\n /* locks device array (i.e. octeon_device[]) */\n@@ -770,6 +771,10 @@ int octeon_register_device(struct octeon_device *oct,\n \toct->adapter_refcount = &adapter_refcounts[oct->octeon_id];\n \tatomic_set(oct->adapter_refcount, 0);\n \n+\t/* Like the reference count, the f/w state is shared 'per-adapter' */\n+\toct->adapter_fw_state = &adapter_fw_states[oct->octeon_id];\n+\tatomic_set(oct->adapter_fw_state, FW_NEEDS_TO_BE_LOADED);\n+\n \tspin_lock(&octeon_devices_lock);\n \tfor (idx = (int)oct->octeon_id - 1; idx >= 0; idx--) {\n \t\tif (!octeon_device[idx]) {\n@@ -780,11 +785,15 @@ int octeon_register_device(struct octeon_device *oct,\n \t\t\tatomic_inc(oct->adapter_refcount);\n \t\t\treturn 1; /* here, refcount is guaranteed to be 1 */\n \t\t}\n-\t\t/* if another device is at same bus/dev, use its refcounter */\n+\t\t/* If another device is at same bus/dev, use its refcounter\n+\t\t * (and f/w state variable).\n+\t\t */\n \t\tif ((octeon_device[idx]->loc.bus == bus) &&\n \t\t    (octeon_device[idx]->loc.dev == dev)) {\n \t\t\toct->adapter_refcount =\n \t\t\t\tocteon_device[idx]->adapter_refcount;\n+\t\t\toct->adapter_fw_state =\n+\t\t\t\tocteon_device[idx]->adapter_fw_state;\n \t\t\tbreak;\n \t\t}\n \t}\ndiff --git a/drivers/net/ethernet/cavium/liquidio/octeon_device.h b/drivers/net/ethernet/cavium/liquidio/octeon_device.h\nindex 894af19..33d19c4 100644\n--- a/drivers/net/ethernet/cavium/liquidio/octeon_device.h\n+++ b/drivers/net/ethernet/cavium/liquidio/octeon_device.h\n@@ -50,6 +50,13 @@ enum octeon_pci_swap_mode {\n \tOCTEON_PCI_32BIT_LW_SWAP = 3\n };\n \n+enum lio_fw_state {\n+\tFW_IS_PRELOADED = 0,\n+\tFW_NEEDS_TO_BE_LOADED = 1,\n+\tFW_IS_BEING_LOADED = 2,\n+\tFW_HAS_BEEN_LOADED = 3,\n+};\n+\n enum {\n \tOCTEON_CONFIG_TYPE_DEFAULT = 0,\n \tNUM_OCTEON_CONFS,\n@@ -557,6 +564,9 @@ struct octeon_device {\n \t} loc;\n \n \tatomic_t *adapter_refcount; /* reference count of adapter */\n+\n+\tatomic_t *adapter_fw_state; /* per-adapter, lio_fw_state */\n+\n \tbool ptp_enable;\n };\n \n",
    "prefixes": [
        "net-next",
        "1/3"
    ]
}