Skip to content

Add support for Laird and Murata WiFi/Bluetooth co-existence #33

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: cp-release/lf-6.1.y
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions drivers/bluetooth/btbcm.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,17 @@

#define BCM_FW_NAME_LEN 64
#define BCM_FW_NAME_COUNT_MAX 4
#define BCM_ROMFW_BASELINE_NUM 0xFFFF

struct bcm_chip_version_table {
u8 chip_id;
u16 baseline;
};

static const struct bcm_chip_version_table disable_broken_read_transmit_power_by_chip_ver[] = {
{0x87, BCM_ROMFW_BASELINE_NUM} /* CYW4373/4373E */
};

/* For kmalloc-ing the fw-name array instead of putting it on the stack */
typedef char bcm_fw_name[BCM_FW_NAME_LEN];

Expand Down Expand Up @@ -432,18 +443,42 @@ static const struct dmi_system_id disable_broken_read_transmit_power[] = {
{ }
};

static bool btbcm_is_disable_broken_read_tx_power_by_chip_ver(u8 chip_id, u16 baseline)
{
int i;
int table_size = sizeof(disable_broken_read_transmit_power_by_chip_ver)/sizeof(disable_broken_read_transmit_power_by_chip_ver[0]);
const struct bcm_chip_version_table *entry = &disable_broken_read_transmit_power_by_chip_ver[0];

for( i=0 ; i<table_size ; i++, entry++)
{
if( (chip_id == entry->chip_id) && (baseline == entry->baseline) )
return true;
}

return false;
}

static int btbcm_read_info(struct hci_dev *hdev)
{
struct sk_buff *skb;
u8 chip_id;
u16 baseline;

/* Read Verbose Config Version Info */
skb = btbcm_read_verbose_config(hdev);
if (IS_ERR(skb))
return PTR_ERR(skb);

chip_id = skb->data[1];
baseline = skb->data[3] | (skb->data[4] << 8);
bt_dev_info(hdev, "BCM: chip id %u", skb->data[1]);
kfree_skb(skb);

/* Read DMI and disable broken Read LE Min/Max Tx Power */
if ((dmi_first_match(disable_broken_read_transmit_power)) ||
(btbcm_is_disable_broken_read_tx_power_by_chip_ver(chip_id, baseline)))
set_bit(HCI_QUIRK_BROKEN_READ_TRANSMIT_POWER, &hdev->quirks);

return 0;
}

