diff options
Diffstat (limited to 'drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c')
| -rw-r--r-- | drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 33 |
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 | ||
| 3988 | static 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 | |||
| 3982 | static const struct brcmf_bus_ops brcmf_sdio_bus_ops = { | 4006 | static 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 | ||
| 3994 | static void brcmf_sdio_firmware_callback(struct device *dev, int err, | 4019 | static void brcmf_sdio_firmware_callback(struct device *dev, int err, |
