linux/drivers/staging/csr/csr_wifi_hip_card_sdio.c
<<
>>
Prefs
   1/*****************************************************************************
   2
   3            (c) Cambridge Silicon Radio Limited 2012
   4            All rights reserved and confidential information of CSR
   5
   6            Refer to LICENSE.txt included with this source for details
   7            on the license terms.
   8
   9*****************************************************************************/
  10
  11/*
  12 * ---------------------------------------------------------------------------
  13 * FILE: csr_wifi_hip_card_sdio.c
  14 *
  15 * PURPOSE: Implementation of the Card API for SDIO.
  16 *
  17 * NOTES:
  18 *      CardInit() is called from the SDIO probe callback when a card is
  19 *      inserted. This performs the basic SDIO initialisation, enabling i/o
  20 *      etc.
  21 *
  22 * ---------------------------------------------------------------------------
  23 */
  24#include <linux/slab.h>
  25#include "csr_wifi_hip_unifi.h"
  26#include "csr_wifi_hip_conversions.h"
  27#include "csr_wifi_hip_unifiversion.h"
  28#include "csr_wifi_hip_card.h"
  29#include "csr_wifi_hip_card_sdio.h"
  30#include "csr_wifi_hip_chiphelper.h"
  31
  32
  33/* Time to wait between attempts to read MAILBOX0 */
  34#define MAILBOX1_TIMEOUT                10  /* in millisecs */
  35#define MAILBOX1_ATTEMPTS               200 /* 2 seconds */
  36
  37#define MAILBOX2_TIMEOUT                5   /* in millisecs */
  38#define MAILBOX2_ATTEMPTS               10  /* 50ms */
  39
  40#define RESET_SETTLE_DELAY              25  /* in millisecs */
  41
  42static CsrResult card_init_slots(card_t *card);
  43static CsrResult card_hw_init(card_t *card);
  44static CsrResult firmware_present_in_flash(card_t *card);
  45static void bootstrap_chip_hw(card_t *card);
  46static CsrResult unifi_reset_hardware(card_t *card);
  47static CsrResult unifi_hip_init(card_t *card);
  48static CsrResult card_access_panic(card_t *card);
  49static CsrResult unifi_read_chip_version(card_t *card);
  50
  51/*
  52 * ---------------------------------------------------------------------------
  53 *  unifi_alloc_card
  54 *
  55 *      Allocate and initialise the card context structure.
  56 *
  57 *  Arguments:
  58 *      sdio            Pointer to SDIO context pointer to pass to low
  59 *                      level i/o functions.
  60 *      ospriv          Pointer to O/S private struct to pass when calling
  61 *                      callbacks to the higher level system.
  62 *
  63 *  Returns:
  64 *      Pointer to card struct, which represents the driver context or
  65 *      NULL if the allocation failed.
  66 * ---------------------------------------------------------------------------
  67 */
  68card_t* unifi_alloc_card(CsrSdioFunction *sdio, void *ospriv)
  69{
  70    card_t *card;
  71    u32 i;
  72
  73
  74    card = kzalloc(sizeof(card_t), GFP_KERNEL);
  75    if (card == NULL)
  76    {
  77        return NULL;
  78    }
  79
  80    card->sdio_if = sdio;
  81    card->ospriv  = ospriv;
  82
  83    card->unifi_interrupt_seq = 1;
  84
  85    /* Make these invalid. */
  86    card->proc_select = (u32)(-1);
  87    card->dmem_page = (u32)(-1);
  88    card->pmem_page = (u32)(-1);
  89
  90    card->bh_reason_host = 0;
  91    card->bh_reason_unifi = 0;
  92
  93    for (i = 0; i < sizeof(card->tx_q_paused_flag) / sizeof(card->tx_q_paused_flag[0]); i++)
  94    {
  95        card->tx_q_paused_flag[i] = 0;
  96    }
  97    card->memory_resources_allocated = 0;
  98
  99    card->low_power_mode = UNIFI_LOW_POWER_DISABLED;
 100    card->periodic_wake_mode = UNIFI_PERIODIC_WAKE_HOST_DISABLED;
 101
 102    card->host_state = UNIFI_HOST_STATE_AWAKE;
 103    card->intmode = CSR_WIFI_INTMODE_DEFAULT;
 104
 105    /*
 106     * Memory resources for buffers are allocated when the chip is initialised
 107     * because we need configuration information from the firmware.
 108     */
 109
 110    /*
 111     * Initialise wait queues and lists
 112     */
 113    card->fh_command_queue.q_body = card->fh_command_q_body;
 114    card->fh_command_queue.q_length = UNIFI_SOFT_COMMAND_Q_LENGTH;
 115
 116    for (i = 0; i < UNIFI_NO_OF_TX_QS; i++)
 117    {
 118        card->fh_traffic_queue[i].q_body = card->fh_traffic_q_body[i];
 119        card->fh_traffic_queue[i].q_length = UNIFI_SOFT_TRAFFIC_Q_LENGTH;
 120    }
 121
 122
 123    /* Initialise mini-coredump pointers in case no coredump buffers
 124     * are requested by the OS layer.
 125     */
 126    card->request_coredump_on_reset = 0;
 127    card->dump_next_write = NULL;
 128    card->dump_cur_read = NULL;
 129    card->dump_buf = NULL;
 130
 131#ifdef UNIFI_DEBUG
 132    /* Determine offset of LSB in pointer for later alignment sanity check.
 133     * Synergy integer types have specific widths, which cause compiler
 134     * warnings when casting pointer types, e.g. on 64-bit systems.
 135     */
 136    {
 137        u32 val = 0x01234567;
 138
 139        if (*((u8 *)&val) == 0x01)
 140        {
 141            card->lsb = sizeof(void *) - 1;     /* BE */
 142        }
 143        else
 144        {
 145            card->lsb = 0;                      /* LE */
 146        }
 147    }
 148#endif
 149    return card;
 150} /* unifi_alloc_card() */
 151
 152
 153/*
 154 * ---------------------------------------------------------------------------
 155 *  unifi_init_card
 156 *
 157 *      Reset the hardware and perform HIP initialization
 158 *
 159 *  Arguments:
 160 *      card        Pointer to card struct
 161 *
 162 *  Returns:
 163 *      CsrResult code
 164 *      CSR_RESULT_SUCCESS if successful
 165 * ---------------------------------------------------------------------------
 166 */
 167CsrResult unifi_init_card(card_t *card, s32 led_mask)
 168{
 169    CsrResult r;
 170
 171
 172    if (card == NULL)
 173    {
 174        return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
 175    }
 176
 177    r = unifi_init(card);
 178    if (r != CSR_RESULT_SUCCESS)
 179    {
 180        return r;
 181    }
 182
 183    r = unifi_hip_init(card);
 184    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
 185    {
 186        return r;
 187    }
 188    if (r != CSR_RESULT_SUCCESS)
 189    {
 190        unifi_error(card->ospriv, "Failed to start host protocol.\n");
 191        return r;
 192    }
 193
 194    return CSR_RESULT_SUCCESS;
 195}
 196
 197
 198/*
 199 * ---------------------------------------------------------------------------
 200 *  unifi_init
 201 *
 202 *      Init the hardware.
 203 *
 204 *  Arguments:
 205 *      card        Pointer to card struct
 206 *
 207 *  Returns:
 208 *      CsrResult code
 209 *      CSR_RESULT_SUCCESS if successful
 210 * ---------------------------------------------------------------------------
 211 */
 212CsrResult unifi_init(card_t *card)
 213{
 214    CsrResult r;
 215    CsrResult csrResult;
 216
 217    if (card == NULL)
 218    {
 219        return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
 220    }
 221
 222    /*
 223     * Disable the SDIO interrupts while initialising UniFi.
 224     * Re-enable them when f/w is running.
 225     */
 226    csrResult = CsrSdioInterruptDisable(card->sdio_if);
 227    if (csrResult == CSR_SDIO_RESULT_NO_DEVICE)
 228    {
 229        return CSR_WIFI_HIP_RESULT_NO_DEVICE;
 230    }
 231
 232    /*
 233     * UniFi's PLL may start with a slow clock (~ 1 MHz) so initially
 234     * set the SDIO bus clock to a similar value or SDIO accesses may
 235     * fail.
 236     */
 237    csrResult = CsrSdioMaxBusClockFrequencySet(card->sdio_if, UNIFI_SDIO_CLOCK_SAFE_HZ);
 238    if (csrResult != CSR_RESULT_SUCCESS)
 239    {
 240        r = ConvertCsrSdioToCsrHipResult(card, csrResult);
 241        return r;
 242    }
 243    card->sdio_clock_speed = UNIFI_SDIO_CLOCK_SAFE_HZ;
 244
 245    /*
 246     * Reset UniFi. Note, this only resets the WLAN function part of the chip,
 247     * the SDIO interface is not reset.
 248     */
 249    unifi_trace(card->ospriv, UDBG1, "Resetting UniFi\n");
 250    r = unifi_reset_hardware(card);
 251    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
 252    {
 253        return r;
 254    }
 255    if (r != CSR_RESULT_SUCCESS)
 256    {
 257        unifi_error(card->ospriv, "Failed to reset UniFi\n");
 258        return r;
 259    }
 260
 261    /* Reset the power save mode, to be active until the MLME-reset is complete */
 262    r = unifi_configure_low_power_mode(card,
 263                                       UNIFI_LOW_POWER_DISABLED, UNIFI_PERIODIC_WAKE_HOST_DISABLED);
 264    if (r != CSR_RESULT_SUCCESS)
 265    {
 266        unifi_error(card->ospriv, "Failed to set power save mode\n");
 267        return r;
 268    }
 269
 270    /*
 271     * Set initial value of page registers.
 272     * The page registers will be maintained by unifi_read...() and
 273     * unifi_write...().
 274     */
 275    card->proc_select = (u32)(-1);
 276    card->dmem_page = (u32)(-1);
 277    card->pmem_page = (u32)(-1);
 278    r = unifi_write_direct16(card, ChipHelper_HOST_WINDOW3_PAGE(card->helper) * 2, 0);
 279    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
 280    {
 281        return r;
 282    }
 283    if (r != CSR_RESULT_SUCCESS)
 284    {
 285        unifi_error(card->ospriv, "Failed to write SHARED_DMEM_PAGE\n");
 286        return r;
 287    }
 288    r = unifi_write_direct16(card, ChipHelper_HOST_WINDOW2_PAGE(card->helper) * 2, 0);
 289    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
 290    {
 291        return r;
 292    }
 293    if (r != CSR_RESULT_SUCCESS)
 294    {
 295        unifi_error(card->ospriv, "Failed to write PROG_MEM2_PAGE\n");
 296        return r;
 297    }
 298
 299    /*
 300     * If the driver has reset UniFi due to previous SDIO failure, this may
 301     * have been due to a chip watchdog reset. In this case, the driver may
 302     * have requested a mini-coredump which needs to be captured now the
 303     * SDIO interface is alive.
 304     */
 305    (void)unifi_coredump_handle_request(card);
 306
 307    /*
 308     * Probe to see if the UniFi has ROM/flash to boot from. CSR6xxx should do.
 309     */
 310    r = firmware_present_in_flash(card);
 311    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
 312    {
 313        return r;
 314    }
 315    if (r == CSR_WIFI_HIP_RESULT_NOT_FOUND)
 316    {
 317        unifi_error(card->ospriv, "No firmware found\n");
 318    }
 319    else if (r != CSR_RESULT_SUCCESS)
 320    {
 321        unifi_error(card->ospriv, "Probe for Flash failed\n");
 322    }
 323
 324    return r;
 325} /* unifi_init() */
 326
 327
 328/*
 329 * ---------------------------------------------------------------------------
 330 *  unifi_download
 331 *
 332 *      Load the firmware.
 333 *
 334 *  Arguments:
 335 *      card        Pointer to card struct
 336 *      led_mask    Loader LED mask
 337 *
 338 *  Returns:
 339 *      CSR_RESULT_SUCCESS on success
 340 *      CsrResult error code on failure.
 341 * ---------------------------------------------------------------------------
 342 */
 343CsrResult unifi_download(card_t *card, s32 led_mask)
 344{
 345    CsrResult r;
 346    void *dlpriv;
 347
 348    if (card == NULL)
 349    {
 350        return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
 351    }
 352
 353    /* Set the loader led mask */
 354    card->loader_led_mask = led_mask;
 355
 356    /* Get the firmware file information */
 357    unifi_trace(card->ospriv, UDBG1, "downloading firmware...\n");
 358
 359    dlpriv = unifi_dl_fw_read_start(card, UNIFI_FW_STA);
 360    if (dlpriv == NULL)
 361    {
 362        return CSR_WIFI_HIP_RESULT_NOT_FOUND;
 363    }
 364
 365    /* Download the firmware. */
 366    r = unifi_dl_firmware(card, dlpriv);
 367    if (r != CSR_RESULT_SUCCESS)
 368    {
 369        unifi_error(card->ospriv, "Failed to download firmware\n");
 370        return r;
 371    }
 372
 373    /* Free the firmware file information. */
 374    unifi_fw_read_stop(card->ospriv, dlpriv);
 375
 376    return CSR_RESULT_SUCCESS;
 377} /* unifi_download() */
 378
 379
 380/*
 381 * ---------------------------------------------------------------------------
 382 *  unifi_hip_init
 383 *
 384 *      This function performs the f/w initialisation sequence as described
 385 *      in the Unifi Host Interface Protocol Specification.
 386 *      It allocates memory for host-side slot data and signal queues.
 387 *
 388 *  Arguments:
 389 *      card        Pointer to card struct
 390 *
 391 *  Returns:
 392 *      CSR_RESULT_SUCCESS on success or else a CSR error code
 393 *
 394 *  Notes:
 395 *      The firmware must have been downloaded.
 396 * ---------------------------------------------------------------------------
 397 */
 398static CsrResult unifi_hip_init(card_t *card)
 399{
 400    CsrResult r;
 401    CsrResult csrResult;
 402
 403    r = card_hw_init(card);
 404    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
 405    {
 406        return r;
 407    }
 408    if (r != CSR_RESULT_SUCCESS)
 409    {
 410        unifi_error(card->ospriv, "Failed to establish communication with UniFi\n");
 411        return r;
 412    }
 413#ifdef CSR_PRE_ALLOC_NET_DATA
 414    /* if there is any preallocated netdata left from the prev session free it now */
 415    prealloc_netdata_free(card);
 416#endif
 417    /*
 418     * Allocate memory for host-side slot data and signal queues.
 419     * We need the config info read from the firmware to know how much
 420     * memory to allocate.
 421     */
 422    r = card_init_slots(card);
 423    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
 424    {
 425        return r;
 426    }
 427    if (r != CSR_RESULT_SUCCESS)
 428    {
 429        unifi_error(card->ospriv, "Init slots failed: %d\n", r);
 430        return r;
 431    }
 432
 433    unifi_trace(card->ospriv, UDBG2, "Sending first UniFi interrupt\n");
 434
 435    r = unifi_set_host_state(card, UNIFI_HOST_STATE_AWAKE);
 436    if (r != CSR_RESULT_SUCCESS)
 437    {
 438        return r;
 439    }
 440
 441    /* Enable the SDIO interrupts now that the f/w is running. */
 442    csrResult = CsrSdioInterruptEnable(card->sdio_if);
 443    if (csrResult == CSR_SDIO_RESULT_NO_DEVICE)
 444    {
 445        return CSR_WIFI_HIP_RESULT_NO_DEVICE;
 446    }
 447
 448    /* Signal the UniFi to start handling messages */
 449    r = CardGenInt(card);
 450    if (r != CSR_RESULT_SUCCESS)
 451    {
 452        return r;
 453    }
 454
 455    return CSR_RESULT_SUCCESS;
 456} /* unifi_hip_init() */
 457
 458
 459/*
 460 * ---------------------------------------------------------------------------
 461 *  _build_sdio_config_data
 462 *
 463 *      Unpack the SDIO configuration information from a buffer read from
 464 *      UniFi into a host structure.
 465 *      The data is byte-swapped for a big-endian host if necessary by the
 466 *      UNPACK... macros.
 467 *
 468 *  Arguments:
 469 *      card            Pointer to card struct
 470 *      cfg_data        Destination structure to unpack into.
 471 *      cfg_data_buf    Source buffer to read from. This should be the raw
 472 *                      data read from UniFi.
 473 *
 474 *  Returns:
 475 *      None.
 476 * ---------------------------------------------------------------------------
 477 */
 478static void _build_sdio_config_data(sdio_config_data_t *cfg_data,
 479                                    const u8     *cfg_data_buf)
 480{
 481    s16 offset = 0;
 482
 483    cfg_data->version = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(cfg_data_buf + offset);
 484    offset += SIZEOF_UINT16;
 485
 486    cfg_data->sdio_ctrl_offset = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(cfg_data_buf + offset);
 487    offset += SIZEOF_UINT16;
 488
 489    cfg_data->fromhost_sigbuf_handle = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(cfg_data_buf + offset);
 490    offset += SIZEOF_UINT16;
 491
 492    cfg_data->tohost_sigbuf_handle = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(cfg_data_buf + offset);
 493    offset += SIZEOF_UINT16;
 494
 495    cfg_data->num_fromhost_sig_frags = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(cfg_data_buf + offset);
 496    offset += SIZEOF_UINT16;
 497
 498    cfg_data->num_tohost_sig_frags = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(cfg_data_buf + offset);
 499    offset += SIZEOF_UINT16;
 500
 501    cfg_data->num_fromhost_data_slots = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(cfg_data_buf + offset);
 502    offset += SIZEOF_UINT16;
 503
 504    cfg_data->num_tohost_data_slots = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(cfg_data_buf + offset);
 505    offset += SIZEOF_UINT16;
 506
 507    cfg_data->data_slot_size = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(cfg_data_buf + offset);
 508    offset += SIZEOF_UINT16;
 509
 510    cfg_data->initialised = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(cfg_data_buf + offset);
 511    offset += SIZEOF_UINT16;
 512
 513    cfg_data->overlay_size = CSR_GET_UINT32_FROM_LITTLE_ENDIAN(cfg_data_buf + offset);
 514    offset += SIZEOF_UINT32;
 515
 516    cfg_data->data_slot_round = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(cfg_data_buf + offset);
 517    offset += SIZEOF_UINT16;
 518
 519    cfg_data->sig_frag_size = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(cfg_data_buf + offset);
 520    offset += SIZEOF_UINT16;
 521
 522    cfg_data->tohost_signal_padding = CSR_GET_UINT16_FROM_LITTLE_ENDIAN(cfg_data_buf + offset);
 523} /* _build_sdio_config_data() */
 524
 525
 526/*
 527 * - Function ----------------------------------------------------------------
 528 * card_hw_init()
 529 *
 530 *      Perform the initialisation procedure described in the UniFi Host
 531 *      Interface Protocol document (section 3.3.8) and read the run-time
 532 *      configuration information from the UniFi. This is stuff like number
 533 *      of bulk data slots etc.
 534 *
 535 *      The card enumeration and SD initialisation has already been done by
 536 *      the SDIO library, see card_sdio_init().
 537 *
 538 *      The initialisation is done when firmware is ready, i.e. this may need
 539 *      to be called after a f/w download operation.
 540 *
 541 *      The initialisation procedure goes like this:
 542 *       - Wait for UniFi to start-up by polling SHARED_MAILBOX1
 543 *       - Find the symbol table and look up SLT_SDIO_SLOT_CONFIG
 544 *       - Read the config structure
 545 *       - Check the "SDIO initialised" flag, if not zero do a h/w reset and
 546 *         start again
 547 *       - Decide the number of bulk data slots to allocate, allocate them and
 548 *         set "SDIO initialised" flag (and generate an interrupt) to say so.
 549 *
 550 * Arguments:
 551 *      card        Pointer to card struct
 552 *
 553 * Returns:
 554 *      CSR_RESULT_SUCEESS on success,
 555 *      a CSR error code on failure
 556 *
 557 * Notes:
 558 *      All data in the f/w is stored in a little endian format, without any
 559 *      padding bytes. Every read from this memory has to be transformed in
 560 *      host (cpu specific) format, before it is stored in driver's parameters
 561 *      or/and structures. Athough unifi_card_read16() and unifi_read32() do perform
 562 *      the conversion internally, unifi_readn() does not.
 563 * ---------------------------------------------------------------------------
 564 */
 565static CsrResult card_hw_init(card_t *card)
 566{
 567    u32 slut_address;
 568    u16 initialised;
 569    u16 finger_print;
 570    symbol_t slut;
 571    sdio_config_data_t *cfg_data;
 572    u8 cfg_data_buf[SDIO_CONFIG_DATA_SIZE];
 573    CsrResult r;
 574    void *dlpriv;
 575    s16 major, minor;
 576    s16 search_4slut_again;
 577    CsrResult csrResult;
 578
 579    /*
 580     * The device revision from the TPLMID_MANF and TPLMID_CARD fields
 581     * of the CIS are available as
 582     *   card->sdio_if->pDevice->ManfID
 583     *   card->sdio_if->pDevice->AppID
 584     */
 585
 586    /*
 587     * Run in a loop so we can patch.
 588     */
 589    do
 590    {
 591        /* Reset these each time around the loop. */
 592        search_4slut_again = 0;
 593        cfg_data = NULL;
 594
 595        r = card_wait_for_firmware_to_start(card, &slut_address);
 596        if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
 597        {
 598            return r;
 599        }
 600        if (r != CSR_RESULT_SUCCESS)
 601        {
 602            unifi_error(card->ospriv, "Firmware hasn't started\n");
 603            return r;
 604        }
 605        unifi_trace(card->ospriv, UDBG4, "SLUT addr 0x%lX\n", slut_address);
 606
 607        /*
 608         * Firmware has started, but doesn't know full clock configuration yet
 609         * as some of the information may be in the MIB. Therefore we set an
 610         * initial SDIO clock speed, faster than UNIFI_SDIO_CLOCK_SAFE_HZ, for
 611         * the patch download and subsequent firmware initialisation, and
 612         * full speed UNIFI_SDIO_CLOCK_MAX_HZ will be set once the f/w tells us
 613         * that it is ready.
 614         */
 615        csrResult = CsrSdioMaxBusClockFrequencySet(card->sdio_if, UNIFI_SDIO_CLOCK_INIT_HZ);
 616        if (csrResult != CSR_RESULT_SUCCESS)
 617        {
 618            r = ConvertCsrSdioToCsrHipResult(card, csrResult);
 619            return r;
 620        }
 621        card->sdio_clock_speed = UNIFI_SDIO_CLOCK_INIT_HZ;
 622
 623        /*
 624         * Check the SLUT fingerprint.
 625         * The slut_address is a generic pointer so we must use unifi_card_read16().
 626         */
 627        unifi_trace(card->ospriv, UDBG4, "Looking for SLUT finger print\n");
 628        finger_print = 0;
 629        r = unifi_card_read16(card, slut_address, &finger_print);
 630        if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
 631        {
 632            return r;
 633        }
 634        if (r != CSR_RESULT_SUCCESS)
 635        {
 636            unifi_error(card->ospriv, "Failed to read SLUT finger print\n");
 637            return r;
 638        }
 639
 640        if (finger_print != SLUT_FINGERPRINT)
 641        {
 642            unifi_error(card->ospriv, "Failed to find Symbol lookup table fingerprint\n");
 643            return CSR_RESULT_FAILURE;
 644        }
 645
 646        /* Symbol table starts imedately after the fingerprint */
 647        slut_address += 2;
 648
 649        /* Search the table until either the end marker is found, or the
 650         * loading of patch firmware invalidates the current table.
 651         */
 652        while (!search_4slut_again)
 653        {
 654            u16 s;
 655            u32 l;
 656
 657            r = unifi_card_read16(card, slut_address, &s);
 658            if (r != CSR_RESULT_SUCCESS)
 659            {
 660                return r;
 661            }
 662            slut_address += 2;
 663
 664            if (s == CSR_SLT_END)
 665            {
 666                unifi_trace(card->ospriv, UDBG3, "  found CSR_SLT_END\n");
 667                break;
 668            }
 669
 670            r = unifi_read32(card, slut_address, &l);
 671            if (r != CSR_RESULT_SUCCESS)
 672            {
 673                return r;
 674            }
 675            slut_address += 4;
 676
 677            slut.id = s;
 678            slut.obj = l;
 679
 680            unifi_trace(card->ospriv, UDBG3, "  found SLUT id %02d.%08lx\n", slut.id, slut.obj);
 681            switch (slut.id)
 682            {
 683                case CSR_SLT_SDIO_SLOT_CONFIG:
 684                    cfg_data = &card->config_data;
 685                    /*
 686                     * unifi_card_readn reads n bytes from the card, where data is stored
 687                     * in a little endian format, without any padding bytes. So, we
 688                     * can not just pass the cfg_data pointer or use the
 689                     * sizeof(sdio_config_data_t) since the structure in the host can
 690                     * be big endian formatted or have padding bytes for alignment.
 691                     * We use a char buffer to read the data from the card.
 692                     */
 693                    r = unifi_card_readn(card, slut.obj, cfg_data_buf, SDIO_CONFIG_DATA_SIZE);
 694                    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
 695                    {
 696                        return r;
 697                    }
 698                    if (r != CSR_RESULT_SUCCESS)
 699                    {
 700                        unifi_error(card->ospriv, "Failed to read config data\n");
 701                        return r;
 702                    }
 703                    /* .. and then we copy the data to the host structure */
 704                    _build_sdio_config_data(cfg_data, cfg_data_buf);
 705
 706                    /* Make sure the from host data slots are what we expect
 707                        we reserve 2 for commands and there should be at least
 708                        1 left for each access category */
 709                    if ((cfg_data->num_fromhost_data_slots < UNIFI_RESERVED_COMMAND_SLOTS)
 710                        || (cfg_data->num_fromhost_data_slots - UNIFI_RESERVED_COMMAND_SLOTS) / UNIFI_NO_OF_TX_QS == 0)
 711                    {
 712                        unifi_error(card->ospriv, "From host data slots %d\n", cfg_data->num_fromhost_data_slots);
 713                        unifi_error(card->ospriv, "need to be (queues * x + 2) (UNIFI_RESERVED_COMMAND_SLOTS for commands)\n");
 714                        return CSR_RESULT_FAILURE;
 715                    }
 716
 717                    /* Configure SDIO to-block-size padding */
 718                    if (card->sdio_io_block_pad)
 719                    {
 720                    /*
 721                     * Firmware limits the maximum padding size via data_slot_round.
 722                     * Therefore when padding to whole block sizes, the block size
 723                     * must be configured correctly by adjusting CSR_WIFI_HIP_SDIO_BLOCK_SIZE.
 724                     */
 725                        if (cfg_data->data_slot_round < card->sdio_io_block_size)
 726                        {
 727                            unifi_error(card->ospriv,
 728                                        "Configuration error: Block size of %d exceeds f/w data_slot_round of %d\n",
 729                                        card->sdio_io_block_size, cfg_data->data_slot_round);
 730                            return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
 731                        }
 732
 733                        /*
 734                         * To force the To-Host signals to be rounded up to the SDIO block
 735                         * size, we need to write the To-Host Signal Padding Fragments
 736                         * field of the SDIO configuration in UniFi.
 737                         */
 738                        if ((card->sdio_io_block_size % cfg_data->sig_frag_size) != 0)
 739                        {
 740                            unifi_error(card->ospriv, "Configuration error: Can not pad to-host signals.\n");
 741                            return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
 742                        }
 743                        cfg_data->tohost_signal_padding = (u16) (card->sdio_io_block_size / cfg_data->sig_frag_size);
 744                        unifi_info(card->ospriv, "SDIO block size %d requires %d padding chunks\n",
 745                                   card->sdio_io_block_size, cfg_data->tohost_signal_padding);
 746                        r = unifi_card_write16(card, slut.obj + SDIO_TO_HOST_SIG_PADDING_OFFSET, cfg_data->tohost_signal_padding);
 747                        if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
 748                        {
 749                            return r;
 750                        }
 751                        if (r != CSR_RESULT_SUCCESS)
 752                        {
 753                            unifi_error(card->ospriv, "Failed to write To-Host Signal Padding Fragments\n");
 754                            return r;
 755                        }
 756                    }
 757
 758                    /* Reconstruct the Generic Pointer address of the
 759                     * SDIO Control Data Struct.
 760                     */
 761                    card->sdio_ctrl_addr = cfg_data->sdio_ctrl_offset | (UNIFI_SH_DMEM << 24);
 762                    card->init_flag_addr = slut.obj + SDIO_INIT_FLAG_OFFSET;
 763                    break;
 764
 765                case CSR_SLT_BUILD_ID_NUMBER:
 766                {
 767                    u32 n;
 768                    r = unifi_read32(card, slut.obj, &n);
 769                    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
 770                    {
 771                        return r;
 772                    }
 773                    if (r != CSR_RESULT_SUCCESS)
 774                    {
 775                        unifi_error(card->ospriv, "Failed to read build id\n");
 776                        return r;
 777                    }
 778                    card->build_id = n;
 779                }
 780                break;
 781
 782                case CSR_SLT_BUILD_ID_STRING:
 783                    r = unifi_readnz(card, slut.obj, card->build_id_string,
 784                                     sizeof(card->build_id_string));
 785                    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
 786                    {
 787                        return r;
 788                    }
 789                    if (r != CSR_RESULT_SUCCESS)
 790                    {
 791                        unifi_error(card->ospriv, "Failed to read build string\n");
 792                        return r;
 793                    }
 794                    break;
 795
 796                case CSR_SLT_PERSISTENT_STORE_DB:
 797                    break;
 798
 799                case CSR_SLT_BOOT_LOADER_CONTROL:
 800
 801                    /* This command copies most of the station firmware
 802                     * image from ROM into program RAM.  It also clears
 803                     * out the zerod data and sets up the initialised
 804                     * data. */
 805                    r = unifi_do_loader_op(card, slut.obj + 6, UNIFI_BOOT_LOADER_LOAD_STA);
 806                    if (r != CSR_RESULT_SUCCESS)
 807                    {
 808                        unifi_error(card->ospriv, "Failed to write loader load image command\n");
 809                        return r;
 810                    }
 811
 812                    dlpriv = unifi_dl_fw_read_start(card, UNIFI_FW_STA);
 813
 814                    /* dlpriv might be NULL, we still need to do the do_loader_op step. */
 815                    if (dlpriv != NULL)
 816                    {
 817                    /* Download the firmware. */
 818                        r = unifi_dl_patch(card, dlpriv, slut.obj);
 819
 820                    /* Free the firmware file information. */
 821                        unifi_fw_read_stop(card->ospriv, dlpriv);
 822
 823                        if (r != CSR_RESULT_SUCCESS)
 824                        {
 825                            unifi_error(card->ospriv, "Failed to patch firmware\n");
 826                            return r;
 827                        }
 828                    }
 829
 830                    /* This command starts the firmware image that we want (the
 831                    * station by default) with any patches required applied. */
 832                    r = unifi_do_loader_op(card, slut.obj + 6, UNIFI_BOOT_LOADER_RESTART);
 833                    if (r != CSR_RESULT_SUCCESS)
 834                    {
 835                        unifi_error(card->ospriv, "Failed to write loader restart command\n");
 836                        return r;
 837                    }
 838
 839                    /* The now running patch f/w defines a new SLUT data structure -
 840                     * the current one is no longer valid. We must drop out of the
 841                     * processing loop and enumerate the new SLUT (which may appear
 842                     * at a different offset).
 843                     */
 844                    search_4slut_again = 1;
 845                    break;
 846
 847                case CSR_SLT_PANIC_DATA_PHY:
 848                    card->panic_data_phy_addr = slut.obj;
 849                    break;
 850
 851                case CSR_SLT_PANIC_DATA_MAC:
 852                    card->panic_data_mac_addr = slut.obj;
 853                    break;
 854
 855                default:
 856                    /* do nothing */
 857                    break;
 858            }
 859        } /* while */
 860    } while (search_4slut_again);
 861
 862    /* Did we find the Config Data ? */
 863    if (cfg_data == NULL)
 864    {
 865        unifi_error(card->ospriv, "Failed to find SDIO_SLOT_CONFIG Symbol\n");
 866        return CSR_RESULT_FAILURE;
 867    }
 868
 869    /*
 870     * Has ths card already been initialised?
 871     * If so, return an error so we do a h/w reset and start again.
 872     */
 873    r = unifi_card_read16(card, card->init_flag_addr, &initialised);
 874    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
 875    {
 876        return r;
 877    }
 878    if (r != CSR_RESULT_SUCCESS)
 879    {
 880        unifi_error(card->ospriv, "Failed to read init flag at %08lx\n",
 881                    card->init_flag_addr);
 882        return r;
 883    }
 884    if (initialised != 0)
 885    {
 886        return CSR_RESULT_FAILURE;
 887    }
 888
 889
 890    /*
 891     * Now check the UniFi firmware version
 892     */
 893    major = (cfg_data->version >> 8) & 0xFF;
 894    minor = cfg_data->version & 0xFF;
 895    unifi_info(card->ospriv, "UniFi f/w protocol version %d.%d (driver %d.%d)\n",
 896               major, minor,
 897               UNIFI_HIP_MAJOR_VERSION, UNIFI_HIP_MINOR_VERSION);
 898
 899    unifi_info(card->ospriv, "Firmware build %u: %s\n",
 900               card->build_id, card->build_id_string);
 901
 902    if (major != UNIFI_HIP_MAJOR_VERSION)
 903    {
 904        unifi_error(card->ospriv, "UniFi f/w protocol major version (%d) is different from driver (v%d.%d)\n",
 905                    major, UNIFI_HIP_MAJOR_VERSION, UNIFI_HIP_MINOR_VERSION);
 906#ifndef CSR_WIFI_DISABLE_HIP_VERSION_CHECK
 907        return CSR_RESULT_FAILURE;
 908#endif
 909    }
 910    if (minor < UNIFI_HIP_MINOR_VERSION)
 911    {
 912        unifi_error(card->ospriv, "UniFi f/w protocol version (v%d.%d) is older than minimum required by driver (v%d.%d).\n",
 913                    major, minor,
 914                    UNIFI_HIP_MAJOR_VERSION, UNIFI_HIP_MINOR_VERSION);
 915#ifndef CSR_WIFI_DISABLE_HIP_VERSION_CHECK
 916        return CSR_RESULT_FAILURE;
 917#endif
 918    }
 919
 920    /* Read panic codes from a previous firmware panic. If the firmware has
 921     * not panicked since power was applied (e.g. power-off hard reset)
 922     * the stored panic codes will not be updated.
 923     */
 924    unifi_read_panic(card);
 925
 926    return CSR_RESULT_SUCCESS;
 927} /* card_hw_init() */
 928
 929
 930/*
 931 * ---------------------------------------------------------------------------
 932 *  card_wait_for_unifi_to_reset
 933 *
 934 *      Waits for a reset to complete by polling the WLAN function enable
 935 *      bit (which is cleared on reset).
 936 *
 937 *  Arguments:
 938 *      card            Pointer to card struct
 939 *
 940 *  Returns:
 941 *      CSR_RESULT_SUCCESS on success, CSR error code on failure.
 942 * ---------------------------------------------------------------------------
 943 */
 944static CsrResult card_wait_for_unifi_to_reset(card_t *card)
 945{
 946    s16 i;
 947    CsrResult r;
 948    u8 io_enable;
 949    CsrResult csrResult;
 950
 951    r = CSR_RESULT_SUCCESS;
 952    for (i = 0; i < MAILBOX2_ATTEMPTS; i++)
 953    {
 954        unifi_trace(card->ospriv, UDBG1, "waiting for reset to complete, attempt %d\n", i);
 955        if (card->chip_id > SDIO_CARD_ID_UNIFI_2)
 956        {
 957            /* It's quite likely that this read will timeout for the
 958             * first few tries - especially if we have reset via
 959             * DBG_RESET.
 960             */
 961#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
 962            unifi_debug_log_to_buf("m0@%02X=", SDIO_IO_READY);
 963#endif
 964            csrResult = CsrSdioF0Read8(card->sdio_if, SDIO_IO_READY, &io_enable);
 965#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
 966            if (csrResult != CSR_RESULT_SUCCESS)
 967            {
 968                unifi_debug_log_to_buf("error=%X\n", csrResult);
 969            }
 970            else
 971            {
 972                unifi_debug_log_to_buf("%X\n", io_enable);
 973            }
 974#endif
 975            if (csrResult == CSR_SDIO_RESULT_NO_DEVICE)
 976            {
 977                return CSR_WIFI_HIP_RESULT_NO_DEVICE;
 978            }
 979            r = CSR_RESULT_SUCCESS;
 980            if (csrResult != CSR_RESULT_SUCCESS)
 981            {
 982                r = ConvertCsrSdioToCsrHipResult(card, csrResult);
 983            }
 984        }
 985        else
 986        {
 987            r = sdio_read_f0(card, SDIO_IO_ENABLE, &io_enable);
 988        }
 989        if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
 990        {
 991            return r;
 992        }
 993        if (r == CSR_RESULT_SUCCESS)
 994        {
 995            u16 mbox2;
 996            s16 enabled = io_enable & (1 << card->function);
 997
 998            if (!enabled)
 999            {
1000                unifi_trace(card->ospriv, UDBG1,
1001                            "Reset complete (function %d is disabled) in ~ %u msecs\n",
1002                            card->function, i * MAILBOX2_TIMEOUT);
1003
1004                /* Enable WLAN function and verify MAILBOX2 is zero'd */
1005                csrResult = CsrSdioFunctionEnable(card->sdio_if);
1006                if (csrResult != CSR_RESULT_SUCCESS)
1007                {
1008                    r = ConvertCsrSdioToCsrHipResult(card, csrResult);
1009                    unifi_error(card->ospriv, "CsrSdioFunctionEnable failed %d\n", r);
1010                    break;
1011                }
1012            }
1013
1014            r = unifi_read_direct16(card, ChipHelper_SDIO_HIP_HANDSHAKE(card->helper) * 2, &mbox2);
1015            if (r != CSR_RESULT_SUCCESS)
1016            {
1017                unifi_error(card->ospriv, "read HIP_HANDSHAKE failed %d\n", r);
1018                break;
1019            }
1020            if (mbox2 != 0)
1021            {
1022                unifi_error(card->ospriv, "MAILBOX2 non-zero after reset (mbox2 = %04x)\n", mbox2);
1023                r = CSR_RESULT_FAILURE;
1024            }
1025            break;
1026        }
1027        else
1028        {
1029            if (card->chip_id > SDIO_CARD_ID_UNIFI_2)
1030            {
1031                /* We ignore read failures for the first few reads,
1032                 * they are probably benign. */
1033                if (i > MAILBOX2_ATTEMPTS / 4)
1034                {
1035                    unifi_trace(card->ospriv, UDBG1, "Failed to read CCCR IO Ready register while polling for reset\n");
1036                }
1037            }
1038            else
1039            {
1040                unifi_trace(card->ospriv, UDBG1, "Failed to read CCCR IO Enable register while polling for reset\n");
1041            }
1042        }
1043        CsrThreadSleep(MAILBOX2_TIMEOUT);
1044    }
1045
1046    if (r == CSR_RESULT_SUCCESS && i == MAILBOX2_ATTEMPTS)
1047    {
1048        unifi_trace(card->ospriv, UDBG1, "Timeout waiting for UniFi to complete reset\n");
1049        r = CSR_RESULT_FAILURE;
1050    }
1051
1052    return r;
1053} /* card_wait_for_unifi_to_reset() */
1054
1055
1056/*
1057 * ---------------------------------------------------------------------------
1058 *  card_wait_for_unifi_to_disable
1059 *
1060 *      Waits for the function to become disabled by polling the
1061 *      IO_READY bit.
1062 *
1063 *  Arguments:
1064 *      card            Pointer to card struct
1065 *
1066 *  Returns:
1067 *      CSR_RESULT_SUCCESS on success, CSR error code on failure.
1068 *
1069 *  Notes: This function can only be used with
1070 *         card->chip_id > SDIO_CARD_ID_UNIFI_2
1071 * ---------------------------------------------------------------------------
1072 */
1073static CsrResult card_wait_for_unifi_to_disable(card_t *card)
1074{
1075    s16 i;
1076    CsrResult r;
1077    u8 io_enable;
1078    CsrResult csrResult;
1079
1080    if (card->chip_id <= SDIO_CARD_ID_UNIFI_2)
1081    {
1082        unifi_error(card->ospriv,
1083                    "Function reset method not supported for chip_id=%d\n",
1084                    card->chip_id);
1085        return CSR_RESULT_FAILURE;
1086    }
1087
1088    r = CSR_RESULT_SUCCESS;
1089    for (i = 0; i < MAILBOX2_ATTEMPTS; i++)
1090    {
1091        unifi_trace(card->ospriv, UDBG1, "waiting for disable to complete, attempt %d\n", i);
1092
1093        /*
1094         * It's quite likely that this read will timeout for the
1095         * first few tries - especially if we have reset via
1096         * DBG_RESET.
1097         */
1098#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
1099        unifi_debug_log_to_buf("r0@%02X=", SDIO_IO_READY);
1100#endif
1101        csrResult = CsrSdioF0Read8(card->sdio_if, SDIO_IO_READY, &io_enable);
1102#if defined (CSR_WIFI_HIP_DEBUG_OFFLINE) && defined (CSR_WIFI_HIP_SDIO_TRACE)
1103        if (csrResult != CSR_RESULT_SUCCESS)
1104        {
1105            unifi_debug_log_to_buf("error=%X\n", csrResult);
1106        }
1107        else
1108        {
1109            unifi_debug_log_to_buf("%X\n", io_enable);
1110        }
1111#endif
1112        if (csrResult == CSR_SDIO_RESULT_NO_DEVICE)
1113        {
1114            return CSR_WIFI_HIP_RESULT_NO_DEVICE;
1115        }
1116        if (csrResult == CSR_RESULT_SUCCESS)
1117        {
1118            s16 enabled = io_enable & (1 << card->function);
1119            r = CSR_RESULT_SUCCESS;
1120            if (!enabled)
1121            {
1122                unifi_trace(card->ospriv, UDBG1,
1123                            "Disable complete (function %d is disabled) in ~ %u msecs\n",
1124                            card->function, i * MAILBOX2_TIMEOUT);
1125
1126                break;
1127            }
1128        }
1129        else
1130        {
1131            /*
1132             * We ignore read failures for the first few reads,
1133             * they are probably benign.
1134             */
1135            r = ConvertCsrSdioToCsrHipResult(card, csrResult);
1136            if (i > (MAILBOX2_ATTEMPTS / 4))
1137            {
1138                unifi_trace(card->ospriv, UDBG1,
1139                            "Failed to read CCCR IO Ready register while polling for disable\n");
1140            }
1141        }
1142        CsrThreadSleep(MAILBOX2_TIMEOUT);
1143    }
1144
1145    if ((r == CSR_RESULT_SUCCESS) && (i == MAILBOX2_ATTEMPTS))
1146    {
1147        unifi_trace(card->ospriv, UDBG1, "Timeout waiting for UniFi to complete disable\n");
1148        r = CSR_RESULT_FAILURE;
1149    }
1150
1151    return r;
1152} /* card_wait_for_unifi_to_reset() */
1153
1154
1155/*
1156 * ---------------------------------------------------------------------------
1157 *  card_wait_for_firmware_to_start
1158 *
1159 *      Polls the MAILBOX1 register for a non-zero value.
1160 *      Then reads MAILBOX0 and forms the two values into a 32-bit address
1161 *      which is returned to the caller.
1162 *
1163 *  Arguments:
1164 *      card            Pointer to card struct
1165 *      paddr           Pointer to receive the UniFi address formed
1166 *                      by concatenating MAILBOX1 and MAILBOX0.
1167 *
1168 *  Returns:
1169 *      CSR_RESULT_SUCCESS on success, CSR error code on failure.
1170 * ---------------------------------------------------------------------------
1171 */
1172CsrResult card_wait_for_firmware_to_start(card_t *card, u32 *paddr)
1173{
1174    s32 i;
1175    u16 mbox0, mbox1;
1176    CsrResult r;
1177
1178    /*
1179     * Wait for UniFi to initialise its data structures by polling
1180     * the SHARED_MAILBOX1 register.
1181     * Experience shows this is typically 120ms.
1182     */
1183    CsrThreadSleep(MAILBOX1_TIMEOUT);
1184
1185    mbox1 = 0;
1186    unifi_trace(card->ospriv, UDBG1, "waiting for MAILBOX1 to be non-zero...\n");
1187    for (i = 0; i < MAILBOX1_ATTEMPTS; i++)
1188    {
1189        r = unifi_read_direct16(card, ChipHelper_MAILBOX1(card->helper) * 2, &mbox1);
1190        if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
1191        {
1192            return r;
1193        }
1194        if (r != CSR_RESULT_SUCCESS)
1195        {
1196            /* These reads can fail if UniFi isn't up yet, so try again */
1197            unifi_warning(card->ospriv, "Failed to read UniFi Mailbox1 register\n");
1198        }
1199
1200        if ((r == CSR_RESULT_SUCCESS) && (mbox1 != 0))
1201        {
1202            unifi_trace(card->ospriv, UDBG1, "MAILBOX1 ready (0x%04X) in %u millisecs\n",
1203                        mbox1, i * MAILBOX1_TIMEOUT);
1204
1205            /* Read the MAILBOX1 again in case we caught the value as it
1206             * changed. */
1207            r = unifi_read_direct16(card, ChipHelper_MAILBOX1(card->helper) * 2, &mbox1);
1208            if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
1209            {
1210                return r;
1211            }
1212            if (r != CSR_RESULT_SUCCESS)
1213            {
1214                unifi_error(card->ospriv, "Failed to read UniFi Mailbox1 register for second time\n");
1215                return r;
1216            }
1217            unifi_trace(card->ospriv, UDBG1, "MAILBOX1 value=0x%04X\n", mbox1);
1218
1219            break;
1220        }
1221
1222        CsrThreadSleep(MAILBOX1_TIMEOUT);
1223        if ((i % 100) == 99)
1224        {
1225            unifi_trace(card->ospriv, UDBG2, "MAILBOX1 not ready (0x%X), still trying...\n", mbox1);
1226        }
1227    }
1228
1229    if ((r == CSR_RESULT_SUCCESS) && (mbox1 == 0))
1230    {
1231        unifi_trace(card->ospriv, UDBG1, "Timeout waiting for firmware to start, Mailbox1 still 0 after %d ms\n",
1232                    MAILBOX1_ATTEMPTS * MAILBOX1_TIMEOUT);
1233        return CSR_RESULT_FAILURE;
1234    }
1235
1236
1237    /*
1238     * Complete the reset handshake by setting MAILBOX2 to 0xFFFF
1239     */
1240    r = unifi_write_direct16(card, ChipHelper_SDIO_HIP_HANDSHAKE(card->helper) * 2, 0xFFFF);
1241    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
1242    {
1243        return r;
1244    }
1245    if (r != CSR_RESULT_SUCCESS)
1246    {
1247        unifi_error(card->ospriv, "Failed to write f/w startup handshake to MAILBOX2\n");
1248        return r;
1249    }
1250
1251
1252    /*
1253     * Read the Symbol Look Up Table (SLUT) offset.
1254     * Top 16 bits are in mbox1, read the lower 16 bits from mbox0.
1255     */
1256    mbox0 = 0;
1257    r = unifi_read_direct16(card, ChipHelper_MAILBOX0(card->helper) * 2, &mbox0);
1258    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
1259    {
1260        return r;
1261    }
1262    if (r != CSR_RESULT_SUCCESS)
1263    {
1264        unifi_error(card->ospriv, "Failed to read UniFi Mailbox0 register\n");
1265        return r;
1266    }
1267
1268    *paddr = (((u32)mbox1 << 16) | mbox0);
1269
1270    return CSR_RESULT_SUCCESS;
1271} /* card_wait_for_firmware_to_start() */
1272
1273
1274/*
1275 * ---------------------------------------------------------------------------
1276 *  unifi_capture_panic
1277 *
1278 *      Attempt to capture panic codes from the firmware. This may involve
1279 *      warm reset of the chip to regain access following a watchdog reset.
1280 *
1281 *  Arguments:
1282 *      card            Pointer to card struct
1283 *
1284 *  Returns:
1285 *      CSR_RESULT_SUCCESS if panic codes were captured, or none available
1286 *      CSR_RESULT_FAILURE if the driver could not access function 1
1287 * ---------------------------------------------------------------------------
1288 */
1289CsrResult unifi_capture_panic(card_t *card)
1290{
1291
1292    /* The firmware must have previously initialised to read the panic addresses
1293     * from the SLUT
1294     */
1295    if (!card->panic_data_phy_addr || !card->panic_data_mac_addr)
1296    {
1297        return CSR_RESULT_SUCCESS;
1298    }
1299
1300    /* Ensure we can access function 1 following a panic/watchdog reset */
1301    if (card_access_panic(card) == CSR_RESULT_SUCCESS)
1302    {
1303        /* Read the panic codes */
1304        unifi_read_panic(card);
1305    }
1306    else
1307    {
1308        unifi_info(card->ospriv, "Unable to read panic codes");
1309    }
1310
1311    return CSR_RESULT_SUCCESS;
1312}
1313
1314
1315/*
1316 * ---------------------------------------------------------------------------
1317 *  card_access_panic
1318 *      Attempt to read the WLAN SDIO function in order to read panic codes
1319 *      and perform various reset steps to regain access if the read fails.
1320 *
1321 *  Arguments:
1322 *      card            Pointer to card struct
1323 *
1324 *  Returns:
1325 *      CSR_RESULT_SUCCESS if panic codes can be read
1326 *      CSR error code if panic codes can not be read
1327 * ---------------------------------------------------------------------------
1328 */
1329static CsrResult card_access_panic(card_t *card)
1330{
1331    u16 data_u16 = 0;
1332    s32 i;
1333    CsrResult r, sr;
1334
1335    /* A chip version of zero means that the version never got successfully read
1336     * during reset. In this case give up because it will not be possible to
1337     * verify the chip version.
1338     */
1339    if (!card->chip_version)
1340    {
1341        unifi_info(card->ospriv, "Unknown chip version\n");
1342        return CSR_RESULT_FAILURE;
1343    }
1344
1345    /* Ensure chip is awake or access to function 1 will fail */
1346    r = unifi_set_host_state(card, UNIFI_HOST_STATE_AWAKE);
1347    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
1348    {
1349        return r;
1350    }
1351    if (r != CSR_RESULT_SUCCESS)
1352    {
1353        unifi_error(card->ospriv, "unifi_set_host_state() failed %d\n", r);
1354        return CSR_RESULT_FAILURE; /* Card is probably unpowered */
1355    }
1356    CsrThreadSleep(20);
1357
1358    for (i = 0; i < 3; i++)
1359    {
1360        sr = CsrSdioRead16(card->sdio_if, CHIP_HELPER_UNIFI_GBL_CHIP_VERSION * 2, &data_u16);
1361        if (sr != CSR_RESULT_SUCCESS || data_u16 != card->chip_version)
1362        {
1363            unifi_info(card->ospriv, "Failed to read valid chip version sr=%d (0x%04x want 0x%04x) try %d\n",
1364                       sr, data_u16, card->chip_version, i);
1365
1366            /* Set clock speed low */
1367            sr = CsrSdioMaxBusClockFrequencySet(card->sdio_if, UNIFI_SDIO_CLOCK_SAFE_HZ);
1368            if (sr != CSR_RESULT_SUCCESS)
1369            {
1370                unifi_error(card->ospriv, "CsrSdioMaxBusClockFrequencySet() failed1 %d\n", sr);
1371                r = ConvertCsrSdioToCsrHipResult(card, sr);
1372            }
1373            card->sdio_clock_speed = UNIFI_SDIO_CLOCK_SAFE_HZ;
1374
1375            /* First try re-enabling function in case a f/w watchdog reset disabled it */
1376            if (i == 0)
1377            {
1378                unifi_info(card->ospriv, "Try function enable\n");
1379                sr = CsrSdioFunctionEnable(card->sdio_if);
1380                if (sr != CSR_RESULT_SUCCESS)
1381                {
1382                    r = ConvertCsrSdioToCsrHipResult(card, sr);
1383                    unifi_error(card->ospriv, "CsrSdioFunctionEnable failed %d (HIP %d)\n", sr, r);
1384                }
1385                continue;
1386            }
1387
1388            /* Second try, set awake */
1389            unifi_info(card->ospriv, "Try set awake\n");
1390
1391            /* Ensure chip is awake */
1392            r = unifi_set_host_state(card, UNIFI_HOST_STATE_AWAKE);
1393            if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
1394            {
1395                return r;
1396            }
1397            if (r != CSR_RESULT_SUCCESS)
1398            {
1399                unifi_error(card->ospriv, "unifi_set_host_state() failed2 %d\n", r);
1400            }
1401
1402            /* Set clock speed low in case setting the host state raised it, which
1403             * would only happen if host state was previously TORPID
1404             */
1405            sr = CsrSdioMaxBusClockFrequencySet(card->sdio_if, UNIFI_SDIO_CLOCK_SAFE_HZ);
1406            if (sr != CSR_RESULT_SUCCESS)
1407            {
1408                unifi_error(card->ospriv, "CsrSdioMaxBusClockFrequencySet() failed2 %d\n", sr);
1409            }
1410            card->sdio_clock_speed = UNIFI_SDIO_CLOCK_SAFE_HZ;
1411
1412            if (i == 1)
1413            {
1414                continue;
1415            }
1416
1417            /* Perform a s/w reset to preserve as much as the card state as possible,
1418             * (mainly the preserve RAM). The context will be lost for coredump - but as we
1419             * were unable to access the WLAN function for panic, the coredump would have
1420             * also failed without a reset.
1421             */
1422            unifi_info(card->ospriv, "Try s/w reset\n");
1423
1424            r = unifi_card_hard_reset(card);
1425            if (r != CSR_RESULT_SUCCESS)
1426            {
1427                unifi_error(card->ospriv, "unifi_card_hard_reset() failed %d\n", r);
1428            }
1429        }
1430        else
1431        {
1432            if (i > 0)
1433            {
1434                unifi_info(card->ospriv, "Read chip version 0x%x after %d retries\n", data_u16, i);
1435            }
1436            break;
1437        }
1438    }
1439
1440    r = ConvertCsrSdioToCsrHipResult(card, sr);
1441    return r;
1442}
1443
1444
1445/*
1446 * ---------------------------------------------------------------------------
1447 *  unifi_read_panic
1448 *      Reads, saves and prints panic codes stored by the firmware in UniFi's
1449 *      preserve RAM by the last panic that occurred since chip was powered.
1450 *      Nothing is saved if the panic codes are read as zero.
1451 *
1452 *  Arguments:
1453 *      card            Pointer to card struct
1454 *
1455 *  Returns:
1456 * ---------------------------------------------------------------------------
1457 */
1458void unifi_read_panic(card_t *card)
1459{
1460    CsrResult r;
1461    u16 p_code, p_arg;
1462
1463    /* The firmware must have previously initialised to read the panic addresses
1464     * from the SLUT
1465     */
1466    if (!card->panic_data_phy_addr || !card->panic_data_mac_addr)
1467    {
1468        return;
1469    }
1470
1471    /* Get the panic data from PHY */
1472    r = unifi_card_read16(card, card->panic_data_phy_addr, &p_code);
1473    if (r != CSR_RESULT_SUCCESS)
1474    {
1475        unifi_error(card->ospriv, "capture_panic: unifi_read16 %08x failed %d\n", card->panic_data_phy_addr, r);
1476        p_code = 0;
1477    }
1478    if (p_code)
1479    {
1480        r = unifi_card_read16(card, card->panic_data_phy_addr + 2, &p_arg);
1481        if (r != CSR_RESULT_SUCCESS)
1482        {
1483            unifi_error(card->ospriv, "capture_panic: unifi_read16 %08x failed %d\n", card->panic_data_phy_addr + 2, r);
1484        }
1485        unifi_error(card->ospriv, "Last UniFi PHY PANIC %04x arg %04x\n", p_code, p_arg);
1486        card->last_phy_panic_code = p_code;
1487        card->last_phy_panic_arg = p_arg;
1488    }
1489
1490    /* Get the panic data from MAC */
1491    r = unifi_card_read16(card, card->panic_data_mac_addr, &p_code);
1492    if (r != CSR_RESULT_SUCCESS)
1493    {
1494        unifi_error(card->ospriv, "capture_panic: unifi_read16 %08x failed %d\n", card->panic_data_mac_addr, r);
1495        p_code = 0;
1496    }
1497    if (p_code)
1498    {
1499        r = unifi_card_read16(card, card->panic_data_mac_addr + 2, &p_arg);
1500        if (r != CSR_RESULT_SUCCESS)
1501        {
1502            unifi_error(card->ospriv, "capture_panic: unifi_read16 %08x failed %d\n", card->panic_data_mac_addr + 2, r);
1503        }
1504        unifi_error(card->ospriv, "Last UniFi MAC PANIC %04x arg %04x\n", p_code, p_arg);
1505        card->last_mac_panic_code = p_code;
1506        card->last_mac_panic_arg = p_arg;
1507    }
1508
1509}
1510
1511
1512/*
1513 * ---------------------------------------------------------------------------
1514 *  card_allocate_memory_resources
1515 *
1516 *      Allocates memory for the from-host, to-host bulk data slots,
1517 *      soft queue buffers and bulk data buffers.
1518 *
1519 *  Arguments:
1520 *      card            Pointer to card struct
1521 *
1522 *  Returns:
1523 *      CSR_RESULT_SUCCESS on success, CSR error code on failure.
1524 * ---------------------------------------------------------------------------
1525 */
1526static CsrResult card_allocate_memory_resources(card_t *card)
1527{
1528    s16 n, i, k, r;
1529    sdio_config_data_t *cfg_data;
1530
1531    /* Reset any state carried forward from a previous life */
1532    card->fh_command_queue.q_rd_ptr = 0;
1533    card->fh_command_queue.q_wr_ptr = 0;
1534    (void)scnprintf(card->fh_command_queue.name, UNIFI_QUEUE_NAME_MAX_LENGTH,
1535                      "fh_cmd_q");
1536    for (i = 0; i < UNIFI_NO_OF_TX_QS; i++)
1537    {
1538        card->fh_traffic_queue[i].q_rd_ptr = 0;
1539        card->fh_traffic_queue[i].q_wr_ptr = 0;
1540        (void)scnprintf(card->fh_traffic_queue[i].name,
1541                          UNIFI_QUEUE_NAME_MAX_LENGTH, "fh_data_q%d", i);
1542    }
1543#ifndef CSR_WIFI_HIP_TA_DISABLE
1544    unifi_ta_sampling_init(card);
1545#endif
1546    /* Convenience short-cut */
1547    cfg_data = &card->config_data;
1548
1549    /*
1550     * Allocate memory for the from-host and to-host signal buffers.
1551     */
1552    card->fh_buffer.buf = kmalloc(UNIFI_FH_BUF_SIZE, GFP_KERNEL);
1553    if (card->fh_buffer.buf == NULL)
1554    {
1555        unifi_error(card->ospriv, "Failed to allocate memory for F-H signals\n");
1556        return CSR_WIFI_HIP_RESULT_NO_MEMORY;
1557    }
1558    card->fh_buffer.bufsize = UNIFI_FH_BUF_SIZE;
1559    card->fh_buffer.ptr = card->fh_buffer.buf;
1560    card->fh_buffer.count = 0;
1561
1562    card->th_buffer.buf = kmalloc(UNIFI_FH_BUF_SIZE, GFP_KERNEL);
1563    if (card->th_buffer.buf == NULL)
1564    {
1565        unifi_error(card->ospriv, "Failed to allocate memory for T-H signals\n");
1566        return CSR_WIFI_HIP_RESULT_NO_MEMORY;
1567    }
1568    card->th_buffer.bufsize = UNIFI_FH_BUF_SIZE;
1569    card->th_buffer.ptr = card->th_buffer.buf;
1570    card->th_buffer.count = 0;
1571
1572
1573    /*
1574     * Allocate memory for the from-host and to-host bulk data slots.
1575     * This is done as separate kmallocs because lots of smaller
1576     * allocations are more likely to succeed than one huge one.
1577     */
1578
1579    /* Allocate memory for the array of pointers */
1580    n = cfg_data->num_fromhost_data_slots;
1581
1582    unifi_trace(card->ospriv, UDBG3, "Alloc from-host resources, %d slots.\n", n);
1583    card->from_host_data = kmalloc(n * sizeof(slot_desc_t), GFP_KERNEL);
1584    if (card->from_host_data == NULL)
1585    {
1586        unifi_error(card->ospriv, "Failed to allocate memory for F-H bulk data array\n");
1587        return CSR_WIFI_HIP_RESULT_NO_MEMORY;
1588    }
1589
1590    /* Initialise from-host bulk data slots */
1591    for (i = 0; i < n; i++)
1592    {
1593        UNIFI_INIT_BULK_DATA(&card->from_host_data[i].bd);
1594    }
1595
1596    /* Allocate memory for the array used for slot host tag mapping */
1597    card->fh_slot_host_tag_record = kmalloc(n * sizeof(u32), GFP_KERNEL);
1598
1599    if (card->fh_slot_host_tag_record == NULL)
1600    {
1601        unifi_error(card->ospriv, "Failed to allocate memory for F-H slot host tag mapping array\n");
1602        return CSR_WIFI_HIP_RESULT_NO_MEMORY;
1603    }
1604
1605    /* Initialise host tag entries for from-host bulk data slots */
1606    for (i = 0; i < n; i++)
1607    {
1608        card->fh_slot_host_tag_record[i] = CSR_WIFI_HIP_RESERVED_HOST_TAG;
1609    }
1610
1611
1612    /* Allocate memory for the array of pointers */
1613    n = cfg_data->num_tohost_data_slots;
1614
1615    unifi_trace(card->ospriv, UDBG3, "Alloc to-host resources, %d slots.\n", n);
1616    card->to_host_data = kmalloc(n * sizeof(bulk_data_desc_t), GFP_KERNEL);
1617    if (card->to_host_data == NULL)
1618    {
1619        unifi_error(card->ospriv, "Failed to allocate memory for T-H bulk data array\n");
1620        return CSR_WIFI_HIP_RESULT_NO_MEMORY;
1621    }
1622
1623    /* Initialise to-host bulk data slots */
1624    for (i = 0; i < n; i++)
1625    {
1626        UNIFI_INIT_BULK_DATA(&card->to_host_data[i]);
1627    }
1628
1629    /*
1630     * Initialise buffers for soft Q
1631     */
1632    for (i = 0; i < UNIFI_SOFT_COMMAND_Q_LENGTH; i++)
1633    {
1634        for (r = 0; r < UNIFI_MAX_DATA_REFERENCES; r++)
1635        {
1636            UNIFI_INIT_BULK_DATA(&card->fh_command_q_body[i].bulkdata[r]);
1637        }
1638    }
1639
1640    for (k = 0; k < UNIFI_NO_OF_TX_QS; k++)
1641    {
1642        for (i = 0; i < UNIFI_SOFT_TRAFFIC_Q_LENGTH; i++)
1643        {
1644            for (r = 0; r < UNIFI_MAX_DATA_REFERENCES; r++)
1645            {
1646                UNIFI_INIT_BULK_DATA(&card->fh_traffic_q_body[k][i].bulkdata[r]);
1647            }
1648        }
1649    }
1650
1651    card->memory_resources_allocated = 1;
1652
1653    return CSR_RESULT_SUCCESS;
1654} /* card_allocate_memory_resources() */
1655
1656
1657/*
1658 * ---------------------------------------------------------------------------
1659 *  unifi_free_bulk_data
1660 *
1661 *      Free the data associated to a bulk data structure.
1662 *
1663 *  Arguments:
1664 *      card            Pointer to card struct
1665 *      bulk_data_slot  Pointer to bulk data structure
1666 *
1667 *  Returns:
1668 *      None.
1669 *
1670 * ---------------------------------------------------------------------------
1671 */
1672static void unifi_free_bulk_data(card_t *card, bulk_data_desc_t *bulk_data_slot)
1673{
1674    if (bulk_data_slot->data_length != 0)
1675    {
1676        unifi_net_data_free(card->ospriv, bulk_data_slot);
1677    }
1678} /* unifi_free_bulk_data() */
1679
1680
1681/*
1682 * ---------------------------------------------------------------------------
1683 *  card_free_memory_resources
1684 *
1685 *      Frees memory allocated for the from-host, to-host bulk data slots,
1686 *      soft queue buffers and bulk data buffers.
1687 *
1688 *  Arguments:
1689 *      card            Pointer to card struct
1690 *
1691 *  Returns:
1692 *      None.
1693 * ---------------------------------------------------------------------------
1694 */
1695static void card_free_memory_resources(card_t *card)
1696{
1697
1698    unifi_trace(card->ospriv, UDBG1, "Freeing card memory resources.\n");
1699
1700    /* Clear our internal queues */
1701    unifi_cancel_pending_signals(card);
1702
1703
1704    kfree(card->to_host_data);
1705    card->to_host_data = NULL;
1706
1707    kfree(card->from_host_data);
1708    card->from_host_data = NULL;
1709
1710    /* free the memory for slot host tag mapping array */
1711    kfree(card->fh_slot_host_tag_record);
1712    card->fh_slot_host_tag_record = NULL;
1713
1714    kfree(card->fh_buffer.buf);
1715    card->fh_buffer.ptr = card->fh_buffer.buf = NULL;
1716    card->fh_buffer.bufsize = 0;
1717    card->fh_buffer.count = 0;
1718
1719    kfree(card->th_buffer.buf);
1720    card->th_buffer.ptr = card->th_buffer.buf = NULL;
1721    card->th_buffer.bufsize = 0;
1722    card->th_buffer.count = 0;
1723
1724
1725    card->memory_resources_allocated = 0;
1726
1727} /* card_free_memory_resources() */
1728
1729
1730static void card_init_soft_queues(card_t *card)
1731{
1732    s16 i;
1733
1734    unifi_trace(card->ospriv, UDBG1, "Initialising internal signal queues.\n");
1735    /* Reset any state carried forward from a previous life */
1736    card->fh_command_queue.q_rd_ptr = 0;
1737    card->fh_command_queue.q_wr_ptr = 0;
1738    (void)scnprintf(card->fh_command_queue.name, UNIFI_QUEUE_NAME_MAX_LENGTH,
1739                      "fh_cmd_q");
1740    for (i = 0; i < UNIFI_NO_OF_TX_QS; i++)
1741    {
1742        card->fh_traffic_queue[i].q_rd_ptr = 0;
1743        card->fh_traffic_queue[i].q_wr_ptr = 0;
1744        (void)scnprintf(card->fh_traffic_queue[i].name,
1745                          UNIFI_QUEUE_NAME_MAX_LENGTH, "fh_data_q%d", i);
1746    }
1747#ifndef CSR_WIFI_HIP_TA_DISABLE
1748    unifi_ta_sampling_init(card);
1749#endif
1750}
1751
1752
1753/*
1754 * ---------------------------------------------------------------------------
1755 *  unifi_cancel_pending_signals
1756 *
1757 *      Free the signals and associated bulk data, pending in the core.
1758 *
1759 *  Arguments:
1760 *      card        Pointer to card struct
1761 *
1762 *  Returns:
1763 *      None.
1764 * ---------------------------------------------------------------------------
1765 */
1766void unifi_cancel_pending_signals(card_t *card)
1767{
1768    s16 i, n, r;
1769
1770    unifi_trace(card->ospriv, UDBG1, "Canceling pending signals.\n");
1771
1772    if (card->to_host_data)
1773    {
1774        /*
1775         * Free any bulk data buffers allocated for the t-h slots
1776         * This will clear all buffers that did not make it to
1777         * unifi_receive_event() before cancel was request.
1778         */
1779        n = card->config_data.num_tohost_data_slots;
1780        unifi_trace(card->ospriv, UDBG3, "Freeing to-host resources, %d slots.\n", n);
1781        for (i = 0; i < n; i++)
1782        {
1783            unifi_free_bulk_data(card, &card->to_host_data[i]);
1784        }
1785    }
1786
1787    /*
1788     * If any of the from-host bulk data has reached the card->from_host_data
1789     * but not UniFi, we need to free the buffers here.
1790     */
1791    if (card->from_host_data)
1792    {
1793        /* Free any bulk data buffers allocated for the f-h slots */
1794        n = card->config_data.num_fromhost_data_slots;
1795        unifi_trace(card->ospriv, UDBG3, "Freeing from-host resources, %d slots.\n", n);
1796        for (i = 0; i < n; i++)
1797        {
1798            unifi_free_bulk_data(card, &card->from_host_data[i].bd);
1799        }
1800
1801        for (i = 0; i < UNIFI_NO_OF_TX_QS; i++)
1802        {
1803            card->dynamic_slot_data.from_host_used_slots[i] = 0;
1804            card->dynamic_slot_data.from_host_max_slots[i] = 0;
1805            card->dynamic_slot_data.from_host_reserved_slots[i] = 0;
1806        }
1807    }
1808
1809    /*
1810     * Free any bulk data buffers allocated in the soft queues.
1811     * This covers the case where a bulk data pointer has reached the soft queue
1812     * but not the card->from_host_data.
1813     */
1814    unifi_trace(card->ospriv, UDBG3, "Freeing cmd q resources.\n");
1815    for (i = 0; i < UNIFI_SOFT_COMMAND_Q_LENGTH; i++)
1816    {
1817        for (r = 0; r < UNIFI_MAX_DATA_REFERENCES; r++)
1818        {
1819            unifi_free_bulk_data(card, &card->fh_command_q_body[i].bulkdata[r]);
1820        }
1821    }
1822
1823    unifi_trace(card->ospriv, UDBG3, "Freeing traffic q resources.\n");
1824    for (n = 0; n < UNIFI_NO_OF_TX_QS; n++)
1825    {
1826        for (i = 0; i < UNIFI_SOFT_TRAFFIC_Q_LENGTH; i++)
1827        {
1828            for (r = 0; r < UNIFI_MAX_DATA_REFERENCES; r++)
1829            {
1830                unifi_free_bulk_data(card, &card->fh_traffic_q_body[n][i].bulkdata[r]);
1831            }
1832        }
1833    }
1834
1835    card_init_soft_queues(card);
1836
1837} /* unifi_cancel_pending_signals() */
1838
1839
1840/*
1841 * ---------------------------------------------------------------------------
1842 *  unifi_free_card
1843 *
1844 *      Free the memory allocated for the card structure and buffers.
1845 *
1846 *  Notes:
1847 *      The porting layer is responsible for freeing any mini-coredump buffers
1848 *      allocated when it called unifi_coredump_init(), by calling
1849 *      unifi_coredump_free() before calling this function.
1850 *
1851 *  Arguments:
1852 *      card        Pointer to card struct
1853 *
1854 *  Returns:
1855 *      None.
1856 * ---------------------------------------------------------------------------
1857 */
1858void unifi_free_card(card_t *card)
1859{
1860#ifdef CSR_PRE_ALLOC_NET_DATA
1861    prealloc_netdata_free(card);
1862#endif
1863    /* Free any memory allocated. */
1864    card_free_memory_resources(card);
1865
1866    /* Warn if caller didn't free coredump buffers */
1867    if (card->dump_buf)
1868    {
1869        unifi_error(card->ospriv, "Caller should call unifi_coredump_free()\n");
1870        unifi_coredump_free(card); /* free anyway to prevent memory leak */
1871    }
1872
1873    kfree(card);
1874
1875} /* unifi_free_card() */
1876
1877
1878/*
1879 * ---------------------------------------------------------------------------
1880 *  card_init_slots
1881 *
1882 *      Allocate memory for host-side slot data and signal queues.
1883 *
1884 * Arguments:
1885 *      card            Pointer to card object
1886 *
1887 * Returns:
1888 *      CSR error code.
1889 * ---------------------------------------------------------------------------
1890 */
1891static CsrResult card_init_slots(card_t *card)
1892{
1893    CsrResult r;
1894    u8 i;
1895
1896    /* Allocate the buffers we need, only once. */
1897    if (card->memory_resources_allocated == 1)
1898    {
1899        card_free_memory_resources(card);
1900    }
1901    else
1902    {
1903        /* Initialise our internal command and traffic queues */
1904        card_init_soft_queues(card);
1905    }
1906
1907    r = card_allocate_memory_resources(card);
1908    if (r != CSR_RESULT_SUCCESS)
1909    {
1910        unifi_error(card->ospriv, "Failed to allocate card memory resources.\n");
1911        card_free_memory_resources(card);
1912        return r;
1913    }
1914
1915    if (card->sdio_ctrl_addr == 0)
1916    {
1917        unifi_error(card->ospriv, "Failed to find config struct!\n");
1918        return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
1919    }
1920
1921    /*
1922     * Set initial counts.
1923     */
1924
1925    card->from_host_data_head = 0;
1926
1927    /* Get initial signal counts from UniFi, in case it has not been reset. */
1928    {
1929        u16 s;
1930
1931        /* Get the from-host-signals-written count */
1932        r = unifi_card_read16(card, card->sdio_ctrl_addr + 0, &s);
1933        if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
1934        {
1935            return r;
1936        }
1937        if (r != CSR_RESULT_SUCCESS)
1938        {
1939            unifi_error(card->ospriv, "Failed to read from-host sig written count\n");
1940            return r;
1941        }
1942        card->from_host_signals_w = (s16)s;
1943
1944        /* Get the to-host-signals-written count */
1945        r = unifi_card_read16(card, card->sdio_ctrl_addr + 6, &s);
1946        if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
1947        {
1948            return r;
1949        }
1950        if (r != CSR_RESULT_SUCCESS)
1951        {
1952            unifi_error(card->ospriv, "Failed to read to-host sig read count\n");
1953            return r;
1954        }
1955        card->to_host_signals_r = (s16)s;
1956    }
1957
1958    /* Set Initialised flag. */
1959    r = unifi_card_write16(card, card->init_flag_addr, 0x0001);
1960    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
1961    {
1962        return r;
1963    }
1964    if (r != CSR_RESULT_SUCCESS)
1965    {
1966        unifi_error(card->ospriv, "Failed to write initialised flag\n");
1967        return r;
1968    }
1969
1970    /* Dynamic queue reservation */
1971    memset(&card->dynamic_slot_data, 0, sizeof(card_dynamic_slot_t));
1972
1973    for (i = 0; i < UNIFI_NO_OF_TX_QS; i++)
1974    {
1975        card->dynamic_slot_data.from_host_max_slots[i] = card->config_data.num_fromhost_data_slots -
1976                                                         UNIFI_RESERVED_COMMAND_SLOTS;
1977        card->dynamic_slot_data.queue_stable[i] = FALSE;
1978    }
1979
1980    card->dynamic_slot_data.packets_interval = UNIFI_PACKETS_INTERVAL;
1981
1982    return CSR_RESULT_SUCCESS;
1983} /* card_init_slots() */
1984
1985
1986/*
1987 * ---------------------------------------------------------------------------
1988 *  unifi_set_udi_hook
1989 *
1990 *      Registers the udi hook that reports the sent signals to the core.
1991 *
1992 *  Arguments:
1993 *      card            Pointer to the card context struct
1994 *      udi_fn          Pointer to the callback function.
1995 *
1996 *  Returns:
1997 *      CSR_WIFI_HIP_RESULT_INVALID_VALUE if the card pointer is invalid,
1998 *      CSR_RESULT_SUCCESS on success.
1999 * ---------------------------------------------------------------------------
2000 */
2001CsrResult unifi_set_udi_hook(card_t *card, udi_func_t udi_fn)
2002{
2003    if (card == NULL)
2004    {
2005        return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
2006    }
2007
2008    if (card->udi_hook == NULL)
2009    {
2010        card->udi_hook = udi_fn;
2011    }
2012
2013    return CSR_RESULT_SUCCESS;
2014} /* unifi_set_udi_hook() */
2015
2016
2017/*
2018 * ---------------------------------------------------------------------------
2019 *  unifi_remove_udi_hook
2020 *
2021 *      Removes the udi hook that reports the sent signals from the core.
2022 *
2023 *  Arguments:
2024 *      card            Pointer to the card context struct
2025 *      udi_fn          Pointer to the callback function.
2026 *
2027 *  Returns:
2028 *      CSR_WIFI_HIP_RESULT_INVALID_VALUE if the card pointer is invalid,
2029 *      CSR_RESULT_SUCCESS on success.
2030 * ---------------------------------------------------------------------------
2031 */
2032CsrResult unifi_remove_udi_hook(card_t *card, udi_func_t udi_fn)
2033{
2034    if (card == NULL)
2035    {
2036        return CSR_WIFI_HIP_RESULT_INVALID_VALUE;
2037    }
2038
2039    if (card->udi_hook == udi_fn)
2040    {
2041        card->udi_hook = NULL;
2042    }
2043
2044    return CSR_RESULT_SUCCESS;
2045} /* unifi_remove_udi_hook() */
2046
2047
2048static void CardReassignDynamicReservation(card_t *card)
2049{
2050    u8 i;
2051
2052    unifi_trace(card->ospriv, UDBG5, "Packets Txed %d %d %d %d\n",
2053                card->dynamic_slot_data.packets_txed[0],
2054                card->dynamic_slot_data.packets_txed[1],
2055                card->dynamic_slot_data.packets_txed[2],
2056                card->dynamic_slot_data.packets_txed[3]);
2057
2058    /* Clear reservation and recalculate max slots */
2059    for (i = 0; i < UNIFI_NO_OF_TX_QS; i++)
2060    {
2061        card->dynamic_slot_data.queue_stable[i] = FALSE;
2062        card->dynamic_slot_data.from_host_reserved_slots[i] = 0;
2063        card->dynamic_slot_data.from_host_max_slots[i] = card->config_data.num_fromhost_data_slots -
2064                                                         UNIFI_RESERVED_COMMAND_SLOTS;
2065        card->dynamic_slot_data.packets_txed[i] = 0;
2066
2067        unifi_trace(card->ospriv, UDBG5, "CardReassignDynamicReservation: queue %d reserved %d Max %d\n", i,
2068                    card->dynamic_slot_data.from_host_reserved_slots[i],
2069                    card->dynamic_slot_data.from_host_max_slots[i]);
2070    }
2071
2072    card->dynamic_slot_data.total_packets_txed = 0;
2073}
2074
2075
2076/* Algorithm to dynamically reserve slots. The logic is based mainly on the outstanding queue
2077 * length. Slots are reserved for particular queues during an interval and cleared after the interval.
2078 * Each queue has three associated variables.. a) used slots - the number of slots currently occupied
2079 * by the queue b) reserved slots - number of slots reserved specifically for the queue c) max slots - total
2080 * slots that this queue can actually use (may be higher than reserved slots and is dependent on reserved slots
2081 * for other queues).
2082 * This function is called when there are no slots available for a queue. It checks to see if there are enough
2083 * unreserved slots sufficient for this request. If available these slots are reserved for the queue.
2084 * If there are not enough unreserved slots, a fair share for each queue is calculated based on the total slots
2085 * and the number of active queues (any queue with existing reservation is considered active). Queues needing
2086 * less than their fair share are allowed to have the previously reserved slots. The remaining slots are
2087 * distributed evenly among queues that need more than the fair share
2088 *
2089 * A better scheme would take current bandwidth per AC into consideration when reserving slots. An
2090 * implementation scheme could consider the relative time/service period for slots in an AC. If the firmware
2091 * services other ACs faster than a particular AC (packets wait in the slots longer) then it is fair to reserve
2092 * less slots for the AC
2093 */
2094static void CardCheckDynamicReservation(card_t *card, unifi_TrafficQueue queue)
2095{
2096    u16 q_len, active_queues = 0, excess_queue_slots, div_extra_slots,
2097              queue_fair_share, reserved_slots = 0, q, excess_need_queues = 0, unmovable_slots = 0;
2098    s32 i;
2099    q_t *sigq;
2100    u16 num_data_slots = card->config_data.num_fromhost_data_slots - UNIFI_RESERVED_COMMAND_SLOTS;
2101
2102    /* Calculate the pending queue length */
2103    sigq = &card->fh_traffic_queue[queue];
2104    q_len = CSR_WIFI_HIP_Q_SLOTS_USED(sigq);
2105
2106    if (q_len <= card->dynamic_slot_data.from_host_reserved_slots[queue])
2107    {
2108        unifi_trace(card->ospriv, UDBG5, "queue %d q_len %d already has that many reserved slots, exiting\n", queue, q_len);
2109        return;
2110    }
2111
2112    /* Upper limit */
2113    if (q_len > num_data_slots)
2114    {
2115        q_len = num_data_slots;
2116    }
2117
2118    for (i = 0; i < UNIFI_NO_OF_TX_QS; i++)
2119    {
2120        if (i != (s32)queue)
2121        {
2122            reserved_slots += card->dynamic_slot_data.from_host_reserved_slots[i];
2123        }
2124        if ((i == (s32)queue) || (card->dynamic_slot_data.from_host_reserved_slots[i] > 0))
2125        {
2126            active_queues++;
2127        }
2128    }
2129
2130    unifi_trace(card->ospriv, UDBG5, "CardCheckDynamicReservation: queue %d q_len %d\n", queue, q_len);
2131    unifi_trace(card->ospriv, UDBG5, "Active queues %d reserved slots on other queues %d\n",
2132                active_queues, reserved_slots);
2133
2134    if (reserved_slots + q_len <= num_data_slots)
2135    {
2136        card->dynamic_slot_data.from_host_reserved_slots[queue] = q_len;
2137        if (q_len == num_data_slots)
2138        {
2139            /* This is the common case when just 1 stream is going */
2140            card->dynamic_slot_data.queue_stable[queue] = TRUE;
2141        }
2142    }
2143    else
2144    {
2145        queue_fair_share = num_data_slots / active_queues;
2146        unifi_trace(card->ospriv, UDBG5, "queue fair share %d\n", queue_fair_share);
2147
2148        /* Evenly distribute slots among active queues */
2149        /* Find out the queues that need excess of fair share. Also find slots allocated
2150         * to queues less than their fair share, these slots cannot be reallocated (unmovable slots) */
2151
2152        card->dynamic_slot_data.from_host_reserved_slots[queue] = q_len;
2153
2154        for (i = 0; i < UNIFI_NO_OF_TX_QS; i++)
2155        {
2156            if (card->dynamic_slot_data.from_host_reserved_slots[i] > queue_fair_share)
2157            {
2158                excess_need_queues++;
2159            }
2160            else
2161            {
2162                unmovable_slots += card->dynamic_slot_data.from_host_reserved_slots[i];
2163            }
2164        }
2165
2166        unifi_trace(card->ospriv, UDBG5, "Excess need queues %d\n", excess_need_queues);
2167
2168        /* Now find the slots per excess demand queue */
2169        excess_queue_slots = (num_data_slots - unmovable_slots) / excess_need_queues;
2170        div_extra_slots = (num_data_slots - unmovable_slots) - excess_queue_slots * excess_need_queues;
2171        for (i = UNIFI_NO_OF_TX_QS - 1; i >= 0; i--)
2172        {
2173            if (card->dynamic_slot_data.from_host_reserved_slots[i] > excess_queue_slots)
2174            {
2175                card->dynamic_slot_data.from_host_reserved_slots[i] = excess_queue_slots;
2176                if (div_extra_slots > 0)
2177                {
2178                    card->dynamic_slot_data.from_host_reserved_slots[i]++;
2179                    div_extra_slots--;
2180                }
2181                /* No more slots will be allocated to this queue during the current interval */
2182                card->dynamic_slot_data.queue_stable[i] = TRUE;
2183                unifi_trace(card->ospriv, UDBG5, "queue stable %d\n", i);
2184            }
2185        }
2186    }
2187
2188    /* Redistribute max slots */
2189    for (i = 0; i < UNIFI_NO_OF_TX_QS; i++)
2190    {
2191        reserved_slots = 0;
2192        for (q = 0; q < UNIFI_NO_OF_TX_QS; q++)
2193        {
2194            if (i != q)
2195            {
2196                reserved_slots += card->dynamic_slot_data.from_host_reserved_slots[q];
2197            }
2198        }
2199
2200        card->dynamic_slot_data.from_host_max_slots[i] = num_data_slots - reserved_slots;
2201        unifi_trace(card->ospriv, UDBG5, "queue %d reserved %d Max %d\n", i,
2202                    card->dynamic_slot_data.from_host_reserved_slots[i],
2203                    card->dynamic_slot_data.from_host_max_slots[i]);
2204    }
2205
2206}
2207
2208
2209/*
2210 * ---------------------------------------------------------------------------
2211 *  CardClearFromHostDataSlot
2212 *
2213 *      Clear a the given data slot, making it available again.
2214 *
2215 *  Arguments:
2216 *      card            Pointer to Card object
2217 *      slot            Index of the signal slot to clear.
2218 *
2219 *  Returns:
2220 *      None.
2221 * ---------------------------------------------------------------------------
2222 */
2223void CardClearFromHostDataSlot(card_t *card, const s16 slot)
2224{
2225    u8 queue = card->from_host_data[slot].queue;
2226    const void *os_data_ptr = card->from_host_data[slot].bd.os_data_ptr;
2227
2228    if (card->from_host_data[slot].bd.data_length == 0)
2229    {
2230        unifi_warning(card->ospriv,
2231                      "Surprise: request to clear an already free FH data slot: %d\n",
2232                      slot);
2233        return;
2234    }
2235
2236    if (os_data_ptr == NULL)
2237    {
2238        unifi_warning(card->ospriv,
2239                      "Clearing FH data slot %d: has null payload, len=%d\n",
2240                      slot, card->from_host_data[slot].bd.data_length);
2241    }
2242
2243    /* Free card->from_host_data[slot].bd.os_net_ptr here. */
2244    /* Mark slot as free by setting length to 0. */
2245    unifi_free_bulk_data(card, &card->from_host_data[slot].bd);
2246    if (queue < UNIFI_NO_OF_TX_QS)
2247    {
2248        if (card->dynamic_slot_data.from_host_used_slots[queue] == 0)
2249        {
2250            unifi_error(card->ospriv, "Goofed up used slots q = %d used slots = %d\n",
2251                        queue,
2252                        card->dynamic_slot_data.from_host_used_slots[queue]);
2253        }
2254        else
2255        {
2256            card->dynamic_slot_data.from_host_used_slots[queue]--;
2257        }
2258        card->dynamic_slot_data.packets_txed[queue]++;
2259        card->dynamic_slot_data.total_packets_txed++;
2260        if (card->dynamic_slot_data.total_packets_txed >= card->dynamic_slot_data.packets_interval)
2261        {
2262            CardReassignDynamicReservation(card);
2263        }
2264    }
2265
2266    unifi_trace(card->ospriv, UDBG4, "CardClearFromHostDataSlot: slot %d recycled %p\n", slot, os_data_ptr);
2267
2268} /* CardClearFromHostDataSlot() */
2269
2270
2271#ifdef CSR_WIFI_REQUEUE_PACKET_TO_HAL
2272/*
2273 * ---------------------------------------------------------------------------
2274 *  CardClearFromHostDataSlotWithoutFreeingBulkData
2275 *
2276 *      Clear the given data slot with out freeing the bulk data.
2277 *
2278 *  Arguments:
2279 *      card            Pointer to Card object
2280 *      slot            Index of the signal slot to clear.
2281 *
2282 *  Returns:
2283 *      None.
2284 * ---------------------------------------------------------------------------
2285 */
2286void CardClearFromHostDataSlotWithoutFreeingBulkData(card_t *card, const s16 slot)
2287{
2288    u8 queue = card->from_host_data[slot].queue;
2289
2290    /* Initialise the from_host data slot so it can be re-used,
2291     * Set length field in from_host_data array to 0.
2292     */
2293    UNIFI_INIT_BULK_DATA(&card->from_host_data[slot].bd);
2294
2295    queue = card->from_host_data[slot].queue;
2296
2297    if (queue < UNIFI_NO_OF_TX_QS)
2298    {
2299        if (card->dynamic_slot_data.from_host_used_slots[queue] == 0)
2300        {
2301            unifi_error(card->ospriv, "Goofed up used slots q = %d used slots = %d\n",
2302                        queue,
2303                        card->dynamic_slot_data.from_host_used_slots[queue]);
2304        }
2305        else
2306        {
2307            card->dynamic_slot_data.from_host_used_slots[queue]--;
2308        }
2309        card->dynamic_slot_data.packets_txed[queue]++;
2310        card->dynamic_slot_data.total_packets_txed++;
2311        if (card->dynamic_slot_data.total_packets_txed >=
2312            card->dynamic_slot_data.packets_interval)
2313        {
2314            CardReassignDynamicReservation(card);
2315        }
2316    }
2317} /* CardClearFromHostDataSlotWithoutFreeingBulkData() */
2318
2319
2320#endif
2321
2322u16 CardGetDataSlotSize(card_t *card)
2323{
2324    return card->config_data.data_slot_size;
2325} /* CardGetDataSlotSize() */
2326
2327
2328/*
2329 * ---------------------------------------------------------------------------
2330 *  CardGetFreeFromHostDataSlots
2331 *
2332 *      Retrieve the number of from-host bulk data slots available.
2333 *
2334 *  Arguments:
2335 *      card            Pointer to the card context struct
2336 *
2337 *  Returns:
2338 *      Number of free from-host bulk data slots.
2339 * ---------------------------------------------------------------------------
2340 */
2341u16 CardGetFreeFromHostDataSlots(card_t *card)
2342{
2343    u16 i, n = 0;
2344
2345    /* First two slots reserved for MLME */
2346    for (i = 0; i < card->config_data.num_fromhost_data_slots; i++)
2347    {
2348        if (card->from_host_data[i].bd.data_length == 0)
2349        {
2350            /* Free slot */
2351            n++;
2352        }
2353    }
2354
2355    return n;
2356} /* CardGetFreeFromHostDataSlots() */
2357
2358
2359/*
2360 * ---------------------------------------------------------------------------
2361 *  CardAreAllFromHostDataSlotsEmpty
2362 *
2363 *      Returns the state of from-host bulk data slots.
2364 *
2365 *  Arguments:
2366 *      card            Pointer to the card context struct
2367 *
2368 *  Returns:
2369 *      1       The from-host bulk data slots are all empty (available).
2370 *      0       Some or all the from-host bulk data slots are in use.
2371 * ---------------------------------------------------------------------------
2372 */
2373u16 CardAreAllFromHostDataSlotsEmpty(card_t *card)
2374{
2375    u16 i;
2376
2377    for (i = 0; i < card->config_data.num_fromhost_data_slots; i++)
2378    {
2379        if (card->from_host_data[i].bd.data_length != 0)
2380        {
2381            return 0;
2382        }
2383    }
2384
2385    return 1;
2386} /* CardGetFreeFromHostDataSlots() */
2387
2388
2389static CsrResult unifi_identify_hw(card_t *card)
2390{
2391
2392    card->chip_id = card->sdio_if->sdioId.cardId;
2393    card->function = card->sdio_if->sdioId.sdioFunction;
2394    card->sdio_io_block_size = card->sdio_if->blockSize;
2395
2396    /* If SDIO controller doesn't support byte mode CMD53, pad transfers to block sizes */
2397    card->sdio_io_block_pad = (card->sdio_if->features & CSR_SDIO_FEATURE_BYTE_MODE)?FALSE : TRUE;
2398
2399    /*
2400     * Setup the chip helper so that we can access the registers (and
2401     * also tell what sub-type of HIP we should use).
2402     */
2403    card->helper = ChipHelper_GetVersionSdio((u8)card->chip_id);
2404    if (!card->helper)
2405    {
2406        unifi_error(card->ospriv, "Null ChipHelper\n");
2407    }
2408
2409    unifi_info(card->ospriv, "Chip ID 0x%02X  Function %u  Block Size %u  Name %s(%s)\n",
2410               card->chip_id, card->function, card->sdio_io_block_size,
2411               ChipHelper_MarketingName(card->helper),
2412               ChipHelper_FriendlyName(card->helper));
2413
2414    return CSR_RESULT_SUCCESS;
2415} /* unifi_identify_hw() */
2416
2417
2418static CsrResult unifi_prepare_hw(card_t *card)
2419{
2420    CsrResult r;
2421    CsrResult csrResult;
2422    enum unifi_host_state old_state = card->host_state;
2423
2424    r = unifi_identify_hw(card);
2425    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
2426    {
2427        return r;
2428    }
2429    if (r != CSR_RESULT_SUCCESS)
2430    {
2431        unifi_error(card->ospriv, "Failed to identify hw\n");
2432        return r;
2433    }
2434
2435    unifi_trace(card->ospriv, UDBG1,
2436                "%s mode SDIO\n", card->sdio_io_block_pad?"Block" : "Byte");
2437    /*
2438     * Chip must be a awake or blocks that are asleep may not get
2439     * reset.  We can only do this after we have read the chip_id.
2440     */
2441    r = unifi_set_host_state(card, UNIFI_HOST_STATE_AWAKE);
2442    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
2443    {
2444        return r;
2445    }
2446
2447    if (old_state == UNIFI_HOST_STATE_TORPID)
2448    {
2449        /* Ensure the initial clock rate is set; if a reset occurred when the chip was
2450         * TORPID, unifi_set_host_state() may have raised it to MAX.
2451         */
2452        csrResult = CsrSdioMaxBusClockFrequencySet(card->sdio_if, UNIFI_SDIO_CLOCK_INIT_HZ);
2453        if (csrResult != CSR_RESULT_SUCCESS)
2454        {
2455            r = ConvertCsrSdioToCsrHipResult(card, csrResult);
2456            return r;
2457        }
2458        card->sdio_clock_speed = UNIFI_SDIO_CLOCK_INIT_HZ;
2459    }
2460
2461    /*
2462     * The WLAN function must be enabled to access MAILBOX2 and DEBUG_RST
2463     * registers.
2464     */
2465    csrResult = CsrSdioFunctionEnable(card->sdio_if);
2466    if (csrResult == CSR_SDIO_RESULT_NO_DEVICE)
2467    {
2468        return CSR_WIFI_HIP_RESULT_NO_DEVICE;
2469    }
2470    if (csrResult != CSR_RESULT_SUCCESS)
2471    {
2472        r = ConvertCsrSdioToCsrHipResult(card, csrResult);
2473        /* Can't enable WLAN function. Try resetting the SDIO block. */
2474        unifi_error(card->ospriv, "Failed to re-enable function %d.\n", card->function);
2475        return r;
2476    }
2477
2478    /*
2479     * Poke some registers to make sure the PLL has started,
2480     * otherwise memory accesses are likely to fail.
2481     */
2482    bootstrap_chip_hw(card);
2483
2484    /* Try to read the chip version from register. */
2485    r = unifi_read_chip_version(card);
2486    if (r != CSR_RESULT_SUCCESS)
2487    {
2488        return r;
2489    }
2490
2491    return CSR_RESULT_SUCCESS;
2492} /* unifi_prepare_hw() */
2493
2494
2495static CsrResult unifi_read_chip_version(card_t *card)
2496{
2497    u32 gbl_chip_version;
2498    CsrResult r;
2499    u16 ver;
2500
2501    gbl_chip_version = ChipHelper_GBL_CHIP_VERSION(card->helper);
2502
2503    /* Try to read the chip version from register. */
2504    if (gbl_chip_version != 0)
2505    {
2506        r = unifi_read_direct16(card, gbl_chip_version * 2, &ver);
2507        if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
2508        {
2509            return r;
2510        }
2511        if (r != CSR_RESULT_SUCCESS)
2512        {
2513            unifi_error(card->ospriv, "Failed to read GBL_CHIP_VERSION\n");
2514            return r;
2515        }
2516        card->chip_version = ver;
2517    }
2518    else
2519    {
2520        unifi_info(card->ospriv, "Unknown Chip ID, cannot locate GBL_CHIP_VERSION\n");
2521        r = CSR_RESULT_FAILURE;
2522    }
2523
2524    unifi_info(card->ospriv, "Chip Version 0x%04X\n", card->chip_version);
2525
2526    return r;
2527} /* unifi_read_chip_version() */
2528
2529
2530/*
2531 * ---------------------------------------------------------------------------
2532 *  unifi_reset_hardware
2533 *
2534 *      Execute the UniFi reset sequence.
2535 *
2536 *      Note: This may fail if the chip is going TORPID so retry at
2537 *      least once.
2538 *
2539 *  Arguments:
2540 *      card - pointer to card context structure
2541 *
2542 *  Returns:
2543 *      CSR_RESULT_SUCCESS on success, CSR error otherwise.
2544 *
2545 *  Notes:
2546 *      Some platforms (e.g. Windows Vista) do not allow access to registers
2547 *      that are necessary for a software soft reset.
2548 * ---------------------------------------------------------------------------
2549 */
2550static CsrResult unifi_reset_hardware(card_t *card)
2551{
2552    CsrResult r;
2553    u16 new_block_size = UNIFI_IO_BLOCK_SIZE;
2554    CsrResult csrResult;
2555
2556    /* Errors returned by unifi_prepare_hw() are not critical at this point */
2557    r = unifi_prepare_hw(card);
2558    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
2559    {
2560        return r;
2561    }
2562
2563    /* First try SDIO controller reset, which may power cycle the UniFi, assert
2564     * its reset line, or not be implemented depending on the platform.
2565     */
2566    unifi_info(card->ospriv, "Calling CsrSdioHardReset\n");
2567    csrResult = CsrSdioHardReset(card->sdio_if);
2568    if (csrResult == CSR_RESULT_SUCCESS)
2569    {
2570        unifi_info(card->ospriv, "CsrSdioHardReset succeeded on resetting UniFi\n");
2571        r = unifi_prepare_hw(card);
2572        if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
2573        {
2574            return r;
2575        }
2576        if (r != CSR_RESULT_SUCCESS)
2577        {
2578            unifi_error(card->ospriv, "unifi_prepare_hw failed after hard reset\n");
2579            return r;
2580        }
2581    }
2582    else if (csrResult == CSR_SDIO_RESULT_NO_DEVICE)
2583    {
2584        return CSR_WIFI_HIP_RESULT_NO_DEVICE;
2585    }
2586    else
2587    {
2588        /* Falling back to software hard reset methods */
2589        unifi_info(card->ospriv, "Falling back to software hard reset\n");
2590        r = unifi_card_hard_reset(card);
2591        if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
2592        {
2593            return r;
2594        }
2595        if (r != CSR_RESULT_SUCCESS)
2596        {
2597            unifi_error(card->ospriv, "software hard reset failed\n");
2598            return r;
2599        }
2600
2601        /* If we fell back to unifi_card_hard_reset() methods, chip version may
2602         * not have been read. (Note in the unlikely event that it is zero,
2603         * it will be harmlessly read again)
2604         */
2605        if (card->chip_version == 0)
2606        {
2607            r = unifi_read_chip_version(card);
2608            if (r != CSR_RESULT_SUCCESS)
2609            {
2610                return r;
2611            }
2612        }
2613    }
2614
2615#ifdef CSR_WIFI_HIP_SDIO_BLOCK_SIZE
2616    new_block_size = CSR_WIFI_HIP_SDIO_BLOCK_SIZE;
2617#endif
2618
2619    /* After hard reset, we need to restore the SDIO block size */
2620    csrResult = CsrSdioBlockSizeSet(card->sdio_if, new_block_size);
2621    r = ConvertCsrSdioToCsrHipResult(card, csrResult);
2622
2623    /* Warn if a different block size was achieved by the transport */
2624    if (card->sdio_if->blockSize != new_block_size)
2625    {
2626        unifi_info(card->ospriv,
2627                   "Actually got block size %d\n", card->sdio_if->blockSize);
2628    }
2629
2630    /* sdio_io_block_size always needs be updated from the achieved block size,
2631     * as it is used by the OS layer to allocate memory in unifi_net_malloc().
2632     * Controllers which don't support block mode (e.g. CSPI) will report a
2633     * block size of zero.
2634     */
2635    if (card->sdio_if->blockSize == 0)
2636    {
2637        unifi_info(card->ospriv, "Block size 0, block mode not available\n");
2638
2639        /* Set sdio_io_block_size to 1 so that unifi_net_data_malloc() has a
2640         * sensible rounding value. Elsewhere padding will already be
2641         * disabled because the controller supports byte mode.
2642         */
2643        card->sdio_io_block_size = 1;
2644
2645        /* Controller features must declare support for byte mode */
2646        if (!(card->sdio_if->features & CSR_SDIO_FEATURE_BYTE_MODE))
2647        {
2648            unifi_error(card->ospriv, "Requires byte mode\n");
2649            r = CSR_WIFI_HIP_RESULT_INVALID_VALUE;
2650        }
2651    }
2652    else
2653    {
2654        /* Padding will be enabled if CSR_SDIO_FEATURE_BYTE_MODE isn't set */
2655        card->sdio_io_block_size = card->sdio_if->blockSize;
2656    }
2657
2658
2659    return r;
2660} /* unifi_reset_hardware() */
2661
2662
2663/*
2664 * ---------------------------------------------------------------------------
2665 *  card_reset_method_io_enable
2666 *
2667 *      Issue a hard reset to the hw writing the IO_ENABLE.
2668 *
2669 *  Arguments:
2670 *      card            Pointer to Card object
2671 *
2672 *  Returns:
2673 *      0 on success,
2674 *      CSR_WIFI_HIP_RESULT_NO_DEVICE   if the card was ejected
2675 *      CSR_RESULT_FAILURE         if an SDIO error occurred or if a response
2676 *                                 was not seen in the expected time
2677 * ---------------------------------------------------------------------------
2678 */
2679static CsrResult card_reset_method_io_enable(card_t *card)
2680{
2681    CsrResult r;
2682    CsrResult csrResult;
2683
2684    /*
2685     * This resets only function 1, so should be used in
2686     * preference to the method below (CSR_FUNC_EN)
2687     */
2688    unifi_trace(card->ospriv, UDBG1, "Hard reset (IO_ENABLE)\n");
2689
2690    csrResult = CsrSdioFunctionDisable(card->sdio_if);
2691    if (csrResult == CSR_SDIO_RESULT_NO_DEVICE)
2692    {
2693        return CSR_WIFI_HIP_RESULT_NO_DEVICE;
2694    }
2695    if (csrResult != CSR_RESULT_SUCCESS)
2696    {
2697        r = ConvertCsrSdioToCsrHipResult(card, csrResult);
2698        unifi_warning(card->ospriv, "SDIO error writing IO_ENABLE: %d\n", r);
2699    }
2700    else
2701    {
2702        /* Delay here to let the reset take affect. */
2703        CsrThreadSleep(RESET_SETTLE_DELAY);
2704
2705        r = card_wait_for_unifi_to_disable(card);
2706        if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
2707        {
2708            return r;
2709        }
2710
2711        if (r == CSR_RESULT_SUCCESS)
2712        {
2713            r = card_wait_for_unifi_to_reset(card);
2714            if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
2715            {
2716                return r;
2717            }
2718        }
2719    }
2720
2721    if (r != CSR_RESULT_SUCCESS)
2722    {
2723        unifi_trace(card->ospriv, UDBG1, "Hard reset (CSR_FUNC_EN)\n");
2724
2725        r = sdio_write_f0(card, SDIO_CSR_FUNC_EN, 0);
2726        if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
2727        {
2728            return r;
2729        }
2730        if (r != CSR_RESULT_SUCCESS)
2731        {
2732            unifi_warning(card->ospriv, "SDIO error writing SDIO_CSR_FUNC_EN: %d\n", r);
2733            return r;
2734        }
2735        else
2736        {
2737            /* Delay here to let the reset take affect. */
2738            CsrThreadSleep(RESET_SETTLE_DELAY);
2739
2740            r = card_wait_for_unifi_to_reset(card);
2741            if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
2742            {
2743                return r;
2744            }
2745        }
2746    }
2747
2748    if (r != CSR_RESULT_SUCCESS)
2749    {
2750        unifi_warning(card->ospriv, "card_reset_method_io_enable failed to reset UniFi\n");
2751    }
2752
2753    return r;
2754} /* card_reset_method_io_enable() */
2755
2756
2757/*
2758 * ---------------------------------------------------------------------------
2759 *  card_reset_method_dbg_reset
2760 *
2761 *      Issue a hard reset to the hw writing the DBG_RESET.
2762 *
2763 *  Arguments:
2764 *      card            Pointer to Card object
2765 *
2766 *  Returns:
2767 *      CSR_RESULT_SUCCESS         on success,
2768 *      CSR_WIFI_HIP_RESULT_NO_DEVICE   if the card was ejected
2769 *      CSR_RESULT_FAILURE         if an SDIO error occurred or if a response
2770 *                                 was not seen in the expected time
2771 * ---------------------------------------------------------------------------
2772 */
2773static CsrResult card_reset_method_dbg_reset(card_t *card)
2774{
2775    CsrResult r;
2776
2777    /*
2778     * Prepare UniFi for h/w reset
2779     */
2780    if (card->host_state == UNIFI_HOST_STATE_TORPID)
2781    {
2782        r = unifi_set_host_state(card, UNIFI_HOST_STATE_DROWSY);
2783        if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
2784        {
2785            return r;
2786        }
2787        if (r != CSR_RESULT_SUCCESS)
2788        {
2789            unifi_error(card->ospriv, "Failed to set UNIFI_HOST_STATE_DROWSY\n");
2790            return r;
2791        }
2792        CsrThreadSleep(5);
2793    }
2794
2795    r = unifi_card_stop_processor(card, UNIFI_PROC_BOTH);
2796    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
2797    {
2798        return r;
2799    }
2800    if (r != CSR_RESULT_SUCCESS)
2801    {
2802        unifi_error(card->ospriv, "Can't stop processors\n");
2803        return r;
2804    }
2805
2806    unifi_trace(card->ospriv, UDBG1, "Hard reset (DBG_RESET)\n");
2807
2808    /*
2809     * This register write may fail. The debug reset resets
2810     * parts of the Function 0 sections of the chip, and
2811     * therefore the response cannot be sent back to the host.
2812     */
2813    r = unifi_write_direct_8_or_16(card, ChipHelper_DBG_RESET(card->helper) * 2, 1);
2814    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
2815    {
2816        return r;
2817    }
2818    if (r != CSR_RESULT_SUCCESS)
2819    {
2820        unifi_warning(card->ospriv, "SDIO error writing DBG_RESET: %d\n", r);
2821        return r;
2822    }
2823
2824    /* Delay here to let the reset take affect. */
2825    CsrThreadSleep(RESET_SETTLE_DELAY);
2826
2827    r = card_wait_for_unifi_to_reset(card);
2828    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
2829    {
2830        return r;
2831    }
2832    if (r != CSR_RESULT_SUCCESS)
2833    {
2834        unifi_warning(card->ospriv, "card_reset_method_dbg_reset failed to reset UniFi\n");
2835    }
2836
2837    return r;
2838} /* card_reset_method_dbg_reset() */
2839
2840
2841/*
2842 * ---------------------------------------------------------------------------
2843 *  unifi_card_hard_reset
2844 *
2845 *      Issue reset to hardware, by writing to registers on the card.
2846 *      Power to the card is preserved.
2847 *
2848 *  Arguments:
2849 *      card            Pointer to Card object
2850 *
2851 *  Returns:
2852 *      CSR_RESULT_SUCCESS         on success,
2853 *      CSR_WIFI_HIP_RESULT_NO_DEVICE   if the card was ejected
2854 *      CSR_RESULT_FAILURE         if an SDIO error occurred or if a response
2855 *                                 was not seen in the expected time
2856 * ---------------------------------------------------------------------------
2857 */
2858CsrResult unifi_card_hard_reset(card_t *card)
2859{
2860    CsrResult r;
2861    const struct chip_helper_reset_values *init_data;
2862    u32 chunks;
2863
2864    /* Clear cache of page registers */
2865    card->proc_select = (u32)(-1);
2866    card->dmem_page = (u32)(-1);
2867    card->pmem_page = (u32)(-1);
2868
2869    /*
2870     * We need to have a valid card->helper before we use software hard reset.
2871     * If unifi_identify_hw() fails to get the card ID, it probably means
2872     * that there is no way to talk to the h/w.
2873     */
2874    r = unifi_identify_hw(card);
2875    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
2876    {
2877        return r;
2878    }
2879    if (r != CSR_RESULT_SUCCESS)
2880    {
2881        unifi_error(card->ospriv, "unifi_card_hard_reset failed to identify h/w\n");
2882        return r;
2883    }
2884
2885    /* Search for some reset code. */
2886    chunks = ChipHelper_HostResetSequence(card->helper, &init_data);
2887    if (chunks != 0)
2888    {
2889        unifi_error(card->ospriv,
2890                    "Hard reset (Code download) is unsupported\n");
2891
2892        return CSR_RESULT_FAILURE;
2893    }
2894
2895    if (card->chip_id > SDIO_CARD_ID_UNIFI_2)
2896    {
2897        /* The HIP spec considers this a bus-specific reset.
2898         * This resets only function 1, so should be used in
2899         * preference to the method below (CSR_FUNC_EN)
2900         * If this method fails, it means that the f/w is probably
2901         * not running. In this case, try the DBG_RESET method.
2902         */
2903        r = card_reset_method_io_enable(card);
2904        if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
2905        {
2906            return r;
2907        }
2908        if (r == CSR_RESULT_SUCCESS)
2909        {
2910            return r;
2911        }
2912    }
2913
2914    /* Software hard reset */
2915    r = card_reset_method_dbg_reset(card);
2916
2917    return r;
2918} /* unifi_card_hard_reset() */
2919
2920
2921/*
2922 * ---------------------------------------------------------------------------
2923 *
2924 *  CardGenInt
2925 *
2926 *      Prod the card.
2927 *      This function causes an internal interrupt to be raised in the
2928 *      UniFi chip. It is used to signal the firmware that some action has
2929 *      been completed.
2930 *      The UniFi Host Interface asks that the value used increments for
2931 *      debugging purposes.
2932 *
2933 *  Arguments:
2934 *      card            Pointer to Card object
2935 *
2936 *  Returns:
2937 *      CSR_RESULT_SUCCESS         on success,
2938 *      CSR_WIFI_HIP_RESULT_NO_DEVICE   if the card was ejected
2939 *      CSR_RESULT_FAILURE         if an SDIO error occurred or if a response
2940 *                                 was not seen in the expected time
2941 * ---------------------------------------------------------------------------
2942 */
2943CsrResult CardGenInt(card_t *card)
2944{
2945    CsrResult r;
2946
2947    if (card->chip_id > SDIO_CARD_ID_UNIFI_2)
2948    {
2949        r = sdio_write_f0(card, SDIO_CSR_FROM_HOST_SCRATCH0,
2950                          (u8)card->unifi_interrupt_seq);
2951    }
2952    else
2953    {
2954        r = unifi_write_direct_8_or_16(card,
2955                                       ChipHelper_SHARED_IO_INTERRUPT(card->helper) * 2,
2956                                       (u8)card->unifi_interrupt_seq);
2957    }
2958    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
2959    {
2960        return r;
2961    }
2962    if (r != CSR_RESULT_SUCCESS)
2963    {
2964        unifi_error(card->ospriv, "SDIO error writing UNIFI_SHARED_IO_INTERRUPT: %d\n", r);
2965        return r;
2966    }
2967
2968    card->unifi_interrupt_seq++;
2969
2970    return CSR_RESULT_SUCCESS;
2971} /* CardGenInt() */
2972
2973
2974/*
2975 * ---------------------------------------------------------------------------
2976 *  CardEnableInt
2977 *
2978 *      Enable the outgoing SDIO interrupt from UniFi to the host.
2979 *
2980 *  Arguments:
2981 *      card            Pointer to Card object
2982 *
2983 *  Returns:
2984 *      CSR_RESULT_SUCCESS            on success,
2985 *      CSR_WIFI_HIP_RESULT_NO_DEVICE      if the card was ejected
2986 *      CSR_RESULT_FAILURE            if an SDIO error occurred,
2987 * ---------------------------------------------------------------------------
2988 */
2989CsrResult CardEnableInt(card_t *card)
2990{
2991    CsrResult r;
2992    u8 int_enable;
2993
2994    r = sdio_read_f0(card, SDIO_INT_ENABLE, &int_enable);
2995    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
2996    {
2997        return r;
2998    }
2999    if (r != CSR_RESULT_SUCCESS)
3000    {
3001        unifi_error(card->ospriv, "SDIO error reading SDIO_INT_ENABLE\n");
3002        return r;
3003    }
3004
3005    int_enable |= (1 << card->function) | UNIFI_SD_INT_ENABLE_IENM;
3006
3007    r = sdio_write_f0(card, SDIO_INT_ENABLE, int_enable);
3008    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
3009    {
3010        return r;
3011    }
3012    if (r != CSR_RESULT_SUCCESS)
3013    {
3014        unifi_error(card->ospriv, "SDIO error writing SDIO_INT_ENABLE\n");
3015        return r;
3016    }
3017
3018    return CSR_RESULT_SUCCESS;
3019} /* CardEnableInt() */
3020
3021
3022/*
3023 * ---------------------------------------------------------------------------
3024 *  CardDisableInt
3025 *
3026 *      Disable the outgoing SDIO interrupt from UniFi to the host.
3027 *
3028 *  Arguments:
3029 *      card            Pointer to Card object
3030 *
3031 *  Returns:
3032 *      CSR_RESULT_SUCCESS            on success,
3033 *      CSR_WIFI_HIP_RESULT_NO_DEVICE      if the card was ejected
3034 *      CSR_RESULT_FAILURE            if an SDIO error occurred,
3035 * ---------------------------------------------------------------------------
3036 */
3037CsrResult CardDisableInt(card_t *card)
3038{
3039    CsrResult r;
3040    u8 int_enable;
3041
3042    r = sdio_read_f0(card, SDIO_INT_ENABLE, &int_enable);
3043    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
3044    {
3045        return r;
3046    }
3047    if (r != CSR_RESULT_SUCCESS)
3048    {
3049        unifi_error(card->ospriv, "SDIO error reading SDIO_INT_ENABLE\n");
3050        return r;
3051    }
3052
3053    int_enable &= ~(1 << card->function);
3054
3055    r = sdio_write_f0(card, SDIO_INT_ENABLE, int_enable);
3056    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
3057    {
3058        return r;
3059    }
3060    if (r != CSR_RESULT_SUCCESS)
3061    {
3062        unifi_error(card->ospriv, "SDIO error writing SDIO_INT_ENABLE\n");
3063        return r;
3064    }
3065
3066    return CSR_RESULT_SUCCESS;
3067} /* CardDisableInt() */
3068
3069
3070/*
3071 * ---------------------------------------------------------------------------
3072 *  CardPendingInt
3073 *
3074 *      Determine whether UniFi is currently asserting the SDIO interrupt
3075 *      request.
3076 *
3077 *  Arguments:
3078 *      card            Pointer to Card object
3079 *      pintr           Pointer to location to write interrupt status,
3080 *                          TRUE if interrupt pending,
3081 *                          FALSE if no interrupt pending.
3082 *  Returns:
3083 *      CSR_RESULT_SUCCESS            interrupt status read successfully
3084 *      CSR_WIFI_HIP_RESULT_NO_DEVICE      if the card was ejected
3085 *      CSR_RESULT_FAILURE            if an SDIO error occurred,
3086 * ---------------------------------------------------------------------------
3087 */
3088CsrResult CardPendingInt(card_t *card, u8 *pintr)
3089{
3090    CsrResult r;
3091    u8 pending;
3092
3093    *pintr = FALSE;
3094
3095    r = sdio_read_f0(card, SDIO_INT_PENDING, &pending);
3096    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
3097    {
3098        return r;
3099    }
3100    if (r != CSR_RESULT_SUCCESS)
3101    {
3102        unifi_error(card->ospriv, "SDIO error reading SDIO_INT_PENDING\n");
3103        return r;
3104    }
3105
3106    *pintr = (pending & (1 << card->function))?TRUE : FALSE;
3107
3108    return CSR_RESULT_SUCCESS;
3109} /* CardPendingInt() */
3110
3111
3112/*
3113 * ---------------------------------------------------------------------------
3114 *  CardClearInt
3115 *
3116 *      Clear the UniFi SDIO interrupt request.
3117 *
3118 *  Arguments:
3119 *      card            Pointer to Card object
3120 *
3121 *  Returns:
3122 *      CSR_RESULT_SUCCESS          if pending interrupt was cleared, or no pending interrupt.
3123 *      CSR_WIFI_HIP_RESULT_NO_DEVICE    if the card was ejected
3124 *      CSR_RESULT_FAILURE          if an SDIO error occurred,
3125 * ---------------------------------------------------------------------------
3126 */
3127CsrResult CardClearInt(card_t *card)
3128{
3129    CsrResult r;
3130    u8 intr;
3131
3132    if (card->chip_id > SDIO_CARD_ID_UNIFI_2)
3133    {
3134        /* CardPendingInt() sets intr, if there is a pending interrupt */
3135        r = CardPendingInt(card, &intr);
3136        if (intr == FALSE)
3137        {
3138            return r;
3139        }
3140
3141        r = sdio_write_f0(card, SDIO_CSR_HOST_INT_CLEAR, 1);
3142        if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
3143        {
3144            return r;
3145        }
3146        if (r != CSR_RESULT_SUCCESS)
3147        {
3148            unifi_error(card->ospriv, "SDIO error writing SDIO_CSR_HOST_INT_CLEAR\n");
3149        }
3150    }
3151    else
3152    {
3153        r = unifi_write_direct_8_or_16(card,
3154                                       ChipHelper_SDIO_HOST_INT(card->helper) * 2,
3155                                       0);
3156        if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
3157        {
3158            return r;
3159        }
3160        if (r != CSR_RESULT_SUCCESS)
3161        {
3162            unifi_error(card->ospriv, "SDIO error writing UNIFI_SDIO_HOST_INT\n");
3163        }
3164    }
3165
3166    return r;
3167} /* CardClearInt() */
3168
3169
3170/*
3171 * ---------------------------------------------------------------------------
3172 *  CardIntEnabled
3173 *
3174 *      Determine whether UniFi is currently asserting the SDIO interrupt
3175 *      request.
3176 *
3177 *  Arguments:
3178 *      card            Pointer to Card object
3179 *      enabled         Pointer to location to write interrupt enable status,
3180 *                          TRUE if interrupts enabled,
3181 *                          FALSE if interupts disabled.
3182 *
3183 *  Returns:
3184 *      CSR_WIFI_HIP_RESULT_NO_DEVICE      if the card was ejected
3185 *      CSR_RESULT_FAILURE            if an SDIO error occurred,
3186 * ---------------------------------------------------------------------------
3187 */
3188CsrResult CardIntEnabled(card_t *card, u8 *enabled)
3189{
3190    CsrResult r;
3191    u8 int_enable;
3192
3193    r = sdio_read_f0(card, SDIO_INT_ENABLE, &int_enable);
3194    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
3195    {
3196        return r;
3197    }
3198    if (r != CSR_RESULT_SUCCESS)
3199    {
3200        unifi_error(card->ospriv, "SDIO error reading SDIO_INT_ENABLE\n");
3201        return r;
3202    }
3203
3204    *enabled = (int_enable & (1 << card->function))?TRUE : FALSE;
3205
3206    return CSR_RESULT_SUCCESS;
3207} /* CardIntEnabled() */
3208
3209
3210/*
3211 * ---------------------------------------------------------------------------
3212 *  CardWriteBulkData
3213 *      Allocate slot in the pending bulkdata arrays and assign it to a signal's
3214 *      bulkdata reference. The slot is then ready for UniFi's bulkdata commands
3215 *      to transfer the data to/from the host.
3216 *
3217 *  Arguments:
3218 *      card            Pointer to Card object
3219 *      csptr           Pending signal pointer, including bulkdata ref
3220 *      queue           Traffic queue that this signal is using
3221 *
3222 *  Returns:
3223 *      CSR_RESULT_SUCCESS if a free slot was assigned
3224 *      CSR_RESULT_FAILURE if no slot was available
3225 * ---------------------------------------------------------------------------
3226 */
3227CsrResult CardWriteBulkData(card_t *card, card_signal_t *csptr, unifi_TrafficQueue queue)
3228{
3229    u16 i, slots[UNIFI_MAX_DATA_REFERENCES], j = 0;
3230    u8 *packed_sigptr, num_slots_required = 0;
3231    bulk_data_desc_t *bulkdata = csptr->bulkdata;
3232    s16 h, nslots;
3233
3234    /* Count the number of slots required */
3235    for (i = 0; i < UNIFI_MAX_DATA_REFERENCES; i++)
3236    {
3237        if (bulkdata[i].data_length != 0)
3238        {
3239            num_slots_required++;
3240        }
3241    }
3242
3243    /* Get the slot numbers */
3244    if (num_slots_required != 0)
3245    {
3246        /* Last 2 slots for MLME */
3247        if (queue == UNIFI_TRAFFIC_Q_MLME)
3248        {
3249            h = card->config_data.num_fromhost_data_slots - UNIFI_RESERVED_COMMAND_SLOTS;
3250            for (i = 0; i < card->config_data.num_fromhost_data_slots; i++)
3251            {
3252                if (card->from_host_data[h].bd.data_length == 0)
3253                {
3254                    /* Free data slot, claim it */
3255                    slots[j++] = h;
3256                    if (j == num_slots_required)
3257                    {
3258                        break;
3259                    }
3260                }
3261
3262                if (++h >= card->config_data.num_fromhost_data_slots)
3263                {
3264                    h = 0;
3265                }
3266            }
3267        }
3268        else
3269        {
3270            if (card->dynamic_slot_data.from_host_used_slots[queue]
3271                < card->dynamic_slot_data.from_host_max_slots[queue])
3272            {
3273                /* Data commands get a free slot only after a few checks */
3274                nslots = card->config_data.num_fromhost_data_slots - UNIFI_RESERVED_COMMAND_SLOTS;
3275
3276                h = card->from_host_data_head;
3277
3278                for (i = 0; i < nslots; i++)
3279                {
3280                    if (card->from_host_data[h].bd.data_length == 0)
3281                    {
3282                        /* Free data slot, claim it */
3283                        slots[j++] = h;
3284                        if (j == num_slots_required)
3285                        {
3286                            break;
3287                        }
3288                    }
3289
3290                    if (++h >= nslots)
3291                    {
3292                        h = 0;
3293                    }
3294                }
3295                card->from_host_data_head = h;
3296            }
3297        }
3298
3299        /* Required number of slots are not available, bail out */
3300        if (j != num_slots_required)
3301        {
3302            unifi_trace(card->ospriv, UDBG5, "CardWriteBulkData: didn't find free slot/s\n");
3303
3304            /* If we haven't already reached the stable state we can ask for reservation */
3305            if ((queue != UNIFI_TRAFFIC_Q_MLME) && (card->dynamic_slot_data.queue_stable[queue] == FALSE))
3306            {
3307                CardCheckDynamicReservation(card, queue);
3308            }
3309
3310            for (i = 0; i < card->config_data.num_fromhost_data_slots; i++)
3311            {
3312                unifi_trace(card->ospriv, UDBG5, "fh data slot %d: %d\n", i, card->from_host_data[i].bd.data_length);
3313            }
3314            return CSR_RESULT_FAILURE;
3315        }
3316    }
3317
3318    packed_sigptr = csptr->sigbuf;
3319
3320    /* Fill in the slots with data */
3321    j = 0;
3322    for (i = 0; i < UNIFI_MAX_DATA_REFERENCES; i++)
3323    {
3324        if (bulkdata[i].data_length == 0)
3325        {
3326            /* Zero-out the DATAREF in the signal */
3327            SET_PACKED_DATAREF_SLOT(packed_sigptr, i, 0);
3328            SET_PACKED_DATAREF_LEN(packed_sigptr, i, 0);
3329        }
3330        else
3331        {
3332            /*
3333             * Fill in the slot number in the SIGNAL structure but
3334             * preserve the offset already in there
3335             */
3336            SET_PACKED_DATAREF_SLOT(packed_sigptr, i, slots[j] | (((u16)packed_sigptr[SIZEOF_SIGNAL_HEADER + (i * SIZEOF_DATAREF) + 1]) << 8));
3337            SET_PACKED_DATAREF_LEN(packed_sigptr, i, bulkdata[i].data_length);
3338
3339            /* Do not copy the data, just store the information to them */
3340            card->from_host_data[slots[j]].bd.os_data_ptr = bulkdata[i].os_data_ptr;
3341            card->from_host_data[slots[j]].bd.os_net_buf_ptr = bulkdata[i].os_net_buf_ptr;
3342            card->from_host_data[slots[j]].bd.data_length = bulkdata[i].data_length;
3343            card->from_host_data[slots[j]].bd.net_buf_length = bulkdata[i].net_buf_length;
3344            card->from_host_data[slots[j]].queue = queue;
3345
3346            unifi_trace(card->ospriv, UDBG4, "CardWriteBulkData sig=0x%x, fh slot %d = %p\n",
3347                        GET_SIGNAL_ID(packed_sigptr), i, bulkdata[i].os_data_ptr);
3348
3349            /* Sanity-check that the bulk data desc being assigned to the slot
3350             * actually has a payload.
3351             */
3352            if (!bulkdata[i].os_data_ptr)
3353            {
3354                unifi_error(card->ospriv, "Assign null os_data_ptr (len=%d) fh slot %d, i=%d, q=%d, sig=0x%x",
3355                            bulkdata[i].data_length, slots[j], i, queue, GET_SIGNAL_ID(packed_sigptr));
3356            }
3357
3358            j++;
3359            if (queue < UNIFI_NO_OF_TX_QS)
3360            {
3361                card->dynamic_slot_data.from_host_used_slots[queue]++;
3362            }
3363        }
3364    }
3365
3366    return CSR_RESULT_SUCCESS;
3367} /*  CardWriteBulkData() */
3368
3369
3370/*
3371 * ---------------------------------------------------------------------------
3372 *  card_find_data_slot
3373 *
3374 *      Dereference references to bulk data slots into pointers to real data.
3375 *
3376 *  Arguments:
3377 *      card            Pointer to the card struct.
3378 *      slot            Slot number from a signal structure
3379 *
3380 *  Returns:
3381 *      Pointer to entry in bulk_data_slot array.
3382 * ---------------------------------------------------------------------------
3383 */
3384bulk_data_desc_t* card_find_data_slot(card_t *card, s16 slot)
3385{
3386    s16 sn;
3387    bulk_data_desc_t *bd;
3388
3389    sn = slot & 0x7FFF;
3390
3391    /* ?? check sanity of slot number ?? */
3392
3393    if (slot & SLOT_DIR_TO_HOST)
3394    {
3395        bd = &card->to_host_data[sn];
3396    }
3397    else
3398    {
3399        bd = &card->from_host_data[sn].bd;
3400    }
3401
3402    return bd;
3403} /* card_find_data_slot() */
3404
3405
3406/*
3407 * ---------------------------------------------------------------------------
3408 *  firmware_present_in_flash
3409 *
3410 *      Probe for external Flash that looks like it might contain firmware.
3411 *
3412 *      If Flash is not present, reads always return 0x0008.
3413 *      If Flash is present, but empty, reads return 0xFFFF.
3414 *      Anything else is considered to be firmware.
3415 *
3416 *  Arguments:
3417 *      card        Pointer to card struct
3418 *
3419 *  Returns:
3420 *      CSR_RESULT_SUCCESS                 firmware is present in ROM or flash
3421 *      CSR_WIFI_HIP_RESULT_NOT_FOUND      firmware is not present in ROM or flash
3422 *      CSR_WIFI_HIP_RESULT_NO_DEVICE      if the card was ejected
3423 *      CSR_RESULT_FAILURE                 if an SDIO error occurred
3424 * ---------------------------------------------------------------------------
3425 */
3426static CsrResult firmware_present_in_flash(card_t *card)
3427{
3428    CsrResult r;
3429    u16 m1, m5;
3430
3431    if (ChipHelper_HasRom(card->helper))
3432    {
3433        return CSR_RESULT_SUCCESS;
3434    }
3435    if (!ChipHelper_HasFlash(card->helper))
3436    {
3437        return CSR_WIFI_HIP_RESULT_NOT_FOUND;
3438    }
3439
3440    /*
3441     * Examine the Flash locations that are the power-on default reset
3442     * vectors of the XAP processors.
3443     * These are words 1 and 5 in Flash.
3444     */
3445    r = unifi_card_read16(card, UNIFI_MAKE_GP(EXT_FLASH, 2), &m1);
3446    if (r != CSR_RESULT_SUCCESS)
3447    {
3448        return r;
3449    }
3450
3451    r = unifi_card_read16(card, UNIFI_MAKE_GP(EXT_FLASH, 10), &m5);
3452    if (r != CSR_RESULT_SUCCESS)
3453    {
3454        return r;
3455    }
3456
3457    /* Check for uninitialised/missing flash */
3458    if ((m1 == 0x0008) || (m1 == 0xFFFF) ||
3459        (m1 == 0x0004) || (m5 == 0x0004) ||
3460        (m5 == 0x0008) || (m5 == 0xFFFF))
3461    {
3462        return CSR_WIFI_HIP_RESULT_NOT_FOUND;
3463    }
3464
3465    return CSR_RESULT_SUCCESS;
3466} /* firmware_present_in_flash() */
3467
3468
3469/*
3470 * ---------------------------------------------------------------------------
3471 *  bootstrap_chip_hw
3472 *
3473 *      Perform chip specific magic to "Get It Working" TM.  This will
3474 *      increase speed of PLLs in analogue and maybe enable some
3475 *      on-chip regulators.
3476 *
3477 *  Arguments:
3478 *      card            Pointer to card struct
3479 *
3480 *  Returns:
3481 *      None.
3482 * ---------------------------------------------------------------------------
3483 */
3484static void bootstrap_chip_hw(card_t *card)
3485{
3486    const struct chip_helper_init_values *vals;
3487    u32 i, len;
3488    void *sdio = card->sdio_if;
3489    CsrResult csrResult;
3490
3491    len = ChipHelper_ClockStartupSequence(card->helper, &vals);
3492    if (len != 0)
3493    {
3494        for (i = 0; i < len; i++)
3495        {
3496            csrResult = CsrSdioWrite16(sdio, vals[i].addr * 2, vals[i].value);
3497            if (csrResult != CSR_RESULT_SUCCESS)
3498            {
3499                unifi_warning(card->ospriv, "Failed to write bootstrap value %d\n", i);
3500                /* Might not be fatal */
3501            }
3502
3503            CsrThreadSleep(1);
3504        }
3505    }
3506} /* bootstrap_chip_hw() */
3507
3508
3509/*
3510 * ---------------------------------------------------------------------------
3511 *  unifi_card_stop_processor
3512 *
3513 *      Stop the UniFi XAP processors.
3514 *
3515 *  Arguments:
3516 *      card            Pointer to card struct
3517 *      which           One of UNIFI_PROC_MAC, UNIFI_PROC_PHY, UNIFI_PROC_BOTH
3518 *
3519 *  Returns:
3520 *      CSR_RESULT_SUCCESS if successful, or CSR error code
3521 * ---------------------------------------------------------------------------
3522 */
3523CsrResult unifi_card_stop_processor(card_t *card, enum unifi_dbg_processors_select which)
3524{
3525    CsrResult r = CSR_RESULT_SUCCESS;
3526    u8 status;
3527    s16 retry = 100;
3528
3529    while (retry--)
3530    {
3531        /* Select both XAPs */
3532        r = unifi_set_proc_select(card, which);
3533        if (r != CSR_RESULT_SUCCESS)
3534        {
3535            break;
3536        }
3537
3538        /* Stop processors */
3539        r = unifi_write_direct16(card, ChipHelper_DBG_EMU_CMD(card->helper) * 2, 2);
3540        if (r != CSR_RESULT_SUCCESS)
3541        {
3542            break;
3543        }
3544
3545        /* Read status */
3546        r = unifi_read_direct_8_or_16(card,
3547                                      ChipHelper_DBG_HOST_STOP_STATUS(card->helper) * 2,
3548                                      &status);
3549        if (r != CSR_RESULT_SUCCESS)
3550        {
3551            break;
3552        }
3553
3554        if ((status & 1) == 1)
3555        {
3556            /* Success! */
3557            return CSR_RESULT_SUCCESS;
3558        }
3559
3560        /* Processors didn't stop, try again */
3561    }
3562
3563    if (r != CSR_RESULT_SUCCESS)
3564    {
3565        /* An SDIO error occurred */
3566        unifi_error(card->ospriv, "Failed to stop processors: SDIO error\n");
3567    }
3568    else
3569    {
3570        /* If we reach here, we didn't the status in time. */
3571        unifi_error(card->ospriv, "Failed to stop processors: timeout waiting for stopped status\n");
3572        r = CSR_RESULT_FAILURE;
3573    }
3574
3575    return r;
3576} /* unifi_card_stop_processor() */
3577
3578
3579/*
3580 * ---------------------------------------------------------------------------
3581 *  card_start_processor
3582 *
3583 *      Start the UniFi XAP processors.
3584 *
3585 *  Arguments:
3586 *      card            Pointer to card struct
3587 *      which           One of UNIFI_PROC_MAC, UNIFI_PROC_PHY, UNIFI_PROC_BOTH
3588 *
3589 *  Returns:
3590 *      CSR_RESULT_SUCCESS or CSR error code
3591 * ---------------------------------------------------------------------------
3592 */
3593CsrResult card_start_processor(card_t *card, enum unifi_dbg_processors_select which)
3594{
3595    CsrResult r;
3596
3597    /* Select both XAPs */
3598    r = unifi_set_proc_select(card, which);
3599    if (r != CSR_RESULT_SUCCESS)
3600    {
3601        unifi_error(card->ospriv, "unifi_set_proc_select failed: %d.\n", r);
3602        return r;
3603    }
3604
3605
3606    r = unifi_write_direct_8_or_16(card,
3607                                   ChipHelper_DBG_EMU_CMD(card->helper) * 2, 8);
3608    if (r != CSR_RESULT_SUCCESS)
3609    {
3610        return r;
3611    }
3612
3613    r = unifi_write_direct_8_or_16(card,
3614                                   ChipHelper_DBG_EMU_CMD(card->helper) * 2, 0);
3615    if (r != CSR_RESULT_SUCCESS)
3616    {
3617        return r;
3618    }
3619
3620    return CSR_RESULT_SUCCESS;
3621} /* card_start_processor() */
3622
3623
3624/*
3625 * ---------------------------------------------------------------------------
3626 *  unifi_set_interrupt_mode
3627 *
3628 *      Configure the interrupt processing mode used by the HIP
3629 *
3630 *  Arguments:
3631 *      card            Pointer to card struct
3632 *      mode            Interrupt mode to apply
3633 *
3634 *  Returns:
3635 *      None
3636 * ---------------------------------------------------------------------------
3637 */
3638void unifi_set_interrupt_mode(card_t *card, u32 mode)
3639{
3640    if (mode == CSR_WIFI_INTMODE_RUN_BH_ONCE)
3641    {
3642        unifi_info(card->ospriv, "Scheduled interrupt mode");
3643    }
3644    card->intmode = mode;
3645} /* unifi_set_interrupt_mode() */
3646
3647
3648/*
3649 * ---------------------------------------------------------------------------
3650 *  unifi_start_processors
3651 *
3652 *      Start all UniFi XAP processors.
3653 *
3654 *  Arguments:
3655 *      card            Pointer to card struct
3656 *
3657 *  Returns:
3658 *      CSR_RESULT_SUCCESS on success, CSR error code on error
3659 * ---------------------------------------------------------------------------
3660 */
3661CsrResult unifi_start_processors(card_t *card)
3662{
3663    return card_start_processor(card, UNIFI_PROC_BOTH);
3664} /* unifi_start_processors() */
3665
3666
3667/*
3668 * ---------------------------------------------------------------------------
3669 *  unifi_request_max_sdio_clock
3670 *
3671 *      Requests that the maximum SDIO clock rate is set at the next suitable
3672 *      opportunity (e.g. when the BH next runs, so as not to interfere with
3673 *      any current operation).
3674 *
3675 *  Arguments:
3676 *      card            Pointer to card struct
3677 *
3678 *  Returns:
3679 *      None
3680 * ---------------------------------------------------------------------------
3681 */
3682void unifi_request_max_sdio_clock(card_t *card)
3683{
3684    card->request_max_clock = 1;
3685} /* unifi_request_max_sdio_clock() */
3686
3687
3688/*
3689 * ---------------------------------------------------------------------------
3690 *  unifi_set_host_state
3691 *
3692 *      Set the host deep-sleep state.
3693 *
3694 *      If transitioning to TORPID, the SDIO driver will be notified
3695 *      that the SD bus will be unused (idle) and conversely, when
3696 *      transitioning from TORPID that the bus will be used (active).
3697 *
3698 *  Arguments:
3699 *      card            Pointer to card struct
3700 *      state           New deep-sleep state.
3701 *
3702 *  Returns:
3703 *      CSR_RESULT_SUCCESS            on success
3704 *      CSR_WIFI_HIP_RESULT_NO_DEVICE      if the card was ejected
3705 *      CSR_RESULT_FAILURE            if an SDIO error occurred
3706 *
3707 *  Notes:
3708 *      We need to reduce the SDIO clock speed before trying to wake up the
3709 *      chip. Actually, in the implementation below we reduce the clock speed
3710 *      not just before we try to wake up the chip, but when we put the chip to
3711 *      deep sleep. This means that if the f/w wakes up on its' own, we waste
3712 *      a reduce/increace cycle. However, trying to eliminate this overhead is
3713 *      proved difficult, as the current state machine in the HIP lib does at
3714 *      least a CMD52 to disable the interrupts before we configure the host
3715 *      state.
3716 * ---------------------------------------------------------------------------
3717 */
3718CsrResult unifi_set_host_state(card_t *card, enum unifi_host_state state)
3719{
3720    CsrResult r = CSR_RESULT_SUCCESS;
3721    CsrResult csrResult;
3722    static const char *const states[] = {
3723        "AWAKE", "DROWSY", "TORPID"
3724    };
3725    static const u8 state_csr_host_wakeup[] = {
3726        1, 3, 0
3727    };
3728    static const u8 state_io_abort[] = {
3729        0, 2, 3
3730    };
3731
3732    unifi_trace(card->ospriv, UDBG4, "State %s to %s\n",
3733                states[card->host_state], states[state]);
3734
3735    if (card->host_state == UNIFI_HOST_STATE_TORPID)
3736    {
3737        CsrSdioFunctionActive(card->sdio_if);
3738    }
3739
3740    /* Write the new state to UniFi. */
3741    if (card->chip_id > SDIO_CARD_ID_UNIFI_2)
3742    {
3743        r = sdio_write_f0(card, SDIO_CSR_HOST_WAKEUP,
3744                          (u8)((card->function << 4) | state_csr_host_wakeup[state]));
3745    }
3746    else
3747    {
3748        r = sdio_write_f0(card, SDIO_IO_ABORT, state_io_abort[state]);
3749    }
3750
3751    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
3752    {
3753        return r;
3754    }
3755    if (r != CSR_RESULT_SUCCESS)
3756    {
3757        unifi_error(card->ospriv, "Failed to write UniFi deep sleep state\n");
3758    }
3759    else
3760    {
3761        /*
3762         * If the chip was in state TORPID then we can now increase
3763         * the maximum bus clock speed.
3764         */
3765        if (card->host_state == UNIFI_HOST_STATE_TORPID)
3766        {
3767            csrResult = CsrSdioMaxBusClockFrequencySet(card->sdio_if,
3768                                                       UNIFI_SDIO_CLOCK_MAX_HZ);
3769            r = ConvertCsrSdioToCsrHipResult(card, csrResult);
3770            /* Non-fatal error */
3771            if (r != CSR_RESULT_SUCCESS && r != CSR_WIFI_HIP_RESULT_NO_DEVICE)
3772            {
3773                unifi_warning(card->ospriv,
3774                              "Failed to increase the SDIO clock speed\n");
3775            }
3776            else
3777            {
3778                card->sdio_clock_speed = UNIFI_SDIO_CLOCK_MAX_HZ;
3779            }
3780        }
3781
3782        /*
3783         * Cache the current state in the card structure to avoid
3784         * unnecessary SDIO reads.
3785         */
3786        card->host_state = state;
3787
3788        if (state == UNIFI_HOST_STATE_TORPID)
3789        {
3790            /*
3791             * If the chip is now in state TORPID then we must now decrease
3792             * the maximum bus clock speed.
3793             */
3794            csrResult = CsrSdioMaxBusClockFrequencySet(card->sdio_if,
3795                                                       UNIFI_SDIO_CLOCK_SAFE_HZ);
3796            r = ConvertCsrSdioToCsrHipResult(card, csrResult);
3797            if (r != CSR_RESULT_SUCCESS && r != CSR_WIFI_HIP_RESULT_NO_DEVICE)
3798            {
3799                unifi_warning(card->ospriv,
3800                              "Failed to decrease the SDIO clock speed\n");
3801            }
3802            else
3803            {
3804                card->sdio_clock_speed = UNIFI_SDIO_CLOCK_SAFE_HZ;
3805            }
3806            CsrSdioFunctionIdle(card->sdio_if);
3807        }
3808    }
3809
3810    return r;
3811} /* unifi_set_host_state() */
3812
3813
3814/*
3815 * ---------------------------------------------------------------------------
3816 *  unifi_card_info
3817 *
3818 *      Update the card information data structure
3819 *
3820 *  Arguments:
3821 *      card            Pointer to card struct
3822 *      card_info       Pointer to info structure to update
3823 *
3824 *  Returns:
3825 *      None
3826 * ---------------------------------------------------------------------------
3827 */
3828void unifi_card_info(card_t *card, card_info_t *card_info)
3829{
3830    card_info->chip_id = card->chip_id;
3831    card_info->chip_version = card->chip_version;
3832    card_info->fw_build = card->build_id;
3833    card_info->fw_hip_version = card->config_data.version;
3834    card_info->sdio_block_size = card->sdio_io_block_size;
3835} /* unifi_card_info() */
3836
3837
3838/*
3839 * ---------------------------------------------------------------------------
3840 *  unifi_check_io_status
3841 *
3842 *      Check UniFi for spontaneous reset and pending interrupt.
3843 *
3844 *  Arguments:
3845 *      card            Pointer to card struct
3846 *      status          Pointer to location to write chip status:
3847 *                        0 if UniFi is running, and no interrupt pending
3848 *                        1 if UniFi has spontaneously reset
3849 *                        2 if there is a pending interrupt
3850 *  Returns:
3851 *      CSR_RESULT_SUCCESS if OK, or CSR error
3852 * ---------------------------------------------------------------------------
3853 */
3854CsrResult unifi_check_io_status(card_t *card, s32 *status)
3855{
3856    u8 io_en;
3857    CsrResult r;
3858    u8 pending;
3859
3860    *status = 0;
3861
3862    r = sdio_read_f0(card, SDIO_IO_ENABLE, &io_en);
3863    if (r == CSR_WIFI_HIP_RESULT_NO_DEVICE)
3864    {
3865        return r;
3866    }
3867    if (r != CSR_RESULT_SUCCESS)
3868    {
3869        unifi_error(card->ospriv, "Failed to read SDIO_IO_ENABLE to check for spontaneous reset\n");
3870        return r;
3871    }
3872
3873    if ((io_en & (1 << card->function)) == 0)
3874    {
3875        s32 fw_count;
3876        *status = 1;
3877        unifi_error(card->ospriv, "UniFi has spontaneously reset.\n");
3878
3879        /*
3880         * These reads are very likely to fail. We want to know if the function is really
3881         * disabled or the SDIO driver just returns rubbish.
3882         */
3883        fw_count = unifi_read_shared_count(card, card->sdio_ctrl_addr + 4);
3884        if (fw_count < 0)
3885        {
3886            unifi_error(card->ospriv, "Failed to read to-host sig written count\n");
3887        }
3888        else
3889        {
3890            unifi_error(card->ospriv, "thsw: %u (driver thinks is %u)\n",
3891                        fw_count, card->to_host_signals_w);
3892        }
3893        fw_count = unifi_read_shared_count(card, card->sdio_ctrl_addr + 2);
3894        if (fw_count < 0)
3895        {
3896            unifi_error(card->ospriv, "Failed to read from-host sig read count\n");
3897        }
3898        else
3899        {
3900            unifi_error(card->ospriv, "fhsr: %u (driver thinks is %u)\n",
3901                        fw_count, card->from_host_signals_r);
3902        }
3903
3904        return r;
3905    }
3906
3907    unifi_info(card->ospriv, "UniFi function %d is enabled.\n", card->function);
3908
3909    /* See if we missed an SDIO interrupt */
3910    r = CardPendingInt(card, &pending);
3911    if (pending)
3912    {
3913        unifi_error(card->ospriv, "There is an unhandled pending interrupt.\n");
3914        *status = 2;
3915        return r;
3916    }
3917
3918    return r;
3919} /* unifi_check_io_status() */
3920
3921
3922void unifi_get_hip_qos_info(card_t *card, unifi_HipQosInfo *hipqosinfo)
3923{
3924    s32 count_fhr;
3925    s16 t;
3926    u32 occupied_fh;
3927
3928    q_t *sigq;
3929    u16 nslots, i;
3930
3931    memset(hipqosinfo, 0, sizeof(unifi_HipQosInfo));
3932
3933    nslots = card->config_data.num_fromhost_data_slots;
3934
3935    for (i = 0; i < nslots; i++)
3936    {
3937        if (card->from_host_data[i].bd.data_length == 0)
3938        {
3939            hipqosinfo->free_fh_bulkdata_slots++;
3940        }
3941    }
3942
3943    for (i = 0; i < UNIFI_NO_OF_TX_QS; i++)
3944    {
3945        sigq = &card->fh_traffic_queue[i];
3946        t = sigq->q_wr_ptr - sigq->q_rd_ptr;
3947        if (t < 0)
3948        {
3949            t += sigq->q_length;
3950        }
3951        hipqosinfo->free_fh_sig_queue_slots[i] = (sigq->q_length - t) - 1;
3952    }
3953
3954    count_fhr = unifi_read_shared_count(card, card->sdio_ctrl_addr + 2);
3955    if (count_fhr < 0)
3956    {
3957        unifi_error(card->ospriv, "Failed to read from-host sig read count - %d\n", count_fhr);
3958        hipqosinfo->free_fh_fw_slots = 0xfa;
3959        return;
3960    }
3961
3962    occupied_fh = (card->from_host_signals_w - count_fhr) % 128;
3963
3964    hipqosinfo->free_fh_fw_slots = (u16)(card->config_data.num_fromhost_sig_frags - occupied_fh);
3965}
3966
3967
3968
3969CsrResult ConvertCsrSdioToCsrHipResult(card_t *card, CsrResult csrResult)
3970{
3971    CsrResult r = CSR_RESULT_FAILURE;
3972
3973    switch (csrResult)
3974    {
3975        case CSR_RESULT_SUCCESS:
3976            r = CSR_RESULT_SUCCESS;
3977            break;
3978        /* Timeout errors */
3979        case CSR_SDIO_RESULT_TIMEOUT:
3980        /* Integrity errors */
3981        case CSR_SDIO_RESULT_CRC_ERROR:
3982            r = CSR_RESULT_FAILURE;
3983            break;
3984        case CSR_SDIO_RESULT_NO_DEVICE:
3985            r = CSR_WIFI_HIP_RESULT_NO_DEVICE;
3986            break;
3987        case CSR_SDIO_RESULT_INVALID_VALUE:
3988            r = CSR_WIFI_HIP_RESULT_INVALID_VALUE;
3989            break;
3990        case CSR_RESULT_FAILURE:
3991            r = CSR_RESULT_FAILURE;
3992            break;
3993        default:
3994            unifi_warning(card->ospriv, "Unrecognised csrResult error code: %d\n", csrResult);
3995            break;
3996    }
3997
3998    return r;
3999} /* ConvertCsrSdioToCsrHipResult() */
4000
4001
4002