Expand Down
4 changes: 4 additions & 0 deletions drivers/bluetooth/btusb.c
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,10 @@ static const struct usb_device_id btusb_table[] = {
/* Broadcom BCM20702B0 (Dynex/Insignia) */
{ USB_DEVICE(0x19ff, 0x0239), .driver_info = BTUSB_BCM_PATCHRAM },

/* Cypress devices with vendor specific id */
{ USB_VENDOR_AND_INTERFACE_INFO(0x04b4, 0xff, 0x01, 0x01),
.driver_info = BTUSB_BCM_PATCHRAM },

/* Broadcom BCM43142A0 (Foxconn/Lenovo) */
{ USB_VENDOR_AND_INTERFACE_INFO(0x105b, 0xff, 0x01, 0x01),
.driver_info = BTUSB_BCM_PATCHRAM },
Expand Down
1 change: 1 addition & 0 deletions drivers/net/wireless/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ source "drivers/net/wireless/broadcom/Kconfig"
source "drivers/net/wireless/cisco/Kconfig"
source "drivers/net/wireless/intel/Kconfig"
source "drivers/net/wireless/intersil/Kconfig"
source "drivers/net/wireless/laird/Kconfig"
source "drivers/net/wireless/marvell/Kconfig"
source "drivers/net/wireless/mediatek/Kconfig"
source "drivers/net/wireless/microchip/Kconfig"
Expand Down
1 change: 1 addition & 0 deletions drivers/net/wireless/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ obj-$(CONFIG_WLAN_VENDOR_BROADCOM) += broadcom/
obj-$(CONFIG_WLAN_VENDOR_CISCO) += cisco/
obj-$(CONFIG_WLAN_VENDOR_INTEL) += intel/
obj-$(CONFIG_WLAN_VENDOR_INTERSIL) += intersil/
obj-$(CONFIG_WLAN_VENDOR_LAIRD) += laird/
obj-$(CONFIG_WLAN_VENDOR_MARVELL) += marvell/
obj-$(CONFIG_WLAN_VENDOR_MEDIATEK) += mediatek/
obj-$(CONFIG_WLAN_VENDOR_MICROCHIP) += microchip/
Expand Down
7 changes: 7 additions & 0 deletions drivers/net/wireless/broadcom/brcm80211/brcmfmac/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,10 @@ config BRCMFMAC_PCIE
IEEE802.11ac embedded FullMAC WLAN driver. Say Y if you want to
use the driver for an PCIE wireless card.

config BRCMFMAC_BT_SHARED_SDIO
bool "FMAC shares SDIO bus to Bluetooth"
depends on BRCMFMAC_SDIO
default n
help
This option enables the feature of sharing the SDIO bus interface
between Cypress BT and WiFi host drivers.
6 changes: 5 additions & 1 deletion drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@ brcmfmac-objs += \
btcoex.o \
vendor.o \
pno.o \
xtlv.o
xtlv.o \
vendor_ifx.o \
twt.o
brcmfmac-$(CONFIG_BRCMFMAC_PROTO_BCDC) += \
bcdc.o \
fwsignal.o
Expand All @@ -47,3 +49,5 @@ brcmfmac-$(CONFIG_OF) += \
of.o
brcmfmac-$(CONFIG_DMI) += \
dmi.o
brcmfmac-${CONFIG_BRCMFMAC_BT_SHARED_SDIO} += \
bt_shared_sdio.o
27 changes: 25 additions & 2 deletions drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,20 @@
#include "sdio.h"
#include "core.h"
#include "common.h"
#include "cfg80211.h"

#define SDIOH_API_ACCESS_RETRY_LIMIT 2

#define DMA_ALIGN_MASK 0x03

#define SDIO_FUNC1_BLOCKSIZE 64
#define SDIO_FUNC2_BLOCKSIZE 512
#define SDIO_4373_FUNC2_BLOCKSIZE 256
#define SDIO_4373_FUNC2_BLOCKSIZE 128
#define SDIO_435X_FUNC2_BLOCKSIZE 256
#define SDIO_4329_FUNC2_BLOCKSIZE 128
#define SDIO_89459_FUNC2_BLOCKSIZE 256
#define SDIO_CYW55572_FUNC2_BLOCKSIZE 256

/* Maximum milliseconds to wait for F2 to come up */
#define SDIO_WAIT_F2RDY 3000

Expand Down Expand Up @@ -917,6 +921,16 @@ int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
case SDIO_DEVICE_ID_BROADCOM_4329:
f2_blksz = SDIO_4329_FUNC2_BLOCKSIZE;
break;
case SDIO_DEVICE_ID_BROADCOM_CYPRESS_89459:
case SDIO_DEVICE_ID_CYPRESS_54590:
case SDIO_DEVICE_ID_CYPRESS_54591:
case SDIO_DEVICE_ID_CYPRESS_54594:
f2_blksz = SDIO_89459_FUNC2_BLOCKSIZE;
break;
case SDIO_DEVICE_ID_CYPRESS_55572:
case SDIO_DEVICE_ID_CYPRESS_55500:
f2_blksz = SDIO_CYW55572_FUNC2_BLOCKSIZE;
break;
default:
break;
}
Expand Down Expand Up @@ -962,6 +976,9 @@ int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
#define BRCMF_SDIO_DEVICE(dev_id) \
{SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, dev_id)}

#define CYF_SDIO_DEVICE(dev_id) \
{SDIO_DEVICE(SDIO_VENDOR_ID_CYPRESS, dev_id)}

/* devices we support, null terminated */
static const struct sdio_device_id brcmf_sdmmc_ids[] = {
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43143),
Expand All @@ -985,7 +1002,13 @@ static const struct sdio_device_id brcmf_sdmmc_ids[] = {
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_CYPRESS_43012),
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_CYPRESS_43439),
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_CYPRESS_43752),
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_CYPRESS_89359),
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_CYPRESS_89459),
CYF_SDIO_DEVICE(SDIO_DEVICE_ID_CYPRESS_43439),
CYF_SDIO_DEVICE(SDIO_DEVICE_ID_CYPRESS_54590),
CYF_SDIO_DEVICE(SDIO_DEVICE_ID_CYPRESS_54591),
CYF_SDIO_DEVICE(SDIO_DEVICE_ID_CYPRESS_54594),
CYF_SDIO_DEVICE(SDIO_DEVICE_ID_CYPRESS_55572),
CYF_SDIO_DEVICE(SDIO_DEVICE_ID_CYPRESS_55500),
{ /* end: all zeroes */ }
};
MODULE_DEVICE_TABLE(sdio, brcmf_sdmmc_ids);
Expand Down
Loading