linux/drivers/net/ethernet/sfc/mcdi.c
<<
>>
Prefs
   1/****************************************************************************
   2 * Driver for Solarflare network controllers and boards
   3 * Copyright 2008-2013 Solarflare Communications Inc.
   4 *
   5 * This program is free software; you can redistribute it and/or modify it
   6 * under the terms of the GNU General Public License version 2 as published
   7 * by the Free Software Foundation, incorporated herein by reference.
   8 */
   9
  10#include <linux/delay.h>
  11#include <linux/moduleparam.h>
  12#include <linux/atomic.h>
  13#include "net_driver.h"
  14#include "nic.h"
  15#include "io.h"
  16#include "farch_regs.h"
  17#include "mcdi_pcol.h"
  18#include "phy.h"
  19
  20/**************************************************************************
  21 *
  22 * Management-Controller-to-Driver Interface
  23 *
  24 **************************************************************************
  25 */
  26
  27#define MCDI_RPC_TIMEOUT       (10 * HZ)
  28
  29/* A reboot/assertion causes the MCDI status word to be set after the
  30 * command word is set or a REBOOT event is sent. If we notice a reboot
  31 * via these mechanisms then wait 250ms for the status word to be set.
  32 */
  33#define MCDI_STATUS_DELAY_US            100
  34#define MCDI_STATUS_DELAY_COUNT         2500
  35#define MCDI_STATUS_SLEEP_MS                                            \
  36        (MCDI_STATUS_DELAY_US * MCDI_STATUS_DELAY_COUNT / 1000)
  37
  38#define SEQ_MASK                                                        \
  39        EFX_MASK32(EFX_WIDTH(MCDI_HEADER_SEQ))
  40
  41struct efx_mcdi_async_param {
  42        struct list_head list;
  43        unsigned int cmd;
  44        size_t inlen;
  45        size_t outlen;
  46        bool quiet;
  47        efx_mcdi_async_completer *complete;
  48        unsigned long cookie;
  49        /* followed by request/response buffer */
  50};
  51
  52static void efx_mcdi_timeout_async(unsigned long context);
  53static int efx_mcdi_drv_attach(struct efx_nic *efx, bool driver_operating,
  54                               bool *was_attached_out);
  55static bool efx_mcdi_poll_once(struct efx_nic *efx);
  56static void efx_mcdi_abandon(struct efx_nic *efx);
  57
  58#ifdef CONFIG_SFC_MCDI_LOGGING
  59static bool mcdi_logging_default;
  60module_param(mcdi_logging_default, bool, 0644);
  61MODULE_PARM_DESC(mcdi_logging_default,
  62                 "Enable MCDI logging on newly-probed functions");
  63#endif
  64
  65int efx_mcdi_init(struct efx_nic *efx)
  66{
  67        struct efx_mcdi_iface *mcdi;
  68        bool already_attached;
  69        int rc = -ENOMEM;
  70
  71        efx->mcdi = kzalloc(sizeof(*efx->mcdi), GFP_KERNEL);
  72        if (!efx->mcdi)
  73                goto fail;
  74
  75        mcdi = efx_mcdi(efx);
  76        mcdi->efx = efx;
  77#ifdef CONFIG_SFC_MCDI_LOGGING
  78        /* consuming code assumes buffer is page-sized */
  79        mcdi->logging_buffer = (char *)__get_free_page(GFP_KERNEL);
  80        if (!mcdi->logging_buffer)
  81                goto fail1;
  82        mcdi->logging_enabled = mcdi_logging_default;
  83#endif
  84        init_waitqueue_head(&mcdi->wq);
  85        init_waitqueue_head(&mcdi->proxy_rx_wq);
  86        spin_lock_init(&mcdi->iface_lock);
  87        mcdi->state = MCDI_STATE_QUIESCENT;
  88        mcdi->mode = MCDI_MODE_POLL;
  89        spin_lock_init(&mcdi->async_lock);
  90        INIT_LIST_HEAD(&mcdi->async_list);
  91        setup_timer(&mcdi->async_timer, efx_mcdi_timeout_async,
  92                    (unsigned long)mcdi);
  93
  94        (void) efx_mcdi_poll_reboot(efx);
  95        mcdi->new_epoch = true;
  96
  97        /* Recover from a failed assertion before probing */
  98        rc = efx_mcdi_handle_assertion(efx);
  99        if (rc)
 100                goto fail2;
 101
 102        /* Let the MC (and BMC, if this is a LOM) know that the driver
 103         * is loaded. We should do this before we reset the NIC.
 104         */
 105        rc = efx_mcdi_drv_attach(efx, true, &already_attached);
 106        if (rc) {
 107                netif_err(efx, probe, efx->net_dev,
 108                          "Unable to register driver with MCPU\n");
 109                goto fail2;
 110        }
 111        if (already_attached)
 112                /* Not a fatal error */
 113                netif_err(efx, probe, efx->net_dev,
 114                          "Host already registered with MCPU\n");
 115
 116        if (efx->mcdi->fn_flags &
 117            (1 << MC_CMD_DRV_ATTACH_EXT_OUT_FLAG_PRIMARY))
 118                efx->primary = efx;
 119
 120        return 0;
 121fail2:
 122#ifdef CONFIG_SFC_MCDI_LOGGING
 123        free_page((unsigned long)mcdi->logging_buffer);
 124fail1:
 125#endif
 126        kfree(efx->mcdi);
 127        efx->mcdi = NULL;
 128fail:
 129        return rc;
 130}
 131
 132void efx_mcdi_fini(struct efx_nic *efx)
 133{
 134        if (!efx->mcdi)
 135                return;
 136
 137        BUG_ON(efx->mcdi->iface.state != MCDI_STATE_QUIESCENT);
 138
 139        /* Relinquish the device (back to the BMC, if this is a LOM) */
 140        efx_mcdi_drv_attach(efx, false, NULL);
 141
 142#ifdef CONFIG_SFC_MCDI_LOGGING
 143        free_page((unsigned long)efx->mcdi->iface.logging_buffer);
 144#endif
 145
 146        kfree(efx->mcdi);
 147}
 148
 149static void efx_mcdi_send_request(struct efx_nic *efx, unsigned cmd,
 150                                  const efx_dword_t *inbuf, size_t inlen)
 151{
 152        struct efx_mcdi_iface *mcdi = efx_mcdi(efx);
 153#ifdef CONFIG_SFC_MCDI_LOGGING
 154        char *buf = mcdi->logging_buffer; /* page-sized */
 155#endif
 156        efx_dword_t hdr[2];
 157        size_t hdr_len;
 158        u32 xflags, seqno;
 159
 160        BUG_ON(mcdi->state == MCDI_STATE_QUIESCENT);
 161
 162        /* Serialise with efx_mcdi_ev_cpl() and efx_mcdi_ev_death() */
 163        spin_lock_bh(&mcdi->iface_lock);
 164        ++mcdi->seqno;
 165        spin_unlock_bh(&mcdi->iface_lock);
 166
 167        seqno = mcdi->seqno & SEQ_MASK;
 168        xflags = 0;
 169        if (mcdi->mode == MCDI_MODE_EVENTS)
 170                xflags |= MCDI_HEADER_XFLAGS_EVREQ;
 171
 172        if (efx->type->mcdi_max_ver == 1) {
 173                /* MCDI v1 */
 174                EFX_POPULATE_DWORD_7(hdr[0],
 175                                     MCDI_HEADER_RESPONSE, 0,
 176                                     MCDI_HEADER_RESYNC, 1,
 177                                     MCDI_HEADER_CODE, cmd,
 178                                     MCDI_HEADER_DATALEN, inlen,
 179                                     MCDI_HEADER_SEQ, seqno,
 180                                     MCDI_HEADER_XFLAGS, xflags,
 181                                     MCDI_HEADER_NOT_EPOCH, !mcdi->new_epoch);
 182                hdr_len = 4;
 183        } else {
 184                /* MCDI v2 */
 185                BUG_ON(inlen > MCDI_CTL_SDU_LEN_MAX_V2);
 186                EFX_POPULATE_DWORD_7(hdr[0],
 187                                     MCDI_HEADER_RESPONSE, 0,
 188                                     MCDI_HEADER_RESYNC, 1,
 189                                     MCDI_HEADER_CODE, MC_CMD_V2_EXTN,
 190                                     MCDI_HEADER_DATALEN, 0,
 191                                     MCDI_HEADER_SEQ, seqno,
 192                                     MCDI_HEADER_XFLAGS, xflags,
 193                                     MCDI_HEADER_NOT_EPOCH, !mcdi->new_epoch);
 194                EFX_POPULATE_DWORD_2(hdr[1],
 195                                     MC_CMD_V2_EXTN_IN_EXTENDED_CMD, cmd,
 196                                     MC_CMD_V2_EXTN_IN_ACTUAL_LEN, inlen);
 197                hdr_len = 8;
 198        }
 199
 200#ifdef CONFIG_SFC_MCDI_LOGGING
 201        if (mcdi->logging_enabled && !WARN_ON_ONCE(!buf)) {
 202                int bytes = 0;
 203                int i;
 204                /* Lengths should always be a whole number of dwords, so scream
 205                 * if they're not.
 206                 */
 207                WARN_ON_ONCE(hdr_len % 4);
 208                WARN_ON_ONCE(inlen % 4);
 209
 210                /* We own the logging buffer, as only one MCDI can be in
 211                 * progress on a NIC at any one time.  So no need for locking.
 212                 */
 213                for (i = 0; i < hdr_len / 4 && bytes < PAGE_SIZE; i++)
 214                        bytes += snprintf(buf + bytes, PAGE_SIZE - bytes,
 215                                          " %08x", le32_to_cpu(hdr[i].u32[0]));
 216
 217                for (i = 0; i < inlen / 4 && bytes < PAGE_SIZE; i++)
 218                        bytes += snprintf(buf + bytes, PAGE_SIZE - bytes,
 219                                          " %08x", le32_to_cpu(inbuf[i].u32[0]));
 220
 221                netif_info(efx, hw, efx->net_dev, "MCDI RPC REQ:%s\n", buf);
 222        }
 223#endif
 224
 225        efx->type->mcdi_request(efx, hdr, hdr_len, inbuf, inlen);
 226
 227        mcdi->new_epoch = false;
 228}
 229
 230static int efx_mcdi_errno(unsigned int mcdi_err)
 231{
 232        switch (mcdi_err) {
 233        case 0:
 234                return 0;
 235#define TRANSLATE_ERROR(name)                                   \
 236        case MC_CMD_ERR_ ## name:                               \
 237                return -name;
 238        TRANSLATE_ERROR(EPERM);
 239        TRANSLATE_ERROR(ENOENT);
 240        TRANSLATE_ERROR(EINTR);
 241        TRANSLATE_ERROR(EAGAIN);
 242        TRANSLATE_ERROR(EACCES);
 243        TRANSLATE_ERROR(EBUSY);
 244        TRANSLATE_ERROR(EINVAL);
 245        TRANSLATE_ERROR(EDEADLK);
 246        TRANSLATE_ERROR(ENOSYS);
 247        TRANSLATE_ERROR(ETIME);
 248        TRANSLATE_ERROR(EALREADY);
 249        TRANSLATE_ERROR(ENOSPC);
 250#undef TRANSLATE_ERROR
 251        case MC_CMD_ERR_ENOTSUP:
 252                return -EOPNOTSUPP;
 253        case MC_CMD_ERR_ALLOC_FAIL:
 254                return -ENOBUFS;
 255        case MC_CMD_ERR_MAC_EXIST:
 256                return -EADDRINUSE;
 257        default:
 258                return -EPROTO;
 259        }
 260}
 261
 262static void efx_mcdi_read_response_header(struct efx_nic *efx)
 263{
 264        struct efx_mcdi_iface *mcdi = efx_mcdi(efx);
 265        unsigned int respseq, respcmd, error;
 266#ifdef CONFIG_SFC_MCDI_LOGGING
 267        char *buf = mcdi->logging_buffer; /* page-sized */
 268#endif
 269        efx_dword_t hdr;
 270
 271        efx->type->mcdi_read_response(efx, &hdr, 0, 4);
 272        respseq = EFX_DWORD_FIELD(hdr, MCDI_HEADER_SEQ);
 273        respcmd = EFX_DWORD_FIELD(hdr, MCDI_HEADER_CODE);
 274        error = EFX_DWORD_FIELD(hdr, MCDI_HEADER_ERROR);
 275
 276        if (respcmd != MC_CMD_V2_EXTN) {
 277                mcdi->resp_hdr_len = 4;
 278                mcdi->resp_data_len = EFX_DWORD_FIELD(hdr, MCDI_HEADER_DATALEN);
 279        } else {
 280                efx->type->mcdi_read_response(efx, &hdr, 4, 4);
 281                mcdi->resp_hdr_len = 8;
 282                mcdi->resp_data_len =
 283                        EFX_DWORD_FIELD(hdr, MC_CMD_V2_EXTN_IN_ACTUAL_LEN);
 284        }
 285
 286#ifdef CONFIG_SFC_MCDI_LOGGING
 287        if (mcdi->logging_enabled && !WARN_ON_ONCE(!buf)) {
 288                size_t hdr_len, data_len;
 289                int bytes = 0;
 290                int i;
 291
 292                WARN_ON_ONCE(mcdi->resp_hdr_len % 4);
 293                hdr_len = mcdi->resp_hdr_len / 4;
 294                /* MCDI_DECLARE_BUF ensures that underlying buffer is padded
 295                 * to dword size, and the MCDI buffer is always dword size
 296                 */
 297                data_len = DIV_ROUND_UP(mcdi->resp_data_len, 4);
 298
 299                /* We own the logging buffer, as only one MCDI can be in
 300                 * progress on a NIC at any one time.  So no need for locking.
 301                 */
 302                for (i = 0; i < hdr_len && bytes < PAGE_SIZE; i++) {
 303                        efx->type->mcdi_read_response(efx, &hdr, (i * 4), 4);
 304                        bytes += snprintf(buf + bytes, PAGE_SIZE - bytes,
 305                                          " %08x", le32_to_cpu(hdr.u32[0]));
 306                }
 307
 308                for (i = 0; i < data_len && bytes < PAGE_SIZE; i++) {
 309                        efx->type->mcdi_read_response(efx, &hdr,
 310                                        mcdi->resp_hdr_len + (i * 4), 4);
 311                        bytes += snprintf(buf + bytes, PAGE_SIZE - bytes,
 312                                          " %08x", le32_to_cpu(hdr.u32[0]));
 313                }
 314
 315                netif_info(efx, hw, efx->net_dev, "MCDI RPC RESP:%s\n", buf);
 316        }
 317#endif
 318
 319        mcdi->resprc_raw = 0;
 320        if (error && mcdi->resp_data_len == 0) {
 321                netif_err(efx, hw, efx->net_dev, "MC rebooted\n");
 322                mcdi->resprc = -EIO;
 323        } else if ((respseq ^ mcdi->seqno) & SEQ_MASK) {
 324                netif_err(efx, hw, efx->net_dev,
 325                          "MC response mismatch tx seq 0x%x rx seq 0x%x\n",
 326                          respseq, mcdi->seqno);
 327                mcdi->resprc = -EIO;
 328        } else if (error) {
 329                efx->type->mcdi_read_response(efx, &hdr, mcdi->resp_hdr_len, 4);
 330                mcdi->resprc_raw = EFX_DWORD_FIELD(hdr, EFX_DWORD_0);
 331                mcdi->resprc = efx_mcdi_errno(mcdi->resprc_raw);
 332        } else {
 333                mcdi->resprc = 0;
 334        }
 335}
 336
 337static bool efx_mcdi_poll_once(struct efx_nic *efx)
 338{
 339        struct efx_mcdi_iface *mcdi = efx_mcdi(efx);
 340
 341        rmb();
 342        if (!efx->type->mcdi_poll_response(efx))
 343                return false;
 344
 345        spin_lock_bh(&mcdi->iface_lock);
 346        efx_mcdi_read_response_header(efx);
 347        spin_unlock_bh(&mcdi->iface_lock);
 348
 349        return true;
 350}
 351
 352static int efx_mcdi_poll(struct efx_nic *efx)
 353{
 354        struct efx_mcdi_iface *mcdi = efx_mcdi(efx);
 355        unsigned long time, finish;
 356        unsigned int spins;
 357        int rc;
 358
 359        /* Check for a reboot atomically with respect to efx_mcdi_copyout() */
 360        rc = efx_mcdi_poll_reboot(efx);
 361        if (rc) {
 362                spin_lock_bh(&mcdi->iface_lock);
 363                mcdi->resprc = rc;
 364                mcdi->resp_hdr_len = 0;
 365                mcdi->resp_data_len = 0;
 366                spin_unlock_bh(&mcdi->iface_lock);
 367                return 0;
 368        }
 369
 370        /* Poll for completion. Poll quickly (once a us) for the 1st jiffy,
 371         * because generally mcdi responses are fast. After that, back off
 372         * and poll once a jiffy (approximately)
 373         */
 374        spins = TICK_USEC;
 375        finish = jiffies + MCDI_RPC_TIMEOUT;
 376
 377        while (1) {
 378                if (spins != 0) {
 379                        --spins;
 380                        udelay(1);
 381                } else {
 382                        schedule_timeout_uninterruptible(1);
 383                }
 384
 385                time = jiffies;
 386
 387                if (efx_mcdi_poll_once(efx))
 388                        break;
 389
 390                if (time_after(time, finish))
 391                        return -ETIMEDOUT;
 392        }
 393
 394        /* Return rc=0 like wait_event_timeout() */
 395        return 0;
 396}
 397
 398/* Test and clear MC-rebooted flag for this port/function; reset
 399 * software state as necessary.
 400 */
 401int efx_mcdi_poll_reboot(struct efx_nic *efx)
 402{
 403        if (!efx->mcdi)
 404                return 0;
 405
 406        return efx->type->mcdi_poll_reboot(efx);
 407}
 408
 409static bool efx_mcdi_acquire_async(struct efx_mcdi_iface *mcdi)
 410{
 411        return cmpxchg(&mcdi->state,
 412                       MCDI_STATE_QUIESCENT, MCDI_STATE_RUNNING_ASYNC) ==
 413                MCDI_STATE_QUIESCENT;
 414}
 415
 416static void efx_mcdi_acquire_sync(struct efx_mcdi_iface *mcdi)
 417{
 418        /* Wait until the interface becomes QUIESCENT and we win the race
 419         * to mark it RUNNING_SYNC.
 420         */
 421        wait_event(mcdi->wq,
 422                   cmpxchg(&mcdi->state,
 423                           MCDI_STATE_QUIESCENT, MCDI_STATE_RUNNING_SYNC) ==
 424                   MCDI_STATE_QUIESCENT);
 425}
 426
 427static int efx_mcdi_await_completion(struct efx_nic *efx)
 428{
 429        struct efx_mcdi_iface *mcdi = efx_mcdi(efx);
 430
 431        if (wait_event_timeout(mcdi->wq, mcdi->state == MCDI_STATE_COMPLETED,
 432                               MCDI_RPC_TIMEOUT) == 0)
 433                return -ETIMEDOUT;
 434
 435        /* Check if efx_mcdi_set_mode() switched us back to polled completions.
 436         * In which case, poll for completions directly. If efx_mcdi_ev_cpl()
 437         * completed the request first, then we'll just end up completing the
 438         * request again, which is safe.
 439         *
 440         * We need an smp_rmb() to synchronise with efx_mcdi_mode_poll(), which
 441         * wait_event_timeout() implicitly provides.
 442         */
 443        if (mcdi->mode == MCDI_MODE_POLL)
 444                return efx_mcdi_poll(efx);
 445
 446        return 0;
 447}
 448
 449/* If the interface is RUNNING_SYNC, switch to COMPLETED and wake the
 450 * requester.  Return whether this was done.  Does not take any locks.
 451 */
 452static bool efx_mcdi_complete_sync(struct efx_mcdi_iface *mcdi)
 453{
 454        if (cmpxchg(&mcdi->state,
 455                    MCDI_STATE_RUNNING_SYNC, MCDI_STATE_COMPLETED) ==
 456            MCDI_STATE_RUNNING_SYNC) {
 457                wake_up(&mcdi->wq);
 458                return true;
 459        }
 460
 461        return false;
 462}
 463
 464static void efx_mcdi_release(struct efx_mcdi_iface *mcdi)
 465{
 466        if (mcdi->mode == MCDI_MODE_EVENTS) {
 467                struct efx_mcdi_async_param *async;
 468                struct efx_nic *efx = mcdi->efx;
 469
 470                /* Process the asynchronous request queue */
 471                spin_lock_bh(&mcdi->async_lock);
 472                async = list_first_entry_or_null(
 473                        &mcdi->async_list, struct efx_mcdi_async_param, list);
 474                if (async) {
 475                        mcdi->state = MCDI_STATE_RUNNING_ASYNC;
 476                        efx_mcdi_send_request(efx, async->cmd,
 477                                              (const efx_dword_t *)(async + 1),
 478                                              async->inlen);
 479                        mod_timer(&mcdi->async_timer,
 480                                  jiffies + MCDI_RPC_TIMEOUT);
 481                }
 482                spin_unlock_bh(&mcdi->async_lock);
 483
 484                if (async)
 485                        return;
 486        }
 487
 488        mcdi->state = MCDI_STATE_QUIESCENT;
 489        wake_up(&mcdi->wq);
 490}
 491
 492/* If the interface is RUNNING_ASYNC, switch to COMPLETED, call the
 493 * asynchronous completion function, and release the interface.
 494 * Return whether this was done.  Must be called in bh-disabled
 495 * context.  Will take iface_lock and async_lock.
 496 */
 497static bool efx_mcdi_complete_async(struct efx_mcdi_iface *mcdi, bool timeout)
 498{
 499        struct efx_nic *efx = mcdi->efx;
 500        struct efx_mcdi_async_param *async;
 501        size_t hdr_len, data_len, err_len;
 502        efx_dword_t *outbuf;
 503        MCDI_DECLARE_BUF_ERR(errbuf);
 504        int rc;
 505
 506        if (cmpxchg(&mcdi->state,
 507                    MCDI_STATE_RUNNING_ASYNC, MCDI_STATE_COMPLETED) !=
 508            MCDI_STATE_RUNNING_ASYNC)
 509                return false;
 510
 511        spin_lock(&mcdi->iface_lock);
 512        if (timeout) {
 513                /* Ensure that if the completion event arrives later,
 514                 * the seqno check in efx_mcdi_ev_cpl() will fail
 515                 */
 516                ++mcdi->seqno;
 517                ++mcdi->credits;
 518                rc = -ETIMEDOUT;
 519                hdr_len = 0;
 520                data_len = 0;
 521        } else {
 522                rc = mcdi->resprc;
 523                hdr_len = mcdi->resp_hdr_len;
 524                data_len = mcdi->resp_data_len;
 525        }
 526        spin_unlock(&mcdi->iface_lock);
 527
 528        /* Stop the timer.  In case the timer function is running, we
 529         * must wait for it to return so that there is no possibility
 530         * of it aborting the next request.
 531         */
 532        if (!timeout)
 533                del_timer_sync(&mcdi->async_timer);
 534
 535        spin_lock(&mcdi->async_lock);
 536        async = list_first_entry(&mcdi->async_list,
 537                                 struct efx_mcdi_async_param, list);
 538        list_del(&async->list);
 539        spin_unlock(&mcdi->async_lock);
 540
 541        outbuf = (efx_dword_t *)(async + 1);
 542        efx->type->mcdi_read_response(efx, outbuf, hdr_len,
 543                                      min(async->outlen, data_len));
 544        if (!timeout && rc && !async->quiet) {
 545                err_len = min(sizeof(errbuf), data_len);
 546                efx->type->mcdi_read_response(efx, errbuf, hdr_len,
 547                                              sizeof(errbuf));
 548                efx_mcdi_display_error(efx, async->cmd, async->inlen, errbuf,
 549                                       err_len, rc);
 550        }
 551
 552        if (async->complete)
 553                async->complete(efx, async->cookie, rc, outbuf,
 554                                min(async->outlen, data_len));
 555        kfree(async);
 556
 557        efx_mcdi_release(mcdi);
 558
 559        return true;
 560}
 561
 562static void efx_mcdi_ev_cpl(struct efx_nic *efx, unsigned int seqno,
 563                            unsigned int datalen, unsigned int mcdi_err)
 564{
 565        struct efx_mcdi_iface *mcdi = efx_mcdi(efx);
 566        bool wake = false;
 567
 568        spin_lock(&mcdi->iface_lock);
 569
 570        if ((seqno ^ mcdi->seqno) & SEQ_MASK) {
 571                if (mcdi->credits)
 572                        /* The request has been cancelled */
 573                        --mcdi->credits;
 574                else
 575                        netif_err(efx, hw, efx->net_dev,
 576                                  "MC response mismatch tx seq 0x%x rx "
 577                                  "seq 0x%x\n", seqno, mcdi->seqno);
 578        } else {
 579                if (efx->type->mcdi_max_ver >= 2) {
 580                        /* MCDI v2 responses don't fit in an event */
 581                        efx_mcdi_read_response_header(efx);
 582                } else {
 583                        mcdi->resprc = efx_mcdi_errno(mcdi_err);
 584                        mcdi->resp_hdr_len = 4;
 585                        mcdi->resp_data_len = datalen;
 586                }
 587
 588                wake = true;
 589        }
 590
 591        spin_unlock(&mcdi->iface_lock);
 592
 593        if (wake) {
 594                if (!efx_mcdi_complete_async(mcdi, false))
 595                        (void) efx_mcdi_complete_sync(mcdi);
 596
 597                /* If the interface isn't RUNNING_ASYNC or
 598                 * RUNNING_SYNC then we've received a duplicate
 599                 * completion after we've already transitioned back to
 600                 * QUIESCENT. [A subsequent invocation would increment
 601                 * seqno, so would have failed the seqno check].
 602                 */
 603        }
 604}
 605
 606static void efx_mcdi_timeout_async(unsigned long context)
 607{
 608        struct efx_mcdi_iface *mcdi = (struct efx_mcdi_iface *)context;
 609
 610        efx_mcdi_complete_async(mcdi, true);
 611}
 612
 613static int
 614efx_mcdi_check_supported(struct efx_nic *efx, unsigned int cmd, size_t inlen)
 615{
 616        if (efx->type->mcdi_max_ver < 0 ||
 617             (efx->type->mcdi_max_ver < 2 &&
 618              cmd > MC_CMD_CMD_SPACE_ESCAPE_7))
 619                return -EINVAL;
 620
 621        if (inlen > MCDI_CTL_SDU_LEN_MAX_V2 ||
 622            (efx->type->mcdi_max_ver < 2 &&
 623             inlen > MCDI_CTL_SDU_LEN_MAX_V1))
 624                return -EMSGSIZE;
 625
 626        return 0;
 627}
 628
 629static bool efx_mcdi_get_proxy_handle(struct efx_nic *efx,
 630                                      size_t hdr_len, size_t data_len,
 631                                      u32 *proxy_handle)
 632{
 633        MCDI_DECLARE_BUF_ERR(testbuf);
 634        const size_t buflen = sizeof(testbuf);
 635
 636        if (!proxy_handle || data_len < buflen)
 637                return false;
 638
 639        efx->type->mcdi_read_response(efx, testbuf, hdr_len, buflen);
 640        if (MCDI_DWORD(testbuf, ERR_CODE) == MC_CMD_ERR_PROXY_PENDING) {
 641                *proxy_handle = MCDI_DWORD(testbuf, ERR_PROXY_PENDING_HANDLE);
 642                return true;
 643        }
 644
 645        return false;
 646}
 647
 648static int _efx_mcdi_rpc_finish(struct efx_nic *efx, unsigned int cmd,
 649                                size_t inlen,
 650                                efx_dword_t *outbuf, size_t outlen,
 651                                size_t *outlen_actual, bool quiet,
 652                                u32 *proxy_handle, int *raw_rc)
 653{
 654        struct efx_mcdi_iface *mcdi = efx_mcdi(efx);
 655        MCDI_DECLARE_BUF_ERR(errbuf);
 656        int rc;
 657
 658        if (mcdi->mode == MCDI_MODE_POLL)
 659                rc = efx_mcdi_poll(efx);
 660        else
 661                rc = efx_mcdi_await_completion(efx);
 662
 663        if (rc != 0) {
 664                netif_err(efx, hw, efx->net_dev,
 665                          "MC command 0x%x inlen %d mode %d timed out\n",
 666                          cmd, (int)inlen, mcdi->mode);
 667
 668                if (mcdi->mode == MCDI_MODE_EVENTS && efx_mcdi_poll_once(efx)) {
 669                        netif_err(efx, hw, efx->net_dev,
 670                                  "MCDI request was completed without an event\n");
 671                        rc = 0;
 672                }
 673
 674                efx_mcdi_abandon(efx);
 675
 676                /* Close the race with efx_mcdi_ev_cpl() executing just too late
 677                 * and completing a request we've just cancelled, by ensuring
 678                 * that the seqno check therein fails.
 679                 */
 680                spin_lock_bh(&mcdi->iface_lock);
 681                ++mcdi->seqno;
 682                ++mcdi->credits;
 683                spin_unlock_bh(&mcdi->iface_lock);
 684        }
 685
 686        if (proxy_handle)
 687                *proxy_handle = 0;
 688
 689        if (rc != 0) {
 690                if (outlen_actual)
 691                        *outlen_actual = 0;
 692        } else {
 693                size_t hdr_len, data_len, err_len;
 694
 695                /* At the very least we need a memory barrier here to ensure
 696                 * we pick up changes from efx_mcdi_ev_cpl(). Protect against
 697                 * a spurious efx_mcdi_ev_cpl() running concurrently by
 698                 * acquiring the iface_lock. */
 699                spin_lock_bh(&mcdi->iface_lock);
 700                rc = mcdi->resprc;
 701                if (raw_rc)
 702                        *raw_rc = mcdi->resprc_raw;
 703                hdr_len = mcdi->resp_hdr_len;
 704                data_len = mcdi->resp_data_len;
 705                err_len = min(sizeof(errbuf), data_len);
 706                spin_unlock_bh(&mcdi->iface_lock);
 707
 708                BUG_ON(rc > 0);
 709
 710                efx->type->mcdi_read_response(efx, outbuf, hdr_len,
 711                                              min(outlen, data_len));
 712                if (outlen_actual)
 713                        *outlen_actual = data_len;
 714
 715                efx->type->mcdi_read_response(efx, errbuf, hdr_len, err_len);
 716
 717                if (cmd == MC_CMD_REBOOT && rc == -EIO) {
 718                        /* Don't reset if MC_CMD_REBOOT returns EIO */
 719                } else if (rc == -EIO || rc == -EINTR) {
 720                        netif_err(efx, hw, efx->net_dev, "MC fatal error %d\n",
 721                                  -rc);
 722                        efx_schedule_reset(efx, RESET_TYPE_MC_FAILURE);
 723                } else if (proxy_handle && (rc == -EPROTO) &&
 724                           efx_mcdi_get_proxy_handle(efx, hdr_len, data_len,
 725                                                     proxy_handle)) {
 726                        mcdi->proxy_rx_status = 0;
 727                        mcdi->proxy_rx_handle = 0;
 728                        mcdi->state = MCDI_STATE_PROXY_WAIT;
 729                } else if (rc && !quiet) {
 730                        efx_mcdi_display_error(efx, cmd, inlen, errbuf, err_len,
 731                                               rc);
 732                }
 733
 734                if (rc == -EIO || rc == -EINTR) {
 735                        msleep(MCDI_STATUS_SLEEP_MS);
 736                        efx_mcdi_poll_reboot(efx);
 737                        mcdi->new_epoch = true;
 738                }
 739        }
 740
 741        if (!proxy_handle || !*proxy_handle)
 742                efx_mcdi_release(mcdi);
 743        return rc;
 744}
 745
 746static void efx_mcdi_proxy_abort(struct efx_mcdi_iface *mcdi)
 747{
 748        if (mcdi->state == MCDI_STATE_PROXY_WAIT) {
 749                /* Interrupt the proxy wait. */
 750                mcdi->proxy_rx_status = -EINTR;
 751                wake_up(&mcdi->proxy_rx_wq);
 752        }
 753}
 754
 755static void efx_mcdi_ev_proxy_response(struct efx_nic *efx,
 756                                       u32 handle, int status)
 757{
 758        struct efx_mcdi_iface *mcdi = efx_mcdi(efx);
 759
 760        WARN_ON(mcdi->state != MCDI_STATE_PROXY_WAIT);
 761
 762        mcdi->proxy_rx_status = efx_mcdi_errno(status);
 763        /* Ensure the status is written before we update the handle, since the
 764         * latter is used to check if we've finished.
 765         */
 766        wmb();
 767        mcdi->proxy_rx_handle = handle;
 768        wake_up(&mcdi->proxy_rx_wq);
 769}
 770
 771static int efx_mcdi_proxy_wait(struct efx_nic *efx, u32 handle, bool quiet)
 772{
 773        struct efx_mcdi_iface *mcdi = efx_mcdi(efx);
 774        int rc;
 775
 776        /* Wait for a proxy event, or timeout. */
 777        rc = wait_event_timeout(mcdi->proxy_rx_wq,
 778                                mcdi->proxy_rx_handle != 0 ||
 779                                mcdi->proxy_rx_status == -EINTR,
 780                                MCDI_RPC_TIMEOUT);
 781
 782        if (rc <= 0) {
 783                netif_dbg(efx, hw, efx->net_dev,
 784                          "MCDI proxy timeout %d\n", handle);
 785                return -ETIMEDOUT;
 786        } else if (mcdi->proxy_rx_handle != handle) {
 787                netif_warn(efx, hw, efx->net_dev,
 788                           "MCDI proxy unexpected handle %d (expected %d)\n",
 789                           mcdi->proxy_rx_handle, handle);
 790                return -EINVAL;
 791        }
 792
 793        return mcdi->proxy_rx_status;
 794}
 795
 796static int _efx_mcdi_rpc(struct efx_nic *efx, unsigned int cmd,
 797                         const efx_dword_t *inbuf, size_t inlen,
 798                         efx_dword_t *outbuf, size_t outlen,
 799                         size_t *outlen_actual, bool quiet, int *raw_rc)
 800{
 801        u32 proxy_handle = 0; /* Zero is an invalid proxy handle. */
 802        int rc;
 803
 804        if (inbuf && inlen && (inbuf == outbuf)) {
 805                /* The input buffer can't be aliased with the output. */
 806                WARN_ON(1);
 807                return -EINVAL;
 808        }
 809
 810        rc = efx_mcdi_rpc_start(efx, cmd, inbuf, inlen);
 811        if (rc)
 812                return rc;
 813
 814        rc = _efx_mcdi_rpc_finish(efx, cmd, inlen, outbuf, outlen,
 815                                  outlen_actual, quiet, &proxy_handle, raw_rc);
 816
 817        if (proxy_handle) {
 818                /* Handle proxy authorisation. This allows approval of MCDI
 819                 * operations to be delegated to the admin function, allowing
 820                 * fine control over (eg) multicast subscriptions.
 821                 */
 822                struct efx_mcdi_iface *mcdi = efx_mcdi(efx);
 823
 824                netif_dbg(efx, hw, efx->net_dev,
 825                          "MCDI waiting for proxy auth %d\n",
 826                          proxy_handle);
 827                rc = efx_mcdi_proxy_wait(efx, proxy_handle, quiet);
 828
 829                if (rc == 0) {
 830                        netif_dbg(efx, hw, efx->net_dev,
 831                                  "MCDI proxy retry %d\n", proxy_handle);
 832
 833                        /* We now retry the original request. */
 834                        mcdi->state = MCDI_STATE_RUNNING_SYNC;
 835                        efx_mcdi_send_request(efx, cmd, inbuf, inlen);
 836
 837                        rc = _efx_mcdi_rpc_finish(efx, cmd, inlen,
 838                                                  outbuf, outlen, outlen_actual,
 839                                                  quiet, NULL, raw_rc);
 840                } else {
 841                        netif_printk(efx, hw,
 842                                     rc == -EPERM ? KERN_DEBUG : KERN_ERR,
 843                                     efx->net_dev,
 844                                     "MC command 0x%x failed after proxy auth rc=%d\n",
 845                                     cmd, rc);
 846
 847                        if (rc == -EINTR || rc == -EIO)
 848                                efx_schedule_reset(efx, RESET_TYPE_MC_FAILURE);
 849                        efx_mcdi_release(mcdi);
 850                }
 851        }
 852
 853        return rc;
 854}
 855
 856static int _efx_mcdi_rpc_evb_retry(struct efx_nic *efx, unsigned cmd,
 857                                   const efx_dword_t *inbuf, size_t inlen,
 858                                   efx_dword_t *outbuf, size_t outlen,
 859                                   size_t *outlen_actual, bool quiet)
 860{
 861        int raw_rc = 0;
 862        int rc;
 863
 864        rc = _efx_mcdi_rpc(efx, cmd, inbuf, inlen,
 865                           outbuf, outlen, outlen_actual, true, &raw_rc);
 866
 867        if ((rc == -EPROTO) && (raw_rc == MC_CMD_ERR_NO_EVB_PORT) &&
 868            efx->type->is_vf) {
 869                /* If the EVB port isn't available within a VF this may
 870                 * mean the PF is still bringing the switch up. We should
 871                 * retry our request shortly.
 872                 */
 873                unsigned long abort_time = jiffies + MCDI_RPC_TIMEOUT;
 874                unsigned int delay_us = 10000;
 875
 876                netif_dbg(efx, hw, efx->net_dev,
 877                          "%s: NO_EVB_PORT; will retry request\n",
 878                          __func__);
 879
 880                do {
 881                        usleep_range(delay_us, delay_us + 10000);
 882                        rc = _efx_mcdi_rpc(efx, cmd, inbuf, inlen,
 883                                           outbuf, outlen, outlen_actual,
 884                                           true, &raw_rc);
 885                        if (delay_us < 100000)
 886                                delay_us <<= 1;
 887                } while ((rc == -EPROTO) &&
 888                         (raw_rc == MC_CMD_ERR_NO_EVB_PORT) &&
 889                         time_before(jiffies, abort_time));
 890        }
 891
 892        if (rc && !quiet && !(cmd == MC_CMD_REBOOT && rc == -EIO))
 893                efx_mcdi_display_error(efx, cmd, inlen,
 894                                       outbuf, outlen, rc);
 895
 896        return rc;
 897}
 898
 899/**
 900 * efx_mcdi_rpc - Issue an MCDI command and wait for completion
 901 * @efx: NIC through which to issue the command
 902 * @cmd: Command type number
 903 * @inbuf: Command parameters
 904 * @inlen: Length of command parameters, in bytes.  Must be a multiple
 905 *      of 4 and no greater than %MCDI_CTL_SDU_LEN_MAX_V1.
 906 * @outbuf: Response buffer.  May be %NULL if @outlen is 0.
 907 * @outlen: Length of response buffer, in bytes.  If the actual
 908 *      response is longer than @outlen & ~3, it will be truncated
 909 *      to that length.
 910 * @outlen_actual: Pointer through which to return the actual response
 911 *      length.  May be %NULL if this is not needed.
 912 *
 913 * This function may sleep and therefore must be called in an appropriate
 914 * context.
 915 *
 916 * Return: A negative error code, or zero if successful.  The error
 917 *      code may come from the MCDI response or may indicate a failure
 918 *      to communicate with the MC.  In the former case, the response
 919 *      will still be copied to @outbuf and *@outlen_actual will be
 920 *      set accordingly.  In the latter case, *@outlen_actual will be
 921 *      set to zero.
 922 */
 923int efx_mcdi_rpc(struct efx_nic *efx, unsigned cmd,
 924                 const efx_dword_t *inbuf, size_t inlen,
 925                 efx_dword_t *outbuf, size_t outlen,
 926                 size_t *outlen_actual)
 927{
 928        return _efx_mcdi_rpc_evb_retry(efx, cmd, inbuf, inlen, outbuf, outlen,
 929                                       outlen_actual, false);
 930}
 931
 932/* Normally, on receiving an error code in the MCDI response,
 933 * efx_mcdi_rpc will log an error message containing (among other
 934 * things) the raw error code, by means of efx_mcdi_display_error.
 935 * This _quiet version suppresses that; if the caller wishes to log
 936 * the error conditionally on the return code, it should call this
 937 * function and is then responsible for calling efx_mcdi_display_error
 938 * as needed.
 939 */
 940int efx_mcdi_rpc_quiet(struct efx_nic *efx, unsigned cmd,
 941                       const efx_dword_t *inbuf, size_t inlen,
 942                       efx_dword_t *outbuf, size_t outlen,
 943                       size_t *outlen_actual)
 944{
 945        return _efx_mcdi_rpc_evb_retry(efx, cmd, inbuf, inlen, outbuf, outlen,
 946                                       outlen_actual, true);
 947}
 948
 949int efx_mcdi_rpc_start(struct efx_nic *efx, unsigned cmd,
 950                       const efx_dword_t *inbuf, size_t inlen)
 951{
 952        struct efx_mcdi_iface *mcdi = efx_mcdi(efx);
 953        int rc;
 954
 955        rc = efx_mcdi_check_supported(efx, cmd, inlen);
 956        if (rc)
 957                return rc;
 958
 959        if (efx->mc_bist_for_other_fn)
 960                return -ENETDOWN;
 961
 962        if (mcdi->mode == MCDI_MODE_FAIL)
 963                return -ENETDOWN;
 964
 965        efx_mcdi_acquire_sync(mcdi);
 966        efx_mcdi_send_request(efx, cmd, inbuf, inlen);
 967        return 0;
 968}
 969
 970static int _efx_mcdi_rpc_async(struct efx_nic *efx, unsigned int cmd,
 971                               const efx_dword_t *inbuf, size_t inlen,
 972                               size_t outlen,
 973                               efx_mcdi_async_completer *complete,
 974                               unsigned long cookie, bool quiet)
 975{
 976        struct efx_mcdi_iface *mcdi = efx_mcdi(efx);
 977        struct efx_mcdi_async_param *async;
 978        int rc;
 979
 980        rc = efx_mcdi_check_supported(efx, cmd, inlen);
 981        if (rc)
 982                return rc;
 983
 984        if (efx->mc_bist_for_other_fn)
 985                return -ENETDOWN;
 986
 987        async = kmalloc(sizeof(*async) + ALIGN(max(inlen, outlen), 4),
 988                        GFP_ATOMIC);
 989        if (!async)
 990                return -ENOMEM;
 991
 992        async->cmd = cmd;
 993        async->inlen = inlen;
 994        async->outlen = outlen;
 995        async->quiet = quiet;
 996        async->complete = complete;
 997        async->cookie = cookie;
 998        memcpy(async + 1, inbuf, inlen);
 999
1000        spin_lock_bh(&mcdi->async_lock);
1001
1002        if (mcdi->mode == MCDI_MODE_EVENTS) {
1003                list_add_tail(&async->list, &mcdi->async_list);
1004
1005                /* If this is at the front of the queue, try to start it
1006                 * immediately
1007                 */
1008                if (mcdi->async_list.next == &async->list &&
1009                    efx_mcdi_acquire_async(mcdi)) {
1010                        efx_mcdi_send_request(efx, cmd, inbuf, inlen);
1011                        mod_timer(&mcdi->async_timer,
1012                                  jiffies + MCDI_RPC_TIMEOUT);
1013                }
1014        } else {
1015                kfree(async);
1016                rc = -ENETDOWN;
1017        }
1018
1019        spin_unlock_bh(&mcdi->async_lock);
1020
1021        return rc;
1022}
1023
1024/**
1025 * efx_mcdi_rpc_async - Schedule an MCDI command to run asynchronously
1026 * @efx: NIC through which to issue the command
1027 * @cmd: Command type number
1028 * @inbuf: Command parameters
1029 * @inlen: Length of command parameters, in bytes
1030 * @outlen: Length to allocate for response buffer, in bytes
1031 * @complete: Function to be called on completion or cancellation.
1032 * @cookie: Arbitrary value to be passed to @complete.
1033 *
1034 * This function does not sleep and therefore may be called in atomic
1035 * context.  It will fail if event queues are disabled or if MCDI
1036 * event completions have been disabled due to an error.
1037 *
1038 * If it succeeds, the @complete function will be called exactly once
1039 * in atomic context, when one of the following occurs:
1040 * (a) the completion event is received (in NAPI context)
1041 * (b) event queues are disabled (in the process that disables them)
1042 * (c) the request times-out (in timer context)
1043 */
1044int
1045efx_mcdi_rpc_async(struct efx_nic *efx, unsigned int cmd,
1046                   const efx_dword_t *inbuf, size_t inlen, size_t outlen,
1047                   efx_mcdi_async_completer *complete, unsigned long cookie)
1048{
1049        return _efx_mcdi_rpc_async(efx, cmd, inbuf, inlen, outlen, complete,
1050                                   cookie, false);
1051}
1052
1053int efx_mcdi_rpc_async_quiet(struct efx_nic *efx, unsigned int cmd,
1054                             const efx_dword_t *inbuf, size_t inlen,
1055                             size_t outlen, efx_mcdi_async_completer *complete,
1056                             unsigned long cookie)
1057{
1058        return _efx_mcdi_rpc_async(efx, cmd, inbuf, inlen, outlen, complete,
1059                                   cookie, true);
1060}
1061
1062int efx_mcdi_rpc_finish(struct efx_nic *efx, unsigned cmd, size_t inlen,
1063                        efx_dword_t *outbuf, size_t outlen,
1064                        size_t *outlen_actual)
1065{
1066        return _efx_mcdi_rpc_finish(efx, cmd, inlen, outbuf, outlen,
1067                                    outlen_actual, false, NULL, NULL);
1068}
1069
1070int efx_mcdi_rpc_finish_quiet(struct efx_nic *efx, unsigned cmd, size_t inlen,
1071                              efx_dword_t *outbuf, size_t outlen,
1072                              size_t *outlen_actual)
1073{
1074        return _efx_mcdi_rpc_finish(efx, cmd, inlen, outbuf, outlen,
1075                                    outlen_actual, true, NULL, NULL);
1076}
1077
1078void efx_mcdi_display_error(struct efx_nic *efx, unsigned cmd,
1079                            size_t inlen, efx_dword_t *outbuf,
1080                            size_t outlen, int rc)
1081{
1082        int code = 0, err_arg = 0;
1083
1084        if (outlen >= MC_CMD_ERR_CODE_OFST + 4)
1085                code = MCDI_DWORD(outbuf, ERR_CODE);
1086        if (outlen >= MC_CMD_ERR_ARG_OFST + 4)
1087                err_arg = MCDI_DWORD(outbuf, ERR_ARG);
1088        netif_printk(efx, hw, rc == -EPERM ? KERN_DEBUG : KERN_ERR,
1089                     efx->net_dev,
1090                     "MC command 0x%x inlen %zu failed rc=%d (raw=%d) arg=%d\n",
1091                     cmd, inlen, rc, code, err_arg);
1092}
1093
1094/* Switch to polled MCDI completions.  This can be called in various
1095 * error conditions with various locks held, so it must be lockless.
1096 * Caller is responsible for flushing asynchronous requests later.
1097 */
1098void efx_mcdi_mode_poll(struct efx_nic *efx)
1099{
1100        struct efx_mcdi_iface *mcdi;
1101
1102        if (!efx->mcdi)
1103                return;
1104
1105        mcdi = efx_mcdi(efx);
1106        /* If already in polling mode, nothing to do.
1107         * If in fail-fast state, don't switch to polled completion.
1108         * FLR recovery will do that later.
1109         */
1110        if (mcdi->mode == MCDI_MODE_POLL || mcdi->mode == MCDI_MODE_FAIL)
1111                return;
1112
1113        /* We can switch from event completion to polled completion, because
1114         * mcdi requests are always completed in shared memory. We do this by
1115         * switching the mode to POLL'd then completing the request.
1116         * efx_mcdi_await_completion() will then call efx_mcdi_poll().
1117         *
1118         * We need an smp_wmb() to synchronise with efx_mcdi_await_completion(),
1119         * which efx_mcdi_complete_sync() provides for us.
1120         */
1121        mcdi->mode = MCDI_MODE_POLL;
1122
1123        efx_mcdi_complete_sync(mcdi);
1124}
1125
1126/* Flush any running or queued asynchronous requests, after event processing
1127 * is stopped
1128 */
1129void efx_mcdi_flush_async(struct efx_nic *efx)
1130{
1131        struct efx_mcdi_async_param *async, *next;
1132        struct efx_mcdi_iface *mcdi;
1133
1134        if (!efx->mcdi)
1135                return;
1136
1137        mcdi = efx_mcdi(efx);
1138
1139        /* We must be in poll or fail mode so no more requests can be queued */
1140        BUG_ON(mcdi->mode == MCDI_MODE_EVENTS);
1141
1142        del_timer_sync(&mcdi->async_timer);
1143
1144        /* If a request is still running, make sure we give the MC
1145         * time to complete it so that the response won't overwrite our
1146         * next request.
1147         */
1148        if (mcdi->state == MCDI_STATE_RUNNING_ASYNC) {
1149                efx_mcdi_poll(efx);
1150                mcdi->state = MCDI_STATE_QUIESCENT;
1151        }
1152
1153        /* Nothing else will access the async list now, so it is safe
1154         * to walk it without holding async_lock.  If we hold it while
1155         * calling a completer then lockdep may warn that we have
1156         * acquired locks in the wrong order.
1157         */
1158        list_for_each_entry_safe(async, next, &mcdi->async_list, list) {
1159                if (async->complete)
1160                        async->complete(efx, async->cookie, -ENETDOWN, NULL, 0);
1161                list_del(&async->list);
1162                kfree(async);
1163        }
1164}
1165
1166void efx_mcdi_mode_event(struct efx_nic *efx)
1167{
1168        struct efx_mcdi_iface *mcdi;
1169
1170        if (!efx->mcdi)
1171                return;
1172
1173        mcdi = efx_mcdi(efx);
1174        /* If already in event completion mode, nothing to do.
1175         * If in fail-fast state, don't switch to event completion.  FLR
1176         * recovery will do that later.
1177         */
1178        if (mcdi->mode == MCDI_MODE_EVENTS || mcdi->mode == MCDI_MODE_FAIL)
1179                return;
1180
1181        /* We can't switch from polled to event completion in the middle of a
1182         * request, because the completion method is specified in the request.
1183         * So acquire the interface to serialise the requestors. We don't need
1184         * to acquire the iface_lock to change the mode here, but we do need a
1185         * write memory barrier ensure that efx_mcdi_rpc() sees it, which
1186         * efx_mcdi_acquire() provides.
1187         */
1188        efx_mcdi_acquire_sync(mcdi);
1189        mcdi->mode = MCDI_MODE_EVENTS;
1190        efx_mcdi_release(mcdi);
1191}
1192
1193static void efx_mcdi_ev_death(struct efx_nic *efx, int rc)
1194{
1195        struct efx_mcdi_iface *mcdi = efx_mcdi(efx);
1196
1197        /* If there is an outstanding MCDI request, it has been terminated
1198         * either by a BADASSERT or REBOOT event. If the mcdi interface is
1199         * in polled mode, then do nothing because the MC reboot handler will
1200         * set the header correctly. However, if the mcdi interface is waiting
1201         * for a CMDDONE event it won't receive it [and since all MCDI events
1202         * are sent to the same queue, we can't be racing with
1203         * efx_mcdi_ev_cpl()]
1204         *
1205         * If there is an outstanding asynchronous request, we can't
1206         * complete it now (efx_mcdi_complete() would deadlock).  The
1207         * reset process will take care of this.
1208         *
1209         * There's a race here with efx_mcdi_send_request(), because
1210         * we might receive a REBOOT event *before* the request has
1211         * been copied out. In polled mode (during startup) this is
1212         * irrelevant, because efx_mcdi_complete_sync() is ignored. In
1213         * event mode, this condition is just an edge-case of
1214         * receiving a REBOOT event after posting the MCDI
1215         * request. Did the mc reboot before or after the copyout? The
1216         * best we can do always is just return failure.
1217         *
1218         * If there is an outstanding proxy response expected it is not going
1219         * to arrive. We should thus abort it.
1220         */
1221        spin_lock(&mcdi->iface_lock);
1222        efx_mcdi_proxy_abort(mcdi);
1223
1224        if (efx_mcdi_complete_sync(mcdi)) {
1225                if (mcdi->mode == MCDI_MODE_EVENTS) {
1226                        mcdi->resprc = rc;
1227                        mcdi->resp_hdr_len = 0;
1228                        mcdi->resp_data_len = 0;
1229                        ++mcdi->credits;
1230                }
1231        } else {
1232                int count;
1233
1234                /* Consume the status word since efx_mcdi_rpc_finish() won't */
1235                for (count = 0; count < MCDI_STATUS_DELAY_COUNT; ++count) {
1236                        rc = efx_mcdi_poll_reboot(efx);
1237                        if (rc)
1238                                break;
1239                        udelay(MCDI_STATUS_DELAY_US);
1240                }
1241
1242                /* On EF10, a CODE_MC_REBOOT event can be received without the
1243                 * reboot detection in efx_mcdi_poll_reboot() being triggered.
1244                 * If zero was returned from the final call to
1245                 * efx_mcdi_poll_reboot(), the MC reboot wasn't noticed but the
1246                 * MC has definitely rebooted so prepare for the reset.
1247                 */
1248                if (!rc && efx->type->mcdi_reboot_detected)
1249                        efx->type->mcdi_reboot_detected(efx);
1250
1251                mcdi->new_epoch = true;
1252
1253                /* Nobody was waiting for an MCDI request, so trigger a reset */
1254                efx_schedule_reset(efx, RESET_TYPE_MC_FAILURE);
1255        }
1256
1257        spin_unlock(&mcdi->iface_lock);
1258}
1259
1260/* The MC is going down in to BIST mode. set the BIST flag to block
1261 * new MCDI, cancel any outstanding MCDI and and schedule a BIST-type reset
1262 * (which doesn't actually execute a reset, it waits for the controlling
1263 * function to reset it).
1264 */
1265static void efx_mcdi_ev_bist(struct efx_nic *efx)
1266{
1267        struct efx_mcdi_iface *mcdi = efx_mcdi(efx);
1268
1269        spin_lock(&mcdi->iface_lock);
1270        efx->mc_bist_for_other_fn = true;
1271        efx_mcdi_proxy_abort(mcdi);
1272
1273        if (efx_mcdi_complete_sync(mcdi)) {
1274                if (mcdi->mode == MCDI_MODE_EVENTS) {
1275                        mcdi->resprc = -EIO;
1276                        mcdi->resp_hdr_len = 0;
1277                        mcdi->resp_data_len = 0;
1278                        ++mcdi->credits;
1279                }
1280        }
1281        mcdi->new_epoch = true;
1282        efx_schedule_reset(efx, RESET_TYPE_MC_BIST);
1283        spin_unlock(&mcdi->iface_lock);
1284}
1285
1286/* MCDI timeouts seen, so make all MCDI calls fail-fast and issue an FLR to try
1287 * to recover.
1288 */
1289static void efx_mcdi_abandon(struct efx_nic *efx)
1290{
1291        struct efx_mcdi_iface *mcdi = efx_mcdi(efx);
1292
1293        if (xchg(&mcdi->mode, MCDI_MODE_FAIL) == MCDI_MODE_FAIL)
1294                return; /* it had already been done */
1295        netif_dbg(efx, hw, efx->net_dev, "MCDI is timing out; trying to recover\n");
1296        efx_schedule_reset(efx, RESET_TYPE_MCDI_TIMEOUT);
1297}
1298
1299/* Called from  falcon_process_eventq for MCDI events */
1300void efx_mcdi_process_event(struct efx_channel *channel,
1301                            efx_qword_t *event)
1302{
1303        struct efx_nic *efx = channel->efx;
1304        int code = EFX_QWORD_FIELD(*event, MCDI_EVENT_CODE);
1305        u32 data = EFX_QWORD_FIELD(*event, MCDI_EVENT_DATA);
1306
1307        switch (code) {
1308        case MCDI_EVENT_CODE_BADSSERT:
1309                netif_err(efx, hw, efx->net_dev,
1310                          "MC watchdog or assertion failure at 0x%x\n", data);
1311                efx_mcdi_ev_death(efx, -EINTR);
1312                break;
1313
1314        case MCDI_EVENT_CODE_PMNOTICE:
1315                netif_info(efx, wol, efx->net_dev, "MCDI PM event.\n");
1316                break;
1317
1318        case MCDI_EVENT_CODE_CMDDONE:
1319                efx_mcdi_ev_cpl(efx,
1320                                MCDI_EVENT_FIELD(*event, CMDDONE_SEQ),
1321                                MCDI_EVENT_FIELD(*event, CMDDONE_DATALEN),
1322                                MCDI_EVENT_FIELD(*event, CMDDONE_ERRNO));
1323                break;
1324
1325        case MCDI_EVENT_CODE_LINKCHANGE:
1326                efx_mcdi_process_link_change(efx, event);
1327                break;
1328        case MCDI_EVENT_CODE_SENSOREVT:
1329                efx_mcdi_sensor_event(efx, event);
1330                break;
1331        case MCDI_EVENT_CODE_SCHEDERR:
1332                netif_dbg(efx, hw, efx->net_dev,
1333                          "MC Scheduler alert (0x%x)\n", data);
1334                break;
1335        case MCDI_EVENT_CODE_REBOOT:
1336        case MCDI_EVENT_CODE_MC_REBOOT:
1337                netif_info(efx, hw, efx->net_dev, "MC Reboot\n");
1338                efx_mcdi_ev_death(efx, -EIO);
1339                break;
1340        case MCDI_EVENT_CODE_MC_BIST:
1341                netif_info(efx, hw, efx->net_dev, "MC entered BIST mode\n");
1342                efx_mcdi_ev_bist(efx);
1343                break;
1344        case MCDI_EVENT_CODE_MAC_STATS_DMA:
1345                /* MAC stats are gather lazily.  We can ignore this. */
1346                break;
1347        case MCDI_EVENT_CODE_FLR:
1348                if (efx->type->sriov_flr)
1349                        efx->type->sriov_flr(efx,
1350                                             MCDI_EVENT_FIELD(*event, FLR_VF));
1351                break;
1352        case MCDI_EVENT_CODE_PTP_RX:
1353        case MCDI_EVENT_CODE_PTP_FAULT:
1354        case MCDI_EVENT_CODE_PTP_PPS:
1355                efx_ptp_event(efx, event);
1356                break;
1357        case MCDI_EVENT_CODE_PTP_TIME:
1358                efx_time_sync_event(channel, event);
1359                break;
1360        case MCDI_EVENT_CODE_TX_FLUSH:
1361        case MCDI_EVENT_CODE_RX_FLUSH:
1362                /* Two flush events will be sent: one to the same event
1363                 * queue as completions, and one to event queue 0.
1364                 * In the latter case the {RX,TX}_FLUSH_TO_DRIVER
1365                 * flag will be set, and we should ignore the event
1366                 * because we want to wait for all completions.
1367                 */
1368                BUILD_BUG_ON(MCDI_EVENT_TX_FLUSH_TO_DRIVER_LBN !=
1369                             MCDI_EVENT_RX_FLUSH_TO_DRIVER_LBN);
1370                if (!MCDI_EVENT_FIELD(*event, TX_FLUSH_TO_DRIVER))
1371                        efx_ef10_handle_drain_event(efx);
1372                break;
1373        case MCDI_EVENT_CODE_TX_ERR:
1374        case MCDI_EVENT_CODE_RX_ERR:
1375                netif_err(efx, hw, efx->net_dev,
1376                          "%s DMA error (event: "EFX_QWORD_FMT")\n",
1377                          code == MCDI_EVENT_CODE_TX_ERR ? "TX" : "RX",
1378                          EFX_QWORD_VAL(*event));
1379                efx_schedule_reset(efx, RESET_TYPE_DMA_ERROR);
1380                break;
1381        case MCDI_EVENT_CODE_PROXY_RESPONSE:
1382                efx_mcdi_ev_proxy_response(efx,
1383                                MCDI_EVENT_FIELD(*event, PROXY_RESPONSE_HANDLE),
1384                                MCDI_EVENT_FIELD(*event, PROXY_RESPONSE_RC));
1385                break;
1386        default:
1387                netif_err(efx, hw, efx->net_dev, "Unknown MCDI event 0x%x\n",
1388                          code);
1389        }
1390}
1391
1392/**************************************************************************
1393 *
1394 * Specific request functions
1395 *
1396 **************************************************************************
1397 */
1398
1399void efx_mcdi_print_fwver(struct efx_nic *efx, char *buf, size_t len)
1400{
1401        MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_VERSION_OUT_LEN);
1402        size_t outlength;
1403        const __le16 *ver_words;
1404        size_t offset;
1405        int rc;
1406
1407        BUILD_BUG_ON(MC_CMD_GET_VERSION_IN_LEN != 0);
1408        rc = efx_mcdi_rpc(efx, MC_CMD_GET_VERSION, NULL, 0,
1409                          outbuf, sizeof(outbuf), &outlength);
1410        if (rc)
1411                goto fail;
1412        if (outlength < MC_CMD_GET_VERSION_OUT_LEN) {
1413                rc = -EIO;
1414                goto fail;
1415        }
1416
1417        ver_words = (__le16 *)MCDI_PTR(outbuf, GET_VERSION_OUT_VERSION);
1418        offset = snprintf(buf, len, "%u.%u.%u.%u",
1419                          le16_to_cpu(ver_words[0]), le16_to_cpu(ver_words[1]),
1420                          le16_to_cpu(ver_words[2]), le16_to_cpu(ver_words[3]));
1421
1422        /* EF10 may have multiple datapath firmware variants within a
1423         * single version.  Report which variants are running.
1424         */
1425        if (efx_nic_rev(efx) >= EFX_REV_HUNT_A0) {
1426                struct efx_ef10_nic_data *nic_data = efx->nic_data;
1427
1428                offset += snprintf(buf + offset, len - offset, " rx%x tx%x",
1429                                   nic_data->rx_dpcpu_fw_id,
1430                                   nic_data->tx_dpcpu_fw_id);
1431
1432                /* It's theoretically possible for the string to exceed 31
1433                 * characters, though in practice the first three version
1434                 * components are short enough that this doesn't happen.
1435                 */
1436                if (WARN_ON(offset >= len))
1437                        buf[0] = 0;
1438        }
1439
1440        return;
1441
1442fail:
1443        netif_err(efx, probe, efx->net_dev, "%s: failed rc=%d\n", __func__, rc);
1444        buf[0] = 0;
1445}
1446
1447static int efx_mcdi_drv_attach(struct efx_nic *efx, bool driver_operating,
1448                               bool *was_attached)
1449{
1450        MCDI_DECLARE_BUF(inbuf, MC_CMD_DRV_ATTACH_IN_LEN);
1451        MCDI_DECLARE_BUF(outbuf, MC_CMD_DRV_ATTACH_EXT_OUT_LEN);
1452        size_t outlen;
1453        int rc;
1454
1455        MCDI_SET_DWORD(inbuf, DRV_ATTACH_IN_NEW_STATE,
1456                       driver_operating ? 1 : 0);
1457        MCDI_SET_DWORD(inbuf, DRV_ATTACH_IN_UPDATE, 1);
1458        MCDI_SET_DWORD(inbuf, DRV_ATTACH_IN_FIRMWARE_ID, MC_CMD_FW_LOW_LATENCY);
1459
1460        rc = efx_mcdi_rpc_quiet(efx, MC_CMD_DRV_ATTACH, inbuf, sizeof(inbuf),
1461                                outbuf, sizeof(outbuf), &outlen);
1462        /* If we're not the primary PF, trying to ATTACH with a FIRMWARE_ID
1463         * specified will fail with EPERM, and we have to tell the MC we don't
1464         * care what firmware we get.
1465         */
1466        if (rc == -EPERM) {
1467                netif_dbg(efx, probe, efx->net_dev,
1468                          "efx_mcdi_drv_attach with fw-variant setting failed EPERM, trying without it\n");
1469                MCDI_SET_DWORD(inbuf, DRV_ATTACH_IN_FIRMWARE_ID,
1470                               MC_CMD_FW_DONT_CARE);
1471                rc = efx_mcdi_rpc_quiet(efx, MC_CMD_DRV_ATTACH, inbuf,
1472                                        sizeof(inbuf), outbuf, sizeof(outbuf),
1473                                        &outlen);
1474        }
1475        if (rc) {
1476                efx_mcdi_display_error(efx, MC_CMD_DRV_ATTACH, sizeof(inbuf),
1477                                       outbuf, outlen, rc);
1478                goto fail;
1479        }
1480        if (outlen < MC_CMD_DRV_ATTACH_OUT_LEN) {
1481                rc = -EIO;
1482                goto fail;
1483        }
1484
1485        if (driver_operating) {
1486                if (outlen >= MC_CMD_DRV_ATTACH_EXT_OUT_LEN) {
1487                        efx->mcdi->fn_flags =
1488                                MCDI_DWORD(outbuf,
1489                                           DRV_ATTACH_EXT_OUT_FUNC_FLAGS);
1490                } else {
1491                        /* Synthesise flags for Siena */
1492                        efx->mcdi->fn_flags =
1493                                1 << MC_CMD_DRV_ATTACH_EXT_OUT_FLAG_LINKCTRL |
1494                                1 << MC_CMD_DRV_ATTACH_EXT_OUT_FLAG_TRUSTED |
1495                                (efx_port_num(efx) == 0) <<
1496                                MC_CMD_DRV_ATTACH_EXT_OUT_FLAG_PRIMARY;
1497                }
1498        }
1499
1500        /* We currently assume we have control of the external link
1501         * and are completely trusted by firmware.  Abort probing
1502         * if that's not true for this function.
1503         */
1504
1505        if (was_attached != NULL)
1506                *was_attached = MCDI_DWORD(outbuf, DRV_ATTACH_OUT_OLD_STATE);
1507        return 0;
1508
1509fail:
1510        netif_err(efx, probe, efx->net_dev, "%s: failed rc=%d\n", __func__, rc);
1511        return rc;
1512}
1513
1514int efx_mcdi_get_board_cfg(struct efx_nic *efx, u8 *mac_address,
1515                           u16 *fw_subtype_list, u32 *capabilities)
1516{
1517        MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_BOARD_CFG_OUT_LENMAX);
1518        size_t outlen, i;
1519        int port_num = efx_port_num(efx);
1520        int rc;
1521
1522        BUILD_BUG_ON(MC_CMD_GET_BOARD_CFG_IN_LEN != 0);
1523        /* we need __aligned(2) for ether_addr_copy */
1524        BUILD_BUG_ON(MC_CMD_GET_BOARD_CFG_OUT_MAC_ADDR_BASE_PORT0_OFST & 1);
1525        BUILD_BUG_ON(MC_CMD_GET_BOARD_CFG_OUT_MAC_ADDR_BASE_PORT1_OFST & 1);
1526
1527        rc = efx_mcdi_rpc(efx, MC_CMD_GET_BOARD_CFG, NULL, 0,
1528                          outbuf, sizeof(outbuf), &outlen);
1529        if (rc)
1530                goto fail;
1531
1532        if (outlen < MC_CMD_GET_BOARD_CFG_OUT_LENMIN) {
1533                rc = -EIO;
1534                goto fail;
1535        }
1536
1537        if (mac_address)
1538                ether_addr_copy(mac_address,
1539                                port_num ?
1540                                MCDI_PTR(outbuf, GET_BOARD_CFG_OUT_MAC_ADDR_BASE_PORT1) :
1541                                MCDI_PTR(outbuf, GET_BOARD_CFG_OUT_MAC_ADDR_BASE_PORT0));
1542        if (fw_subtype_list) {
1543                for (i = 0;
1544                     i < MCDI_VAR_ARRAY_LEN(outlen,
1545                                            GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST);
1546                     i++)
1547                        fw_subtype_list[i] = MCDI_ARRAY_WORD(
1548                                outbuf, GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST, i);
1549                for (; i < MC_CMD_GET_BOARD_CFG_OUT_FW_SUBTYPE_LIST_MAXNUM; i++)
1550                        fw_subtype_list[i] = 0;
1551        }
1552        if (capabilities) {
1553                if (port_num)
1554                        *capabilities = MCDI_DWORD(outbuf,
1555                                        GET_BOARD_CFG_OUT_CAPABILITIES_PORT1);
1556                else
1557                        *capabilities = MCDI_DWORD(outbuf,
1558                                        GET_BOARD_CFG_OUT_CAPABILITIES_PORT0);
1559        }
1560
1561        return 0;
1562
1563fail:
1564        netif_err(efx, hw, efx->net_dev, "%s: failed rc=%d len=%d\n",
1565                  __func__, rc, (int)outlen);
1566
1567        return rc;
1568}
1569
1570int efx_mcdi_log_ctrl(struct efx_nic *efx, bool evq, bool uart, u32 dest_evq)
1571{
1572        MCDI_DECLARE_BUF(inbuf, MC_CMD_LOG_CTRL_IN_LEN);
1573        u32 dest = 0;
1574        int rc;
1575
1576        if (uart)
1577                dest |= MC_CMD_LOG_CTRL_IN_LOG_DEST_UART;
1578        if (evq)
1579                dest |= MC_CMD_LOG_CTRL_IN_LOG_DEST_EVQ;
1580
1581        MCDI_SET_DWORD(inbuf, LOG_CTRL_IN_LOG_DEST, dest);
1582        MCDI_SET_DWORD(inbuf, LOG_CTRL_IN_LOG_DEST_EVQ, dest_evq);
1583
1584        BUILD_BUG_ON(MC_CMD_LOG_CTRL_OUT_LEN != 0);
1585
1586        rc = efx_mcdi_rpc(efx, MC_CMD_LOG_CTRL, inbuf, sizeof(inbuf),
1587                          NULL, 0, NULL);
1588        return rc;
1589}
1590
1591int efx_mcdi_nvram_types(struct efx_nic *efx, u32 *nvram_types_out)
1592{
1593        MCDI_DECLARE_BUF(outbuf, MC_CMD_NVRAM_TYPES_OUT_LEN);
1594        size_t outlen;
1595        int rc;
1596
1597        BUILD_BUG_ON(MC_CMD_NVRAM_TYPES_IN_LEN != 0);
1598
1599        rc = efx_mcdi_rpc(efx, MC_CMD_NVRAM_TYPES, NULL, 0,
1600                          outbuf, sizeof(outbuf), &outlen);
1601        if (rc)
1602                goto fail;
1603        if (outlen < MC_CMD_NVRAM_TYPES_OUT_LEN) {
1604                rc = -EIO;
1605                goto fail;
1606        }
1607
1608        *nvram_types_out = MCDI_DWORD(outbuf, NVRAM_TYPES_OUT_TYPES);
1609        return 0;
1610
1611fail:
1612        netif_err(efx, hw, efx->net_dev, "%s: failed rc=%d\n",
1613                  __func__, rc);
1614        return rc;
1615}
1616
1617int efx_mcdi_nvram_info(struct efx_nic *efx, unsigned int type,
1618                        size_t *size_out, size_t *erase_size_out,
1619                        bool *protected_out)
1620{
1621        MCDI_DECLARE_BUF(inbuf, MC_CMD_NVRAM_INFO_IN_LEN);
1622        MCDI_DECLARE_BUF(outbuf, MC_CMD_NVRAM_INFO_OUT_LEN);
1623        size_t outlen;
1624        int rc;
1625
1626        MCDI_SET_DWORD(inbuf, NVRAM_INFO_IN_TYPE, type);
1627
1628        rc = efx_mcdi_rpc(efx, MC_CMD_NVRAM_INFO, inbuf, sizeof(inbuf),
1629                          outbuf, sizeof(outbuf), &outlen);
1630        if (rc)
1631                goto fail;
1632        if (outlen < MC_CMD_NVRAM_INFO_OUT_LEN) {
1633                rc = -EIO;
1634                goto fail;
1635        }
1636
1637        *size_out = MCDI_DWORD(outbuf, NVRAM_INFO_OUT_SIZE);
1638        *erase_size_out = MCDI_DWORD(outbuf, NVRAM_INFO_OUT_ERASESIZE);
1639        *protected_out = !!(MCDI_DWORD(outbuf, NVRAM_INFO_OUT_FLAGS) &
1640                                (1 << MC_CMD_NVRAM_INFO_OUT_PROTECTED_LBN));
1641        return 0;
1642
1643fail:
1644        netif_err(efx, hw, efx->net_dev, "%s: failed rc=%d\n", __func__, rc);
1645        return rc;
1646}
1647
1648static int efx_mcdi_nvram_test(struct efx_nic *efx, unsigned int type)
1649{
1650        MCDI_DECLARE_BUF(inbuf, MC_CMD_NVRAM_TEST_IN_LEN);
1651        MCDI_DECLARE_BUF(outbuf, MC_CMD_NVRAM_TEST_OUT_LEN);
1652        int rc;
1653
1654        MCDI_SET_DWORD(inbuf, NVRAM_TEST_IN_TYPE, type);
1655
1656        rc = efx_mcdi_rpc(efx, MC_CMD_NVRAM_TEST, inbuf, sizeof(inbuf),
1657                          outbuf, sizeof(outbuf), NULL);
1658        if (rc)
1659                return rc;
1660
1661        switch (MCDI_DWORD(outbuf, NVRAM_TEST_OUT_RESULT)) {
1662        case MC_CMD_NVRAM_TEST_PASS:
1663        case MC_CMD_NVRAM_TEST_NOTSUPP:
1664                return 0;
1665        default:
1666                return -EIO;
1667        }
1668}
1669
1670int efx_mcdi_nvram_test_all(struct efx_nic *efx)
1671{
1672        u32 nvram_types;
1673        unsigned int type;
1674        int rc;
1675
1676        rc = efx_mcdi_nvram_types(efx, &nvram_types);
1677        if (rc)
1678                goto fail1;
1679
1680        type = 0;
1681        while (nvram_types != 0) {
1682                if (nvram_types & 1) {
1683                        rc = efx_mcdi_nvram_test(efx, type);
1684                        if (rc)
1685                                goto fail2;
1686                }
1687                type++;
1688                nvram_types >>= 1;
1689        }
1690
1691        return 0;
1692
1693fail2:
1694        netif_err(efx, hw, efx->net_dev, "%s: failed type=%u\n",
1695                  __func__, type);
1696fail1:
1697        netif_err(efx, hw, efx->net_dev, "%s: failed rc=%d\n", __func__, rc);
1698        return rc;
1699}
1700
1701/* Returns 1 if an assertion was read, 0 if no assertion had fired,
1702 * negative on error.
1703 */
1704static int efx_mcdi_read_assertion(struct efx_nic *efx)
1705{
1706        MCDI_DECLARE_BUF(inbuf, MC_CMD_GET_ASSERTS_IN_LEN);
1707        MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_ASSERTS_OUT_LEN);
1708        unsigned int flags, index;
1709        const char *reason;
1710        size_t outlen;
1711        int retry;
1712        int rc;
1713
1714        /* Attempt to read any stored assertion state before we reboot
1715         * the mcfw out of the assertion handler. Retry twice, once
1716         * because a boot-time assertion might cause this command to fail
1717         * with EINTR. And once again because GET_ASSERTS can race with
1718         * MC_CMD_REBOOT running on the other port. */
1719        retry = 2;
1720        do {
1721                MCDI_SET_DWORD(inbuf, GET_ASSERTS_IN_CLEAR, 1);
1722                rc = efx_mcdi_rpc_quiet(efx, MC_CMD_GET_ASSERTS,
1723                                        inbuf, MC_CMD_GET_ASSERTS_IN_LEN,
1724                                        outbuf, sizeof(outbuf), &outlen);
1725                if (rc == -EPERM)
1726                        return 0;
1727        } while ((rc == -EINTR || rc == -EIO) && retry-- > 0);
1728
1729        if (rc) {
1730                efx_mcdi_display_error(efx, MC_CMD_GET_ASSERTS,
1731                                       MC_CMD_GET_ASSERTS_IN_LEN, outbuf,
1732                                       outlen, rc);
1733                return rc;
1734        }
1735        if (outlen < MC_CMD_GET_ASSERTS_OUT_LEN)
1736                return -EIO;
1737
1738        /* Print out any recorded assertion state */
1739        flags = MCDI_DWORD(outbuf, GET_ASSERTS_OUT_GLOBAL_FLAGS);
1740        if (flags == MC_CMD_GET_ASSERTS_FLAGS_NO_FAILS)
1741                return 0;
1742
1743        reason = (flags == MC_CMD_GET_ASSERTS_FLAGS_SYS_FAIL)
1744                ? "system-level assertion"
1745                : (flags == MC_CMD_GET_ASSERTS_FLAGS_THR_FAIL)
1746                ? "thread-level assertion"
1747                : (flags == MC_CMD_GET_ASSERTS_FLAGS_WDOG_FIRED)
1748                ? "watchdog reset"
1749                : "unknown assertion";
1750        netif_err(efx, hw, efx->net_dev,
1751                  "MCPU %s at PC = 0x%.8x in thread 0x%.8x\n", reason,
1752                  MCDI_DWORD(outbuf, GET_ASSERTS_OUT_SAVED_PC_OFFS),
1753                  MCDI_DWORD(outbuf, GET_ASSERTS_OUT_THREAD_OFFS));
1754
1755        /* Print out the registers */
1756        for (index = 0;
1757             index < MC_CMD_GET_ASSERTS_OUT_GP_REGS_OFFS_NUM;
1758             index++)
1759                netif_err(efx, hw, efx->net_dev, "R%.2d (?): 0x%.8x\n",
1760                          1 + index,
1761                          MCDI_ARRAY_DWORD(outbuf, GET_ASSERTS_OUT_GP_REGS_OFFS,
1762                                           index));
1763
1764        return 1;
1765}
1766
1767static int efx_mcdi_exit_assertion(struct efx_nic *efx)
1768{
1769        MCDI_DECLARE_BUF(inbuf, MC_CMD_REBOOT_IN_LEN);
1770        int rc;
1771
1772        /* If the MC is running debug firmware, it might now be
1773         * waiting for a debugger to attach, but we just want it to
1774         * reboot.  We set a flag that makes the command a no-op if it
1775         * has already done so.
1776         * The MCDI will thus return either 0 or -EIO.
1777         */
1778        BUILD_BUG_ON(MC_CMD_REBOOT_OUT_LEN != 0);
1779        MCDI_SET_DWORD(inbuf, REBOOT_IN_FLAGS,
1780                       MC_CMD_REBOOT_FLAGS_AFTER_ASSERTION);
1781        rc = efx_mcdi_rpc_quiet(efx, MC_CMD_REBOOT, inbuf, MC_CMD_REBOOT_IN_LEN,
1782                                NULL, 0, NULL);
1783        if (rc == -EIO)
1784                rc = 0;
1785        if (rc)
1786                efx_mcdi_display_error(efx, MC_CMD_REBOOT, MC_CMD_REBOOT_IN_LEN,
1787                                       NULL, 0, rc);
1788        return rc;
1789}
1790
1791int efx_mcdi_handle_assertion(struct efx_nic *efx)
1792{
1793        int rc;
1794
1795        rc = efx_mcdi_read_assertion(efx);
1796        if (rc <= 0)
1797                return rc;
1798
1799        return efx_mcdi_exit_assertion(efx);
1800}
1801
1802void efx_mcdi_set_id_led(struct efx_nic *efx, enum efx_led_mode mode)
1803{
1804        MCDI_DECLARE_BUF(inbuf, MC_CMD_SET_ID_LED_IN_LEN);
1805        int rc;
1806
1807        BUILD_BUG_ON(EFX_LED_OFF != MC_CMD_LED_OFF);
1808        BUILD_BUG_ON(EFX_LED_ON != MC_CMD_LED_ON);
1809        BUILD_BUG_ON(EFX_LED_DEFAULT != MC_CMD_LED_DEFAULT);
1810
1811        BUILD_BUG_ON(MC_CMD_SET_ID_LED_OUT_LEN != 0);
1812
1813        MCDI_SET_DWORD(inbuf, SET_ID_LED_IN_STATE, mode);
1814
1815        rc = efx_mcdi_rpc(efx, MC_CMD_SET_ID_LED, inbuf, sizeof(inbuf),
1816                          NULL, 0, NULL);
1817}
1818
1819static int efx_mcdi_reset_func(struct efx_nic *efx)
1820{
1821        MCDI_DECLARE_BUF(inbuf, MC_CMD_ENTITY_RESET_IN_LEN);
1822        int rc;
1823
1824        BUILD_BUG_ON(MC_CMD_ENTITY_RESET_OUT_LEN != 0);
1825        MCDI_POPULATE_DWORD_1(inbuf, ENTITY_RESET_IN_FLAG,
1826                              ENTITY_RESET_IN_FUNCTION_RESOURCE_RESET, 1);
1827        rc = efx_mcdi_rpc(efx, MC_CMD_ENTITY_RESET, inbuf, sizeof(inbuf),
1828                          NULL, 0, NULL);
1829        return rc;
1830}
1831
1832static int efx_mcdi_reset_mc(struct efx_nic *efx)
1833{
1834        MCDI_DECLARE_BUF(inbuf, MC_CMD_REBOOT_IN_LEN);
1835        int rc;
1836
1837        BUILD_BUG_ON(MC_CMD_REBOOT_OUT_LEN != 0);
1838        MCDI_SET_DWORD(inbuf, REBOOT_IN_FLAGS, 0);
1839        rc = efx_mcdi_rpc(efx, MC_CMD_REBOOT, inbuf, sizeof(inbuf),
1840                          NULL, 0, NULL);
1841        /* White is black, and up is down */
1842        if (rc == -EIO)
1843                return 0;
1844        if (rc == 0)
1845                rc = -EIO;
1846        return rc;
1847}
1848
1849enum reset_type efx_mcdi_map_reset_reason(enum reset_type reason)
1850{
1851        return RESET_TYPE_RECOVER_OR_ALL;
1852}
1853
1854int efx_mcdi_reset(struct efx_nic *efx, enum reset_type method)
1855{
1856        int rc;
1857
1858        /* If MCDI is down, we can't handle_assertion */
1859        if (method == RESET_TYPE_MCDI_TIMEOUT) {
1860                rc = pci_reset_function(efx->pci_dev);
1861                if (rc)
1862                        return rc;
1863                /* Re-enable polled MCDI completion */
1864                if (efx->mcdi) {
1865                        struct efx_mcdi_iface *mcdi = efx_mcdi(efx);
1866                        mcdi->mode = MCDI_MODE_POLL;
1867                }
1868                return 0;
1869        }
1870
1871        /* Recover from a failed assertion pre-reset */
1872        rc = efx_mcdi_handle_assertion(efx);
1873        if (rc)
1874                return rc;
1875
1876        if (method == RESET_TYPE_DATAPATH)
1877                return 0;
1878        else if (method == RESET_TYPE_WORLD)
1879                return efx_mcdi_reset_mc(efx);
1880        else
1881                return efx_mcdi_reset_func(efx);
1882}
1883
1884static int efx_mcdi_wol_filter_set(struct efx_nic *efx, u32 type,
1885                                   const u8 *mac, int *id_out)
1886{
1887        MCDI_DECLARE_BUF(inbuf, MC_CMD_WOL_FILTER_SET_IN_LEN);
1888        MCDI_DECLARE_BUF(outbuf, MC_CMD_WOL_FILTER_SET_OUT_LEN);
1889        size_t outlen;
1890        int rc;
1891
1892        MCDI_SET_DWORD(inbuf, WOL_FILTER_SET_IN_WOL_TYPE, type);
1893        MCDI_SET_DWORD(inbuf, WOL_FILTER_SET_IN_FILTER_MODE,
1894                       MC_CMD_FILTER_MODE_SIMPLE);
1895        ether_addr_copy(MCDI_PTR(inbuf, WOL_FILTER_SET_IN_MAGIC_MAC), mac);
1896
1897        rc = efx_mcdi_rpc(efx, MC_CMD_WOL_FILTER_SET, inbuf, sizeof(inbuf),
1898                          outbuf, sizeof(outbuf), &outlen);
1899        if (rc)
1900                goto fail;
1901
1902        if (outlen < MC_CMD_WOL_FILTER_SET_OUT_LEN) {
1903                rc = -EIO;
1904                goto fail;
1905        }
1906
1907        *id_out = (int)MCDI_DWORD(outbuf, WOL_FILTER_SET_OUT_FILTER_ID);
1908
1909        return 0;
1910
1911fail:
1912        *id_out = -1;
1913        netif_err(efx, hw, efx->net_dev, "%s: failed rc=%d\n", __func__, rc);
1914        return rc;
1915
1916}
1917
1918
1919int
1920efx_mcdi_wol_filter_set_magic(struct efx_nic *efx,  const u8 *mac, int *id_out)
1921{
1922        return efx_mcdi_wol_filter_set(efx, MC_CMD_WOL_TYPE_MAGIC, mac, id_out);
1923}
1924
1925
1926int efx_mcdi_wol_filter_get_magic(struct efx_nic *efx, int *id_out)
1927{
1928        MCDI_DECLARE_BUF(outbuf, MC_CMD_WOL_FILTER_GET_OUT_LEN);
1929        size_t outlen;
1930        int rc;
1931
1932        rc = efx_mcdi_rpc(efx, MC_CMD_WOL_FILTER_GET, NULL, 0,
1933                          outbuf, sizeof(outbuf), &outlen);
1934        if (rc)
1935                goto fail;
1936
1937        if (outlen < MC_CMD_WOL_FILTER_GET_OUT_LEN) {
1938                rc = -EIO;
1939                goto fail;
1940        }
1941
1942        *id_out = (int)MCDI_DWORD(outbuf, WOL_FILTER_GET_OUT_FILTER_ID);
1943
1944        return 0;
1945
1946fail:
1947        *id_out = -1;
1948        netif_err(efx, hw, efx->net_dev, "%s: failed rc=%d\n", __func__, rc);
1949        return rc;
1950}
1951
1952
1953int efx_mcdi_wol_filter_remove(struct efx_nic *efx, int id)
1954{
1955        MCDI_DECLARE_BUF(inbuf, MC_CMD_WOL_FILTER_REMOVE_IN_LEN);
1956        int rc;
1957
1958        MCDI_SET_DWORD(inbuf, WOL_FILTER_REMOVE_IN_FILTER_ID, (u32)id);
1959
1960        rc = efx_mcdi_rpc(efx, MC_CMD_WOL_FILTER_REMOVE, inbuf, sizeof(inbuf),
1961                          NULL, 0, NULL);
1962        return rc;
1963}
1964
1965int efx_mcdi_flush_rxqs(struct efx_nic *efx)
1966{
1967        struct efx_channel *channel;
1968        struct efx_rx_queue *rx_queue;
1969        MCDI_DECLARE_BUF(inbuf,
1970                         MC_CMD_FLUSH_RX_QUEUES_IN_LEN(EFX_MAX_CHANNELS));
1971        int rc, count;
1972
1973        BUILD_BUG_ON(EFX_MAX_CHANNELS >
1974                     MC_CMD_FLUSH_RX_QUEUES_IN_QID_OFST_MAXNUM);
1975
1976        count = 0;
1977        efx_for_each_channel(channel, efx) {
1978                efx_for_each_channel_rx_queue(rx_queue, channel) {
1979                        if (rx_queue->flush_pending) {
1980                                rx_queue->flush_pending = false;
1981                                atomic_dec(&efx->rxq_flush_pending);
1982                                MCDI_SET_ARRAY_DWORD(
1983                                        inbuf, FLUSH_RX_QUEUES_IN_QID_OFST,
1984                                        count, efx_rx_queue_index(rx_queue));
1985                                count++;
1986                        }
1987                }
1988        }
1989
1990        rc = efx_mcdi_rpc(efx, MC_CMD_FLUSH_RX_QUEUES, inbuf,
1991                          MC_CMD_FLUSH_RX_QUEUES_IN_LEN(count), NULL, 0, NULL);
1992        WARN_ON(rc < 0);
1993
1994        return rc;
1995}
1996
1997int efx_mcdi_wol_filter_reset(struct efx_nic *efx)
1998{
1999        int rc;
2000
2001        rc = efx_mcdi_rpc(efx, MC_CMD_WOL_FILTER_RESET, NULL, 0, NULL, 0, NULL);
2002        return rc;
2003}
2004
2005int efx_mcdi_set_workaround(struct efx_nic *efx, u32 type, bool enabled,
2006                            unsigned int *flags)
2007{
2008        MCDI_DECLARE_BUF(inbuf, MC_CMD_WORKAROUND_IN_LEN);
2009        MCDI_DECLARE_BUF(outbuf, MC_CMD_WORKAROUND_EXT_OUT_LEN);
2010        size_t outlen;
2011        int rc;
2012
2013        BUILD_BUG_ON(MC_CMD_WORKAROUND_OUT_LEN != 0);
2014        MCDI_SET_DWORD(inbuf, WORKAROUND_IN_TYPE, type);
2015        MCDI_SET_DWORD(inbuf, WORKAROUND_IN_ENABLED, enabled);
2016        rc = efx_mcdi_rpc(efx, MC_CMD_WORKAROUND, inbuf, sizeof(inbuf),
2017                          outbuf, sizeof(outbuf), &outlen);
2018        if (rc)
2019                return rc;
2020
2021        if (!flags)
2022                return 0;
2023
2024        if (outlen >= MC_CMD_WORKAROUND_EXT_OUT_LEN)
2025                *flags = MCDI_DWORD(outbuf, WORKAROUND_EXT_OUT_FLAGS);
2026        else
2027                *flags = 0;
2028
2029        return 0;
2030}
2031
2032int efx_mcdi_get_workarounds(struct efx_nic *efx, unsigned int *impl_out,
2033                             unsigned int *enabled_out)
2034{
2035        MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_WORKAROUNDS_OUT_LEN);
2036        size_t outlen;
2037        int rc;
2038
2039        rc = efx_mcdi_rpc(efx, MC_CMD_GET_WORKAROUNDS, NULL, 0,
2040                          outbuf, sizeof(outbuf), &outlen);
2041        if (rc)
2042                goto fail;
2043
2044        if (outlen < MC_CMD_GET_WORKAROUNDS_OUT_LEN) {
2045                rc = -EIO;
2046                goto fail;
2047        }
2048
2049        if (impl_out)
2050                *impl_out = MCDI_DWORD(outbuf, GET_WORKAROUNDS_OUT_IMPLEMENTED);
2051
2052        if (enabled_out)
2053                *enabled_out = MCDI_DWORD(outbuf, GET_WORKAROUNDS_OUT_ENABLED);
2054
2055        return 0;
2056
2057fail:
2058        /* Older firmware lacks GET_WORKAROUNDS and this isn't especially
2059         * terrifying.  The call site will have to deal with it though.
2060         */
2061        netif_printk(efx, hw, rc == -ENOSYS ? KERN_DEBUG : KERN_ERR,
2062                     efx->net_dev, "%s: failed rc=%d\n", __func__, rc);
2063        return rc;
2064}
2065
2066#ifdef CONFIG_SFC_MTD
2067
2068#define EFX_MCDI_NVRAM_LEN_MAX 128
2069
2070static int efx_mcdi_nvram_update_start(struct efx_nic *efx, unsigned int type)
2071{
2072        MCDI_DECLARE_BUF(inbuf, MC_CMD_NVRAM_UPDATE_START_IN_LEN);
2073        int rc;
2074
2075        MCDI_SET_DWORD(inbuf, NVRAM_UPDATE_START_IN_TYPE, type);
2076
2077        BUILD_BUG_ON(MC_CMD_NVRAM_UPDATE_START_OUT_LEN != 0);
2078
2079        rc = efx_mcdi_rpc(efx, MC_CMD_NVRAM_UPDATE_START, inbuf, sizeof(inbuf),
2080                          NULL, 0, NULL);
2081        return rc;
2082}
2083
2084static int efx_mcdi_nvram_read(struct efx_nic *efx, unsigned int type,
2085                               loff_t offset, u8 *buffer, size_t length)
2086{
2087        MCDI_DECLARE_BUF(inbuf, MC_CMD_NVRAM_READ_IN_LEN);
2088        MCDI_DECLARE_BUF(outbuf,
2089                         MC_CMD_NVRAM_READ_OUT_LEN(EFX_MCDI_NVRAM_LEN_MAX));
2090        size_t outlen;
2091        int rc;
2092
2093        MCDI_SET_DWORD(inbuf, NVRAM_READ_IN_TYPE, type);
2094        MCDI_SET_DWORD(inbuf, NVRAM_READ_IN_OFFSET, offset);
2095        MCDI_SET_DWORD(inbuf, NVRAM_READ_IN_LENGTH, length);
2096
2097        rc = efx_mcdi_rpc(efx, MC_CMD_NVRAM_READ, inbuf, sizeof(inbuf),
2098                          outbuf, sizeof(outbuf), &outlen);
2099        if (rc)
2100                return rc;
2101
2102        memcpy(buffer, MCDI_PTR(outbuf, NVRAM_READ_OUT_READ_BUFFER), length);
2103        return 0;
2104}
2105
2106static int efx_mcdi_nvram_write(struct efx_nic *efx, unsigned int type,
2107                                loff_t offset, const u8 *buffer, size_t length)
2108{
2109        MCDI_DECLARE_BUF(inbuf,
2110                         MC_CMD_NVRAM_WRITE_IN_LEN(EFX_MCDI_NVRAM_LEN_MAX));
2111        int rc;
2112
2113        MCDI_SET_DWORD(inbuf, NVRAM_WRITE_IN_TYPE, type);
2114        MCDI_SET_DWORD(inbuf, NVRAM_WRITE_IN_OFFSET, offset);
2115        MCDI_SET_DWORD(inbuf, NVRAM_WRITE_IN_LENGTH, length);
2116        memcpy(MCDI_PTR(inbuf, NVRAM_WRITE_IN_WRITE_BUFFER), buffer, length);
2117
2118        BUILD_BUG_ON(MC_CMD_NVRAM_WRITE_OUT_LEN != 0);
2119
2120        rc = efx_mcdi_rpc(efx, MC_CMD_NVRAM_WRITE, inbuf,
2121                          ALIGN(MC_CMD_NVRAM_WRITE_IN_LEN(length), 4),
2122                          NULL, 0, NULL);
2123        return rc;
2124}
2125
2126static int efx_mcdi_nvram_erase(struct efx_nic *efx, unsigned int type,
2127                                loff_t offset, size_t length)
2128{
2129        MCDI_DECLARE_BUF(inbuf, MC_CMD_NVRAM_ERASE_IN_LEN);
2130        int rc;
2131
2132        MCDI_SET_DWORD(inbuf, NVRAM_ERASE_IN_TYPE, type);
2133        MCDI_SET_DWORD(inbuf, NVRAM_ERASE_IN_OFFSET, offset);
2134        MCDI_SET_DWORD(inbuf, NVRAM_ERASE_IN_LENGTH, length);
2135
2136        BUILD_BUG_ON(MC_CMD_NVRAM_ERASE_OUT_LEN != 0);
2137
2138        rc = efx_mcdi_rpc(efx, MC_CMD_NVRAM_ERASE, inbuf, sizeof(inbuf),
2139                          NULL, 0, NULL);
2140        return rc;
2141}
2142
2143static int efx_mcdi_nvram_update_finish(struct efx_nic *efx, unsigned int type)
2144{
2145        MCDI_DECLARE_BUF(inbuf, MC_CMD_NVRAM_UPDATE_FINISH_IN_LEN);
2146        int rc;
2147
2148        MCDI_SET_DWORD(inbuf, NVRAM_UPDATE_FINISH_IN_TYPE, type);
2149
2150        BUILD_BUG_ON(MC_CMD_NVRAM_UPDATE_FINISH_OUT_LEN != 0);
2151
2152        rc = efx_mcdi_rpc(efx, MC_CMD_NVRAM_UPDATE_FINISH, inbuf, sizeof(inbuf),
2153                          NULL, 0, NULL);
2154        return rc;
2155}
2156
2157int efx_mcdi_mtd_read(struct mtd_info *mtd, loff_t start,
2158                      size_t len, size_t *retlen, u8 *buffer)
2159{
2160        struct efx_mcdi_mtd_partition *part = to_efx_mcdi_mtd_partition(mtd);
2161        struct efx_nic *efx = mtd->priv;
2162        loff_t offset = start;
2163        loff_t end = min_t(loff_t, start + len, mtd->size);
2164        size_t chunk;
2165        int rc = 0;
2166
2167        while (offset < end) {
2168                chunk = min_t(size_t, end - offset, EFX_MCDI_NVRAM_LEN_MAX);
2169                rc = efx_mcdi_nvram_read(efx, part->nvram_type, offset,
2170                                         buffer, chunk);
2171                if (rc)
2172                        goto out;
2173                offset += chunk;
2174                buffer += chunk;
2175        }
2176out:
2177        *retlen = offset - start;
2178        return rc;
2179}
2180
2181int efx_mcdi_mtd_erase(struct mtd_info *mtd, loff_t start, size_t len)
2182{
2183        struct efx_mcdi_mtd_partition *part = to_efx_mcdi_mtd_partition(mtd);
2184        struct efx_nic *efx = mtd->priv;
2185        loff_t offset = start & ~((loff_t)(mtd->erasesize - 1));
2186        loff_t end = min_t(loff_t, start + len, mtd->size);
2187        size_t chunk = part->common.mtd.erasesize;
2188        int rc = 0;
2189
2190        if (!part->updating) {
2191                rc = efx_mcdi_nvram_update_start(efx, part->nvram_type);
2192                if (rc)
2193                        goto out;
2194                part->updating = true;
2195        }
2196
2197        /* The MCDI interface can in fact do multiple erase blocks at once;
2198         * but erasing may be slow, so we make multiple calls here to avoid
2199         * tripping the MCDI RPC timeout. */
2200        while (offset < end) {
2201                rc = efx_mcdi_nvram_erase(efx, part->nvram_type, offset,
2202                                          chunk);
2203                if (rc)
2204                        goto out;
2205                offset += chunk;
2206        }
2207out:
2208        return rc;
2209}
2210
2211int efx_mcdi_mtd_write(struct mtd_info *mtd, loff_t start,
2212                       size_t len, size_t *retlen, const u8 *buffer)
2213{
2214        struct efx_mcdi_mtd_partition *part = to_efx_mcdi_mtd_partition(mtd);
2215        struct efx_nic *efx = mtd->priv;
2216        loff_t offset = start;
2217        loff_t end = min_t(loff_t, start + len, mtd->size);
2218        size_t chunk;
2219        int rc = 0;
2220
2221        if (!part->updating) {
2222                rc = efx_mcdi_nvram_update_start(efx, part->nvram_type);
2223                if (rc)
2224                        goto out;
2225                part->updating = true;
2226        }
2227
2228        while (offset < end) {
2229                chunk = min_t(size_t, end - offset, EFX_MCDI_NVRAM_LEN_MAX);
2230                rc = efx_mcdi_nvram_write(efx, part->nvram_type, offset,
2231                                          buffer, chunk);
2232                if (rc)
2233                        goto out;
2234                offset += chunk;
2235                buffer += chunk;
2236        }
2237out:
2238        *retlen = offset - start;
2239        return rc;
2240}
2241
2242int efx_mcdi_mtd_sync(struct mtd_info *mtd)
2243{
2244        struct efx_mcdi_mtd_partition *part = to_efx_mcdi_mtd_partition(mtd);
2245        struct efx_nic *efx = mtd->priv;
2246        int rc = 0;
2247
2248        if (part->updating) {
2249                part->updating = false;
2250                rc = efx_mcdi_nvram_update_finish(efx, part->nvram_type);
2251        }
2252
2253        return rc;
2254}
2255
2256void efx_mcdi_mtd_rename(struct efx_mtd_partition *part)
2257{
2258        struct efx_mcdi_mtd_partition *mcdi_part =
2259                container_of(part, struct efx_mcdi_mtd_partition, common);
2260        struct efx_nic *efx = part->mtd.priv;
2261
2262        snprintf(part->name, sizeof(part->name), "%s %s:%02x",
2263                 efx->name, part->type_name, mcdi_part->fw_subtype);
2264}
2265
2266#endif /* CONFIG_SFC_MTD */
2267