btbcm.c (91de76e661a266731fc2889a398ad1694df9d523) | btbcm.c (2064ee332e4c1b7495cf68b84355c213d8fe71fd) |
---|---|
1/* 2 * 3 * Bluetooth support for Broadcom devices 4 * 5 * Copyright (C) 2015 Intel Corporation 6 * 7 * 8 * This program is free software; you can redistribute it and/or modify --- 31 unchanged lines hidden (view full) --- 40{ 41 struct hci_rp_read_bd_addr *bda; 42 struct sk_buff *skb; 43 44 skb = __hci_cmd_sync(hdev, HCI_OP_READ_BD_ADDR, 0, NULL, 45 HCI_INIT_TIMEOUT); 46 if (IS_ERR(skb)) { 47 int err = PTR_ERR(skb); | 1/* 2 * 3 * Bluetooth support for Broadcom devices 4 * 5 * Copyright (C) 2015 Intel Corporation 6 * 7 * 8 * This program is free software; you can redistribute it and/or modify --- 31 unchanged lines hidden (view full) --- 40{ 41 struct hci_rp_read_bd_addr *bda; 42 struct sk_buff *skb; 43 44 skb = __hci_cmd_sync(hdev, HCI_OP_READ_BD_ADDR, 0, NULL, 45 HCI_INIT_TIMEOUT); 46 if (IS_ERR(skb)) { 47 int err = PTR_ERR(skb); |
48 BT_ERR("%s: BCM: Reading device address failed (%d)", 49 hdev->name, err); | 48 bt_dev_err(hdev, "BCM: Reading device address failed (%d)", err); |
50 return err; 51 } 52 53 if (skb->len != sizeof(*bda)) { | 49 return err; 50 } 51 52 if (skb->len != sizeof(*bda)) { |
54 BT_ERR("%s: BCM: Device address length mismatch", hdev->name); | 53 bt_dev_err(hdev, "BCM: Device address length mismatch"); |
55 kfree_skb(skb); 56 return -EIO; 57 } 58 59 bda = (struct hci_rp_read_bd_addr *)skb->data; 60 61 /* Check if the address indicates a controller with either an 62 * invalid or default address. In both cases the device needs --- 6 unchanged lines hidden (view full) --- 69 * with waiting for configuration state. 70 * 71 * The address 43:30:B1:00:00:00 indicates a BCM4330B1 controller 72 * with waiting for configuration state. 73 */ 74 if (!bacmp(&bda->bdaddr, BDADDR_BCM20702A0) || 75 !bacmp(&bda->bdaddr, BDADDR_BCM4324B3) || 76 !bacmp(&bda->bdaddr, BDADDR_BCM4330B1)) { | 54 kfree_skb(skb); 55 return -EIO; 56 } 57 58 bda = (struct hci_rp_read_bd_addr *)skb->data; 59 60 /* Check if the address indicates a controller with either an 61 * invalid or default address. In both cases the device needs --- 6 unchanged lines hidden (view full) --- 68 * with waiting for configuration state. 69 * 70 * The address 43:30:B1:00:00:00 indicates a BCM4330B1 controller 71 * with waiting for configuration state. 72 */ 73 if (!bacmp(&bda->bdaddr, BDADDR_BCM20702A0) || 74 !bacmp(&bda->bdaddr, BDADDR_BCM4324B3) || 75 !bacmp(&bda->bdaddr, BDADDR_BCM4330B1)) { |
77 BT_INFO("%s: BCM: Using default device address (%pMR)", 78 hdev->name, &bda->bdaddr); | 76 bt_dev_info(hdev, "BCM: Using default device address (%pMR)", 77 &bda->bdaddr); |
79 set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks); 80 } 81 82 kfree_skb(skb); 83 84 return 0; 85} 86EXPORT_SYMBOL_GPL(btbcm_check_bdaddr); 87 88int btbcm_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr) 89{ 90 struct sk_buff *skb; 91 int err; 92 93 skb = __hci_cmd_sync(hdev, 0xfc01, 6, bdaddr, HCI_INIT_TIMEOUT); 94 if (IS_ERR(skb)) { 95 err = PTR_ERR(skb); | 78 set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks); 79 } 80 81 kfree_skb(skb); 82 83 return 0; 84} 85EXPORT_SYMBOL_GPL(btbcm_check_bdaddr); 86 87int btbcm_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr) 88{ 89 struct sk_buff *skb; 90 int err; 91 92 skb = __hci_cmd_sync(hdev, 0xfc01, 6, bdaddr, HCI_INIT_TIMEOUT); 93 if (IS_ERR(skb)) { 94 err = PTR_ERR(skb); |
96 BT_ERR("%s: BCM: Change address command failed (%d)", 97 hdev->name, err); | 95 bt_dev_err(hdev, "BCM: Change address command failed (%d)", err); |
98 return err; 99 } 100 kfree_skb(skb); 101 102 return 0; 103} 104EXPORT_SYMBOL_GPL(btbcm_set_bdaddr); 105 --- 5 unchanged lines hidden (view full) --- 111 struct sk_buff *skb; 112 u16 opcode; 113 int err = 0; 114 115 /* Start Download */ 116 skb = __hci_cmd_sync(hdev, 0xfc2e, 0, NULL, HCI_INIT_TIMEOUT); 117 if (IS_ERR(skb)) { 118 err = PTR_ERR(skb); | 96 return err; 97 } 98 kfree_skb(skb); 99 100 return 0; 101} 102EXPORT_SYMBOL_GPL(btbcm_set_bdaddr); 103 --- 5 unchanged lines hidden (view full) --- 109 struct sk_buff *skb; 110 u16 opcode; 111 int err = 0; 112 113 /* Start Download */ 114 skb = __hci_cmd_sync(hdev, 0xfc2e, 0, NULL, HCI_INIT_TIMEOUT); 115 if (IS_ERR(skb)) { 116 err = PTR_ERR(skb); |
119 BT_ERR("%s: BCM: Download Minidrv command failed (%d)", 120 hdev->name, err); | 117 bt_dev_err(hdev, "BCM: Download Minidrv command failed (%d)", 118 err); |
121 goto done; 122 } 123 kfree_skb(skb); 124 125 /* 50 msec delay after Download Minidrv completes */ 126 msleep(50); 127 128 fw_ptr = fw->data; 129 fw_size = fw->size; 130 131 while (fw_size >= sizeof(*cmd)) { 132 const u8 *cmd_param; 133 134 cmd = (struct hci_command_hdr *)fw_ptr; 135 fw_ptr += sizeof(*cmd); 136 fw_size -= sizeof(*cmd); 137 138 if (fw_size < cmd->plen) { | 119 goto done; 120 } 121 kfree_skb(skb); 122 123 /* 50 msec delay after Download Minidrv completes */ 124 msleep(50); 125 126 fw_ptr = fw->data; 127 fw_size = fw->size; 128 129 while (fw_size >= sizeof(*cmd)) { 130 const u8 *cmd_param; 131 132 cmd = (struct hci_command_hdr *)fw_ptr; 133 fw_ptr += sizeof(*cmd); 134 fw_size -= sizeof(*cmd); 135 136 if (fw_size < cmd->plen) { |
139 BT_ERR("%s: BCM: Patch is corrupted", hdev->name); | 137 bt_dev_err(hdev, "BCM: Patch is corrupted"); |
140 err = -EINVAL; 141 goto done; 142 } 143 144 cmd_param = fw_ptr; 145 fw_ptr += cmd->plen; 146 fw_size -= cmd->plen; 147 148 opcode = le16_to_cpu(cmd->opcode); 149 150 skb = __hci_cmd_sync(hdev, opcode, cmd->plen, cmd_param, 151 HCI_INIT_TIMEOUT); 152 if (IS_ERR(skb)) { 153 err = PTR_ERR(skb); | 138 err = -EINVAL; 139 goto done; 140 } 141 142 cmd_param = fw_ptr; 143 fw_ptr += cmd->plen; 144 fw_size -= cmd->plen; 145 146 opcode = le16_to_cpu(cmd->opcode); 147 148 skb = __hci_cmd_sync(hdev, opcode, cmd->plen, cmd_param, 149 HCI_INIT_TIMEOUT); 150 if (IS_ERR(skb)) { 151 err = PTR_ERR(skb); |
154 BT_ERR("%s: BCM: Patch command %04x failed (%d)", 155 hdev->name, opcode, err); | 152 bt_dev_err(hdev, "BCM: Patch command %04x failed (%d)", 153 opcode, err); |
156 goto done; 157 } 158 kfree_skb(skb); 159 } 160 161 /* 250 msec delay after Launch Ram completes */ 162 msleep(250); 163 --- 4 unchanged lines hidden (view full) --- 168 169static int btbcm_reset(struct hci_dev *hdev) 170{ 171 struct sk_buff *skb; 172 173 skb = __hci_cmd_sync(hdev, HCI_OP_RESET, 0, NULL, HCI_INIT_TIMEOUT); 174 if (IS_ERR(skb)) { 175 int err = PTR_ERR(skb); | 154 goto done; 155 } 156 kfree_skb(skb); 157 } 158 159 /* 250 msec delay after Launch Ram completes */ 160 msleep(250); 161 --- 4 unchanged lines hidden (view full) --- 166 167static int btbcm_reset(struct hci_dev *hdev) 168{ 169 struct sk_buff *skb; 170 171 skb = __hci_cmd_sync(hdev, HCI_OP_RESET, 0, NULL, HCI_INIT_TIMEOUT); 172 if (IS_ERR(skb)) { 173 int err = PTR_ERR(skb); |
176 BT_ERR("%s: BCM: Reset failed (%d)", hdev->name, err); | 174 bt_dev_err(hdev, "BCM: Reset failed (%d)", err); |
177 return err; 178 } 179 kfree_skb(skb); 180 181 /* 100 msec delay for module to complete reset process */ 182 msleep(100); 183 184 return 0; 185} 186 187static struct sk_buff *btbcm_read_local_name(struct hci_dev *hdev) 188{ 189 struct sk_buff *skb; 190 191 skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_NAME, 0, NULL, 192 HCI_INIT_TIMEOUT); 193 if (IS_ERR(skb)) { | 175 return err; 176 } 177 kfree_skb(skb); 178 179 /* 100 msec delay for module to complete reset process */ 180 msleep(100); 181 182 return 0; 183} 184 185static struct sk_buff *btbcm_read_local_name(struct hci_dev *hdev) 186{ 187 struct sk_buff *skb; 188 189 skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_NAME, 0, NULL, 190 HCI_INIT_TIMEOUT); 191 if (IS_ERR(skb)) { |
194 BT_ERR("%s: BCM: Reading local name failed (%ld)", 195 hdev->name, PTR_ERR(skb)); | 192 bt_dev_err(hdev, "BCM: Reading local name failed (%ld)", 193 PTR_ERR(skb)); |
196 return skb; 197 } 198 199 if (skb->len != sizeof(struct hci_rp_read_local_name)) { | 194 return skb; 195 } 196 197 if (skb->len != sizeof(struct hci_rp_read_local_name)) { |
200 BT_ERR("%s: BCM: Local name length mismatch", hdev->name); | 198 bt_dev_err(hdev, "BCM: Local name length mismatch"); |
201 kfree_skb(skb); 202 return ERR_PTR(-EIO); 203 } 204 205 return skb; 206} 207 208static struct sk_buff *btbcm_read_local_version(struct hci_dev *hdev) 209{ 210 struct sk_buff *skb; 211 212 skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_VERSION, 0, NULL, 213 HCI_INIT_TIMEOUT); 214 if (IS_ERR(skb)) { | 199 kfree_skb(skb); 200 return ERR_PTR(-EIO); 201 } 202 203 return skb; 204} 205 206static struct sk_buff *btbcm_read_local_version(struct hci_dev *hdev) 207{ 208 struct sk_buff *skb; 209 210 skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_VERSION, 0, NULL, 211 HCI_INIT_TIMEOUT); 212 if (IS_ERR(skb)) { |
215 BT_ERR("%s: BCM: Reading local version info failed (%ld)", 216 hdev->name, PTR_ERR(skb)); | 213 bt_dev_err(hdev, "BCM: Reading local version info failed (%ld)", 214 PTR_ERR(skb)); |
217 return skb; 218 } 219 220 if (skb->len != sizeof(struct hci_rp_read_local_version)) { | 215 return skb; 216 } 217 218 if (skb->len != sizeof(struct hci_rp_read_local_version)) { |
221 BT_ERR("%s: BCM: Local version length mismatch", hdev->name); | 219 bt_dev_err(hdev, "BCM: Local version length mismatch"); |
222 kfree_skb(skb); 223 return ERR_PTR(-EIO); 224 } 225 226 return skb; 227} 228 229static struct sk_buff *btbcm_read_verbose_config(struct hci_dev *hdev) 230{ 231 struct sk_buff *skb; 232 233 skb = __hci_cmd_sync(hdev, 0xfc79, 0, NULL, HCI_INIT_TIMEOUT); 234 if (IS_ERR(skb)) { | 220 kfree_skb(skb); 221 return ERR_PTR(-EIO); 222 } 223 224 return skb; 225} 226 227static struct sk_buff *btbcm_read_verbose_config(struct hci_dev *hdev) 228{ 229 struct sk_buff *skb; 230 231 skb = __hci_cmd_sync(hdev, 0xfc79, 0, NULL, HCI_INIT_TIMEOUT); 232 if (IS_ERR(skb)) { |
235 BT_ERR("%s: BCM: Read verbose config info failed (%ld)", 236 hdev->name, PTR_ERR(skb)); | 233 bt_dev_err(hdev, "BCM: Read verbose config info failed (%ld)", 234 PTR_ERR(skb)); |
237 return skb; 238 } 239 240 if (skb->len != 7) { | 235 return skb; 236 } 237 238 if (skb->len != 7) { |
241 BT_ERR("%s: BCM: Verbose config length mismatch", hdev->name); | 239 bt_dev_err(hdev, "BCM: Verbose config length mismatch"); |
242 kfree_skb(skb); 243 return ERR_PTR(-EIO); 244 } 245 246 return skb; 247} 248 249static struct sk_buff *btbcm_read_controller_features(struct hci_dev *hdev) 250{ 251 struct sk_buff *skb; 252 253 skb = __hci_cmd_sync(hdev, 0xfc6e, 0, NULL, HCI_INIT_TIMEOUT); 254 if (IS_ERR(skb)) { | 240 kfree_skb(skb); 241 return ERR_PTR(-EIO); 242 } 243 244 return skb; 245} 246 247static struct sk_buff *btbcm_read_controller_features(struct hci_dev *hdev) 248{ 249 struct sk_buff *skb; 250 251 skb = __hci_cmd_sync(hdev, 0xfc6e, 0, NULL, HCI_INIT_TIMEOUT); 252 if (IS_ERR(skb)) { |
255 BT_ERR("%s: BCM: Read controller features failed (%ld)", 256 hdev->name, PTR_ERR(skb)); | 253 bt_dev_err(hdev, "BCM: Read controller features failed (%ld)", 254 PTR_ERR(skb)); |
257 return skb; 258 } 259 260 if (skb->len != 9) { | 255 return skb; 256 } 257 258 if (skb->len != 9) { |
261 BT_ERR("%s: BCM: Controller features length mismatch", 262 hdev->name); | 259 bt_dev_err(hdev, "BCM: Controller features length mismatch"); |
263 kfree_skb(skb); 264 return ERR_PTR(-EIO); 265 } 266 267 return skb; 268} 269 270static struct sk_buff *btbcm_read_usb_product(struct hci_dev *hdev) 271{ 272 struct sk_buff *skb; 273 274 skb = __hci_cmd_sync(hdev, 0xfc5a, 0, NULL, HCI_INIT_TIMEOUT); 275 if (IS_ERR(skb)) { | 260 kfree_skb(skb); 261 return ERR_PTR(-EIO); 262 } 263 264 return skb; 265} 266 267static struct sk_buff *btbcm_read_usb_product(struct hci_dev *hdev) 268{ 269 struct sk_buff *skb; 270 271 skb = __hci_cmd_sync(hdev, 0xfc5a, 0, NULL, HCI_INIT_TIMEOUT); 272 if (IS_ERR(skb)) { |
276 BT_ERR("%s: BCM: Read USB product info failed (%ld)", 277 hdev->name, PTR_ERR(skb)); | 273 bt_dev_err(hdev, "BCM: Read USB product info failed (%ld)", 274 PTR_ERR(skb)); |
278 return skb; 279 } 280 281 if (skb->len != 5) { | 275 return skb; 276 } 277 278 if (skb->len != 5) { |
282 BT_ERR("%s: BCM: USB product length mismatch", hdev->name); | 279 bt_dev_err(hdev, "BCM: USB product length mismatch"); |
283 kfree_skb(skb); 284 return ERR_PTR(-EIO); 285 } 286 287 return skb; 288} 289 290static int btbcm_read_info(struct hci_dev *hdev) 291{ 292 struct sk_buff *skb; 293 294 /* Read Verbose Config Version Info */ 295 skb = btbcm_read_verbose_config(hdev); 296 if (IS_ERR(skb)) 297 return PTR_ERR(skb); 298 | 280 kfree_skb(skb); 281 return ERR_PTR(-EIO); 282 } 283 284 return skb; 285} 286 287static int btbcm_read_info(struct hci_dev *hdev) 288{ 289 struct sk_buff *skb; 290 291 /* Read Verbose Config Version Info */ 292 skb = btbcm_read_verbose_config(hdev); 293 if (IS_ERR(skb)) 294 return PTR_ERR(skb); 295 |
299 BT_INFO("%s: BCM: chip id %u", hdev->name, skb->data[1]); | 296 bt_dev_info(hdev, "BCM: chip id %u", skb->data[1]); |
300 kfree_skb(skb); 301 302 /* Read Controller Features */ 303 skb = btbcm_read_controller_features(hdev); 304 if (IS_ERR(skb)) 305 return PTR_ERR(skb); 306 | 297 kfree_skb(skb); 298 299 /* Read Controller Features */ 300 skb = btbcm_read_controller_features(hdev); 301 if (IS_ERR(skb)) 302 return PTR_ERR(skb); 303 |
307 BT_INFO("%s: BCM: features 0x%2.2x", hdev->name, skb->data[1]); | 304 bt_dev_info(hdev, "BCM: features 0x%2.2x", skb->data[1]); |
308 kfree_skb(skb); 309 310 /* Read Local Name */ 311 skb = btbcm_read_local_name(hdev); 312 if (IS_ERR(skb)) 313 return PTR_ERR(skb); 314 | 305 kfree_skb(skb); 306 307 /* Read Local Name */ 308 skb = btbcm_read_local_name(hdev); 309 if (IS_ERR(skb)) 310 return PTR_ERR(skb); 311 |
315 BT_INFO("%s: %s", hdev->name, (char *)(skb->data + 1)); | 312 bt_dev_info(hdev, "%s", (char *)(skb->data + 1)); |
316 kfree_skb(skb); 317 318 return 0; 319} 320 321static const struct { 322 u16 subver; 323 const char *name; 324} bcm_uart_subver_table[] = { 325 { 0x4103, "BCM4330B1" }, /* 002.001.003 */ 326 { 0x410e, "BCM43341B0" }, /* 002.001.014 */ 327 { 0x4406, "BCM4324B3" }, /* 002.004.006 */ 328 { 0x610c, "BCM4354" }, /* 003.001.012 */ 329 { 0x2209, "BCM43430A1" }, /* 001.002.009 */ | 313 kfree_skb(skb); 314 315 return 0; 316} 317 318static const struct { 319 u16 subver; 320 const char *name; 321} bcm_uart_subver_table[] = { 322 { 0x4103, "BCM4330B1" }, /* 002.001.003 */ 323 { 0x410e, "BCM43341B0" }, /* 002.001.014 */ 324 { 0x4406, "BCM4324B3" }, /* 002.004.006 */ 325 { 0x610c, "BCM4354" }, /* 003.001.012 */ 326 { 0x2209, "BCM43430A1" }, /* 001.002.009 */ |
327 { 0x6119, "BCM4345C0" }, /* 003.001.025 */ 328 { 0x230f, "BCM4356A2" }, /* 001.003.015 */ |
|
330 { } 331}; 332 333int btbcm_initialize(struct hci_dev *hdev, char *fw_name, size_t len) 334{ 335 u16 subver, rev; 336 const char *hw_name = NULL; 337 struct sk_buff *skb; --- 18 unchanged lines hidden (view full) --- 356 /* Read controller information */ 357 err = btbcm_read_info(hdev); 358 if (err) 359 return err; 360 361 switch ((rev & 0xf000) >> 12) { 362 case 0: 363 case 1: | 329 { } 330}; 331 332int btbcm_initialize(struct hci_dev *hdev, char *fw_name, size_t len) 333{ 334 u16 subver, rev; 335 const char *hw_name = NULL; 336 struct sk_buff *skb; --- 18 unchanged lines hidden (view full) --- 355 /* Read controller information */ 356 err = btbcm_read_info(hdev); 357 if (err) 358 return err; 359 360 switch ((rev & 0xf000) >> 12) { 361 case 0: 362 case 1: |
363 case 2: |
|
364 case 3: 365 for (i = 0; bcm_uart_subver_table[i].name; i++) { 366 if (subver == bcm_uart_subver_table[i].subver) { 367 hw_name = bcm_uart_subver_table[i].name; 368 break; 369 } 370 } 371 372 snprintf(fw_name, len, "brcm/%s.hcd", hw_name ? : "BCM"); 373 break; 374 default: 375 return 0; 376 } 377 | 364 case 3: 365 for (i = 0; bcm_uart_subver_table[i].name; i++) { 366 if (subver == bcm_uart_subver_table[i].subver) { 367 hw_name = bcm_uart_subver_table[i].name; 368 break; 369 } 370 } 371 372 snprintf(fw_name, len, "brcm/%s.hcd", hw_name ? : "BCM"); 373 break; 374 default: 375 return 0; 376 } 377 |
378 BT_INFO("%s: %s (%3.3u.%3.3u.%3.3u) build %4.4u", hdev->name, 379 hw_name ? : "BCM", (subver & 0xe000) >> 13, 380 (subver & 0x1f00) >> 8, (subver & 0x00ff), rev & 0x0fff); | 378 bt_dev_info(hdev, "%s (%3.3u.%3.3u.%3.3u) build %4.4u", 379 hw_name ? : "BCM", (subver & 0xe000) >> 13, 380 (subver & 0x1f00) >> 8, (subver & 0x00ff), rev & 0x0fff); |
381 382 return 0; 383} 384EXPORT_SYMBOL_GPL(btbcm_initialize); 385 386int btbcm_finalize(struct hci_dev *hdev) 387{ 388 struct sk_buff *skb; --- 11 unchanged lines hidden (view full) --- 400 if (IS_ERR(skb)) 401 return PTR_ERR(skb); 402 403 ver = (struct hci_rp_read_local_version *)skb->data; 404 rev = le16_to_cpu(ver->hci_rev); 405 subver = le16_to_cpu(ver->lmp_subver); 406 kfree_skb(skb); 407 | 381 382 return 0; 383} 384EXPORT_SYMBOL_GPL(btbcm_initialize); 385 386int btbcm_finalize(struct hci_dev *hdev) 387{ 388 struct sk_buff *skb; --- 11 unchanged lines hidden (view full) --- 400 if (IS_ERR(skb)) 401 return PTR_ERR(skb); 402 403 ver = (struct hci_rp_read_local_version *)skb->data; 404 rev = le16_to_cpu(ver->hci_rev); 405 subver = le16_to_cpu(ver->lmp_subver); 406 kfree_skb(skb); 407 |
408 BT_INFO("%s: BCM (%3.3u.%3.3u.%3.3u) build %4.4u", hdev->name, 409 (subver & 0xe000) >> 13, (subver & 0x1f00) >> 8, 410 (subver & 0x00ff), rev & 0x0fff); | 408 bt_dev_info(hdev, "BCM (%3.3u.%3.3u.%3.3u) build %4.4u", 409 (subver & 0xe000) >> 13, (subver & 0x1f00) >> 8, 410 (subver & 0x00ff), rev & 0x0fff); |
411 412 btbcm_check_bdaddr(hdev); 413 414 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks); 415 416 return 0; 417} 418EXPORT_SYMBOL_GPL(btbcm_finalize); --- 78 unchanged lines hidden (view full) --- 497 498 snprintf(fw_name, sizeof(fw_name), "brcm/%s-%4.4x-%4.4x.hcd", 499 hw_name ? : "BCM", vid, pid); 500 break; 501 default: 502 return 0; 503 } 504 | 411 412 btbcm_check_bdaddr(hdev); 413 414 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks); 415 416 return 0; 417} 418EXPORT_SYMBOL_GPL(btbcm_finalize); --- 78 unchanged lines hidden (view full) --- 497 498 snprintf(fw_name, sizeof(fw_name), "brcm/%s-%4.4x-%4.4x.hcd", 499 hw_name ? : "BCM", vid, pid); 500 break; 501 default: 502 return 0; 503 } 504 |
505 BT_INFO("%s: %s (%3.3u.%3.3u.%3.3u) build %4.4u", hdev->name, 506 hw_name ? : "BCM", (subver & 0xe000) >> 13, 507 (subver & 0x1f00) >> 8, (subver & 0x00ff), rev & 0x0fff); | 505 bt_dev_info(hdev, "%s (%3.3u.%3.3u.%3.3u) build %4.4u", 506 hw_name ? : "BCM", (subver & 0xe000) >> 13, 507 (subver & 0x1f00) >> 8, (subver & 0x00ff), rev & 0x0fff); |
508 509 err = request_firmware(&fw, fw_name, &hdev->dev); 510 if (err < 0) { | 508 509 err = request_firmware(&fw, fw_name, &hdev->dev); 510 if (err < 0) { |
511 BT_INFO("%s: BCM: Patch %s not found", hdev->name, fw_name); | 511 bt_dev_info(hdev, "BCM: Patch %s not found", fw_name); |
512 goto done; 513 } 514 515 btbcm_patchram(hdev, fw); 516 517 release_firmware(fw); 518 519 /* Reset */ --- 6 unchanged lines hidden (view full) --- 526 if (IS_ERR(skb)) 527 return PTR_ERR(skb); 528 529 ver = (struct hci_rp_read_local_version *)skb->data; 530 rev = le16_to_cpu(ver->hci_rev); 531 subver = le16_to_cpu(ver->lmp_subver); 532 kfree_skb(skb); 533 | 512 goto done; 513 } 514 515 btbcm_patchram(hdev, fw); 516 517 release_firmware(fw); 518 519 /* Reset */ --- 6 unchanged lines hidden (view full) --- 526 if (IS_ERR(skb)) 527 return PTR_ERR(skb); 528 529 ver = (struct hci_rp_read_local_version *)skb->data; 530 rev = le16_to_cpu(ver->hci_rev); 531 subver = le16_to_cpu(ver->lmp_subver); 532 kfree_skb(skb); 533 |
534 BT_INFO("%s: %s (%3.3u.%3.3u.%3.3u) build %4.4u", hdev->name, 535 hw_name ? : "BCM", (subver & 0xe000) >> 13, 536 (subver & 0x1f00) >> 8, (subver & 0x00ff), rev & 0x0fff); | 534 bt_dev_info(hdev, "%s (%3.3u.%3.3u.%3.3u) build %4.4u", 535 hw_name ? : "BCM", (subver & 0xe000) >> 13, 536 (subver & 0x1f00) >> 8, (subver & 0x00ff), rev & 0x0fff); |
537 538 /* Read Local Name */ 539 skb = btbcm_read_local_name(hdev); 540 if (IS_ERR(skb)) 541 return PTR_ERR(skb); 542 | 537 538 /* Read Local Name */ 539 skb = btbcm_read_local_name(hdev); 540 if (IS_ERR(skb)) 541 return PTR_ERR(skb); 542 |
543 BT_INFO("%s: %s", hdev->name, (char *)(skb->data + 1)); | 543 bt_dev_info(hdev, "%s", (char *)(skb->data + 1)); |
544 kfree_skb(skb); 545 546done: 547 btbcm_check_bdaddr(hdev); 548 549 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks); 550 551 return 0; --- 8 unchanged lines hidden (view full) --- 560 /* Reset */ 561 err = btbcm_reset(hdev); 562 if (err) 563 return err; 564 565 /* Read Verbose Config Version Info */ 566 skb = btbcm_read_verbose_config(hdev); 567 if (!IS_ERR(skb)) { | 544 kfree_skb(skb); 545 546done: 547 btbcm_check_bdaddr(hdev); 548 549 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks); 550 551 return 0; --- 8 unchanged lines hidden (view full) --- 560 /* Reset */ 561 err = btbcm_reset(hdev); 562 if (err) 563 return err; 564 565 /* Read Verbose Config Version Info */ 566 skb = btbcm_read_verbose_config(hdev); 567 if (!IS_ERR(skb)) { |
568 BT_INFO("%s: BCM: chip id %u build %4.4u", hdev->name, 569 skb->data[1], get_unaligned_le16(skb->data + 5)); | 568 bt_dev_info(hdev, "BCM: chip id %u build %4.4u", 569 skb->data[1], get_unaligned_le16(skb->data + 5)); |
570 kfree_skb(skb); 571 } 572 573 /* Read USB Product Info */ 574 skb = btbcm_read_usb_product(hdev); 575 if (!IS_ERR(skb)) { | 570 kfree_skb(skb); 571 } 572 573 /* Read USB Product Info */ 574 skb = btbcm_read_usb_product(hdev); 575 if (!IS_ERR(skb)) { |
576 BT_INFO("%s: BCM: product %4.4x:%4.4x", hdev->name, 577 get_unaligned_le16(skb->data + 1), 578 get_unaligned_le16(skb->data + 3)); | 576 bt_dev_info(hdev, "BCM: product %4.4x:%4.4x", 577 get_unaligned_le16(skb->data + 1), 578 get_unaligned_le16(skb->data + 3)); |
579 kfree_skb(skb); 580 } 581 582 /* Read Controller Features */ 583 skb = btbcm_read_controller_features(hdev); 584 if (!IS_ERR(skb)) { | 579 kfree_skb(skb); 580 } 581 582 /* Read Controller Features */ 583 skb = btbcm_read_controller_features(hdev); 584 if (!IS_ERR(skb)) { |
585 BT_INFO("%s: BCM: features 0x%2.2x", hdev->name, skb->data[1]); | 585 bt_dev_info(hdev, "BCM: features 0x%2.2x", skb->data[1]); |
586 kfree_skb(skb); 587 } 588 589 /* Read Local Name */ 590 skb = btbcm_read_local_name(hdev); 591 if (!IS_ERR(skb)) { | 586 kfree_skb(skb); 587 } 588 589 /* Read Local Name */ 590 skb = btbcm_read_local_name(hdev); 591 if (!IS_ERR(skb)) { |
592 BT_INFO("%s: %s", hdev->name, (char *)(skb->data + 1)); | 592 bt_dev_info(hdev, "%s", (char *)(skb->data + 1)); |
593 kfree_skb(skb); 594 } 595 596 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks); 597 598 return 0; 599} 600EXPORT_SYMBOL_GPL(btbcm_setup_apple); 601 602MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>"); 603MODULE_DESCRIPTION("Bluetooth support for Broadcom devices ver " VERSION); 604MODULE_VERSION(VERSION); 605MODULE_LICENSE("GPL"); | 593 kfree_skb(skb); 594 } 595 596 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks); 597 598 return 0; 599} 600EXPORT_SYMBOL_GPL(btbcm_setup_apple); 601 602MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>"); 603MODULE_DESCRIPTION("Bluetooth support for Broadcom devices ver " VERSION); 604MODULE_VERSION(VERSION); 605MODULE_LICENSE("GPL"); |