1*4882a593Smuzhiyun // SPDX-License-Identifier: ISC 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (c) 2013 Broadcom Corporation 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun #ifndef BRCMFMAC_FIRMWARE_H 6*4882a593Smuzhiyun #define BRCMFMAC_FIRMWARE_H 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #define BRCMF_FW_REQF_OPTIONAL 0x0001 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #define BRCMF_FW_NAME_LEN 320 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #define BRCMF_FW_DEFAULT_PATH "brcm/" 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun /** 15*4882a593Smuzhiyun * struct brcmf_firmware_mapping - Used to map chipid/revmask to firmware 16*4882a593Smuzhiyun * filename and nvram filename. Each bus type implementation should create 17*4882a593Smuzhiyun * a table of firmware mappings (using the macros defined below). 18*4882a593Smuzhiyun * 19*4882a593Smuzhiyun * @chipid: ID of chip. 20*4882a593Smuzhiyun * @revmask: bitmask of revisions, e.g. 0x10 means rev 4 only, 0xf means rev 0-3 21*4882a593Smuzhiyun * @fw: name of the firmware file. 22*4882a593Smuzhiyun * @nvram: name of nvram file. 23*4882a593Smuzhiyun */ 24*4882a593Smuzhiyun struct brcmf_firmware_mapping { 25*4882a593Smuzhiyun u32 chipid; 26*4882a593Smuzhiyun u32 revmask; 27*4882a593Smuzhiyun const char *fw_base; 28*4882a593Smuzhiyun }; 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun #define BRCMF_FW_DEF(fw_name, fw_base) \ 31*4882a593Smuzhiyun static const char BRCM_ ## fw_name ## _FIRMWARE_BASENAME[] = \ 32*4882a593Smuzhiyun BRCMF_FW_DEFAULT_PATH fw_base; \ 33*4882a593Smuzhiyun MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH fw_base ".bin") 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun #define BRCMF_FW_ENTRY(chipid, mask, name) \ 36*4882a593Smuzhiyun { chipid, mask, BRCM_ ## name ## _FIRMWARE_BASENAME } 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun void brcmf_fw_nvram_free(void *nvram); 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun enum brcmf_fw_type { 41*4882a593Smuzhiyun BRCMF_FW_TYPE_BINARY, 42*4882a593Smuzhiyun BRCMF_FW_TYPE_NVRAM 43*4882a593Smuzhiyun }; 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun struct brcmf_fw_item { 46*4882a593Smuzhiyun const char *path; 47*4882a593Smuzhiyun enum brcmf_fw_type type; 48*4882a593Smuzhiyun u16 flags; 49*4882a593Smuzhiyun union { 50*4882a593Smuzhiyun const struct firmware *binary; 51*4882a593Smuzhiyun struct { 52*4882a593Smuzhiyun void *data; 53*4882a593Smuzhiyun u32 len; 54*4882a593Smuzhiyun } nv_data; 55*4882a593Smuzhiyun }; 56*4882a593Smuzhiyun }; 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun struct brcmf_fw_request { 59*4882a593Smuzhiyun u16 domain_nr; 60*4882a593Smuzhiyun u16 bus_nr; 61*4882a593Smuzhiyun u32 n_items; 62*4882a593Smuzhiyun const char *board_type; 63*4882a593Smuzhiyun struct brcmf_fw_item items[]; 64*4882a593Smuzhiyun }; 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun struct brcmf_fw_name { 67*4882a593Smuzhiyun const char *extension; 68*4882a593Smuzhiyun char *path; 69*4882a593Smuzhiyun }; 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun struct brcmf_fw_request * 72*4882a593Smuzhiyun brcmf_fw_alloc_request(u32 chip, u32 chiprev, 73*4882a593Smuzhiyun const struct brcmf_firmware_mapping mapping_table[], 74*4882a593Smuzhiyun u32 table_size, struct brcmf_fw_name *fwnames, 75*4882a593Smuzhiyun u32 n_fwnames); 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun /* 78*4882a593Smuzhiyun * Request firmware(s) asynchronously. When the asynchronous request 79*4882a593Smuzhiyun * fails it will not use the callback, but call device_release_driver() 80*4882a593Smuzhiyun * instead which will call the driver .remove() callback. 81*4882a593Smuzhiyun */ 82*4882a593Smuzhiyun int brcmf_fw_get_firmwares(struct device *dev, struct brcmf_fw_request *req, 83*4882a593Smuzhiyun void (*fw_cb)(struct device *dev, int err, 84*4882a593Smuzhiyun struct brcmf_fw_request *req)); 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun #endif /* BRCMFMAC_FIRMWARE_H */ 87