diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
index 1bf0fa8f0..1e1b23bf4 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
@@ -727,6 +727,8 @@ static u32 brcmf_chip_tcm_rambase(struct brcmf_chip_priv *ci)
 		return 0x160000;
 	case CY_CC_43752_CHIP_ID:
 		return 0x170000;
+	case BRCM_CC_4377_CHIP_ID:
+		return 0x170000;
 	case BRCM_CC_4378_CHIP_ID:
 		return 0x352000;
 	default:
@@ -1428,6 +1430,8 @@ bool brcmf_chip_sr_capable(struct brcmf_chip *pub)
 		reg = chip->ops->read32(chip->ctx, addr);
 		return (reg & (PMU_RCTL_MACPHY_DISABLE_MASK |
 			       PMU_RCTL_LOGIC_DISABLE_MASK)) == 0;
+	case BRCM_CC_4377_CHIP_ID:
+		return false;
 	case BRCM_CC_4378_CHIP_ID:
 		return false;
 	}
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
index ce8c552c6..6f0166b33 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
@@ -59,6 +59,7 @@ BRCMF_FW_DEF(4365C, "brcmfmac4365c-pcie");
 BRCMF_FW_DEF(4366B, "brcmfmac4366b-pcie");
 BRCMF_FW_DEF(4366C, "brcmfmac4366c-pcie");
 BRCMF_FW_DEF(4371, "brcmfmac4371-pcie");
+BRCMF_FW_DEF(4377, "brcmfmac4377-pcie");
 BRCMF_FW_DEF(4378, "brcmfmac4378-pcie");
 
 static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
@@ -81,6 +82,7 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
 	BRCMF_FW_ENTRY(BRCM_CC_43664_CHIP_ID, 0xFFFFFFF0, 4366C),
 	BRCMF_FW_ENTRY(BRCM_CC_43666_CHIP_ID, 0xFFFFFFF0, 4366C),
 	BRCMF_FW_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371),
+	BRCMF_FW_ENTRY(BRCM_CC_4377_CHIP_ID, 0xFFFFFFFF, 4377),
 	BRCMF_FW_ENTRY(BRCM_CC_4378_CHIP_ID, 0xFFFFFFFF, 4378),
 };
 
