| 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; | 
 | 70 | }; | 
 | 71 |  | 
 | 72 | struct btmrvl_private { | 
 | 73 | 	struct btmrvl_device btmrvl_dev; | 
 | 74 | 	struct btmrvl_adapter *adapter; | 
 | 75 | 	struct btmrvl_thread main_thread; | 
 | 76 | 	int (*hw_host_to_card) (struct btmrvl_private *priv, | 
 | 77 | 				u8 *payload, u16 nb); | 
 | 78 | 	int (*hw_wakeup_firmware) (struct btmrvl_private *priv); | 
| Amitkumar Karwar | d1d10d7 | 2010-05-27 16:38:37 -0700 | [diff] [blame] | 79 | 	int (*hw_process_int_status) (struct btmrvl_private *priv); | 
| Bing Zhao | 132ff4e | 2009-06-02 14:29:35 -0700 | [diff] [blame] | 80 | 	spinlock_t driver_lock;		/* spinlock used by driver */ | 
| Bing Zhao | fb784f0 | 2009-06-02 14:29:37 -0700 | [diff] [blame] | 81 | #ifdef CONFIG_DEBUG_FS | 
 | 82 | 	void *debugfs_data; | 
 | 83 | #endif | 
| Bing Zhao | 132ff4e | 2009-06-02 14:29:35 -0700 | [diff] [blame] | 84 | }; | 
 | 85 |  | 
 | 86 | #define MRVL_VENDOR_PKT			0xFE | 
 | 87 |  | 
 | 88 | /* Bluetooth commands  */ | 
 | 89 | #define BT_CMD_AUTO_SLEEP_MODE		0x23 | 
 | 90 | #define BT_CMD_HOST_SLEEP_CONFIG	0x59 | 
 | 91 | #define BT_CMD_HOST_SLEEP_ENABLE	0x5A | 
 | 92 | #define BT_CMD_MODULE_CFG_REQ		0x5B | 
 | 93 |  | 
| Bing Zhao | 903c843 | 2010-03-03 14:37:35 -0800 | [diff] [blame] | 94 | /* Sub-commands: Module Bringup/Shutdown Request/Response */ | 
| Bing Zhao | 132ff4e | 2009-06-02 14:29:35 -0700 | [diff] [blame] | 95 | #define MODULE_BRINGUP_REQ		0xF1 | 
| Bing Zhao | 903c843 | 2010-03-03 14:37:35 -0800 | [diff] [blame] | 96 | #define MODULE_BROUGHT_UP		0x00 | 
 | 97 | #define MODULE_ALREADY_UP		0x0C | 
 | 98 |  | 
| Bing Zhao | 132ff4e | 2009-06-02 14:29:35 -0700 | [diff] [blame] | 99 | #define MODULE_SHUTDOWN_REQ		0xF2 | 
 | 100 |  | 
 | 101 | #define BT_EVENT_POWER_STATE		0x20 | 
 | 102 |  | 
 | 103 | /* Bluetooth Power States */ | 
 | 104 | #define BT_PS_ENABLE			0x02 | 
 | 105 | #define BT_PS_DISABLE			0x03 | 
 | 106 | #define BT_PS_SLEEP			0x01 | 
 | 107 |  | 
 | 108 | #define OGF				0x3F | 
 | 109 |  | 
 | 110 | /* Host Sleep states */ | 
 | 111 | #define HS_ACTIVATED			0x01 | 
 | 112 | #define HS_DEACTIVATED			0x00 | 
 | 113 |  | 
 | 114 | /* Power Save modes */ | 
 | 115 | #define PS_SLEEP			0x01 | 
 | 116 | #define PS_AWAKE			0x00 | 
 | 117 |  | 
 | 118 | struct btmrvl_cmd { | 
 | 119 | 	__le16 ocf_ogf; | 
 | 120 | 	u8 length; | 
 | 121 | 	u8 data[4]; | 
| Gustavo F. Padovan | 81ca405 | 2010-07-19 13:54:05 -0300 | [diff] [blame] | 122 | } __packed; | 
| Bing Zhao | 132ff4e | 2009-06-02 14:29:35 -0700 | [diff] [blame] | 123 |  | 
 | 124 | struct btmrvl_event { | 
 | 125 | 	u8 ec;		/* event counter */ | 
 | 126 | 	u8 length; | 
 | 127 | 	u8 data[4]; | 
| Gustavo F. Padovan | 81ca405 | 2010-07-19 13:54:05 -0300 | [diff] [blame] | 128 | } __packed; | 
| Bing Zhao | 132ff4e | 2009-06-02 14:29:35 -0700 | [diff] [blame] | 129 |  | 
 | 130 | /* Prototype of global function */ | 
 | 131 |  | 
| Bing Zhao | 6406160 | 2010-03-03 14:37:36 -0800 | [diff] [blame] | 132 | int btmrvl_register_hdev(struct btmrvl_private *priv); | 
| Bing Zhao | 132ff4e | 2009-06-02 14:29:35 -0700 | [diff] [blame] | 133 | struct btmrvl_private *btmrvl_add_card(void *card); | 
 | 134 | int btmrvl_remove_card(struct btmrvl_private *priv); | 
 | 135 |  | 
 | 136 | void btmrvl_interrupt(struct btmrvl_private *priv); | 
 | 137 |  | 
 | 138 | void btmrvl_check_evtpkt(struct btmrvl_private *priv, struct sk_buff *skb); | 
 | 139 | int btmrvl_process_event(struct btmrvl_private *priv, struct sk_buff *skb); | 
 | 140 |  | 
 | 141 | int btmrvl_send_module_cfg_cmd(struct btmrvl_private *priv, int subcmd); | 
| Amitkumar Karwar | 32fd639 | 2009-09-30 11:18:30 -0700 | [diff] [blame] | 142 | int btmrvl_enable_ps(struct btmrvl_private *priv); | 
| Bing Zhao | 132ff4e | 2009-06-02 14:29:35 -0700 | [diff] [blame] | 143 | int btmrvl_prepare_command(struct btmrvl_private *priv); | 
 | 144 |  | 
| Bing Zhao | fb784f0 | 2009-06-02 14:29:37 -0700 | [diff] [blame] | 145 | #ifdef CONFIG_DEBUG_FS | 
 | 146 | void btmrvl_debugfs_init(struct hci_dev *hdev); | 
 | 147 | void btmrvl_debugfs_remove(struct hci_dev *hdev); | 
 | 148 | #endif |