105491d2cSKalle Valo /*
205491d2cSKalle Valo  * Copyright (c) 2010 Broadcom Corporation
305491d2cSKalle Valo  *
405491d2cSKalle Valo  * Permission to use, copy, modify, and/or distribute this software for any
505491d2cSKalle Valo  * purpose with or without fee is hereby granted, provided that the above
605491d2cSKalle Valo  * copyright notice and this permission notice appear in all copies.
705491d2cSKalle Valo  *
805491d2cSKalle Valo  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
905491d2cSKalle Valo  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1005491d2cSKalle Valo  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
1105491d2cSKalle Valo  * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1205491d2cSKalle Valo  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
1305491d2cSKalle Valo  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
1405491d2cSKalle Valo  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1505491d2cSKalle Valo  */
1605491d2cSKalle Valo 
1705491d2cSKalle Valo #include <defs.h>
1805491d2cSKalle Valo #include "types.h"
1905491d2cSKalle Valo #include <ucode_loader.h>
2005491d2cSKalle Valo 
2105491d2cSKalle Valo enum {
2205491d2cSKalle Valo 	D11UCODE_NAMETAG_START = 0,
2305491d2cSKalle Valo 	D11LCN0BSINITVALS24,
2405491d2cSKalle Valo 	D11LCN0INITVALS24,
2505491d2cSKalle Valo 	D11LCN1BSINITVALS24,
2605491d2cSKalle Valo 	D11LCN1INITVALS24,
2705491d2cSKalle Valo 	D11LCN2BSINITVALS24,
2805491d2cSKalle Valo 	D11LCN2INITVALS24,
2905491d2cSKalle Valo 	D11N0ABSINITVALS16,
3005491d2cSKalle Valo 	D11N0BSINITVALS16,
3105491d2cSKalle Valo 	D11N0INITVALS16,
3205491d2cSKalle Valo 	D11UCODE_OVERSIGHT16_MIMO,
3305491d2cSKalle Valo 	D11UCODE_OVERSIGHT16_MIMOSZ,
3405491d2cSKalle Valo 	D11UCODE_OVERSIGHT24_LCN,
3505491d2cSKalle Valo 	D11UCODE_OVERSIGHT24_LCNSZ,
3605491d2cSKalle Valo 	D11UCODE_OVERSIGHT_BOMMAJOR,
3705491d2cSKalle Valo 	D11UCODE_OVERSIGHT_BOMMINOR
3805491d2cSKalle Valo };
3905491d2cSKalle Valo 
brcms_ucode_data_init(struct brcms_info * wl,struct brcms_ucode * ucode)4005491d2cSKalle Valo int brcms_ucode_data_init(struct brcms_info *wl, struct brcms_ucode *ucode)
4105491d2cSKalle Valo {
4205491d2cSKalle Valo 	int rc;
4305491d2cSKalle Valo 
4405491d2cSKalle Valo 	rc = brcms_check_firmwares(wl);
4505491d2cSKalle Valo 
4605491d2cSKalle Valo 	rc = rc < 0 ? rc :
4705491d2cSKalle Valo 		brcms_ucode_init_buf(wl, (void **)&ucode->d11lcn0bsinitvals24,
4805491d2cSKalle Valo 				     D11LCN0BSINITVALS24);
4905491d2cSKalle Valo 	rc = rc < 0 ?
5005491d2cSKalle Valo 	     rc : brcms_ucode_init_buf(wl, (void **)&ucode->d11lcn0initvals24,
5105491d2cSKalle Valo 				       D11LCN0INITVALS24);
5205491d2cSKalle Valo 	rc = rc < 0 ?
5305491d2cSKalle Valo 	     rc : brcms_ucode_init_buf(wl, (void **)&ucode->d11lcn1bsinitvals24,
5405491d2cSKalle Valo 				       D11LCN1BSINITVALS24);
5505491d2cSKalle Valo 	rc = rc < 0 ?
5605491d2cSKalle Valo 	     rc : brcms_ucode_init_buf(wl, (void **)&ucode->d11lcn1initvals24,
5705491d2cSKalle Valo 				       D11LCN1INITVALS24);
5805491d2cSKalle Valo 	rc = rc < 0 ? rc :
5905491d2cSKalle Valo 		brcms_ucode_init_buf(wl, (void **)&ucode->d11lcn2bsinitvals24,
6005491d2cSKalle Valo 				     D11LCN2BSINITVALS24);
6105491d2cSKalle Valo 	rc = rc < 0 ?
6205491d2cSKalle Valo 	     rc : brcms_ucode_init_buf(wl, (void **)&ucode->d11lcn2initvals24,
6305491d2cSKalle Valo 				       D11LCN2INITVALS24);
6405491d2cSKalle Valo 	rc = rc < 0 ?
6505491d2cSKalle Valo 	     rc : brcms_ucode_init_buf(wl, (void **)&ucode->d11n0absinitvals16,
6605491d2cSKalle Valo 				       D11N0ABSINITVALS16);
6705491d2cSKalle Valo 	rc = rc < 0 ?
6805491d2cSKalle Valo 	     rc : brcms_ucode_init_buf(wl, (void **)&ucode->d11n0bsinitvals16,
6905491d2cSKalle Valo 				       D11N0BSINITVALS16);
7005491d2cSKalle Valo 	rc = rc < 0 ?
7105491d2cSKalle Valo 	     rc : brcms_ucode_init_buf(wl, (void **)&ucode->d11n0initvals16,
7205491d2cSKalle Valo 				       D11N0INITVALS16);
7305491d2cSKalle Valo 	rc = rc < 0 ?
7405491d2cSKalle Valo 	     rc : brcms_ucode_init_buf(wl, (void **)&ucode->bcm43xx_16_mimo,
7505491d2cSKalle Valo 				       D11UCODE_OVERSIGHT16_MIMO);
7605491d2cSKalle Valo 	rc = rc < 0 ?
7705491d2cSKalle Valo 	     rc : brcms_ucode_init_uint(wl, &ucode->bcm43xx_16_mimosz,
7805491d2cSKalle Valo 					D11UCODE_OVERSIGHT16_MIMOSZ);
7905491d2cSKalle Valo 	rc = rc < 0 ?
8005491d2cSKalle Valo 	     rc : brcms_ucode_init_buf(wl, (void **)&ucode->bcm43xx_24_lcn,
8105491d2cSKalle Valo 				       D11UCODE_OVERSIGHT24_LCN);
8205491d2cSKalle Valo 	rc = rc < 0 ?
8305491d2cSKalle Valo 	     rc : brcms_ucode_init_uint(wl, &ucode->bcm43xx_24_lcnsz,
8405491d2cSKalle Valo 					D11UCODE_OVERSIGHT24_LCNSZ);
8505491d2cSKalle Valo 	rc = rc < 0 ?
8605491d2cSKalle Valo 	     rc : brcms_ucode_init_buf(wl, (void **)&ucode->bcm43xx_bommajor,
8705491d2cSKalle Valo 				       D11UCODE_OVERSIGHT_BOMMAJOR);
8805491d2cSKalle Valo 	rc = rc < 0 ?
8905491d2cSKalle Valo 	     rc : brcms_ucode_init_buf(wl, (void **)&ucode->bcm43xx_bomminor,
9005491d2cSKalle Valo 				       D11UCODE_OVERSIGHT_BOMMINOR);
9105491d2cSKalle Valo 	return rc;
9205491d2cSKalle Valo }
9305491d2cSKalle Valo 
brcms_ucode_data_free(struct brcms_ucode * ucode)9405491d2cSKalle Valo void brcms_ucode_data_free(struct brcms_ucode *ucode)
9505491d2cSKalle Valo {
9605491d2cSKalle Valo 	brcms_ucode_free_buf((void *)ucode->d11lcn0bsinitvals24);
9705491d2cSKalle Valo 	brcms_ucode_free_buf((void *)ucode->d11lcn0initvals24);
9805491d2cSKalle Valo 	brcms_ucode_free_buf((void *)ucode->d11lcn1bsinitvals24);
9905491d2cSKalle Valo 	brcms_ucode_free_buf((void *)ucode->d11lcn1initvals24);
10005491d2cSKalle Valo 	brcms_ucode_free_buf((void *)ucode->d11lcn2bsinitvals24);
10105491d2cSKalle Valo 	brcms_ucode_free_buf((void *)ucode->d11lcn2initvals24);
10205491d2cSKalle Valo 	brcms_ucode_free_buf((void *)ucode->d11n0absinitvals16);
10305491d2cSKalle Valo 	brcms_ucode_free_buf((void *)ucode->d11n0bsinitvals16);
10405491d2cSKalle Valo 	brcms_ucode_free_buf((void *)ucode->d11n0initvals16);
10505491d2cSKalle Valo 	brcms_ucode_free_buf((void *)ucode->bcm43xx_16_mimo);
10605491d2cSKalle Valo 	brcms_ucode_free_buf((void *)ucode->bcm43xx_24_lcn);
10705491d2cSKalle Valo 	brcms_ucode_free_buf((void *)ucode->bcm43xx_bommajor);
10805491d2cSKalle Valo 	brcms_ucode_free_buf((void *)ucode->bcm43xx_bomminor);
10905491d2cSKalle Valo }
110