| Bing Zhao | 132ff4e | 2009-06-02 14:29:35 -0700 | [diff] [blame] | 1 | /* | 
|  | 2 | * Marvell Bluetooth driver: global definitions & declarations | 
|  | 3 | * | 
|  | 4 | * Copyright (C) 2009, Marvell International Ltd. | 
|  | 5 | * | 
|  | 6 | * This software file (the "File") is distributed by Marvell International | 
|  | 7 | * Ltd. under the terms of the GNU General Public License Version 2, June 1991 | 
|  | 8 | * (the "License").  You may use, redistribute and/or modify this File in | 
|  | 9 | * accordance with the terms and conditions of the License, a copy of which | 
|  | 10 | * is available by writing to the Free Software Foundation, Inc., | 
|  | 11 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the | 
|  | 12 | * worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. | 
|  | 13 | * | 
|  | 14 | * | 
|  | 15 | * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE | 
|  | 16 | * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE | 
|  | 17 | * ARE EXPRESSLY DISCLAIMED.  The License provides additional details about | 
|  | 18 | * this warranty disclaimer. | 
|  | 19 | * | 
|  | 20 | */ | 
|  | 21 |  | 
| Bing Zhao | 132ff4e | 2009-06-02 14:29:35 -0700 | [diff] [blame] | 22 | #include <linux/kthread.h> | 
|  | 23 | #include <linux/bitops.h> | 
| Tejun Heo | 5a0e3ad | 2010-03-24 17:04:11 +0900 | [diff] [blame] | 24 | #include <linux/slab.h> | 
| Bing Zhao | 132ff4e | 2009-06-02 14:29:35 -0700 | [diff] [blame] | 25 | #include <net/bluetooth/bluetooth.h> | 
|  | 26 |  | 
|  | 27 | #define BTM_HEADER_LEN			4 | 
| Bing Zhao | 132ff4e | 2009-06-02 14:29:35 -0700 | [diff] [blame] | 28 | #define BTM_UPLD_SIZE			2312 | 
|  | 29 |  | 
|  | 30 | /* Time to wait until Host Sleep state change in millisecond */ | 
|  | 31 | #define WAIT_UNTIL_HS_STATE_CHANGED	5000 | 
|  | 32 | /* Time to wait for command response in millisecond */ | 
|  | 33 | #define WAIT_UNTIL_CMD_RESP		5000 | 
|  | 34 |  | 
|  | 35 | struct btmrvl_thread { | 
|  | 36 | struct task_struct *task; | 
|  | 37 | wait_queue_head_t wait_q; | 
|  | 38 | void *priv; | 
|  | 39 | }; | 
|  | 40 |  | 
|  | 41 | struct btmrvl_device { | 
| Bing Zhao | 132ff4e | 2009-06-02 14:29:35 -0700 | [diff] [blame] | 42 | void *card; | 
|  | 43 | struct hci_dev *hcidev; | 
|  | 44 |  | 
| Bing Zhao | f120c6b | 2010-03-03 14:37:37 -0800 | [diff] [blame] | 45 | u8 dev_type; | 
|  | 46 |  | 
| Bing Zhao | 132ff4e | 2009-06-02 14:29:35 -0700 | [diff] [blame] | 47 | u8 tx_dnld_rdy; | 
|  | 48 |  | 
|  | 49 | u8 psmode; | 
|  | 50 | u8 pscmd; | 
|  | 51 | u8 hsmode; | 
|  | 52 | u8 hscmd; | 
|  | 53 |  | 
|  | 54 | /* Low byte is gap, high byte is GPIO */ | 
|  | 55 | u16 gpio_gap; | 
|  | 56 |  | 
|  | 57 | u8 hscfgcmd; | 
|  | 58 | u8 sendcmdflag; | 
|  | 59 | }; | 
|  | 60 |  | 
|  | 61 | struct btmrvl_adapter { | 
|  | 62 | u32 int_count; | 
|  | 63 | struct sk_buff_head tx_queue; | 
|  | 64 | u8 psmode; | 
|  | 65 | u8 ps_state; | 
|  | 66 | u8 hs_state; | 
|  | 67 | u8 wakeup_tries; | 
|  | 68 | wait_queue_head_t cmd_wait_q; | 
|  | 69 | u8 cmd_complete; | 
| Amitkumar Karwar | ba54a16 | 2012-04-25 11:43:54 -0700 | [diff] [blame] | 70 | bool is_suspended; | 
| Bing Zhao | 132ff4e | 2009-06-02 14:29:35 -0700 | [diff] [blame] | 71 | }; | 
|  | 72 |  | 
|  | 73 | struct btmrvl_private { | 
|  | 74 | struct btmrvl_device btmrvl_dev; | 
|  | 75 | struct btmrvl_adapter *adapter; | 
|  | 76 | struct btmrvl_thread main_thread; | 
|  | 77 | int (*hw_host_to_card) (struct btmrvl_private *priv, | 
|  | 78 | u8 *payload, u16 nb); | 
|  | 79 | int (*hw_wakeup_firmware) (struct btmrvl_private *priv); | 
| Amitkumar Karwar | d1d10d7 | 2010-05-27 16:38:37 -0700 | [diff] [blame] | 80 | int (*hw_process_int_status) (struct btmrvl_private *priv); | 
| Bing Zhao | 132ff4e | 2009-06-02 14:29:35 -0700 | [diff] [blame] | 81 | spinlock_t driver_lock;		/* spinlock used by driver */ | 
| Bing Zhao | fb784f0 | 2009-06-02 14:29:37 -0700 | [diff] [blame] | 82 | #ifdef CONFIG_DEBUG_FS | 
|  | 83 | void *debugfs_data; | 
|  | 84 | #endif | 
| Bing Zhao | 132ff4e | 2009-06-02 14:29:35 -0700 | [diff] [blame] | 85 | }; | 
|  | 86 |  | 
|  | 87 | #define MRVL_VENDOR_PKT			0xFE | 
|  | 88 |  | 
|  | 89 | /* Bluetooth commands  */ | 
|  | 90 | #define BT_CMD_AUTO_SLEEP_MODE		0x23 | 
|  | 91 | #define BT_CMD_HOST_SLEEP_CONFIG	0x59 | 
|  | 92 | #define BT_CMD_HOST_SLEEP_ENABLE	0x5A | 
|  | 93 | #define BT_CMD_MODULE_CFG_REQ		0x5B | 
|  | 94 |  | 
| Bing Zhao | 903c843 | 2010-03-03 14:37:35 -0800 | [diff] [blame] | 95 | /* Sub-commands: Module Bringup/Shutdown Request/Response */ | 
| Bing Zhao | 132ff4e | 2009-06-02 14:29:35 -0700 | [diff] [blame] | 96 | #define MODULE_BRINGUP_REQ		0xF1 | 
| Bing Zhao | 903c843 | 2010-03-03 14:37:35 -0800 | [diff] [blame] | 97 | #define MODULE_BROUGHT_UP		0x00 | 
|  | 98 | #define MODULE_ALREADY_UP		0x0C | 
|  | 99 |  | 
| Bing Zhao | 132ff4e | 2009-06-02 14:29:35 -0700 | [diff] [blame] | 100 | #define MODULE_SHUTDOWN_REQ		0xF2 | 
|  | 101 |  | 
|  | 102 | #define BT_EVENT_POWER_STATE		0x20 | 
|  | 103 |  | 
|  | 104 | /* Bluetooth Power States */ | 
|  | 105 | #define BT_PS_ENABLE			0x02 | 
|  | 106 | #define BT_PS_DISABLE			0x03 | 
|  | 107 | #define BT_PS_SLEEP			0x01 | 
|  | 108 |  | 
|  | 109 | #define OGF				0x3F | 
|  | 110 |  | 
|  | 111 | /* Host Sleep states */ | 
|  | 112 | #define HS_ACTIVATED			0x01 | 
|  | 113 | #define HS_DEACTIVATED			0x00 | 
|  | 114 |  | 
|  | 115 | /* Power Save modes */ | 
|  | 116 | #define PS_SLEEP			0x01 | 
|  | 117 | #define PS_AWAKE			0x00 | 
|  | 118 |  | 
|  | 119 | struct btmrvl_cmd { | 
|  | 120 | __le16 ocf_ogf; | 
|  | 121 | u8 length; | 
|  | 122 | u8 data[4]; | 
| Gustavo F. Padovan | 81ca405 | 2010-07-19 13:54:05 -0300 | [diff] [blame] | 123 | } __packed; | 
| Bing Zhao | 132ff4e | 2009-06-02 14:29:35 -0700 | [diff] [blame] | 124 |  | 
|  | 125 | struct btmrvl_event { | 
|  | 126 | u8 ec;		/* event counter */ | 
|  | 127 | u8 length; | 
|  | 128 | u8 data[4]; | 
| Gustavo F. Padovan | 81ca405 | 2010-07-19 13:54:05 -0300 | [diff] [blame] | 129 | } __packed; | 
| Bing Zhao | 132ff4e | 2009-06-02 14:29:35 -0700 | [diff] [blame] | 130 |  | 
|  | 131 | /* Prototype of global function */ | 
|  | 132 |  | 
| Bing Zhao | 6406160 | 2010-03-03 14:37:36 -0800 | [diff] [blame] | 133 | int btmrvl_register_hdev(struct btmrvl_private *priv); | 
| Bing Zhao | 132ff4e | 2009-06-02 14:29:35 -0700 | [diff] [blame] | 134 | struct btmrvl_private *btmrvl_add_card(void *card); | 
|  | 135 | int btmrvl_remove_card(struct btmrvl_private *priv); | 
|  | 136 |  | 
|  | 137 | void btmrvl_interrupt(struct btmrvl_private *priv); | 
|  | 138 |  | 
| Andrei Emeltchenko | ea1e76a | 2012-06-13 13:35:44 +0300 | [diff] [blame] | 139 | bool btmrvl_check_evtpkt(struct btmrvl_private *priv, struct sk_buff *skb); | 
| Bing Zhao | 132ff4e | 2009-06-02 14:29:35 -0700 | [diff] [blame] | 140 | int btmrvl_process_event(struct btmrvl_private *priv, struct sk_buff *skb); | 
|  | 141 |  | 
|  | 142 | int btmrvl_send_module_cfg_cmd(struct btmrvl_private *priv, int subcmd); | 
| Amitkumar Karwar | 2a8ff61 | 2012-04-24 16:31:40 -0700 | [diff] [blame] | 143 | int btmrvl_send_hscfg_cmd(struct btmrvl_private *priv); | 
| Amitkumar Karwar | 32fd639 | 2009-09-30 11:18:30 -0700 | [diff] [blame] | 144 | int btmrvl_enable_ps(struct btmrvl_private *priv); | 
| Bing Zhao | 132ff4e | 2009-06-02 14:29:35 -0700 | [diff] [blame] | 145 | int btmrvl_prepare_command(struct btmrvl_private *priv); | 
| Amitkumar Karwar | ba54a16 | 2012-04-25 11:43:54 -0700 | [diff] [blame] | 146 | int btmrvl_enable_hs(struct btmrvl_private *priv); | 
| Bing Zhao | 132ff4e | 2009-06-02 14:29:35 -0700 | [diff] [blame] | 147 |  | 
| Bing Zhao | fb784f0 | 2009-06-02 14:29:37 -0700 | [diff] [blame] | 148 | #ifdef CONFIG_DEBUG_FS | 
|  | 149 | void btmrvl_debugfs_init(struct hci_dev *hdev); | 
|  | 150 | void btmrvl_debugfs_remove(struct hci_dev *hdev); | 
|  | 151 | #endif |