Lines Matching full:bcm4377
26 BCM4377 = 0, enumerator
482 * id: Chip id (e.g. 0x4377 for BCM4377)
516 int (*send_calibration)(struct bcm4377_data *bcm4377);
517 int (*send_ptb)(struct bcm4377_data *bcm4377,
602 static void bcm4377_ring_doorbell(struct bcm4377_data *bcm4377, u8 doorbell, in bcm4377_ring_doorbell() argument
611 dev_dbg(&bcm4377->pdev->dev, "write %d to doorbell #%d (0x%x)\n", val, in bcm4377_ring_doorbell()
613 iowrite32(db, bcm4377->bar0 + BCM4377_BAR0_DOORBELL); in bcm4377_ring_doorbell()
616 static int bcm4377_extract_msgid(struct bcm4377_data *bcm4377, in bcm4377_extract_msgid() argument
625 &bcm4377->pdev->dev, in bcm4377_extract_msgid()
632 dev_warn(&bcm4377->pdev->dev, in bcm4377_extract_msgid()
641 static void bcm4377_handle_event(struct bcm4377_data *bcm4377, in bcm4377_handle_event() argument
653 dev_warn(&bcm4377->pdev->dev, in bcm4377_handle_event()
661 if (bcm4377_extract_msgid(bcm4377, ring, raw_msgid, &msgid)) in bcm4377_handle_event()
666 &bcm4377->pdev->dev, in bcm4377_handle_event()
681 hci_recv_frame(bcm4377->hdev, skb); in bcm4377_handle_event()
684 head = le16_to_cpu(bcm4377->ring_state->xfer_ring_head[ring->ring_id]); in bcm4377_handle_event()
686 bcm4377->ring_state->xfer_ring_head[ring->ring_id] = cpu_to_le16(head); in bcm4377_handle_event()
688 bcm4377_ring_doorbell(bcm4377, ring->doorbell, head); in bcm4377_handle_event()
693 static void bcm4377_handle_ack(struct bcm4377_data *bcm4377, in bcm4377_handle_ack() argument
702 if (bcm4377_extract_msgid(bcm4377, ring, raw_msgid, &msgid)) in bcm4377_handle_ack()
707 &bcm4377->pdev->dev, in bcm4377_handle_ack()
724 static void bcm4377_handle_completion(struct bcm4377_data *bcm4377, in bcm4377_handle_completion() argument
734 dev_warn(&bcm4377->pdev->dev, in bcm4377_handle_completion()
749 &bcm4377->pdev->dev, in bcm4377_handle_completion()
755 dev_dbg(&bcm4377->pdev->dev, in bcm4377_handle_completion()
761 bcm4377_handle_ack(bcm4377, &bcm4377->control_h2d_ring, msg_id); in bcm4377_handle_completion()
764 bcm4377_handle_ack(bcm4377, &bcm4377->hci_h2d_ring, msg_id); in bcm4377_handle_completion()
767 bcm4377_handle_ack(bcm4377, &bcm4377->sco_h2d_ring, msg_id); in bcm4377_handle_completion()
770 bcm4377_handle_ack(bcm4377, &bcm4377->acl_h2d_ring, msg_id); in bcm4377_handle_completion()
774 bcm4377_handle_event(bcm4377, &bcm4377->hci_d2h_ring, msg_id, in bcm4377_handle_completion()
779 bcm4377_handle_event(bcm4377, &bcm4377->sco_d2h_ring, msg_id, in bcm4377_handle_completion()
784 bcm4377_handle_event(bcm4377, &bcm4377->acl_d2h_ring, msg_id, in bcm4377_handle_completion()
791 &bcm4377->pdev->dev, in bcm4377_handle_completion()
797 static void bcm4377_poll_completion_ring(struct bcm4377_data *bcm4377, in bcm4377_poll_completion_ring() argument
801 __le16 *heads = bcm4377->ring_state->completion_ring_head; in bcm4377_poll_completion_ring()
802 __le16 *tails = bcm4377->ring_state->completion_ring_tail; in bcm4377_poll_completion_ring()
808 dev_dbg(&bcm4377->pdev->dev, in bcm4377_poll_completion_ring()
820 bcm4377_handle_completion(bcm4377, ring, tail); in bcm4377_poll_completion_ring()
829 struct bcm4377_data *bcm4377 = data; in bcm4377_irq() local
832 bootstage = ioread32(bcm4377->bar2 + BCM4377_BAR2_BOOTSTAGE); in bcm4377_irq()
833 rti_status = ioread32(bcm4377->bar2 + BCM4377_BAR2_RTI_STATUS); in bcm4377_irq()
835 if (bootstage != bcm4377->bootstage || in bcm4377_irq()
836 rti_status != bcm4377->rti_status) { in bcm4377_irq()
837 dev_dbg(&bcm4377->pdev->dev, in bcm4377_irq()
839 bcm4377->bootstage, bootstage, bcm4377->rti_status, in bcm4377_irq()
841 complete(&bcm4377->event); in bcm4377_irq()
842 bcm4377->bootstage = bootstage; in bcm4377_irq()
843 bcm4377->rti_status = rti_status; in bcm4377_irq()
847 dev_err(&bcm4377->pdev->dev, "RTI status is %d\n", rti_status); in bcm4377_irq()
849 bcm4377_poll_completion_ring(bcm4377, &bcm4377->control_ack_ring); in bcm4377_irq()
850 bcm4377_poll_completion_ring(bcm4377, &bcm4377->hci_acl_event_ring); in bcm4377_irq()
851 bcm4377_poll_completion_ring(bcm4377, &bcm4377->hci_acl_ack_ring); in bcm4377_irq()
852 bcm4377_poll_completion_ring(bcm4377, &bcm4377->sco_ack_ring); in bcm4377_irq()
853 bcm4377_poll_completion_ring(bcm4377, &bcm4377->sco_event_ring); in bcm4377_irq()
858 static int bcm4377_enqueue(struct bcm4377_data *bcm4377, in bcm4377_enqueue() argument
873 &bcm4377->pdev->dev, in bcm4377_enqueue()
886 head = le16_to_cpu(bcm4377->ring_state->xfer_ring_head[ring->ring_id]); in bcm4377_enqueue()
887 tail = le16_to_cpu(bcm4377->ring_state->xfer_ring_tail[ring->ring_id]); in bcm4377_enqueue()
892 dev_warn(&bcm4377->pdev->dev, in bcm4377_enqueue()
901 dev_warn(&bcm4377->pdev->dev, in bcm4377_enqueue()
938 bcm4377->bar0 + BCM4377_BAR0_SLEEP_CONTROL); in bcm4377_enqueue()
940 dev_dbg(&bcm4377->pdev->dev, in bcm4377_enqueue()
943 bcm4377->ring_state->xfer_ring_head[ring->ring_id] = in bcm4377_enqueue()
947 bcm4377_ring_doorbell(bcm4377, ring->doorbell, new_head); in bcm4377_enqueue()
969 static int bcm4377_create_completion_ring(struct bcm4377_data *bcm4377, in bcm4377_create_completion_ring() argument
976 dev_warn(&bcm4377->pdev->dev, in bcm4377_create_completion_ring()
995 ret = bcm4377_enqueue(bcm4377, &bcm4377->control_h2d_ring, &msg, in bcm4377_create_completion_ring()
1003 static int bcm4377_destroy_completion_ring(struct bcm4377_data *bcm4377, in bcm4377_destroy_completion_ring() argument
1013 ret = bcm4377_enqueue(bcm4377, &bcm4377->control_h2d_ring, &msg, in bcm4377_destroy_completion_ring()
1016 dev_warn(&bcm4377->pdev->dev, in bcm4377_destroy_completion_ring()
1024 static int bcm4377_create_transfer_ring(struct bcm4377_data *bcm4377, in bcm4377_create_transfer_ring() argument
1049 bcm4377->ring_state->xfer_ring_head[ring->ring_id] = 0; in bcm4377_create_transfer_ring()
1050 bcm4377->ring_state->xfer_ring_tail[ring->ring_id] = 0; in bcm4377_create_transfer_ring()
1054 ret = bcm4377_enqueue(bcm4377, &bcm4377->control_h2d_ring, &msg, in bcm4377_create_transfer_ring()
1082 bcm4377->ring_state->xfer_ring_head[ring->ring_id] = in bcm4377_create_transfer_ring()
1084 bcm4377_ring_doorbell(bcm4377, ring->doorbell, 0xf); in bcm4377_create_transfer_ring()
1093 static int bcm4377_destroy_transfer_ring(struct bcm4377_data *bcm4377, in bcm4377_destroy_transfer_ring() argument
1103 ret = bcm4377_enqueue(bcm4377, &bcm4377->control_h2d_ring, &msg, in bcm4377_destroy_transfer_ring()
1106 dev_warn(&bcm4377->pdev->dev, in bcm4377_destroy_transfer_ring()
1113 static int __bcm4378_send_calibration_chunk(struct bcm4377_data *bcm4377, in __bcm4378_send_calibration_chunk() argument
1128 skb = __hci_cmd_sync(bcm4377->hdev, 0xfd97, sizeof(cmd), &cmd, in __bcm4378_send_calibration_chunk()
1137 static int __bcm4378_send_calibration(struct bcm4377_data *bcm4377, in __bcm4378_send_calibration() argument
1146 dev_err(&bcm4377->pdev->dev, in __bcm4378_send_calibration()
1156 bcm4377, data + i * BCM4378_CALIBRATION_CHUNK_SIZE, in __bcm4378_send_calibration()
1159 dev_err(&bcm4377->pdev->dev, in __bcm4378_send_calibration()
1168 static int bcm4378_send_calibration(struct bcm4377_data *bcm4377) in bcm4378_send_calibration() argument
1170 if ((strcmp(bcm4377->stepping, "b1") == 0) || in bcm4378_send_calibration()
1171 strcmp(bcm4377->stepping, "b3") == 0) in bcm4378_send_calibration()
1173 bcm4377, bcm4377->taurus_beamforming_cal_blob, in bcm4378_send_calibration()
1174 bcm4377->taurus_beamforming_cal_size); in bcm4378_send_calibration()
1176 return __bcm4378_send_calibration(bcm4377, in bcm4378_send_calibration()
1177 bcm4377->taurus_cal_blob, in bcm4378_send_calibration()
1178 bcm4377->taurus_cal_size); in bcm4378_send_calibration()
1181 static int bcm4387_send_calibration(struct bcm4377_data *bcm4377) in bcm4387_send_calibration() argument
1183 if (strcmp(bcm4377->stepping, "c2") == 0) in bcm4387_send_calibration()
1185 bcm4377, bcm4377->taurus_beamforming_cal_blob, in bcm4387_send_calibration()
1186 bcm4377->taurus_beamforming_cal_size); in bcm4387_send_calibration()
1188 return __bcm4378_send_calibration(bcm4377, in bcm4387_send_calibration()
1189 bcm4377->taurus_cal_blob, in bcm4387_send_calibration()
1190 bcm4377->taurus_cal_size); in bcm4387_send_calibration()
1193 static const struct firmware *bcm4377_request_blob(struct bcm4377_data *bcm4377, in bcm4377_request_blob() argument
1201 bcm4377->hw->id, bcm4377->stepping, bcm4377->board_type, in bcm4377_request_blob()
1202 bcm4377->vendor, suffix); in bcm4377_request_blob()
1204 bcm4377->hw->id, bcm4377->stepping, bcm4377->board_type, in bcm4377_request_blob()
1206 dev_dbg(&bcm4377->pdev->dev, "Trying to load firmware: '%s' or '%s'\n", in bcm4377_request_blob()
1209 ret = firmware_request_nowarn(&fw, name0, &bcm4377->pdev->dev); in bcm4377_request_blob()
1212 ret = firmware_request_nowarn(&fw, name1, &bcm4377->pdev->dev); in bcm4377_request_blob()
1216 dev_err(&bcm4377->pdev->dev, in bcm4377_request_blob()
1221 static int bcm4377_send_ptb(struct bcm4377_data *bcm4377, in bcm4377_send_ptb() argument
1226 skb = __hci_cmd_sync(bcm4377->hdev, 0xfd98, fw->size, fw->data, in bcm4377_send_ptb()
1240 static int bcm4378_send_ptb_chunk(struct bcm4377_data *bcm4377, in bcm4378_send_ptb_chunk() argument
1254 skb = __hci_cmd_sync(bcm4377->hdev, 0xfe0d, sizeof(cmd), &cmd, in bcm4378_send_ptb_chunk()
1263 static int bcm4378_send_ptb(struct bcm4377_data *bcm4377, in bcm4378_send_ptb() argument
1273 dev_dbg(&bcm4377->pdev->dev, "sending ptb chunk %zu/%zu\n", in bcm4378_send_ptb()
1276 bcm4377, fw->data + i * BCM4378_PTB_CHUNK_SIZE, in bcm4378_send_ptb()
1279 dev_err(&bcm4377->pdev->dev, in bcm4378_send_ptb()
1290 struct bcm4377_data *bcm4377 = hci_get_drvdata(hdev); in bcm4377_hci_open() local
1293 dev_dbg(&bcm4377->pdev->dev, "creating rings\n"); in bcm4377_hci_open()
1295 ret = bcm4377_create_completion_ring(bcm4377, in bcm4377_hci_open()
1296 &bcm4377->hci_acl_ack_ring); in bcm4377_hci_open()
1299 ret = bcm4377_create_completion_ring(bcm4377, in bcm4377_hci_open()
1300 &bcm4377->hci_acl_event_ring); in bcm4377_hci_open()
1303 ret = bcm4377_create_completion_ring(bcm4377, &bcm4377->sco_ack_ring); in bcm4377_hci_open()
1306 ret = bcm4377_create_completion_ring(bcm4377, &bcm4377->sco_event_ring); in bcm4377_hci_open()
1309 dev_dbg(&bcm4377->pdev->dev, in bcm4377_hci_open()
1312 ret = bcm4377_create_transfer_ring(bcm4377, &bcm4377->hci_h2d_ring); in bcm4377_hci_open()
1315 ret = bcm4377_create_transfer_ring(bcm4377, &bcm4377->hci_d2h_ring); in bcm4377_hci_open()
1318 ret = bcm4377_create_transfer_ring(bcm4377, &bcm4377->sco_h2d_ring); in bcm4377_hci_open()
1321 ret = bcm4377_create_transfer_ring(bcm4377, &bcm4377->sco_d2h_ring); in bcm4377_hci_open()
1324 ret = bcm4377_create_transfer_ring(bcm4377, &bcm4377->acl_h2d_ring); in bcm4377_hci_open()
1327 ret = bcm4377_create_transfer_ring(bcm4377, &bcm4377->acl_d2h_ring); in bcm4377_hci_open()
1330 dev_dbg(&bcm4377->pdev->dev, in bcm4377_hci_open()
1336 bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->acl_h2d_ring); in bcm4377_hci_open()
1338 bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->sco_d2h_ring); in bcm4377_hci_open()
1340 bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->sco_h2d_ring); in bcm4377_hci_open()
1342 bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->hci_h2d_ring); in bcm4377_hci_open()
1344 bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->hci_d2h_ring); in bcm4377_hci_open()
1346 bcm4377_destroy_completion_ring(bcm4377, &bcm4377->sco_event_ring); in bcm4377_hci_open()
1348 bcm4377_destroy_completion_ring(bcm4377, &bcm4377->sco_ack_ring); in bcm4377_hci_open()
1350 bcm4377_destroy_completion_ring(bcm4377, &bcm4377->hci_acl_event_ring); in bcm4377_hci_open()
1352 bcm4377_destroy_completion_ring(bcm4377, &bcm4377->hci_acl_ack_ring); in bcm4377_hci_open()
1354 dev_err(&bcm4377->pdev->dev, "Creating rings failed with %d\n", ret); in bcm4377_hci_open()
1360 struct bcm4377_data *bcm4377 = hci_get_drvdata(hdev); in bcm4377_hci_close() local
1362 dev_dbg(&bcm4377->pdev->dev, "destroying rings in hci_close\n"); in bcm4377_hci_close()
1364 bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->acl_d2h_ring); in bcm4377_hci_close()
1365 bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->acl_h2d_ring); in bcm4377_hci_close()
1366 bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->sco_d2h_ring); in bcm4377_hci_close()
1367 bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->sco_h2d_ring); in bcm4377_hci_close()
1368 bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->hci_d2h_ring); in bcm4377_hci_close()
1369 bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->hci_h2d_ring); in bcm4377_hci_close()
1371 bcm4377_destroy_completion_ring(bcm4377, &bcm4377->sco_event_ring); in bcm4377_hci_close()
1372 bcm4377_destroy_completion_ring(bcm4377, &bcm4377->sco_ack_ring); in bcm4377_hci_close()
1373 bcm4377_destroy_completion_ring(bcm4377, &bcm4377->hci_acl_event_ring); in bcm4377_hci_close()
1374 bcm4377_destroy_completion_ring(bcm4377, &bcm4377->hci_acl_ack_ring); in bcm4377_hci_close()
1379 static bool bcm4377_is_valid_bdaddr(struct bcm4377_data *bcm4377, in bcm4377_is_valid_bdaddr() argument
1388 if (addr->b[4] != (bcm4377->hw->id & 0xff)) in bcm4377_is_valid_bdaddr()
1390 if (addr->b[5] != (bcm4377->hw->id >> 8)) in bcm4377_is_valid_bdaddr()
1395 static int bcm4377_check_bdaddr(struct bcm4377_data *bcm4377) in bcm4377_check_bdaddr() argument
1400 skb = __hci_cmd_sync(bcm4377->hdev, HCI_OP_READ_BD_ADDR, 0, NULL, in bcm4377_check_bdaddr()
1405 dev_err(&bcm4377->pdev->dev, "HCI_OP_READ_BD_ADDR failed (%d)", in bcm4377_check_bdaddr()
1411 dev_err(&bcm4377->pdev->dev, in bcm4377_check_bdaddr()
1418 if (!bcm4377_is_valid_bdaddr(bcm4377, &bda->bdaddr)) in bcm4377_check_bdaddr()
1419 set_bit(HCI_QUIRK_INVALID_BDADDR, &bcm4377->hdev->quirks); in bcm4377_check_bdaddr()
1427 struct bcm4377_data *bcm4377 = hci_get_drvdata(hdev); in bcm4377_hci_setup() local
1431 if (bcm4377->hw->send_calibration) { in bcm4377_hci_setup()
1432 ret = bcm4377->hw->send_calibration(bcm4377); in bcm4377_hci_setup()
1437 fw = bcm4377_request_blob(bcm4377, "ptb"); in bcm4377_hci_setup()
1439 dev_err(&bcm4377->pdev->dev, "failed to load PTB data"); in bcm4377_hci_setup()
1443 ret = bcm4377->hw->send_ptb(bcm4377, fw); in bcm4377_hci_setup()
1448 return bcm4377_check_bdaddr(bcm4377); in bcm4377_hci_setup()
1453 struct bcm4377_data *bcm4377 = hci_get_drvdata(hdev); in bcm4377_hci_send_frame() local
1460 ring = &bcm4377->hci_h2d_ring; in bcm4377_hci_send_frame()
1465 ring = &bcm4377->acl_h2d_ring; in bcm4377_hci_send_frame()
1470 ring = &bcm4377->sco_h2d_ring; in bcm4377_hci_send_frame()
1477 ret = bcm4377_enqueue(bcm4377, ring, skb->data, skb->len, false); in bcm4377_hci_send_frame()
1490 struct bcm4377_data *bcm4377 = hci_get_drvdata(hdev); in bcm4377_hci_set_bdaddr() local
1497 dev_err(&bcm4377->pdev->dev, in bcm4377_hci_set_bdaddr()
1506 static int bcm4377_alloc_transfer_ring(struct bcm4377_data *bcm4377, in bcm4377_alloc_transfer_ring() argument
1535 ring->ring = dmam_alloc_coherent(&bcm4377->pdev->dev, in bcm4377_alloc_transfer_ring()
1542 ring->events = devm_kcalloc(&bcm4377->pdev->dev, in bcm4377_alloc_transfer_ring()
1551 &bcm4377->pdev->dev, in bcm4377_alloc_transfer_ring()
1561 static int bcm4377_alloc_completion_ring(struct bcm4377_data *bcm4377, in bcm4377_alloc_completion_ring() argument
1575 ring->ring = dmam_alloc_coherent(&bcm4377->pdev->dev, in bcm4377_alloc_completion_ring()
1583 static int bcm4377_init_context(struct bcm4377_data *bcm4377) in bcm4377_init_context() argument
1585 struct device *dev = &bcm4377->pdev->dev; in bcm4377_init_context()
1588 bcm4377->ctx = dmam_alloc_coherent(dev, sizeof(*bcm4377->ctx), in bcm4377_init_context()
1589 &bcm4377->ctx_dma, GFP_KERNEL); in bcm4377_init_context()
1590 if (!bcm4377->ctx) in bcm4377_init_context()
1592 memset(bcm4377->ctx, 0, sizeof(*bcm4377->ctx)); in bcm4377_init_context()
1594 bcm4377->ring_state = in bcm4377_init_context()
1595 dmam_alloc_coherent(dev, sizeof(*bcm4377->ring_state), in bcm4377_init_context()
1596 &bcm4377->ring_state_dma, GFP_KERNEL); in bcm4377_init_context()
1597 if (!bcm4377->ring_state) in bcm4377_init_context()
1599 memset(bcm4377->ring_state, 0, sizeof(*bcm4377->ring_state)); in bcm4377_init_context()
1601 bcm4377->ctx->version = cpu_to_le16(1); in bcm4377_init_context()
1602 bcm4377->ctx->size = cpu_to_le16(sizeof(*bcm4377->ctx)); in bcm4377_init_context()
1603 bcm4377->ctx->enabled_caps = cpu_to_le32(2); in bcm4377_init_context()
1610 if (!dmam_alloc_coherent(&bcm4377->pdev->dev, 0x20, in bcm4377_init_context()
1613 bcm4377->ctx->peripheral_info_addr = cpu_to_le64(peripheral_info_dma); in bcm4377_init_context()
1615 bcm4377->ctx->xfer_ring_heads_addr = cpu_to_le64( in bcm4377_init_context()
1616 bcm4377->ring_state_dma + in bcm4377_init_context()
1618 bcm4377->ctx->xfer_ring_tails_addr = cpu_to_le64( in bcm4377_init_context()
1619 bcm4377->ring_state_dma + in bcm4377_init_context()
1621 bcm4377->ctx->completion_ring_heads_addr = cpu_to_le64( in bcm4377_init_context()
1622 bcm4377->ring_state_dma + in bcm4377_init_context()
1624 bcm4377->ctx->completion_ring_tails_addr = cpu_to_le64( in bcm4377_init_context()
1625 bcm4377->ring_state_dma + in bcm4377_init_context()
1628 bcm4377->ctx->n_completion_rings = in bcm4377_init_context()
1630 bcm4377->ctx->n_xfer_rings = cpu_to_le16(BCM4377_N_TRANSFER_RINGS); in bcm4377_init_context()
1632 bcm4377->ctx->control_completion_ring_addr = in bcm4377_init_context()
1633 cpu_to_le64(bcm4377->control_ack_ring.ring_dma); in bcm4377_init_context()
1634 bcm4377->ctx->control_completion_ring_n_entries = in bcm4377_init_context()
1635 cpu_to_le16(bcm4377->control_ack_ring.n_entries); in bcm4377_init_context()
1636 bcm4377->ctx->control_completion_ring_doorbell = cpu_to_le16(0xffff); in bcm4377_init_context()
1637 bcm4377->ctx->control_completion_ring_msi = 0; in bcm4377_init_context()
1638 bcm4377->ctx->control_completion_ring_header_size = 0; in bcm4377_init_context()
1639 bcm4377->ctx->control_completion_ring_footer_size = 0; in bcm4377_init_context()
1641 bcm4377->ctx->control_xfer_ring_addr = in bcm4377_init_context()
1642 cpu_to_le64(bcm4377->control_h2d_ring.ring_dma); in bcm4377_init_context()
1643 bcm4377->ctx->control_xfer_ring_n_entries = in bcm4377_init_context()
1644 cpu_to_le16(bcm4377->control_h2d_ring.n_entries); in bcm4377_init_context()
1645 bcm4377->ctx->control_xfer_ring_doorbell = in bcm4377_init_context()
1646 cpu_to_le16(bcm4377->control_h2d_ring.doorbell); in bcm4377_init_context()
1647 bcm4377->ctx->control_xfer_ring_msi = 0; in bcm4377_init_context()
1648 bcm4377->ctx->control_xfer_ring_header_size = 0; in bcm4377_init_context()
1649 bcm4377->ctx->control_xfer_ring_footer_size = in bcm4377_init_context()
1650 bcm4377->control_h2d_ring.payload_size / 4; in bcm4377_init_context()
1652 dev_dbg(&bcm4377->pdev->dev, "context initialized at IOVA %pad", in bcm4377_init_context()
1653 &bcm4377->ctx_dma); in bcm4377_init_context()
1658 static int bcm4377_prepare_rings(struct bcm4377_data *bcm4377) in bcm4377_prepare_rings() argument
1672 bcm4377->control_ack_ring.ring_id = BCM4377_ACK_RING_CONTROL; in bcm4377_prepare_rings()
1673 bcm4377->control_ack_ring.n_entries = 32; in bcm4377_prepare_rings()
1674 bcm4377->control_ack_ring.transfer_rings = in bcm4377_prepare_rings()
1677 bcm4377->hci_acl_ack_ring.ring_id = BCM4377_ACK_RING_HCI_ACL; in bcm4377_prepare_rings()
1678 bcm4377->hci_acl_ack_ring.n_entries = 2 * BCM4377_RING_N_ENTRIES; in bcm4377_prepare_rings()
1679 bcm4377->hci_acl_ack_ring.transfer_rings = in bcm4377_prepare_rings()
1681 bcm4377->hci_acl_ack_ring.delay = 1000; in bcm4377_prepare_rings()
1688 bcm4377->hci_acl_event_ring.ring_id = BCM4377_EVENT_RING_HCI_ACL; in bcm4377_prepare_rings()
1689 bcm4377->hci_acl_event_ring.payload_size = MAX_EVENT_PAYLOAD_SIZE; in bcm4377_prepare_rings()
1690 bcm4377->hci_acl_event_ring.n_entries = 2 * BCM4377_RING_N_ENTRIES; in bcm4377_prepare_rings()
1691 bcm4377->hci_acl_event_ring.transfer_rings = in bcm4377_prepare_rings()
1693 bcm4377->hci_acl_event_ring.delay = 1000; in bcm4377_prepare_rings()
1695 bcm4377->sco_ack_ring.ring_id = BCM4377_ACK_RING_SCO; in bcm4377_prepare_rings()
1696 bcm4377->sco_ack_ring.n_entries = BCM4377_RING_N_ENTRIES; in bcm4377_prepare_rings()
1697 bcm4377->sco_ack_ring.transfer_rings = BIT(BCM4377_XFER_RING_SCO_H2D); in bcm4377_prepare_rings()
1699 bcm4377->sco_event_ring.ring_id = BCM4377_EVENT_RING_SCO; in bcm4377_prepare_rings()
1700 bcm4377->sco_event_ring.payload_size = MAX_SCO_PAYLOAD_SIZE; in bcm4377_prepare_rings()
1701 bcm4377->sco_event_ring.n_entries = BCM4377_RING_N_ENTRIES; in bcm4377_prepare_rings()
1702 bcm4377->sco_event_ring.transfer_rings = BIT(BCM4377_XFER_RING_SCO_D2H); in bcm4377_prepare_rings()
1704 bcm4377->control_h2d_ring.ring_id = BCM4377_XFER_RING_CONTROL; in bcm4377_prepare_rings()
1705 bcm4377->control_h2d_ring.doorbell = BCM4377_DOORBELL_CONTROL; in bcm4377_prepare_rings()
1706 bcm4377->control_h2d_ring.payload_size = BCM4377_CONTROL_MSG_SIZE; in bcm4377_prepare_rings()
1707 bcm4377->control_h2d_ring.completion_ring = BCM4377_ACK_RING_CONTROL; in bcm4377_prepare_rings()
1708 bcm4377->control_h2d_ring.allow_wait = true; in bcm4377_prepare_rings()
1709 bcm4377->control_h2d_ring.n_entries = BCM4377_RING_N_ENTRIES; in bcm4377_prepare_rings()
1711 bcm4377->hci_h2d_ring.ring_id = BCM4377_XFER_RING_HCI_H2D; in bcm4377_prepare_rings()
1712 bcm4377->hci_h2d_ring.doorbell = BCM4377_DOORBELL_HCI_H2D; in bcm4377_prepare_rings()
1713 bcm4377->hci_h2d_ring.payload_size = MAX_EVENT_PAYLOAD_SIZE; in bcm4377_prepare_rings()
1714 bcm4377->hci_h2d_ring.completion_ring = BCM4377_ACK_RING_HCI_ACL; in bcm4377_prepare_rings()
1715 bcm4377->hci_h2d_ring.n_entries = BCM4377_RING_N_ENTRIES; in bcm4377_prepare_rings()
1717 bcm4377->hci_d2h_ring.ring_id = BCM4377_XFER_RING_HCI_D2H; in bcm4377_prepare_rings()
1718 bcm4377->hci_d2h_ring.doorbell = BCM4377_DOORBELL_HCI_D2H; in bcm4377_prepare_rings()
1719 bcm4377->hci_d2h_ring.completion_ring = BCM4377_EVENT_RING_HCI_ACL; in bcm4377_prepare_rings()
1720 bcm4377->hci_d2h_ring.virtual = true; in bcm4377_prepare_rings()
1721 bcm4377->hci_d2h_ring.n_entries = BCM4377_RING_N_ENTRIES; in bcm4377_prepare_rings()
1723 bcm4377->sco_h2d_ring.ring_id = BCM4377_XFER_RING_SCO_H2D; in bcm4377_prepare_rings()
1724 bcm4377->sco_h2d_ring.doorbell = BCM4377_DOORBELL_SCO; in bcm4377_prepare_rings()
1725 bcm4377->sco_h2d_ring.payload_size = MAX_SCO_PAYLOAD_SIZE; in bcm4377_prepare_rings()
1726 bcm4377->sco_h2d_ring.completion_ring = BCM4377_ACK_RING_SCO; in bcm4377_prepare_rings()
1727 bcm4377->sco_h2d_ring.sync = true; in bcm4377_prepare_rings()
1728 bcm4377->sco_h2d_ring.n_entries = BCM4377_RING_N_ENTRIES; in bcm4377_prepare_rings()
1730 bcm4377->sco_d2h_ring.ring_id = BCM4377_XFER_RING_SCO_D2H; in bcm4377_prepare_rings()
1731 bcm4377->sco_d2h_ring.doorbell = BCM4377_DOORBELL_SCO; in bcm4377_prepare_rings()
1732 bcm4377->sco_d2h_ring.completion_ring = BCM4377_EVENT_RING_SCO; in bcm4377_prepare_rings()
1733 bcm4377->sco_d2h_ring.virtual = true; in bcm4377_prepare_rings()
1734 bcm4377->sco_d2h_ring.sync = true; in bcm4377_prepare_rings()
1735 bcm4377->sco_d2h_ring.n_entries = BCM4377_RING_N_ENTRIES; in bcm4377_prepare_rings()
1741 bcm4377->acl_h2d_ring.ring_id = BCM4377_XFER_RING_ACL_H2D; in bcm4377_prepare_rings()
1742 bcm4377->acl_h2d_ring.doorbell = BCM4377_DOORBELL_ACL_H2D; in bcm4377_prepare_rings()
1743 bcm4377->acl_h2d_ring.mapped_payload_size = MAX_ACL_PAYLOAD_SIZE; in bcm4377_prepare_rings()
1744 bcm4377->acl_h2d_ring.completion_ring = BCM4377_ACK_RING_HCI_ACL; in bcm4377_prepare_rings()
1745 bcm4377->acl_h2d_ring.n_entries = BCM4377_RING_N_ENTRIES; in bcm4377_prepare_rings()
1751 bcm4377->acl_d2h_ring.ring_id = BCM4377_XFER_RING_ACL_D2H; in bcm4377_prepare_rings()
1752 bcm4377->acl_d2h_ring.doorbell = BCM4377_DOORBELL_ACL_D2H; in bcm4377_prepare_rings()
1753 bcm4377->acl_d2h_ring.completion_ring = BCM4377_EVENT_RING_HCI_ACL; in bcm4377_prepare_rings()
1754 bcm4377->acl_d2h_ring.d2h_buffers_only = true; in bcm4377_prepare_rings()
1755 bcm4377->acl_d2h_ring.mapped_payload_size = MAX_ACL_PAYLOAD_SIZE; in bcm4377_prepare_rings()
1756 bcm4377->acl_d2h_ring.n_entries = BCM4377_RING_N_ENTRIES; in bcm4377_prepare_rings()
1762 ret = bcm4377_alloc_transfer_ring(bcm4377, &bcm4377->control_h2d_ring); in bcm4377_prepare_rings()
1765 ret = bcm4377_alloc_transfer_ring(bcm4377, &bcm4377->hci_h2d_ring); in bcm4377_prepare_rings()
1768 ret = bcm4377_alloc_transfer_ring(bcm4377, &bcm4377->hci_d2h_ring); in bcm4377_prepare_rings()
1771 ret = bcm4377_alloc_transfer_ring(bcm4377, &bcm4377->sco_h2d_ring); in bcm4377_prepare_rings()
1774 ret = bcm4377_alloc_transfer_ring(bcm4377, &bcm4377->sco_d2h_ring); in bcm4377_prepare_rings()
1777 ret = bcm4377_alloc_transfer_ring(bcm4377, &bcm4377->acl_h2d_ring); in bcm4377_prepare_rings()
1780 ret = bcm4377_alloc_transfer_ring(bcm4377, &bcm4377->acl_d2h_ring); in bcm4377_prepare_rings()
1784 ret = bcm4377_alloc_completion_ring(bcm4377, in bcm4377_prepare_rings()
1785 &bcm4377->control_ack_ring); in bcm4377_prepare_rings()
1788 ret = bcm4377_alloc_completion_ring(bcm4377, in bcm4377_prepare_rings()
1789 &bcm4377->hci_acl_ack_ring); in bcm4377_prepare_rings()
1792 ret = bcm4377_alloc_completion_ring(bcm4377, in bcm4377_prepare_rings()
1793 &bcm4377->hci_acl_event_ring); in bcm4377_prepare_rings()
1796 ret = bcm4377_alloc_completion_ring(bcm4377, &bcm4377->sco_ack_ring); in bcm4377_prepare_rings()
1799 ret = bcm4377_alloc_completion_ring(bcm4377, &bcm4377->sco_event_ring); in bcm4377_prepare_rings()
1803 dev_dbg(&bcm4377->pdev->dev, "all rings allocated and prepared\n"); in bcm4377_prepare_rings()
1808 static int bcm4377_boot(struct bcm4377_data *bcm4377) in bcm4377_boot() argument
1816 bootstage = ioread32(bcm4377->bar2 + BCM4377_BAR2_BOOTSTAGE); in bcm4377_boot()
1817 rti_status = ioread32(bcm4377->bar2 + BCM4377_BAR2_RTI_STATUS); in bcm4377_boot()
1820 dev_err(&bcm4377->pdev->dev, "bootstage is %d and not 0\n", in bcm4377_boot()
1826 dev_err(&bcm4377->pdev->dev, "RTI status is %d and not 0\n", in bcm4377_boot()
1831 fw = bcm4377_request_blob(bcm4377, "bin"); in bcm4377_boot()
1833 dev_err(&bcm4377->pdev->dev, "Failed to load firmware\n"); in bcm4377_boot()
1837 bfr = dma_alloc_coherent(&bcm4377->pdev->dev, fw->size, &fw_dma, in bcm4377_boot()
1846 iowrite32(0, bcm4377->bar0 + BCM4377_BAR0_HOST_WINDOW_LO); in bcm4377_boot()
1847 iowrite32(0, bcm4377->bar0 + BCM4377_BAR0_HOST_WINDOW_HI); in bcm4377_boot()
1849 bcm4377->bar0 + BCM4377_BAR0_HOST_WINDOW_SIZE); in bcm4377_boot()
1851 iowrite32(lower_32_bits(fw_dma), bcm4377->bar2 + BCM4377_BAR2_FW_LO); in bcm4377_boot()
1852 iowrite32(upper_32_bits(fw_dma), bcm4377->bar2 + BCM4377_BAR2_FW_HI); in bcm4377_boot()
1853 iowrite32(fw->size, bcm4377->bar2 + BCM4377_BAR2_FW_SIZE); in bcm4377_boot()
1854 iowrite32(0, bcm4377->bar0 + BCM4377_BAR0_FW_DOORBELL); in bcm4377_boot()
1856 dev_dbg(&bcm4377->pdev->dev, "waiting for firmware to boot\n"); in bcm4377_boot()
1858 ret = wait_for_completion_interruptible_timeout(&bcm4377->event, in bcm4377_boot()
1867 if (bcm4377->bootstage != 2) { in bcm4377_boot()
1868 dev_err(&bcm4377->pdev->dev, "boostage %d != 2\n", in bcm4377_boot()
1869 bcm4377->bootstage); in bcm4377_boot()
1874 dev_dbg(&bcm4377->pdev->dev, "firmware has booted (stage = %x)\n", in bcm4377_boot()
1875 bcm4377->bootstage); in bcm4377_boot()
1879 dma_free_coherent(&bcm4377->pdev->dev, fw->size, bfr, fw_dma); in bcm4377_boot()
1885 static int bcm4377_setup_rti(struct bcm4377_data *bcm4377) in bcm4377_setup_rti() argument
1889 dev_dbg(&bcm4377->pdev->dev, "starting RTI\n"); in bcm4377_setup_rti()
1890 iowrite32(1, bcm4377->bar0 + BCM4377_BAR0_RTI_CONTROL); in bcm4377_setup_rti()
1892 ret = wait_for_completion_interruptible_timeout(&bcm4377->event, in bcm4377_setup_rti()
1895 dev_err(&bcm4377->pdev->dev, in bcm4377_setup_rti()
1902 if (bcm4377->rti_status != 1) { in bcm4377_setup_rti()
1903 dev_err(&bcm4377->pdev->dev, "RTI did not ack state 1 (%d)\n", in bcm4377_setup_rti()
1904 bcm4377->rti_status); in bcm4377_setup_rti()
1907 dev_dbg(&bcm4377->pdev->dev, "RTI is in state 1\n"); in bcm4377_setup_rti()
1910 iowrite32(0, bcm4377->bar2 + BCM4377_BAR2_RTI_WINDOW_LO); in bcm4377_setup_rti()
1911 iowrite32(0, bcm4377->bar2 + BCM4377_BAR2_RTI_WINDOW_HI); in bcm4377_setup_rti()
1913 bcm4377->bar2 + BCM4377_BAR2_RTI_WINDOW_SIZE); in bcm4377_setup_rti()
1916 iowrite32(lower_32_bits(bcm4377->ctx_dma), in bcm4377_setup_rti()
1917 bcm4377->bar2 + BCM4377_BAR2_CONTEXT_ADDR_LO); in bcm4377_setup_rti()
1918 iowrite32(upper_32_bits(bcm4377->ctx_dma), in bcm4377_setup_rti()
1919 bcm4377->bar2 + BCM4377_BAR2_CONTEXT_ADDR_HI); in bcm4377_setup_rti()
1920 iowrite32(2, bcm4377->bar0 + BCM4377_BAR0_RTI_CONTROL); in bcm4377_setup_rti()
1922 ret = wait_for_completion_interruptible_timeout(&bcm4377->event, in bcm4377_setup_rti()
1925 dev_err(&bcm4377->pdev->dev, in bcm4377_setup_rti()
1932 if (bcm4377->rti_status != 2) { in bcm4377_setup_rti()
1933 dev_err(&bcm4377->pdev->dev, "RTI did not ack state 2 (%d)\n", in bcm4377_setup_rti()
1934 bcm4377->rti_status); in bcm4377_setup_rti()
1938 dev_dbg(&bcm4377->pdev->dev, in bcm4377_setup_rti()
1940 bcm4377->control_ack_ring.enabled = true; in bcm4377_setup_rti()
1945 static int bcm4377_parse_otp_board_params(struct bcm4377_data *bcm4377, in bcm4377_parse_otp_board_params() argument
1950 if (len >= sizeof(bcm4377->vendor)) in bcm4377_parse_otp_board_params()
1953 strscpy(bcm4377->vendor, val, len + 1); in bcm4377_parse_otp_board_params()
1957 static int bcm4377_parse_otp_chip_params(struct bcm4377_data *bcm4377, char tag, in bcm4377_parse_otp_chip_params() argument
1964 if (len >= sizeof(bcm4377->stepping)) in bcm4377_parse_otp_chip_params()
1968 bcm4377->stepping[idx] = tolower(val[idx]); in bcm4377_parse_otp_chip_params()
1976 bcm4377->stepping[idx] = '\0'; in bcm4377_parse_otp_chip_params()
1980 static int bcm4377_parse_otp_str(struct bcm4377_data *bcm4377, const u8 *str, in bcm4377_parse_otp_str() argument
2005 ret = bcm4377_parse_otp_board_params(bcm4377, tag, p, in bcm4377_parse_otp_str()
2009 ret = bcm4377_parse_otp_chip_params(bcm4377, tag, p, in bcm4377_parse_otp_str()
2027 static int bcm4377_parse_otp_sys_vendor(struct bcm4377_data *bcm4377, u8 *otp, in bcm4377_parse_otp_sys_vendor() argument
2057 dev_dbg(&bcm4377->pdev->dev, in bcm4377_parse_otp_sys_vendor()
2061 ret = bcm4377_parse_otp_str(bcm4377, chip_params, in bcm4377_parse_otp_sys_vendor()
2066 ret = bcm4377_parse_otp_str(bcm4377, board_params, in bcm4377_parse_otp_sys_vendor()
2071 if (!bcm4377->stepping[0] || !bcm4377->vendor[0]) in bcm4377_parse_otp_sys_vendor()
2074 dev_dbg(&bcm4377->pdev->dev, "OTP: stepping=%s, vendor=%s\n", in bcm4377_parse_otp_sys_vendor()
2075 bcm4377->stepping, bcm4377->vendor); in bcm4377_parse_otp_sys_vendor()
2079 static int bcm4377_parse_otp(struct bcm4377_data *bcm4377) in bcm4377_parse_otp() argument
2090 otp[i] = ioread8(bcm4377->bar0 + bcm4377->hw->otp_offset + i); in bcm4377_parse_otp()
2105 dev_dbg(&bcm4377->pdev->dev, in bcm4377_parse_otp()
2107 ret = bcm4377_parse_otp_sys_vendor(bcm4377, &otp[i + 2], in bcm4377_parse_otp()
2111 dev_dbg(&bcm4377->pdev->dev, "OTP @ 0x%x (%d): CIS", i, in bcm4377_parse_otp()
2115 dev_dbg(&bcm4377->pdev->dev, "OTP @ 0x%x (%d): unknown", in bcm4377_parse_otp()
2127 static int bcm4377_init_cfg(struct bcm4377_data *bcm4377) in bcm4377_init_cfg() argument
2132 ret = pci_write_config_dword(bcm4377->pdev, in bcm4377_init_cfg()
2134 bcm4377->hw->bar0_window1); in bcm4377_init_cfg()
2138 ret = pci_write_config_dword(bcm4377->pdev, in bcm4377_init_cfg()
2140 bcm4377->hw->bar0_window2); in bcm4377_init_cfg()
2145 bcm4377->pdev, BCM4377_PCIECFG_BAR0_CORE2_WINDOW1, in bcm4377_init_cfg()
2150 if (bcm4377->hw->has_bar0_core2_window2) { in bcm4377_init_cfg()
2151 ret = pci_write_config_dword(bcm4377->pdev, in bcm4377_init_cfg()
2153 bcm4377->hw->bar0_core2_window2); in bcm4377_init_cfg()
2158 ret = pci_write_config_dword(bcm4377->pdev, BCM4377_PCIECFG_BAR2_WINDOW, in bcm4377_init_cfg()
2163 ret = pci_read_config_dword(bcm4377->pdev, in bcm4377_init_cfg()
2168 if (bcm4377->hw->clear_pciecfg_subsystem_ctrl_bit19) in bcm4377_init_cfg()
2172 return pci_write_config_dword(bcm4377->pdev, in bcm4377_init_cfg()
2176 static int bcm4377_probe_dmi(struct bcm4377_data *bcm4377) in bcm4377_probe_dmi() argument
2182 bcm4377->board_type = board_type_dmi_id->driver_data; in bcm4377_probe_dmi()
2183 dev_dbg(&bcm4377->pdev->dev, in bcm4377_probe_dmi()
2185 bcm4377->board_type); in bcm4377_probe_dmi()
2191 static int bcm4377_probe_of(struct bcm4377_data *bcm4377) in bcm4377_probe_of() argument
2193 struct device_node *np = bcm4377->pdev->dev.of_node; in bcm4377_probe_of()
2200 &bcm4377->board_type); in bcm4377_probe_of()
2202 dev_err(&bcm4377->pdev->dev, "no brcm,board-type property\n"); in bcm4377_probe_of()
2206 bcm4377->taurus_beamforming_cal_blob = in bcm4377_probe_of()
2208 &bcm4377->taurus_beamforming_cal_size); in bcm4377_probe_of()
2209 if (!bcm4377->taurus_beamforming_cal_blob) { in bcm4377_probe_of()
2210 dev_err(&bcm4377->pdev->dev, in bcm4377_probe_of()
2214 bcm4377->taurus_cal_blob = of_get_property(np, "brcm,taurus-cal-blob", in bcm4377_probe_of()
2215 &bcm4377->taurus_cal_size); in bcm4377_probe_of()
2216 if (!bcm4377->taurus_cal_blob) { in bcm4377_probe_of()
2217 dev_err(&bcm4377->pdev->dev, in bcm4377_probe_of()
2225 static void bcm4377_disable_aspm(struct bcm4377_data *bcm4377) in bcm4377_disable_aspm() argument
2227 pci_disable_link_state(bcm4377->pdev, in bcm4377_disable_aspm()
2235 pcie_capability_clear_word(bcm4377->pdev, PCI_EXP_LNKCTL, in bcm4377_disable_aspm()
2256 struct bcm4377_data *bcm4377; in bcm4377_probe() local
2264 bcm4377 = devm_kzalloc(&pdev->dev, sizeof(*bcm4377), GFP_KERNEL); in bcm4377_probe()
2265 if (!bcm4377) in bcm4377_probe()
2268 bcm4377->pdev = pdev; in bcm4377_probe()
2269 bcm4377->hw = &bcm4377_hw_variants[id->driver_data]; in bcm4377_probe()
2270 init_completion(&bcm4377->event); in bcm4377_probe()
2272 ret = bcm4377_prepare_rings(bcm4377); in bcm4377_probe()
2276 ret = bcm4377_init_context(bcm4377); in bcm4377_probe()
2280 ret = bcm4377_probe_dmi(bcm4377); in bcm4377_probe()
2283 ret = bcm4377_probe_of(bcm4377); in bcm4377_probe()
2286 if (!bcm4377->board_type) { in bcm4377_probe()
2291 if (bcm4377->hw->disable_aspm) in bcm4377_probe()
2292 bcm4377_disable_aspm(bcm4377); in bcm4377_probe()
2314 ret = bcm4377_init_cfg(bcm4377); in bcm4377_probe()
2318 bcm4377->bar0 = pcim_iomap(pdev, 0, 0); in bcm4377_probe()
2319 if (!bcm4377->bar0) in bcm4377_probe()
2321 bcm4377->bar2 = pcim_iomap(pdev, 2, 0); in bcm4377_probe()
2322 if (!bcm4377->bar2) in bcm4377_probe()
2325 ret = bcm4377_parse_otp(bcm4377); in bcm4377_probe()
2348 ret = devm_request_irq(&pdev->dev, irq, bcm4377_irq, 0, "bcm4377", in bcm4377_probe()
2349 bcm4377); in bcm4377_probe()
2360 bcm4377->hdev = hdev; in bcm4377_probe()
2371 if (bcm4377->hw->broken_mws_transport_config) in bcm4377_probe()
2373 if (bcm4377->hw->broken_ext_scan) in bcm4377_probe()
2376 pci_set_drvdata(pdev, bcm4377); in bcm4377_probe()
2377 hci_set_drvdata(hdev, bcm4377); in bcm4377_probe()
2380 ret = bcm4377_boot(bcm4377); in bcm4377_probe()
2384 ret = bcm4377_setup_rti(bcm4377); in bcm4377_probe()
2397 struct bcm4377_data *bcm4377 = pci_get_drvdata(pdev); in bcm4377_suspend() local
2400 ret = hci_suspend_dev(bcm4377->hdev); in bcm4377_suspend()
2405 bcm4377->bar0 + BCM4377_BAR0_SLEEP_CONTROL); in bcm4377_suspend()
2412 struct bcm4377_data *bcm4377 = pci_get_drvdata(pdev); in bcm4377_resume() local
2415 bcm4377->bar0 + BCM4377_BAR0_SLEEP_CONTROL); in bcm4377_resume()
2417 return hci_resume_dev(bcm4377->hdev); in bcm4377_resume()
2446 [BCM4377] = {