xref: /linux/drivers/scsi/qla2xxx/qla_sup.c (revision 13abf8130139c2ccd4962a7e5a8902be5e6cb5a7)
1 /******************************************************************************
2  *                  QLOGIC LINUX SOFTWARE
3  *
4  * QLogic ISP2x00 device driver for Linux 2.6.x
5  * Copyright (C) 2003-2005 QLogic Corporation
6  * (www.qlogic.com)
7  *
8  * This program is free software; you can redistribute it and/or modify it
9  * under the terms of the GNU General Public License as published by the
10  * Free Software Foundation; either version 2, or (at your option) any
11  * later version.
12  *
13  * This program is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * General Public License for more details.
17  *
18  ******************************************************************************/
19 
20 #include "qla_def.h"
21 
22 #include <linux/delay.h>
23 #include <asm/uaccess.h>
24 
25 static uint16_t qla2x00_nvram_request(scsi_qla_host_t *, uint32_t);
26 static void qla2x00_nv_deselect(scsi_qla_host_t *);
27 static void qla2x00_nv_write(scsi_qla_host_t *, uint16_t);
28 
29 /*
30  * NVRAM support routines
31  */
32 
33 /**
34  * qla2x00_lock_nvram_access() -
35  * @ha: HA context
36  */
37 void
38 qla2x00_lock_nvram_access(scsi_qla_host_t *ha)
39 {
40 	uint16_t data;
41 	struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
42 
43 	if (!IS_QLA2100(ha) && !IS_QLA2200(ha) && !IS_QLA2300(ha)) {
44 		data = RD_REG_WORD(&reg->nvram);
45 		while (data & NVR_BUSY) {
46 			udelay(100);
47 			data = RD_REG_WORD(&reg->nvram);
48 		}
49 
50 		/* Lock resource */
51 		WRT_REG_WORD(&reg->u.isp2300.host_semaphore, 0x1);
52 		RD_REG_WORD(&reg->u.isp2300.host_semaphore);
53 		udelay(5);
54 		data = RD_REG_WORD(&reg->u.isp2300.host_semaphore);
55 		while ((data & BIT_0) == 0) {
56 			/* Lock failed */
57 			udelay(100);
58 			WRT_REG_WORD(&reg->u.isp2300.host_semaphore, 0x1);
59 			RD_REG_WORD(&reg->u.isp2300.host_semaphore);
60 			udelay(5);
61 			data = RD_REG_WORD(&reg->u.isp2300.host_semaphore);
62 		}
63 	}
64 }
65 
66 /**
67  * qla2x00_unlock_nvram_access() -
68  * @ha: HA context
69  */
70 void
71 qla2x00_unlock_nvram_access(scsi_qla_host_t *ha)
72 {
73 	struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
74 
75 	if (!IS_QLA2100(ha) && !IS_QLA2200(ha) && !IS_QLA2300(ha)) {
76 		WRT_REG_WORD(&reg->u.isp2300.host_semaphore, 0);
77 		RD_REG_WORD(&reg->u.isp2300.host_semaphore);
78 	}
79 }
80 
81 /**
82  * qla2x00_get_nvram_word() - Calculates word position in NVRAM and calls the
83  *	request routine to get the word from NVRAM.
84  * @ha: HA context
85  * @addr: Address in NVRAM to read
86  *
87  * Returns the word read from nvram @addr.
88  */
89 uint16_t
90 qla2x00_get_nvram_word(scsi_qla_host_t *ha, uint32_t addr)
91 {
92 	uint16_t	data;
93 	uint32_t	nv_cmd;
94 
95 	nv_cmd = addr << 16;
96 	nv_cmd |= NV_READ_OP;
97 	data = qla2x00_nvram_request(ha, nv_cmd);
98 
99 	return (data);
100 }
101 
102 /**
103  * qla2x00_write_nvram_word() - Write NVRAM data.
104  * @ha: HA context
105  * @addr: Address in NVRAM to write
106  * @data: word to program
107  */
108 void
109 qla2x00_write_nvram_word(scsi_qla_host_t *ha, uint32_t addr, uint16_t data)
110 {
111 	int count;
112 	uint16_t word;
113 	uint32_t nv_cmd;
114 	struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
115 
116 	qla2x00_nv_write(ha, NVR_DATA_OUT);
117 	qla2x00_nv_write(ha, 0);
118 	qla2x00_nv_write(ha, 0);
119 
120 	for (word = 0; word < 8; word++)
121 		qla2x00_nv_write(ha, NVR_DATA_OUT);
122 
123 	qla2x00_nv_deselect(ha);
124 
125 	/* Write data */
126 	nv_cmd = (addr << 16) | NV_WRITE_OP;
127 	nv_cmd |= data;
128 	nv_cmd <<= 5;
129 	for (count = 0; count < 27; count++) {
130 		if (nv_cmd & BIT_31)
131 			qla2x00_nv_write(ha, NVR_DATA_OUT);
132 		else
133 			qla2x00_nv_write(ha, 0);
134 
135 		nv_cmd <<= 1;
136 	}
137 
138 	qla2x00_nv_deselect(ha);
139 
140 	/* Wait for NVRAM to become ready */
141 	WRT_REG_WORD(&reg->nvram, NVR_SELECT);
142 	do {
143 		NVRAM_DELAY();
144 		word = RD_REG_WORD(&reg->nvram);
145 	} while ((word & NVR_DATA_IN) == 0);
146 
147 	qla2x00_nv_deselect(ha);
148 
149 	/* Disable writes */
150 	qla2x00_nv_write(ha, NVR_DATA_OUT);
151 	for (count = 0; count < 10; count++)
152 		qla2x00_nv_write(ha, 0);
153 
154 	qla2x00_nv_deselect(ha);
155 }
156 
157 static int
158 qla2x00_write_nvram_word_tmo(scsi_qla_host_t *ha, uint32_t addr, uint16_t data,
159     uint32_t tmo)
160 {
161 	int ret, count;
162 	uint16_t word;
163 	uint32_t nv_cmd;
164 	struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
165 
166 	ret = QLA_SUCCESS;
167 
168 	qla2x00_nv_write(ha, NVR_DATA_OUT);
169 	qla2x00_nv_write(ha, 0);
170 	qla2x00_nv_write(ha, 0);
171 
172 	for (word = 0; word < 8; word++)
173 		qla2x00_nv_write(ha, NVR_DATA_OUT);
174 
175 	qla2x00_nv_deselect(ha);
176 
177 	/* Write data */
178 	nv_cmd = (addr << 16) | NV_WRITE_OP;
179 	nv_cmd |= data;
180 	nv_cmd <<= 5;
181 	for (count = 0; count < 27; count++) {
182 		if (nv_cmd & BIT_31)
183 			qla2x00_nv_write(ha, NVR_DATA_OUT);
184 		else
185 			qla2x00_nv_write(ha, 0);
186 
187 		nv_cmd <<= 1;
188 	}
189 
190 	qla2x00_nv_deselect(ha);
191 
192 	/* Wait for NVRAM to become ready */
193 	WRT_REG_WORD(&reg->nvram, NVR_SELECT);
194 	do {
195 		NVRAM_DELAY();
196 		word = RD_REG_WORD(&reg->nvram);
197 		if (!--tmo) {
198 			ret = QLA_FUNCTION_FAILED;
199 			break;
200 		}
201 	} while ((word & NVR_DATA_IN) == 0);
202 
203 	qla2x00_nv_deselect(ha);
204 
205 	/* Disable writes */
206 	qla2x00_nv_write(ha, NVR_DATA_OUT);
207 	for (count = 0; count < 10; count++)
208 		qla2x00_nv_write(ha, 0);
209 
210 	qla2x00_nv_deselect(ha);
211 
212 	return ret;
213 }
214 
215 /**
216  * qla2x00_nvram_request() - Sends read command to NVRAM and gets data from
217  *	NVRAM.
218  * @ha: HA context
219  * @nv_cmd: NVRAM command
220  *
221  * Bit definitions for NVRAM command:
222  *
223  *	Bit 26     = start bit
224  *	Bit 25, 24 = opcode
225  *	Bit 23-16  = address
226  *	Bit 15-0   = write data
227  *
228  * Returns the word read from nvram @addr.
229  */
230 static uint16_t
231 qla2x00_nvram_request(scsi_qla_host_t *ha, uint32_t nv_cmd)
232 {
233 	uint8_t		cnt;
234 	struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
235 	uint16_t	data = 0;
236 	uint16_t	reg_data;
237 
238 	/* Send command to NVRAM. */
239 	nv_cmd <<= 5;
240 	for (cnt = 0; cnt < 11; cnt++) {
241 		if (nv_cmd & BIT_31)
242 			qla2x00_nv_write(ha, NVR_DATA_OUT);
243 		else
244 			qla2x00_nv_write(ha, 0);
245 		nv_cmd <<= 1;
246 	}
247 
248 	/* Read data from NVRAM. */
249 	for (cnt = 0; cnt < 16; cnt++) {
250 		WRT_REG_WORD(&reg->nvram, NVR_SELECT | NVR_CLOCK);
251 		NVRAM_DELAY();
252 		data <<= 1;
253 		reg_data = RD_REG_WORD(&reg->nvram);
254 		if (reg_data & NVR_DATA_IN)
255 			data |= BIT_0;
256 		WRT_REG_WORD(&reg->nvram, NVR_SELECT);
257 		RD_REG_WORD(&reg->nvram);	/* PCI Posting. */
258 		NVRAM_DELAY();
259 	}
260 
261 	/* Deselect chip. */
262 	WRT_REG_WORD(&reg->nvram, NVR_DESELECT);
263 	RD_REG_WORD(&reg->nvram);		/* PCI Posting. */
264 	NVRAM_DELAY();
265 
266 	return (data);
267 }
268 
269 /**
270  * qla2x00_nv_write() - Clean NVRAM operations.
271  * @ha: HA context
272  */
273 static void
274 qla2x00_nv_deselect(scsi_qla_host_t *ha)
275 {
276 	struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
277 
278 	WRT_REG_WORD(&reg->nvram, NVR_DESELECT);
279 	RD_REG_WORD(&reg->nvram);		/* PCI Posting. */
280 	NVRAM_DELAY();
281 }
282 
283 /**
284  * qla2x00_nv_write() - Prepare for NVRAM read/write operation.
285  * @ha: HA context
286  * @data: Serial interface selector
287  */
288 static void
289 qla2x00_nv_write(scsi_qla_host_t *ha, uint16_t data)
290 {
291 	struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
292 
293 	WRT_REG_WORD(&reg->nvram, data | NVR_SELECT | NVR_WRT_ENABLE);
294 	RD_REG_WORD(&reg->nvram);		/* PCI Posting. */
295 	NVRAM_DELAY();
296 	WRT_REG_WORD(&reg->nvram, data | NVR_SELECT| NVR_CLOCK |
297 	    NVR_WRT_ENABLE);
298 	RD_REG_WORD(&reg->nvram);		/* PCI Posting. */
299 	NVRAM_DELAY();
300 	WRT_REG_WORD(&reg->nvram, data | NVR_SELECT | NVR_WRT_ENABLE);
301 	RD_REG_WORD(&reg->nvram);		/* PCI Posting. */
302 	NVRAM_DELAY();
303 }
304 
305 /**
306  * qla2x00_clear_nvram_protection() -
307  * @ha: HA context
308  */
309 static int
310 qla2x00_clear_nvram_protection(scsi_qla_host_t *ha)
311 {
312 	int ret, stat;
313 	struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
314 	uint32_t word;
315 	uint16_t wprot, wprot_old;
316 
317 	/* Clear NVRAM write protection. */
318 	ret = QLA_FUNCTION_FAILED;
319 	wprot_old = cpu_to_le16(qla2x00_get_nvram_word(ha, 0));
320 	stat = qla2x00_write_nvram_word_tmo(ha, 0,
321 	    __constant_cpu_to_le16(0x1234), 100000);
322 	wprot = cpu_to_le16(qla2x00_get_nvram_word(ha, 0));
323 	if (stat != QLA_SUCCESS || wprot != __constant_cpu_to_le16(0x1234)) {
324 		/* Write enable. */
325 		qla2x00_nv_write(ha, NVR_DATA_OUT);
326 		qla2x00_nv_write(ha, 0);
327 		qla2x00_nv_write(ha, 0);
328 		for (word = 0; word < 8; word++)
329 			qla2x00_nv_write(ha, NVR_DATA_OUT);
330 
331 		qla2x00_nv_deselect(ha);
332 
333 		/* Enable protection register. */
334 		qla2x00_nv_write(ha, NVR_PR_ENABLE | NVR_DATA_OUT);
335 		qla2x00_nv_write(ha, NVR_PR_ENABLE);
336 		qla2x00_nv_write(ha, NVR_PR_ENABLE);
337 		for (word = 0; word < 8; word++)
338 			qla2x00_nv_write(ha, NVR_DATA_OUT | NVR_PR_ENABLE);
339 
340 		qla2x00_nv_deselect(ha);
341 
342 		/* Clear protection register (ffff is cleared). */
343 		qla2x00_nv_write(ha, NVR_PR_ENABLE | NVR_DATA_OUT);
344 		qla2x00_nv_write(ha, NVR_PR_ENABLE | NVR_DATA_OUT);
345 		qla2x00_nv_write(ha, NVR_PR_ENABLE | NVR_DATA_OUT);
346 		for (word = 0; word < 8; word++)
347 			qla2x00_nv_write(ha, NVR_DATA_OUT | NVR_PR_ENABLE);
348 
349 		qla2x00_nv_deselect(ha);
350 
351 		/* Wait for NVRAM to become ready. */
352 		WRT_REG_WORD(&reg->nvram, NVR_SELECT);
353 		do {
354 			NVRAM_DELAY();
355 			word = RD_REG_WORD(&reg->nvram);
356 		} while ((word & NVR_DATA_IN) == 0);
357 
358 		ret = QLA_SUCCESS;
359 	} else
360 		qla2x00_write_nvram_word(ha, 0, wprot_old);
361 
362 	return ret;
363 }
364 
365 static void
366 qla2x00_set_nvram_protection(scsi_qla_host_t *ha, int stat)
367 {
368 	struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
369 	uint32_t word;
370 
371 	if (stat != QLA_SUCCESS)
372 		return;
373 
374 	/* Set NVRAM write protection. */
375 	/* Write enable. */
376 	qla2x00_nv_write(ha, NVR_DATA_OUT);
377 	qla2x00_nv_write(ha, 0);
378 	qla2x00_nv_write(ha, 0);
379 	for (word = 0; word < 8; word++)
380 		qla2x00_nv_write(ha, NVR_DATA_OUT);
381 
382 	qla2x00_nv_deselect(ha);
383 
384 	/* Enable protection register. */
385 	qla2x00_nv_write(ha, NVR_PR_ENABLE | NVR_DATA_OUT);
386 	qla2x00_nv_write(ha, NVR_PR_ENABLE);
387 	qla2x00_nv_write(ha, NVR_PR_ENABLE);
388 	for (word = 0; word < 8; word++)
389 		qla2x00_nv_write(ha, NVR_DATA_OUT | NVR_PR_ENABLE);
390 
391 	qla2x00_nv_deselect(ha);
392 
393 	/* Enable protection register. */
394 	qla2x00_nv_write(ha, NVR_PR_ENABLE | NVR_DATA_OUT);
395 	qla2x00_nv_write(ha, NVR_PR_ENABLE);
396 	qla2x00_nv_write(ha, NVR_PR_ENABLE | NVR_DATA_OUT);
397 	for (word = 0; word < 8; word++)
398 		qla2x00_nv_write(ha, NVR_PR_ENABLE);
399 
400 	qla2x00_nv_deselect(ha);
401 
402 	/* Wait for NVRAM to become ready. */
403 	WRT_REG_WORD(&reg->nvram, NVR_SELECT);
404 	do {
405 		NVRAM_DELAY();
406 		word = RD_REG_WORD(&reg->nvram);
407 	} while ((word & NVR_DATA_IN) == 0);
408 }
409 
410 
411 /*****************************************************************************/
412 /* Flash Manipulation Routines                                               */
413 /*****************************************************************************/
414 
415 static inline uint32_t
416 flash_conf_to_access_addr(uint32_t faddr)
417 {
418 	return FARX_ACCESS_FLASH_CONF | faddr;
419 }
420 
421 static inline uint32_t
422 flash_data_to_access_addr(uint32_t faddr)
423 {
424 	return FARX_ACCESS_FLASH_DATA | faddr;
425 }
426 
427 static inline uint32_t
428 nvram_conf_to_access_addr(uint32_t naddr)
429 {
430 	return FARX_ACCESS_NVRAM_CONF | naddr;
431 }
432 
433 static inline uint32_t
434 nvram_data_to_access_addr(uint32_t naddr)
435 {
436 	return FARX_ACCESS_NVRAM_DATA | naddr;
437 }
438 
439 uint32_t
440 qla24xx_read_flash_dword(scsi_qla_host_t *ha, uint32_t addr)
441 {
442 	int rval;
443 	uint32_t cnt, data;
444 	struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
445 
446 	WRT_REG_DWORD(&reg->flash_addr, addr & ~FARX_DATA_FLAG);
447 	/* Wait for READ cycle to complete. */
448 	rval = QLA_SUCCESS;
449 	for (cnt = 3000;
450 	    (RD_REG_DWORD(&reg->flash_addr) & FARX_DATA_FLAG) == 0 &&
451 	    rval == QLA_SUCCESS; cnt--) {
452 		if (cnt)
453 			udelay(10);
454 		else
455 			rval = QLA_FUNCTION_TIMEOUT;
456 	}
457 
458 	/* TODO: What happens if we time out? */
459 	data = 0xDEADDEAD;
460 	if (rval == QLA_SUCCESS)
461 		data = RD_REG_DWORD(&reg->flash_data);
462 
463 	return data;
464 }
465 
466 uint32_t *
467 qla24xx_read_flash_data(scsi_qla_host_t *ha, uint32_t *dwptr, uint32_t faddr,
468     uint32_t dwords)
469 {
470 	uint32_t i;
471 	struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
472 
473 	/* Pause RISC. */
474 	WRT_REG_DWORD(&reg->hccr, HCCRX_SET_RISC_PAUSE);
475 	RD_REG_DWORD(&reg->hccr);		/* PCI Posting. */
476 
477 	/* Dword reads to flash. */
478 	for (i = 0; i < dwords; i++, faddr++)
479 		dwptr[i] = cpu_to_le32(qla24xx_read_flash_dword(ha,
480 		    flash_data_to_access_addr(faddr)));
481 
482 	/* Release RISC pause. */
483 	WRT_REG_DWORD(&reg->hccr, HCCRX_REL_RISC_PAUSE);
484 	RD_REG_DWORD(&reg->hccr);		/* PCI Posting. */
485 
486 	return dwptr;
487 }
488 
489 int
490 qla24xx_write_flash_dword(scsi_qla_host_t *ha, uint32_t addr, uint32_t data)
491 {
492 	int rval;
493 	uint32_t cnt;
494 	struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
495 
496 	WRT_REG_DWORD(&reg->flash_data, data);
497 	RD_REG_DWORD(&reg->flash_data);		/* PCI Posting. */
498 	WRT_REG_DWORD(&reg->flash_addr, addr | FARX_DATA_FLAG);
499 	/* Wait for Write cycle to complete. */
500 	rval = QLA_SUCCESS;
501 	for (cnt = 500000; (RD_REG_DWORD(&reg->flash_addr) & FARX_DATA_FLAG) &&
502 	    rval == QLA_SUCCESS; cnt--) {
503 		if (cnt)
504 			udelay(10);
505 		else
506 			rval = QLA_FUNCTION_TIMEOUT;
507 	}
508 	return rval;
509 }
510 
511 void
512 qla24xx_get_flash_manufacturer(scsi_qla_host_t *ha, uint8_t *man_id,
513     uint8_t *flash_id)
514 {
515 	uint32_t ids;
516 
517 	ids = qla24xx_read_flash_dword(ha, flash_data_to_access_addr(0xd03ab));
518 	*man_id = LSB(ids);
519 	*flash_id = MSB(ids);
520 }
521 
522 int
523 qla24xx_write_flash_data(scsi_qla_host_t *ha, uint32_t *dwptr, uint32_t faddr,
524     uint32_t dwords)
525 {
526 	int ret;
527 	uint32_t liter;
528 	uint32_t sec_mask, rest_addr, conf_addr;
529 	uint32_t fdata;
530 	uint8_t	man_id, flash_id;
531 	struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
532 
533 	ret = QLA_SUCCESS;
534 
535 	/* Pause RISC. */
536 	WRT_REG_DWORD(&reg->hccr, HCCRX_SET_RISC_PAUSE);
537 	RD_REG_DWORD(&reg->hccr);		/* PCI Posting. */
538 
539 	qla24xx_get_flash_manufacturer(ha, &man_id, &flash_id);
540 	DEBUG9(printk("%s(%ld): Flash man_id=%d flash_id=%d\n", __func__,
541 	    ha->host_no, man_id, flash_id));
542 
543 	conf_addr = flash_conf_to_access_addr(0x03d8);
544 	switch (man_id) {
545 	case 0xbf: /* STT flash. */
546 		rest_addr = 0x1fff;
547 		sec_mask = 0x3e000;
548 		if (flash_id == 0x80)
549 			conf_addr = flash_conf_to_access_addr(0x0352);
550 		break;
551 	case 0x13: /* ST M25P80. */
552 		rest_addr = 0x3fff;
553 		sec_mask = 0x3c000;
554 		break;
555 	default:
556 		/* Default to 64 kb sector size. */
557 		rest_addr = 0x3fff;
558 		sec_mask = 0x3c000;
559 		break;
560 	}
561 
562 	/* Enable flash write. */
563 	WRT_REG_DWORD(&reg->ctrl_status,
564 	    RD_REG_DWORD(&reg->ctrl_status) | CSRX_FLASH_ENABLE);
565 	RD_REG_DWORD(&reg->ctrl_status);	/* PCI Posting. */
566 
567 	/* Disable flash write-protection. */
568 	qla24xx_write_flash_dword(ha, flash_conf_to_access_addr(0x101), 0);
569 
570 	do {    /* Loop once to provide quick error exit. */
571 		for (liter = 0; liter < dwords; liter++, faddr++, dwptr++) {
572 			/* Are we at the beginning of a sector? */
573 			if ((faddr & rest_addr) == 0) {
574 				fdata = (faddr & sec_mask) << 2;
575 				ret = qla24xx_write_flash_dword(ha, conf_addr,
576 				    (fdata & 0xff00) |((fdata << 16) &
577 				    0xff0000) | ((fdata >> 16) & 0xff));
578 				if (ret != QLA_SUCCESS) {
579 					DEBUG9(printk("%s(%ld) Unable to flash "
580 					    "sector: address=%x.\n", __func__,
581 					    ha->host_no, faddr));
582 					break;
583 				}
584 			}
585 			ret = qla24xx_write_flash_dword(ha,
586 			    flash_data_to_access_addr(faddr),
587 			    cpu_to_le32(*dwptr));
588 			if (ret != QLA_SUCCESS) {
589 				DEBUG9(printk("%s(%ld) Unable to program flash "
590 				    "address=%x data=%x.\n", __func__,
591 				    ha->host_no, faddr, *dwptr));
592 				break;
593 			}
594 		}
595 	} while (0);
596 
597 	/* Disable flash write. */
598 	WRT_REG_DWORD(&reg->ctrl_status,
599 	    RD_REG_DWORD(&reg->ctrl_status) & ~CSRX_FLASH_ENABLE);
600 	RD_REG_DWORD(&reg->ctrl_status);	/* PCI Posting. */
601 
602 	/* Release RISC pause. */
603 	WRT_REG_DWORD(&reg->hccr, HCCRX_REL_RISC_PAUSE);
604 	RD_REG_DWORD(&reg->hccr);		/* PCI Posting. */
605 
606 	return ret;
607 }
608 
609 uint8_t *
610 qla2x00_read_nvram_data(scsi_qla_host_t *ha, uint8_t *buf, uint32_t naddr,
611     uint32_t bytes)
612 {
613 	uint32_t i;
614 	uint16_t *wptr;
615 
616 	/* Word reads to NVRAM via registers. */
617 	wptr = (uint16_t *)buf;
618 	qla2x00_lock_nvram_access(ha);
619 	for (i = 0; i < bytes >> 1; i++, naddr++)
620 		wptr[i] = cpu_to_le16(qla2x00_get_nvram_word(ha,
621 		    naddr));
622 	qla2x00_unlock_nvram_access(ha);
623 
624 	return buf;
625 }
626 
627 uint8_t *
628 qla24xx_read_nvram_data(scsi_qla_host_t *ha, uint8_t *buf, uint32_t naddr,
629     uint32_t bytes)
630 {
631 	uint32_t i;
632 	uint32_t *dwptr;
633 	struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
634 
635 	/* Pause RISC. */
636 	WRT_REG_DWORD(&reg->hccr, HCCRX_SET_RISC_PAUSE);
637 	RD_REG_DWORD(&reg->hccr);	/* PCI Posting. */
638 
639 	/* Dword reads to flash. */
640 	dwptr = (uint32_t *)buf;
641 	for (i = 0; i < bytes >> 2; i++, naddr++)
642 		dwptr[i] = cpu_to_le32(qla24xx_read_flash_dword(ha,
643 		    nvram_data_to_access_addr(naddr)));
644 
645 	/* Release RISC pause. */
646 	WRT_REG_DWORD(&reg->hccr, HCCRX_REL_RISC_PAUSE);
647 	RD_REG_DWORD(&reg->hccr);	/* PCI Posting. */
648 
649 	return buf;
650 }
651 
652 int
653 qla2x00_write_nvram_data(scsi_qla_host_t *ha, uint8_t *buf, uint32_t naddr,
654     uint32_t bytes)
655 {
656 	int ret, stat;
657 	uint32_t i;
658 	uint16_t *wptr;
659 
660 	ret = QLA_SUCCESS;
661 
662 	qla2x00_lock_nvram_access(ha);
663 
664 	/* Disable NVRAM write-protection. */
665 	stat = qla2x00_clear_nvram_protection(ha);
666 
667 	wptr = (uint16_t *)buf;
668 	for (i = 0; i < bytes >> 1; i++, naddr++) {
669 		qla2x00_write_nvram_word(ha, naddr,
670 		    cpu_to_le16(*wptr));
671 		wptr++;
672 	}
673 
674 	/* Enable NVRAM write-protection. */
675 	qla2x00_set_nvram_protection(ha, stat);
676 
677 	qla2x00_unlock_nvram_access(ha);
678 
679 	return ret;
680 }
681 
682 int
683 qla24xx_write_nvram_data(scsi_qla_host_t *ha, uint8_t *buf, uint32_t naddr,
684     uint32_t bytes)
685 {
686 	int ret;
687 	uint32_t i;
688 	uint32_t *dwptr;
689 	struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
690 
691 	ret = QLA_SUCCESS;
692 
693 	/* Pause RISC. */
694 	WRT_REG_DWORD(&reg->hccr, HCCRX_SET_RISC_PAUSE);
695 	RD_REG_DWORD(&reg->hccr);		/* PCI Posting. */
696 
697 	/* Enable flash write. */
698 	WRT_REG_DWORD(&reg->ctrl_status,
699 	    RD_REG_DWORD(&reg->ctrl_status) | CSRX_FLASH_ENABLE);
700 	RD_REG_DWORD(&reg->ctrl_status);	/* PCI Posting. */
701 
702 	/* Disable NVRAM write-protection. */
703 	qla24xx_write_flash_dword(ha, nvram_conf_to_access_addr(0x101),
704 	    0);
705 	qla24xx_write_flash_dword(ha, nvram_conf_to_access_addr(0x101),
706 	    0);
707 
708 	/* Dword writes to flash. */
709 	dwptr = (uint32_t *)buf;
710 	for (i = 0; i < bytes >> 2; i++, naddr++, dwptr++) {
711 		ret = qla24xx_write_flash_dword(ha,
712 		    nvram_data_to_access_addr(naddr),
713 		    cpu_to_le32(*dwptr));
714 		if (ret != QLA_SUCCESS) {
715 			DEBUG9(printk("%s(%ld) Unable to program "
716 			    "nvram address=%x data=%x.\n", __func__,
717 			    ha->host_no, naddr, *dwptr));
718 			break;
719 		}
720 	}
721 
722 	/* Enable NVRAM write-protection. */
723 	qla24xx_write_flash_dword(ha, nvram_conf_to_access_addr(0x101),
724 	    0x8c);
725 
726 	/* Disable flash write. */
727 	WRT_REG_DWORD(&reg->ctrl_status,
728 	    RD_REG_DWORD(&reg->ctrl_status) & ~CSRX_FLASH_ENABLE);
729 	RD_REG_DWORD(&reg->ctrl_status);	/* PCI Posting. */
730 
731 	/* Release RISC pause. */
732 	WRT_REG_DWORD(&reg->hccr, HCCRX_REL_RISC_PAUSE);
733 	RD_REG_DWORD(&reg->hccr);		/* PCI Posting. */
734 
735 	return ret;
736 }
737