xref: /openbmc/linux/drivers/net/wireless/broadcom/brcm80211/brcmsmac/ucode_loader.c (revision 9938b04472d5c59f8bd8152a548533a8599596a2)
1*05491d2cSKalle Valo /*
2*05491d2cSKalle Valo  * Copyright (c) 2010 Broadcom Corporation
3*05491d2cSKalle Valo  *
4*05491d2cSKalle Valo  * Permission to use, copy, modify, and/or distribute this software for any
5*05491d2cSKalle Valo  * purpose with or without fee is hereby granted, provided that the above
6*05491d2cSKalle Valo  * copyright notice and this permission notice appear in all copies.
7*05491d2cSKalle Valo  *
8*05491d2cSKalle Valo  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9*05491d2cSKalle Valo  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10*05491d2cSKalle Valo  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
11*05491d2cSKalle Valo  * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12*05491d2cSKalle Valo  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
13*05491d2cSKalle Valo  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14*05491d2cSKalle Valo  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15*05491d2cSKalle Valo  */
16*05491d2cSKalle Valo 
17*05491d2cSKalle Valo #include <defs.h>
18*05491d2cSKalle Valo #include "types.h"
19*05491d2cSKalle Valo #include <ucode_loader.h>
20*05491d2cSKalle Valo 
21*05491d2cSKalle Valo enum {
22*05491d2cSKalle Valo 	D11UCODE_NAMETAG_START = 0,
23*05491d2cSKalle Valo 	D11LCN0BSINITVALS24,
24*05491d2cSKalle Valo 	D11LCN0INITVALS24,
25*05491d2cSKalle Valo 	D11LCN1BSINITVALS24,
26*05491d2cSKalle Valo 	D11LCN1INITVALS24,
27*05491d2cSKalle Valo 	D11LCN2BSINITVALS24,
28*05491d2cSKalle Valo 	D11LCN2INITVALS24,
29*05491d2cSKalle Valo 	D11N0ABSINITVALS16,
30*05491d2cSKalle Valo 	D11N0BSINITVALS16,
31*05491d2cSKalle Valo 	D11N0INITVALS16,
32*05491d2cSKalle Valo 	D11UCODE_OVERSIGHT16_MIMO,
33*05491d2cSKalle Valo 	D11UCODE_OVERSIGHT16_MIMOSZ,
34*05491d2cSKalle Valo 	D11UCODE_OVERSIGHT24_LCN,
35*05491d2cSKalle Valo 	D11UCODE_OVERSIGHT24_LCNSZ,
36*05491d2cSKalle Valo 	D11UCODE_OVERSIGHT_BOMMAJOR,
37*05491d2cSKalle Valo 	D11UCODE_OVERSIGHT_BOMMINOR
38*05491d2cSKalle Valo };
39*05491d2cSKalle Valo 
brcms_ucode_data_init(struct brcms_info * wl,struct brcms_ucode * ucode)40*05491d2cSKalle Valo int brcms_ucode_data_init(struct brcms_info *wl, struct brcms_ucode *ucode)
41*05491d2cSKalle Valo {
42*05491d2cSKalle Valo 	int rc;
43*05491d2cSKalle Valo 
44*05491d2cSKalle Valo 	rc = brcms_check_firmwares(wl);
45*05491d2cSKalle Valo 
46*05491d2cSKalle Valo 	rc = rc < 0 ? rc :
47*05491d2cSKalle Valo 		brcms_ucode_init_buf(wl, (void **)&ucode->d11lcn0bsinitvals24,
48*05491d2cSKalle Valo 				     D11LCN0BSINITVALS24);
49*05491d2cSKalle Valo 	rc = rc < 0 ?
50*05491d2cSKalle Valo 	     rc : brcms_ucode_init_buf(wl, (void **)&ucode->d11lcn0initvals24,
51*05491d2cSKalle Valo 				       D11LCN0INITVALS24);
52*05491d2cSKalle Valo 	rc = rc < 0 ?
53*05491d2cSKalle Valo 	     rc : brcms_ucode_init_buf(wl, (void **)&ucode->d11lcn1bsinitvals24,
54*05491d2cSKalle Valo 				       D11LCN1BSINITVALS24);
55*05491d2cSKalle Valo 	rc = rc < 0 ?
56*05491d2cSKalle Valo 	     rc : brcms_ucode_init_buf(wl, (void **)&ucode->d11lcn1initvals24,
57*05491d2cSKalle Valo 				       D11LCN1INITVALS24);
58*05491d2cSKalle Valo 	rc = rc < 0 ? rc :
59*05491d2cSKalle Valo 		brcms_ucode_init_buf(wl, (void **)&ucode->d11lcn2bsinitvals24,
60*05491d2cSKalle Valo 				     D11LCN2BSINITVALS24);
61*05491d2cSKalle Valo 	rc = rc < 0 ?
62*05491d2cSKalle Valo 	     rc : brcms_ucode_init_buf(wl, (void **)&ucode->d11lcn2initvals24,
63*05491d2cSKalle Valo 				       D11LCN2INITVALS24);
64*05491d2cSKalle Valo 	rc = rc < 0 ?
65*05491d2cSKalle Valo 	     rc : brcms_ucode_init_buf(wl, (void **)&ucode->d11n0absinitvals16,
66*05491d2cSKalle Valo 				       D11N0ABSINITVALS16);
67*05491d2cSKalle Valo 	rc = rc < 0 ?
68*05491d2cSKalle Valo 	     rc : brcms_ucode_init_buf(wl, (void **)&ucode->d11n0bsinitvals16,
69*05491d2cSKalle Valo 				       D11N0BSINITVALS16);
70*05491d2cSKalle Valo 	rc = rc < 0 ?
71*05491d2cSKalle Valo 	     rc : brcms_ucode_init_buf(wl, (void **)&ucode->d11n0initvals16,
72*05491d2cSKalle Valo 				       D11N0INITVALS16);
73*05491d2cSKalle Valo 	rc = rc < 0 ?
74*05491d2cSKalle Valo 	     rc : brcms_ucode_init_buf(wl, (void **)&ucode->bcm43xx_16_mimo,
75*05491d2cSKalle Valo 				       D11UCODE_OVERSIGHT16_MIMO);
76*05491d2cSKalle Valo 	rc = rc < 0 ?
77*05491d2cSKalle Valo 	     rc : brcms_ucode_init_uint(wl, &ucode->bcm43xx_16_mimosz,
78*05491d2cSKalle Valo 					D11UCODE_OVERSIGHT16_MIMOSZ);
79*05491d2cSKalle Valo 	rc = rc < 0 ?
80*05491d2cSKalle Valo 	     rc : brcms_ucode_init_buf(wl, (void **)&ucode->bcm43xx_24_lcn,
81*05491d2cSKalle Valo 				       D11UCODE_OVERSIGHT24_LCN);
82*05491d2cSKalle Valo 	rc = rc < 0 ?
83*05491d2cSKalle Valo 	     rc : brcms_ucode_init_uint(wl, &ucode->bcm43xx_24_lcnsz,
84*05491d2cSKalle Valo 					D11UCODE_OVERSIGHT24_LCNSZ);
85*05491d2cSKalle Valo 	rc = rc < 0 ?
86*05491d2cSKalle Valo 	     rc : brcms_ucode_init_buf(wl, (void **)&ucode->bcm43xx_bommajor,
87*05491d2cSKalle Valo 				       D11UCODE_OVERSIGHT_BOMMAJOR);
88*05491d2cSKalle Valo 	rc = rc < 0 ?
89*05491d2cSKalle Valo 	     rc : brcms_ucode_init_buf(wl, (void **)&ucode->bcm43xx_bomminor,
90*05491d2cSKalle Valo 				       D11UCODE_OVERSIGHT_BOMMINOR);
91*05491d2cSKalle Valo 	return rc;
92*05491d2cSKalle Valo }
93*05491d2cSKalle Valo 
brcms_ucode_data_free(struct brcms_ucode * ucode)94*05491d2cSKalle Valo void brcms_ucode_data_free(struct brcms_ucode *ucode)
95*05491d2cSKalle Valo {
96*05491d2cSKalle Valo 	brcms_ucode_free_buf((void *)ucode->d11lcn0bsinitvals24);
97*05491d2cSKalle Valo 	brcms_ucode_free_buf((void *)ucode->d11lcn0initvals24);
98*05491d2cSKalle Valo 	brcms_ucode_free_buf((void *)ucode->d11lcn1bsinitvals24);
99*05491d2cSKalle Valo 	brcms_ucode_free_buf((void *)ucode->d11lcn1initvals24);
100*05491d2cSKalle Valo 	brcms_ucode_free_buf((void *)ucode->d11lcn2bsinitvals24);
101*05491d2cSKalle Valo 	brcms_ucode_free_buf((void *)ucode->d11lcn2initvals24);
102*05491d2cSKalle Valo 	brcms_ucode_free_buf((void *)ucode->d11n0absinitvals16);
103*05491d2cSKalle Valo 	brcms_ucode_free_buf((void *)ucode->d11n0bsinitvals16);
104*05491d2cSKalle Valo 	brcms_ucode_free_buf((void *)ucode->d11n0initvals16);
105*05491d2cSKalle Valo 	brcms_ucode_free_buf((void *)ucode->bcm43xx_16_mimo);
106*05491d2cSKalle Valo 	brcms_ucode_free_buf((void *)ucode->bcm43xx_24_lcn);
107*05491d2cSKalle Valo 	brcms_ucode_free_buf((void *)ucode->bcm43xx_bommajor);
108*05491d2cSKalle Valo 	brcms_ucode_free_buf((void *)ucode->bcm43xx_bomminor);
109*05491d2cSKalle Valo }
110