Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Bluetooth: btintel: Refactor btintel_set_ppag()

Current flow iterates the ACPI table associated with Bluetooth
controller looking for PPAG method. Method name can be directly passed
to acpi_evaluate_object function instead of iterating the table.

Fixes: c585a92b2f9c ("Bluetooth: btintel: Set Per Platform Antenna Gain(PPAG)")
Signed-off-by: Kiran K <kiran.k@intel.com>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

authored by

Kiran K and committed by
Luiz Augusto von Dentz
0a3e2eca 0d0df1e7

+34 -85
+34 -85
drivers/bluetooth/btintel.c
··· 26 26 #define ECDSA_OFFSET 644 27 27 #define ECDSA_HEADER_LEN 320 28 28 29 - #define BTINTEL_PPAG_NAME "PPAG" 30 - 31 29 enum { 32 30 DSM_SET_WDISABLE2_DELAY = 1, 33 31 DSM_SET_RESET_METHOD = 3, 34 - }; 35 - 36 - /* structure to store the PPAG data read from ACPI table */ 37 - struct btintel_ppag { 38 - u32 domain; 39 - u32 mode; 40 - acpi_status status; 41 - struct hci_dev *hdev; 42 32 }; 43 33 44 34 #define CMD_WRITE_BOOT_PARAMS 0xfc0e ··· 1314 1324 return 0; 1315 1325 } 1316 1326 1317 - static acpi_status btintel_ppag_callback(acpi_handle handle, u32 lvl, void *data, 1318 - void **ret) 1319 - { 1320 - acpi_status status; 1321 - size_t len; 1322 - struct btintel_ppag *ppag = data; 1323 - union acpi_object *p, *elements; 1324 - struct acpi_buffer string = {ACPI_ALLOCATE_BUFFER, NULL}; 1325 - struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL}; 1326 - struct hci_dev *hdev = ppag->hdev; 1327 - 1328 - status = acpi_get_name(handle, ACPI_FULL_PATHNAME, &string); 1329 - if (ACPI_FAILURE(status)) { 1330 - bt_dev_warn(hdev, "PPAG-BT: ACPI Failure: %s", acpi_format_exception(status)); 1331 - return status; 1332 - } 1333 - 1334 - len = strlen(string.pointer); 1335 - if (len < strlen(BTINTEL_PPAG_NAME)) { 1336 - kfree(string.pointer); 1337 - return AE_OK; 1338 - } 1339 - 1340 - if (strncmp((char *)string.pointer + len - 4, BTINTEL_PPAG_NAME, 4)) { 1341 - kfree(string.pointer); 1342 - return AE_OK; 1343 - } 1344 - kfree(string.pointer); 1345 - 1346 - status = acpi_evaluate_object(handle, NULL, NULL, &buffer); 1347 - if (ACPI_FAILURE(status)) { 1348 - ppag->status = status; 1349 - bt_dev_warn(hdev, "PPAG-BT: ACPI Failure: %s", acpi_format_exception(status)); 1350 - return status; 1351 - } 1352 - 1353 - p = buffer.pointer; 1354 - ppag = (struct btintel_ppag *)data; 1355 - 1356 - if (p->type != ACPI_TYPE_PACKAGE || p->package.count != 2) { 1357 - kfree(buffer.pointer); 1358 - bt_dev_warn(hdev, "PPAG-BT: Invalid object type: %d or package count: %d", 1359 - p->type, p->package.count); 1360 - ppag->status = AE_ERROR; 1361 - return AE_ERROR; 1362 - } 1363 - 1364 - elements = p->package.elements; 1365 - 1366 - /* PPAG table is located at element[1] */ 1367 - p = &elements[1]; 1368 - 1369 - ppag->domain = (u32)p->package.elements[0].integer.value; 1370 - ppag->mode = (u32)p->package.elements[1].integer.value; 1371 - ppag->status = AE_OK; 1372 - kfree(buffer.pointer); 1373 - return AE_CTRL_TERMINATE; 1374 - } 1375 - 1376 1327 static int btintel_set_debug_features(struct hci_dev *hdev, 1377 1328 const struct intel_debug_features *features) 1378 1329 { ··· 2358 2427 2359 2428 static void btintel_set_ppag(struct hci_dev *hdev, struct intel_version_tlv *ver) 2360 2429 { 2361 - struct btintel_ppag ppag; 2362 2430 struct sk_buff *skb; 2363 2431 struct hci_ppag_enable_cmd ppag_cmd; 2364 2432 acpi_handle handle; 2433 + struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL}; 2434 + union acpi_object *p, *elements; 2435 + u32 domain, mode; 2436 + acpi_status status; 2365 2437 2366 2438 /* PPAG is not supported if CRF is HrP2, Jfp2, JfP1 */ 2367 2439 switch (ver->cnvr_top & 0xFFF) { ··· 2382 2448 return; 2383 2449 } 2384 2450 2385 - memset(&ppag, 0, sizeof(ppag)); 2386 - 2387 - ppag.hdev = hdev; 2388 - ppag.status = AE_NOT_FOUND; 2389 - acpi_walk_namespace(ACPI_TYPE_PACKAGE, handle, 1, NULL, 2390 - btintel_ppag_callback, &ppag, NULL); 2391 - 2392 - if (ACPI_FAILURE(ppag.status)) { 2393 - if (ppag.status == AE_NOT_FOUND) { 2451 + status = acpi_evaluate_object(handle, "PPAG", NULL, &buffer); 2452 + if (ACPI_FAILURE(status)) { 2453 + if (status == AE_NOT_FOUND) { 2394 2454 bt_dev_dbg(hdev, "PPAG-BT: ACPI entry not found"); 2395 2455 return; 2396 2456 } 2457 + bt_dev_warn(hdev, "PPAG-BT: ACPI Failure: %s", acpi_format_exception(status)); 2397 2458 return; 2398 2459 } 2399 2460 2400 - if (ppag.domain != 0x12) { 2461 + p = buffer.pointer; 2462 + if (p->type != ACPI_TYPE_PACKAGE || p->package.count != 2) { 2463 + bt_dev_warn(hdev, "PPAG-BT: Invalid object type: %d or package count: %d", 2464 + p->type, p->package.count); 2465 + kfree(buffer.pointer); 2466 + return; 2467 + } 2468 + 2469 + elements = p->package.elements; 2470 + 2471 + /* PPAG table is located at element[1] */ 2472 + p = &elements[1]; 2473 + 2474 + domain = (u32)p->package.elements[0].integer.value; 2475 + mode = (u32)p->package.elements[1].integer.value; 2476 + kfree(buffer.pointer); 2477 + 2478 + if (domain != 0x12) { 2401 2479 bt_dev_dbg(hdev, "PPAG-BT: Bluetooth domain is disabled in ACPI firmware"); 2402 2480 return; 2403 2481 } ··· 2420 2474 * BIT 1 : 0 Disabled in China 2421 2475 * 1 Enabled in China 2422 2476 */ 2423 - if ((ppag.mode & 0x01) != BIT(0) && (ppag.mode & 0x02) != BIT(1)) { 2424 - bt_dev_dbg(hdev, "PPAG-BT: EU, China mode are disabled in CB/BIOS"); 2477 + mode &= 0x03; 2478 + 2479 + if (!mode) { 2480 + bt_dev_dbg(hdev, "PPAG-BT: EU, China mode are disabled in BIOS"); 2425 2481 return; 2426 2482 } 2427 2483 2428 - ppag_cmd.ppag_enable_flags = cpu_to_le32(ppag.mode); 2484 + ppag_cmd.ppag_enable_flags = cpu_to_le32(mode); 2429 2485 2430 - skb = __hci_cmd_sync(hdev, INTEL_OP_PPAG_CMD, sizeof(ppag_cmd), &ppag_cmd, HCI_CMD_TIMEOUT); 2486 + skb = __hci_cmd_sync(hdev, INTEL_OP_PPAG_CMD, sizeof(ppag_cmd), 2487 + &ppag_cmd, HCI_CMD_TIMEOUT); 2431 2488 if (IS_ERR(skb)) { 2432 2489 bt_dev_warn(hdev, "Failed to send PPAG Enable (%ld)", PTR_ERR(skb)); 2433 2490 return; 2434 2491 } 2435 - bt_dev_info(hdev, "PPAG-BT: Enabled (Mode %d)", ppag.mode); 2492 + bt_dev_info(hdev, "PPAG-BT: Enabled (Mode %d)", mode); 2436 2493 kfree_skb(skb); 2437 2494 } 2438 2495