@@ -586,23 +588,33 @@ brcmf_pcie_reg_map(struct brcmf_pciedev_info *devinfo, u32 reg)
 {
 	switch(reg) {
 	case BRCMF_PCIE_PCIE2REG_INTMASK:
-		if(devinfo->ci->chip == BRCM_CC_4378_CHIP_ID)
+		if(devinfo->ci->chip == BRCM_CC_4377_CHIP_ID)
+			return BRCMF_PCIE_64_PCIE2REG_INTMASK;
+		else if(devinfo->ci->chip == BRCM_CC_4378_CHIP_ID)
 			return BRCMF_PCIE_64_PCIE2REG_INTMASK;
 		return reg;
 	case BRCMF_PCIE_PCIE2REG_MAILBOXINT:
-		if(devinfo->ci->chip == BRCM_CC_4378_CHIP_ID)
+		if(devinfo->ci->chip == BRCM_CC_4377_CHIP_ID)
+			return BRCMF_PCIE_64_PCIE2REG_MAILBOXINT;
+		else if(devinfo->ci->chip == BRCM_CC_4378_CHIP_ID)
 			return BRCMF_PCIE_64_PCIE2REG_MAILBOXINT;
 		return reg;
 	case BRCMF_PCIE_PCIE2REG_MAILBOXMASK:
-		if(devinfo->ci->chip == BRCM_CC_4378_CHIP_ID)
+		if(devinfo->ci->chip == BRCM_CC_4377_CHIP_ID)
+			return BRCMF_PCIE_64_PCIE2REG_MAILBOXMASK;
+		else if(devinfo->ci->chip == BRCM_CC_4378_CHIP_ID)
 			return BRCMF_PCIE_64_PCIE2REG_MAILBOXMASK;
 		return reg;
 	case BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_0:
-		if(devinfo->ci->chip == BRCM_CC_4378_CHIP_ID)
+		if(devinfo->ci->chip == BRCM_CC_4377_CHIP_ID)
+			return BRCMF_PCIE_64_PCIE2REG_H2D_MAILBOX_0;
+		else if(devinfo->ci->chip == BRCM_CC_4378_CHIP_ID)
 			return BRCMF_PCIE_64_PCIE2REG_H2D_MAILBOX_0;
 		return reg;
 	case BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_1:
-		if(devinfo->ci->chip == BRCM_CC_4378_CHIP_ID)
+		if(devinfo->ci->chip == BRCM_CC_4377_CHIP_ID)
+			return BRCMF_PCIE_64_PCIE2REG_H2D_MAILBOX_1;
+		else if(devinfo->ci->chip == BRCM_CC_4378_CHIP_ID)
 			return BRCMF_PCIE_64_PCIE2REG_H2D_MAILBOX_1;
 		return reg;
 	default:
@@ -1018,7 +1030,10 @@ static void brcmf_pcie_intr_disable(struct brcmf_pciedev_info *devinfo)
 
 static void brcmf_pcie_intr_enable(struct brcmf_pciedev_info *devinfo)
 {
-	if(devinfo->ci->chip == BRCM_CC_4378_CHIP_ID)
+	if(devinfo->ci->chip == BRCM_CC_4377_CHIP_ID)
+		brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_64_PCIE2REG_MAILBOXMASK,
+				       BRCMF_PCIE_64_MB_INT_D2H_DB);
+	else if(devinfo->ci->chip == BRCM_CC_4378_CHIP_ID)
 		brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_64_PCIE2REG_MAILBOXMASK,
 				       BRCMF_PCIE_64_MB_INT_D2H_DB);
 	else
@@ -1053,7 +1068,9 @@ static irqreturn_t brcmf_pcie_isr_thread(int irq, void *arg)
 	struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)arg;
 	u32 status, mask;
 
-	if(devinfo->ci->chip == BRCM_CC_4378_CHIP_ID)
+	if(devinfo->ci->chip == BRCM_CC_4377_CHIP_ID)
+		mask = BRCMF_PCIE_64_MB_INT_D2H_DB;
+	else if(devinfo->ci->chip == BRCM_CC_4378_CHIP_ID)
 		mask = BRCMF_PCIE_64_MB_INT_D2H_DB;
 	else
 		mask = BRCMF_PCIE_MB_INT_D2H_DB;
@@ -2363,6 +2380,7 @@ static const struct pci_device_id brcmf_pcie_devid_table[] = {
 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_2G_DEVICE_ID),
 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_5G_DEVICE_ID),
 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4371_DEVICE_ID),
+	BRCMF_PCIE_DEVICE(BRCM_PCIE_4377_DEVICE_ID),
 	BRCMF_PCIE_DEVICE(BRCM_PCIE_4378_DEVICE_ID),
 	{ /* end: all zeroes */ }
 };
diff --git a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
index 242df778f..eb3f361a2 100644
--- a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
@@ -50,6 +50,7 @@
 #define BRCM_CC_43664_CHIP_ID		43664
 #define BRCM_CC_43666_CHIP_ID		43666
 #define BRCM_CC_4371_CHIP_ID		0x4371
+#define BRCM_CC_4377_CHIP_ID		0x4377
 #define BRCM_CC_4378_CHIP_ID		0x4378
 #define CY_CC_4373_CHIP_ID		0x4373
 #define CY_CC_43012_CHIP_ID		43012
@@ -85,6 +86,7 @@
 #define BRCM_PCIE_4366_2G_DEVICE_ID	0x43c4
 #define BRCM_PCIE_4366_5G_DEVICE_ID	0x43c5
 #define BRCM_PCIE_4371_DEVICE_ID	0x440d
+#define BRCM_PCIE_4377_DEVICE_ID	0x4488
 #define BRCM_PCIE_4378_DEVICE_ID	0x4425
 
 
