Lines Matching refs:bcm4377

517 	int (*send_calibration)(struct bcm4377_data *bcm4377);
518 int (*send_ptb)(struct bcm4377_data *bcm4377,
603 static void bcm4377_ring_doorbell(struct bcm4377_data *bcm4377, u8 doorbell,
612 dev_dbg(&bcm4377->pdev->dev, "write %d to doorbell #%d (0x%x)\n", val,
614 iowrite32(db, bcm4377->bar0 + BCM4377_BAR0_DOORBELL);
617 static int bcm4377_extract_msgid(struct bcm4377_data *bcm4377,
626 &bcm4377->pdev->dev,
633 dev_warn(&bcm4377->pdev->dev,
642 static void bcm4377_handle_event(struct bcm4377_data *bcm4377,
654 dev_warn(&bcm4377->pdev->dev,
662 if (bcm4377_extract_msgid(bcm4377, ring, raw_msgid, &msgid))
667 &bcm4377->pdev->dev,
682 hci_recv_frame(bcm4377->hdev, skb);
685 head = le16_to_cpu(bcm4377->ring_state->xfer_ring_head[ring->ring_id]);
687 bcm4377->ring_state->xfer_ring_head[ring->ring_id] = cpu_to_le16(head);
689 bcm4377_ring_doorbell(bcm4377, ring->doorbell, head);
694 static void bcm4377_handle_ack(struct bcm4377_data *bcm4377,
703 if (bcm4377_extract_msgid(bcm4377, ring, raw_msgid, &msgid))
708 &bcm4377->pdev->dev,
725 static void bcm4377_handle_completion(struct bcm4377_data *bcm4377,
735 dev_warn(&bcm4377->pdev->dev,
750 &bcm4377->pdev->dev,
756 dev_dbg(&bcm4377->pdev->dev,
762 bcm4377_handle_ack(bcm4377, &bcm4377->control_h2d_ring, msg_id);
765 bcm4377_handle_ack(bcm4377, &bcm4377->hci_h2d_ring, msg_id);
768 bcm4377_handle_ack(bcm4377, &bcm4377->sco_h2d_ring, msg_id);
771 bcm4377_handle_ack(bcm4377, &bcm4377->acl_h2d_ring, msg_id);
775 bcm4377_handle_event(bcm4377, &bcm4377->hci_d2h_ring, msg_id,
780 bcm4377_handle_event(bcm4377, &bcm4377->sco_d2h_ring, msg_id,
785 bcm4377_handle_event(bcm4377, &bcm4377->acl_d2h_ring, msg_id,
792 &bcm4377->pdev->dev,
798 static void bcm4377_poll_completion_ring(struct bcm4377_data *bcm4377,
802 __le16 *heads = bcm4377->ring_state->completion_ring_head;
803 __le16 *tails = bcm4377->ring_state->completion_ring_tail;
809 dev_dbg(&bcm4377->pdev->dev,
821 bcm4377_handle_completion(bcm4377, ring, tail);
830 struct bcm4377_data *bcm4377 = data;
833 bootstage = ioread32(bcm4377->bar2 + BCM4377_BAR2_BOOTSTAGE);
834 rti_status = ioread32(bcm4377->bar2 + BCM4377_BAR2_RTI_STATUS);
836 if (bootstage != bcm4377->bootstage ||
837 rti_status != bcm4377->rti_status) {
838 dev_dbg(&bcm4377->pdev->dev,
840 bcm4377->bootstage, bootstage, bcm4377->rti_status,
842 complete(&bcm4377->event);
843 bcm4377->bootstage = bootstage;
844 bcm4377->rti_status = rti_status;
848 dev_err(&bcm4377->pdev->dev, "RTI status is %d\n", rti_status);
850 bcm4377_poll_completion_ring(bcm4377, &bcm4377->control_ack_ring);
851 bcm4377_poll_completion_ring(bcm4377, &bcm4377->hci_acl_event_ring);
852 bcm4377_poll_completion_ring(bcm4377, &bcm4377->hci_acl_ack_ring);
853 bcm4377_poll_completion_ring(bcm4377, &bcm4377->sco_ack_ring);
854 bcm4377_poll_completion_ring(bcm4377, &bcm4377->sco_event_ring);
859 static int bcm4377_enqueue(struct bcm4377_data *bcm4377,
874 &bcm4377->pdev->dev,
887 head = le16_to_cpu(bcm4377->ring_state->xfer_ring_head[ring->ring_id]);
888 tail = le16_to_cpu(bcm4377->ring_state->xfer_ring_tail[ring->ring_id]);
893 dev_warn(&bcm4377->pdev->dev,
902 dev_warn(&bcm4377->pdev->dev,
939 bcm4377->bar0 + BCM4377_BAR0_SLEEP_CONTROL);
941 dev_dbg(&bcm4377->pdev->dev,
944 bcm4377->ring_state->xfer_ring_head[ring->ring_id] =
948 bcm4377_ring_doorbell(bcm4377, ring->doorbell, new_head);
970 static int bcm4377_create_completion_ring(struct bcm4377_data *bcm4377,
977 dev_warn(&bcm4377->pdev->dev,
996 ret = bcm4377_enqueue(bcm4377, &bcm4377->control_h2d_ring, &msg,
1004 static int bcm4377_destroy_completion_ring(struct bcm4377_data *bcm4377,
1014 ret = bcm4377_enqueue(bcm4377, &bcm4377->control_h2d_ring, &msg,
1017 dev_warn(&bcm4377->pdev->dev,
1025 static int bcm4377_create_transfer_ring(struct bcm4377_data *bcm4377,
1050 bcm4377->ring_state->xfer_ring_head[ring->ring_id] = 0;
1051 bcm4377->ring_state->xfer_ring_tail[ring->ring_id] = 0;
1055 ret = bcm4377_enqueue(bcm4377, &bcm4377->control_h2d_ring, &msg,
1083 bcm4377->ring_state->xfer_ring_head[ring->ring_id] =
1085 bcm4377_ring_doorbell(bcm4377, ring->doorbell, 0xf);
1094 static int bcm4377_destroy_transfer_ring(struct bcm4377_data *bcm4377,
1104 ret = bcm4377_enqueue(bcm4377, &bcm4377->control_h2d_ring, &msg,
1107 dev_warn(&bcm4377->pdev->dev,
1114 static int __bcm4378_send_calibration_chunk(struct bcm4377_data *bcm4377,
1129 skb = __hci_cmd_sync(bcm4377->hdev, 0xfd97, sizeof(cmd), &cmd,
1138 static int __bcm4378_send_calibration(struct bcm4377_data *bcm4377,
1147 dev_err(&bcm4377->pdev->dev,
1157 bcm4377, data + i * BCM4378_CALIBRATION_CHUNK_SIZE,
1160 dev_err(&bcm4377->pdev->dev,
1169 static int bcm4378_send_calibration(struct bcm4377_data *bcm4377)
1171 if ((strcmp(bcm4377->stepping, "b1") == 0) ||
1172 strcmp(bcm4377->stepping, "b3") == 0)
1174 bcm4377, bcm4377->taurus_beamforming_cal_blob,
1175 bcm4377->taurus_beamforming_cal_size);
1177 return __bcm4378_send_calibration(bcm4377,
1178 bcm4377->taurus_cal_blob,
1179 bcm4377->taurus_cal_size);
1182 static int bcm4387_send_calibration(struct bcm4377_data *bcm4377)
1184 if (strcmp(bcm4377->stepping, "c2") == 0)
1186 bcm4377, bcm4377->taurus_beamforming_cal_blob,
1187 bcm4377->taurus_beamforming_cal_size);
1189 return __bcm4378_send_calibration(bcm4377,
1190 bcm4377->taurus_cal_blob,
1191 bcm4377->taurus_cal_size);
1194 static const struct firmware *bcm4377_request_blob(struct bcm4377_data *bcm4377,
1202 bcm4377->hw->id, bcm4377->stepping, bcm4377->board_type,
1203 bcm4377->vendor, suffix);
1205 bcm4377->hw->id, bcm4377->stepping, bcm4377->board_type,
1207 dev_dbg(&bcm4377->pdev->dev, "Trying to load firmware: '%s' or '%s'\n",
1210 ret = firmware_request_nowarn(&fw, name0, &bcm4377->pdev->dev);
1213 ret = firmware_request_nowarn(&fw, name1, &bcm4377->pdev->dev);
1217 dev_err(&bcm4377->pdev->dev,
1222 static int bcm4377_send_ptb(struct bcm4377_data *bcm4377,
1227 skb = __hci_cmd_sync(bcm4377->hdev, 0xfd98, fw->size, fw->data,
1241 static int bcm4378_send_ptb_chunk(struct bcm4377_data *bcm4377,
1255 skb = __hci_cmd_sync(bcm4377->hdev, 0xfe0d, sizeof(cmd), &cmd,
1264 static int bcm4378_send_ptb(struct bcm4377_data *bcm4377,
1274 dev_dbg(&bcm4377->pdev->dev, "sending ptb chunk %zu/%zu\n",
1277 bcm4377, fw->data + i * BCM4378_PTB_CHUNK_SIZE,
1280 dev_err(&bcm4377->pdev->dev,
1291 struct bcm4377_data *bcm4377 = hci_get_drvdata(hdev);
1294 dev_dbg(&bcm4377->pdev->dev, "creating rings\n");
1296 ret = bcm4377_create_completion_ring(bcm4377,
1297 &bcm4377->hci_acl_ack_ring);
1300 ret = bcm4377_create_completion_ring(bcm4377,
1301 &bcm4377->hci_acl_event_ring);
1304 ret = bcm4377_create_completion_ring(bcm4377, &bcm4377->sco_ack_ring);
1307 ret = bcm4377_create_completion_ring(bcm4377, &bcm4377->sco_event_ring);
1310 dev_dbg(&bcm4377->pdev->dev,
1313 ret = bcm4377_create_transfer_ring(bcm4377, &bcm4377->hci_h2d_ring);
1316 ret = bcm4377_create_transfer_ring(bcm4377, &bcm4377->hci_d2h_ring);
1319 ret = bcm4377_create_transfer_ring(bcm4377, &bcm4377->sco_h2d_ring);
1322 ret = bcm4377_create_transfer_ring(bcm4377, &bcm4377->sco_d2h_ring);
1325 ret = bcm4377_create_transfer_ring(bcm4377, &bcm4377->acl_h2d_ring);
1328 ret = bcm4377_create_transfer_ring(bcm4377, &bcm4377->acl_d2h_ring);
1331 dev_dbg(&bcm4377->pdev->dev,
1337 bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->acl_h2d_ring);
1339 bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->sco_d2h_ring);
1341 bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->sco_h2d_ring);
1343 bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->hci_h2d_ring);
1345 bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->hci_d2h_ring);
1347 bcm4377_destroy_completion_ring(bcm4377, &bcm4377->sco_event_ring);
1349 bcm4377_destroy_completion_ring(bcm4377, &bcm4377->sco_ack_ring);
1351 bcm4377_destroy_completion_ring(bcm4377, &bcm4377->hci_acl_event_ring);
1353 bcm4377_destroy_completion_ring(bcm4377, &bcm4377->hci_acl_ack_ring);
1355 dev_err(&bcm4377->pdev->dev, "Creating rings failed with %d\n", ret);
1361 struct bcm4377_data *bcm4377 = hci_get_drvdata(hdev);
1363 dev_dbg(&bcm4377->pdev->dev, "destroying rings in hci_close\n");
1365 bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->acl_d2h_ring);
1366 bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->acl_h2d_ring);
1367 bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->sco_d2h_ring);
1368 bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->sco_h2d_ring);
1369 bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->hci_d2h_ring);
1370 bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->hci_h2d_ring);
1372 bcm4377_destroy_completion_ring(bcm4377, &bcm4377->sco_event_ring);
1373 bcm4377_destroy_completion_ring(bcm4377, &bcm4377->sco_ack_ring);
1374 bcm4377_destroy_completion_ring(bcm4377, &bcm4377->hci_acl_event_ring);
1375 bcm4377_destroy_completion_ring(bcm4377, &bcm4377->hci_acl_ack_ring);
1380 static bool bcm4377_is_valid_bdaddr(struct bcm4377_data *bcm4377,
1389 if (addr->b[4] != (bcm4377->hw->id & 0xff))
1391 if (addr->b[5] != (bcm4377->hw->id >> 8))
1396 static int bcm4377_check_bdaddr(struct bcm4377_data *bcm4377)
1401 skb = __hci_cmd_sync(bcm4377->hdev, HCI_OP_READ_BD_ADDR, 0, NULL,
1406 dev_err(&bcm4377->pdev->dev, "HCI_OP_READ_BD_ADDR failed (%d)",
1412 dev_err(&bcm4377->pdev->dev,
1419 if (!bcm4377_is_valid_bdaddr(bcm4377, &bda->bdaddr))
1420 set_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &bcm4377->hdev->quirks);
1428 struct bcm4377_data *bcm4377 = hci_get_drvdata(hdev);
1432 if (bcm4377->hw->send_calibration) {
1433 ret = bcm4377->hw->send_calibration(bcm4377);
1438 fw = bcm4377_request_blob(bcm4377, "ptb");
1440 dev_err(&bcm4377->pdev->dev, "failed to load PTB data");
1444 ret = bcm4377->hw->send_ptb(bcm4377, fw);
1449 return bcm4377_check_bdaddr(bcm4377);
1454 struct bcm4377_data *bcm4377 = hci_get_drvdata(hdev);
1461 ring = &bcm4377->hci_h2d_ring;
1466 ring = &bcm4377->acl_h2d_ring;
1471 ring = &bcm4377->sco_h2d_ring;
1478 ret = bcm4377_enqueue(bcm4377, ring, skb->data, skb->len, false);
1491 struct bcm4377_data *bcm4377 = hci_get_drvdata(hdev);
1498 dev_err(&bcm4377->pdev->dev,
1507 static int bcm4377_alloc_transfer_ring(struct bcm4377_data *bcm4377,
1536 ring->ring = dmam_alloc_coherent(&bcm4377->pdev->dev,
1543 ring->events = devm_kcalloc(&bcm4377->pdev->dev,
1552 &bcm4377->pdev->dev,
1562 static int bcm4377_alloc_completion_ring(struct bcm4377_data *bcm4377,
1576 ring->ring = dmam_alloc_coherent(&bcm4377->pdev->dev,
1584 static int bcm4377_init_context(struct bcm4377_data *bcm4377)
1586 struct device *dev = &bcm4377->pdev->dev;
1589 bcm4377->ctx = dmam_alloc_coherent(dev, sizeof(*bcm4377->ctx),
1590 &bcm4377->ctx_dma, GFP_KERNEL);
1591 if (!bcm4377->ctx)
1593 memset(bcm4377->ctx, 0, sizeof(*bcm4377->ctx));
1595 bcm4377->ring_state =
1596 dmam_alloc_coherent(dev, sizeof(*bcm4377->ring_state),
1597 &bcm4377->ring_state_dma, GFP_KERNEL);
1598 if (!bcm4377->ring_state)
1600 memset(bcm4377->ring_state, 0, sizeof(*bcm4377->ring_state));
1602 bcm4377->ctx->version = cpu_to_le16(1);
1603 bcm4377->ctx->size = cpu_to_le16(sizeof(*bcm4377->ctx));
1604 bcm4377->ctx->enabled_caps = cpu_to_le32(2);
1611 if (!dmam_alloc_coherent(&bcm4377->pdev->dev, 0x20,
1614 bcm4377->ctx->peripheral_info_addr = cpu_to_le64(peripheral_info_dma);
1616 bcm4377->ctx->xfer_ring_heads_addr = cpu_to_le64(
1617 bcm4377->ring_state_dma +
1619 bcm4377->ctx->xfer_ring_tails_addr = cpu_to_le64(
1620 bcm4377->ring_state_dma +
1622 bcm4377->ctx->completion_ring_heads_addr = cpu_to_le64(
1623 bcm4377->ring_state_dma +
1625 bcm4377->ctx->completion_ring_tails_addr = cpu_to_le64(
1626 bcm4377->ring_state_dma +
1629 bcm4377->ctx->n_completion_rings =
1631 bcm4377->ctx->n_xfer_rings = cpu_to_le16(BCM4377_N_TRANSFER_RINGS);
1633 bcm4377->ctx->control_completion_ring_addr =
1634 cpu_to_le64(bcm4377->control_ack_ring.ring_dma);
1635 bcm4377->ctx->control_completion_ring_n_entries =
1636 cpu_to_le16(bcm4377->control_ack_ring.n_entries);
1637 bcm4377->ctx->control_completion_ring_doorbell = cpu_to_le16(0xffff);
1638 bcm4377->ctx->control_completion_ring_msi = 0;
1639 bcm4377->ctx->control_completion_ring_header_size = 0;
1640 bcm4377->ctx->control_completion_ring_footer_size = 0;
1642 bcm4377->ctx->control_xfer_ring_addr =
1643 cpu_to_le64(bcm4377->control_h2d_ring.ring_dma);
1644 bcm4377->ctx->control_xfer_ring_n_entries =
1645 cpu_to_le16(bcm4377->control_h2d_ring.n_entries);
1646 bcm4377->ctx->control_xfer_ring_doorbell =
1647 cpu_to_le16(bcm4377->control_h2d_ring.doorbell);
1648 bcm4377->ctx->control_xfer_ring_msi = 0;
1649 bcm4377->ctx->control_xfer_ring_header_size = 0;
1650 bcm4377->ctx->control_xfer_ring_footer_size =
1651 bcm4377->control_h2d_ring.payload_size / 4;
1653 dev_dbg(&bcm4377->pdev->dev, "context initialized at IOVA %pad",
1654 &bcm4377->ctx_dma);
1659 static int bcm4377_prepare_rings(struct bcm4377_data *bcm4377)
1673 bcm4377->control_ack_ring.ring_id = BCM4377_ACK_RING_CONTROL;
1674 bcm4377->control_ack_ring.n_entries = 32;
1675 bcm4377->control_ack_ring.transfer_rings =
1678 bcm4377->hci_acl_ack_ring.ring_id = BCM4377_ACK_RING_HCI_ACL;
1679 bcm4377->hci_acl_ack_ring.n_entries = 2 * BCM4377_RING_N_ENTRIES;
1680 bcm4377->hci_acl_ack_ring.transfer_rings =
1682 bcm4377->hci_acl_ack_ring.delay = 1000;
1689 bcm4377->hci_acl_event_ring.ring_id = BCM4377_EVENT_RING_HCI_ACL;
1690 bcm4377->hci_acl_event_ring.payload_size = MAX_EVENT_PAYLOAD_SIZE;
1691 bcm4377->hci_acl_event_ring.n_entries = 2 * BCM4377_RING_N_ENTRIES;
1692 bcm4377->hci_acl_event_ring.transfer_rings =
1694 bcm4377->hci_acl_event_ring.delay = 1000;
1696 bcm4377->sco_ack_ring.ring_id = BCM4377_ACK_RING_SCO;
1697 bcm4377->sco_ack_ring.n_entries = BCM4377_RING_N_ENTRIES;
1698 bcm4377->sco_ack_ring.transfer_rings = BIT(BCM4377_XFER_RING_SCO_H2D);
1700 bcm4377->sco_event_ring.ring_id = BCM4377_EVENT_RING_SCO;
1701 bcm4377->sco_event_ring.payload_size = MAX_SCO_PAYLOAD_SIZE;
1702 bcm4377->sco_event_ring.n_entries = BCM4377_RING_N_ENTRIES;
1703 bcm4377->sco_event_ring.transfer_rings = BIT(BCM4377_XFER_RING_SCO_D2H);
1705 bcm4377->control_h2d_ring.ring_id = BCM4377_XFER_RING_CONTROL;
1706 bcm4377->control_h2d_ring.doorbell = BCM4377_DOORBELL_CONTROL;
1707 bcm4377->control_h2d_ring.payload_size = BCM4377_CONTROL_MSG_SIZE;
1708 bcm4377->control_h2d_ring.completion_ring = BCM4377_ACK_RING_CONTROL;
1709 bcm4377->control_h2d_ring.allow_wait = true;
1710 bcm4377->control_h2d_ring.n_entries = BCM4377_RING_N_ENTRIES;
1712 bcm4377->hci_h2d_ring.ring_id = BCM4377_XFER_RING_HCI_H2D;
1713 bcm4377->hci_h2d_ring.doorbell = BCM4377_DOORBELL_HCI_H2D;
1714 bcm4377->hci_h2d_ring.payload_size = MAX_EVENT_PAYLOAD_SIZE;
1715 bcm4377->hci_h2d_ring.completion_ring = BCM4377_ACK_RING_HCI_ACL;
1716 bcm4377->hci_h2d_ring.n_entries = BCM4377_RING_N_ENTRIES;
1718 bcm4377->hci_d2h_ring.ring_id = BCM4377_XFER_RING_HCI_D2H;
1719 bcm4377->hci_d2h_ring.doorbell = BCM4377_DOORBELL_HCI_D2H;
1720 bcm4377->hci_d2h_ring.completion_ring = BCM4377_EVENT_RING_HCI_ACL;
1721 bcm4377->hci_d2h_ring.virtual = true;
1722 bcm4377->hci_d2h_ring.n_entries = BCM4377_RING_N_ENTRIES;
1724 bcm4377->sco_h2d_ring.ring_id = BCM4377_XFER_RING_SCO_H2D;
1725 bcm4377->sco_h2d_ring.doorbell = BCM4377_DOORBELL_SCO;
1726 bcm4377->sco_h2d_ring.payload_size = MAX_SCO_PAYLOAD_SIZE;
1727 bcm4377->sco_h2d_ring.completion_ring = BCM4377_ACK_RING_SCO;
1728 bcm4377->sco_h2d_ring.sync = true;
1729 bcm4377->sco_h2d_ring.n_entries = BCM4377_RING_N_ENTRIES;
1731 bcm4377->sco_d2h_ring.ring_id = BCM4377_XFER_RING_SCO_D2H;
1732 bcm4377->sco_d2h_ring.doorbell = BCM4377_DOORBELL_SCO;
1733 bcm4377->sco_d2h_ring.completion_ring = BCM4377_EVENT_RING_SCO;
1734 bcm4377->sco_d2h_ring.virtual = true;
1735 bcm4377->sco_d2h_ring.sync = true;
1736 bcm4377->sco_d2h_ring.n_entries = BCM4377_RING_N_ENTRIES;
1742 bcm4377->acl_h2d_ring.ring_id = BCM4377_XFER_RING_ACL_H2D;
1743 bcm4377->acl_h2d_ring.doorbell = BCM4377_DOORBELL_ACL_H2D;
1744 bcm4377->acl_h2d_ring.mapped_payload_size = MAX_ACL_PAYLOAD_SIZE;
1745 bcm4377->acl_h2d_ring.completion_ring = BCM4377_ACK_RING_HCI_ACL;
1746 bcm4377->acl_h2d_ring.n_entries = BCM4377_RING_N_ENTRIES;
1752 bcm4377->acl_d2h_ring.ring_id = BCM4377_XFER_RING_ACL_D2H;
1753 bcm4377->acl_d2h_ring.doorbell = BCM4377_DOORBELL_ACL_D2H;
1754 bcm4377->acl_d2h_ring.completion_ring = BCM4377_EVENT_RING_HCI_ACL;
1755 bcm4377->acl_d2h_ring.d2h_buffers_only = true;
1756 bcm4377->acl_d2h_ring.mapped_payload_size = MAX_ACL_PAYLOAD_SIZE;
1757 bcm4377->acl_d2h_ring.n_entries = BCM4377_RING_N_ENTRIES;
1763 ret = bcm4377_alloc_transfer_ring(bcm4377, &bcm4377->control_h2d_ring);
1766 ret = bcm4377_alloc_transfer_ring(bcm4377, &bcm4377->hci_h2d_ring);
1769 ret = bcm4377_alloc_transfer_ring(bcm4377, &bcm4377->hci_d2h_ring);
1772 ret = bcm4377_alloc_transfer_ring(bcm4377, &bcm4377->sco_h2d_ring);
1775 ret = bcm4377_alloc_transfer_ring(bcm4377, &bcm4377->sco_d2h_ring);
1778 ret = bcm4377_alloc_transfer_ring(bcm4377, &bcm4377->acl_h2d_ring);
1781 ret = bcm4377_alloc_transfer_ring(bcm4377, &bcm4377->acl_d2h_ring);
1785 ret = bcm4377_alloc_completion_ring(bcm4377,
1786 &bcm4377->control_ack_ring);
1789 ret = bcm4377_alloc_completion_ring(bcm4377,
1790 &bcm4377->hci_acl_ack_ring);
1793 ret = bcm4377_alloc_completion_ring(bcm4377,
1794 &bcm4377->hci_acl_event_ring);
1797 ret = bcm4377_alloc_completion_ring(bcm4377, &bcm4377->sco_ack_ring);
1800 ret = bcm4377_alloc_completion_ring(bcm4377, &bcm4377->sco_event_ring);
1804 dev_dbg(&bcm4377->pdev->dev, "all rings allocated and prepared\n");
1809 static int bcm4377_boot(struct bcm4377_data *bcm4377)
1817 bootstage = ioread32(bcm4377->bar2 + BCM4377_BAR2_BOOTSTAGE);
1818 rti_status = ioread32(bcm4377->bar2 + BCM4377_BAR2_RTI_STATUS);
1821 dev_err(&bcm4377->pdev->dev, "bootstage is %d and not 0\n",
1827 dev_err(&bcm4377->pdev->dev, "RTI status is %d and not 0\n",
1832 fw = bcm4377_request_blob(bcm4377, "bin");
1834 dev_err(&bcm4377->pdev->dev, "Failed to load firmware\n");
1838 bfr = dma_alloc_coherent(&bcm4377->pdev->dev, fw->size, &fw_dma,
1847 iowrite32(0, bcm4377->bar0 + BCM4377_BAR0_HOST_WINDOW_LO);
1848 iowrite32(0, bcm4377->bar0 + BCM4377_BAR0_HOST_WINDOW_HI);
1850 bcm4377->bar0 + BCM4377_BAR0_HOST_WINDOW_SIZE);
1852 iowrite32(lower_32_bits(fw_dma), bcm4377->bar2 + BCM4377_BAR2_FW_LO);
1853 iowrite32(upper_32_bits(fw_dma), bcm4377->bar2 + BCM4377_BAR2_FW_HI);
1854 iowrite32(fw->size, bcm4377->bar2 + BCM4377_BAR2_FW_SIZE);
1855 iowrite32(0, bcm4377->bar0 + BCM4377_BAR0_FW_DOORBELL);
1857 dev_dbg(&bcm4377->pdev->dev, "waiting for firmware to boot\n");
1859 ret = wait_for_completion_interruptible_timeout(&bcm4377->event,
1868 if (bcm4377->bootstage != 2) {
1869 dev_err(&bcm4377->pdev->dev, "boostage %d != 2\n",
1870 bcm4377->bootstage);
1875 dev_dbg(&bcm4377->pdev->dev, "firmware has booted (stage = %x)\n",
1876 bcm4377->bootstage);
1880 dma_free_coherent(&bcm4377->pdev->dev, fw->size, bfr, fw_dma);
1886 static int bcm4377_setup_rti(struct bcm4377_data *bcm4377)
1890 dev_dbg(&bcm4377->pdev->dev, "starting RTI\n");
1891 iowrite32(1, bcm4377->bar0 + BCM4377_BAR0_RTI_CONTROL);
1893 ret = wait_for_completion_interruptible_timeout(&bcm4377->event,
1896 dev_err(&bcm4377->pdev->dev,
1903 if (bcm4377->rti_status != 1) {
1904 dev_err(&bcm4377->pdev->dev, "RTI did not ack state 1 (%d)\n",
1905 bcm4377->rti_status);
1908 dev_dbg(&bcm4377->pdev->dev, "RTI is in state 1\n");
1911 iowrite32(0, bcm4377->bar2 + BCM4377_BAR2_RTI_WINDOW_LO);
1912 iowrite32(0, bcm4377->bar2 + BCM4377_BAR2_RTI_WINDOW_HI);
1914 bcm4377->bar2 + BCM4377_BAR2_RTI_WINDOW_SIZE);
1917 iowrite32(lower_32_bits(bcm4377->ctx_dma),
1918 bcm4377->bar2 + BCM4377_BAR2_CONTEXT_ADDR_LO);
1919 iowrite32(upper_32_bits(bcm4377->ctx_dma),
1920 bcm4377->bar2 + BCM4377_BAR2_CONTEXT_ADDR_HI);
1921 iowrite32(2, bcm4377->bar0 + BCM4377_BAR0_RTI_CONTROL);
1923 ret = wait_for_completion_interruptible_timeout(&bcm4377->event,
1926 dev_err(&bcm4377->pdev->dev,
1933 if (bcm4377->rti_status != 2) {
1934 dev_err(&bcm4377->pdev->dev, "RTI did not ack state 2 (%d)\n",
1935 bcm4377->rti_status);
1939 dev_dbg(&bcm4377->pdev->dev,
1941 bcm4377->control_ack_ring.enabled = true;
1946 static int bcm4377_parse_otp_board_params(struct bcm4377_data *bcm4377,
1951 if (len >= sizeof(bcm4377->vendor))
1954 strscpy(bcm4377->vendor, val, len + 1);
1958 static int bcm4377_parse_otp_chip_params(struct bcm4377_data *bcm4377, char tag,
1965 if (len >= sizeof(bcm4377->stepping))
1969 bcm4377->stepping[idx] = tolower(val[idx]);
1977 bcm4377->stepping[idx] = '\0';
1981 static int bcm4377_parse_otp_str(struct bcm4377_data *bcm4377, const u8 *str,
2006 ret = bcm4377_parse_otp_board_params(bcm4377, tag, p,
2010 ret = bcm4377_parse_otp_chip_params(bcm4377, tag, p,
2028 static int bcm4377_parse_otp_sys_vendor(struct bcm4377_data *bcm4377, u8 *otp,
2058 dev_dbg(&bcm4377->pdev->dev,
2062 ret = bcm4377_parse_otp_str(bcm4377, chip_params,
2067 ret = bcm4377_parse_otp_str(bcm4377, board_params,
2072 if (!bcm4377->stepping[0] || !bcm4377->vendor[0])
2075 dev_dbg(&bcm4377->pdev->dev, "OTP: stepping=%s, vendor=%s\n",
2076 bcm4377->stepping, bcm4377->vendor);
2080 static int bcm4377_parse_otp(struct bcm4377_data *bcm4377)
2091 otp[i] = ioread8(bcm4377->bar0 + bcm4377->hw->otp_offset + i);
2106 dev_dbg(&bcm4377->pdev->dev,
2108 ret = bcm4377_parse_otp_sys_vendor(bcm4377, &otp[i + 2],
2112 dev_dbg(&bcm4377->pdev->dev, "OTP @ 0x%x (%d): CIS", i,
2116 dev_dbg(&bcm4377->pdev->dev, "OTP @ 0x%x (%d): unknown",
2128 static int bcm4377_init_cfg(struct bcm4377_data *bcm4377)
2133 ret = pci_write_config_dword(bcm4377->pdev,
2135 bcm4377->hw->bar0_window1);
2139 ret = pci_write_config_dword(bcm4377->pdev,
2141 bcm4377->hw->bar0_window2);
2146 bcm4377->pdev, BCM4377_PCIECFG_BAR0_CORE2_WINDOW1,
2151 if (bcm4377->hw->has_bar0_core2_window2) {
2152 ret = pci_write_config_dword(bcm4377->pdev,
2154 bcm4377->hw->bar0_core2_window2);
2159 ret = pci_write_config_dword(bcm4377->pdev, BCM4377_PCIECFG_BAR2_WINDOW,
2164 ret = pci_read_config_dword(bcm4377->pdev,
2169 if (bcm4377->hw->clear_pciecfg_subsystem_ctrl_bit19)
2173 return pci_write_config_dword(bcm4377->pdev,
2177 static int bcm4377_probe_dmi(struct bcm4377_data *bcm4377)
2183 bcm4377->board_type = board_type_dmi_id->driver_data;
2184 dev_dbg(&bcm4377->pdev->dev,
2186 bcm4377->board_type);
2192 static int bcm4377_probe_of(struct bcm4377_data *bcm4377)
2194 struct device_node *np = bcm4377->pdev->dev.of_node;
2201 &bcm4377->board_type);
2203 dev_err(&bcm4377->pdev->dev, "no brcm,board-type property\n");
2207 bcm4377->taurus_beamforming_cal_blob =
2209 &bcm4377->taurus_beamforming_cal_size);
2210 if (!bcm4377->taurus_beamforming_cal_blob) {
2211 dev_err(&bcm4377->pdev->dev,
2215 bcm4377->taurus_cal_blob = of_get_property(np, "brcm,taurus-cal-blob",
2216 &bcm4377->taurus_cal_size);
2217 if (!bcm4377->taurus_cal_blob) {
2218 dev_err(&bcm4377->pdev->dev,
2226 static void bcm4377_disable_aspm(struct bcm4377_data *bcm4377)
2228 pci_disable_link_state(bcm4377->pdev,
2236 pcie_capability_clear_word(bcm4377->pdev, PCI_EXP_LNKCTL,
2257 struct bcm4377_data *bcm4377;
2265 bcm4377 = devm_kzalloc(&pdev->dev, sizeof(*bcm4377), GFP_KERNEL);
2266 if (!bcm4377)
2269 bcm4377->pdev = pdev;
2270 bcm4377->hw = &bcm4377_hw_variants[id->driver_data];
2271 init_completion(&bcm4377->event);
2273 ret = bcm4377_prepare_rings(bcm4377);
2277 ret = bcm4377_init_context(bcm4377);
2281 ret = bcm4377_probe_dmi(bcm4377);
2284 ret = bcm4377_probe_of(bcm4377);
2287 if (!bcm4377->board_type) {
2292 if (bcm4377->hw->disable_aspm)
2293 bcm4377_disable_aspm(bcm4377);
2315 ret = bcm4377_init_cfg(bcm4377);
2319 bcm4377->bar0 = pcim_iomap(pdev, 0, 0);
2320 if (!bcm4377->bar0)
2322 bcm4377->bar2 = pcim_iomap(pdev, 2, 0);
2323 if (!bcm4377->bar2)
2326 ret = bcm4377_parse_otp(bcm4377);
2349 ret = devm_request_irq(&pdev->dev, irq, bcm4377_irq, 0, "bcm4377",
2350 bcm4377);
2361 bcm4377->hdev = hdev;
2370 if (bcm4377->hw->broken_mws_transport_config)
2372 if (bcm4377->hw->broken_ext_scan)
2374 if (bcm4377->hw->broken_le_coded)
2377 pci_set_drvdata(pdev, bcm4377);
2378 hci_set_drvdata(hdev, bcm4377);
2381 ret = bcm4377_boot(bcm4377);
2385 ret = bcm4377_setup_rti(bcm4377);
2398 struct bcm4377_data *bcm4377 = pci_get_drvdata(pdev);
2401 ret = hci_suspend_dev(bcm4377->hdev);
2406 bcm4377->bar0 + BCM4377_BAR0_SLEEP_CONTROL);
2413 struct bcm4377_data *bcm4377 = pci_get_drvdata(pdev);
2416 bcm4377->bar0 + BCM4377_BAR0_SLEEP_CONTROL);
2418 return hci_resume_dev(bcm4377->hdev);