Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * Linux network driver for QLogic BR-series Converged Network Adapter.
0004  */
0005 /*
0006  * Copyright (c) 2005-2014 Brocade Communications Systems, Inc.
0007  * Copyright (c) 2014-2015 QLogic Corporation
0008  * All rights reserved
0009  * www.qlogic.com
0010  */
0011 #include <linux/firmware.h>
0012 #include "bnad.h"
0013 #include "bfi.h"
0014 #include "cna.h"
0015 
0016 const struct firmware *bfi_fw;
0017 static u32 *bfi_image_ct_cna, *bfi_image_ct2_cna;
0018 static u32 bfi_image_ct_cna_size, bfi_image_ct2_cna_size;
0019 
0020 static u32 *
0021 cna_read_firmware(struct pci_dev *pdev, u32 **bfi_image,
0022             u32 *bfi_image_size, char *fw_name)
0023 {
0024     const struct firmware *fw;
0025     u32 n;
0026 
0027     if (request_firmware(&fw, fw_name, &pdev->dev)) {
0028         dev_alert(&pdev->dev, "can't load firmware %s\n", fw_name);
0029         goto error;
0030     }
0031 
0032     *bfi_image = (u32 *)fw->data;
0033     *bfi_image_size = fw->size/sizeof(u32);
0034     bfi_fw = fw;
0035 
0036     /* Convert loaded firmware to host order as it is stored in file
0037      * as sequence of LE32 integers.
0038      */
0039     for (n = 0; n < *bfi_image_size; n++)
0040         le32_to_cpus(*bfi_image + n);
0041 
0042     return *bfi_image;
0043 error:
0044     return NULL;
0045 }
0046 
0047 u32 *
0048 cna_get_firmware_buf(struct pci_dev *pdev)
0049 {
0050     if (pdev->device == BFA_PCI_DEVICE_ID_CT2) {
0051         if (bfi_image_ct2_cna_size == 0)
0052             cna_read_firmware(pdev, &bfi_image_ct2_cna,
0053                 &bfi_image_ct2_cna_size, CNA_FW_FILE_CT2);
0054         return bfi_image_ct2_cna;
0055     } else if (bfa_asic_id_ct(pdev->device)) {
0056         if (bfi_image_ct_cna_size == 0)
0057             cna_read_firmware(pdev, &bfi_image_ct_cna,
0058                 &bfi_image_ct_cna_size, CNA_FW_FILE_CT);
0059         return bfi_image_ct_cna;
0060     }
0061 
0062     return NULL;
0063 }
0064 
0065 u32 *
0066 bfa_cb_image_get_chunk(enum bfi_asic_gen asic_gen, u32 off)
0067 {
0068     switch (asic_gen) {
0069     case BFI_ASIC_GEN_CT:
0070         return (bfi_image_ct_cna + off);
0071     case BFI_ASIC_GEN_CT2:
0072         return (bfi_image_ct2_cna + off);
0073     default:
0074         return NULL;
0075     }
0076 }
0077 
0078 u32
0079 bfa_cb_image_get_size(enum bfi_asic_gen asic_gen)
0080 {
0081     switch (asic_gen) {
0082     case BFI_ASIC_GEN_CT:
0083         return bfi_image_ct_cna_size;
0084     case BFI_ASIC_GEN_CT2:
0085         return bfi_image_ct2_cna_size;
0086     default:
0087         return 0;
0088     }
0089 }