cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

esas2r_flash.c (39017B)


      1
      2/*
      3 *  linux/drivers/scsi/esas2r/esas2r_flash.c
      4 *      For use with ATTO ExpressSAS R6xx SAS/SATA RAID controllers
      5 *
      6 *  Copyright (c) 2001-2013 ATTO Technology, Inc.
      7 *  (mailto:linuxdrivers@attotech.com)
      8 *
      9 * This program is free software; you can redistribute it and/or
     10 * modify it under the terms of the GNU General Public License
     11 * as published by the Free Software Foundation; either version 2
     12 * of the License, or (at your option) any later version.
     13 *
     14 * This program is distributed in the hope that it will be useful,
     15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     17 * GNU General Public License for more details.
     18 *
     19 * NO WARRANTY
     20 * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
     21 * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
     22 * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
     23 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
     24 * solely responsible for determining the appropriateness of using and
     25 * distributing the Program and assumes all risks associated with its
     26 * exercise of rights under this Agreement, including but not limited to
     27 * the risks and costs of program errors, damage to or loss of data,
     28 * programs or equipment, and unavailability or interruption of operations.
     29 *
     30 * DISCLAIMER OF LIABILITY
     31 * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
     32 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     33 * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
     34 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
     35 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
     36 * USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
     37 * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
     38 *
     39 * You should have received a copy of the GNU General Public License
     40 * along with this program; if not, write to the Free Software
     41 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
     42 * USA.
     43 */
     44
     45#include "esas2r.h"
     46
     47/* local macro defs */
     48#define esas2r_nvramcalc_cksum(n)     \
     49	(esas2r_calc_byte_cksum((u8 *)(n), sizeof(struct esas2r_sas_nvram), \
     50				SASNVR_CKSUM_SEED))
     51#define esas2r_nvramcalc_xor_cksum(n)  \
     52	(esas2r_calc_byte_xor_cksum((u8 *)(n), \
     53				    sizeof(struct esas2r_sas_nvram), 0))
     54
     55#define ESAS2R_FS_DRVR_VER 2
     56
     57static struct esas2r_sas_nvram default_sas_nvram = {
     58	{ 'E',	'S',  'A',  'S'			     }, /* signature          */
     59	SASNVR_VERSION,                                 /* version            */
     60	0,                                              /* checksum           */
     61	31,                                             /* max_lun_for_target */
     62	SASNVR_PCILAT_MAX,                              /* pci_latency        */
     63	SASNVR1_BOOT_DRVR,                              /* options1           */
     64	SASNVR2_HEARTBEAT   | SASNVR2_SINGLE_BUS        /* options2           */
     65	| SASNVR2_SW_MUX_CTRL,
     66	SASNVR_COAL_DIS,                                /* int_coalescing     */
     67	SASNVR_CMDTHR_NONE,                             /* cmd_throttle       */
     68	3,                                              /* dev_wait_time      */
     69	1,                                              /* dev_wait_count     */
     70	0,                                              /* spin_up_delay      */
     71	0,                                              /* ssp_align_rate     */
     72	{ 0x50, 0x01, 0x08, 0x60,                       /* sas_addr           */
     73	  0x00, 0x00, 0x00, 0x00 },
     74	{ SASNVR_SPEED_AUTO },                          /* phy_speed          */
     75	{ SASNVR_MUX_DISABLED },                        /* SAS multiplexing   */
     76	{ 0 },                                          /* phy_flags          */
     77	SASNVR_SORT_SAS_ADDR,                           /* sort_type          */
     78	3,                                              /* dpm_reqcmd_lmt     */
     79	3,                                              /* dpm_stndby_time    */
     80	0,                                              /* dpm_active_time    */
     81	{ 0 },                                          /* phy_target_id      */
     82	SASNVR_VSMH_DISABLED,                           /* virt_ses_mode      */
     83	SASNVR_RWM_DEFAULT,                             /* read_write_mode    */
     84	0,                                              /* link down timeout  */
     85	{ 0 }                                           /* reserved           */
     86};
     87
     88static u8 cmd_to_fls_func[] = {
     89	0xFF,
     90	VDA_FLASH_READ,
     91	VDA_FLASH_BEGINW,
     92	VDA_FLASH_WRITE,
     93	VDA_FLASH_COMMIT,
     94	VDA_FLASH_CANCEL
     95};
     96
     97static u8 esas2r_calc_byte_xor_cksum(u8 *addr, u32 len, u8 seed)
     98{
     99	u32 cksum = seed;
    100	u8 *p = (u8 *)&cksum;
    101
    102	while (len) {
    103		if (((uintptr_t)addr & 3) == 0)
    104			break;
    105
    106		cksum = cksum ^ *addr;
    107		addr++;
    108		len--;
    109	}
    110	while (len >= sizeof(u32)) {
    111		cksum = cksum ^ *(u32 *)addr;
    112		addr += 4;
    113		len -= 4;
    114	}
    115	while (len--) {
    116		cksum = cksum ^ *addr;
    117		addr++;
    118	}
    119	return p[0] ^ p[1] ^ p[2] ^ p[3];
    120}
    121
    122static u8 esas2r_calc_byte_cksum(void *addr, u32 len, u8 seed)
    123{
    124	u8 *p = (u8 *)addr;
    125	u8 cksum = seed;
    126
    127	while (len--)
    128		cksum = cksum + p[len];
    129	return cksum;
    130}
    131
    132/* Interrupt callback to process FM API write requests. */
    133static void esas2r_fmapi_callback(struct esas2r_adapter *a,
    134				  struct esas2r_request *rq)
    135{
    136	struct atto_vda_flash_req *vrq = &rq->vrq->flash;
    137	struct esas2r_flash_context *fc =
    138		(struct esas2r_flash_context *)rq->interrupt_cx;
    139
    140	if (rq->req_stat == RS_SUCCESS) {
    141		/* Last request was successful.  See what to do now. */
    142		switch (vrq->sub_func) {
    143		case VDA_FLASH_BEGINW:
    144			if (fc->sgc.cur_offset == NULL)
    145				goto commit;
    146
    147			vrq->sub_func = VDA_FLASH_WRITE;
    148			rq->req_stat = RS_PENDING;
    149			break;
    150
    151		case VDA_FLASH_WRITE:
    152commit:
    153			vrq->sub_func = VDA_FLASH_COMMIT;
    154			rq->req_stat = RS_PENDING;
    155			rq->interrupt_cb = fc->interrupt_cb;
    156			break;
    157
    158		default:
    159			break;
    160		}
    161	}
    162
    163	if (rq->req_stat != RS_PENDING)
    164		/*
    165		 * All done. call the real callback to complete the FM API
    166		 * request.  We should only get here if a BEGINW or WRITE
    167		 * operation failed.
    168		 */
    169		(*fc->interrupt_cb)(a, rq);
    170}
    171
    172/*
    173 * Build a flash request based on the flash context.  The request status
    174 * is filled in on an error.
    175 */
    176static void build_flash_msg(struct esas2r_adapter *a,
    177			    struct esas2r_request *rq)
    178{
    179	struct esas2r_flash_context *fc =
    180		(struct esas2r_flash_context *)rq->interrupt_cx;
    181	struct esas2r_sg_context *sgc = &fc->sgc;
    182	u8 cksum = 0;
    183
    184	/* calculate the checksum */
    185	if (fc->func == VDA_FLASH_BEGINW) {
    186		if (sgc->cur_offset)
    187			cksum = esas2r_calc_byte_xor_cksum(sgc->cur_offset,
    188							   sgc->length,
    189							   0);
    190		rq->interrupt_cb = esas2r_fmapi_callback;
    191	} else {
    192		rq->interrupt_cb = fc->interrupt_cb;
    193	}
    194	esas2r_build_flash_req(a,
    195			       rq,
    196			       fc->func,
    197			       cksum,
    198			       fc->flsh_addr,
    199			       sgc->length);
    200
    201	esas2r_rq_free_sg_lists(rq, a);
    202
    203	/*
    204	 * remember the length we asked for.  we have to keep track of
    205	 * the current amount done so we know how much to compare when
    206	 * doing the verification phase.
    207	 */
    208	fc->curr_len = fc->sgc.length;
    209
    210	if (sgc->cur_offset) {
    211		/* setup the S/G context to build the S/G table  */
    212		esas2r_sgc_init(sgc, a, rq, &rq->vrq->flash.data.sge[0]);
    213
    214		if (!esas2r_build_sg_list(a, rq, sgc)) {
    215			rq->req_stat = RS_BUSY;
    216			return;
    217		}
    218	} else {
    219		fc->sgc.length = 0;
    220	}
    221
    222	/* update the flsh_addr to the next one to write to  */
    223	fc->flsh_addr += fc->curr_len;
    224}
    225
    226/* determine the method to process the flash request */
    227static bool load_image(struct esas2r_adapter *a, struct esas2r_request *rq)
    228{
    229	/*
    230	 * assume we have more to do.  if we return with the status set to
    231	 * RS_PENDING, FM API tasks will continue.
    232	 */
    233	rq->req_stat = RS_PENDING;
    234	if (test_bit(AF_DEGRADED_MODE, &a->flags))
    235		/* not supported for now */;
    236	else
    237		build_flash_msg(a, rq);
    238
    239	return rq->req_stat == RS_PENDING;
    240}
    241
    242/*  boot image fixer uppers called before downloading the image. */
    243static void fix_bios(struct esas2r_adapter *a, struct esas2r_flash_img *fi)
    244{
    245	struct esas2r_component_header *ch = &fi->cmp_hdr[CH_IT_BIOS];
    246	struct esas2r_pc_image *pi;
    247	struct esas2r_boot_header *bh;
    248
    249	pi = (struct esas2r_pc_image *)((u8 *)fi + ch->image_offset);
    250	bh =
    251		(struct esas2r_boot_header *)((u8 *)pi +
    252					      le16_to_cpu(pi->header_offset));
    253	bh->device_id = cpu_to_le16(a->pcid->device);
    254
    255	/* Recalculate the checksum in the PNP header if there  */
    256	if (pi->pnp_offset) {
    257		u8 *pnp_header_bytes =
    258			((u8 *)pi + le16_to_cpu(pi->pnp_offset));
    259
    260		/* Identifier - dword that starts at byte 10 */
    261		*((u32 *)&pnp_header_bytes[10]) =
    262			cpu_to_le32(MAKEDWORD(a->pcid->subsystem_vendor,
    263					      a->pcid->subsystem_device));
    264
    265		/* Checksum - byte 9 */
    266		pnp_header_bytes[9] -= esas2r_calc_byte_cksum(pnp_header_bytes,
    267							      32, 0);
    268	}
    269
    270	/* Recalculate the checksum needed by the PC */
    271	pi->checksum = pi->checksum -
    272		       esas2r_calc_byte_cksum((u8 *)pi, ch->length, 0);
    273}
    274
    275static void fix_efi(struct esas2r_adapter *a, struct esas2r_flash_img *fi)
    276{
    277	struct esas2r_component_header *ch = &fi->cmp_hdr[CH_IT_EFI];
    278	u32 len = ch->length;
    279	u32 offset = ch->image_offset;
    280	struct esas2r_efi_image *ei;
    281	struct esas2r_boot_header *bh;
    282
    283	while (len) {
    284		u32 thislen;
    285
    286		ei = (struct esas2r_efi_image *)((u8 *)fi + offset);
    287		bh = (struct esas2r_boot_header *)((u8 *)ei +
    288						   le16_to_cpu(
    289							   ei->header_offset));
    290		bh->device_id = cpu_to_le16(a->pcid->device);
    291		thislen = (u32)le16_to_cpu(bh->image_length) * 512;
    292
    293		if (thislen > len)
    294			break;
    295
    296		len -= thislen;
    297		offset += thislen;
    298	}
    299}
    300
    301/* Complete a FM API request with the specified status. */
    302static bool complete_fmapi_req(struct esas2r_adapter *a,
    303			       struct esas2r_request *rq, u8 fi_stat)
    304{
    305	struct esas2r_flash_context *fc =
    306		(struct esas2r_flash_context *)rq->interrupt_cx;
    307	struct esas2r_flash_img *fi = fc->fi;
    308
    309	fi->status = fi_stat;
    310	fi->driver_error = rq->req_stat;
    311	rq->interrupt_cb = NULL;
    312	rq->req_stat = RS_SUCCESS;
    313
    314	if (fi_stat != FI_STAT_IMG_VER)
    315		memset(fc->scratch, 0, FM_BUF_SZ);
    316
    317	esas2r_enable_heartbeat(a);
    318	clear_bit(AF_FLASH_LOCK, &a->flags);
    319	return false;
    320}
    321
    322/* Process each phase of the flash download process. */
    323static void fw_download_proc(struct esas2r_adapter *a,
    324			     struct esas2r_request *rq)
    325{
    326	struct esas2r_flash_context *fc =
    327		(struct esas2r_flash_context *)rq->interrupt_cx;
    328	struct esas2r_flash_img *fi = fc->fi;
    329	struct esas2r_component_header *ch;
    330	u32 len;
    331	u8 *p, *q;
    332
    333	/* If the previous operation failed, just return. */
    334	if (rq->req_stat != RS_SUCCESS)
    335		goto error;
    336
    337	/*
    338	 * If an upload just completed and the compare length is non-zero,
    339	 * then we just read back part of the image we just wrote.  verify the
    340	 * section and continue reading until the entire image is verified.
    341	 */
    342	if (fc->func == VDA_FLASH_READ
    343	    && fc->cmp_len) {
    344		ch = &fi->cmp_hdr[fc->comp_typ];
    345
    346		p = fc->scratch;
    347		q = (u8 *)fi                    /* start of the whole gob     */
    348		    + ch->image_offset          /* start of the current image */
    349		    + ch->length                /* end of the current image   */
    350		    - fc->cmp_len;              /* where we are now           */
    351
    352		/*
    353		 * NOTE - curr_len is the exact count of bytes for the read
    354		 *        even when the end is read and its not a full buffer
    355		 */
    356		for (len = fc->curr_len; len; len--)
    357			if (*p++ != *q++)
    358				goto error;
    359
    360		fc->cmp_len -= fc->curr_len; /* # left to compare    */
    361
    362		/* Update fc and determine the length for the next upload */
    363		if (fc->cmp_len > FM_BUF_SZ)
    364			fc->sgc.length = FM_BUF_SZ;
    365		else
    366			fc->sgc.length = fc->cmp_len;
    367
    368		fc->sgc.cur_offset = fc->sgc_offset +
    369				     ((u8 *)fc->scratch - (u8 *)fi);
    370	}
    371
    372	/*
    373	 * This code uses a 'while' statement since the next component may
    374	 * have a length = zero.  This can happen since some components are
    375	 * not required.  At the end of this 'while' we set up the length
    376	 * for the next request and therefore sgc.length can be = 0.
    377	 */
    378	while (fc->sgc.length == 0) {
    379		ch = &fi->cmp_hdr[fc->comp_typ];
    380
    381		switch (fc->task) {
    382		case FMTSK_ERASE_BOOT:
    383			/* the BIOS image is written next */
    384			ch = &fi->cmp_hdr[CH_IT_BIOS];
    385			if (ch->length == 0)
    386				goto no_bios;
    387
    388			fc->task = FMTSK_WRTBIOS;
    389			fc->func = VDA_FLASH_BEGINW;
    390			fc->comp_typ = CH_IT_BIOS;
    391			fc->flsh_addr = FLS_OFFSET_BOOT;
    392			fc->sgc.length = ch->length;
    393			fc->sgc.cur_offset = fc->sgc_offset +
    394					     ch->image_offset;
    395			break;
    396
    397		case FMTSK_WRTBIOS:
    398			/*
    399			 * The BIOS image has been written - read it and
    400			 * verify it
    401			 */
    402			fc->task = FMTSK_READBIOS;
    403			fc->func = VDA_FLASH_READ;
    404			fc->flsh_addr = FLS_OFFSET_BOOT;
    405			fc->cmp_len = ch->length;
    406			fc->sgc.length = FM_BUF_SZ;
    407			fc->sgc.cur_offset = fc->sgc_offset
    408					     + ((u8 *)fc->scratch -
    409						(u8 *)fi);
    410			break;
    411
    412		case FMTSK_READBIOS:
    413no_bios:
    414			/*
    415			 * Mark the component header status for the image
    416			 * completed
    417			 */
    418			ch->status = CH_STAT_SUCCESS;
    419
    420			/* The MAC image is written next */
    421			ch = &fi->cmp_hdr[CH_IT_MAC];
    422			if (ch->length == 0)
    423				goto no_mac;
    424
    425			fc->task = FMTSK_WRTMAC;
    426			fc->func = VDA_FLASH_BEGINW;
    427			fc->comp_typ = CH_IT_MAC;
    428			fc->flsh_addr = FLS_OFFSET_BOOT
    429					+ fi->cmp_hdr[CH_IT_BIOS].length;
    430			fc->sgc.length = ch->length;
    431			fc->sgc.cur_offset = fc->sgc_offset +
    432					     ch->image_offset;
    433			break;
    434
    435		case FMTSK_WRTMAC:
    436			/* The MAC image has been written - read and verify */
    437			fc->task = FMTSK_READMAC;
    438			fc->func = VDA_FLASH_READ;
    439			fc->flsh_addr -= ch->length;
    440			fc->cmp_len = ch->length;
    441			fc->sgc.length = FM_BUF_SZ;
    442			fc->sgc.cur_offset = fc->sgc_offset
    443					     + ((u8 *)fc->scratch -
    444						(u8 *)fi);
    445			break;
    446
    447		case FMTSK_READMAC:
    448no_mac:
    449			/*
    450			 * Mark the component header status for the image
    451			 * completed
    452			 */
    453			ch->status = CH_STAT_SUCCESS;
    454
    455			/* The EFI image is written next */
    456			ch = &fi->cmp_hdr[CH_IT_EFI];
    457			if (ch->length == 0)
    458				goto no_efi;
    459
    460			fc->task = FMTSK_WRTEFI;
    461			fc->func = VDA_FLASH_BEGINW;
    462			fc->comp_typ = CH_IT_EFI;
    463			fc->flsh_addr = FLS_OFFSET_BOOT
    464					+ fi->cmp_hdr[CH_IT_BIOS].length
    465					+ fi->cmp_hdr[CH_IT_MAC].length;
    466			fc->sgc.length = ch->length;
    467			fc->sgc.cur_offset = fc->sgc_offset +
    468					     ch->image_offset;
    469			break;
    470
    471		case FMTSK_WRTEFI:
    472			/* The EFI image has been written - read and verify */
    473			fc->task = FMTSK_READEFI;
    474			fc->func = VDA_FLASH_READ;
    475			fc->flsh_addr -= ch->length;
    476			fc->cmp_len = ch->length;
    477			fc->sgc.length = FM_BUF_SZ;
    478			fc->sgc.cur_offset = fc->sgc_offset
    479					     + ((u8 *)fc->scratch -
    480						(u8 *)fi);
    481			break;
    482
    483		case FMTSK_READEFI:
    484no_efi:
    485			/*
    486			 * Mark the component header status for the image
    487			 * completed
    488			 */
    489			ch->status = CH_STAT_SUCCESS;
    490
    491			/* The CFG image is written next */
    492			ch = &fi->cmp_hdr[CH_IT_CFG];
    493
    494			if (ch->length == 0)
    495				goto no_cfg;
    496			fc->task = FMTSK_WRTCFG;
    497			fc->func = VDA_FLASH_BEGINW;
    498			fc->comp_typ = CH_IT_CFG;
    499			fc->flsh_addr = FLS_OFFSET_CPYR - ch->length;
    500			fc->sgc.length = ch->length;
    501			fc->sgc.cur_offset = fc->sgc_offset +
    502					     ch->image_offset;
    503			break;
    504
    505		case FMTSK_WRTCFG:
    506			/* The CFG image has been written - read and verify */
    507			fc->task = FMTSK_READCFG;
    508			fc->func = VDA_FLASH_READ;
    509			fc->flsh_addr = FLS_OFFSET_CPYR - ch->length;
    510			fc->cmp_len = ch->length;
    511			fc->sgc.length = FM_BUF_SZ;
    512			fc->sgc.cur_offset = fc->sgc_offset
    513					     + ((u8 *)fc->scratch -
    514						(u8 *)fi);
    515			break;
    516
    517		case FMTSK_READCFG:
    518no_cfg:
    519			/*
    520			 * Mark the component header status for the image
    521			 * completed
    522			 */
    523			ch->status = CH_STAT_SUCCESS;
    524
    525			/*
    526			 * The download is complete.  If in degraded mode,
    527			 * attempt a chip reset.
    528			 */
    529			if (test_bit(AF_DEGRADED_MODE, &a->flags))
    530				esas2r_local_reset_adapter(a);
    531
    532			a->flash_ver = fi->cmp_hdr[CH_IT_BIOS].version;
    533			esas2r_print_flash_rev(a);
    534
    535			/* Update the type of boot image on the card */
    536			memcpy(a->image_type, fi->rel_version,
    537			       sizeof(fi->rel_version));
    538			complete_fmapi_req(a, rq, FI_STAT_SUCCESS);
    539			return;
    540		}
    541
    542		/* If verifying, don't try reading more than what's there */
    543		if (fc->func == VDA_FLASH_READ
    544		    && fc->sgc.length > fc->cmp_len)
    545			fc->sgc.length = fc->cmp_len;
    546	}
    547
    548	/* Build the request to perform the next action */
    549	if (!load_image(a, rq)) {
    550error:
    551		if (fc->comp_typ < fi->num_comps) {
    552			ch = &fi->cmp_hdr[fc->comp_typ];
    553			ch->status = CH_STAT_FAILED;
    554		}
    555
    556		complete_fmapi_req(a, rq, FI_STAT_FAILED);
    557	}
    558}
    559
    560/* Determine the flash image adaptyp for this adapter */
    561static u8 get_fi_adap_type(struct esas2r_adapter *a)
    562{
    563	u8 type;
    564
    565	/* use the device ID to get the correct adap_typ for this HBA */
    566	switch (a->pcid->device) {
    567	case ATTO_DID_INTEL_IOP348:
    568		type = FI_AT_SUN_LAKE;
    569		break;
    570
    571	case ATTO_DID_MV_88RC9580:
    572	case ATTO_DID_MV_88RC9580TS:
    573	case ATTO_DID_MV_88RC9580TSE:
    574	case ATTO_DID_MV_88RC9580TL:
    575		type = FI_AT_MV_9580;
    576		break;
    577
    578	default:
    579		type = FI_AT_UNKNWN;
    580		break;
    581	}
    582
    583	return type;
    584}
    585
    586/* Size of config + copyright + flash_ver images, 0 for failure. */
    587static u32 chk_cfg(u8 *cfg, u32 length, u32 *flash_ver)
    588{
    589	u16 *pw = (u16 *)cfg - 1;
    590	u32 sz = 0;
    591	u32 len = length;
    592
    593	if (len == 0)
    594		len = FM_BUF_SZ;
    595
    596	if (flash_ver)
    597		*flash_ver = 0;
    598
    599	while (true) {
    600		u16 type;
    601		u16 size;
    602
    603		type = le16_to_cpu(*pw--);
    604		size = le16_to_cpu(*pw--);
    605
    606		if (type != FBT_CPYR
    607		    && type != FBT_SETUP
    608		    && type != FBT_FLASH_VER)
    609			break;
    610
    611		if (type == FBT_FLASH_VER
    612		    && flash_ver)
    613			*flash_ver = le32_to_cpu(*(u32 *)(pw - 1));
    614
    615		sz += size + (2 * sizeof(u16));
    616		pw -= size / sizeof(u16);
    617
    618		if (sz > len - (2 * sizeof(u16)))
    619			break;
    620	}
    621
    622	/* See if we are comparing the size to the specified length */
    623	if (length && sz != length)
    624		return 0;
    625
    626	return sz;
    627}
    628
    629/* Verify that the boot image is valid */
    630static u8 chk_boot(u8 *boot_img, u32 length)
    631{
    632	struct esas2r_boot_image *bi = (struct esas2r_boot_image *)boot_img;
    633	u16 hdroffset = le16_to_cpu(bi->header_offset);
    634	struct esas2r_boot_header *bh;
    635
    636	if (bi->signature != le16_to_cpu(0xaa55)
    637	    || (long)hdroffset >
    638	    (long)(65536L - sizeof(struct esas2r_boot_header))
    639	    || (hdroffset & 3)
    640	    || (hdroffset < sizeof(struct esas2r_boot_image))
    641	    || ((u32)hdroffset + sizeof(struct esas2r_boot_header) > length))
    642		return 0xff;
    643
    644	bh = (struct esas2r_boot_header *)((char *)bi + hdroffset);
    645
    646	if (bh->signature[0] != 'P'
    647	    || bh->signature[1] != 'C'
    648	    || bh->signature[2] != 'I'
    649	    || bh->signature[3] != 'R'
    650	    || le16_to_cpu(bh->struct_length) <
    651	    (u16)sizeof(struct esas2r_boot_header)
    652	    || bh->class_code[2] != 0x01
    653	    || bh->class_code[1] != 0x04
    654	    || bh->class_code[0] != 0x00
    655	    || (bh->code_type != CODE_TYPE_PC
    656		&& bh->code_type != CODE_TYPE_OPEN
    657		&& bh->code_type != CODE_TYPE_EFI))
    658		return 0xff;
    659
    660	return bh->code_type;
    661}
    662
    663/* The sum of all the WORDS of the image */
    664static u16 calc_fi_checksum(struct esas2r_flash_context *fc)
    665{
    666	struct esas2r_flash_img *fi = fc->fi;
    667	u16 cksum;
    668	u32 len;
    669	u16 *pw;
    670
    671	for (len = (fi->length - fc->fi_hdr_len) / 2,
    672	     pw = (u16 *)((u8 *)fi + fc->fi_hdr_len),
    673	     cksum = 0;
    674	     len;
    675	     len--, pw++)
    676		cksum = cksum + le16_to_cpu(*pw);
    677
    678	return cksum;
    679}
    680
    681/*
    682 * Verify the flash image structure.  The following verifications will
    683 * be performed:
    684 *              1)  verify the fi_version is correct
    685 *              2)  verify the checksum of the entire image.
    686 *              3)  validate the adap_typ, action and length fields.
    687 *              4)  validate each component header. check the img_type and
    688 *                  length fields
    689 *              5)  validate each component image.  validate signatures and
    690 *                  local checksums
    691 */
    692static bool verify_fi(struct esas2r_adapter *a,
    693		      struct esas2r_flash_context *fc)
    694{
    695	struct esas2r_flash_img *fi = fc->fi;
    696	u8 type;
    697	bool imgerr;
    698	u16 i;
    699	u32 len;
    700	struct esas2r_component_header *ch;
    701
    702	/* Verify the length - length must even since we do a word checksum */
    703	len = fi->length;
    704
    705	if ((len & 1)
    706	    || len < fc->fi_hdr_len) {
    707		fi->status = FI_STAT_LENGTH;
    708		return false;
    709	}
    710
    711	/* Get adapter type and verify type in flash image */
    712	type = get_fi_adap_type(a);
    713	if ((type == FI_AT_UNKNWN) || (fi->adap_typ != type)) {
    714		fi->status = FI_STAT_ADAPTYP;
    715		return false;
    716	}
    717
    718	/*
    719	 * Loop through each component and verify the img_type and length
    720	 * fields.  Keep a running count of the sizes sooze we can verify total
    721	 * size to additive size.
    722	 */
    723	imgerr = false;
    724
    725	for (i = 0, len = 0, ch = fi->cmp_hdr;
    726	     i < fi->num_comps;
    727	     i++, ch++) {
    728		bool cmperr = false;
    729
    730		/*
    731		 * Verify that the component header has the same index as the
    732		 * image type.  The headers must be ordered correctly
    733		 */
    734		if (i != ch->img_type) {
    735			imgerr = true;
    736			ch->status = CH_STAT_INVALID;
    737			continue;
    738		}
    739
    740		switch (ch->img_type) {
    741		case CH_IT_BIOS:
    742			type = CODE_TYPE_PC;
    743			break;
    744
    745		case CH_IT_MAC:
    746			type = CODE_TYPE_OPEN;
    747			break;
    748
    749		case CH_IT_EFI:
    750			type = CODE_TYPE_EFI;
    751			break;
    752		}
    753
    754		switch (ch->img_type) {
    755		case CH_IT_FW:
    756		case CH_IT_NVR:
    757			break;
    758
    759		case CH_IT_BIOS:
    760		case CH_IT_MAC:
    761		case CH_IT_EFI:
    762			if (ch->length & 0x1ff)
    763				cmperr = true;
    764
    765			/* Test if component image is present  */
    766			if (ch->length == 0)
    767				break;
    768
    769			/* Image is present - verify the image */
    770			if (chk_boot((u8 *)fi + ch->image_offset, ch->length)
    771			    != type)
    772				cmperr = true;
    773
    774			break;
    775
    776		case CH_IT_CFG:
    777
    778			/* Test if component image is present */
    779			if (ch->length == 0) {
    780				cmperr = true;
    781				break;
    782			}
    783
    784			/* Image is present - verify the image */
    785			if (!chk_cfg((u8 *)fi + ch->image_offset + ch->length,
    786				     ch->length, NULL))
    787				cmperr = true;
    788
    789			break;
    790
    791		default:
    792
    793			fi->status = FI_STAT_UNKNOWN;
    794			return false;
    795		}
    796
    797		if (cmperr) {
    798			imgerr = true;
    799			ch->status = CH_STAT_INVALID;
    800		} else {
    801			ch->status = CH_STAT_PENDING;
    802			len += ch->length;
    803		}
    804	}
    805
    806	if (imgerr) {
    807		fi->status = FI_STAT_MISSING;
    808		return false;
    809	}
    810
    811	/* Compare fi->length to the sum of ch->length fields */
    812	if (len != fi->length - fc->fi_hdr_len) {
    813		fi->status = FI_STAT_LENGTH;
    814		return false;
    815	}
    816
    817	/* Compute the checksum - it should come out zero */
    818	if (fi->checksum != calc_fi_checksum(fc)) {
    819		fi->status = FI_STAT_CHKSUM;
    820		return false;
    821	}
    822
    823	return true;
    824}
    825
    826/* Fill in the FS IOCTL response data from a completed request. */
    827static void esas2r_complete_fs_ioctl(struct esas2r_adapter *a,
    828				     struct esas2r_request *rq)
    829{
    830	struct esas2r_ioctl_fs *fs =
    831		(struct esas2r_ioctl_fs *)rq->interrupt_cx;
    832
    833	if (rq->vrq->flash.sub_func == VDA_FLASH_COMMIT)
    834		esas2r_enable_heartbeat(a);
    835
    836	fs->driver_error = rq->req_stat;
    837
    838	if (fs->driver_error == RS_SUCCESS)
    839		fs->status = ATTO_STS_SUCCESS;
    840	else
    841		fs->status = ATTO_STS_FAILED;
    842}
    843
    844/* Prepare an FS IOCTL request to be sent to the firmware. */
    845bool esas2r_process_fs_ioctl(struct esas2r_adapter *a,
    846			     struct esas2r_ioctl_fs *fs,
    847			     struct esas2r_request *rq,
    848			     struct esas2r_sg_context *sgc)
    849{
    850	u8 cmdcnt = (u8)ARRAY_SIZE(cmd_to_fls_func);
    851	struct esas2r_ioctlfs_command *fsc = &fs->command;
    852	u8 func = 0;
    853	u32 datalen;
    854
    855	fs->status = ATTO_STS_FAILED;
    856	fs->driver_error = RS_PENDING;
    857
    858	if (fs->version > ESAS2R_FS_VER) {
    859		fs->status = ATTO_STS_INV_VERSION;
    860		return false;
    861	}
    862
    863	if (fsc->command >= cmdcnt) {
    864		fs->status = ATTO_STS_INV_FUNC;
    865		return false;
    866	}
    867
    868	func = cmd_to_fls_func[fsc->command];
    869	if (func == 0xFF) {
    870		fs->status = ATTO_STS_INV_FUNC;
    871		return false;
    872	}
    873
    874	if (fsc->command != ESAS2R_FS_CMD_CANCEL) {
    875		if ((a->pcid->device != ATTO_DID_MV_88RC9580
    876		     || fs->adap_type != ESAS2R_FS_AT_ESASRAID2)
    877		    && (a->pcid->device != ATTO_DID_MV_88RC9580TS
    878			|| fs->adap_type != ESAS2R_FS_AT_TSSASRAID2)
    879		    && (a->pcid->device != ATTO_DID_MV_88RC9580TSE
    880			|| fs->adap_type != ESAS2R_FS_AT_TSSASRAID2E)
    881		    && (a->pcid->device != ATTO_DID_MV_88RC9580TL
    882			|| fs->adap_type != ESAS2R_FS_AT_TLSASHBA)) {
    883			fs->status = ATTO_STS_INV_ADAPTER;
    884			return false;
    885		}
    886
    887		if (fs->driver_ver > ESAS2R_FS_DRVR_VER) {
    888			fs->status = ATTO_STS_INV_DRVR_VER;
    889			return false;
    890		}
    891	}
    892
    893	if (test_bit(AF_DEGRADED_MODE, &a->flags)) {
    894		fs->status = ATTO_STS_DEGRADED;
    895		return false;
    896	}
    897
    898	rq->interrupt_cb = esas2r_complete_fs_ioctl;
    899	rq->interrupt_cx = fs;
    900	datalen = le32_to_cpu(fsc->length);
    901	esas2r_build_flash_req(a,
    902			       rq,
    903			       func,
    904			       fsc->checksum,
    905			       le32_to_cpu(fsc->flash_addr),
    906			       datalen);
    907
    908	if (func == VDA_FLASH_WRITE
    909	    || func == VDA_FLASH_READ) {
    910		if (datalen == 0) {
    911			fs->status = ATTO_STS_INV_FUNC;
    912			return false;
    913		}
    914
    915		esas2r_sgc_init(sgc, a, rq, rq->vrq->flash.data.sge);
    916		sgc->length = datalen;
    917
    918		if (!esas2r_build_sg_list(a, rq, sgc)) {
    919			fs->status = ATTO_STS_OUT_OF_RSRC;
    920			return false;
    921		}
    922	}
    923
    924	if (func == VDA_FLASH_COMMIT)
    925		esas2r_disable_heartbeat(a);
    926
    927	esas2r_start_request(a, rq);
    928
    929	return true;
    930}
    931
    932static bool esas2r_flash_access(struct esas2r_adapter *a, u32 function)
    933{
    934	u32 starttime;
    935	u32 timeout;
    936	u32 intstat;
    937	u32 doorbell;
    938
    939	/* Disable chip interrupts awhile */
    940	if (function == DRBL_FLASH_REQ)
    941		esas2r_disable_chip_interrupts(a);
    942
    943	/* Issue the request to the firmware */
    944	esas2r_write_register_dword(a, MU_DOORBELL_IN, function);
    945
    946	/* Now wait for the firmware to process it */
    947	starttime = jiffies_to_msecs(jiffies);
    948
    949	if (test_bit(AF_CHPRST_PENDING, &a->flags) ||
    950	    test_bit(AF_DISC_PENDING, &a->flags))
    951		timeout = 40000;
    952	else
    953		timeout = 5000;
    954
    955	while (true) {
    956		intstat = esas2r_read_register_dword(a, MU_INT_STATUS_OUT);
    957
    958		if (intstat & MU_INTSTAT_DRBL) {
    959			/* Got a doorbell interrupt.  Check for the function */
    960			doorbell =
    961				esas2r_read_register_dword(a, MU_DOORBELL_OUT);
    962			esas2r_write_register_dword(a, MU_DOORBELL_OUT,
    963						    doorbell);
    964			if (doorbell & function)
    965				break;
    966		}
    967
    968		schedule_timeout_interruptible(msecs_to_jiffies(100));
    969
    970		if ((jiffies_to_msecs(jiffies) - starttime) > timeout) {
    971			/*
    972			 * Iimeout.  If we were requesting flash access,
    973			 * indicate we are done so the firmware knows we gave
    974			 * up.  If this was a REQ, we also need to re-enable
    975			 * chip interrupts.
    976			 */
    977			if (function == DRBL_FLASH_REQ) {
    978				esas2r_hdebug("flash access timeout");
    979				esas2r_write_register_dword(a, MU_DOORBELL_IN,
    980							    DRBL_FLASH_DONE);
    981				esas2r_enable_chip_interrupts(a);
    982			} else {
    983				esas2r_hdebug("flash release timeout");
    984			}
    985
    986			return false;
    987		}
    988	}
    989
    990	/* if we're done, re-enable chip interrupts */
    991	if (function == DRBL_FLASH_DONE)
    992		esas2r_enable_chip_interrupts(a);
    993
    994	return true;
    995}
    996
    997#define WINDOW_SIZE ((signed int)MW_DATA_WINDOW_SIZE)
    998
    999bool esas2r_read_flash_block(struct esas2r_adapter *a,
   1000			     void *to,
   1001			     u32 from,
   1002			     u32 size)
   1003{
   1004	u8 *end = (u8 *)to;
   1005
   1006	/* Try to acquire access to the flash */
   1007	if (!esas2r_flash_access(a, DRBL_FLASH_REQ))
   1008		return false;
   1009
   1010	while (size) {
   1011		u32 len;
   1012		u32 offset;
   1013		u32 iatvr;
   1014
   1015		if (test_bit(AF2_SERIAL_FLASH, &a->flags2))
   1016			iatvr = MW_DATA_ADDR_SER_FLASH + (from & -WINDOW_SIZE);
   1017		else
   1018			iatvr = MW_DATA_ADDR_PAR_FLASH + (from & -WINDOW_SIZE);
   1019
   1020		esas2r_map_data_window(a, iatvr);
   1021		offset = from & (WINDOW_SIZE - 1);
   1022		len = size;
   1023
   1024		if (len > WINDOW_SIZE - offset)
   1025			len = WINDOW_SIZE - offset;
   1026
   1027		from += len;
   1028		size -= len;
   1029
   1030		while (len--) {
   1031			*end++ = esas2r_read_data_byte(a, offset);
   1032			offset++;
   1033		}
   1034	}
   1035
   1036	/* Release flash access */
   1037	esas2r_flash_access(a, DRBL_FLASH_DONE);
   1038	return true;
   1039}
   1040
   1041bool esas2r_read_flash_rev(struct esas2r_adapter *a)
   1042{
   1043	u8 bytes[256];
   1044	u16 *pw;
   1045	u16 *pwstart;
   1046	u16 type;
   1047	u16 size;
   1048	u32 sz;
   1049
   1050	sz = sizeof(bytes);
   1051	pw = (u16 *)(bytes + sz);
   1052	pwstart = (u16 *)bytes + 2;
   1053
   1054	if (!esas2r_read_flash_block(a, bytes, FLS_OFFSET_CPYR - sz, sz))
   1055		goto invalid_rev;
   1056
   1057	while (pw >= pwstart) {
   1058		pw--;
   1059		type = le16_to_cpu(*pw);
   1060		pw--;
   1061		size = le16_to_cpu(*pw);
   1062		pw -= size / 2;
   1063
   1064		if (type == FBT_CPYR
   1065		    || type == FBT_SETUP
   1066		    || pw < pwstart)
   1067			continue;
   1068
   1069		if (type == FBT_FLASH_VER)
   1070			a->flash_ver = le32_to_cpu(*(u32 *)pw);
   1071
   1072		break;
   1073	}
   1074
   1075invalid_rev:
   1076	return esas2r_print_flash_rev(a);
   1077}
   1078
   1079bool esas2r_print_flash_rev(struct esas2r_adapter *a)
   1080{
   1081	u16 year = LOWORD(a->flash_ver);
   1082	u8 day = LOBYTE(HIWORD(a->flash_ver));
   1083	u8 month = HIBYTE(HIWORD(a->flash_ver));
   1084
   1085	if (day == 0
   1086	    || month == 0
   1087	    || day > 31
   1088	    || month > 12
   1089	    || year < 2006
   1090	    || year > 9999) {
   1091		strcpy(a->flash_rev, "not found");
   1092		a->flash_ver = 0;
   1093		return false;
   1094	}
   1095
   1096	sprintf(a->flash_rev, "%02d/%02d/%04d", month, day, year);
   1097	esas2r_hdebug("flash version: %s", a->flash_rev);
   1098	return true;
   1099}
   1100
   1101/*
   1102 * Find the type of boot image type that is currently in the flash.
   1103 * The chip only has a 64 KB PCI-e expansion ROM
   1104 * size so only one image can be flashed at a time.
   1105 */
   1106bool esas2r_read_image_type(struct esas2r_adapter *a)
   1107{
   1108	u8 bytes[256];
   1109	struct esas2r_boot_image *bi;
   1110	struct esas2r_boot_header *bh;
   1111	u32 sz;
   1112	u32 len;
   1113	u32 offset;
   1114
   1115	/* Start at the base of the boot images and look for a valid image */
   1116	sz = sizeof(bytes);
   1117	len = FLS_LENGTH_BOOT;
   1118	offset = 0;
   1119
   1120	while (true) {
   1121		if (!esas2r_read_flash_block(a, bytes, FLS_OFFSET_BOOT +
   1122					     offset,
   1123					     sz))
   1124			goto invalid_rev;
   1125
   1126		bi = (struct esas2r_boot_image *)bytes;
   1127		bh = (struct esas2r_boot_header *)((u8 *)bi +
   1128						   le16_to_cpu(
   1129							   bi->header_offset));
   1130		if (bi->signature != cpu_to_le16(0xAA55))
   1131			goto invalid_rev;
   1132
   1133		if (bh->code_type == CODE_TYPE_PC) {
   1134			strcpy(a->image_type, "BIOS");
   1135
   1136			return true;
   1137		} else if (bh->code_type == CODE_TYPE_EFI) {
   1138			struct esas2r_efi_image *ei;
   1139
   1140			/*
   1141			 * So we have an EFI image.  There are several types
   1142			 * so see which architecture we have.
   1143			 */
   1144			ei = (struct esas2r_efi_image *)bytes;
   1145
   1146			switch (le16_to_cpu(ei->machine_type)) {
   1147			case EFI_MACHINE_IA32:
   1148				strcpy(a->image_type, "EFI 32-bit");
   1149				return true;
   1150
   1151			case EFI_MACHINE_IA64:
   1152				strcpy(a->image_type, "EFI itanium");
   1153				return true;
   1154
   1155			case EFI_MACHINE_X64:
   1156				strcpy(a->image_type, "EFI 64-bit");
   1157				return true;
   1158
   1159			case EFI_MACHINE_EBC:
   1160				strcpy(a->image_type, "EFI EBC");
   1161				return true;
   1162
   1163			default:
   1164				goto invalid_rev;
   1165			}
   1166		} else {
   1167			u32 thislen;
   1168
   1169			/* jump to the next image */
   1170			thislen = (u32)le16_to_cpu(bh->image_length) * 512;
   1171			if (thislen == 0
   1172			    || thislen + offset > len
   1173			    || bh->indicator == INDICATOR_LAST)
   1174				break;
   1175
   1176			offset += thislen;
   1177		}
   1178	}
   1179
   1180invalid_rev:
   1181	strcpy(a->image_type, "no boot images");
   1182	return false;
   1183}
   1184
   1185/*
   1186 *  Read and validate current NVRAM parameters by accessing
   1187 *  physical NVRAM directly.  if currently stored parameters are
   1188 *  invalid, use the defaults.
   1189 */
   1190bool esas2r_nvram_read_direct(struct esas2r_adapter *a)
   1191{
   1192	bool result;
   1193
   1194	if (down_interruptible(&a->nvram_semaphore))
   1195		return false;
   1196
   1197	if (!esas2r_read_flash_block(a, a->nvram, FLS_OFFSET_NVR,
   1198				     sizeof(struct esas2r_sas_nvram))) {
   1199		esas2r_hdebug("NVRAM read failed, using defaults");
   1200		up(&a->nvram_semaphore);
   1201		return false;
   1202	}
   1203
   1204	result = esas2r_nvram_validate(a);
   1205
   1206	up(&a->nvram_semaphore);
   1207
   1208	return result;
   1209}
   1210
   1211/* Interrupt callback to process NVRAM completions. */
   1212static void esas2r_nvram_callback(struct esas2r_adapter *a,
   1213				  struct esas2r_request *rq)
   1214{
   1215	struct atto_vda_flash_req *vrq = &rq->vrq->flash;
   1216
   1217	if (rq->req_stat == RS_SUCCESS) {
   1218		/* last request was successful.  see what to do now. */
   1219
   1220		switch (vrq->sub_func) {
   1221		case VDA_FLASH_BEGINW:
   1222			vrq->sub_func = VDA_FLASH_WRITE;
   1223			rq->req_stat = RS_PENDING;
   1224			break;
   1225
   1226		case VDA_FLASH_WRITE:
   1227			vrq->sub_func = VDA_FLASH_COMMIT;
   1228			rq->req_stat = RS_PENDING;
   1229			break;
   1230
   1231		case VDA_FLASH_READ:
   1232			esas2r_nvram_validate(a);
   1233			break;
   1234
   1235		case VDA_FLASH_COMMIT:
   1236		default:
   1237			break;
   1238		}
   1239	}
   1240
   1241	if (rq->req_stat != RS_PENDING) {
   1242		/* update the NVRAM state */
   1243		if (rq->req_stat == RS_SUCCESS)
   1244			set_bit(AF_NVR_VALID, &a->flags);
   1245		else
   1246			clear_bit(AF_NVR_VALID, &a->flags);
   1247
   1248		esas2r_enable_heartbeat(a);
   1249
   1250		up(&a->nvram_semaphore);
   1251	}
   1252}
   1253
   1254/*
   1255 * Write the contents of nvram to the adapter's physical NVRAM.
   1256 * The cached copy of the NVRAM is also updated.
   1257 */
   1258bool esas2r_nvram_write(struct esas2r_adapter *a, struct esas2r_request *rq,
   1259			struct esas2r_sas_nvram *nvram)
   1260{
   1261	struct esas2r_sas_nvram *n = nvram;
   1262	u8 sas_address_bytes[8];
   1263	u32 *sas_address_dwords = (u32 *)&sas_address_bytes[0];
   1264	struct atto_vda_flash_req *vrq = &rq->vrq->flash;
   1265
   1266	if (test_bit(AF_DEGRADED_MODE, &a->flags))
   1267		return false;
   1268
   1269	if (down_interruptible(&a->nvram_semaphore))
   1270		return false;
   1271
   1272	if (n == NULL)
   1273		n = a->nvram;
   1274
   1275	/* check the validity of the settings */
   1276	if (n->version > SASNVR_VERSION) {
   1277		up(&a->nvram_semaphore);
   1278		return false;
   1279	}
   1280
   1281	memcpy(&sas_address_bytes[0], n->sas_addr, 8);
   1282
   1283	if (sas_address_bytes[0] != 0x50
   1284	    || sas_address_bytes[1] != 0x01
   1285	    || sas_address_bytes[2] != 0x08
   1286	    || (sas_address_bytes[3] & 0xF0) != 0x60
   1287	    || ((sas_address_bytes[3] & 0x0F) | sas_address_dwords[1]) == 0) {
   1288		up(&a->nvram_semaphore);
   1289		return false;
   1290	}
   1291
   1292	if (n->spin_up_delay > SASNVR_SPINUP_MAX)
   1293		n->spin_up_delay = SASNVR_SPINUP_MAX;
   1294
   1295	n->version = SASNVR_VERSION;
   1296	n->checksum = n->checksum - esas2r_nvramcalc_cksum(n);
   1297	memcpy(a->nvram, n, sizeof(struct esas2r_sas_nvram));
   1298
   1299	/* write the NVRAM */
   1300	n = a->nvram;
   1301	esas2r_disable_heartbeat(a);
   1302
   1303	esas2r_build_flash_req(a,
   1304			       rq,
   1305			       VDA_FLASH_BEGINW,
   1306			       esas2r_nvramcalc_xor_cksum(n),
   1307			       FLS_OFFSET_NVR,
   1308			       sizeof(struct esas2r_sas_nvram));
   1309
   1310	if (test_bit(AF_LEGACY_SGE_MODE, &a->flags)) {
   1311
   1312		vrq->data.sge[0].length =
   1313			cpu_to_le32(SGE_LAST |
   1314				    sizeof(struct esas2r_sas_nvram));
   1315		vrq->data.sge[0].address = cpu_to_le64(
   1316			a->uncached_phys + (u64)((u8 *)n - a->uncached));
   1317	} else {
   1318		vrq->data.prde[0].ctl_len =
   1319			cpu_to_le32(sizeof(struct esas2r_sas_nvram));
   1320		vrq->data.prde[0].address = cpu_to_le64(
   1321			a->uncached_phys
   1322			+ (u64)((u8 *)n - a->uncached));
   1323	}
   1324	rq->interrupt_cb = esas2r_nvram_callback;
   1325	esas2r_start_request(a, rq);
   1326	return true;
   1327}
   1328
   1329/* Validate the cached NVRAM.  if the NVRAM is invalid, load the defaults. */
   1330bool esas2r_nvram_validate(struct esas2r_adapter *a)
   1331{
   1332	struct esas2r_sas_nvram *n = a->nvram;
   1333	bool rslt = false;
   1334
   1335	if (n->signature[0] != 'E'
   1336	    || n->signature[1] != 'S'
   1337	    || n->signature[2] != 'A'
   1338	    || n->signature[3] != 'S') {
   1339		esas2r_hdebug("invalid NVRAM signature");
   1340	} else if (esas2r_nvramcalc_cksum(n)) {
   1341		esas2r_hdebug("invalid NVRAM checksum");
   1342	} else if (n->version > SASNVR_VERSION) {
   1343		esas2r_hdebug("invalid NVRAM version");
   1344	} else {
   1345		set_bit(AF_NVR_VALID, &a->flags);
   1346		rslt = true;
   1347	}
   1348
   1349	if (rslt == false) {
   1350		esas2r_hdebug("using defaults");
   1351		esas2r_nvram_set_defaults(a);
   1352	}
   1353
   1354	return rslt;
   1355}
   1356
   1357/*
   1358 * Set the cached NVRAM to defaults.  note that this function sets the default
   1359 * NVRAM when it has been determined that the physical NVRAM is invalid.
   1360 * In this case, the SAS address is fabricated.
   1361 */
   1362void esas2r_nvram_set_defaults(struct esas2r_adapter *a)
   1363{
   1364	struct esas2r_sas_nvram *n = a->nvram;
   1365	u32 time = jiffies_to_msecs(jiffies);
   1366
   1367	clear_bit(AF_NVR_VALID, &a->flags);
   1368	*n = default_sas_nvram;
   1369	n->sas_addr[3] |= 0x0F;
   1370	n->sas_addr[4] = HIBYTE(LOWORD(time));
   1371	n->sas_addr[5] = LOBYTE(LOWORD(time));
   1372	n->sas_addr[6] = a->pcid->bus->number;
   1373	n->sas_addr[7] = a->pcid->devfn;
   1374}
   1375
   1376void esas2r_nvram_get_defaults(struct esas2r_adapter *a,
   1377			       struct esas2r_sas_nvram *nvram)
   1378{
   1379	u8 sas_addr[8];
   1380
   1381	/*
   1382	 * in case we are copying the defaults into the adapter, copy the SAS
   1383	 * address out first.
   1384	 */
   1385	memcpy(&sas_addr[0], a->nvram->sas_addr, 8);
   1386	*nvram = default_sas_nvram;
   1387	memcpy(&nvram->sas_addr[0], &sas_addr[0], 8);
   1388}
   1389
   1390bool esas2r_fm_api(struct esas2r_adapter *a, struct esas2r_flash_img *fi,
   1391		   struct esas2r_request *rq, struct esas2r_sg_context *sgc)
   1392{
   1393	struct esas2r_flash_context *fc = &a->flash_context;
   1394	u8 j;
   1395	struct esas2r_component_header *ch;
   1396
   1397	if (test_and_set_bit(AF_FLASH_LOCK, &a->flags)) {
   1398		/* flag was already set */
   1399		fi->status = FI_STAT_BUSY;
   1400		return false;
   1401	}
   1402
   1403	memcpy(&fc->sgc, sgc, sizeof(struct esas2r_sg_context));
   1404	sgc = &fc->sgc;
   1405	fc->fi = fi;
   1406	fc->sgc_offset = sgc->cur_offset;
   1407	rq->req_stat = RS_SUCCESS;
   1408	rq->interrupt_cx = fc;
   1409
   1410	switch (fi->fi_version) {
   1411	case FI_VERSION_1:
   1412		fc->scratch = ((struct esas2r_flash_img *)fi)->scratch_buf;
   1413		fc->num_comps = FI_NUM_COMPS_V1;
   1414		fc->fi_hdr_len = sizeof(struct esas2r_flash_img);
   1415		break;
   1416
   1417	default:
   1418		return complete_fmapi_req(a, rq, FI_STAT_IMG_VER);
   1419	}
   1420
   1421	if (test_bit(AF_DEGRADED_MODE, &a->flags))
   1422		return complete_fmapi_req(a, rq, FI_STAT_DEGRADED);
   1423
   1424	switch (fi->action) {
   1425	case FI_ACT_DOWN: /* Download the components */
   1426		/* Verify the format of the flash image */
   1427		if (!verify_fi(a, fc))
   1428			return complete_fmapi_req(a, rq, fi->status);
   1429
   1430		/* Adjust the BIOS fields that are dependent on the HBA */
   1431		ch = &fi->cmp_hdr[CH_IT_BIOS];
   1432
   1433		if (ch->length)
   1434			fix_bios(a, fi);
   1435
   1436		/* Adjust the EFI fields that are dependent on the HBA */
   1437		ch = &fi->cmp_hdr[CH_IT_EFI];
   1438
   1439		if (ch->length)
   1440			fix_efi(a, fi);
   1441
   1442		/*
   1443		 * Since the image was just modified, compute the checksum on
   1444		 * the modified image.  First update the CRC for the composite
   1445		 * expansion ROM image.
   1446		 */
   1447		fi->checksum = calc_fi_checksum(fc);
   1448
   1449		/* Disable the heartbeat */
   1450		esas2r_disable_heartbeat(a);
   1451
   1452		/* Now start up the download sequence */
   1453		fc->task = FMTSK_ERASE_BOOT;
   1454		fc->func = VDA_FLASH_BEGINW;
   1455		fc->comp_typ = CH_IT_CFG;
   1456		fc->flsh_addr = FLS_OFFSET_BOOT;
   1457		fc->sgc.length = FLS_LENGTH_BOOT;
   1458		fc->sgc.cur_offset = NULL;
   1459
   1460		/* Setup the callback address */
   1461		fc->interrupt_cb = fw_download_proc;
   1462		break;
   1463
   1464	case FI_ACT_UPSZ: /* Get upload sizes */
   1465		fi->adap_typ = get_fi_adap_type(a);
   1466		fi->flags = 0;
   1467		fi->num_comps = fc->num_comps;
   1468		fi->length = fc->fi_hdr_len;
   1469
   1470		/* Report the type of boot image in the rel_version string */
   1471		memcpy(fi->rel_version, a->image_type,
   1472		       sizeof(fi->rel_version));
   1473
   1474		/* Build the component headers */
   1475		for (j = 0, ch = fi->cmp_hdr;
   1476		     j < fi->num_comps;
   1477		     j++, ch++) {
   1478			ch->img_type = j;
   1479			ch->status = CH_STAT_PENDING;
   1480			ch->length = 0;
   1481			ch->version = 0xffffffff;
   1482			ch->image_offset = 0;
   1483			ch->pad[0] = 0;
   1484			ch->pad[1] = 0;
   1485		}
   1486
   1487		if (a->flash_ver != 0) {
   1488			fi->cmp_hdr[CH_IT_BIOS].version =
   1489				fi->cmp_hdr[CH_IT_MAC].version =
   1490					fi->cmp_hdr[CH_IT_EFI].version =
   1491						fi->cmp_hdr[CH_IT_CFG].version
   1492							= a->flash_ver;
   1493
   1494			fi->cmp_hdr[CH_IT_BIOS].status =
   1495				fi->cmp_hdr[CH_IT_MAC].status =
   1496					fi->cmp_hdr[CH_IT_EFI].status =
   1497						fi->cmp_hdr[CH_IT_CFG].status =
   1498							CH_STAT_SUCCESS;
   1499
   1500			return complete_fmapi_req(a, rq, FI_STAT_SUCCESS);
   1501		}
   1502
   1503		fallthrough;
   1504
   1505	case FI_ACT_UP: /* Upload the components */
   1506	default:
   1507		return complete_fmapi_req(a, rq, FI_STAT_INVALID);
   1508	}
   1509
   1510	/*
   1511	 * If we make it here, fc has been setup to do the first task.  Call
   1512	 * load_image to format the request, start it, and get out.  The
   1513	 * interrupt code will call the callback when the first message is
   1514	 * complete.
   1515	 */
   1516	if (!load_image(a, rq))
   1517		return complete_fmapi_req(a, rq, FI_STAT_FAILED);
   1518
   1519	esas2r_start_request(a, rq);
   1520
   1521	return true;
   1522}