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 suppported 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		return false;
1201	}
1202
1203	result = esas2r_nvram_validate(a);
1204
1205	up(&a->nvram_semaphore);
1206
1207	return result;
1208}
1209
1210/* Interrupt callback to process NVRAM completions. */
1211static void esas2r_nvram_callback(struct esas2r_adapter *a,
1212				  struct esas2r_request *rq)
1213{
1214	struct atto_vda_flash_req *vrq = &rq->vrq->flash;
1215
1216	if (rq->req_stat == RS_SUCCESS) {
1217		/* last request was successful.  see what to do now. */
1218
1219		switch (vrq->sub_func) {
1220		case VDA_FLASH_BEGINW:
1221			vrq->sub_func = VDA_FLASH_WRITE;
1222			rq->req_stat = RS_PENDING;
1223			break;
1224
1225		case VDA_FLASH_WRITE:
1226			vrq->sub_func = VDA_FLASH_COMMIT;
1227			rq->req_stat = RS_PENDING;
1228			break;
1229
1230		case VDA_FLASH_READ:
1231			esas2r_nvram_validate(a);
1232			break;
1233
1234		case VDA_FLASH_COMMIT:
1235		default:
1236			break;
1237		}
1238	}
1239
1240	if (rq->req_stat != RS_PENDING) {
1241		/* update the NVRAM state */
1242		if (rq->req_stat == RS_SUCCESS)
1243			set_bit(AF_NVR_VALID, &a->flags);
1244		else
1245			clear_bit(AF_NVR_VALID, &a->flags);
1246
1247		esas2r_enable_heartbeat(a);
1248
1249		up(&a->nvram_semaphore);
1250	}
1251}
1252
1253/*
1254 * Write the contents of nvram to the adapter's physical NVRAM.
1255 * The cached copy of the NVRAM is also updated.
1256 */
1257bool esas2r_nvram_write(struct esas2r_adapter *a, struct esas2r_request *rq,
1258			struct esas2r_sas_nvram *nvram)
1259{
1260	struct esas2r_sas_nvram *n = nvram;
1261	u8 sas_address_bytes[8];
1262	u32 *sas_address_dwords = (u32 *)&sas_address_bytes[0];
1263	struct atto_vda_flash_req *vrq = &rq->vrq->flash;
1264
1265	if (test_bit(AF_DEGRADED_MODE, &a->flags))
1266		return false;
1267
1268	if (down_interruptible(&a->nvram_semaphore))
1269		return false;
1270
1271	if (n == NULL)
1272		n = a->nvram;
1273
1274	/* check the validity of the settings */
1275	if (n->version > SASNVR_VERSION) {
1276		up(&a->nvram_semaphore);
1277		return false;
1278	}
1279
1280	memcpy(&sas_address_bytes[0], n->sas_addr, 8);
1281
1282	if (sas_address_bytes[0] != 0x50
1283	    || sas_address_bytes[1] != 0x01
1284	    || sas_address_bytes[2] != 0x08
1285	    || (sas_address_bytes[3] & 0xF0) != 0x60
1286	    || ((sas_address_bytes[3] & 0x0F) | sas_address_dwords[1]) == 0) {
1287		up(&a->nvram_semaphore);
1288		return false;
1289	}
1290
1291	if (n->spin_up_delay > SASNVR_SPINUP_MAX)
1292		n->spin_up_delay = SASNVR_SPINUP_MAX;
1293
1294	n->version = SASNVR_VERSION;
1295	n->checksum = n->checksum - esas2r_nvramcalc_cksum(n);
1296	memcpy(a->nvram, n, sizeof(struct esas2r_sas_nvram));
1297
1298	/* write the NVRAM */
1299	n = a->nvram;
1300	esas2r_disable_heartbeat(a);
1301
1302	esas2r_build_flash_req(a,
1303			       rq,
1304			       VDA_FLASH_BEGINW,
1305			       esas2r_nvramcalc_xor_cksum(n),
1306			       FLS_OFFSET_NVR,
1307			       sizeof(struct esas2r_sas_nvram));
1308
1309	if (test_bit(AF_LEGACY_SGE_MODE, &a->flags)) {
1310
1311		vrq->data.sge[0].length =
1312			cpu_to_le32(SGE_LAST |
1313				    sizeof(struct esas2r_sas_nvram));
1314		vrq->data.sge[0].address = cpu_to_le64(
1315			a->uncached_phys + (u64)((u8 *)n - a->uncached));
1316	} else {
1317		vrq->data.prde[0].ctl_len =
1318			cpu_to_le32(sizeof(struct esas2r_sas_nvram));
1319		vrq->data.prde[0].address = cpu_to_le64(
1320			a->uncached_phys
1321			+ (u64)((u8 *)n - a->uncached));
1322	}
1323	rq->interrupt_cb = esas2r_nvram_callback;
1324	esas2r_start_request(a, rq);
1325	return true;
1326}
1327
1328/* Validate the cached NVRAM.  if the NVRAM is invalid, load the defaults. */
1329bool esas2r_nvram_validate(struct esas2r_adapter *a)
1330{
1331	struct esas2r_sas_nvram *n = a->nvram;
1332	bool rslt = false;
1333
1334	if (n->signature[0] != 'E'
1335	    || n->signature[1] != 'S'
1336	    || n->signature[2] != 'A'
1337	    || n->signature[3] != 'S') {
1338		esas2r_hdebug("invalid NVRAM signature");
1339	} else if (esas2r_nvramcalc_cksum(n)) {
1340		esas2r_hdebug("invalid NVRAM checksum");
1341	} else if (n->version > SASNVR_VERSION) {
1342		esas2r_hdebug("invalid NVRAM version");
1343	} else {
1344		set_bit(AF_NVR_VALID, &a->flags);
1345		rslt = true;
1346	}
1347
1348	if (rslt == false) {
1349		esas2r_hdebug("using defaults");
1350		esas2r_nvram_set_defaults(a);
1351	}
1352
1353	return rslt;
1354}
1355
1356/*
1357 * Set the cached NVRAM to defaults.  note that this function sets the default
1358 * NVRAM when it has been determined that the physical NVRAM is invalid.
1359 * In this case, the SAS address is fabricated.
1360 */
1361void esas2r_nvram_set_defaults(struct esas2r_adapter *a)
1362{
1363	struct esas2r_sas_nvram *n = a->nvram;
1364	u32 time = jiffies_to_msecs(jiffies);
1365
1366	clear_bit(AF_NVR_VALID, &a->flags);
1367	*n = default_sas_nvram;
1368	n->sas_addr[3] |= 0x0F;
1369	n->sas_addr[4] = HIBYTE(LOWORD(time));
1370	n->sas_addr[5] = LOBYTE(LOWORD(time));
1371	n->sas_addr[6] = a->pcid->bus->number;
1372	n->sas_addr[7] = a->pcid->devfn;
1373}
1374
1375void esas2r_nvram_get_defaults(struct esas2r_adapter *a,
1376			       struct esas2r_sas_nvram *nvram)
1377{
1378	u8 sas_addr[8];
1379
1380	/*
1381	 * in case we are copying the defaults into the adapter, copy the SAS
1382	 * address out first.
1383	 */
1384	memcpy(&sas_addr[0], a->nvram->sas_addr, 8);
1385	*nvram = default_sas_nvram;
1386	memcpy(&nvram->sas_addr[0], &sas_addr[0], 8);
1387}
1388
1389bool esas2r_fm_api(struct esas2r_adapter *a, struct esas2r_flash_img *fi,
1390		   struct esas2r_request *rq, struct esas2r_sg_context *sgc)
1391{
1392	struct esas2r_flash_context *fc = &a->flash_context;
1393	u8 j;
1394	struct esas2r_component_header *ch;
1395
1396	if (test_and_set_bit(AF_FLASH_LOCK, &a->flags)) {
1397		/* flag was already set */
1398		fi->status = FI_STAT_BUSY;
1399		return false;
1400	}
1401
1402	memcpy(&fc->sgc, sgc, sizeof(struct esas2r_sg_context));
1403	sgc = &fc->sgc;
1404	fc->fi = fi;
1405	fc->sgc_offset = sgc->cur_offset;
1406	rq->req_stat = RS_SUCCESS;
1407	rq->interrupt_cx = fc;
1408
1409	switch (fi->fi_version) {
1410	case FI_VERSION_1:
1411		fc->scratch = ((struct esas2r_flash_img *)fi)->scratch_buf;
1412		fc->num_comps = FI_NUM_COMPS_V1;
1413		fc->fi_hdr_len = sizeof(struct esas2r_flash_img);
1414		break;
1415
1416	default:
1417		return complete_fmapi_req(a, rq, FI_STAT_IMG_VER);
1418	}
1419
1420	if (test_bit(AF_DEGRADED_MODE, &a->flags))
1421		return complete_fmapi_req(a, rq, FI_STAT_DEGRADED);
1422
1423	switch (fi->action) {
1424	case FI_ACT_DOWN: /* Download the components */
1425		/* Verify the format of the flash image */
1426		if (!verify_fi(a, fc))
1427			return complete_fmapi_req(a, rq, fi->status);
1428
1429		/* Adjust the BIOS fields that are dependent on the HBA */
1430		ch = &fi->cmp_hdr[CH_IT_BIOS];
1431
1432		if (ch->length)
1433			fix_bios(a, fi);
1434
1435		/* Adjust the EFI fields that are dependent on the HBA */
1436		ch = &fi->cmp_hdr[CH_IT_EFI];
1437
1438		if (ch->length)
1439			fix_efi(a, fi);
1440
1441		/*
1442		 * Since the image was just modified, compute the checksum on
1443		 * the modified image.  First update the CRC for the composite
1444		 * expansion ROM image.
1445		 */
1446		fi->checksum = calc_fi_checksum(fc);
1447
1448		/* Disable the heartbeat */
1449		esas2r_disable_heartbeat(a);
1450
1451		/* Now start up the download sequence */
1452		fc->task = FMTSK_ERASE_BOOT;
1453		fc->func = VDA_FLASH_BEGINW;
1454		fc->comp_typ = CH_IT_CFG;
1455		fc->flsh_addr = FLS_OFFSET_BOOT;
1456		fc->sgc.length = FLS_LENGTH_BOOT;
1457		fc->sgc.cur_offset = NULL;
1458
1459		/* Setup the callback address */
1460		fc->interrupt_cb = fw_download_proc;
1461		break;
1462
1463	case FI_ACT_UPSZ: /* Get upload sizes */
1464		fi->adap_typ = get_fi_adap_type(a);
1465		fi->flags = 0;
1466		fi->num_comps = fc->num_comps;
1467		fi->length = fc->fi_hdr_len;
1468
1469		/* Report the type of boot image in the rel_version string */
1470		memcpy(fi->rel_version, a->image_type,
1471		       sizeof(fi->rel_version));
1472
1473		/* Build the component headers */
1474		for (j = 0, ch = fi->cmp_hdr;
1475		     j < fi->num_comps;
1476		     j++, ch++) {
1477			ch->img_type = j;
1478			ch->status = CH_STAT_PENDING;
1479			ch->length = 0;
1480			ch->version = 0xffffffff;
1481			ch->image_offset = 0;
1482			ch->pad[0] = 0;
1483			ch->pad[1] = 0;
1484		}
1485
1486		if (a->flash_ver != 0) {
1487			fi->cmp_hdr[CH_IT_BIOS].version =
1488				fi->cmp_hdr[CH_IT_MAC].version =
1489					fi->cmp_hdr[CH_IT_EFI].version =
1490						fi->cmp_hdr[CH_IT_CFG].version
1491							= a->flash_ver;
1492
1493			fi->cmp_hdr[CH_IT_BIOS].status =
1494				fi->cmp_hdr[CH_IT_MAC].status =
1495					fi->cmp_hdr[CH_IT_EFI].status =
1496						fi->cmp_hdr[CH_IT_CFG].status =
1497							CH_STAT_SUCCESS;
1498
1499			return complete_fmapi_req(a, rq, FI_STAT_SUCCESS);
1500		}
1501
1502	/* fall through */
1503
1504	case FI_ACT_UP: /* Upload the components */
1505	default:
1506		return complete_fmapi_req(a, rq, FI_STAT_INVALID);
1507	}
1508
1509	/*
1510	 * If we make it here, fc has been setup to do the first task.  Call
1511	 * load_image to format the request, start it, and get out.  The
1512	 * interrupt code will call the callback when the first message is
1513	 * complete.
1514	 */
1515	if (!load_image(a, rq))
1516		return complete_fmapi_req(a, rq, FI_STAT_FAILED);
1517
1518	esas2r_start_request(a, rq);
1519
1520	return true;
1521}
1522