diff options
Diffstat (limited to 'drivers/bluetooth/sd8897/bt/bt_sdiommc.c')
-rw-r--r-- | drivers/bluetooth/sd8897/bt/bt_sdiommc.c | 125 |
1 files changed, 63 insertions, 62 deletions
diff --git a/drivers/bluetooth/sd8897/bt/bt_sdiommc.c b/drivers/bluetooth/sd8897/bt/bt_sdiommc.c index 0d9f82eb3db2..01f84fbc159c 100644 --- a/drivers/bluetooth/sd8897/bt/bt_sdiommc.c +++ b/drivers/bluetooth/sd8897/bt/bt_sdiommc.c @@ -35,7 +35,7 @@ static char *fw_name; /** request firmware nowait */ static int req_fw_nowait; static int multi_fn = BIT(2); -#define DEFAULT_FW_NAME "mrvl/sd8897_uapsta.bin" +#define DEFAULT_FW_NAME "mrvl/sd8897_uapsta_a0.bin" /** Function number 2 */ #define FN2 2 @@ -70,7 +70,7 @@ extern int mbt_pm_keep_power; * @brief This function gets rx_unit value * * @param priv A pointer to bt_private structure - * @return BT_STATUS_SUCCESS or BT_STATUS_FAILURE + * @return BT_STATUS_SUCCESS or BT_STATUS_FAILURE */ int sd_get_rx_unit(bt_private * priv) @@ -94,7 +94,7 @@ sd_get_rx_unit(bt_private * priv) * * @param priv A pointer to bt_private structure * @param dat A pointer to keep returned data - * @return BT_STATUS_SUCCESS or BT_STATUS_FAILURE + * @return BT_STATUS_SUCCESS or BT_STATUS_FAILURE */ static int sd_read_firmware_status(bt_private * priv, u16 * dat) @@ -129,7 +129,7 @@ sd_read_firmware_status(bt_private * priv, u16 * dat) * * @param priv A pointer to bt_private structure * @param dat A pointer to keep returned data - * @return BT_STATUS_SUCCESS or other error no. + * @return BT_STATUS_SUCCESS or other error no. */ static int sd_read_rx_len(bt_private * priv, u16 * dat) @@ -153,7 +153,7 @@ sd_read_rx_len(bt_private * priv, u16 * dat) * * @param priv A pointer to bt_private structure * @param mask the interrupt mask - * @return BT_STATUS_SUCCESS or BT_STATUS_FAILURE + * @return BT_STATUS_SUCCESS or BT_STATUS_FAILURE */ static int sd_enable_host_int_mask(bt_private * priv, u8 mask) @@ -177,7 +177,7 @@ sd_enable_host_int_mask(bt_private * priv, u8 mask) * * @param priv A pointer to bt_private structure * @param mask the interrupt mask - * @return BT_STATUS_SUCCESS or other error no. + * @return BT_STATUS_SUCCESS or other error no. */ static int sd_disable_host_int_mask(bt_private * priv, u8 mask) @@ -209,9 +209,9 @@ done: /** * @brief This function polls the card status register * - * @param priv A pointer to bt_private structure - * @param bits the bit mask - * @return BT_STATUS_SUCCESS or BT_STATUS_FAILURE + * @param priv A pointer to bt_private structure + * @param bits the bit mask + * @return BT_STATUS_SUCCESS or BT_STATUS_FAILURE */ static int sd_poll_card_status(bt_private * priv, u8 bits) @@ -244,8 +244,8 @@ sd_poll_card_status(bt_private * priv, u8 bits) /** * @brief This function reads updates the Cmd52 value in dev structure * - * @param priv A pointer to bt_private structure - * @return BT_STATUS_SUCCESS or other error no. + * @param priv A pointer to bt_private structure + * @return BT_STATUS_SUCCESS or other error no. */ int sd_read_cmd52_val(bt_private * priv) @@ -278,11 +278,11 @@ sd_read_cmd52_val(bt_private * priv) /** * @brief This function updates card reg based on the Cmd52 value in dev structure * - * @param priv A pointer to bt_private structure - * @param func Stores func variable - * @param reg Stores reg variable - * @param val Stores val variable - * @return BT_STATUS_SUCCESS or other error no. + * @param priv A pointer to bt_private structure + * @param func Stores func variable + * @param reg Stores reg variable + * @param val Stores val variable + * @return BT_STATUS_SUCCESS or other error no. */ int sd_write_cmd52_val(bt_private * priv, int func, int reg, int val) @@ -322,8 +322,8 @@ done: * @brief This function probes the card * * @param func A pointer to sdio_func structure. - * @param id A pointer to structure sdio_device_id - * @return BT_STATUS_SUCCESS/BT_STATUS_FAILURE or other error no. + * @param id A pointer to structure sdio_device_id + * @return BT_STATUS_SUCCESS/BT_STATUS_FAILURE or other error no. */ static int sd_probe_card(struct sdio_func *func, const struct sdio_device_id *id) @@ -411,7 +411,7 @@ sd_verify_fw_download(bt_private * priv, int pollnum) * @brief Transfers firmware to card * * @param priv A Pointer to bt_private structure - * @return BT_STATUS_SUCCESS/BT_STATUS_FAILURE or other error no. + * @return BT_STATUS_SUCCESS/BT_STATUS_FAILURE or other error no. */ static int sd_init_fw_dpc(bt_private * priv) @@ -431,6 +431,9 @@ sd_init_fw_dpc(bt_private * priv) int tx_blocks = 0; int i = 0; int tries = 0; +#ifdef FW_DOWNLOAD_SPEED + u32 tv1, tv2; +#endif ENTER(); firmware = (u8 *) priv->firmware->data; @@ -438,7 +441,11 @@ sd_init_fw_dpc(bt_private * priv) PRINTM(INFO, "BT: Downloading FW image (%d bytes)\n", firmwarelen); - tmpfwbufsz = BT_UPLD_SIZE + DMA_ALIGNMENT; +#ifdef FW_DOWNLOAD_SPEED + tv1 = get_utimeofday(); +#endif + + tmpfwbufsz = ALIGN_SZ(BT_UPLD_SIZE, DMA_ALIGNMENT); tmpfwbuf = kmalloc(tmpfwbufsz, GFP_KERNEL); if (!tmpfwbuf) { PRINTM(ERROR, @@ -558,7 +565,18 @@ sd_init_fw_dpc(bt_private * priv) ret = BT_STATUS_SUCCESS; done: - kfree(tmpfwbuf); +#ifdef FW_DOWNLOAD_SPEED + tv2 = get_utimeofday(); + PRINTM(INFO, "FW: %d.%03d.%03d ", tv1 / 1000000, + (tv1 % 1000000) / 1000, tv1 % 1000); + PRINTM(INFO, " -> %d.%03d.%03d ", tv2 / 1000000, + (tv2 % 1000000) / 1000, tv2 % 1000); + tv2 -= tv1; + PRINTM(INFO, " == %d.%03d.%03d\n", tv2 / 1000000, + (tv2 % 1000000) / 1000, tv2 % 1000); +#endif + if (tmpfwbuf) + kfree(tmpfwbuf); LEAVE(); return ret; } @@ -663,8 +681,9 @@ done: /* Stop the thread servicing the interrupts */ priv->adapter->SurpriseRemoved = TRUE; wake_up_interruptible(&priv->MainThread.waitQ); - while (priv->MainThread.pid) + while (priv->MainThread.pid) { os_sched_timeout(1); + } if (m_dev_bt->dev_pointer) { if (m_dev_bt->spec_type == IANYWHERE_SPEC) free_m_dev(m_dev_bt); @@ -700,8 +719,8 @@ sd_request_fw_callback(const struct firmware *firmware, void *context) /** * @brief This function downloads firmware image to the card. * - * @param priv A pointer to bt_private structure - * @return BT_STATUS_SUCCESS/BT_STATUS_FAILURE or other error no. + * @param priv A pointer to bt_private structure + * @return BT_STATUS_SUCCESS/BT_STATUS_FAILURE or other error no. */ int sd_download_firmware_w_helper(bt_private * priv) @@ -749,7 +768,7 @@ sd_download_firmware_w_helper(bt_private * priv) * @brief This function reads data from the card. * * @param priv A pointer to bt_private structure - * @return BT_STATUS_SUCCESS or BT_STATUS_FAILURE + * @return BT_STATUS_SUCCESS or BT_STATUS_FAILURE */ static int sd_card_to_host(bt_private * priv) @@ -1053,7 +1072,7 @@ sd_interrupt(struct sdio_func *func) if (!card || !card->priv) { PRINTM(INFO, "BT: %s: sbi_interrupt(%p) card or priv is NULL, card=%p\n", - __func__, func, card); + __FUNCTION__, func, card); LEAVE(); return; } @@ -1141,7 +1160,7 @@ bt_is_suspended(bt_private * priv) /** @brief This function handles client driver suspend * * @param dev A pointer to device structure - * @return BT_STATUS_SUCCESS or other error no. + * @return BT_STATUS_SUCCESS or other error no. */ int bt_sdio_suspend(struct device *dev) @@ -1195,9 +1214,6 @@ bt_sdio_suspend(struct device *dev) skb_queue_purge(&priv->adapter->tx_queue); priv->adapter->is_suspended = TRUE; - - bt_enable_hostwake_irq(TRUE); - LEAVE(); /* We will keep the power when hs enabled successfully */ if ((mbt_pm_keep_power) && (priv->adapter->hs_state == HS_ACTIVATED)) { @@ -1220,7 +1236,7 @@ bt_sdio_suspend(struct device *dev) /** @brief This function handles client driver resume * * @param dev A pointer to device structure - * @return BT_STATUS_SUCCESS + * @return BT_STATUS_SUCCESS */ int bt_sdio_resume(struct device *dev) @@ -1233,7 +1249,6 @@ bt_sdio_resume(struct device *dev) ENTER(); if (func) { - bt_enable_hostwake_irq(FALSE); pm_flags = sdio_get_host_pm_caps(func); PRINTM(CMD, "BT: %s: resume: PM flags = 0x%x\n", sdio_func_id(func), pm_flags); @@ -1305,7 +1320,7 @@ sbi_register(void) ENTER(); if (sdio_register_driver(&sdio_bt) != 0) { - PRINTM(FATAL, "BT: SD Driver Registration Failed\n"); + PRINTM(FATAL, "BT: SD Driver Registration Failed \n"); LEAVE(); return NULL; } else @@ -1318,7 +1333,7 @@ sbi_register(void) /** * @brief This function de-registers the bt module in bus driver. * - * @return N/A + * @return N/A */ void sbi_unregister(void) @@ -1333,7 +1348,7 @@ sbi_unregister(void) * @brief This function registers the device. * * @param priv A pointer to bt_private structure - * @return BT_STATUS_SUCCESS or BT_STATUS_FAILURE + * @return BT_STATUS_SUCCESS or BT_STATUS_FAILURE */ int sbi_register_dev(bt_private * priv) @@ -1368,7 +1383,8 @@ sbi_register_dev(bt_private * priv) } ret = sdio_set_block_size(card->func, SD_BLOCK_SIZE); if (ret) { - PRINTM(FATAL, ": %s: cannot set SDIO block size\n", __func__); + PRINTM(FATAL, ": %s: cannot set SDIO block size\n", + __FUNCTION__); goto release_irq; } @@ -1411,21 +1427,6 @@ sbi_register_dev(bt_private * priv) PRINTM(INFO, ": SDIO FUNC%d IO port: 0x%x\n", priv->bt_dev.fn, priv->bt_dev.ioport); -#define SDIO_INT_MASK 0x3F - /* Set Host interrupt reset to read to clear */ - reg = sdio_readb(func, HOST_INT_RSR_REG, &ret); - if (ret < 0) - goto release_irq; - sdio_writeb(func, reg | SDIO_INT_MASK, HOST_INT_RSR_REG, &ret); - if (ret < 0) - goto release_irq; - /* Set auto re-enable */ - reg = sdio_readb(func, CARD_MISC_CFG_REG, &ret); - if (ret < 0) - goto release_irq; - sdio_writeb(func, reg | AUTO_RE_ENABLE_INT, CARD_MISC_CFG_REG, &ret); - if (ret < 0) - goto release_irq; sdio_set_drvdata(func, card); sdio_release_host(func); @@ -1446,7 +1447,7 @@ failed: * @brief This function de-registers the device. * * @param priv A pointer to bt_private structure - * @return BT_STATUS_SUCCESS + * @return BT_STATUS_SUCCESS */ int sbi_unregister_dev(bt_private * priv) @@ -1471,7 +1472,7 @@ sbi_unregister_dev(bt_private * priv) * @brief This function enables the host interrupts. * * @param priv A pointer to bt_private structure - * @return BT_STATUS_SUCCESS or BT_STATUS_FAILURE + * @return BT_STATUS_SUCCESS or BT_STATUS_FAILURE */ int sd_enable_host_int(bt_private * priv) @@ -1498,7 +1499,7 @@ sd_enable_host_int(bt_private * priv) * @brief This function disables the host interrupts. * * @param priv A pointer to bt_private structure - * @return BT_STATUS_SUCCESS/BT_STATUS_FAILURE or other error no. + * @return BT_STATUS_SUCCESS/BT_STATUS_FAILURE or other error no. */ int sd_disable_host_int(bt_private * priv) @@ -1525,8 +1526,8 @@ sd_disable_host_int(bt_private * priv) * * @param priv A pointer to bt_private structure * @param payload A pointer to the data/cmd buffer - * @param nb Length of data/cmd - * @return BT_STATUS_SUCCESS or BT_STATUS_FAILURE + * @param nb Length of data/cmd + * @return BT_STATUS_SUCCESS or BT_STATUS_FAILURE */ int sbi_host_to_card(bt_private * priv, u8 * payload, u16 nb) @@ -1550,11 +1551,9 @@ sbi_host_to_card(bt_private * priv, u8 * payload, u16 nb) } buf = payload; - blksz = SD_BLOCK_SIZE; - buf_block_len = (nb + blksz - 1) / blksz; /* Allocate buffer and copy payload */ if ((t_ptr) payload & (DMA_ALIGNMENT - 1)) { - tmpbufsz = buf_block_len * blksz + DMA_ALIGNMENT; + tmpbufsz = ALIGN_SZ(nb, DMA_ALIGNMENT); tmpbuf = kmalloc(tmpbufsz, GFP_KERNEL); if (!tmpbuf) { LEAVE(); @@ -1565,6 +1564,8 @@ sbi_host_to_card(bt_private * priv, u8 * payload, u16 nb) buf = (u8 *) ALIGN_ADDR(tmpbuf, DMA_ALIGNMENT); memcpy(buf, payload, nb); } + blksz = SD_BLOCK_SIZE; + buf_block_len = (nb + blksz - 1) / blksz; sdio_claim_host(card->func); #define MAX_WRITE_IOMEM_RETRY 2 do { @@ -1601,7 +1602,7 @@ exit: * @brief This function downloads firmware * * @param priv A pointer to bt_private structure - * @return BT_STATUS_SUCCESS or BT_STATUS_FAILURE + * @return BT_STATUS_SUCCESS or BT_STATUS_FAILURE */ int sbi_download_fw(bt_private * priv) @@ -1691,7 +1692,7 @@ err_register: * @brief This function checks the interrupt status and handle it accordingly. * * @param priv A pointer to bt_private structure - * @return BT_STATUS_SUCCESS + * @return BT_STATUS_SUCCESS */ int sbi_get_int_status(bt_private * priv) @@ -1730,7 +1731,7 @@ sbi_get_int_status(bt_private * priv) * @brief This function wakeup firmware * * @param priv A pointer to bt_private structure - * @return BT_STATUS_SUCCESS/BT_STATUS_FAILURE or other error no. + * @return BT_STATUS_SUCCESS/BT_STATUS_FAILURE or other error no. */ int sbi_wakeup_firmware(bt_private * priv) |