summaryrefslogtreecommitdiff
path: root/drivers/bluetooth/sd8897/bt/bt_sdiommc.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/bluetooth/sd8897/bt/bt_sdiommc.c')
-rw-r--r--drivers/bluetooth/sd8897/bt/bt_sdiommc.c125
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)