blob: ebf462d8082f79373c1ea234e4f3034a16c53e73 [file] [log] [blame]
Rasesh Mody8b230ed2010-08-23 20:24:12 -07001/*
Rasesh Mody2732ba52015-02-19 16:02:31 -05002 * Linux network driver for QLogic BR-series Converged Network Adapter.
Rasesh Mody8b230ed2010-08-23 20:24:12 -07003 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License (GPL) Version 2 as
6 * published by the Free Software Foundation
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * General Public License for more details.
12 */
13/*
Rasesh Mody2732ba52015-02-19 16:02:31 -050014 * Copyright (c) 2005-2014 Brocade Communications Systems, Inc.
15 * Copyright (c) 2014-2015 QLogic Corporation
Rasesh Mody8b230ed2010-08-23 20:24:12 -070016 * All rights reserved
Rasesh Mody2732ba52015-02-19 16:02:31 -050017 * www.qlogic.com
Rasesh Mody8b230ed2010-08-23 20:24:12 -070018 */
19#include <linux/firmware.h>
stephen hemmingere1e09182012-01-04 13:02:24 +000020#include "bnad.h"
Rasesh Mody1bf9fd702011-09-27 10:39:07 +000021#include "bfi.h"
Rasesh Mody8b230ed2010-08-23 20:24:12 -070022#include "cna.h"
23
24const struct firmware *bfi_fw;
Rasesh Mody1bf9fd702011-09-27 10:39:07 +000025static u32 *bfi_image_ct_cna, *bfi_image_ct2_cna;
26static u32 bfi_image_ct_cna_size, bfi_image_ct2_cna_size;
Rasesh Mody8b230ed2010-08-23 20:24:12 -070027
Rasesh Modyb7ee31c52010-10-05 15:46:05 +000028static u32 *
Rasesh Mody8b230ed2010-08-23 20:24:12 -070029cna_read_firmware(struct pci_dev *pdev, u32 **bfi_image,
30 u32 *bfi_image_size, char *fw_name)
31{
32 const struct firmware *fw;
33
34 if (request_firmware(&fw, fw_name, &pdev->dev)) {
35 pr_alert("Can't locate firmware %s\n", fw_name);
36 goto error;
37 }
38
39 *bfi_image = (u32 *)fw->data;
40 *bfi_image_size = fw->size/sizeof(u32);
41 bfi_fw = fw;
42
43 return *bfi_image;
44error:
45 return NULL;
46}
47
48u32 *
49cna_get_firmware_buf(struct pci_dev *pdev)
50{
Rasesh Mody1bf9fd702011-09-27 10:39:07 +000051 if (pdev->device == BFA_PCI_DEVICE_ID_CT2) {
52 if (bfi_image_ct2_cna_size == 0)
53 cna_read_firmware(pdev, &bfi_image_ct2_cna,
54 &bfi_image_ct2_cna_size, CNA_FW_FILE_CT2);
55 return bfi_image_ct2_cna;
56 } else if (bfa_asic_id_ct(pdev->device)) {
57 if (bfi_image_ct_cna_size == 0)
58 cna_read_firmware(pdev, &bfi_image_ct_cna,
59 &bfi_image_ct_cna_size, CNA_FW_FILE_CT);
60 return bfi_image_ct_cna;
61 }
62
63 return NULL;
Rasesh Mody8b230ed2010-08-23 20:24:12 -070064}
65
66u32 *
Rasesh Mody1bf9fd702011-09-27 10:39:07 +000067bfa_cb_image_get_chunk(enum bfi_asic_gen asic_gen, u32 off)
Rasesh Mody8b230ed2010-08-23 20:24:12 -070068{
Rasesh Mody1bf9fd702011-09-27 10:39:07 +000069 switch (asic_gen) {
70 case BFI_ASIC_GEN_CT:
Joe Perches64699332012-06-04 12:44:16 +000071 return (bfi_image_ct_cna + off);
Rasesh Mody1bf9fd702011-09-27 10:39:07 +000072 case BFI_ASIC_GEN_CT2:
Joe Perches64699332012-06-04 12:44:16 +000073 return (bfi_image_ct2_cna + off);
Rasesh Mody1bf9fd702011-09-27 10:39:07 +000074 default:
75 return NULL;
76 }
Rasesh Mody8b230ed2010-08-23 20:24:12 -070077}
78
79u32
Rasesh Mody1bf9fd702011-09-27 10:39:07 +000080bfa_cb_image_get_size(enum bfi_asic_gen asic_gen)
Rasesh Mody8b230ed2010-08-23 20:24:12 -070081{
Rasesh Mody1bf9fd702011-09-27 10:39:07 +000082 switch (asic_gen) {
83 case BFI_ASIC_GEN_CT:
84 return bfi_image_ct_cna_size;
Rasesh Mody1bf9fd702011-09-27 10:39:07 +000085 case BFI_ASIC_GEN_CT2:
86 return bfi_image_ct2_cna_size;
Rasesh Mody1bf9fd702011-09-27 10:39:07 +000087 default:
88 return 0;
89 }
Rasesh Mody8b230ed2010-08-23 20:24:12 -070090}