Lines Matching refs:wdev
80 static int wfx_sram_write_dma_safe(struct wfx_dev *wdev, u32 addr, const u8 *buf, size_t len) in wfx_sram_write_dma_safe() argument
92 ret = wfx_sram_buf_write(wdev, addr, tmp, len); in wfx_sram_write_dma_safe()
98 static int get_firmware(struct wfx_dev *wdev, u32 keyset_chip, in get_firmware() argument
107 wdev->pdata.file_fw, keyset_chip); in get_firmware()
108 ret = firmware_request_nowarn(fw, filename, wdev->dev); in get_firmware()
110 dev_info(wdev->dev, "can't load %s, falling back to %s.sec\n", in get_firmware()
111 filename, wdev->pdata.file_fw); in get_firmware()
112 snprintf(filename, sizeof(filename), "%s.sec", wdev->pdata.file_fw); in get_firmware()
113 ret = request_firmware(fw, filename, wdev->dev); in get_firmware()
115 dev_err(wdev->dev, "can't load %s\n", filename); in get_firmware()
130 dev_err(wdev->dev, "%s corrupted\n", filename); in get_firmware()
137 dev_err(wdev->dev, "firmware keyset is incompatible with chip (file: 0x%02X, chip: 0x%02X)\n", in get_firmware()
143 wdev->keyset = keyset_file; in get_firmware()
147 static int wait_ncp_status(struct wfx_dev *wdev, u32 status) in wait_ncp_status() argument
155 ret = wfx_sram_reg_read(wdev, WFX_DCA_NCP_STATUS, ®); in wait_ncp_status()
165 dev_dbg(wdev->dev, "chip answer after %lldus\n", ktime_us_delta(now, start)); in wait_ncp_status()
167 dev_dbg(wdev->dev, "chip answer immediately\n"); in wait_ncp_status()
171 static int upload_firmware(struct wfx_dev *wdev, const u8 *data, size_t len) in upload_firmware() argument
178 dev_err(wdev->dev, "firmware size is not aligned. Buffer overrun will occur\n"); in upload_firmware()
190 ret = wfx_sram_reg_read(wdev, WFX_DCA_GET, &bytes_done); in upload_firmware()
195 dev_dbg(wdev->dev, "answer after %lldus\n", ktime_us_delta(now, start)); in upload_firmware()
197 ret = wfx_sram_write_dma_safe(wdev, WFX_DNLD_FIFO + (offs % DNLD_FIFO_SIZE), in upload_firmware()
204 ret = wfx_sram_reg_write(wdev, WFX_DCA_PUT, offs); in upload_firmware()
211 static void print_boot_status(struct wfx_dev *wdev) in print_boot_status() argument
215 wfx_sram_reg_read(wdev, WFX_STATUS_INFO, ®); in print_boot_status()
218 wfx_sram_reg_read(wdev, WFX_ERR_INFO, ®); in print_boot_status()
220 dev_info(wdev->dev, "secure boot: %s\n", fwio_errors[reg]); in print_boot_status()
222 dev_info(wdev->dev, "secure boot: Error %#02x\n", reg); in print_boot_status()
225 static int load_firmware_secure(struct wfx_dev *wdev) in load_firmware_secure() argument
239 wfx_sram_reg_write(wdev, WFX_DCA_HOST_STATUS, HOST_READY); in load_firmware_secure()
240 ret = wait_ncp_status(wdev, NCP_INFO_READY); in load_firmware_secure()
244 wfx_sram_buf_read(wdev, WFX_BOOTLOADER_LABEL, buf, BOOTLOADER_LABEL_SIZE); in load_firmware_secure()
246 dev_dbg(wdev->dev, "bootloader: \"%s\"\n", buf); in load_firmware_secure()
248 wfx_sram_buf_read(wdev, WFX_PTE_INFO, buf, PTE_INFO_SIZE); in load_firmware_secure()
249 ret = get_firmware(wdev, buf[PTE_INFO_KEYSET_IDX], &fw, &fw_offset); in load_firmware_secure()
254 wfx_sram_reg_write(wdev, WFX_DCA_HOST_STATUS, HOST_INFO_READ); in load_firmware_secure()
255 ret = wait_ncp_status(wdev, NCP_READY); in load_firmware_secure()
259 wfx_sram_reg_write(wdev, WFX_DNLD_FIFO, 0xFFFFFFFF); /* Fifo init */ in load_firmware_secure()
260 wfx_sram_write_dma_safe(wdev, WFX_DCA_FW_VERSION, "\x01\x00\x00\x00", FW_VERSION_SIZE); in load_firmware_secure()
261 wfx_sram_write_dma_safe(wdev, WFX_DCA_FW_SIGNATURE, fw->data + fw_offset, in load_firmware_secure()
263 wfx_sram_write_dma_safe(wdev, WFX_DCA_FW_HASH, fw->data + fw_offset + FW_SIGNATURE_SIZE, in load_firmware_secure()
265 wfx_sram_reg_write(wdev, WFX_DCA_IMAGE_SIZE, fw->size - header_size); in load_firmware_secure()
266 wfx_sram_reg_write(wdev, WFX_DCA_HOST_STATUS, HOST_UPLOAD_PENDING); in load_firmware_secure()
267 ret = wait_ncp_status(wdev, NCP_DOWNLOAD_PENDING); in load_firmware_secure()
272 ret = upload_firmware(wdev, fw->data + header_size, fw->size - header_size); in load_firmware_secure()
275 dev_dbg(wdev->dev, "firmware load after %lldus\n", in load_firmware_secure()
278 wfx_sram_reg_write(wdev, WFX_DCA_HOST_STATUS, HOST_UPLOAD_COMPLETE); in load_firmware_secure()
279 ret = wait_ncp_status(wdev, NCP_AUTH_OK); in load_firmware_secure()
282 ret = wait_ncp_status(wdev, NCP_PUB_KEY_RDY); in load_firmware_secure()
285 wfx_sram_reg_write(wdev, WFX_DCA_HOST_STATUS, HOST_OK_TO_JUMP); in load_firmware_secure()
291 print_boot_status(wdev); in load_firmware_secure()
295 static int init_gpr(struct wfx_dev *wdev) in init_gpr() argument
310 ret = wfx_igpr_reg_write(wdev, gpr_init[i].index, gpr_init[i].value); in init_gpr()
313 dev_dbg(wdev->dev, " index %02x: %08x\n", gpr_init[i].index, gpr_init[i].value); in init_gpr()
318 int wfx_init_device(struct wfx_dev *wdev) in wfx_init_device() argument
327 if (wdev->pdata.use_rising_clk) in wfx_init_device()
329 ret = wfx_config_reg_write(wdev, reg); in wfx_init_device()
331 …dev_err(wdev->dev, "bus returned an error during first write access. Host configuration error?\n"); in wfx_init_device()
335 ret = wfx_config_reg_read(wdev, ®); in wfx_init_device()
337 dev_err(wdev->dev, "bus returned an error during first read access. Bus configuration error?\n"); in wfx_init_device()
341 dev_err(wdev->dev, "chip mute. Bus configuration error or chip wasn't reset?\n"); in wfx_init_device()
344 dev_dbg(wdev->dev, "initial config register value: %08x\n", reg); in wfx_init_device()
348 dev_err(wdev->dev, "bad hardware revision number: %d\n", hw_revision); in wfx_init_device()
353 dev_notice(wdev->dev, "development hardware detected\n"); in wfx_init_device()
357 ret = init_gpr(wdev); in wfx_init_device()
361 ret = wfx_control_reg_write(wdev, CTRL_WLAN_WAKEUP); in wfx_init_device()
366 ret = wfx_control_reg_read(wdev, ®); in wfx_init_device()
371 dev_err(wdev->dev, "chip didn't wake up. Chip wasn't reset?\n"); in wfx_init_device()
375 dev_dbg(wdev->dev, "chip wake up after %lldus\n", ktime_us_delta(now, start)); in wfx_init_device()
377 ret = wfx_config_reg_write_bits(wdev, CFG_CPU_RESET, 0); in wfx_init_device()
380 ret = load_firmware_secure(wdev); in wfx_init_device()
383 return wfx_config_reg_write_bits(wdev, in wfx_init_device()