xref: /linux/drivers/net/ethernet/brocade/bna/cna_fwimg.c (revision 52fa7bf9eadac744eff74d71234c785aade6032f)
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