diff options
author | Marc Yang <yangyang@marvell.com> | 2013-11-14 14:24:07 -0800 |
---|---|---|
committer | Bitan Biswas <bbiswas@nvidia.com> | 2013-12-02 03:43:26 -0800 |
commit | eb4e05c4e3b129a066d4d411e28ae6ff80fe66f5 (patch) | |
tree | b56f05be4189da106e73fa6d41a94384d73ddc6d /drivers/bluetooth | |
parent | a580753a9b6f66f46333d5bdfcf429c590d2f616 (diff) |
net: wireless: Update Marvell SD8797 SD8897 WLAN/BT driver
Signed-off-by: Marc Yang <yangyang@marvell.com>
- update SD8797 to 446
- update SD8897 to 449
Bug 1416075
Change-Id: Ib20c864e56677a0e3502164bf3aa251c9f506078
Signed-off-by: Manikanta <mmaddireddy@nvidia.com>
Reviewed-on: http://git-master/r/336501
Reviewed-by: Bitan Biswas <bbiswas@nvidia.com>
Diffstat (limited to 'drivers/bluetooth')
-rw-r--r-- | drivers/bluetooth/sd8797/bt/bt_drv.h | 82 | ||||
-rw-r--r-- | drivers/bluetooth/sd8797/bt/bt_init.c | 94 | ||||
-rw-r--r-- | drivers/bluetooth/sd8797/bt/bt_main.c | 556 | ||||
-rw-r--r-- | drivers/bluetooth/sd8797/bt/bt_proc.c | 65 | ||||
-rw-r--r-- | drivers/bluetooth/sd8797/bt/bt_sdio.h | 92 | ||||
-rw-r--r-- | drivers/bluetooth/sd8797/bt/bt_sdiommc.c | 154 | ||||
-rw-r--r-- | drivers/bluetooth/sd8797/bt/hci_wrapper.h | 1 | ||||
-rw-r--r-- | drivers/bluetooth/sd8797/bt/mbt_char.c | 57 | ||||
-rw-r--r-- | drivers/bluetooth/sd8797/bt/mbt_char.h | 3 | ||||
-rw-r--r-- | drivers/bluetooth/sd8897/bt/bt_drv.h | 62 | ||||
-rw-r--r-- | drivers/bluetooth/sd8897/bt/bt_main.c | 384 | ||||
-rw-r--r-- | drivers/bluetooth/sd8897/bt/bt_proc.c | 16 | ||||
-rw-r--r-- | drivers/bluetooth/sd8897/bt/bt_sdio.h | 44 | ||||
-rw-r--r-- | drivers/bluetooth/sd8897/bt/bt_sdiommc.c | 125 | ||||
-rw-r--r-- | drivers/bluetooth/sd8897/bt/hci_wrapper.h | 1 | ||||
-rw-r--r-- | drivers/bluetooth/sd8897/bt/mbt_char.c | 3 | ||||
-rw-r--r-- | drivers/bluetooth/sd8897/bt/mbt_char.h | 2 |
17 files changed, 1046 insertions, 695 deletions
diff --git a/drivers/bluetooth/sd8797/bt/bt_drv.h b/drivers/bluetooth/sd8797/bt/bt_drv.h index 6773d34a944c..e417f976fbee 100644 --- a/drivers/bluetooth/sd8797/bt/bt_drv.h +++ b/drivers/bluetooth/sd8797/bt/bt_drv.h @@ -54,6 +54,16 @@ typedef u32 t_ptr; /** Define maximum number of radio func supported */ #define MAX_RADIO_FUNC 4 +/** MAC address print format */ +#ifndef MACSTR +#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x" +#endif + +/** MAC address print arguments */ +#ifndef MAC2STR +#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5] +#endif + /** Debug level : Message */ #define DBG_MSG BIT(0) /** Debug level : Fatal */ @@ -86,11 +96,14 @@ extern u32 mbt_drvdbg; #ifdef DEBUG_LEVEL2 /** Print informative message */ -#define PRINTM_INFO(msg...) do {if (mbt_drvdbg & DBG_INFO) printk(KERN_DEBUG msg); } while (0) +#define PRINTM_INFO(msg...) do {if (mbt_drvdbg & DBG_INFO) \ + printk(KERN_DEBUG msg); } while (0) /** Print warning message */ -#define PRINTM_WARN(msg...) do {if (mbt_drvdbg & DBG_WARN) printk(KERN_DEBUG msg); } while (0) +#define PRINTM_WARN(msg...) do {if (mbt_drvdbg & DBG_WARN) \ + printk(KERN_DEBUG msg); } while (0) /** Print entry message */ -#define PRINTM_ENTRY(msg...) do {if (mbt_drvdbg & DBG_ENTRY) printk(KERN_DEBUG msg); } while (0) +#define PRINTM_ENTRY(msg...) do {if (mbt_drvdbg & DBG_ENTRY) \ + printk(KERN_DEBUG msg); } while (0) #else /** Print informative message */ #define PRINTM_INFO(msg...) do {} while (0) @@ -101,24 +114,33 @@ extern u32 mbt_drvdbg; #endif /* DEBUG_LEVEL2 */ /** Print interrupt message */ -#define PRINTM_INTR(msg...) do {if (mbt_drvdbg & DBG_INTR) printk(KERN_DEBUG msg); } while (0) +#define PRINTM_INTR(msg...) do {if (mbt_drvdbg & DBG_INTR) \ + printk(KERN_DEBUG msg); } while (0) /** Print event message */ -#define PRINTM_EVENT(msg...) do {if (mbt_drvdbg & DBG_EVENT) printk(KERN_DEBUG msg); } while (0) +#define PRINTM_EVENT(msg...) do {if (mbt_drvdbg & DBG_EVENT) \ + printk(KERN_DEBUG msg); } while (0) /** Print command message */ -#define PRINTM_CMD(msg...) do {if (mbt_drvdbg & DBG_CMD) printk(KERN_DEBUG msg); } while (0) +#define PRINTM_CMD(msg...) do {if (mbt_drvdbg & DBG_CMD) \ + printk(KERN_DEBUG msg); } while (0) /** Print data message */ -#define PRINTM_DATA(msg...) do {if (mbt_drvdbg & DBG_DATA) printk(KERN_DEBUG msg); } while (0) +#define PRINTM_DATA(msg...) do {if (mbt_drvdbg & DBG_DATA) \ + printk(KERN_DEBUG msg); } while (0) /** Print error message */ -#define PRINTM_ERROR(msg...) do {if (mbt_drvdbg & DBG_ERROR) printk(KERN_ERR msg); } while (0) +#define PRINTM_ERROR(msg...) do {if (mbt_drvdbg & DBG_ERROR) \ + printk(KERN_ERR msg); } while (0) /** Print fatal message */ -#define PRINTM_FATAL(msg...) do {if (mbt_drvdbg & DBG_FATAL) printk(KERN_ERR msg); } while (0) +#define PRINTM_FATAL(msg...) do {if (mbt_drvdbg & DBG_FATAL) \ + printk(KERN_ERR msg); } while (0) /** Print message */ -#define PRINTM_MSG(msg...) do {if (mbt_drvdbg & DBG_MSG) printk(KERN_ALERT msg); } while (0) +#define PRINTM_MSG(msg...) do {if (mbt_drvdbg & DBG_MSG) \ + printk(KERN_ALERT msg); } while (0) /** Print data dump message */ -#define PRINTM_DAT_D(msg...) do {if (mbt_drvdbg & DBG_DAT_D) printk(KERN_DEBUG msg); } while (0) +#define PRINTM_DAT_D(msg...) do {if (mbt_drvdbg & DBG_DAT_D) \ + printk(KERN_DEBUG msg); } while (0) /** Print data dump message */ -#define PRINTM_CMD_D(msg...) do {if (mbt_drvdbg & DBG_CMD_D) printk(KERN_DEBUG msg); } while (0) +#define PRINTM_CMD_D(msg...) do {if (mbt_drvdbg & DBG_CMD_D) \ + printk(KERN_DEBUG msg); } while (0) /** Print message with required level */ #define PRINTM(level, msg...) PRINTM_##level(msg) @@ -154,28 +176,30 @@ hexdump(char *prompt, u8 * buf, int len) } /** Debug hexdump of debug data */ -#define DBG_HEXDUMP_DAT_D(x, y, z) do {if (mbt_drvdbg & DBG_DAT_D) hexdump(x, y, z); } while (0) +#define DBG_HEXDUMP_DAT_D(x, y, z) do {if (mbt_drvdbg & DBG_DAT_D) \ + hexdump(x, y, z); } while (0) /** Debug hexdump of debug command */ -#define DBG_HEXDUMP_CMD_D(x, y, z) do {if (mbt_drvdbg & DBG_CMD_D) hexdump(x, y, z); } while (0) +#define DBG_HEXDUMP_CMD_D(x, y, z) do {if (mbt_drvdbg & DBG_CMD_D) \ + hexdump(x, y, z); } while (0) /** Debug hexdump */ #define DBG_HEXDUMP(level, x, y, z) DBG_HEXDUMP_##level(x, y, z) /** Mark entry point */ -#define ENTER() PRINTM(ENTRY, "Enter: %s, %s:%i\n", __FUNCTION__, \ +#define ENTER() PRINTM(ENTRY, "Enter: %s, %s:%i\n", __func__, \ __FILE__, __LINE__) /** Mark exit point */ -#define LEAVE() PRINTM(ENTRY, "Leave: %s, %s:%i\n", __FUNCTION__, \ +#define LEAVE() PRINTM(ENTRY, "Leave: %s, %s:%i\n", __func__, \ __FILE__, __LINE__) #else /** Do nothing */ -#define PRINTM(level, msg...) do {} while (0); +#define PRINTM(level, msg...) do {} while (0) /** Do nothing */ -#define DBG_HEXDUMP(level, x, y, z) do {} while (0); +#define DBG_HEXDUMP(level, x, y, z) do {} while (0) /** Do nothing */ -#define ENTER() do {} while (0); +#define ENTER() do {} while (0) /** Do nothing */ -#define LEAVE() do {} while (0); +#define LEAVE() do {} while (0) #endif /* DEBUG_LEVEL1 */ /** Bluetooth upload size */ @@ -268,7 +292,7 @@ os_sched_timeout(u32 millisec) #endif #ifndef __ATTRIB_PACK__ -#define __ATTRIB_PACK__ __attribute__ ((packed)) +#define __ATTRIB_PACK__ __attribute__((packed)) #endif /** Data structure for the Marvell Bluetooth device */ @@ -435,15 +459,19 @@ typedef struct _bt_private { spinlock_t driver_lock; /** Driver lock flags */ ulong driver_flags; + /** Driver reference flags */ + struct kobject kobj; int debug_device_pending; int debug_ocf_ogf[2]; } bt_private, *pbt_private; /** Disable interrupt */ -#define OS_INT_DISABLE spin_lock_irqsave(&priv->driver_lock, priv->driver_flags) +#define OS_INT_DISABLE spin_lock_irqsave(&priv->driver_lock, \ + priv->driver_flags) /** Enable interrupt */ -#define OS_INT_RESTORE spin_unlock_irqrestore(&priv->driver_lock, priv->driver_flags) +#define OS_INT_RESTORE spin_unlock_irqrestore(&priv->driver_lock, \ + priv->driver_flags) #ifndef HCI_BT_AMP /** BT_AMP flag for device type */ @@ -566,6 +594,8 @@ int fm_set_intr_mask(bt_private * priv, u32 mask); /** default idle time */ #define DEFAULT_IDLE_TIME 1000 +#define BT_CMD_HEADER_SIZE 3 + typedef struct _BT_CMD { /** OCF OGF */ u16 ocf_ogf; @@ -588,7 +618,10 @@ typedef struct _BT_EVENT { int check_evtpkt(bt_private * priv, struct sk_buff *skb); /* Prototype of global function */ - +/** This function gets the priv reference */ +struct kobject *bt_priv_get(bt_private * priv); +/** This function release the priv reference */ +void bt_priv_put(bt_private * priv); /** This function adds the card */ bt_private *bt_add_card(void *card); /** This function removes the card */ @@ -690,6 +723,7 @@ int bt_init_config(bt_private * priv, char *cfg_file); int bt_load_cal_data(bt_private * priv, u8 * config_data, u8 * mac); /** BT set user defined calibration data */ int bt_cal_config(bt_private * priv, char *cfg_file, char *mac); +int bt_init_mac_address(bt_private * priv, char *mac); typedef struct _BT_HCI_CMD { /** OCF OGF */ diff --git a/drivers/bluetooth/sd8797/bt/bt_init.c b/drivers/bluetooth/sd8797/bt/bt_init.c index 2de8c1238429..55481d520a3d 100644 --- a/drivers/bluetooth/sd8797/bt/bt_init.c +++ b/drivers/bluetooth/sd8797/bt/bt_init.c @@ -30,7 +30,7 @@ || ('A' <= (c) && (c) <= 'F')) #define isdigit(c) (('0' <= (c) && (c) <= '9')) -#define isspace(c) (c <= ' ' && (c == ' ' || (c <= 13 && c >=9))) +#define isspace(c) (c <= ' ' && (c == ' ' || (c <= 13 && c >= 9))) /** * @brief Returns hex value of a give character * @@ -116,7 +116,7 @@ bt_strsep(char **s, char delim, char esc) * @return hex value */ static int -bt_atox(char *a) +bt_atox(const char *a) { int i = 0; ENTER(); @@ -199,35 +199,43 @@ bt_atoi(int *data, char *a) * * @return BT_STATUS_SUCCESS or BT_STATUS_FAILURE */ -static u32 -bt_parse_cal_cfg(u8 * src, u32 len, u8 * dst, u32 dst_size) +static int +bt_parse_cal_cfg(const u8 * src, u32 len, u8 * dst, u32 dst_size) { - u8 *ptr; + const u8 *ptr; u8 *dptr; + int ret = BT_STATUS_FAILURE; ENTER(); ptr = src; dptr = dst; - while (ptr - src < len) { - if (*ptr && (isspace(*ptr) || *ptr == '\t')) { + while ((ptr - src) < len) { + if (*ptr && isspace(*ptr)) { ptr++; continue; } if (isxdigit(*ptr)) { + if ((dptr - dst) >= dst_size) { + PRINTM(ERROR, "cal_file size too big!!!\n"); + goto done; + } *dptr++ = bt_atox(ptr); ptr += 2; } else { ptr++; } - if ((dptr - dst) > dst_size) { - PRINTM(ERROR, "cal_file size too big!!!\n"); - break; - } } + if (dptr == dst) { + ret = BT_STATUS_FAILURE; + goto done; + } + + ret = BT_STATUS_SUCCESS; +done: LEAVE(); - return (dptr - dst); + return ret; } /** @@ -241,7 +249,7 @@ bt_parse_cal_cfg(u8 * src, u32 len, u8 * dst, u32 dst_size) int parse_cfg_get_line(u8 * data, u32 size, u8 * line_pos) { - static s32 pos = 0; + static s32 pos; u8 *src, *dest; if (pos >= size) { /* reach the end */ @@ -330,10 +338,8 @@ bt_process_init_cfg(bt_private * priv, u8 * data, u32 size) /* Convert MAC format */ bt_mac2u8(bt_mac, bt_addr); PRINTM(CMD, - "HCI: %s new BT Address %02x:%02x:%02x:%02x:%02x:%02x\n", - dev_name, bt_mac[0], bt_mac[1], - bt_mac[2], bt_mac[3], bt_mac[4], - bt_mac[5]); + "HCI: %s new BT Address " MACSTR + "\n", dev_name, MAC2STR(bt_mac)); if (BT_STATUS_SUCCESS != bt_set_mac_address(priv, bt_mac)) { PRINTM(FATAL, @@ -490,29 +496,25 @@ bt_process_cal_cfg(bt_private * priv, u8 * data, u32 size, char *mac) { u8 bt_mac[ETH_ALEN]; u8 cal_data[32]; + u8 *mac_data = NULL; int ret = BT_STATUS_FAILURE; memset(bt_mac, 0, sizeof(bt_mac)); - bt_parse_cal_cfg(data, size, cal_data, sizeof(cal_data)); + if (BT_STATUS_SUCCESS != + bt_parse_cal_cfg(data, size, cal_data, sizeof(cal_data))) { + goto done; + } if (mac != NULL) { /* Convert MAC format */ bt_mac2u8(bt_mac, mac); - PRINTM(CMD, - "HCI: new BT Address %02x:%02x:%02x:%02x:%02x:%02x\n", - bt_mac[0], bt_mac[1], bt_mac[2], bt_mac[3], bt_mac[4], - bt_mac[5]); - if (BT_STATUS_SUCCESS != - bt_load_cal_data(priv, cal_data, bt_mac)) { - PRINTM(FATAL, "BT: Fail to load calibrate data\n"); - goto done; - } - } else { - if (BT_STATUS_SUCCESS != bt_load_cal_data(priv, cal_data, NULL)) { - PRINTM(FATAL, "BT: Fail to load calibrate data\n"); - goto done; - } + PRINTM(CMD, "HCI: new BT Address " MACSTR "\n", + MAC2STR(bt_mac)); + mac_data = bt_mac; + } + if (BT_STATUS_SUCCESS != bt_load_cal_data(priv, cal_data, mac_data)) { + PRINTM(FATAL, "BT: Fail to load calibrate data\n"); + goto done; } - ret = BT_STATUS_SUCCESS; done: @@ -551,3 +553,29 @@ done: LEAVE(); return ret; } + +/** + * @brief BT init mac address from bt_mac parametre when insmod + * + * @param priv a pointer to bt_private structure + * @param bt_mac mac address buf + * @return BT_STATUS_SUCCESS or BT_STATUS_FAILURE + */ +int +bt_init_mac_address(bt_private * priv, char *mac) +{ + u8 bt_mac[ETH_ALEN]; + int ret = BT_STATUS_FAILURE; + + ENTER(); + memset(bt_mac, 0, sizeof(bt_mac)); + bt_mac2u8(bt_mac, mac); + PRINTM(CMD, "HCI: New BT Address " MACSTR "\n", MAC2STR(bt_mac)); + ret = bt_set_mac_address(priv, bt_mac); + if (ret != BT_STATUS_SUCCESS) + PRINTM(FATAL, + "BT: Fail to set mac address from insmod parametre.\n"); + + LEAVE(); + return ret; +} diff --git a/drivers/bluetooth/sd8797/bt/bt_main.c b/drivers/bluetooth/sd8797/bt/bt_main.c index 6c5f26561381..c84704a1b5c7 100644 --- a/drivers/bluetooth/sd8797/bt/bt_main.c +++ b/drivers/bluetooth/sd8797/bt/bt_main.c @@ -37,6 +37,8 @@ #include <linux/platform_device.h> #include <linux/wlan_plat.h> +#include <linux/interrupt.h> + #include "bt_drv.h" #include "mbt_char.h" #include "bt_sdio.h" @@ -65,33 +67,33 @@ static char fw_version[32] = "0.0.0.p0"; static struct class *chardev_class; /** Interface specific variables */ -static int mbtchar_minor = 0; -static int fmchar_minor = 0; -static int nfcchar_minor = 0; -static int debugchar_minor = 0; +static int mbtchar_minor; +static int fmchar_minor; +static int nfcchar_minor; +static int debugchar_minor; /** Default Driver mode */ static int drv_mode = (DRV_MODE_BT | DRV_MODE_FM | DRV_MODE_NFC); /** BT interface name */ -static char *bt_name = NULL; +static char *bt_name; /** FM interface name */ -static char *fm_name = NULL; +static char *fm_name; /** NFC interface name */ -static char *nfc_name = NULL; +static char *nfc_name; /** BT debug interface name */ -static char *debug_name = NULL; +static char *debug_name; /** Firmware flag */ static int fw = 1; /** default powermode */ static int psmode = 1; /** Init config file (MAC address, register etc.) */ -static char *init_cfg = NULL; +static char *init_cfg; /** Calibration config file (MAC address, init powe etc.) */ -static char *cal_cfg = NULL; +static char *cal_cfg; /** Init MAC address */ -static char *bt_mac = NULL; +static char *bt_mac; /** Setting mbt_drvdbg value based on DEBUG level */ #ifdef DEBUG_LEVEL1 @@ -111,9 +113,17 @@ int mbt_pm_keep_power = 1; static int debug_intf = 1; /** Enable minicard power-up/down */ -int minicard_pwrup = 1; +static int minicard_pwrup = 1; /** Pointer to struct with control hooks */ -struct wifi_platform_data *bt_control_data = NULL; +static struct wifi_platform_data *bt_control_data; + +#define IORESOURCE_NAME "mrvl_bt_irq" +#define DRIVER_NAME "bt hostwake" + +void mdev_poweroff(struct m_dev *m_dev); +static struct resource *bt_irqres; +static int irq_registered; +static void bt_register_hostwake_irq(void *handle); /** * @brief Alloc bt device @@ -328,19 +338,19 @@ bt_process_event(bt_private * priv, struct sk_buff *skb) { u8 ret = BT_STATUS_SUCCESS; struct m_dev *m_dev = &(priv->bt_dev.m_dev[BT_SEQ]); - BT_EVENT *pEvent; + BT_EVENT *pevent; ENTER(); - pEvent = (BT_EVENT *) skb->data; - if (pEvent->EC != 0xff) { - PRINTM(CMD, "BT: Not Marvell Event=0x%x\n", pEvent->EC); + pevent = (BT_EVENT *) skb->data; + if (pevent->EC != 0xff) { + PRINTM(CMD, "BT: Not Marvell Event=0x%x\n", pevent->EC); ret = BT_STATUS_FAILURE; goto exit; } - switch (pEvent->data[0]) { + switch (pevent->data[0]) { case BT_CMD_AUTO_SLEEP_MODE: - if (pEvent->data[2] == BT_STATUS_SUCCESS) { - if (pEvent->data[1] == BT_PS_ENABLE) + if (pevent->data[2] == BT_STATUS_SUCCESS) { + if (pevent->data[1] == BT_PS_ENABLE) priv->adapter->psmode = 1; else priv->adapter->psmode = 0; @@ -353,16 +363,16 @@ bt_process_event(bt_private * priv, struct sk_buff *skb) } break; case BT_CMD_HOST_SLEEP_CONFIG: - if (pEvent->data[3] == BT_STATUS_SUCCESS) { + if (pevent->data[3] == BT_STATUS_SUCCESS) { PRINTM(CMD, "BT: %s: gpio=0x%x, gap=0x%x\n", - m_dev->name, pEvent->data[1], pEvent->data[2]); + m_dev->name, pevent->data[1], pevent->data[2]); } else { PRINTM(CMD, "BT: %s: HSCFG Command Fail\n", m_dev->name); } break; case BT_CMD_HOST_SLEEP_ENABLE: - if (pEvent->data[1] == BT_STATUS_SUCCESS) { + if (pevent->data[1] == BT_STATUS_SUCCESS) { priv->adapter->hs_state = HS_ACTIVATED; if (priv->adapter->suspend_fail == FALSE) { #ifdef SDIO_SUSPEND_RESUME @@ -386,45 +396,44 @@ bt_process_event(bt_private * priv, struct sk_buff *skb) break; case BT_CMD_MODULE_CFG_REQ: if ((priv->bt_dev.sendcmdflag == TRUE) && - ((pEvent->data[1] == MODULE_BRINGUP_REQ) - || (pEvent->data[1] == MODULE_SHUTDOWN_REQ))) { - if (pEvent->data[1] == MODULE_BRINGUP_REQ) { + ((pevent->data[1] == MODULE_BRINGUP_REQ) + || (pevent->data[1] == MODULE_SHUTDOWN_REQ))) { + if (pevent->data[1] == MODULE_BRINGUP_REQ) { PRINTM(CMD, "BT: EVENT %s:%s\n", m_dev->name, - (pEvent->data[2] && (pEvent->data[2] != + (pevent->data[2] && (pevent->data[2] != MODULE_CFG_RESP_ALREADY_UP)) ? "Bring up Fail" : "Bring up success"); - priv->bt_dev.devType = pEvent->data[3]; + priv->bt_dev.devType = pevent->data[3]; PRINTM(CMD, "devType:%s\n", - (pEvent->data[3] == + (pevent->data[3] == DEV_TYPE_AMP) ? "AMP controller" : "BR/EDR controller"); - priv->bt_dev.devFeature = pEvent->data[4]; + priv->bt_dev.devFeature = pevent->data[4]; PRINTM(CMD, "devFeature: %s, %s, %s, %s, %s\n", - ((pEvent-> + ((pevent-> data[4] & DEV_FEATURE_BT) ? "BT Feature" : "No BT Feature"), - ((pEvent-> + ((pevent-> data[4] & DEV_FEATURE_BTAMP) ? "BTAMP Feature" : "No BTAMP Feature"), - ((pEvent-> + ((pevent-> data[4] & DEV_FEATURE_BLE) ? "BLE Feature" : "No BLE Feature"), - ((pEvent-> + ((pevent-> data[4] & DEV_FEATURE_FM) ? "FM Feature" : "No FM Feature"), - ((pEvent-> + ((pevent-> data[4] & DEV_FEATURE_NFC) ? "NFC Feature" : "No NFC Feature")); } - if (pEvent->data[1] == MODULE_SHUTDOWN_REQ) { + if (pevent->data[1] == MODULE_SHUTDOWN_REQ) { PRINTM(CMD, "BT: EVENT %s:%s\n", m_dev->name, - (pEvent-> - data[2]) ? "Shut down Fail" : - "Shut down success"); + (pevent->data[2]) ? "Shut down Fail" + : "Shut down success"); } - if (pEvent->data[2]) { + if (pevent->data[2]) { priv->bt_dev.sendcmdflag = FALSE; priv->adapter->cmd_complete = TRUE; wake_up_interruptible(&priv->adapter-> @@ -436,14 +445,14 @@ bt_process_event(bt_private * priv, struct sk_buff *skb) } break; case BT_EVENT_POWER_STATE: - if (pEvent->data[1] == BT_PS_SLEEP) + if (pevent->data[1] == BT_PS_SLEEP) priv->adapter->ps_state = PS_SLEEP; PRINTM(CMD, "BT: EVENT %s:%s\n", m_dev->name, (priv->adapter->ps_state) ? "PS_SLEEP" : "PS_AWAKE"); break; case BT_CMD_SDIO_PULL_CFG_REQ: - if (pEvent->data[pEvent->length - 1] == BT_STATUS_SUCCESS) + if (pevent->data[pevent->length - 1] == BT_STATUS_SUCCESS) PRINTM(CMD, "BT: %s: SDIO pull configuration success\n", m_dev->name); @@ -454,7 +463,7 @@ bt_process_event(bt_private * priv, struct sk_buff *skb) } break; default: - PRINTM(CMD, "BT: Unknown Event=%d %s\n", pEvent->data[0], + PRINTM(CMD, "BT: Unknown Event=%d %s\n", pevent->data[0], m_dev->name); ret = BT_STATUS_FAILURE; break; @@ -507,14 +516,14 @@ bt_cmd_timeout_func(bt_adapter * adapter, u16 cmd) * * @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 bt_send_reset_command(bt_private * priv) { struct sk_buff *skb = NULL; u8 ret = BT_STATUS_SUCCESS; - BT_HCI_CMD *pCmd; + BT_HCI_CMD *pcmd; ENTER(); skb = bt_skb_alloc(sizeof(BT_HCI_CMD), GFP_ATOMIC); if (skb == NULL) { @@ -522,10 +531,10 @@ bt_send_reset_command(bt_private * priv) ret = BT_STATUS_FAILURE; goto exit; } - pCmd = (BT_HCI_CMD *) skb->tail; - pCmd->ocf_ogf = (RESET_OGF << 10) | BT_CMD_RESET; - pCmd->length = 0x00; - pCmd->cmd_type = 0x00; + pcmd = (BT_HCI_CMD *) skb->data; + pcmd->ocf_ogf = (RESET_OGF << 10) | BT_CMD_RESET; + pcmd->length = 0x00; + pcmd->cmd_type = 0x00; bt_cb(skb)->pkt_type = HCI_COMMAND_PKT; skb_put(skb, 3); skb->dev = (void *)(&(priv->bt_dev.m_dev[BT_SEQ])); @@ -533,7 +542,7 @@ bt_send_reset_command(bt_private * priv) priv->bt_dev.sendcmdflag = TRUE; priv->bt_dev.send_cmd_ocf = BT_CMD_RESET; priv->adapter->cmd_complete = FALSE; - PRINTM(CMD, "Queue Reset Command(0x%x)\n", pCmd->ocf_ogf); + PRINTM(CMD, "Queue Reset Command(0x%x)\n", pcmd->ocf_ogf); wake_up_interruptible(&priv->MainThread.waitQ); if (!os_wait_interruptible_timeout (priv->adapter->cmd_wait_q, priv->adapter->cmd_complete, @@ -568,7 +577,7 @@ bt_send_module_cfg_cmd(bt_private * priv, int subcmd) { struct sk_buff *skb = NULL; u8 ret = BT_STATUS_SUCCESS; - BT_CMD *pCmd; + BT_CMD *pcmd; ENTER(); skb = bt_skb_alloc(sizeof(BT_CMD), GFP_ATOMIC); if (skb == NULL) { @@ -576,18 +585,18 @@ bt_send_module_cfg_cmd(bt_private * priv, int subcmd) ret = BT_STATUS_FAILURE; goto exit; } - pCmd = (BT_CMD *) skb->data; - pCmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_MODULE_CFG_REQ; - pCmd->length = 1; - pCmd->data[0] = subcmd; + pcmd = (BT_CMD *) skb->data; + pcmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_MODULE_CFG_REQ; + pcmd->length = 1; + pcmd->data[0] = subcmd; bt_cb(skb)->pkt_type = MRVL_VENDOR_PKT; - skb_put(skb, sizeof(BT_CMD)); + skb_put(skb, BT_CMD_HEADER_SIZE + pcmd->length); skb->dev = (void *)(&(priv->bt_dev.m_dev[BT_SEQ])); skb_queue_head(&priv->adapter->tx_queue, skb); priv->bt_dev.sendcmdflag = TRUE; priv->bt_dev.send_cmd_ocf = BT_CMD_MODULE_CFG_REQ; priv->adapter->cmd_complete = FALSE; - PRINTM(CMD, "Queue module cfg Command(0x%x)\n", pCmd->ocf_ogf); + PRINTM(CMD, "Queue module cfg Command(0x%x)\n", pcmd->ocf_ogf); wake_up_interruptible(&priv->MainThread.waitQ); /* On some Android platforms certain delay is needed for HCI daemon to @@ -622,7 +631,7 @@ bt_enable_ps(bt_private * priv) { struct sk_buff *skb = NULL; u8 ret = BT_STATUS_SUCCESS; - BT_CMD *pCmd; + BT_CMD *pcmd; ENTER(); skb = bt_skb_alloc(sizeof(BT_CMD), GFP_ATOMIC); if (skb == NULL) { @@ -630,25 +639,25 @@ bt_enable_ps(bt_private * priv) ret = BT_STATUS_FAILURE; goto exit; } - pCmd = (BT_CMD *) skb->data; - pCmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_AUTO_SLEEP_MODE; + pcmd = (BT_CMD *) skb->data; + pcmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_AUTO_SLEEP_MODE; if (priv->bt_dev.psmode) - pCmd->data[0] = BT_PS_ENABLE; + pcmd->data[0] = BT_PS_ENABLE; else - pCmd->data[0] = BT_PS_DISABLE; + pcmd->data[0] = BT_PS_DISABLE; if (priv->bt_dev.idle_timeout) { - pCmd->length = 3; - pCmd->data[1] = (u8) (priv->bt_dev.idle_timeout & 0x00ff); - pCmd->data[2] = (priv->bt_dev.idle_timeout & 0xff00) >> 8; + pcmd->length = 3; + pcmd->data[1] = (u8) (priv->bt_dev.idle_timeout & 0x00ff); + pcmd->data[2] = (priv->bt_dev.idle_timeout & 0xff00) >> 8; } else { - pCmd->length = 1; + pcmd->length = 1; } bt_cb(skb)->pkt_type = MRVL_VENDOR_PKT; - skb_put(skb, sizeof(BT_CMD)); + skb_put(skb, BT_CMD_HEADER_SIZE + pcmd->length); skb->dev = (void *)(&(priv->bt_dev.m_dev[BT_SEQ])); skb_queue_head(&priv->adapter->tx_queue, skb); - PRINTM(CMD, "Queue PSMODE Command(0x%x):%d\n", pCmd->ocf_ogf, - pCmd->data[0]); + PRINTM(CMD, "Queue PSMODE Command(0x%x):%d\n", pcmd->ocf_ogf, + pcmd->data[0]); priv->bt_dev.sendcmdflag = TRUE; priv->bt_dev.send_cmd_ocf = BT_CMD_AUTO_SLEEP_MODE; priv->adapter->cmd_complete = FALSE; @@ -676,7 +685,7 @@ bt_send_hscfg_cmd(bt_private * priv) { struct sk_buff *skb = NULL; u8 ret = BT_STATUS_SUCCESS; - BT_CMD *pCmd; + BT_CMD *pcmd; ENTER(); skb = bt_skb_alloc(sizeof(BT_CMD), GFP_ATOMIC); if (skb == NULL) { @@ -684,17 +693,17 @@ bt_send_hscfg_cmd(bt_private * priv) ret = BT_STATUS_FAILURE; goto exit; } - pCmd = (BT_CMD *) skb->data; - pCmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_HOST_SLEEP_CONFIG; - pCmd->length = 2; - pCmd->data[0] = (priv->bt_dev.gpio_gap & 0xff00) >> 8; - pCmd->data[1] = (u8) (priv->bt_dev.gpio_gap & 0x00ff); + pcmd = (BT_CMD *) skb->data; + pcmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_HOST_SLEEP_CONFIG; + pcmd->length = 2; + pcmd->data[0] = (priv->bt_dev.gpio_gap & 0xff00) >> 8; + pcmd->data[1] = (u8) (priv->bt_dev.gpio_gap & 0x00ff); bt_cb(skb)->pkt_type = MRVL_VENDOR_PKT; - skb_put(skb, sizeof(BT_CMD)); + skb_put(skb, BT_CMD_HEADER_SIZE + pcmd->length); skb->dev = (void *)(&(priv->bt_dev.m_dev[BT_SEQ])); skb_queue_head(&priv->adapter->tx_queue, skb); PRINTM(CMD, "Queue HSCFG Command(0x%x),gpio=0x%x,gap=0x%x\n", - pCmd->ocf_ogf, pCmd->data[0], pCmd->data[1]); + pcmd->ocf_ogf, pcmd->data[0], pcmd->data[1]); priv->bt_dev.sendcmdflag = TRUE; priv->bt_dev.send_cmd_ocf = BT_CMD_HOST_SLEEP_CONFIG; priv->adapter->cmd_complete = FALSE; @@ -722,7 +731,7 @@ bt_send_sdio_pull_ctrl_cmd(bt_private * priv) { struct sk_buff *skb = NULL; u8 ret = BT_STATUS_SUCCESS; - BT_CMD *pCmd; + BT_CMD *pcmd; ENTER(); skb = bt_skb_alloc(sizeof(BT_CMD), GFP_ATOMIC); if (skb == NULL) { @@ -730,21 +739,21 @@ bt_send_sdio_pull_ctrl_cmd(bt_private * priv) ret = BT_STATUS_FAILURE; goto exit; } - pCmd = (BT_CMD *) skb->data; - pCmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_SDIO_PULL_CFG_REQ; - pCmd->length = 4; - pCmd->data[0] = (priv->bt_dev.sdio_pull_cfg & 0x000000ff); - pCmd->data[1] = (priv->bt_dev.sdio_pull_cfg & 0x0000ff00) >> 8; - pCmd->data[2] = (priv->bt_dev.sdio_pull_cfg & 0x00ff0000) >> 16; - pCmd->data[3] = (priv->bt_dev.sdio_pull_cfg & 0xff000000) >> 24; + pcmd = (BT_CMD *) skb->data; + pcmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_SDIO_PULL_CFG_REQ; + pcmd->length = 4; + pcmd->data[0] = (priv->bt_dev.sdio_pull_cfg & 0x000000ff); + pcmd->data[1] = (priv->bt_dev.sdio_pull_cfg & 0x0000ff00) >> 8; + pcmd->data[2] = (priv->bt_dev.sdio_pull_cfg & 0x00ff0000) >> 16; + pcmd->data[3] = (priv->bt_dev.sdio_pull_cfg & 0xff000000) >> 24; bt_cb(skb)->pkt_type = MRVL_VENDOR_PKT; - skb_put(skb, sizeof(BT_CMD)); + skb_put(skb, BT_CMD_HEADER_SIZE + pcmd->length); skb->dev = (void *)(&(priv->bt_dev.m_dev[BT_SEQ])); skb_queue_head(&priv->adapter->tx_queue, skb); PRINTM(CMD, "Queue SDIO PULL CFG Command(0x%x), PullUp=0x%x%x,PullDown=0x%x%x\n", - pCmd->ocf_ogf, pCmd->data[1], pCmd->data[0], - pCmd->data[3], pCmd->data[2]); + pcmd->ocf_ogf, pcmd->data[1], pcmd->data[0], + pcmd->data[3], pcmd->data[2]); priv->bt_dev.sendcmdflag = TRUE; priv->bt_dev.send_cmd_ocf = BT_CMD_SDIO_PULL_CFG_REQ; priv->adapter->cmd_complete = FALSE; @@ -776,7 +785,7 @@ fm_set_intr_mask(bt_private * priv, u32 mask) { struct sk_buff *skb = NULL; u8 ret = BT_STATUS_SUCCESS; - BT_CMD *pCmd; + BT_CMD *pcmd; ENTER(); skb = bt_skb_alloc(sizeof(BT_CMD), GFP_ATOMIC); @@ -785,14 +794,14 @@ fm_set_intr_mask(bt_private * priv, u32 mask) ret = BT_STATUS_FAILURE; goto exit; } - pCmd = (BT_CMD *) skb->data; - pCmd->ocf_ogf = (VENDOR_OGF << 10) | FM_CMD; - pCmd->length = 0x05; - pCmd->data[0] = FM_SET_INTR_MASK; - memcpy(&pCmd->data[1], &mask, sizeof(mask)); + pcmd = (BT_CMD *) skb->data; + pcmd->ocf_ogf = (VENDOR_OGF << 10) | FM_CMD; + pcmd->length = 0x05; + pcmd->data[0] = FM_SET_INTR_MASK; + memcpy(&pcmd->data[1], &mask, sizeof(mask)); PRINTM(CMD, "FM set intr mask=0x%x\n", mask); bt_cb(skb)->pkt_type = HCI_COMMAND_PKT; - skb_put(skb, sizeof(BT_CMD)); + skb_put(skb, BT_CMD_HEADER_SIZE + pcmd->length); skb->dev = (void *)(&(priv->bt_dev.m_dev[FM_SEQ])); skb_queue_head(&priv->adapter->tx_queue, skb); priv->bt_dev.sendcmdflag = TRUE; @@ -823,7 +832,7 @@ bt_enable_hs(bt_private * priv) { struct sk_buff *skb = NULL; u8 ret = BT_STATUS_SUCCESS; - BT_CMD *pCmd; + BT_CMD *pcmd; ENTER(); skb = bt_skb_alloc(sizeof(BT_CMD), GFP_ATOMIC); if (skb == NULL) { @@ -832,16 +841,16 @@ bt_enable_hs(bt_private * priv) goto exit; } priv->adapter->suspend_fail = FALSE; - pCmd = (BT_CMD *) skb->data; - pCmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_HOST_SLEEP_ENABLE; - pCmd->length = 0; + pcmd = (BT_CMD *) skb->data; + pcmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_HOST_SLEEP_ENABLE; + pcmd->length = 0; bt_cb(skb)->pkt_type = MRVL_VENDOR_PKT; - skb_put(skb, sizeof(BT_CMD)); + skb_put(skb, BT_CMD_HEADER_SIZE + pcmd->length); skb->dev = (void *)(&(priv->bt_dev.m_dev[BT_SEQ])); skb_queue_head(&priv->adapter->tx_queue, skb); priv->bt_dev.sendcmdflag = TRUE; priv->bt_dev.send_cmd_ocf = BT_CMD_HOST_SLEEP_ENABLE; - PRINTM(CMD, "Queue hs enable Command(0x%x)\n", pCmd->ocf_ogf); + PRINTM(CMD, "Queue hs enable Command(0x%x)\n", pcmd->ocf_ogf); wake_up_interruptible(&priv->MainThread.waitQ); if (!os_wait_interruptible_timeout (priv->adapter->cmd_wait_q, priv->adapter->hs_state, @@ -884,7 +893,7 @@ bt_set_ble_deepsleep(bt_private * priv, int mode) { struct sk_buff *skb = NULL; u8 ret = BT_STATUS_SUCCESS; - BT_BLE_CMD *pCmd; + BT_BLE_CMD *pcmd; ENTER(); skb = bt_skb_alloc(sizeof(BT_BLE_CMD), GFP_ATOMIC); if (skb == NULL) { @@ -892,10 +901,10 @@ bt_set_ble_deepsleep(bt_private * priv, int mode) ret = BT_STATUS_FAILURE; goto exit; } - pCmd = (BT_BLE_CMD *) skb->data; - pCmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_BLE_DEEP_SLEEP; - pCmd->length = 1; - pCmd->deepsleep = mode; + pcmd = (BT_BLE_CMD *) skb->data; + pcmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_BLE_DEEP_SLEEP; + pcmd->length = 1; + pcmd->deepsleep = mode; bt_cb(skb)->pkt_type = MRVL_VENDOR_PKT; skb_put(skb, sizeof(BT_BLE_CMD)); skb->dev = (void *)(&(priv->bt_dev.m_dev[BT_SEQ])); @@ -903,7 +912,7 @@ bt_set_ble_deepsleep(bt_private * priv, int mode) priv->bt_dev.sendcmdflag = TRUE; priv->bt_dev.send_cmd_ocf = BT_CMD_BLE_DEEP_SLEEP; priv->adapter->cmd_complete = FALSE; - PRINTM(CMD, "BT: Set BLE deepsleep = %d (0x%x)\n", mode, pCmd->ocf_ogf); + PRINTM(CMD, "BT: Set BLE deepsleep = %d (0x%x)\n", mode, pcmd->ocf_ogf); wake_up_interruptible(&priv->MainThread.waitQ); if (!os_wait_interruptible_timeout (priv->adapter->cmd_wait_q, priv->adapter->cmd_complete, @@ -929,7 +938,7 @@ bt_get_fw_version(bt_private * priv) { struct sk_buff *skb = NULL; u8 ret = BT_STATUS_SUCCESS; - BT_HCI_CMD *pCmd; + BT_HCI_CMD *pcmd; ENTER(); skb = bt_skb_alloc(sizeof(BT_HCI_CMD), GFP_ATOMIC); if (skb == NULL) { @@ -937,10 +946,10 @@ bt_get_fw_version(bt_private * priv) ret = BT_STATUS_FAILURE; goto exit; } - pCmd = (BT_HCI_CMD *) skb->data; - pCmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_GET_FW_VERSION; - pCmd->length = 0x01; - pCmd->cmd_type = 0x00; + pcmd = (BT_HCI_CMD *) skb->data; + pcmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_GET_FW_VERSION; + pcmd->length = 0x01; + pcmd->cmd_type = 0x00; bt_cb(skb)->pkt_type = MRVL_VENDOR_PKT; skb_put(skb, 4); skb->dev = (void *)(&(priv->bt_dev.m_dev[BT_SEQ])); @@ -974,7 +983,7 @@ bt_set_mac_address(bt_private * priv, u8 * mac) { struct sk_buff *skb = NULL; u8 ret = BT_STATUS_SUCCESS; - BT_HCI_CMD *pCmd; + BT_HCI_CMD *pcmd; int i = 0; ENTER(); skb = bt_skb_alloc(sizeof(BT_HCI_CMD), GFP_ATOMIC); @@ -983,13 +992,13 @@ bt_set_mac_address(bt_private * priv, u8 * mac) ret = BT_STATUS_FAILURE; goto exit; } - pCmd = (BT_HCI_CMD *) skb->data; - pCmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_CONFIG_MAC_ADDR; - pCmd->length = 8; - pCmd->cmd_type = MRVL_VENDOR_PKT; - pCmd->cmd_len = 6; + pcmd = (BT_HCI_CMD *) skb->data; + pcmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_CONFIG_MAC_ADDR; + pcmd->length = 8; + pcmd->cmd_type = MRVL_VENDOR_PKT; + pcmd->cmd_len = 6; for (i = 0; i < 6; i++) - pCmd->data[i] = mac[5 - i]; + pcmd->data[i] = mac[5 - i]; bt_cb(skb)->pkt_type = MRVL_VENDOR_PKT; skb_put(skb, sizeof(BT_HCI_CMD)); skb->dev = (void *)(&(priv->bt_dev.m_dev[BT_SEQ])); @@ -997,8 +1006,8 @@ bt_set_mac_address(bt_private * priv, u8 * mac) priv->bt_dev.sendcmdflag = TRUE; priv->bt_dev.send_cmd_ocf = BT_CMD_CONFIG_MAC_ADDR; priv->adapter->cmd_complete = FALSE; - PRINTM(CMD, "BT: Set mac addr %02x:%02x:%02x:%02x:%02x:%02x (0x%x)\n", - mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], pCmd->ocf_ogf); + PRINTM(CMD, "BT: Set mac addr " MACSTR " (0x%x)\n", MAC2STR(mac), + pcmd->ocf_ogf); wake_up_interruptible(&priv->MainThread.waitQ); if (!os_wait_interruptible_timeout (priv->adapter->cmd_wait_q, priv->adapter->cmd_complete, @@ -1026,11 +1035,11 @@ bt_load_cal_data(bt_private * priv, u8 * config_data, u8 * mac) { struct sk_buff *skb = NULL; u8 ret = BT_STATUS_SUCCESS; - BT_CMD *pCmd; + BT_CMD *pcmd; int i = 0; - // u8 config_data[28] = {0x37 0x01 0x1c 0x00 0xFF 0xFF 0xFF 0xFF - // 0x01 0x7f 0x04 0x02 0x00 0x00 0xBA 0xCE - // 0xC0 0xC6 0x2D 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xF0}; + /* u8 config_data[28] = {0x37 0x01 0x1c 0x00 0xFF 0xFF 0xFF 0xFF 0x01 + 0x7f 0x04 0x02 0x00 0x00 0xBA 0xCE 0xC0 0xC6 0x2D 0x00 0x00 0x00 + 0x00 0x00 0x00 0x00 0xF0}; */ ENTER(); skb = bt_skb_alloc(sizeof(BT_CMD), GFP_ATOMIC); @@ -1039,31 +1048,30 @@ bt_load_cal_data(bt_private * priv, u8 * config_data, u8 * mac) ret = BT_STATUS_FAILURE; goto exit; } - pCmd = (BT_CMD *) skb->data; - pCmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_LOAD_CONFIG_DATA; - pCmd->length = 0x20; - pCmd->data[0] = 0x00; - pCmd->data[1] = 0x00; - pCmd->data[2] = 0x00; - pCmd->data[3] = 0x1C; - // swip cal-data byte - for (i = 4; i < 32; i++) { - pCmd->data[i] = config_data[(i / 4) * 8 - 1 - i]; - } + pcmd = (BT_CMD *) skb->data; + pcmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_LOAD_CONFIG_DATA; + pcmd->length = 0x20; + pcmd->data[0] = 0x00; + pcmd->data[1] = 0x00; + pcmd->data[2] = 0x00; + pcmd->data[3] = 0x1C; + /* swip cal-data byte */ + for (i = 4; i < 32; i++) + pcmd->data[i] = config_data[(i / 4) * 8 - 1 - i]; if (mac != NULL) { - pCmd->data[2] = 0x01; // skip checksum + pcmd->data[2] = 0x01; /* skip checksum */ for (i = 24; i < 30; i++) - pCmd->data[i] = mac[29 - i]; + pcmd->data[i] = mac[29 - i]; } bt_cb(skb)->pkt_type = MRVL_VENDOR_PKT; - skb_put(skb, sizeof(BT_CMD)); + skb_put(skb, BT_CMD_HEADER_SIZE + pcmd->length); skb->dev = (void *)(&(priv->bt_dev.m_dev[BT_SEQ])); skb_queue_head(&priv->adapter->tx_queue, skb); priv->bt_dev.sendcmdflag = TRUE; priv->bt_dev.send_cmd_ocf = BT_CMD_LOAD_CONFIG_DATA; priv->adapter->cmd_complete = FALSE; - DBG_HEXDUMP(DAT_D, "calirate data: ", pCmd->data, 32); + DBG_HEXDUMP(DAT_D, "calirate data: ", pcmd->data, 32); wake_up_interruptible(&priv->MainThread.waitQ); if (!os_wait_interruptible_timeout (priv->adapter->cmd_wait_q, priv->adapter->cmd_complete, @@ -1091,7 +1099,7 @@ bt_write_reg(bt_private * priv, u8 type, u32 offset, u16 value) { struct sk_buff *skb = NULL; u8 ret = BT_STATUS_SUCCESS; - BT_CSU_CMD *pCmd; + BT_CSU_CMD *pcmd; ENTER(); skb = bt_skb_alloc(sizeof(BT_CSU_CMD), GFP_ATOMIC); if (skb == NULL) { @@ -1099,16 +1107,16 @@ bt_write_reg(bt_private * priv, u8 type, u32 offset, u16 value) ret = BT_STATUS_FAILURE; goto exit; } - pCmd = (BT_CSU_CMD *) skb->data; - pCmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_CSU_WRITE_REG; - pCmd->length = 7; - pCmd->type = type; - pCmd->offset[0] = (offset & 0x000000ff); - pCmd->offset[1] = (offset & 0x0000ff00) >> 8; - pCmd->offset[2] = (offset & 0x00ff0000) >> 16; - pCmd->offset[3] = (offset & 0xff000000) >> 24; - pCmd->value[0] = (value & 0x00ff); - pCmd->value[1] = (value & 0xff00) >> 8; + pcmd = (BT_CSU_CMD *) skb->data; + pcmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_CSU_WRITE_REG; + pcmd->length = 7; + pcmd->type = type; + pcmd->offset[0] = (offset & 0x000000ff); + pcmd->offset[1] = (offset & 0x0000ff00) >> 8; + pcmd->offset[2] = (offset & 0x00ff0000) >> 16; + pcmd->offset[3] = (offset & 0xff000000) >> 24; + pcmd->value[0] = (value & 0x00ff); + pcmd->value[1] = (value & 0xff00) >> 8; bt_cb(skb)->pkt_type = MRVL_VENDOR_PKT; skb_put(skb, sizeof(BT_CSU_CMD)); skb->dev = (void *)(&(priv->bt_dev.m_dev[BT_SEQ])); @@ -1143,7 +1151,8 @@ bt_restore_tx_queue(bt_private * priv) struct sk_buff *skb = NULL; while (!skb_queue_empty(&priv->adapter->pending_queue)) { skb = skb_dequeue(&priv->adapter->pending_queue); - skb_queue_tail(&priv->adapter->tx_queue, skb); + if (skb) + skb_queue_tail(&priv->adapter->tx_queue, skb); } wake_up_interruptible(&priv->MainThread.waitQ); } @@ -1198,7 +1207,7 @@ bt_prepare_command(bt_private * priv) * @return BT_STATUS_SUCCESS or BT_STATUS_FAILURE */ static int -SendSinglePacket(bt_private * priv, struct sk_buff *skb) +send_single_packet(bt_private * priv, struct sk_buff *skb) { int ret; ENTER(); @@ -1298,11 +1307,11 @@ done: void bt_free_adapter(bt_private * priv) { - bt_adapter *Adapter = priv->adapter; + bt_adapter *adapter = priv->adapter; ENTER(); skb_queue_purge(&priv->adapter->tx_queue); /* Free the adapter object itself */ - kfree(Adapter); + kfree(adapter); priv->adapter = NULL; LEAVE(); @@ -1382,7 +1391,7 @@ mdev_send_frame(struct m_dev *m_dev, struct sk_buff *skb) priv->debug_device_pending = 1; priv->debug_ocf_ogf[0] = skb->data[0]; priv->debug_ocf_ogf[1] = skb->data[1]; - PRINTM(CMD, "debug_ocf_ogf[0]=0x%x debug_ocf_ogf[1]=0x%x \n", + PRINTM(CMD, "debug_ocf_ogf[0]=0x%x debug_ocf_ogf[1]=0x%x\n", priv->debug_ocf_ogf[0], priv->debug_ocf_ogf[1]); } @@ -1522,6 +1531,7 @@ init_m_dev(struct m_dev *m_dev) m_dev->ioctl = mdev_ioctl; m_dev->query = mdev_query; m_dev->owner = THIS_MODULE; + m_dev->poweroff = mdev_poweroff; } @@ -1538,7 +1548,7 @@ bt_service_main_thread(void *data) { bt_thread *thread = data; bt_private *priv = thread->priv; - bt_adapter *Adapter = priv->adapter; + bt_adapter *adapter = priv->adapter; wait_queue_t wait; struct sk_buff *skb; ENTER(); @@ -1558,17 +1568,17 @@ bt_service_main_thread(void *data) } OS_SET_THREAD_STATE(TASK_RUNNING); remove_wait_queue(&thread->waitQ, &wait); - if (kthread_should_stop() || Adapter->SurpriseRemoved) { + if (kthread_should_stop() || adapter->SurpriseRemoved) { PRINTM(INFO, "main-thread: break from main thread: " "SurpriseRemoved=0x%x\n", - Adapter->SurpriseRemoved); + adapter->SurpriseRemoved); break; } PRINTM(INFO, "Main: Thread waking up...\n"); if (priv->adapter->IntCounter) { OS_INT_DISABLE; - Adapter->IntCounter = 0; + adapter->IntCounter = 0; OS_INT_RESTORE; sbi_get_int_status(priv); } else if ((priv->adapter->ps_state == PS_SLEEP) && @@ -1583,7 +1593,7 @@ bt_service_main_thread(void *data) if (!skb_queue_empty(&priv->adapter->tx_queue)) { skb = skb_dequeue(&priv->adapter->tx_queue); if (skb) { - if (SendSinglePacket(priv, skb)) + if (send_single_packet(priv, skb)) ((struct m_dev *)skb->dev)-> stat.err_tx++; else @@ -1629,6 +1639,75 @@ bt_interrupt(struct m_dev *m_dev) LEAVE(); } +static void +char_dev_release_dynamic(struct kobject *kobj) +{ + struct char_dev *cdev = container_of(kobj, struct char_dev, kobj); + ENTER(); + PRINTM(INFO, "free char_dev\n"); + kfree(cdev); + LEAVE(); +} + +static struct kobj_type ktype_char_dev_dynamic = { + .release = char_dev_release_dynamic, +}; + +static struct char_dev * +alloc_char_dev(void) +{ + struct char_dev *cdev; + ENTER(); + cdev = kzalloc(sizeof(struct char_dev), GFP_KERNEL); + if (cdev) { + kobject_init(&cdev->kobj, &ktype_char_dev_dynamic); + PRINTM(INFO, "alloc char_dev\n"); + } + return cdev; +} + +static void +bt_private_dynamic_release(struct kobject *kobj) +{ + bt_private *priv = container_of(kobj, bt_private, kobj); + ENTER(); + PRINTM(INFO, "free bt priv\n"); + kfree(priv); + LEAVE(); +} + +static struct kobj_type ktype_bt_private_dynamic = { + .release = bt_private_dynamic_release, +}; + +static bt_private * +bt_alloc_priv(void) +{ + bt_private *priv; + ENTER(); + priv = kzalloc(sizeof(bt_private), GFP_KERNEL); + if (priv) { + kobject_init(&priv->kobj, &ktype_bt_private_dynamic); + PRINTM(INFO, "alloc bt priv\n"); + } + LEAVE(); + return priv; +} + +struct kobject * +bt_priv_get(bt_private * priv) +{ + PRINTM(INFO, "bt priv get object"); + return kobject_get(&priv->kobj); +} + +void +bt_priv_put(bt_private * priv) +{ + PRINTM(INFO, "bt priv put object"); + kobject_put(&priv->kobj); +} + /** * @brief Module configuration and register device * @@ -1693,7 +1772,8 @@ sbi_register_conf_dpc(bt_private * priv) } } #ifdef SDIO_SUSPEND_RESUME - priv->bt_dev.gpio_gap = 0xffff; + + priv->bt_dev.gpio_gap = 0x0464; ret = bt_send_hscfg_cmd(priv); if (ret < 0) { PRINTM(FATAL, "Send HSCFG failed!\n"); @@ -1708,7 +1788,7 @@ sbi_register_conf_dpc(bt_private * priv) priv->bt_dev.m_dev[BT_SEQ].dev_type = BT_AMP_TYPE; } /* block all the packet from bluez */ - if (init_cfg || cal_cfg) + if (init_cfg || cal_cfg || bt_mac) priv->adapter->tx_lock = TRUE; if (mbt_dev) { @@ -1726,7 +1806,7 @@ sbi_register_conf_dpc(bt_private * priv) atomic_set(&mbt_dev->promisc, 0); /** alloc char dev node */ - char_dev = kzalloc(sizeof(struct char_dev), GFP_KERNEL); + char_dev = alloc_char_dev(); if (!char_dev) { class_destroy(chardev_class); ret = -ENOMEM; @@ -1748,6 +1828,10 @@ sbi_register_conf_dpc(bt_private * priv) mbtchar_minor++; PRINTM(MSG, "BT: Create %s\n", dev_file); + /** register m_dev to BT char device */ + priv->bt_dev.m_dev[BT_SEQ].index = char_dev->minor; + char_dev->m_dev = &(priv->bt_dev.m_dev[BT_SEQ]); + /** create BT char device node */ register_char_dev(char_dev, chardev_class, MODULE_NAME, mbt_dev->name); @@ -1756,10 +1840,6 @@ sbi_register_conf_dpc(bt_private * priv) mbtchar_chown(dev_file, AID_SYSTEM, AID_BLUETOOTH); mbtchar_chmod(dev_file, 0666); - /** register m_dev to BT char device */ - priv->bt_dev.m_dev[BT_SEQ].index = char_dev->minor; - char_dev->m_dev = &(priv->bt_dev.m_dev[BT_SEQ]); - /** create proc device */ snprintf(priv->bt_dev.m_dev[BT_SEQ].name, sizeof(priv->bt_dev.m_dev[BT_SEQ].name), @@ -1788,7 +1868,7 @@ sbi_register_conf_dpc(bt_private * priv) priv->bt_dev.m_dev[FM_SEQ].read_continue_flag = 0; /** create char device for FM */ - char_dev = kzalloc(sizeof(struct char_dev), GFP_KERNEL); + char_dev = alloc_char_dev(); if (!char_dev) { class_destroy(chardev_class); ret = -ENOMEM; @@ -1807,6 +1887,10 @@ sbi_register_conf_dpc(bt_private * priv) PRINTM(MSG, "BT: Create %s\n", dev_file); fmchar_minor++; + /** register m_dev to FM char device */ + priv->bt_dev.m_dev[FM_SEQ].index = char_dev->minor; + char_dev->m_dev = &(priv->bt_dev.m_dev[FM_SEQ]); + /** register char dev */ register_char_dev(char_dev, chardev_class, MODULE_NAME, fm_dev->name); @@ -1814,10 +1898,6 @@ sbi_register_conf_dpc(bt_private * priv) /** chmod for FM char device */ mbtchar_chmod(dev_file, 0666); - /** register m_dev to FM char device */ - priv->bt_dev.m_dev[FM_SEQ].index = char_dev->minor; - char_dev->m_dev = &(priv->bt_dev.m_dev[FM_SEQ]); - /** create proc device */ snprintf(priv->bt_dev.m_dev[FM_SEQ].name, sizeof(priv->bt_dev.m_dev[FM_SEQ].name), fm_dev->name); @@ -1845,7 +1925,7 @@ sbi_register_conf_dpc(bt_private * priv) priv->bt_dev.m_dev[NFC_SEQ].read_continue_flag = 0; /** create char device for NFC */ - char_dev = kzalloc(sizeof(struct char_dev), GFP_KERNEL); + char_dev = alloc_char_dev(); if (!char_dev) { class_destroy(chardev_class); ret = -ENOMEM; @@ -1863,6 +1943,10 @@ sbi_register_conf_dpc(bt_private * priv) PRINTM(MSG, "BT: Create %s\n", dev_file); nfcchar_minor++; + /** register m_dev to NFC char device */ + priv->bt_dev.m_dev[NFC_SEQ].index = char_dev->minor; + char_dev->m_dev = &(priv->bt_dev.m_dev[NFC_SEQ]); + /** register char dev */ register_char_dev(char_dev, chardev_class, MODULE_NAME, nfc_dev->name); @@ -1870,10 +1954,6 @@ sbi_register_conf_dpc(bt_private * priv) /** chmod for NFC char device */ mbtchar_chmod(dev_file, 0666); - /** register m_dev to NFC char device */ - priv->bt_dev.m_dev[NFC_SEQ].index = char_dev->minor; - char_dev->m_dev = &(priv->bt_dev.m_dev[NFC_SEQ]); - /** create proc device */ snprintf(priv->bt_dev.m_dev[NFC_SEQ].name, sizeof(priv->bt_dev.m_dev[NFC_SEQ].name), @@ -1900,7 +1980,7 @@ sbi_register_conf_dpc(bt_private * priv) priv->bt_dev.m_dev[DEBUG_SEQ].driver_data = priv; /** create char device for Debug */ - char_dev = kzalloc(sizeof(struct char_dev), GFP_KERNEL); + char_dev = alloc_char_dev(); if (!char_dev) { class_destroy(chardev_class); ret = -ENOMEM; @@ -1919,16 +1999,14 @@ sbi_register_conf_dpc(bt_private * priv) debugchar_minor++; /** register char dev */ + priv->bt_dev.m_dev[DEBUG_SEQ].index = char_dev->minor; + char_dev->m_dev = &(priv->bt_dev.m_dev[DEBUG_SEQ]); register_char_dev(char_dev, chardev_class, MODULE_NAME, debug_dev->name); /** chmod for debug char device */ mbtchar_chmod(dev_file, 0666); - /** register m_dev to debug char device */ - priv->bt_dev.m_dev[DEBUG_SEQ].index = char_dev->minor; - char_dev->m_dev = &(priv->bt_dev.m_dev[DEBUG_SEQ]); - /** create proc device */ snprintf(priv->bt_dev.m_dev[DEBUG_SEQ].name, sizeof(priv->bt_dev.m_dev[DEBUG_SEQ].name), @@ -1954,7 +2032,7 @@ sbi_register_conf_dpc(bt_private * priv) goto done; } - if (cal_cfg) + if (cal_cfg) { if (BT_STATUS_SUCCESS != bt_cal_config(priv, cal_cfg, bt_mac)) { PRINTM(FATAL, "BT: Set cal data failed\n"); if (mbt_dev) { @@ -1970,11 +2048,24 @@ sbi_register_conf_dpc(bt_private * priv) ret = BT_STATUS_FAILURE; goto done; } - if (init_cfg || cal_cfg) { + } else if (bt_mac) { + PRINTM(INFO, + "Set BT mac_addr from insmod parametre bt_mac = %s\n", + bt_mac); + if (BT_STATUS_SUCCESS != bt_init_mac_address(priv, bt_mac)) { + PRINTM(FATAL, + "BT: Fail to set mac address from insmod parametre\n"); + ret = BT_STATUS_FAILURE; + goto done; + } + } + if (init_cfg || cal_cfg || bt_mac) { priv->adapter->tx_lock = FALSE; bt_restore_tx_queue(priv); } + bt_register_hostwake_irq(NULL); + /* Get FW version */ bt_get_fw_version(priv); snprintf(priv->adapter->drv_ver, MAX_VER_STR_LEN, @@ -2007,7 +2098,7 @@ bt_add_card(void *card) ENTER(); - priv = kzalloc(sizeof(bt_private), GFP_KERNEL); + priv = bt_alloc_priv(); if (!priv) { PRINTM(FATAL, "Can not allocate priv\n"); LEAVE(); @@ -2015,7 +2106,8 @@ bt_add_card(void *card) } /* allocate buffer for bt_adapter */ - if (!(priv->adapter = kzalloc(sizeof(bt_adapter), GFP_KERNEL))) { + priv->adapter = kzalloc(sizeof(bt_adapter), GFP_KERNEL); + if (!priv->adapter) { PRINTM(FATAL, "Allocate buffer for bt_adapter failed!\n"); goto err_kmalloc; } @@ -2067,7 +2159,7 @@ err_registerdev: err_kmalloc: if (priv->adapter) bt_free_adapter(priv); - kfree(priv); + bt_priv_put(priv); LEAVE(); return NULL; } @@ -2157,7 +2249,7 @@ bt_remove_card(void *card) } PRINTM(INFO, "Free Adapter\n"); bt_free_adapter(priv); - kfree(priv); + bt_priv_put(priv); LEAVE(); return BT_STATUS_SUCCESS; @@ -2172,7 +2264,7 @@ bt_remove_card(void *card) static int bt_set_carddetect(int on) { - PRINTM(MSG, "%s = %d\n", __FUNCTION__, on); + PRINTM(MSG, "%s = %d\n", __func__, on); if (bt_control_data && bt_control_data->set_carddetect) bt_control_data->set_carddetect(on); @@ -2188,7 +2280,7 @@ bt_set_carddetect(int on) static int bt_set_power(int on, unsigned long msec) { - PRINTM(MSG, "%s = %d\n", __FUNCTION__, on); + PRINTM(MSG, "%s = %d\n", __func__, on); if (bt_control_data && bt_control_data->set_power) bt_control_data->set_power(on); @@ -2197,6 +2289,58 @@ bt_set_power(int on, unsigned long msec) return 0; } +static irqreturn_t +bt_hostwake_isr(int irq, void *dev_id) +{ + PRINTM(INTR, "Recv hostwake isr\n"); + return IRQ_HANDLED; +} + +void +bt_enable_hostwake_irq(int flag) +{ + if (bt_irqres && irq_registered) { + PRINTM(INTR, "enable_hostwake_irq=%d\n", flag); + if (flag) { + enable_irq(bt_irqres->start); + enable_irq_wake(bt_irqres->start); + } else { + disable_irq_wake(bt_irqres->start); + disable_irq(bt_irqres->start); + } + } +} + +static void +bt_register_hostwake_irq(void *handle) +{ + if (bt_irqres && !irq_registered) { + irq_registered = + request_irq(bt_irqres->start, bt_hostwake_isr, + bt_irqres->flags, DRIVER_NAME, handle); + if (irq_registered < 0) + PRINTM(ERROR, "Couldn't acquire BT_HOST_WAKE IRQ\n"); + else { + irq_registered = 1; + enable_irq_wake(bt_irqres->start); + bt_enable_hostwake_irq(FALSE); + } + } +} + +void +mdev_poweroff(struct m_dev *m_dev) +{ + ENTER(); + + if (minicard_pwrup) { + bt_set_power(0, 0); + bt_set_carddetect(0); + } + + LEAVE(); +} + /** * @brief This function probes the platform-level device * @@ -2211,9 +2355,14 @@ bt_probe(struct platform_device *pdev) ENTER(); - bt_control_data = bt_ctrl; - bt_set_power(1, 0); /* Power On */ - bt_set_carddetect(1); /* CardDetect (0->1) */ + bt_irqres = platform_get_resource_byname(pdev, + IORESOURCE_IRQ, + IORESOURCE_NAME); + if (minicard_pwrup) { + bt_control_data = bt_ctrl; + bt_set_power(1, 0); /* Power On */ + bt_set_carddetect(1); /* CardDetect (0->1) */ + } LEAVE(); return 0; @@ -2233,9 +2382,16 @@ bt_remove(struct platform_device *pdev) ENTER(); - bt_control_data = bt_ctrl; - bt_set_power(0, 0); /* Power Off */ - bt_set_carddetect(0); /* CardDetect (1->0) */ + if (bt_irqres && irq_registered) { + PRINTM(MSG, "Free hostwake IRQ wakeup\n"); + free_irq(bt_irqres->start, NULL); + irq_registered = 0; + } + if (minicard_pwrup) { + bt_control_data = bt_ctrl; + bt_set_power(0, 0); /* Power Off */ + bt_set_carddetect(0); /* CardDetect (1->0) */ + } LEAVE(); return 0; @@ -2261,8 +2417,7 @@ bt_add_dev(void) ENTER(); - if (minicard_pwrup) - ret = platform_driver_register(&bt_device); + ret = platform_driver_register(&bt_device); LEAVE(); return ret; @@ -2278,8 +2433,7 @@ bt_del_dev(void) { ENTER(); - if (minicard_pwrup) - platform_driver_unregister(&bt_device); + platform_driver_unregister(&bt_device); LEAVE(); } diff --git a/drivers/bluetooth/sd8797/bt/bt_proc.c b/drivers/bluetooth/sd8797/bt/bt_proc.c index 315598540f58..ad9a6e9cd23d 100644 --- a/drivers/bluetooth/sd8797/bt/bt_proc.c +++ b/drivers/bluetooth/sd8797/bt/bt_proc.c @@ -28,16 +28,16 @@ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 26) #define PROC_DIR NULL #elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24) -#define PROC_DIR &proc_root +#define PROC_DIR (&proc_root) #else #define PROC_DIR proc_net #endif /** Proc mbt directory entry */ -static struct proc_dir_entry *proc_mbt = NULL; +static struct proc_dir_entry *proc_mbt; #define CMD52_STR_LEN 50 -static bt_private *bpriv = NULL; +static bt_private *bpriv; static char cmd52_string[CMD52_STR_LEN]; struct proc_data { @@ -178,7 +178,7 @@ string_to_number(char *s) break; } - return (r * pn); + return r * pn; } /** @@ -233,23 +233,19 @@ parse_cmd52_string(const char __user * buffer, size_t len, /* Get func */ pos = strsep(&string, " \t"); - if (pos) { + if (pos) *func = string_to_number(pos); - } /* Get reg */ pos = strsep(&string, " \t"); - if (pos) { + if (pos) *reg = string_to_number(pos); - } /* Get val (optional) */ pos = strsep(&string, " \t"); - if (pos) { + if (pos) *val = string_to_number(pos); - } - if (string) - kfree(string); + kfree(string); LEAVE(); return ret; } @@ -348,7 +344,11 @@ proc_write(struct file *file, static void proc_on_close(struct inode *inode, struct file *file) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0) struct proc_private_data *priv = PDE_DATA(inode); +#else + struct proc_private_data *priv = PDE(inode)->data; +#endif struct proc_data *pdata = file->private_data; char *line; int i; @@ -397,7 +397,11 @@ proc_on_close(struct inode *inode, struct file *file) static int proc_open(struct inode *inode, struct file *file) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0) struct proc_private_data *priv = PDE_DATA(inode); +#else + struct proc_private_data *priv = PDE(inode)->data; +#endif struct proc_data *pdata; int i; char *p; @@ -405,21 +409,23 @@ proc_open(struct inode *inode, struct file *file) ENTER(); priv->pbt->adapter->skb_pending = skb_queue_len(&priv->pbt->adapter->tx_queue); - if ((file->private_data = - kzalloc(sizeof(struct proc_data), GFP_KERNEL)) == NULL) { + file->private_data = kzalloc(sizeof(struct proc_data), GFP_KERNEL); + if (file->private_data == NULL) { PRINTM(ERROR, "BT: Can not alloc mem for proc_data\n"); LEAVE(); return -ENOMEM; } pdata = (struct proc_data *)file->private_data; - if ((pdata->rdbuf = kmalloc(priv->bufsize, GFP_KERNEL)) == NULL) { + pdata->rdbuf = kmalloc(priv->bufsize, GFP_KERNEL); + if (pdata->rdbuf == NULL) { PRINTM(ERROR, "BT: Can not alloc mem for rdbuf\n"); kfree(file->private_data); LEAVE(); return -ENOMEM; } if (priv->fileflag == DEFAULT_FILE_PERM) { - if ((pdata->wrbuf = kzalloc(priv->bufsize, GFP_KERNEL)) == NULL) { + pdata->wrbuf = kzalloc(priv->bufsize, GFP_KERNEL); + if (pdata->wrbuf == NULL) { PRINTM(ERROR, "BT: Can not alloc mem for wrbuf\n"); kfree(pdata->rdbuf); kfree(file->private_data); @@ -522,8 +528,7 @@ bt_proc_init(bt_private * priv, struct m_dev *m_dev, int seq) } memcpy((u8 *) priv->dev_proc[seq].pfiles, (u8 *) proc_files, sizeof(proc_files)); - priv->dev_proc[seq].num_proc_files = - sizeof(proc_files) / sizeof(proc_files[0]); + priv->dev_proc[seq].num_proc_files = ARRAY_SIZE(proc_files); for (j = 0; j < priv->dev_proc[seq].num_proc_files; j++) priv->dev_proc[seq].pfiles[j].pdata = NULL; for (j = 0; j < priv->dev_proc[seq].num_proc_files; j++) { @@ -562,6 +567,16 @@ bt_proc_init(bt_private * priv, struct m_dev *m_dev, int seq) (t_ptr) priv->adapter; } priv->dev_proc[seq].pfiles[j].pbt = priv; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 26) + entry = proc_create_data(proc_files[j].name, + S_IFREG | proc_files[j]. + fileflag, + priv->dev_proc[seq].proc_entry, + proc_files[j].fops, + &priv->dev_proc[seq]. + pfiles[j]); + if (entry == NULL) +#else entry = create_proc_entry(proc_files[j].name, S_IFREG | proc_files[j]. fileflag, @@ -574,6 +589,7 @@ bt_proc_init(bt_private * priv, struct m_dev *m_dev, int seq) #endif entry->proc_fops = proc_files[j].fops; } else +#endif PRINTM(MSG, "BT: Fail to create proc %s\n", proc_files[j].name); } @@ -617,17 +633,14 @@ bt_proc_remove(bt_private * priv) for (i = 0; i < MAX_RADIO_FUNC; i++) { if (!priv->dev_proc[i].proc_entry) continue; - for (j = 0; - j < sizeof(proc_files) / sizeof(proc_files[0]); - j++) { + for (j = 0; j < ARRAY_SIZE(proc_files); j++) { remove_proc_entry(proc_files[j].name, priv->dev_proc[i].proc_entry); } - if (priv->dev_proc[i].proc_entry) { - remove_proc_entry(priv->bt_dev.m_dev[i].name, - proc_mbt); - priv->dev_proc[i].proc_entry = NULL; - } + + remove_proc_entry(priv->bt_dev.m_dev[i].name, proc_mbt); + priv->dev_proc[i].proc_entry = NULL; + if (priv->dev_proc[i].pfiles) { for (j = 0; j < priv->dev_proc[i].num_proc_files; diff --git a/drivers/bluetooth/sd8797/bt/bt_sdio.h b/drivers/bluetooth/sd8797/bt/bt_sdio.h index c8428ec56347..541d5f4b81e4 100644 --- a/drivers/bluetooth/sd8797/bt/bt_sdio.h +++ b/drivers/bluetooth/sd8797/bt/bt_sdio.h @@ -27,7 +27,7 @@ /** IRQ return type */ typedef irqreturn_t IRQ_RET_TYPE; /** IRQ return */ -#define IRQ_RET return IRQ_HANDLED +#define IRQ_RET (return IRQ_HANDLED) /** ISR notifier function */ typedef IRQ_RET_TYPE(*isr_notifier_fn_t) (s32 irq, void *dev_id, struct pt_regs * reg); @@ -60,7 +60,7 @@ typedef IRQ_RET_TYPE(*isr_notifier_fn_t) (s32 irq, void *dev_id, /** Host Control Registers : Configuration */ #define CONFIGURATION_REG 0x00 /** Host Control Registers : Host without Command 53 finish host*/ -#define HOST_TO_CARD_EVENT (0x1U << 3) +#define HOST_TO_CARD_EVENT (0x1U << 3) /** Host Control Registers : Host without Command 53 finish host */ #define HOST_WO_CMD53_FINISH_HOST (0x1U << 2) /** Host Control Registers : Host power up */ @@ -70,11 +70,13 @@ typedef IRQ_RET_TYPE(*isr_notifier_fn_t) (s32 irq, void *dev_id, /** Host Control Registers : Host interrupt RSR */ #define HOST_INT_RSR_REG 0x01 + /** Host Control Registers : Upload host interrupt RSR */ #define UP_LD_HOST_INT_RSR (0x1U) /** Host Control Registers : Host interrupt mask */ #define HOST_INT_MASK_REG 0x02 + /** Host Control Registers : Upload host interrupt mask */ #define UP_LD_HOST_INT_MASK (0x1U) /** Host Control Registers : Download host interrupt mask */ @@ -84,7 +86,6 @@ typedef IRQ_RET_TYPE(*isr_notifier_fn_t) (s32 irq, void *dev_id, /** Disable Host interrupt mask */ #define HIM_DISABLE 0xff -/** Host Control Registers : Host interrupt status */ #define HOST_INTSTATUS_REG 0x03 /** Host Control Registers : Upload host interrupt status */ #define UP_LD_HOST_INT_STATUS (0x1U) @@ -96,80 +97,80 @@ typedef IRQ_RET_TYPE(*isr_notifier_fn_t) (s32 irq, void *dev_id, /** Host Control Registers : Upload CRC error */ #define UP_LD_CRC_ERR (0x1U << 2) /** Host Control Registers : Upload restart */ -#define UP_LD_RESTART (0x1U << 1) +#define UP_LD_RESTART (0x1U << 1) /** Host Control Registers : Download restart */ -#define DN_LD_RESTART (0x1U << 0) +#define DN_LD_RESTART (0x1U << 0) /* Card Control Registers */ /** Card Control Registers : Read SQ base address A0 register */ -#define SQ_READ_BASE_ADDRESS_A0_REG 0x40 +#define SQ_READ_BASE_ADDRESS_A0_REG 0x40 /** Card Control Registers : Read SQ base address A1 register */ -#define SQ_READ_BASE_ADDRESS_A1_REG 0x41 +#define SQ_READ_BASE_ADDRESS_A1_REG 0x41 /** Card Control Registers : Read SQ base address A2 register */ -#define SQ_READ_BASE_ADDRESS_A2_REG 0x42 +#define SQ_READ_BASE_ADDRESS_A2_REG 0x42 /** Card Control Registers : Read SQ base address A3 register */ -#define SQ_READ_BASE_ADDRESS_A3_REG 0x43 +#define SQ_READ_BASE_ADDRESS_A3_REG 0x43 /** Card Control Registers : Read SQ base address B0 register */ -#define SQ_READ_BASE_ADDRESS_B0_REG 0x44 +#define SQ_READ_BASE_ADDRESS_B0_REG 0x44 /** Card Control Registers : Read SQ base address B1 register */ -#define SQ_READ_BASE_ADDRESS_B1_REG 0x45 +#define SQ_READ_BASE_ADDRESS_B1_REG 0x45 /** Card Control Registers : Read SQ base address B2 register */ -#define SQ_READ_BASE_ADDRESS_B2_REG 0x46 +#define SQ_READ_BASE_ADDRESS_B2_REG 0x46 /** Card Control Registers : Read SQ base address B3 register */ -#define SQ_READ_BASE_ADDRESS_B3_REG 0x47 +#define SQ_READ_BASE_ADDRESS_B3_REG 0x47 /** Card Control Registers : Card status register */ -#define CARD_STATUS_REG 0x30 +#define CARD_STATUS_REG 0x30 /** Card Control Registers : Card I/O ready */ -#define CARD_IO_READY (0x1U << 3) +#define CARD_IO_READY (0x1U << 3) /** Card Control Registers : CIS card ready */ -#define CIS_CARD_RDY (0x1U << 2) +#define CIS_CARD_RDY (0x1U << 2) /** Card Control Registers : Upload card ready */ -#define UP_LD_CARD_RDY (0x1U << 1) +#define UP_LD_CARD_RDY (0x1U << 1) /** Card Control Registers : Download card ready */ -#define DN_LD_CARD_RDY (0x1U << 0) +#define DN_LD_CARD_RDY (0x1U << 0) /** Card Control Registers : Host interrupt mask register */ -#define HOST_INTERRUPT_MASK_REG 0x34 +#define HOST_INTERRUPT_MASK_REG 0x34 /** Card Control Registers : Host power interrupt mask */ -#define HOST_POWER_INT_MASK (0x1U << 3) +#define HOST_POWER_INT_MASK (0x1U << 3) /** Card Control Registers : Abort card interrupt mask */ -#define ABORT_CARD_INT_MASK (0x1U << 2) +#define ABORT_CARD_INT_MASK (0x1U << 2) /** Card Control Registers : Upload card interrupt mask */ -#define UP_LD_CARD_INT_MASK (0x1U << 1) +#define UP_LD_CARD_INT_MASK (0x1U << 1) /** Card Control Registers : Download card interrupt mask */ -#define DN_LD_CARD_INT_MASK (0x1U << 0) +#define DN_LD_CARD_INT_MASK (0x1U << 0) /** Card Control Registers : Card interrupt status register */ -#define CARD_INTERRUPT_STATUS_REG 0x38 +#define CARD_INTERRUPT_STATUS_REG 0x38 /** Card Control Registers : Power up interrupt */ -#define POWER_UP_INT (0x1U << 4) +#define POWER_UP_INT (0x1U << 4) /** Card Control Registers : Power down interrupt */ -#define POWER_DOWN_INT (0x1U << 3) +#define POWER_DOWN_INT (0x1U << 3) /** Card Control Registers : Card interrupt RSR register */ -#define CARD_INTERRUPT_RSR_REG 0x3c +#define CARD_INTERRUPT_RSR_REG 0x3c /** Card Control Registers : Power up RSR */ -#define POWER_UP_RSR (0x1U << 4) +#define POWER_UP_RSR (0x1U << 4) /** Card Control Registers : Power down RSR */ -#define POWER_DOWN_RSR (0x1U << 3) +#define POWER_DOWN_RSR (0x1U << 3) /** Card Control Registers : Debug 0 register */ -#define DEBUG_0_REG 0x70 +#define DEBUG_0_REG 0x70 /** Card Control Registers : SD test BUS 0 */ -#define SD_TESTBUS0 (0x1U) +#define SD_TESTBUS0 (0x1U) /** Card Control Registers : Debug 1 register */ -#define DEBUG_1_REG 0x71 +#define DEBUG_1_REG 0x71 /** Card Control Registers : SD test BUS 1 */ -#define SD_TESTBUS1 (0x1U) +#define SD_TESTBUS1 (0x1U) /** Card Control Registers : Debug 2 register */ -#define DEBUG_2_REG 0x72 +#define DEBUG_2_REG 0x72 /** Card Control Registers : SD test BUS 2 */ -#define SD_TESTBUS2 (0x1U) +#define SD_TESTBUS2 (0x1U) /** Card Control Registers : Debug 3 register */ -#define DEBUG_3_REG 0x73 +#define DEBUG_3_REG 0x73 /** Card Control Registers : SD test BUS 3 */ -#define SD_TESTBUS3 (0x1U) +#define SD_TESTBUS3 (0x1U) /** Host Control Registers : I/O port 0 */ #define IO_PORT_0_REG 0x78 @@ -187,24 +188,24 @@ typedef IRQ_RET_TYPE(*isr_notifier_fn_t) (s32 irq, void *dev_id, /** Rx unit register */ #define CARD_RX_UNIT_REG 0x63 /** Card Control Registers : Miscellaneous Configuration Register */ -#define CARD_MISC_CFG_REG 0x6C +#define CARD_MISC_CFG_REG 0x6C /** Misc. Config Register : Auto Re-enable interrupts */ #define AUTO_RE_ENABLE_INT (0x1U << 4) /** Card Control Registers : Card OCR 0 register */ -#define CARD_OCR_0_REG 0x68 +#define CARD_OCR_0_REG 0x68 /** Card Control Registers : Card OCR 1 register */ -#define CARD_OCR_1_REG 0x69 +#define CARD_OCR_1_REG 0x69 /** Card Control Registers : Card OCR 3 register */ -#define CARD_OCR_3_REG 0x6A +#define CARD_OCR_3_REG 0x6A /** Card Control Registers : Card config register */ -#define CARD_CONFIG_REG 0x6B +#define CARD_CONFIG_REG 0x6B /** Card Control Registers : Card revision register */ -#define CARD_REVISION_REG 0x5c +#define CARD_REVISION_REG 0x5c /** Card Control Registers : Command 53 finish G BUS */ -#define CMD53_FINISH_GBUS (0x1U << 1) +#define CMD53_FINISH_GBUS (0x1U << 1) /** Card Control Registers : SD negative edge */ -#define SD_NEG_EDGE (0x1U << 0) +#define SD_NEG_EDGE (0x1U << 0) /* Special registers in function 0 of the SDxx card */ /** Special register in function 0 of the SDxxx card : Scratch 0 */ @@ -243,6 +244,7 @@ struct sdio_mmc_card { int sd_read_cmd52_val(bt_private * priv); /** This function updates card reg based on the Cmd52 value in dev structure */ int sd_write_cmd52_val(bt_private * priv, int func, int reg, int val); +void bt_enable_hostwake_irq(int flag); #ifdef SDIO_SUSPEND_RESUME #ifdef MMC_PM_KEEP_POWER diff --git a/drivers/bluetooth/sd8797/bt/bt_sdiommc.c b/drivers/bluetooth/sd8797/bt/bt_sdiommc.c index 293eacb92da8..3fdd23a6486c 100644 --- a/drivers/bluetooth/sd8797/bt/bt_sdiommc.c +++ b/drivers/bluetooth/sd8797/bt/bt_sdiommc.c @@ -31,9 +31,9 @@ /** Max retry number of CMD53 write */ #define MAX_WRITE_IOMEM_RETRY 2 /** Firmware name */ -static char *fw_name = NULL; +static char *fw_name; /** request firmware nowait */ -static int req_fw_nowait = 0; +static int req_fw_nowait; static int multi_fn = BIT(2); /** Default firmware name */ #define DEFAULT_FW_NAME "mrvl/sd8797_uapsta.bin" @@ -57,7 +57,7 @@ MODULE_DEVICE_TABLE(sdio, bt_ids); Global Variables ********************************************************/ /** unregiser bus driver flag */ -static u8 unregister = 0; +static u8 unregister; #ifdef SDIO_SUSPEND_RESUME /** PM keep power */ extern int mbt_pm_keep_power; @@ -71,7 +71,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) @@ -95,7 +95,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) @@ -130,7 +130,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) @@ -154,7 +154,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) @@ -178,7 +178,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) @@ -210,9 +210,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) @@ -245,8 +245,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) @@ -279,11 +279,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) @@ -323,8 +323,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) @@ -343,7 +343,7 @@ sd_probe_card(struct sdio_func *func, const struct sdio_device_id *id) goto done; } card->func = func; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) /* wait for chip fully wake up */ if (!func->enable_timeout) func->enable_timeout = 200; @@ -384,7 +384,7 @@ int sd_verify_fw_download(bt_private * priv, int pollnum) { int ret = BT_STATUS_FAILURE; - u16 firmwarestat; + u16 firmwarestat = 0; int tries; ENTER(); @@ -400,7 +400,10 @@ sd_verify_fw_download(bt_private * priv, int pollnum) } mdelay(100); } - + if ((pollnum > 1) && (ret != BT_STATUS_SUCCESS)) + PRINTM(ERROR, + "Fail to poll firmware status: firmwarestat=0x%x\n", + firmwarestat); LEAVE(); return ret; } @@ -409,7 +412,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) @@ -429,9 +432,6 @@ 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; @@ -439,11 +439,7 @@ sd_init_fw_dpc(bt_private * priv) PRINTM(INFO, "BT: Downloading FW image (%d bytes)\n", firmwarelen); -#ifdef FW_DOWNLOAD_SPEED - tv1 = get_utimeofday(); -#endif - - tmpfwbufsz = ALIGN_SZ(BT_UPLD_SIZE, DMA_ALIGNMENT); + tmpfwbufsz = BT_UPLD_SIZE + DMA_ALIGNMENT; tmpfwbuf = kmalloc(tmpfwbufsz, GFP_KERNEL); if (!tmpfwbuf) { PRINTM(ERROR, @@ -563,18 +559,7 @@ sd_init_fw_dpc(bt_private * priv) ret = BT_STATUS_SUCCESS; done: -#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); + kfree(tmpfwbuf); LEAVE(); return ret; } @@ -655,7 +640,7 @@ sd_request_fw_dpc(const struct firmware *fw_firmware, void *context) goto done; } if (fw_firmware) { -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32) +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 32) if (!req_fw_nowait) #endif release_firmware(fw_firmware); @@ -665,7 +650,7 @@ sd_request_fw_dpc(const struct firmware *fw_firmware, void *context) done: if (fw_firmware) { -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32) +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 32) if (!req_fw_nowait) #endif release_firmware(fw_firmware); @@ -679,9 +664,8 @@ 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); @@ -717,8 +701,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) @@ -732,25 +716,24 @@ sd_download_firmware_w_helper(bt_private * priv) cur_fw_name = fw_name; if (req_fw_nowait) { -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,32) - if ((ret = - request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG, - cur_fw_name, priv->hotplug_device, - GFP_KERNEL, priv, - sd_request_fw_callback)) < 0) +#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 32) + ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG, + cur_fw_name, priv->hotplug_device, + GFP_KERNEL, priv, + sd_request_fw_callback); #else - if ((ret = - request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG, - cur_fw_name, priv->hotplug_device, - priv, sd_request_fw_callback)) < 0) + ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG, + cur_fw_name, priv->hotplug_device, + priv, sd_request_fw_callback); #endif + if (ret < 0) PRINTM(FATAL, "BT: request_firmware_nowait() failed, error code = %#x\n", ret); } else { - if ((err = - request_firmware(&priv->firmware, cur_fw_name, - priv->hotplug_device)) < 0) { + err = request_firmware(&priv->firmware, cur_fw_name, + priv->hotplug_device); + if (err < 0) { PRINTM(FATAL, "BT: request_firmware() failed, error code = %#x\n", err); @@ -767,7 +750,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) @@ -989,7 +972,7 @@ sd_card_to_host(bt_private * priv) } break; case MRVL_VENDOR_PKT: - // Just think here need to back compatible FM + /* Just think here need to back compatible FM */ bt_cb(skb)->pkt_type = HCI_VENDOR_PKT; skb_put(skb, buf_len); skb_pull(skb, BT_HEADER_LEN); @@ -1071,7 +1054,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", - __FUNCTION__, func, card); + __func__, func, card); LEAVE(); return; } @@ -1150,7 +1133,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) @@ -1204,6 +1187,9 @@ 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)) { @@ -1226,7 +1212,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) @@ -1239,6 +1225,7 @@ 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); @@ -1310,7 +1297,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 @@ -1323,7 +1310,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) @@ -1338,7 +1325,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) @@ -1373,8 +1360,7 @@ 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", - __FUNCTION__); + PRINTM(FATAL, ": %s: cannot set SDIO block size\n", __func__); goto release_irq; } @@ -1452,7 +1438,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) @@ -1477,7 +1463,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) @@ -1504,7 +1490,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) @@ -1531,8 +1517,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) @@ -1556,9 +1542,11 @@ 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 = ALIGN_SZ(nb, DMA_ALIGNMENT); + tmpbufsz = buf_block_len * blksz + DMA_ALIGNMENT; tmpbuf = kmalloc(tmpbufsz, GFP_KERNEL); if (!tmpbuf) { LEAVE(); @@ -1569,8 +1557,6 @@ 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 { @@ -1607,7 +1593,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) @@ -1697,7 +1683,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) @@ -1736,7 +1722,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) diff --git a/drivers/bluetooth/sd8797/bt/hci_wrapper.h b/drivers/bluetooth/sd8797/bt/hci_wrapper.h index 849b96e294a7..b8870359559f 100644 --- a/drivers/bluetooth/sd8797/bt/hci_wrapper.h +++ b/drivers/bluetooth/sd8797/bt/hci_wrapper.h @@ -76,6 +76,7 @@ struct m_dev { int (*ioctl) (struct m_dev * m_dev, unsigned int cmd, unsigned long arg); void (*query) (struct m_dev * m_dev, unsigned long arg); + void (*poweroff) (struct m_dev * m_dev); }; diff --git a/drivers/bluetooth/sd8797/bt/mbt_char.c b/drivers/bluetooth/sd8797/bt/mbt_char.c index 293234abf603..27afcf97774f 100644 --- a/drivers/bluetooth/sd8797/bt/mbt_char.c +++ b/drivers/bluetooth/sd8797/bt/mbt_char.c @@ -26,12 +26,40 @@ #include "bt_drv.h" #include "mbt_char.h" -LIST_HEAD(char_dev_list); +static LIST_HEAD(char_dev_list); static DEFINE_SPINLOCK(char_dev_list_lock); static int mbtchar_major = MBTCHAR_MAJOR_NUM; +struct kobject * +chardev_get(struct char_dev *dev) +{ + struct kobject *kobj; + + kobj = bt_priv_get(dev->m_dev->driver_data); + if (!kobj) + return NULL; + PRINTM(INFO, "dev get kobj\n"); + kobj = kobject_get(&dev->kobj); + if (!kobj) + bt_priv_put(dev->m_dev->driver_data); + return kobj; +} + +void +chardev_put(struct char_dev *dev) +{ + if (dev) { + struct m_dev *m_dev = dev->m_dev; + PRINTM(INFO, "dev put kobj\n"); + kobject_put(&dev->kobj); + if (m_dev) { + bt_priv_put(m_dev->driver_data); + } + } +} + /** * @brief Changes permissions of the dev * @@ -344,6 +372,9 @@ chardev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) case MBTCHAR_IOCTL_QUERY_TYPE: m_dev->query(m_dev, arg); break; + case MBTCHAR_IOCTL_POWER_OFF: + m_dev->poweroff(m_dev); + break; default: break; } @@ -367,9 +398,9 @@ chardev_open(struct inode *inode, struct file *filp) ENTER(); dev = container_of(inode->i_cdev, struct char_dev, cdev); - if (!dev->m_dev) { - ret = -ENXIO; - goto done; + if (!chardev_get(dev)) { + LEAVE(); + return -ENXIO; } filp->private_data = dev; /* for other methods */ m_dev = dev->m_dev; @@ -386,6 +417,8 @@ chardev_open(struct inode *inode, struct file *filp) done: mdev_req_unlock(m_dev); + if (ret) + chardev_put(dev); LEAVE(); return ret; } @@ -402,13 +435,17 @@ chardev_release(struct inode *inode, struct file *filp) { int ret = 0; struct char_dev *dev = (struct char_dev *)filp->private_data; + struct m_dev *m_dev = NULL; ENTER(); - if (!dev || !dev->m_dev) { + if (!dev) { LEAVE(); return -ENXIO; } - ret = dev->m_dev->close(dev->m_dev); + m_dev = dev->m_dev; + if (m_dev) + ret = dev->m_dev->close(dev->m_dev); filp->private_data = NULL; + chardev_put(dev); LEAVE(); return ret; } @@ -446,6 +483,7 @@ chardev_poll(struct file *filp, poll_table * wait) /* File ops for the Char driver */ const struct file_operations chardev_fops = { + .owner = THIS_MODULE, .read = chardev_read, .write = chardev_write, #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 36) @@ -493,8 +531,7 @@ register_char_dev(struct char_dev *dev, struct class *char_class, mbtchar_major = MAJOR(dev_num); } cdev_init(&dev->cdev, &chardev_fops); - dev->cdev.owner = THIS_MODULE; - dev->cdev.ops = &chardev_fops; + dev->cdev.owner = chardev_fops.owner; dev_num = MKDEV(mbtchar_major, dev->minor); if (cdev_add(&dev->cdev, dev_num, 1)) { @@ -596,7 +633,7 @@ chardev_cleanup(struct class *char_class) list_del(p); spin_unlock_irqrestore(&char_dev_list_lock, flags); unregister_char_dev(dev, char_class, dev->m_dev->name); - kfree(dev); + kobject_put(&dev->kobj); spin_lock_irqsave(&char_dev_list_lock, flags); break; } @@ -628,7 +665,7 @@ chardev_cleanup_one(struct m_dev *m_dev, struct class *char_class) spin_unlock_irqrestore(&char_dev_list_lock, flags); dev->m_dev = NULL; unregister_char_dev(dev, char_class, m_dev->name); - kfree(dev); + kobject_put(&dev->kobj); spin_lock_irqsave(&char_dev_list_lock, flags); break; } diff --git a/drivers/bluetooth/sd8797/bt/mbt_char.h b/drivers/bluetooth/sd8797/bt/mbt_char.h index 3d67202a689f..a6918f159794 100644 --- a/drivers/bluetooth/sd8797/bt/mbt_char.h +++ b/drivers/bluetooth/sd8797/bt/mbt_char.h @@ -28,6 +28,8 @@ #define MBTCHAR_IOCTL_RELEASE _IO('M', 1) #define MBTCHAR_IOCTL_QUERY_TYPE _IO('M', 2) +#define MBTCHAR_IOCTL_POWER_OFF _IO('M', 3) + #define MBTCHAR_MAJOR_NUM (0) /** Interface specific macros */ @@ -43,6 +45,7 @@ struct char_dev { int dev_type; struct cdev cdev; struct m_dev *m_dev; + struct kobject kobj; }; /** Changes permissions of the dev */ diff --git a/drivers/bluetooth/sd8897/bt/bt_drv.h b/drivers/bluetooth/sd8897/bt/bt_drv.h index 8e6f21f501cb..e417f976fbee 100644 --- a/drivers/bluetooth/sd8897/bt/bt_drv.h +++ b/drivers/bluetooth/sd8897/bt/bt_drv.h @@ -96,11 +96,14 @@ extern u32 mbt_drvdbg; #ifdef DEBUG_LEVEL2 /** Print informative message */ -#define PRINTM_INFO(msg...) do {if (mbt_drvdbg & DBG_INFO) printk(KERN_DEBUG msg); } while (0) +#define PRINTM_INFO(msg...) do {if (mbt_drvdbg & DBG_INFO) \ + printk(KERN_DEBUG msg); } while (0) /** Print warning message */ -#define PRINTM_WARN(msg...) do {if (mbt_drvdbg & DBG_WARN) printk(KERN_DEBUG msg); } while (0) +#define PRINTM_WARN(msg...) do {if (mbt_drvdbg & DBG_WARN) \ + printk(KERN_DEBUG msg); } while (0) /** Print entry message */ -#define PRINTM_ENTRY(msg...) do {if (mbt_drvdbg & DBG_ENTRY) printk(KERN_DEBUG msg); } while (0) +#define PRINTM_ENTRY(msg...) do {if (mbt_drvdbg & DBG_ENTRY) \ + printk(KERN_DEBUG msg); } while (0) #else /** Print informative message */ #define PRINTM_INFO(msg...) do {} while (0) @@ -111,24 +114,33 @@ extern u32 mbt_drvdbg; #endif /* DEBUG_LEVEL2 */ /** Print interrupt message */ -#define PRINTM_INTR(msg...) do {if (mbt_drvdbg & DBG_INTR) printk(KERN_DEBUG msg); } while (0) +#define PRINTM_INTR(msg...) do {if (mbt_drvdbg & DBG_INTR) \ + printk(KERN_DEBUG msg); } while (0) /** Print event message */ -#define PRINTM_EVENT(msg...) do {if (mbt_drvdbg & DBG_EVENT) printk(KERN_DEBUG msg); } while (0) +#define PRINTM_EVENT(msg...) do {if (mbt_drvdbg & DBG_EVENT) \ + printk(KERN_DEBUG msg); } while (0) /** Print command message */ -#define PRINTM_CMD(msg...) do {if (mbt_drvdbg & DBG_CMD) printk(KERN_DEBUG msg); } while (0) +#define PRINTM_CMD(msg...) do {if (mbt_drvdbg & DBG_CMD) \ + printk(KERN_DEBUG msg); } while (0) /** Print data message */ -#define PRINTM_DATA(msg...) do {if (mbt_drvdbg & DBG_DATA) printk(KERN_DEBUG msg); } while (0) +#define PRINTM_DATA(msg...) do {if (mbt_drvdbg & DBG_DATA) \ + printk(KERN_DEBUG msg); } while (0) /** Print error message */ -#define PRINTM_ERROR(msg...) do {if (mbt_drvdbg & DBG_ERROR) printk(KERN_ERR msg); } while (0) +#define PRINTM_ERROR(msg...) do {if (mbt_drvdbg & DBG_ERROR) \ + printk(KERN_ERR msg); } while (0) /** Print fatal message */ -#define PRINTM_FATAL(msg...) do {if (mbt_drvdbg & DBG_FATAL) printk(KERN_ERR msg); } while (0) +#define PRINTM_FATAL(msg...) do {if (mbt_drvdbg & DBG_FATAL) \ + printk(KERN_ERR msg); } while (0) /** Print message */ -#define PRINTM_MSG(msg...) do {if (mbt_drvdbg & DBG_MSG) printk(KERN_ALERT msg); } while (0) +#define PRINTM_MSG(msg...) do {if (mbt_drvdbg & DBG_MSG) \ + printk(KERN_ALERT msg); } while (0) /** Print data dump message */ -#define PRINTM_DAT_D(msg...) do {if (mbt_drvdbg & DBG_DAT_D) printk(KERN_DEBUG msg); } while (0) +#define PRINTM_DAT_D(msg...) do {if (mbt_drvdbg & DBG_DAT_D) \ + printk(KERN_DEBUG msg); } while (0) /** Print data dump message */ -#define PRINTM_CMD_D(msg...) do {if (mbt_drvdbg & DBG_CMD_D) printk(KERN_DEBUG msg); } while (0) +#define PRINTM_CMD_D(msg...) do {if (mbt_drvdbg & DBG_CMD_D) \ + printk(KERN_DEBUG msg); } while (0) /** Print message with required level */ #define PRINTM(level, msg...) PRINTM_##level(msg) @@ -164,28 +176,30 @@ hexdump(char *prompt, u8 * buf, int len) } /** Debug hexdump of debug data */ -#define DBG_HEXDUMP_DAT_D(x, y, z) do {if (mbt_drvdbg & DBG_DAT_D) hexdump(x, y, z); } while (0) +#define DBG_HEXDUMP_DAT_D(x, y, z) do {if (mbt_drvdbg & DBG_DAT_D) \ + hexdump(x, y, z); } while (0) /** Debug hexdump of debug command */ -#define DBG_HEXDUMP_CMD_D(x, y, z) do {if (mbt_drvdbg & DBG_CMD_D) hexdump(x, y, z); } while (0) +#define DBG_HEXDUMP_CMD_D(x, y, z) do {if (mbt_drvdbg & DBG_CMD_D) \ + hexdump(x, y, z); } while (0) /** Debug hexdump */ #define DBG_HEXDUMP(level, x, y, z) DBG_HEXDUMP_##level(x, y, z) /** Mark entry point */ -#define ENTER() PRINTM(ENTRY, "Enter: %s, %s:%i\n", __FUNCTION__, \ +#define ENTER() PRINTM(ENTRY, "Enter: %s, %s:%i\n", __func__, \ __FILE__, __LINE__) /** Mark exit point */ -#define LEAVE() PRINTM(ENTRY, "Leave: %s, %s:%i\n", __FUNCTION__, \ +#define LEAVE() PRINTM(ENTRY, "Leave: %s, %s:%i\n", __func__, \ __FILE__, __LINE__) #else /** Do nothing */ -#define PRINTM(level, msg...) do {} while (0); +#define PRINTM(level, msg...) do {} while (0) /** Do nothing */ -#define DBG_HEXDUMP(level, x, y, z) do {} while (0); +#define DBG_HEXDUMP(level, x, y, z) do {} while (0) /** Do nothing */ -#define ENTER() do {} while (0); +#define ENTER() do {} while (0) /** Do nothing */ -#define LEAVE() do {} while (0); +#define LEAVE() do {} while (0) #endif /* DEBUG_LEVEL1 */ /** Bluetooth upload size */ @@ -278,7 +292,7 @@ os_sched_timeout(u32 millisec) #endif #ifndef __ATTRIB_PACK__ -#define __ATTRIB_PACK__ __attribute__ ((packed)) +#define __ATTRIB_PACK__ __attribute__((packed)) #endif /** Data structure for the Marvell Bluetooth device */ @@ -453,9 +467,11 @@ typedef struct _bt_private { } bt_private, *pbt_private; /** Disable interrupt */ -#define OS_INT_DISABLE spin_lock_irqsave(&priv->driver_lock, priv->driver_flags) +#define OS_INT_DISABLE spin_lock_irqsave(&priv->driver_lock, \ + priv->driver_flags) /** Enable interrupt */ -#define OS_INT_RESTORE spin_unlock_irqrestore(&priv->driver_lock, priv->driver_flags) +#define OS_INT_RESTORE spin_unlock_irqrestore(&priv->driver_lock, \ + priv->driver_flags) #ifndef HCI_BT_AMP /** BT_AMP flag for device type */ diff --git a/drivers/bluetooth/sd8897/bt/bt_main.c b/drivers/bluetooth/sd8897/bt/bt_main.c index d7ce8ec4733b..58e6051be842 100644 --- a/drivers/bluetooth/sd8897/bt/bt_main.c +++ b/drivers/bluetooth/sd8897/bt/bt_main.c @@ -37,6 +37,8 @@ #include <linux/platform_device.h> #include <linux/wlan_plat.h> +#include <linux/interrupt.h> + #include "bt_drv.h" #include "mbt_char.h" #include "bt_sdio.h" @@ -115,6 +117,14 @@ static int minicard_pwrup = 1; /** Pointer to struct with control hooks */ static struct wifi_platform_data *bt_control_data; +#define IORESOURCE_NAME "mrvl_bt_irq" +#define DRIVER_NAME "bt hostwake" + +void mdev_poweroff(struct m_dev *m_dev); +static struct resource *bt_irqres; +static int irq_registered; +static void bt_register_hostwake_irq(void *handle); + /** * @brief Alloc bt device * @@ -328,19 +338,19 @@ bt_process_event(bt_private * priv, struct sk_buff *skb) { u8 ret = BT_STATUS_SUCCESS; struct m_dev *m_dev = &(priv->bt_dev.m_dev[BT_SEQ]); - BT_EVENT *pEvent; + BT_EVENT *pevent; ENTER(); - pEvent = (BT_EVENT *) skb->data; - if (pEvent->EC != 0xff) { - PRINTM(CMD, "BT: Not Marvell Event=0x%x\n", pEvent->EC); + pevent = (BT_EVENT *) skb->data; + if (pevent->EC != 0xff) { + PRINTM(CMD, "BT: Not Marvell Event=0x%x\n", pevent->EC); ret = BT_STATUS_FAILURE; goto exit; } - switch (pEvent->data[0]) { + switch (pevent->data[0]) { case BT_CMD_AUTO_SLEEP_MODE: - if (pEvent->data[2] == BT_STATUS_SUCCESS) { - if (pEvent->data[1] == BT_PS_ENABLE) + if (pevent->data[2] == BT_STATUS_SUCCESS) { + if (pevent->data[1] == BT_PS_ENABLE) priv->adapter->psmode = 1; else priv->adapter->psmode = 0; @@ -353,16 +363,16 @@ bt_process_event(bt_private * priv, struct sk_buff *skb) } break; case BT_CMD_HOST_SLEEP_CONFIG: - if (pEvent->data[3] == BT_STATUS_SUCCESS) { + if (pevent->data[3] == BT_STATUS_SUCCESS) { PRINTM(CMD, "BT: %s: gpio=0x%x, gap=0x%x\n", - m_dev->name, pEvent->data[1], pEvent->data[2]); + m_dev->name, pevent->data[1], pevent->data[2]); } else { PRINTM(CMD, "BT: %s: HSCFG Command Fail\n", m_dev->name); } break; case BT_CMD_HOST_SLEEP_ENABLE: - if (pEvent->data[1] == BT_STATUS_SUCCESS) { + if (pevent->data[1] == BT_STATUS_SUCCESS) { priv->adapter->hs_state = HS_ACTIVATED; if (priv->adapter->suspend_fail == FALSE) { #ifdef SDIO_SUSPEND_RESUME @@ -386,45 +396,44 @@ bt_process_event(bt_private * priv, struct sk_buff *skb) break; case BT_CMD_MODULE_CFG_REQ: if ((priv->bt_dev.sendcmdflag == TRUE) && - ((pEvent->data[1] == MODULE_BRINGUP_REQ) - || (pEvent->data[1] == MODULE_SHUTDOWN_REQ))) { - if (pEvent->data[1] == MODULE_BRINGUP_REQ) { + ((pevent->data[1] == MODULE_BRINGUP_REQ) + || (pevent->data[1] == MODULE_SHUTDOWN_REQ))) { + if (pevent->data[1] == MODULE_BRINGUP_REQ) { PRINTM(CMD, "BT: EVENT %s:%s\n", m_dev->name, - (pEvent->data[2] && (pEvent->data[2] != + (pevent->data[2] && (pevent->data[2] != MODULE_CFG_RESP_ALREADY_UP)) ? "Bring up Fail" : "Bring up success"); - priv->bt_dev.devType = pEvent->data[3]; + priv->bt_dev.devType = pevent->data[3]; PRINTM(CMD, "devType:%s\n", - (pEvent->data[3] == + (pevent->data[3] == DEV_TYPE_AMP) ? "AMP controller" : "BR/EDR controller"); - priv->bt_dev.devFeature = pEvent->data[4]; + priv->bt_dev.devFeature = pevent->data[4]; PRINTM(CMD, "devFeature: %s, %s, %s, %s, %s\n", - ((pEvent-> + ((pevent-> data[4] & DEV_FEATURE_BT) ? "BT Feature" : "No BT Feature"), - ((pEvent-> + ((pevent-> data[4] & DEV_FEATURE_BTAMP) ? "BTAMP Feature" : "No BTAMP Feature"), - ((pEvent-> + ((pevent-> data[4] & DEV_FEATURE_BLE) ? "BLE Feature" : "No BLE Feature"), - ((pEvent-> + ((pevent-> data[4] & DEV_FEATURE_FM) ? "FM Feature" : "No FM Feature"), - ((pEvent-> + ((pevent-> data[4] & DEV_FEATURE_NFC) ? "NFC Feature" : "No NFC Feature")); } - if (pEvent->data[1] == MODULE_SHUTDOWN_REQ) { + if (pevent->data[1] == MODULE_SHUTDOWN_REQ) { PRINTM(CMD, "BT: EVENT %s:%s\n", m_dev->name, - (pEvent-> - data[2]) ? "Shut down Fail" : - "Shut down success"); + (pevent->data[2]) ? "Shut down Fail" + : "Shut down success"); } - if (pEvent->data[2]) { + if (pevent->data[2]) { priv->bt_dev.sendcmdflag = FALSE; priv->adapter->cmd_complete = TRUE; wake_up_interruptible(&priv->adapter-> @@ -436,14 +445,14 @@ bt_process_event(bt_private * priv, struct sk_buff *skb) } break; case BT_EVENT_POWER_STATE: - if (pEvent->data[1] == BT_PS_SLEEP) + if (pevent->data[1] == BT_PS_SLEEP) priv->adapter->ps_state = PS_SLEEP; PRINTM(CMD, "BT: EVENT %s:%s\n", m_dev->name, (priv->adapter->ps_state) ? "PS_SLEEP" : "PS_AWAKE"); break; case BT_CMD_SDIO_PULL_CFG_REQ: - if (pEvent->data[pEvent->length - 1] == BT_STATUS_SUCCESS) + if (pevent->data[pevent->length - 1] == BT_STATUS_SUCCESS) PRINTM(CMD, "BT: %s: SDIO pull configuration success\n", m_dev->name); @@ -454,7 +463,7 @@ bt_process_event(bt_private * priv, struct sk_buff *skb) } break; default: - PRINTM(CMD, "BT: Unknown Event=%d %s\n", pEvent->data[0], + PRINTM(CMD, "BT: Unknown Event=%d %s\n", pevent->data[0], m_dev->name); ret = BT_STATUS_FAILURE; break; @@ -507,14 +516,14 @@ bt_cmd_timeout_func(bt_adapter * adapter, u16 cmd) * * @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 bt_send_reset_command(bt_private * priv) { struct sk_buff *skb = NULL; u8 ret = BT_STATUS_SUCCESS; - BT_HCI_CMD *pCmd; + BT_HCI_CMD *pcmd; ENTER(); skb = bt_skb_alloc(sizeof(BT_HCI_CMD), GFP_ATOMIC); if (skb == NULL) { @@ -522,10 +531,10 @@ bt_send_reset_command(bt_private * priv) ret = BT_STATUS_FAILURE; goto exit; } - pCmd = (BT_HCI_CMD *) skb->data; - pCmd->ocf_ogf = (RESET_OGF << 10) | BT_CMD_RESET; - pCmd->length = 0x00; - pCmd->cmd_type = 0x00; + pcmd = (BT_HCI_CMD *) skb->data; + pcmd->ocf_ogf = (RESET_OGF << 10) | BT_CMD_RESET; + pcmd->length = 0x00; + pcmd->cmd_type = 0x00; bt_cb(skb)->pkt_type = HCI_COMMAND_PKT; skb_put(skb, 3); skb->dev = (void *)(&(priv->bt_dev.m_dev[BT_SEQ])); @@ -533,7 +542,7 @@ bt_send_reset_command(bt_private * priv) priv->bt_dev.sendcmdflag = TRUE; priv->bt_dev.send_cmd_ocf = BT_CMD_RESET; priv->adapter->cmd_complete = FALSE; - PRINTM(CMD, "Queue Reset Command(0x%x)\n", pCmd->ocf_ogf); + PRINTM(CMD, "Queue Reset Command(0x%x)\n", pcmd->ocf_ogf); wake_up_interruptible(&priv->MainThread.waitQ); if (!os_wait_interruptible_timeout (priv->adapter->cmd_wait_q, priv->adapter->cmd_complete, @@ -568,7 +577,7 @@ bt_send_module_cfg_cmd(bt_private * priv, int subcmd) { struct sk_buff *skb = NULL; u8 ret = BT_STATUS_SUCCESS; - BT_CMD *pCmd; + BT_CMD *pcmd; ENTER(); skb = bt_skb_alloc(sizeof(BT_CMD), GFP_ATOMIC); if (skb == NULL) { @@ -576,18 +585,18 @@ bt_send_module_cfg_cmd(bt_private * priv, int subcmd) ret = BT_STATUS_FAILURE; goto exit; } - pCmd = (BT_CMD *) skb->data; - pCmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_MODULE_CFG_REQ; - pCmd->length = 1; - pCmd->data[0] = subcmd; + pcmd = (BT_CMD *) skb->data; + pcmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_MODULE_CFG_REQ; + pcmd->length = 1; + pcmd->data[0] = subcmd; bt_cb(skb)->pkt_type = MRVL_VENDOR_PKT; - skb_put(skb, BT_CMD_HEADER_SIZE + pCmd->length); + skb_put(skb, BT_CMD_HEADER_SIZE + pcmd->length); skb->dev = (void *)(&(priv->bt_dev.m_dev[BT_SEQ])); skb_queue_head(&priv->adapter->tx_queue, skb); priv->bt_dev.sendcmdflag = TRUE; priv->bt_dev.send_cmd_ocf = BT_CMD_MODULE_CFG_REQ; priv->adapter->cmd_complete = FALSE; - PRINTM(CMD, "Queue module cfg Command(0x%x)\n", pCmd->ocf_ogf); + PRINTM(CMD, "Queue module cfg Command(0x%x)\n", pcmd->ocf_ogf); wake_up_interruptible(&priv->MainThread.waitQ); /* On some Android platforms certain delay is needed for HCI daemon to @@ -622,7 +631,7 @@ bt_enable_ps(bt_private * priv) { struct sk_buff *skb = NULL; u8 ret = BT_STATUS_SUCCESS; - BT_CMD *pCmd; + BT_CMD *pcmd; ENTER(); skb = bt_skb_alloc(sizeof(BT_CMD), GFP_ATOMIC); if (skb == NULL) { @@ -630,25 +639,25 @@ bt_enable_ps(bt_private * priv) ret = BT_STATUS_FAILURE; goto exit; } - pCmd = (BT_CMD *) skb->data; - pCmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_AUTO_SLEEP_MODE; + pcmd = (BT_CMD *) skb->data; + pcmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_AUTO_SLEEP_MODE; if (priv->bt_dev.psmode) - pCmd->data[0] = BT_PS_ENABLE; + pcmd->data[0] = BT_PS_ENABLE; else - pCmd->data[0] = BT_PS_DISABLE; + pcmd->data[0] = BT_PS_DISABLE; if (priv->bt_dev.idle_timeout) { - pCmd->length = 3; - pCmd->data[1] = (u8) (priv->bt_dev.idle_timeout & 0x00ff); - pCmd->data[2] = (priv->bt_dev.idle_timeout & 0xff00) >> 8; + pcmd->length = 3; + pcmd->data[1] = (u8) (priv->bt_dev.idle_timeout & 0x00ff); + pcmd->data[2] = (priv->bt_dev.idle_timeout & 0xff00) >> 8; } else { - pCmd->length = 1; + pcmd->length = 1; } bt_cb(skb)->pkt_type = MRVL_VENDOR_PKT; - skb_put(skb, BT_CMD_HEADER_SIZE + pCmd->length); + skb_put(skb, BT_CMD_HEADER_SIZE + pcmd->length); skb->dev = (void *)(&(priv->bt_dev.m_dev[BT_SEQ])); skb_queue_head(&priv->adapter->tx_queue, skb); - PRINTM(CMD, "Queue PSMODE Command(0x%x):%d\n", pCmd->ocf_ogf, - pCmd->data[0]); + PRINTM(CMD, "Queue PSMODE Command(0x%x):%d\n", pcmd->ocf_ogf, + pcmd->data[0]); priv->bt_dev.sendcmdflag = TRUE; priv->bt_dev.send_cmd_ocf = BT_CMD_AUTO_SLEEP_MODE; priv->adapter->cmd_complete = FALSE; @@ -676,7 +685,7 @@ bt_send_hscfg_cmd(bt_private * priv) { struct sk_buff *skb = NULL; u8 ret = BT_STATUS_SUCCESS; - BT_CMD *pCmd; + BT_CMD *pcmd; ENTER(); skb = bt_skb_alloc(sizeof(BT_CMD), GFP_ATOMIC); if (skb == NULL) { @@ -684,17 +693,17 @@ bt_send_hscfg_cmd(bt_private * priv) ret = BT_STATUS_FAILURE; goto exit; } - pCmd = (BT_CMD *) skb->data; - pCmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_HOST_SLEEP_CONFIG; - pCmd->length = 2; - pCmd->data[0] = (priv->bt_dev.gpio_gap & 0xff00) >> 8; - pCmd->data[1] = (u8) (priv->bt_dev.gpio_gap & 0x00ff); + pcmd = (BT_CMD *) skb->data; + pcmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_HOST_SLEEP_CONFIG; + pcmd->length = 2; + pcmd->data[0] = (priv->bt_dev.gpio_gap & 0xff00) >> 8; + pcmd->data[1] = (u8) (priv->bt_dev.gpio_gap & 0x00ff); bt_cb(skb)->pkt_type = MRVL_VENDOR_PKT; - skb_put(skb, BT_CMD_HEADER_SIZE + pCmd->length); + skb_put(skb, BT_CMD_HEADER_SIZE + pcmd->length); skb->dev = (void *)(&(priv->bt_dev.m_dev[BT_SEQ])); skb_queue_head(&priv->adapter->tx_queue, skb); PRINTM(CMD, "Queue HSCFG Command(0x%x),gpio=0x%x,gap=0x%x\n", - pCmd->ocf_ogf, pCmd->data[0], pCmd->data[1]); + pcmd->ocf_ogf, pcmd->data[0], pcmd->data[1]); priv->bt_dev.sendcmdflag = TRUE; priv->bt_dev.send_cmd_ocf = BT_CMD_HOST_SLEEP_CONFIG; priv->adapter->cmd_complete = FALSE; @@ -722,7 +731,7 @@ bt_send_sdio_pull_ctrl_cmd(bt_private * priv) { struct sk_buff *skb = NULL; u8 ret = BT_STATUS_SUCCESS; - BT_CMD *pCmd; + BT_CMD *pcmd; ENTER(); skb = bt_skb_alloc(sizeof(BT_CMD), GFP_ATOMIC); if (skb == NULL) { @@ -730,21 +739,21 @@ bt_send_sdio_pull_ctrl_cmd(bt_private * priv) ret = BT_STATUS_FAILURE; goto exit; } - pCmd = (BT_CMD *) skb->data; - pCmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_SDIO_PULL_CFG_REQ; - pCmd->length = 4; - pCmd->data[0] = (priv->bt_dev.sdio_pull_cfg & 0x000000ff); - pCmd->data[1] = (priv->bt_dev.sdio_pull_cfg & 0x0000ff00) >> 8; - pCmd->data[2] = (priv->bt_dev.sdio_pull_cfg & 0x00ff0000) >> 16; - pCmd->data[3] = (priv->bt_dev.sdio_pull_cfg & 0xff000000) >> 24; + pcmd = (BT_CMD *) skb->data; + pcmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_SDIO_PULL_CFG_REQ; + pcmd->length = 4; + pcmd->data[0] = (priv->bt_dev.sdio_pull_cfg & 0x000000ff); + pcmd->data[1] = (priv->bt_dev.sdio_pull_cfg & 0x0000ff00) >> 8; + pcmd->data[2] = (priv->bt_dev.sdio_pull_cfg & 0x00ff0000) >> 16; + pcmd->data[3] = (priv->bt_dev.sdio_pull_cfg & 0xff000000) >> 24; bt_cb(skb)->pkt_type = MRVL_VENDOR_PKT; - skb_put(skb, BT_CMD_HEADER_SIZE + pCmd->length); + skb_put(skb, BT_CMD_HEADER_SIZE + pcmd->length); skb->dev = (void *)(&(priv->bt_dev.m_dev[BT_SEQ])); skb_queue_head(&priv->adapter->tx_queue, skb); PRINTM(CMD, "Queue SDIO PULL CFG Command(0x%x), PullUp=0x%x%x,PullDown=0x%x%x\n", - pCmd->ocf_ogf, pCmd->data[1], pCmd->data[0], - pCmd->data[3], pCmd->data[2]); + pcmd->ocf_ogf, pcmd->data[1], pcmd->data[0], + pcmd->data[3], pcmd->data[2]); priv->bt_dev.sendcmdflag = TRUE; priv->bt_dev.send_cmd_ocf = BT_CMD_SDIO_PULL_CFG_REQ; priv->adapter->cmd_complete = FALSE; @@ -776,7 +785,7 @@ fm_set_intr_mask(bt_private * priv, u32 mask) { struct sk_buff *skb = NULL; u8 ret = BT_STATUS_SUCCESS; - BT_CMD *pCmd; + BT_CMD *pcmd; ENTER(); skb = bt_skb_alloc(sizeof(BT_CMD), GFP_ATOMIC); @@ -785,14 +794,14 @@ fm_set_intr_mask(bt_private * priv, u32 mask) ret = BT_STATUS_FAILURE; goto exit; } - pCmd = (BT_CMD *) skb->data; - pCmd->ocf_ogf = (VENDOR_OGF << 10) | FM_CMD; - pCmd->length = 0x05; - pCmd->data[0] = FM_SET_INTR_MASK; - memcpy(&pCmd->data[1], &mask, sizeof(mask)); + pcmd = (BT_CMD *) skb->data; + pcmd->ocf_ogf = (VENDOR_OGF << 10) | FM_CMD; + pcmd->length = 0x05; + pcmd->data[0] = FM_SET_INTR_MASK; + memcpy(&pcmd->data[1], &mask, sizeof(mask)); PRINTM(CMD, "FM set intr mask=0x%x\n", mask); bt_cb(skb)->pkt_type = HCI_COMMAND_PKT; - skb_put(skb, BT_CMD_HEADER_SIZE + pCmd->length); + skb_put(skb, BT_CMD_HEADER_SIZE + pcmd->length); skb->dev = (void *)(&(priv->bt_dev.m_dev[FM_SEQ])); skb_queue_head(&priv->adapter->tx_queue, skb); priv->bt_dev.sendcmdflag = TRUE; @@ -823,7 +832,7 @@ bt_enable_hs(bt_private * priv) { struct sk_buff *skb = NULL; u8 ret = BT_STATUS_SUCCESS; - BT_CMD *pCmd; + BT_CMD *pcmd; ENTER(); skb = bt_skb_alloc(sizeof(BT_CMD), GFP_ATOMIC); if (skb == NULL) { @@ -832,16 +841,16 @@ bt_enable_hs(bt_private * priv) goto exit; } priv->adapter->suspend_fail = FALSE; - pCmd = (BT_CMD *) skb->data; - pCmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_HOST_SLEEP_ENABLE; - pCmd->length = 0; + pcmd = (BT_CMD *) skb->data; + pcmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_HOST_SLEEP_ENABLE; + pcmd->length = 0; bt_cb(skb)->pkt_type = MRVL_VENDOR_PKT; - skb_put(skb, BT_CMD_HEADER_SIZE + pCmd->length); + skb_put(skb, BT_CMD_HEADER_SIZE + pcmd->length); skb->dev = (void *)(&(priv->bt_dev.m_dev[BT_SEQ])); skb_queue_head(&priv->adapter->tx_queue, skb); priv->bt_dev.sendcmdflag = TRUE; priv->bt_dev.send_cmd_ocf = BT_CMD_HOST_SLEEP_ENABLE; - PRINTM(CMD, "Queue hs enable Command(0x%x)\n", pCmd->ocf_ogf); + PRINTM(CMD, "Queue hs enable Command(0x%x)\n", pcmd->ocf_ogf); wake_up_interruptible(&priv->MainThread.waitQ); if (!os_wait_interruptible_timeout (priv->adapter->cmd_wait_q, priv->adapter->hs_state, @@ -884,7 +893,7 @@ bt_set_ble_deepsleep(bt_private * priv, int mode) { struct sk_buff *skb = NULL; u8 ret = BT_STATUS_SUCCESS; - BT_BLE_CMD *pCmd; + BT_BLE_CMD *pcmd; ENTER(); skb = bt_skb_alloc(sizeof(BT_BLE_CMD), GFP_ATOMIC); if (skb == NULL) { @@ -892,10 +901,10 @@ bt_set_ble_deepsleep(bt_private * priv, int mode) ret = BT_STATUS_FAILURE; goto exit; } - pCmd = (BT_BLE_CMD *) skb->data; - pCmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_BLE_DEEP_SLEEP; - pCmd->length = 1; - pCmd->deepsleep = mode; + pcmd = (BT_BLE_CMD *) skb->data; + pcmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_BLE_DEEP_SLEEP; + pcmd->length = 1; + pcmd->deepsleep = mode; bt_cb(skb)->pkt_type = MRVL_VENDOR_PKT; skb_put(skb, sizeof(BT_BLE_CMD)); skb->dev = (void *)(&(priv->bt_dev.m_dev[BT_SEQ])); @@ -903,7 +912,7 @@ bt_set_ble_deepsleep(bt_private * priv, int mode) priv->bt_dev.sendcmdflag = TRUE; priv->bt_dev.send_cmd_ocf = BT_CMD_BLE_DEEP_SLEEP; priv->adapter->cmd_complete = FALSE; - PRINTM(CMD, "BT: Set BLE deepsleep = %d (0x%x)\n", mode, pCmd->ocf_ogf); + PRINTM(CMD, "BT: Set BLE deepsleep = %d (0x%x)\n", mode, pcmd->ocf_ogf); wake_up_interruptible(&priv->MainThread.waitQ); if (!os_wait_interruptible_timeout (priv->adapter->cmd_wait_q, priv->adapter->cmd_complete, @@ -929,7 +938,7 @@ bt_get_fw_version(bt_private * priv) { struct sk_buff *skb = NULL; u8 ret = BT_STATUS_SUCCESS; - BT_HCI_CMD *pCmd; + BT_HCI_CMD *pcmd; ENTER(); skb = bt_skb_alloc(sizeof(BT_HCI_CMD), GFP_ATOMIC); if (skb == NULL) { @@ -937,10 +946,10 @@ bt_get_fw_version(bt_private * priv) ret = BT_STATUS_FAILURE; goto exit; } - pCmd = (BT_HCI_CMD *) skb->data; - pCmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_GET_FW_VERSION; - pCmd->length = 0x01; - pCmd->cmd_type = 0x00; + pcmd = (BT_HCI_CMD *) skb->data; + pcmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_GET_FW_VERSION; + pcmd->length = 0x01; + pcmd->cmd_type = 0x00; bt_cb(skb)->pkt_type = MRVL_VENDOR_PKT; skb_put(skb, 4); skb->dev = (void *)(&(priv->bt_dev.m_dev[BT_SEQ])); @@ -974,7 +983,7 @@ bt_set_mac_address(bt_private * priv, u8 * mac) { struct sk_buff *skb = NULL; u8 ret = BT_STATUS_SUCCESS; - BT_HCI_CMD *pCmd; + BT_HCI_CMD *pcmd; int i = 0; ENTER(); skb = bt_skb_alloc(sizeof(BT_HCI_CMD), GFP_ATOMIC); @@ -983,13 +992,13 @@ bt_set_mac_address(bt_private * priv, u8 * mac) ret = BT_STATUS_FAILURE; goto exit; } - pCmd = (BT_HCI_CMD *) skb->data; - pCmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_CONFIG_MAC_ADDR; - pCmd->length = 8; - pCmd->cmd_type = MRVL_VENDOR_PKT; - pCmd->cmd_len = 6; + pcmd = (BT_HCI_CMD *) skb->data; + pcmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_CONFIG_MAC_ADDR; + pcmd->length = 8; + pcmd->cmd_type = MRVL_VENDOR_PKT; + pcmd->cmd_len = 6; for (i = 0; i < 6; i++) - pCmd->data[i] = mac[5 - i]; + pcmd->data[i] = mac[5 - i]; bt_cb(skb)->pkt_type = MRVL_VENDOR_PKT; skb_put(skb, sizeof(BT_HCI_CMD)); skb->dev = (void *)(&(priv->bt_dev.m_dev[BT_SEQ])); @@ -998,7 +1007,7 @@ bt_set_mac_address(bt_private * priv, u8 * mac) priv->bt_dev.send_cmd_ocf = BT_CMD_CONFIG_MAC_ADDR; priv->adapter->cmd_complete = FALSE; PRINTM(CMD, "BT: Set mac addr " MACSTR " (0x%x)\n", MAC2STR(mac), - pCmd->ocf_ogf); + pcmd->ocf_ogf); wake_up_interruptible(&priv->MainThread.waitQ); if (!os_wait_interruptible_timeout (priv->adapter->cmd_wait_q, priv->adapter->cmd_complete, @@ -1026,7 +1035,7 @@ bt_load_cal_data(bt_private * priv, u8 * config_data, u8 * mac) { struct sk_buff *skb = NULL; u8 ret = BT_STATUS_SUCCESS; - BT_CMD *pCmd; + BT_CMD *pcmd; int i = 0; /* u8 config_data[28] = {0x37 0x01 0x1c 0x00 0xFF 0xFF 0xFF 0xFF 0x01 0x7f 0x04 0x02 0x00 0x00 0xBA 0xCE 0xC0 0xC6 0x2D 0x00 0x00 0x00 @@ -1039,31 +1048,30 @@ bt_load_cal_data(bt_private * priv, u8 * config_data, u8 * mac) ret = BT_STATUS_FAILURE; goto exit; } - pCmd = (BT_CMD *) skb->data; - pCmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_LOAD_CONFIG_DATA; - pCmd->length = 0x20; - pCmd->data[0] = 0x00; - pCmd->data[1] = 0x00; - pCmd->data[2] = 0x00; - pCmd->data[3] = 0x1C; + pcmd = (BT_CMD *) skb->data; + pcmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_LOAD_CONFIG_DATA; + pcmd->length = 0x20; + pcmd->data[0] = 0x00; + pcmd->data[1] = 0x00; + pcmd->data[2] = 0x00; + pcmd->data[3] = 0x1C; /* swip cal-data byte */ - for (i = 4; i < 32; i++) { - pCmd->data[i] = config_data[(i / 4) * 8 - 1 - i]; - } + for (i = 4; i < 32; i++) + pcmd->data[i] = config_data[(i / 4) * 8 - 1 - i]; if (mac != NULL) { - pCmd->data[2] = 0x01; /* skip checksum */ + pcmd->data[2] = 0x01; /* skip checksum */ for (i = 24; i < 30; i++) - pCmd->data[i] = mac[29 - i]; + pcmd->data[i] = mac[29 - i]; } bt_cb(skb)->pkt_type = MRVL_VENDOR_PKT; - skb_put(skb, BT_CMD_HEADER_SIZE + pCmd->length); + skb_put(skb, BT_CMD_HEADER_SIZE + pcmd->length); skb->dev = (void *)(&(priv->bt_dev.m_dev[BT_SEQ])); skb_queue_head(&priv->adapter->tx_queue, skb); priv->bt_dev.sendcmdflag = TRUE; priv->bt_dev.send_cmd_ocf = BT_CMD_LOAD_CONFIG_DATA; priv->adapter->cmd_complete = FALSE; - DBG_HEXDUMP(DAT_D, "calirate data: ", pCmd->data, 32); + DBG_HEXDUMP(DAT_D, "calirate data: ", pcmd->data, 32); wake_up_interruptible(&priv->MainThread.waitQ); if (!os_wait_interruptible_timeout (priv->adapter->cmd_wait_q, priv->adapter->cmd_complete, @@ -1091,7 +1099,7 @@ bt_write_reg(bt_private * priv, u8 type, u32 offset, u16 value) { struct sk_buff *skb = NULL; u8 ret = BT_STATUS_SUCCESS; - BT_CSU_CMD *pCmd; + BT_CSU_CMD *pcmd; ENTER(); skb = bt_skb_alloc(sizeof(BT_CSU_CMD), GFP_ATOMIC); if (skb == NULL) { @@ -1099,16 +1107,16 @@ bt_write_reg(bt_private * priv, u8 type, u32 offset, u16 value) ret = BT_STATUS_FAILURE; goto exit; } - pCmd = (BT_CSU_CMD *) skb->data; - pCmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_CSU_WRITE_REG; - pCmd->length = 7; - pCmd->type = type; - pCmd->offset[0] = (offset & 0x000000ff); - pCmd->offset[1] = (offset & 0x0000ff00) >> 8; - pCmd->offset[2] = (offset & 0x00ff0000) >> 16; - pCmd->offset[3] = (offset & 0xff000000) >> 24; - pCmd->value[0] = (value & 0x00ff); - pCmd->value[1] = (value & 0xff00) >> 8; + pcmd = (BT_CSU_CMD *) skb->data; + pcmd->ocf_ogf = (VENDOR_OGF << 10) | BT_CMD_CSU_WRITE_REG; + pcmd->length = 7; + pcmd->type = type; + pcmd->offset[0] = (offset & 0x000000ff); + pcmd->offset[1] = (offset & 0x0000ff00) >> 8; + pcmd->offset[2] = (offset & 0x00ff0000) >> 16; + pcmd->offset[3] = (offset & 0xff000000) >> 24; + pcmd->value[0] = (value & 0x00ff); + pcmd->value[1] = (value & 0xff00) >> 8; bt_cb(skb)->pkt_type = MRVL_VENDOR_PKT; skb_put(skb, sizeof(BT_CSU_CMD)); skb->dev = (void *)(&(priv->bt_dev.m_dev[BT_SEQ])); @@ -1199,7 +1207,7 @@ bt_prepare_command(bt_private * priv) * @return BT_STATUS_SUCCESS or BT_STATUS_FAILURE */ static int -SendSinglePacket(bt_private * priv, struct sk_buff *skb) +send_single_packet(bt_private * priv, struct sk_buff *skb) { int ret; ENTER(); @@ -1299,11 +1307,11 @@ done: void bt_free_adapter(bt_private * priv) { - bt_adapter *Adapter = priv->adapter; + bt_adapter *adapter = priv->adapter; ENTER(); skb_queue_purge(&priv->adapter->tx_queue); /* Free the adapter object itself */ - kfree(Adapter); + kfree(adapter); priv->adapter = NULL; LEAVE(); @@ -1383,7 +1391,7 @@ mdev_send_frame(struct m_dev *m_dev, struct sk_buff *skb) priv->debug_device_pending = 1; priv->debug_ocf_ogf[0] = skb->data[0]; priv->debug_ocf_ogf[1] = skb->data[1]; - PRINTM(CMD, "debug_ocf_ogf[0]=0x%x debug_ocf_ogf[1]=0x%x \n", + PRINTM(CMD, "debug_ocf_ogf[0]=0x%x debug_ocf_ogf[1]=0x%x\n", priv->debug_ocf_ogf[0], priv->debug_ocf_ogf[1]); } @@ -1523,6 +1531,7 @@ init_m_dev(struct m_dev *m_dev) m_dev->ioctl = mdev_ioctl; m_dev->query = mdev_query; m_dev->owner = THIS_MODULE; + m_dev->poweroff = mdev_poweroff; } @@ -1539,7 +1548,7 @@ bt_service_main_thread(void *data) { bt_thread *thread = data; bt_private *priv = thread->priv; - bt_adapter *Adapter = priv->adapter; + bt_adapter *adapter = priv->adapter; wait_queue_t wait; struct sk_buff *skb; ENTER(); @@ -1559,17 +1568,17 @@ bt_service_main_thread(void *data) } OS_SET_THREAD_STATE(TASK_RUNNING); remove_wait_queue(&thread->waitQ, &wait); - if (kthread_should_stop() || Adapter->SurpriseRemoved) { + if (kthread_should_stop() || adapter->SurpriseRemoved) { PRINTM(INFO, "main-thread: break from main thread: " "SurpriseRemoved=0x%x\n", - Adapter->SurpriseRemoved); + adapter->SurpriseRemoved); break; } PRINTM(INFO, "Main: Thread waking up...\n"); if (priv->adapter->IntCounter) { OS_INT_DISABLE; - Adapter->IntCounter = 0; + adapter->IntCounter = 0; OS_INT_RESTORE; sbi_get_int_status(priv); } else if ((priv->adapter->ps_state == PS_SLEEP) && @@ -1584,7 +1593,7 @@ bt_service_main_thread(void *data) if (!skb_queue_empty(&priv->adapter->tx_queue)) { skb = skb_dequeue(&priv->adapter->tx_queue); if (skb) { - if (SendSinglePacket(priv, skb)) + if (send_single_packet(priv, skb)) ((struct m_dev *)skb->dev)-> stat.err_tx++; else @@ -1763,7 +1772,8 @@ sbi_register_conf_dpc(bt_private * priv) } } #ifdef SDIO_SUSPEND_RESUME - priv->bt_dev.gpio_gap = 0xffff; + + priv->bt_dev.gpio_gap = 0x0464; ret = bt_send_hscfg_cmd(priv); if (ret < 0) { PRINTM(FATAL, "Send HSCFG failed!\n"); @@ -2054,6 +2064,8 @@ sbi_register_conf_dpc(bt_private * priv) bt_restore_tx_queue(priv); } + bt_register_hostwake_irq(NULL); + /* Get FW version */ bt_get_fw_version(priv); snprintf(priv->adapter->drv_ver, MAX_VER_STR_LEN, @@ -2252,7 +2264,7 @@ bt_remove_card(void *card) static int bt_set_carddetect(int on) { - PRINTM(MSG, "%s = %d\n", __FUNCTION__, on); + PRINTM(MSG, "%s = %d\n", __func__, on); if (bt_control_data && bt_control_data->set_carddetect) bt_control_data->set_carddetect(on); @@ -2268,7 +2280,7 @@ bt_set_carddetect(int on) static int bt_set_power(int on, unsigned long msec) { - PRINTM(MSG, "%s = %d\n", __FUNCTION__, on); + PRINTM(MSG, "%s = %d\n", __func__, on); if (bt_control_data && bt_control_data->set_power) bt_control_data->set_power(on); @@ -2277,6 +2289,58 @@ bt_set_power(int on, unsigned long msec) return 0; } +static irqreturn_t +bt_hostwake_isr(int irq, void *dev_id) +{ + PRINTM(INTR, "Recv hostwake isr\n"); + return IRQ_HANDLED; +} + +void +bt_enable_hostwake_irq(int flag) +{ + if (bt_irqres && irq_registered) { + PRINTM(INTR, "enable_hostwake_irq=%d\n", flag); + if (flag) { + enable_irq(bt_irqres->start); + enable_irq_wake(bt_irqres->start); + } else { + disable_irq_wake(bt_irqres->start); + disable_irq(bt_irqres->start); + } + } +} + +static void +bt_register_hostwake_irq(void *handle) +{ + if (bt_irqres && !irq_registered) { + irq_registered = + request_irq(bt_irqres->start, bt_hostwake_isr, + bt_irqres->flags, DRIVER_NAME, handle); + if (irq_registered < 0) + PRINTM(ERROR, "Couldn't acquire BT_HOST_WAKE IRQ\n"); + else { + irq_registered = 1; + enable_irq_wake(bt_irqres->start); + bt_enable_hostwake_irq(FALSE); + } + } +} + +void +mdev_poweroff(struct m_dev *m_dev) +{ + ENTER(); + + if (minicard_pwrup) { + bt_set_power(0, 0); + bt_set_carddetect(0); + } + + LEAVE(); +} + /** * @brief This function probes the platform-level device * @@ -2291,9 +2355,14 @@ bt_probe(struct platform_device *pdev) ENTER(); - bt_control_data = bt_ctrl; - bt_set_power(1, 0); /* Power On */ - bt_set_carddetect(1); /* CardDetect (0->1) */ + bt_irqres = platform_get_resource_byname(pdev, + IORESOURCE_IRQ, + IORESOURCE_NAME); + if (minicard_pwrup) { + bt_control_data = bt_ctrl; + bt_set_power(1, 0); /* Power On */ + bt_set_carddetect(1); /* CardDetect (0->1) */ + } LEAVE(); return 0; @@ -2313,9 +2382,16 @@ bt_remove(struct platform_device *pdev) ENTER(); - bt_control_data = bt_ctrl; - bt_set_power(0, 0); /* Power Off */ - bt_set_carddetect(0); /* CardDetect (1->0) */ + if (bt_irqres && irq_registered) { + PRINTM(MSG, "Free hostwake IRQ wakeup\n"); + free_irq(bt_irqres->start, NULL); + irq_registered = 0; + } + if (minicard_pwrup) { + bt_control_data = bt_ctrl; + bt_set_power(0, 0); /* Power Off */ + bt_set_carddetect(0); /* CardDetect (1->0) */ + } LEAVE(); return 0; @@ -2341,8 +2417,7 @@ bt_add_dev(void) ENTER(); - if (minicard_pwrup) - ret = platform_driver_register(&bt_device); + ret = platform_driver_register(&bt_device); LEAVE(); return ret; @@ -2358,8 +2433,7 @@ bt_del_dev(void) { ENTER(); - if (minicard_pwrup) - platform_driver_unregister(&bt_device); + platform_driver_unregister(&bt_device); LEAVE(); } diff --git a/drivers/bluetooth/sd8897/bt/bt_proc.c b/drivers/bluetooth/sd8897/bt/bt_proc.c index 74007eb7bd1f..ad9a6e9cd23d 100644 --- a/drivers/bluetooth/sd8897/bt/bt_proc.c +++ b/drivers/bluetooth/sd8897/bt/bt_proc.c @@ -71,12 +71,12 @@ struct proc_data { /** Device size */ #define item_dev_size(n) (sizeof((bt_dev_t *)0)->n) /** Device address */ -#define item_dev_addr(n) ((t_ptr) & ((bt_dev_t *)0)->n) +#define item_dev_addr(n) ((t_ptr) &((bt_dev_t *)0)->n) /** Adapter size */ #define item_adapter_size(n) (sizeof((bt_adapter *)0)->n) /** Adapter address */ -#define item_adapter_addr(n) ((t_ptr) & ((bt_adapter *)0)->n) +#define item_adapter_addr(n) ((t_ptr) &((bt_adapter *)0)->n) static struct item_data config_items[] = { #ifdef DEBUG_LEVEL1 @@ -233,23 +233,19 @@ parse_cmd52_string(const char __user * buffer, size_t len, /* Get func */ pos = strsep(&string, " \t"); - if (pos) { + if (pos) *func = string_to_number(pos); - } /* Get reg */ pos = strsep(&string, " \t"); - if (pos) { + if (pos) *reg = string_to_number(pos); - } /* Get val (optional) */ pos = strsep(&string, " \t"); - if (pos) { + if (pos) *val = string_to_number(pos); - } - if (string) - kfree(string); + kfree(string); LEAVE(); return ret; } diff --git a/drivers/bluetooth/sd8897/bt/bt_sdio.h b/drivers/bluetooth/sd8897/bt/bt_sdio.h index 30424ab7b648..e2227794e087 100644 --- a/drivers/bluetooth/sd8897/bt/bt_sdio.h +++ b/drivers/bluetooth/sd8897/bt/bt_sdio.h @@ -27,7 +27,7 @@ /** IRQ return type */ typedef irqreturn_t IRQ_RET_TYPE; /** IRQ return */ -#define IRQ_RET return IRQ_HANDLED +#define IRQ_RET (return IRQ_HANDLED) /** ISR notifier function */ typedef IRQ_RET_TYPE(*isr_notifier_fn_t) (s32 irq, void *dev_id, struct pt_regs * reg); @@ -60,7 +60,7 @@ typedef IRQ_RET_TYPE(*isr_notifier_fn_t) (s32 irq, void *dev_id, /** Host Control Registers : Configuration */ #define CONFIGURATION_REG 0x00 /** Host Control Registers : Host without Command 53 finish host*/ -#define HOST_TO_CARD_EVENT (0x1U << 3) +#define HOST_TO_CARD_EVENT (0x1U << 3) /** Host Control Registers : Host without Command 53 finish host */ #define HOST_WO_CMD53_FINISH_HOST (0x1U << 2) /** Host Control Registers : Host power up */ @@ -70,11 +70,13 @@ typedef IRQ_RET_TYPE(*isr_notifier_fn_t) (s32 irq, void *dev_id, /** Host Control Registers : Host interrupt RSR */ #define HOST_INT_RSR_REG 0x01 + /** Host Control Registers : Upload host interrupt RSR */ #define UP_LD_HOST_INT_RSR (0x1U) /** Host Control Registers : Host interrupt mask */ #define HOST_INT_MASK_REG 0x02 + /** Host Control Registers : Upload host interrupt mask */ #define UP_LD_HOST_INT_MASK (0x1U) /** Host Control Registers : Download host interrupt mask */ @@ -84,7 +86,6 @@ typedef IRQ_RET_TYPE(*isr_notifier_fn_t) (s32 irq, void *dev_id, /** Disable Host interrupt mask */ #define HIM_DISABLE 0xff -/** Host Control Registers : Host interrupt status */ #define HOST_INTSTATUS_REG 0x03 /** Host Control Registers : Upload host interrupt status */ #define UP_LD_HOST_INT_STATUS (0x1U) @@ -112,50 +113,50 @@ typedef IRQ_RET_TYPE(*isr_notifier_fn_t) (s32 irq, void *dev_id, #define DN_LD_CARD_RDY (0x1U << 0) /** Card Control Registers : Host interrupt mask register */ -#define HOST_INTERRUPT_MASK_REG 0x54 +#define HOST_INTERRUPT_MASK_REG 0x54 /** Card Control Registers : Host power interrupt mask */ #define HOST_POWER_INT_MASK (0x1U << 3) /** Card Control Registers : Abort card interrupt mask */ #define ABORT_CARD_INT_MASK (0x1U << 2) /** Card Control Registers : Upload card interrupt mask */ -#define UP_LD_CARD_INT_MASK (0x1U << 1) +#define UP_LD_CARD_INT_MASK (0x1U << 1) /** Card Control Registers : Download card interrupt mask */ -#define DN_LD_CARD_INT_MASK (0x1U << 0) +#define DN_LD_CARD_INT_MASK (0x1U << 0) /** Card Control Registers : Card interrupt status register */ -#define CARD_INTERRUPT_STATUS_REG 0x58 +#define CARD_INTERRUPT_STATUS_REG 0x58 /** Card Control Registers : Power up interrupt */ -#define POWER_UP_INT (0x1U << 4) +#define POWER_UP_INT (0x1U << 4) /** Card Control Registers : Power down interrupt */ -#define POWER_DOWN_INT (0x1U << 3) +#define POWER_DOWN_INT (0x1U << 3) /** Card Control Registers : Card interrupt RSR register */ -#define CARD_INTERRUPT_RSR_REG 0x5c +#define CARD_INTERRUPT_RSR_REG 0x5c /** Card Control Registers : Power up RSR */ -#define POWER_UP_RSR (0x1U << 4) +#define POWER_UP_RSR (0x1U << 4) /** Card Control Registers : Power down RSR */ -#define POWER_DOWN_RSR (0x1U << 3) +#define POWER_DOWN_RSR (0x1U << 3) /* Card Control Registers */ /** Card Control Registers : Read SQ base address A0 register */ -#define SQ_READ_BASE_ADDRESS_A0_REG 0x60 +#define SQ_READ_BASE_ADDRESS_A0_REG 0x60 /** Card Control Registers : Read SQ base address A1 register */ -#define SQ_READ_BASE_ADDRESS_A1_REG 0x61 +#define SQ_READ_BASE_ADDRESS_A1_REG 0x61 /** Card Control Registers : Read SQ base address A2 register */ -#define SQ_READ_BASE_ADDRESS_A2_REG 0x62 +#define SQ_READ_BASE_ADDRESS_A2_REG 0x62 /** Card Control Registers : Read SQ base address A3 register */ -#define SQ_READ_BASE_ADDRESS_A3_REG 0x63 +#define SQ_READ_BASE_ADDRESS_A3_REG 0x63 /** Card Control Registers : Write SQ base address A0 register */ -#define SQ_WRITE_BASE_ADDRESS_A0_REG 0x64 +#define SQ_WRITE_BASE_ADDRESS_A0_REG 0x64 /** Card Control Registers : Write SQ base address A1 register */ -#define SQ_WRITE_BASE_ADDRESS_A1_REG 0x65 +#define SQ_WRITE_BASE_ADDRESS_A1_REG 0x65 /** Card Control Registers : Write SQ base address A2 register */ -#define SQ_WRITE_BASE_ADDRESS_A2_REG 0x66 +#define SQ_WRITE_BASE_ADDRESS_A2_REG 0x66 /** Card Control Registers : Write SQ base address A3 register */ -#define SQ_WRITE_BASE_ADDRESS_A3_REG 0x67 +#define SQ_WRITE_BASE_ADDRESS_A3_REG 0x67 /** Card Control Registers : Card revision register */ -#define CARD_REVISION_REG 0xBC +#define CARD_REVISION_REG 0xBC /** Firmware status 0 register (SCRATCH0_0) */ #define CARD_FW_STATUS0_REG 0xC0 @@ -223,6 +224,7 @@ struct sdio_mmc_card { int sd_read_cmd52_val(bt_private * priv); /** This function updates card reg based on the Cmd52 value in dev structure */ int sd_write_cmd52_val(bt_private * priv, int func, int reg, int val); +void bt_enable_hostwake_irq(int flag); #ifdef SDIO_SUSPEND_RESUME #ifdef MMC_PM_KEEP_POWER diff --git a/drivers/bluetooth/sd8897/bt/bt_sdiommc.c b/drivers/bluetooth/sd8897/bt/bt_sdiommc.c index 01f84fbc159c..0d9f82eb3db2 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_a0.bin" +#define DEFAULT_FW_NAME "mrvl/sd8897_uapsta.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,9 +431,6 @@ 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; @@ -441,11 +438,7 @@ sd_init_fw_dpc(bt_private * priv) PRINTM(INFO, "BT: Downloading FW image (%d bytes)\n", firmwarelen); -#ifdef FW_DOWNLOAD_SPEED - tv1 = get_utimeofday(); -#endif - - tmpfwbufsz = ALIGN_SZ(BT_UPLD_SIZE, DMA_ALIGNMENT); + tmpfwbufsz = BT_UPLD_SIZE + DMA_ALIGNMENT; tmpfwbuf = kmalloc(tmpfwbufsz, GFP_KERNEL); if (!tmpfwbuf) { PRINTM(ERROR, @@ -565,18 +558,7 @@ sd_init_fw_dpc(bt_private * priv) ret = BT_STATUS_SUCCESS; done: -#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); + kfree(tmpfwbuf); LEAVE(); return ret; } @@ -681,9 +663,8 @@ 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); @@ -719,8 +700,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) @@ -768,7 +749,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) @@ -1072,7 +1053,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", - __FUNCTION__, func, card); + __func__, func, card); LEAVE(); return; } @@ -1160,7 +1141,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) @@ -1214,6 +1195,9 @@ 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)) { @@ -1236,7 +1220,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) @@ -1249,6 +1233,7 @@ 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); @@ -1320,7 +1305,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 @@ -1333,7 +1318,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) @@ -1348,7 +1333,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) @@ -1383,8 +1368,7 @@ 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", - __FUNCTION__); + PRINTM(FATAL, ": %s: cannot set SDIO block size\n", __func__); goto release_irq; } @@ -1427,6 +1411,21 @@ 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); @@ -1447,7 +1446,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) @@ -1472,7 +1471,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) @@ -1499,7 +1498,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) @@ -1526,8 +1525,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) @@ -1551,9 +1550,11 @@ 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 = ALIGN_SZ(nb, DMA_ALIGNMENT); + tmpbufsz = buf_block_len * blksz + DMA_ALIGNMENT; tmpbuf = kmalloc(tmpbufsz, GFP_KERNEL); if (!tmpbuf) { LEAVE(); @@ -1564,8 +1565,6 @@ 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 { @@ -1602,7 +1601,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) @@ -1692,7 +1691,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) @@ -1731,7 +1730,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) diff --git a/drivers/bluetooth/sd8897/bt/hci_wrapper.h b/drivers/bluetooth/sd8897/bt/hci_wrapper.h index 849b96e294a7..b8870359559f 100644 --- a/drivers/bluetooth/sd8897/bt/hci_wrapper.h +++ b/drivers/bluetooth/sd8897/bt/hci_wrapper.h @@ -76,6 +76,7 @@ struct m_dev { int (*ioctl) (struct m_dev * m_dev, unsigned int cmd, unsigned long arg); void (*query) (struct m_dev * m_dev, unsigned long arg); + void (*poweroff) (struct m_dev * m_dev); }; diff --git a/drivers/bluetooth/sd8897/bt/mbt_char.c b/drivers/bluetooth/sd8897/bt/mbt_char.c index 279bfa0b8cce..27afcf97774f 100644 --- a/drivers/bluetooth/sd8897/bt/mbt_char.c +++ b/drivers/bluetooth/sd8897/bt/mbt_char.c @@ -372,6 +372,9 @@ chardev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) case MBTCHAR_IOCTL_QUERY_TYPE: m_dev->query(m_dev, arg); break; + case MBTCHAR_IOCTL_POWER_OFF: + m_dev->poweroff(m_dev); + break; default: break; } diff --git a/drivers/bluetooth/sd8897/bt/mbt_char.h b/drivers/bluetooth/sd8897/bt/mbt_char.h index 7ac992241cc2..a6918f159794 100644 --- a/drivers/bluetooth/sd8897/bt/mbt_char.h +++ b/drivers/bluetooth/sd8897/bt/mbt_char.h @@ -28,6 +28,8 @@ #define MBTCHAR_IOCTL_RELEASE _IO('M', 1) #define MBTCHAR_IOCTL_QUERY_TYPE _IO('M', 2) +#define MBTCHAR_IOCTL_POWER_OFF _IO('M', 3) + #define MBTCHAR_MAJOR_NUM (0) /** Interface specific macros */ |