aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c')
-rw-r--r--drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c33
1 files changed, 29 insertions, 4 deletions
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
index 5adce0e36fe5..b2256aa76eb6 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
@@ -260,10 +260,11 @@ struct rte_console {
260#define I_HMB_HOST_INT I_HMB_SW3 /* Miscellaneous Interrupt */ 260#define I_HMB_HOST_INT I_HMB_SW3 /* Miscellaneous Interrupt */
261 261
262/* tohostmailboxdata */ 262/* tohostmailboxdata */
263#define HMB_DATA_NAKHANDLED 1 /* retransmit NAK'd frame */ 263#define HMB_DATA_NAKHANDLED 0x0001 /* retransmit NAK'd frame */
264#define HMB_DATA_DEVREADY 2 /* talk to host after enable */ 264#define HMB_DATA_DEVREADY 0x0002 /* talk to host after enable */
265#define HMB_DATA_FC 4 /* per prio flowcontrol update flag */ 265#define HMB_DATA_FC 0x0004 /* per prio flowcontrol update flag */
266#define HMB_DATA_FWREADY 8 /* fw ready for protocol activity */ 266#define HMB_DATA_FWREADY 0x0008 /* fw ready for protocol activity */
267#define HMB_DATA_FWHALT 0x0010 /* firmware halted */
267 268
268#define HMB_DATA_FCDATA_MASK 0xff000000 269#define HMB_DATA_FCDATA_MASK 0xff000000
269#define HMB_DATA_FCDATA_SHIFT 24 270#define HMB_DATA_FCDATA_SHIFT 24
@@ -1094,6 +1095,10 @@ static u32 brcmf_sdio_hostmail(struct brcmf_sdio *bus)
1094 offsetof(struct sdpcmd_regs, tosbmailbox)); 1095 offsetof(struct sdpcmd_regs, tosbmailbox));
1095 bus->sdcnt.f1regdata += 2; 1096 bus->sdcnt.f1regdata += 2;
1096 1097
1098 /* dongle indicates the firmware has halted/crashed */
1099 if (hmb_data & HMB_DATA_FWHALT)
1100 brcmf_err("mailbox indicates firmware halted\n");
1101
1097 /* Dongle recomposed rx frames, accept them again */ 1102 /* Dongle recomposed rx frames, accept them again */
1098 if (hmb_data & HMB_DATA_NAKHANDLED) { 1103 if (hmb_data & HMB_DATA_NAKHANDLED) {
1099 brcmf_dbg(SDIO, "Dongle reports NAK handled, expect rtx of %d\n", 1104 brcmf_dbg(SDIO, "Dongle reports NAK handled, expect rtx of %d\n",
@@ -1151,6 +1156,7 @@ static u32 brcmf_sdio_hostmail(struct brcmf_sdio *bus)
1151 HMB_DATA_NAKHANDLED | 1156 HMB_DATA_NAKHANDLED |
1152 HMB_DATA_FC | 1157 HMB_DATA_FC |
1153 HMB_DATA_FWREADY | 1158 HMB_DATA_FWREADY |
1159 HMB_DATA_FWHALT |
1154 HMB_DATA_FCDATA_MASK | HMB_DATA_VERSION_MASK)) 1160 HMB_DATA_FCDATA_MASK | HMB_DATA_VERSION_MASK))
1155 brcmf_err("Unknown mailbox data content: 0x%02x\n", 1161 brcmf_err("Unknown mailbox data content: 0x%02x\n",
1156 hmb_data); 1162 hmb_data);
@@ -3979,6 +3985,24 @@ brcmf_sdio_watchdog(unsigned long data)
3979 } 3985 }
3980} 3986}
3981 3987
3988static int brcmf_sdio_get_fwname(struct device *dev, u32 chip, u32 chiprev,
3989 u8 *fw_name)
3990{
3991 struct brcmf_bus *bus_if = dev_get_drvdata(dev);
3992 struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
3993 int ret = 0;
3994
3995 if (sdiodev->fw_name[0] != '\0')
3996 strlcpy(fw_name, sdiodev->fw_name, BRCMF_FW_NAME_LEN);
3997 else
3998 ret = brcmf_fw_map_chip_to_name(chip, chiprev,
3999 brcmf_sdio_fwnames,
4000 ARRAY_SIZE(brcmf_sdio_fwnames),
4001 fw_name, NULL);
4002
4003 return ret;
4004}
4005
3982static const struct brcmf_bus_ops brcmf_sdio_bus_ops = { 4006static const struct brcmf_bus_ops brcmf_sdio_bus_ops = {
3983 .stop = brcmf_sdio_bus_stop, 4007 .stop = brcmf_sdio_bus_stop,
3984 .preinit = brcmf_sdio_bus_preinit, 4008 .preinit = brcmf_sdio_bus_preinit,
@@ -3989,6 +4013,7 @@ static const struct brcmf_bus_ops brcmf_sdio_bus_ops = {
3989 .wowl_config = brcmf_sdio_wowl_config, 4013 .wowl_config = brcmf_sdio_wowl_config,
3990 .get_ramsize = brcmf_sdio_bus_get_ramsize, 4014 .get_ramsize = brcmf_sdio_bus_get_ramsize,
3991 .get_memdump = brcmf_sdio_bus_get_memdump, 4015 .get_memdump = brcmf_sdio_bus_get_memdump,
4016 .get_fwname = brcmf_sdio_get_fwname,
3992}; 4017};
3993 4018
3994static void brcmf_sdio_firmware_callback(struct device *dev, int err, 4019static void brcmf_sdio_firmware_callback(struct device *dev, int err,