1*52fa7bf9SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 2f844a0eaSJeff Kirsher /* 32732ba56SRasesh Mody * Linux network driver for QLogic BR-series Converged Network Adapter. 4f844a0eaSJeff Kirsher */ 5f844a0eaSJeff Kirsher /* 62732ba56SRasesh Mody * Copyright (c) 2005-2014 Brocade Communications Systems, Inc. 72732ba56SRasesh Mody * Copyright (c) 2014-2015 QLogic Corporation 8f844a0eaSJeff Kirsher * All rights reserved 92732ba56SRasesh Mody * www.qlogic.com 10f844a0eaSJeff Kirsher */ 11f844a0eaSJeff Kirsher #include <linux/firmware.h> 12e1e0918fSstephen hemminger #include "bnad.h" 131bf9fd70SRasesh Mody #include "bfi.h" 14f844a0eaSJeff Kirsher #include "cna.h" 15f844a0eaSJeff Kirsher 16f844a0eaSJeff Kirsher const struct firmware *bfi_fw; 171bf9fd70SRasesh Mody static u32 *bfi_image_ct_cna, *bfi_image_ct2_cna; 181bf9fd70SRasesh Mody static u32 bfi_image_ct_cna_size, bfi_image_ct2_cna_size; 19f844a0eaSJeff Kirsher 20f844a0eaSJeff Kirsher static u32 * 21f844a0eaSJeff Kirsher cna_read_firmware(struct pci_dev *pdev, u32 **bfi_image, 22f844a0eaSJeff Kirsher u32 *bfi_image_size, char *fw_name) 23f844a0eaSJeff Kirsher { 24f844a0eaSJeff Kirsher const struct firmware *fw; 25e236b954SIvan Vecera u32 n; 26f844a0eaSJeff Kirsher 27f844a0eaSJeff Kirsher if (request_firmware(&fw, fw_name, &pdev->dev)) { 28ecc46789SIvan Vecera dev_alert(&pdev->dev, "can't load firmware %s\n", fw_name); 29f844a0eaSJeff Kirsher goto error; 30f844a0eaSJeff Kirsher } 31f844a0eaSJeff Kirsher 32f844a0eaSJeff Kirsher *bfi_image = (u32 *)fw->data; 33f844a0eaSJeff Kirsher *bfi_image_size = fw->size/sizeof(u32); 34f844a0eaSJeff Kirsher bfi_fw = fw; 35f844a0eaSJeff Kirsher 36e236b954SIvan Vecera /* Convert loaded firmware to host order as it is stored in file 37e236b954SIvan Vecera * as sequence of LE32 integers. 38e236b954SIvan Vecera */ 39e236b954SIvan Vecera for (n = 0; n < *bfi_image_size; n++) 40e236b954SIvan Vecera le32_to_cpus(*bfi_image + n); 41e236b954SIvan Vecera 42f844a0eaSJeff Kirsher return *bfi_image; 43f844a0eaSJeff Kirsher error: 44f844a0eaSJeff Kirsher return NULL; 45f844a0eaSJeff Kirsher } 46f844a0eaSJeff Kirsher 47f844a0eaSJeff Kirsher u32 * 48f844a0eaSJeff Kirsher cna_get_firmware_buf(struct pci_dev *pdev) 49f844a0eaSJeff Kirsher { 501bf9fd70SRasesh Mody if (pdev->device == BFA_PCI_DEVICE_ID_CT2) { 511bf9fd70SRasesh Mody if (bfi_image_ct2_cna_size == 0) 521bf9fd70SRasesh Mody cna_read_firmware(pdev, &bfi_image_ct2_cna, 531bf9fd70SRasesh Mody &bfi_image_ct2_cna_size, CNA_FW_FILE_CT2); 541bf9fd70SRasesh Mody return bfi_image_ct2_cna; 551bf9fd70SRasesh Mody } else if (bfa_asic_id_ct(pdev->device)) { 56f844a0eaSJeff Kirsher if (bfi_image_ct_cna_size == 0) 57f844a0eaSJeff Kirsher cna_read_firmware(pdev, &bfi_image_ct_cna, 58f844a0eaSJeff Kirsher &bfi_image_ct_cna_size, CNA_FW_FILE_CT); 59f844a0eaSJeff Kirsher return bfi_image_ct_cna; 60f844a0eaSJeff Kirsher } 61f844a0eaSJeff Kirsher 621bf9fd70SRasesh Mody return NULL; 631bf9fd70SRasesh Mody } 641bf9fd70SRasesh Mody 65f844a0eaSJeff Kirsher u32 * 661bf9fd70SRasesh Mody bfa_cb_image_get_chunk(enum bfi_asic_gen asic_gen, u32 off) 67f844a0eaSJeff Kirsher { 681bf9fd70SRasesh Mody switch (asic_gen) { 691bf9fd70SRasesh Mody case BFI_ASIC_GEN_CT: 7064699336SJoe Perches return (bfi_image_ct_cna + off); 711bf9fd70SRasesh Mody case BFI_ASIC_GEN_CT2: 7264699336SJoe Perches return (bfi_image_ct2_cna + off); 731bf9fd70SRasesh Mody default: 741bf9fd70SRasesh Mody return NULL; 751bf9fd70SRasesh Mody } 76f844a0eaSJeff Kirsher } 77f844a0eaSJeff Kirsher 78f844a0eaSJeff Kirsher u32 791bf9fd70SRasesh Mody bfa_cb_image_get_size(enum bfi_asic_gen asic_gen) 80f844a0eaSJeff Kirsher { 811bf9fd70SRasesh Mody switch (asic_gen) { 821bf9fd70SRasesh Mody case BFI_ASIC_GEN_CT: 83f844a0eaSJeff Kirsher return bfi_image_ct_cna_size; 841bf9fd70SRasesh Mody case BFI_ASIC_GEN_CT2: 851bf9fd70SRasesh Mody return bfi_image_ct2_cna_size; 861bf9fd70SRasesh Mody default: 871bf9fd70SRasesh Mody return 0; 881bf9fd70SRasesh Mody } 89f844a0eaSJeff Kirsher } 90