ipr.c revision 473b1e8ed2e4f545de22e58c8c073471b18459e8
1/*
2 * ipr.c -- driver for IBM Power Linux RAID adapters
3 *
4 * Written By: Brian King <brking@us.ibm.com>, IBM Corporation
5 *
6 * Copyright (C) 2003, 2004 IBM Corporation
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21 *
22 */
23
24/*
25 * Notes:
26 *
27 * This driver is used to control the following SCSI adapters:
28 *
29 * IBM iSeries: 5702, 5703, 2780, 5709, 570A, 570B
30 *
31 * IBM pSeries: PCI-X Dual Channel Ultra 320 SCSI RAID Adapter
32 *              PCI-X Dual Channel Ultra 320 SCSI Adapter
33 *              PCI-X Dual Channel Ultra 320 SCSI RAID Enablement Card
34 *              Embedded SCSI adapter on p615 and p655 systems
35 *
36 * Supported Hardware Features:
37 *	- Ultra 320 SCSI controller
38 *	- PCI-X host interface
39 *	- Embedded PowerPC RISC Processor and Hardware XOR DMA Engine
40 *	- Non-Volatile Write Cache
41 *	- Supports attachment of non-RAID disks, tape, and optical devices
42 *	- RAID Levels 0, 5, 10
43 *	- Hot spare
44 *	- Background Parity Checking
45 *	- Background Data Scrubbing
46 *	- Ability to increase the capacity of an existing RAID 5 disk array
47 *		by adding disks
48 *
49 * Driver Features:
50 *	- Tagged command queuing
51 *	- Adapter microcode download
52 *	- PCI hot plug
53 *	- SCSI device hot plug
54 *
55 */
56
57#include <linux/fs.h>
58#include <linux/init.h>
59#include <linux/types.h>
60#include <linux/errno.h>
61#include <linux/kernel.h>
62#include <linux/ioport.h>
63#include <linux/delay.h>
64#include <linux/pci.h>
65#include <linux/wait.h>
66#include <linux/spinlock.h>
67#include <linux/sched.h>
68#include <linux/interrupt.h>
69#include <linux/blkdev.h>
70#include <linux/firmware.h>
71#include <linux/module.h>
72#include <linux/moduleparam.h>
73#include <linux/libata.h>
74#include <asm/io.h>
75#include <asm/irq.h>
76#include <asm/processor.h>
77#include <scsi/scsi.h>
78#include <scsi/scsi_host.h>
79#include <scsi/scsi_tcq.h>
80#include <scsi/scsi_eh.h>
81#include <scsi/scsi_cmnd.h>
82#include "ipr.h"
83
84/*
85 *   Global Data
86 */
87static struct list_head ipr_ioa_head = LIST_HEAD_INIT(ipr_ioa_head);
88static unsigned int ipr_log_level = IPR_DEFAULT_LOG_LEVEL;
89static unsigned int ipr_max_speed = 1;
90static int ipr_testmode = 0;
91static unsigned int ipr_fastfail = 0;
92static unsigned int ipr_transop_timeout = 0;
93static unsigned int ipr_enable_cache = 1;
94static unsigned int ipr_debug = 0;
95static unsigned int ipr_dual_ioa_raid = 1;
96static DEFINE_SPINLOCK(ipr_driver_lock);
97
98/* This table describes the differences between DMA controller chips */
99static const struct ipr_chip_cfg_t ipr_chip_cfg[] = {
100	{ /* Gemstone, Citrine, Obsidian, and Obsidian-E */
101		.mailbox = 0x0042C,
102		.cache_line_size = 0x20,
103		{
104			.set_interrupt_mask_reg = 0x0022C,
105			.clr_interrupt_mask_reg = 0x00230,
106			.sense_interrupt_mask_reg = 0x0022C,
107			.clr_interrupt_reg = 0x00228,
108			.sense_interrupt_reg = 0x00224,
109			.ioarrin_reg = 0x00404,
110			.sense_uproc_interrupt_reg = 0x00214,
111			.set_uproc_interrupt_reg = 0x00214,
112			.clr_uproc_interrupt_reg = 0x00218
113		}
114	},
115	{ /* Snipe and Scamp */
116		.mailbox = 0x0052C,
117		.cache_line_size = 0x20,
118		{
119			.set_interrupt_mask_reg = 0x00288,
120			.clr_interrupt_mask_reg = 0x0028C,
121			.sense_interrupt_mask_reg = 0x00288,
122			.clr_interrupt_reg = 0x00284,
123			.sense_interrupt_reg = 0x00280,
124			.ioarrin_reg = 0x00504,
125			.sense_uproc_interrupt_reg = 0x00290,
126			.set_uproc_interrupt_reg = 0x00290,
127			.clr_uproc_interrupt_reg = 0x00294
128		}
129	},
130};
131
132static const struct ipr_chip_t ipr_chip[] = {
133	{ PCI_VENDOR_ID_MYLEX, PCI_DEVICE_ID_IBM_GEMSTONE, &ipr_chip_cfg[0] },
134	{ PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CITRINE, &ipr_chip_cfg[0] },
135	{ PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_OBSIDIAN, &ipr_chip_cfg[0] },
136	{ PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN, &ipr_chip_cfg[0] },
137	{ PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN_E, &ipr_chip_cfg[0] },
138	{ PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_SNIPE, &ipr_chip_cfg[1] },
139	{ PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_SCAMP, &ipr_chip_cfg[1] }
140};
141
142static int ipr_max_bus_speeds [] = {
143	IPR_80MBs_SCSI_RATE, IPR_U160_SCSI_RATE, IPR_U320_SCSI_RATE
144};
145
146MODULE_AUTHOR("Brian King <brking@us.ibm.com>");
147MODULE_DESCRIPTION("IBM Power RAID SCSI Adapter Driver");
148module_param_named(max_speed, ipr_max_speed, uint, 0);
149MODULE_PARM_DESC(max_speed, "Maximum bus speed (0-2). Default: 1=U160. Speeds: 0=80 MB/s, 1=U160, 2=U320");
150module_param_named(log_level, ipr_log_level, uint, 0);
151MODULE_PARM_DESC(log_level, "Set to 0 - 4 for increasing verbosity of device driver");
152module_param_named(testmode, ipr_testmode, int, 0);
153MODULE_PARM_DESC(testmode, "DANGEROUS!!! Allows unsupported configurations");
154module_param_named(fastfail, ipr_fastfail, int, 0);
155MODULE_PARM_DESC(fastfail, "Reduce timeouts and retries");
156module_param_named(transop_timeout, ipr_transop_timeout, int, 0);
157MODULE_PARM_DESC(transop_timeout, "Time in seconds to wait for adapter to come operational (default: 300)");
158module_param_named(enable_cache, ipr_enable_cache, int, 0);
159MODULE_PARM_DESC(enable_cache, "Enable adapter's non-volatile write cache (default: 1)");
160module_param_named(debug, ipr_debug, int, 0);
161MODULE_PARM_DESC(debug, "Enable device driver debugging logging. Set to 1 to enable. (default: 0)");
162module_param_named(dual_ioa_raid, ipr_dual_ioa_raid, int, 0);
163MODULE_PARM_DESC(dual_ioa_raid, "Enable dual adapter RAID support. Set to 1 to enable. (default: 1)");
164MODULE_LICENSE("GPL");
165MODULE_VERSION(IPR_DRIVER_VERSION);
166
167/*  A constant array of IOASCs/URCs/Error Messages */
168static const
169struct ipr_error_table_t ipr_error_table[] = {
170	{0x00000000, 1, IPR_DEFAULT_LOG_LEVEL,
171	"8155: An unknown error was received"},
172	{0x00330000, 0, 0,
173	"Soft underlength error"},
174	{0x005A0000, 0, 0,
175	"Command to be cancelled not found"},
176	{0x00808000, 0, 0,
177	"Qualified success"},
178	{0x01080000, 1, IPR_DEFAULT_LOG_LEVEL,
179	"FFFE: Soft device bus error recovered by the IOA"},
180	{0x01088100, 0, IPR_DEFAULT_LOG_LEVEL,
181	"4101: Soft device bus fabric error"},
182	{0x01170600, 0, IPR_DEFAULT_LOG_LEVEL,
183	"FFF9: Device sector reassign successful"},
184	{0x01170900, 0, IPR_DEFAULT_LOG_LEVEL,
185	"FFF7: Media error recovered by device rewrite procedures"},
186	{0x01180200, 0, IPR_DEFAULT_LOG_LEVEL,
187	"7001: IOA sector reassignment successful"},
188	{0x01180500, 0, IPR_DEFAULT_LOG_LEVEL,
189	"FFF9: Soft media error. Sector reassignment recommended"},
190	{0x01180600, 0, IPR_DEFAULT_LOG_LEVEL,
191	"FFF7: Media error recovered by IOA rewrite procedures"},
192	{0x01418000, 0, IPR_DEFAULT_LOG_LEVEL,
193	"FF3D: Soft PCI bus error recovered by the IOA"},
194	{0x01440000, 1, IPR_DEFAULT_LOG_LEVEL,
195	"FFF6: Device hardware error recovered by the IOA"},
196	{0x01448100, 0, IPR_DEFAULT_LOG_LEVEL,
197	"FFF6: Device hardware error recovered by the device"},
198	{0x01448200, 1, IPR_DEFAULT_LOG_LEVEL,
199	"FF3D: Soft IOA error recovered by the IOA"},
200	{0x01448300, 0, IPR_DEFAULT_LOG_LEVEL,
201	"FFFA: Undefined device response recovered by the IOA"},
202	{0x014A0000, 1, IPR_DEFAULT_LOG_LEVEL,
203	"FFF6: Device bus error, message or command phase"},
204	{0x014A8000, 0, IPR_DEFAULT_LOG_LEVEL,
205	"FFFE: Task Management Function failed"},
206	{0x015D0000, 0, IPR_DEFAULT_LOG_LEVEL,
207	"FFF6: Failure prediction threshold exceeded"},
208	{0x015D9200, 0, IPR_DEFAULT_LOG_LEVEL,
209	"8009: Impending cache battery pack failure"},
210	{0x02040400, 0, 0,
211	"34FF: Disk device format in progress"},
212	{0x02048000, 0, IPR_DEFAULT_LOG_LEVEL,
213	"9070: IOA requested reset"},
214	{0x023F0000, 0, 0,
215	"Synchronization required"},
216	{0x024E0000, 0, 0,
217	"No ready, IOA shutdown"},
218	{0x025A0000, 0, 0,
219	"Not ready, IOA has been shutdown"},
220	{0x02670100, 0, IPR_DEFAULT_LOG_LEVEL,
221	"3020: Storage subsystem configuration error"},
222	{0x03110B00, 0, 0,
223	"FFF5: Medium error, data unreadable, recommend reassign"},
224	{0x03110C00, 0, 0,
225	"7000: Medium error, data unreadable, do not reassign"},
226	{0x03310000, 0, IPR_DEFAULT_LOG_LEVEL,
227	"FFF3: Disk media format bad"},
228	{0x04050000, 0, IPR_DEFAULT_LOG_LEVEL,
229	"3002: Addressed device failed to respond to selection"},
230	{0x04080000, 1, IPR_DEFAULT_LOG_LEVEL,
231	"3100: Device bus error"},
232	{0x04080100, 0, IPR_DEFAULT_LOG_LEVEL,
233	"3109: IOA timed out a device command"},
234	{0x04088000, 0, 0,
235	"3120: SCSI bus is not operational"},
236	{0x04088100, 0, IPR_DEFAULT_LOG_LEVEL,
237	"4100: Hard device bus fabric error"},
238	{0x04118000, 0, IPR_DEFAULT_LOG_LEVEL,
239	"9000: IOA reserved area data check"},
240	{0x04118100, 0, IPR_DEFAULT_LOG_LEVEL,
241	"9001: IOA reserved area invalid data pattern"},
242	{0x04118200, 0, IPR_DEFAULT_LOG_LEVEL,
243	"9002: IOA reserved area LRC error"},
244	{0x04320000, 0, IPR_DEFAULT_LOG_LEVEL,
245	"102E: Out of alternate sectors for disk storage"},
246	{0x04330000, 1, IPR_DEFAULT_LOG_LEVEL,
247	"FFF4: Data transfer underlength error"},
248	{0x04338000, 1, IPR_DEFAULT_LOG_LEVEL,
249	"FFF4: Data transfer overlength error"},
250	{0x043E0100, 0, IPR_DEFAULT_LOG_LEVEL,
251	"3400: Logical unit failure"},
252	{0x04408500, 0, IPR_DEFAULT_LOG_LEVEL,
253	"FFF4: Device microcode is corrupt"},
254	{0x04418000, 1, IPR_DEFAULT_LOG_LEVEL,
255	"8150: PCI bus error"},
256	{0x04430000, 1, 0,
257	"Unsupported device bus message received"},
258	{0x04440000, 1, IPR_DEFAULT_LOG_LEVEL,
259	"FFF4: Disk device problem"},
260	{0x04448200, 1, IPR_DEFAULT_LOG_LEVEL,
261	"8150: Permanent IOA failure"},
262	{0x04448300, 0, IPR_DEFAULT_LOG_LEVEL,
263	"3010: Disk device returned wrong response to IOA"},
264	{0x04448400, 0, IPR_DEFAULT_LOG_LEVEL,
265	"8151: IOA microcode error"},
266	{0x04448500, 0, 0,
267	"Device bus status error"},
268	{0x04448600, 0, IPR_DEFAULT_LOG_LEVEL,
269	"8157: IOA error requiring IOA reset to recover"},
270	{0x04448700, 0, 0,
271	"ATA device status error"},
272	{0x04490000, 0, 0,
273	"Message reject received from the device"},
274	{0x04449200, 0, IPR_DEFAULT_LOG_LEVEL,
275	"8008: A permanent cache battery pack failure occurred"},
276	{0x0444A000, 0, IPR_DEFAULT_LOG_LEVEL,
277	"9090: Disk unit has been modified after the last known status"},
278	{0x0444A200, 0, IPR_DEFAULT_LOG_LEVEL,
279	"9081: IOA detected device error"},
280	{0x0444A300, 0, IPR_DEFAULT_LOG_LEVEL,
281	"9082: IOA detected device error"},
282	{0x044A0000, 1, IPR_DEFAULT_LOG_LEVEL,
283	"3110: Device bus error, message or command phase"},
284	{0x044A8000, 1, IPR_DEFAULT_LOG_LEVEL,
285	"3110: SAS Command / Task Management Function failed"},
286	{0x04670400, 0, IPR_DEFAULT_LOG_LEVEL,
287	"9091: Incorrect hardware configuration change has been detected"},
288	{0x04678000, 0, IPR_DEFAULT_LOG_LEVEL,
289	"9073: Invalid multi-adapter configuration"},
290	{0x04678100, 0, IPR_DEFAULT_LOG_LEVEL,
291	"4010: Incorrect connection between cascaded expanders"},
292	{0x04678200, 0, IPR_DEFAULT_LOG_LEVEL,
293	"4020: Connections exceed IOA design limits"},
294	{0x04678300, 0, IPR_DEFAULT_LOG_LEVEL,
295	"4030: Incorrect multipath connection"},
296	{0x04679000, 0, IPR_DEFAULT_LOG_LEVEL,
297	"4110: Unsupported enclosure function"},
298	{0x046E0000, 0, IPR_DEFAULT_LOG_LEVEL,
299	"FFF4: Command to logical unit failed"},
300	{0x05240000, 1, 0,
301	"Illegal request, invalid request type or request packet"},
302	{0x05250000, 0, 0,
303	"Illegal request, invalid resource handle"},
304	{0x05258000, 0, 0,
305	"Illegal request, commands not allowed to this device"},
306	{0x05258100, 0, 0,
307	"Illegal request, command not allowed to a secondary adapter"},
308	{0x05260000, 0, 0,
309	"Illegal request, invalid field in parameter list"},
310	{0x05260100, 0, 0,
311	"Illegal request, parameter not supported"},
312	{0x05260200, 0, 0,
313	"Illegal request, parameter value invalid"},
314	{0x052C0000, 0, 0,
315	"Illegal request, command sequence error"},
316	{0x052C8000, 1, 0,
317	"Illegal request, dual adapter support not enabled"},
318	{0x06040500, 0, IPR_DEFAULT_LOG_LEVEL,
319	"9031: Array protection temporarily suspended, protection resuming"},
320	{0x06040600, 0, IPR_DEFAULT_LOG_LEVEL,
321	"9040: Array protection temporarily suspended, protection resuming"},
322	{0x06288000, 0, IPR_DEFAULT_LOG_LEVEL,
323	"3140: Device bus not ready to ready transition"},
324	{0x06290000, 0, IPR_DEFAULT_LOG_LEVEL,
325	"FFFB: SCSI bus was reset"},
326	{0x06290500, 0, 0,
327	"FFFE: SCSI bus transition to single ended"},
328	{0x06290600, 0, 0,
329	"FFFE: SCSI bus transition to LVD"},
330	{0x06298000, 0, IPR_DEFAULT_LOG_LEVEL,
331	"FFFB: SCSI bus was reset by another initiator"},
332	{0x063F0300, 0, IPR_DEFAULT_LOG_LEVEL,
333	"3029: A device replacement has occurred"},
334	{0x064C8000, 0, IPR_DEFAULT_LOG_LEVEL,
335	"9051: IOA cache data exists for a missing or failed device"},
336	{0x064C8100, 0, IPR_DEFAULT_LOG_LEVEL,
337	"9055: Auxiliary cache IOA contains cache data needed by the primary IOA"},
338	{0x06670100, 0, IPR_DEFAULT_LOG_LEVEL,
339	"9025: Disk unit is not supported at its physical location"},
340	{0x06670600, 0, IPR_DEFAULT_LOG_LEVEL,
341	"3020: IOA detected a SCSI bus configuration error"},
342	{0x06678000, 0, IPR_DEFAULT_LOG_LEVEL,
343	"3150: SCSI bus configuration error"},
344	{0x06678100, 0, IPR_DEFAULT_LOG_LEVEL,
345	"9074: Asymmetric advanced function disk configuration"},
346	{0x06678300, 0, IPR_DEFAULT_LOG_LEVEL,
347	"4040: Incomplete multipath connection between IOA and enclosure"},
348	{0x06678400, 0, IPR_DEFAULT_LOG_LEVEL,
349	"4041: Incomplete multipath connection between enclosure and device"},
350	{0x06678500, 0, IPR_DEFAULT_LOG_LEVEL,
351	"9075: Incomplete multipath connection between IOA and remote IOA"},
352	{0x06678600, 0, IPR_DEFAULT_LOG_LEVEL,
353	"9076: Configuration error, missing remote IOA"},
354	{0x06679100, 0, IPR_DEFAULT_LOG_LEVEL,
355	"4050: Enclosure does not support a required multipath function"},
356	{0x06690200, 0, IPR_DEFAULT_LOG_LEVEL,
357	"9041: Array protection temporarily suspended"},
358	{0x06698200, 0, IPR_DEFAULT_LOG_LEVEL,
359	"9042: Corrupt array parity detected on specified device"},
360	{0x066B0200, 0, IPR_DEFAULT_LOG_LEVEL,
361	"9030: Array no longer protected due to missing or failed disk unit"},
362	{0x066B8000, 0, IPR_DEFAULT_LOG_LEVEL,
363	"9071: Link operational transition"},
364	{0x066B8100, 0, IPR_DEFAULT_LOG_LEVEL,
365	"9072: Link not operational transition"},
366	{0x066B8200, 0, IPR_DEFAULT_LOG_LEVEL,
367	"9032: Array exposed but still protected"},
368	{0x066B8300, 0, IPR_DEFAULT_LOG_LEVEL + 1,
369	"70DD: Device forced failed by disrupt device command"},
370	{0x066B9100, 0, IPR_DEFAULT_LOG_LEVEL,
371	"4061: Multipath redundancy level got better"},
372	{0x066B9200, 0, IPR_DEFAULT_LOG_LEVEL,
373	"4060: Multipath redundancy level got worse"},
374	{0x07270000, 0, 0,
375	"Failure due to other device"},
376	{0x07278000, 0, IPR_DEFAULT_LOG_LEVEL,
377	"9008: IOA does not support functions expected by devices"},
378	{0x07278100, 0, IPR_DEFAULT_LOG_LEVEL,
379	"9010: Cache data associated with attached devices cannot be found"},
380	{0x07278200, 0, IPR_DEFAULT_LOG_LEVEL,
381	"9011: Cache data belongs to devices other than those attached"},
382	{0x07278400, 0, IPR_DEFAULT_LOG_LEVEL,
383	"9020: Array missing 2 or more devices with only 1 device present"},
384	{0x07278500, 0, IPR_DEFAULT_LOG_LEVEL,
385	"9021: Array missing 2 or more devices with 2 or more devices present"},
386	{0x07278600, 0, IPR_DEFAULT_LOG_LEVEL,
387	"9022: Exposed array is missing a required device"},
388	{0x07278700, 0, IPR_DEFAULT_LOG_LEVEL,
389	"9023: Array member(s) not at required physical locations"},
390	{0x07278800, 0, IPR_DEFAULT_LOG_LEVEL,
391	"9024: Array not functional due to present hardware configuration"},
392	{0x07278900, 0, IPR_DEFAULT_LOG_LEVEL,
393	"9026: Array not functional due to present hardware configuration"},
394	{0x07278A00, 0, IPR_DEFAULT_LOG_LEVEL,
395	"9027: Array is missing a device and parity is out of sync"},
396	{0x07278B00, 0, IPR_DEFAULT_LOG_LEVEL,
397	"9028: Maximum number of arrays already exist"},
398	{0x07278C00, 0, IPR_DEFAULT_LOG_LEVEL,
399	"9050: Required cache data cannot be located for a disk unit"},
400	{0x07278D00, 0, IPR_DEFAULT_LOG_LEVEL,
401	"9052: Cache data exists for a device that has been modified"},
402	{0x07278F00, 0, IPR_DEFAULT_LOG_LEVEL,
403	"9054: IOA resources not available due to previous problems"},
404	{0x07279100, 0, IPR_DEFAULT_LOG_LEVEL,
405	"9092: Disk unit requires initialization before use"},
406	{0x07279200, 0, IPR_DEFAULT_LOG_LEVEL,
407	"9029: Incorrect hardware configuration change has been detected"},
408	{0x07279600, 0, IPR_DEFAULT_LOG_LEVEL,
409	"9060: One or more disk pairs are missing from an array"},
410	{0x07279700, 0, IPR_DEFAULT_LOG_LEVEL,
411	"9061: One or more disks are missing from an array"},
412	{0x07279800, 0, IPR_DEFAULT_LOG_LEVEL,
413	"9062: One or more disks are missing from an array"},
414	{0x07279900, 0, IPR_DEFAULT_LOG_LEVEL,
415	"9063: Maximum number of functional arrays has been exceeded"},
416	{0x0B260000, 0, 0,
417	"Aborted command, invalid descriptor"},
418	{0x0B5A0000, 0, 0,
419	"Command terminated by host"}
420};
421
422static const struct ipr_ses_table_entry ipr_ses_table[] = {
423	{ "2104-DL1        ", "XXXXXXXXXXXXXXXX", 80 },
424	{ "2104-TL1        ", "XXXXXXXXXXXXXXXX", 80 },
425	{ "HSBP07M P U2SCSI", "XXXXXXXXXXXXXXXX", 80 }, /* Hidive 7 slot */
426	{ "HSBP05M P U2SCSI", "XXXXXXXXXXXXXXXX", 80 }, /* Hidive 5 slot */
427	{ "HSBP05M S U2SCSI", "XXXXXXXXXXXXXXXX", 80 }, /* Bowtie */
428	{ "HSBP06E ASU2SCSI", "XXXXXXXXXXXXXXXX", 80 }, /* MartinFenning */
429	{ "2104-DU3        ", "XXXXXXXXXXXXXXXX", 160 },
430	{ "2104-TU3        ", "XXXXXXXXXXXXXXXX", 160 },
431	{ "HSBP04C RSU2SCSI", "XXXXXXX*XXXXXXXX", 160 },
432	{ "HSBP06E RSU2SCSI", "XXXXXXX*XXXXXXXX", 160 },
433	{ "St  V1S2        ", "XXXXXXXXXXXXXXXX", 160 },
434	{ "HSBPD4M  PU3SCSI", "XXXXXXX*XXXXXXXX", 160 },
435	{ "VSBPD1H   U3SCSI", "XXXXXXX*XXXXXXXX", 160 }
436};
437
438/*
439 *  Function Prototypes
440 */
441static int ipr_reset_alert(struct ipr_cmnd *);
442static void ipr_process_ccn(struct ipr_cmnd *);
443static void ipr_process_error(struct ipr_cmnd *);
444static void ipr_reset_ioa_job(struct ipr_cmnd *);
445static void ipr_initiate_ioa_reset(struct ipr_ioa_cfg *,
446				   enum ipr_shutdown_type);
447
448#ifdef CONFIG_SCSI_IPR_TRACE
449/**
450 * ipr_trc_hook - Add a trace entry to the driver trace
451 * @ipr_cmd:	ipr command struct
452 * @type:		trace type
453 * @add_data:	additional data
454 *
455 * Return value:
456 * 	none
457 **/
458static void ipr_trc_hook(struct ipr_cmnd *ipr_cmd,
459			 u8 type, u32 add_data)
460{
461	struct ipr_trace_entry *trace_entry;
462	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
463
464	trace_entry = &ioa_cfg->trace[ioa_cfg->trace_index++];
465	trace_entry->time = jiffies;
466	trace_entry->op_code = ipr_cmd->ioarcb.cmd_pkt.cdb[0];
467	trace_entry->type = type;
468	trace_entry->ata_op_code = ipr_cmd->ioarcb.add_data.u.regs.command;
469	trace_entry->cmd_index = ipr_cmd->cmd_index & 0xff;
470	trace_entry->res_handle = ipr_cmd->ioarcb.res_handle;
471	trace_entry->u.add_data = add_data;
472}
473#else
474#define ipr_trc_hook(ipr_cmd, type, add_data) do { } while(0)
475#endif
476
477/**
478 * ipr_reinit_ipr_cmnd - Re-initialize an IPR Cmnd block for reuse
479 * @ipr_cmd:	ipr command struct
480 *
481 * Return value:
482 * 	none
483 **/
484static void ipr_reinit_ipr_cmnd(struct ipr_cmnd *ipr_cmd)
485{
486	struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
487	struct ipr_ioasa *ioasa = &ipr_cmd->ioasa;
488	dma_addr_t dma_addr = be32_to_cpu(ioarcb->ioarcb_host_pci_addr);
489
490	memset(&ioarcb->cmd_pkt, 0, sizeof(struct ipr_cmd_pkt));
491	ioarcb->write_data_transfer_length = 0;
492	ioarcb->read_data_transfer_length = 0;
493	ioarcb->write_ioadl_len = 0;
494	ioarcb->read_ioadl_len = 0;
495	ioarcb->write_ioadl_addr =
496		cpu_to_be32(dma_addr + offsetof(struct ipr_cmnd, ioadl));
497	ioarcb->read_ioadl_addr = ioarcb->write_ioadl_addr;
498	ioasa->ioasc = 0;
499	ioasa->residual_data_len = 0;
500	ioasa->u.gata.status = 0;
501
502	ipr_cmd->scsi_cmd = NULL;
503	ipr_cmd->qc = NULL;
504	ipr_cmd->sense_buffer[0] = 0;
505	ipr_cmd->dma_use_sg = 0;
506}
507
508/**
509 * ipr_init_ipr_cmnd - Initialize an IPR Cmnd block
510 * @ipr_cmd:	ipr command struct
511 *
512 * Return value:
513 * 	none
514 **/
515static void ipr_init_ipr_cmnd(struct ipr_cmnd *ipr_cmd)
516{
517	ipr_reinit_ipr_cmnd(ipr_cmd);
518	ipr_cmd->u.scratch = 0;
519	ipr_cmd->sibling = NULL;
520	init_timer(&ipr_cmd->timer);
521}
522
523/**
524 * ipr_get_free_ipr_cmnd - Get a free IPR Cmnd block
525 * @ioa_cfg:	ioa config struct
526 *
527 * Return value:
528 * 	pointer to ipr command struct
529 **/
530static
531struct ipr_cmnd *ipr_get_free_ipr_cmnd(struct ipr_ioa_cfg *ioa_cfg)
532{
533	struct ipr_cmnd *ipr_cmd;
534
535	ipr_cmd = list_entry(ioa_cfg->free_q.next, struct ipr_cmnd, queue);
536	list_del(&ipr_cmd->queue);
537	ipr_init_ipr_cmnd(ipr_cmd);
538
539	return ipr_cmd;
540}
541
542/**
543 * ipr_unmap_sglist - Unmap scatterlist if mapped
544 * @ioa_cfg:	ioa config struct
545 * @ipr_cmd:	ipr command struct
546 *
547 * Return value:
548 * 	nothing
549 **/
550static void ipr_unmap_sglist(struct ipr_ioa_cfg *ioa_cfg,
551			     struct ipr_cmnd *ipr_cmd)
552{
553	struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
554
555	if (ipr_cmd->dma_use_sg) {
556		if (scsi_cmd->use_sg > 0) {
557			pci_unmap_sg(ioa_cfg->pdev, scsi_cmd->request_buffer,
558				     scsi_cmd->use_sg,
559				     scsi_cmd->sc_data_direction);
560		} else {
561			pci_unmap_single(ioa_cfg->pdev, ipr_cmd->dma_handle,
562					 scsi_cmd->request_bufflen,
563					 scsi_cmd->sc_data_direction);
564		}
565	}
566}
567
568/**
569 * ipr_mask_and_clear_interrupts - Mask all and clear specified interrupts
570 * @ioa_cfg:	ioa config struct
571 * @clr_ints:     interrupts to clear
572 *
573 * This function masks all interrupts on the adapter, then clears the
574 * interrupts specified in the mask
575 *
576 * Return value:
577 * 	none
578 **/
579static void ipr_mask_and_clear_interrupts(struct ipr_ioa_cfg *ioa_cfg,
580					  u32 clr_ints)
581{
582	volatile u32 int_reg;
583
584	/* Stop new interrupts */
585	ioa_cfg->allow_interrupts = 0;
586
587	/* Set interrupt mask to stop all new interrupts */
588	writel(~0, ioa_cfg->regs.set_interrupt_mask_reg);
589
590	/* Clear any pending interrupts */
591	writel(clr_ints, ioa_cfg->regs.clr_interrupt_reg);
592	int_reg = readl(ioa_cfg->regs.sense_interrupt_reg);
593}
594
595/**
596 * ipr_save_pcix_cmd_reg - Save PCI-X command register
597 * @ioa_cfg:	ioa config struct
598 *
599 * Return value:
600 * 	0 on success / -EIO on failure
601 **/
602static int ipr_save_pcix_cmd_reg(struct ipr_ioa_cfg *ioa_cfg)
603{
604	int pcix_cmd_reg = pci_find_capability(ioa_cfg->pdev, PCI_CAP_ID_PCIX);
605
606	if (pcix_cmd_reg == 0)
607		return 0;
608
609	if (pci_read_config_word(ioa_cfg->pdev, pcix_cmd_reg + PCI_X_CMD,
610				 &ioa_cfg->saved_pcix_cmd_reg) != PCIBIOS_SUCCESSFUL) {
611		dev_err(&ioa_cfg->pdev->dev, "Failed to save PCI-X command register\n");
612		return -EIO;
613	}
614
615	ioa_cfg->saved_pcix_cmd_reg |= PCI_X_CMD_DPERR_E | PCI_X_CMD_ERO;
616	return 0;
617}
618
619/**
620 * ipr_set_pcix_cmd_reg - Setup PCI-X command register
621 * @ioa_cfg:	ioa config struct
622 *
623 * Return value:
624 * 	0 on success / -EIO on failure
625 **/
626static int ipr_set_pcix_cmd_reg(struct ipr_ioa_cfg *ioa_cfg)
627{
628	int pcix_cmd_reg = pci_find_capability(ioa_cfg->pdev, PCI_CAP_ID_PCIX);
629
630	if (pcix_cmd_reg) {
631		if (pci_write_config_word(ioa_cfg->pdev, pcix_cmd_reg + PCI_X_CMD,
632					  ioa_cfg->saved_pcix_cmd_reg) != PCIBIOS_SUCCESSFUL) {
633			dev_err(&ioa_cfg->pdev->dev, "Failed to setup PCI-X command register\n");
634			return -EIO;
635		}
636	}
637
638	return 0;
639}
640
641/**
642 * ipr_sata_eh_done - done function for aborted SATA commands
643 * @ipr_cmd:	ipr command struct
644 *
645 * This function is invoked for ops generated to SATA
646 * devices which are being aborted.
647 *
648 * Return value:
649 * 	none
650 **/
651static void ipr_sata_eh_done(struct ipr_cmnd *ipr_cmd)
652{
653	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
654	struct ata_queued_cmd *qc = ipr_cmd->qc;
655	struct ipr_sata_port *sata_port = qc->ap->private_data;
656
657	qc->err_mask |= AC_ERR_OTHER;
658	sata_port->ioasa.status |= ATA_BUSY;
659	list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q);
660	ata_qc_complete(qc);
661}
662
663/**
664 * ipr_scsi_eh_done - mid-layer done function for aborted ops
665 * @ipr_cmd:	ipr command struct
666 *
667 * This function is invoked by the interrupt handler for
668 * ops generated by the SCSI mid-layer which are being aborted.
669 *
670 * Return value:
671 * 	none
672 **/
673static void ipr_scsi_eh_done(struct ipr_cmnd *ipr_cmd)
674{
675	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
676	struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
677
678	scsi_cmd->result |= (DID_ERROR << 16);
679
680	ipr_unmap_sglist(ioa_cfg, ipr_cmd);
681	scsi_cmd->scsi_done(scsi_cmd);
682	list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q);
683}
684
685/**
686 * ipr_fail_all_ops - Fails all outstanding ops.
687 * @ioa_cfg:	ioa config struct
688 *
689 * This function fails all outstanding ops.
690 *
691 * Return value:
692 * 	none
693 **/
694static void ipr_fail_all_ops(struct ipr_ioa_cfg *ioa_cfg)
695{
696	struct ipr_cmnd *ipr_cmd, *temp;
697
698	ENTER;
699	list_for_each_entry_safe(ipr_cmd, temp, &ioa_cfg->pending_q, queue) {
700		list_del(&ipr_cmd->queue);
701
702		ipr_cmd->ioasa.ioasc = cpu_to_be32(IPR_IOASC_IOA_WAS_RESET);
703		ipr_cmd->ioasa.ilid = cpu_to_be32(IPR_DRIVER_ILID);
704
705		if (ipr_cmd->scsi_cmd)
706			ipr_cmd->done = ipr_scsi_eh_done;
707		else if (ipr_cmd->qc)
708			ipr_cmd->done = ipr_sata_eh_done;
709
710		ipr_trc_hook(ipr_cmd, IPR_TRACE_FINISH, IPR_IOASC_IOA_WAS_RESET);
711		del_timer(&ipr_cmd->timer);
712		ipr_cmd->done(ipr_cmd);
713	}
714
715	LEAVE;
716}
717
718/**
719 * ipr_do_req -  Send driver initiated requests.
720 * @ipr_cmd:		ipr command struct
721 * @done:			done function
722 * @timeout_func:	timeout function
723 * @timeout:		timeout value
724 *
725 * This function sends the specified command to the adapter with the
726 * timeout given. The done function is invoked on command completion.
727 *
728 * Return value:
729 * 	none
730 **/
731static void ipr_do_req(struct ipr_cmnd *ipr_cmd,
732		       void (*done) (struct ipr_cmnd *),
733		       void (*timeout_func) (struct ipr_cmnd *), u32 timeout)
734{
735	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
736
737	list_add_tail(&ipr_cmd->queue, &ioa_cfg->pending_q);
738
739	ipr_cmd->done = done;
740
741	ipr_cmd->timer.data = (unsigned long) ipr_cmd;
742	ipr_cmd->timer.expires = jiffies + timeout;
743	ipr_cmd->timer.function = (void (*)(unsigned long))timeout_func;
744
745	add_timer(&ipr_cmd->timer);
746
747	ipr_trc_hook(ipr_cmd, IPR_TRACE_START, 0);
748
749	mb();
750	writel(be32_to_cpu(ipr_cmd->ioarcb.ioarcb_host_pci_addr),
751	       ioa_cfg->regs.ioarrin_reg);
752}
753
754/**
755 * ipr_internal_cmd_done - Op done function for an internally generated op.
756 * @ipr_cmd:	ipr command struct
757 *
758 * This function is the op done function for an internally generated,
759 * blocking op. It simply wakes the sleeping thread.
760 *
761 * Return value:
762 * 	none
763 **/
764static void ipr_internal_cmd_done(struct ipr_cmnd *ipr_cmd)
765{
766	if (ipr_cmd->sibling)
767		ipr_cmd->sibling = NULL;
768	else
769		complete(&ipr_cmd->completion);
770}
771
772/**
773 * ipr_send_blocking_cmd - Send command and sleep on its completion.
774 * @ipr_cmd:	ipr command struct
775 * @timeout_func:	function to invoke if command times out
776 * @timeout:	timeout
777 *
778 * Return value:
779 * 	none
780 **/
781static void ipr_send_blocking_cmd(struct ipr_cmnd *ipr_cmd,
782				  void (*timeout_func) (struct ipr_cmnd *ipr_cmd),
783				  u32 timeout)
784{
785	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
786
787	init_completion(&ipr_cmd->completion);
788	ipr_do_req(ipr_cmd, ipr_internal_cmd_done, timeout_func, timeout);
789
790	spin_unlock_irq(ioa_cfg->host->host_lock);
791	wait_for_completion(&ipr_cmd->completion);
792	spin_lock_irq(ioa_cfg->host->host_lock);
793}
794
795/**
796 * ipr_send_hcam - Send an HCAM to the adapter.
797 * @ioa_cfg:	ioa config struct
798 * @type:		HCAM type
799 * @hostrcb:	hostrcb struct
800 *
801 * This function will send a Host Controlled Async command to the adapter.
802 * If HCAMs are currently not allowed to be issued to the adapter, it will
803 * place the hostrcb on the free queue.
804 *
805 * Return value:
806 * 	none
807 **/
808static void ipr_send_hcam(struct ipr_ioa_cfg *ioa_cfg, u8 type,
809			  struct ipr_hostrcb *hostrcb)
810{
811	struct ipr_cmnd *ipr_cmd;
812	struct ipr_ioarcb *ioarcb;
813
814	if (ioa_cfg->allow_cmds) {
815		ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg);
816		list_add_tail(&ipr_cmd->queue, &ioa_cfg->pending_q);
817		list_add_tail(&hostrcb->queue, &ioa_cfg->hostrcb_pending_q);
818
819		ipr_cmd->u.hostrcb = hostrcb;
820		ioarcb = &ipr_cmd->ioarcb;
821
822		ioarcb->res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE);
823		ioarcb->cmd_pkt.request_type = IPR_RQTYPE_HCAM;
824		ioarcb->cmd_pkt.cdb[0] = IPR_HOST_CONTROLLED_ASYNC;
825		ioarcb->cmd_pkt.cdb[1] = type;
826		ioarcb->cmd_pkt.cdb[7] = (sizeof(hostrcb->hcam) >> 8) & 0xff;
827		ioarcb->cmd_pkt.cdb[8] = sizeof(hostrcb->hcam) & 0xff;
828
829		ioarcb->read_data_transfer_length = cpu_to_be32(sizeof(hostrcb->hcam));
830		ioarcb->read_ioadl_len = cpu_to_be32(sizeof(struct ipr_ioadl_desc));
831		ipr_cmd->ioadl[0].flags_and_data_len =
832			cpu_to_be32(IPR_IOADL_FLAGS_READ_LAST | sizeof(hostrcb->hcam));
833		ipr_cmd->ioadl[0].address = cpu_to_be32(hostrcb->hostrcb_dma);
834
835		if (type == IPR_HCAM_CDB_OP_CODE_CONFIG_CHANGE)
836			ipr_cmd->done = ipr_process_ccn;
837		else
838			ipr_cmd->done = ipr_process_error;
839
840		ipr_trc_hook(ipr_cmd, IPR_TRACE_START, IPR_IOA_RES_ADDR);
841
842		mb();
843		writel(be32_to_cpu(ipr_cmd->ioarcb.ioarcb_host_pci_addr),
844		       ioa_cfg->regs.ioarrin_reg);
845	} else {
846		list_add_tail(&hostrcb->queue, &ioa_cfg->hostrcb_free_q);
847	}
848}
849
850/**
851 * ipr_init_res_entry - Initialize a resource entry struct.
852 * @res:	resource entry struct
853 *
854 * Return value:
855 * 	none
856 **/
857static void ipr_init_res_entry(struct ipr_resource_entry *res)
858{
859	res->needs_sync_complete = 0;
860	res->in_erp = 0;
861	res->add_to_ml = 0;
862	res->del_from_ml = 0;
863	res->resetting_device = 0;
864	res->sdev = NULL;
865	res->sata_port = NULL;
866}
867
868/**
869 * ipr_handle_config_change - Handle a config change from the adapter
870 * @ioa_cfg:	ioa config struct
871 * @hostrcb:	hostrcb
872 *
873 * Return value:
874 * 	none
875 **/
876static void ipr_handle_config_change(struct ipr_ioa_cfg *ioa_cfg,
877			      struct ipr_hostrcb *hostrcb)
878{
879	struct ipr_resource_entry *res = NULL;
880	struct ipr_config_table_entry *cfgte;
881	u32 is_ndn = 1;
882
883	cfgte = &hostrcb->hcam.u.ccn.cfgte;
884
885	list_for_each_entry(res, &ioa_cfg->used_res_q, queue) {
886		if (!memcmp(&res->cfgte.res_addr, &cfgte->res_addr,
887			    sizeof(cfgte->res_addr))) {
888			is_ndn = 0;
889			break;
890		}
891	}
892
893	if (is_ndn) {
894		if (list_empty(&ioa_cfg->free_res_q)) {
895			ipr_send_hcam(ioa_cfg,
896				      IPR_HCAM_CDB_OP_CODE_CONFIG_CHANGE,
897				      hostrcb);
898			return;
899		}
900
901		res = list_entry(ioa_cfg->free_res_q.next,
902				 struct ipr_resource_entry, queue);
903
904		list_del(&res->queue);
905		ipr_init_res_entry(res);
906		list_add_tail(&res->queue, &ioa_cfg->used_res_q);
907	}
908
909	memcpy(&res->cfgte, cfgte, sizeof(struct ipr_config_table_entry));
910
911	if (hostrcb->hcam.notify_type == IPR_HOST_RCB_NOTIF_TYPE_REM_ENTRY) {
912		if (res->sdev) {
913			res->del_from_ml = 1;
914			res->cfgte.res_handle = IPR_INVALID_RES_HANDLE;
915			if (ioa_cfg->allow_ml_add_del)
916				schedule_work(&ioa_cfg->work_q);
917		} else
918			list_move_tail(&res->queue, &ioa_cfg->free_res_q);
919	} else if (!res->sdev) {
920		res->add_to_ml = 1;
921		if (ioa_cfg->allow_ml_add_del)
922			schedule_work(&ioa_cfg->work_q);
923	}
924
925	ipr_send_hcam(ioa_cfg, IPR_HCAM_CDB_OP_CODE_CONFIG_CHANGE, hostrcb);
926}
927
928/**
929 * ipr_process_ccn - Op done function for a CCN.
930 * @ipr_cmd:	ipr command struct
931 *
932 * This function is the op done function for a configuration
933 * change notification host controlled async from the adapter.
934 *
935 * Return value:
936 * 	none
937 **/
938static void ipr_process_ccn(struct ipr_cmnd *ipr_cmd)
939{
940	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
941	struct ipr_hostrcb *hostrcb = ipr_cmd->u.hostrcb;
942	u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
943
944	list_del(&hostrcb->queue);
945	list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q);
946
947	if (ioasc) {
948		if (ioasc != IPR_IOASC_IOA_WAS_RESET)
949			dev_err(&ioa_cfg->pdev->dev,
950				"Host RCB failed with IOASC: 0x%08X\n", ioasc);
951
952		ipr_send_hcam(ioa_cfg, IPR_HCAM_CDB_OP_CODE_CONFIG_CHANGE, hostrcb);
953	} else {
954		ipr_handle_config_change(ioa_cfg, hostrcb);
955	}
956}
957
958/**
959 * strip_and_pad_whitespace - Strip and pad trailing whitespace.
960 * @i:		index into buffer
961 * @buf:		string to modify
962 *
963 * This function will strip all trailing whitespace, pad the end
964 * of the string with a single space, and NULL terminate the string.
965 *
966 * Return value:
967 * 	new length of string
968 **/
969static int strip_and_pad_whitespace(int i, char *buf)
970{
971	while (i && buf[i] == ' ')
972		i--;
973	buf[i+1] = ' ';
974	buf[i+2] = '\0';
975	return i + 2;
976}
977
978/**
979 * ipr_log_vpd_compact - Log the passed extended VPD compactly.
980 * @prefix:		string to print at start of printk
981 * @hostrcb:	hostrcb pointer
982 * @vpd:		vendor/product id/sn struct
983 *
984 * Return value:
985 * 	none
986 **/
987static void ipr_log_vpd_compact(char *prefix, struct ipr_hostrcb *hostrcb,
988				struct ipr_vpd *vpd)
989{
990	char buffer[IPR_VENDOR_ID_LEN + IPR_PROD_ID_LEN + IPR_SERIAL_NUM_LEN + 3];
991	int i = 0;
992
993	memcpy(buffer, vpd->vpids.vendor_id, IPR_VENDOR_ID_LEN);
994	i = strip_and_pad_whitespace(IPR_VENDOR_ID_LEN - 1, buffer);
995
996	memcpy(&buffer[i], vpd->vpids.product_id, IPR_PROD_ID_LEN);
997	i = strip_and_pad_whitespace(i + IPR_PROD_ID_LEN - 1, buffer);
998
999	memcpy(&buffer[i], vpd->sn, IPR_SERIAL_NUM_LEN);
1000	buffer[IPR_SERIAL_NUM_LEN + i] = '\0';
1001
1002	ipr_hcam_err(hostrcb, "%s VPID/SN: %s\n", prefix, buffer);
1003}
1004
1005/**
1006 * ipr_log_vpd - Log the passed VPD to the error log.
1007 * @vpd:		vendor/product id/sn struct
1008 *
1009 * Return value:
1010 * 	none
1011 **/
1012static void ipr_log_vpd(struct ipr_vpd *vpd)
1013{
1014	char buffer[IPR_VENDOR_ID_LEN + IPR_PROD_ID_LEN
1015		    + IPR_SERIAL_NUM_LEN];
1016
1017	memcpy(buffer, vpd->vpids.vendor_id, IPR_VENDOR_ID_LEN);
1018	memcpy(buffer + IPR_VENDOR_ID_LEN, vpd->vpids.product_id,
1019	       IPR_PROD_ID_LEN);
1020	buffer[IPR_VENDOR_ID_LEN + IPR_PROD_ID_LEN] = '\0';
1021	ipr_err("Vendor/Product ID: %s\n", buffer);
1022
1023	memcpy(buffer, vpd->sn, IPR_SERIAL_NUM_LEN);
1024	buffer[IPR_SERIAL_NUM_LEN] = '\0';
1025	ipr_err("    Serial Number: %s\n", buffer);
1026}
1027
1028/**
1029 * ipr_log_ext_vpd_compact - Log the passed extended VPD compactly.
1030 * @prefix:		string to print at start of printk
1031 * @hostrcb:	hostrcb pointer
1032 * @vpd:		vendor/product id/sn/wwn struct
1033 *
1034 * Return value:
1035 * 	none
1036 **/
1037static void ipr_log_ext_vpd_compact(char *prefix, struct ipr_hostrcb *hostrcb,
1038				    struct ipr_ext_vpd *vpd)
1039{
1040	ipr_log_vpd_compact(prefix, hostrcb, &vpd->vpd);
1041	ipr_hcam_err(hostrcb, "%s WWN: %08X%08X\n", prefix,
1042		     be32_to_cpu(vpd->wwid[0]), be32_to_cpu(vpd->wwid[1]));
1043}
1044
1045/**
1046 * ipr_log_ext_vpd - Log the passed extended VPD to the error log.
1047 * @vpd:		vendor/product id/sn/wwn struct
1048 *
1049 * Return value:
1050 * 	none
1051 **/
1052static void ipr_log_ext_vpd(struct ipr_ext_vpd *vpd)
1053{
1054	ipr_log_vpd(&vpd->vpd);
1055	ipr_err("    WWN: %08X%08X\n", be32_to_cpu(vpd->wwid[0]),
1056		be32_to_cpu(vpd->wwid[1]));
1057}
1058
1059/**
1060 * ipr_log_enhanced_cache_error - Log a cache error.
1061 * @ioa_cfg:	ioa config struct
1062 * @hostrcb:	hostrcb struct
1063 *
1064 * Return value:
1065 * 	none
1066 **/
1067static void ipr_log_enhanced_cache_error(struct ipr_ioa_cfg *ioa_cfg,
1068					 struct ipr_hostrcb *hostrcb)
1069{
1070	struct ipr_hostrcb_type_12_error *error =
1071		&hostrcb->hcam.u.error.u.type_12_error;
1072
1073	ipr_err("-----Current Configuration-----\n");
1074	ipr_err("Cache Directory Card Information:\n");
1075	ipr_log_ext_vpd(&error->ioa_vpd);
1076	ipr_err("Adapter Card Information:\n");
1077	ipr_log_ext_vpd(&error->cfc_vpd);
1078
1079	ipr_err("-----Expected Configuration-----\n");
1080	ipr_err("Cache Directory Card Information:\n");
1081	ipr_log_ext_vpd(&error->ioa_last_attached_to_cfc_vpd);
1082	ipr_err("Adapter Card Information:\n");
1083	ipr_log_ext_vpd(&error->cfc_last_attached_to_ioa_vpd);
1084
1085	ipr_err("Additional IOA Data: %08X %08X %08X\n",
1086		     be32_to_cpu(error->ioa_data[0]),
1087		     be32_to_cpu(error->ioa_data[1]),
1088		     be32_to_cpu(error->ioa_data[2]));
1089}
1090
1091/**
1092 * ipr_log_cache_error - Log a cache error.
1093 * @ioa_cfg:	ioa config struct
1094 * @hostrcb:	hostrcb struct
1095 *
1096 * Return value:
1097 * 	none
1098 **/
1099static void ipr_log_cache_error(struct ipr_ioa_cfg *ioa_cfg,
1100				struct ipr_hostrcb *hostrcb)
1101{
1102	struct ipr_hostrcb_type_02_error *error =
1103		&hostrcb->hcam.u.error.u.type_02_error;
1104
1105	ipr_err("-----Current Configuration-----\n");
1106	ipr_err("Cache Directory Card Information:\n");
1107	ipr_log_vpd(&error->ioa_vpd);
1108	ipr_err("Adapter Card Information:\n");
1109	ipr_log_vpd(&error->cfc_vpd);
1110
1111	ipr_err("-----Expected Configuration-----\n");
1112	ipr_err("Cache Directory Card Information:\n");
1113	ipr_log_vpd(&error->ioa_last_attached_to_cfc_vpd);
1114	ipr_err("Adapter Card Information:\n");
1115	ipr_log_vpd(&error->cfc_last_attached_to_ioa_vpd);
1116
1117	ipr_err("Additional IOA Data: %08X %08X %08X\n",
1118		     be32_to_cpu(error->ioa_data[0]),
1119		     be32_to_cpu(error->ioa_data[1]),
1120		     be32_to_cpu(error->ioa_data[2]));
1121}
1122
1123/**
1124 * ipr_log_enhanced_config_error - Log a configuration error.
1125 * @ioa_cfg:	ioa config struct
1126 * @hostrcb:	hostrcb struct
1127 *
1128 * Return value:
1129 * 	none
1130 **/
1131static void ipr_log_enhanced_config_error(struct ipr_ioa_cfg *ioa_cfg,
1132					  struct ipr_hostrcb *hostrcb)
1133{
1134	int errors_logged, i;
1135	struct ipr_hostrcb_device_data_entry_enhanced *dev_entry;
1136	struct ipr_hostrcb_type_13_error *error;
1137
1138	error = &hostrcb->hcam.u.error.u.type_13_error;
1139	errors_logged = be32_to_cpu(error->errors_logged);
1140
1141	ipr_err("Device Errors Detected/Logged: %d/%d\n",
1142		be32_to_cpu(error->errors_detected), errors_logged);
1143
1144	dev_entry = error->dev;
1145
1146	for (i = 0; i < errors_logged; i++, dev_entry++) {
1147		ipr_err_separator;
1148
1149		ipr_phys_res_err(ioa_cfg, dev_entry->dev_res_addr, "Device %d", i + 1);
1150		ipr_log_ext_vpd(&dev_entry->vpd);
1151
1152		ipr_err("-----New Device Information-----\n");
1153		ipr_log_ext_vpd(&dev_entry->new_vpd);
1154
1155		ipr_err("Cache Directory Card Information:\n");
1156		ipr_log_ext_vpd(&dev_entry->ioa_last_with_dev_vpd);
1157
1158		ipr_err("Adapter Card Information:\n");
1159		ipr_log_ext_vpd(&dev_entry->cfc_last_with_dev_vpd);
1160	}
1161}
1162
1163/**
1164 * ipr_log_config_error - Log a configuration error.
1165 * @ioa_cfg:	ioa config struct
1166 * @hostrcb:	hostrcb struct
1167 *
1168 * Return value:
1169 * 	none
1170 **/
1171static void ipr_log_config_error(struct ipr_ioa_cfg *ioa_cfg,
1172				 struct ipr_hostrcb *hostrcb)
1173{
1174	int errors_logged, i;
1175	struct ipr_hostrcb_device_data_entry *dev_entry;
1176	struct ipr_hostrcb_type_03_error *error;
1177
1178	error = &hostrcb->hcam.u.error.u.type_03_error;
1179	errors_logged = be32_to_cpu(error->errors_logged);
1180
1181	ipr_err("Device Errors Detected/Logged: %d/%d\n",
1182		be32_to_cpu(error->errors_detected), errors_logged);
1183
1184	dev_entry = error->dev;
1185
1186	for (i = 0; i < errors_logged; i++, dev_entry++) {
1187		ipr_err_separator;
1188
1189		ipr_phys_res_err(ioa_cfg, dev_entry->dev_res_addr, "Device %d", i + 1);
1190		ipr_log_vpd(&dev_entry->vpd);
1191
1192		ipr_err("-----New Device Information-----\n");
1193		ipr_log_vpd(&dev_entry->new_vpd);
1194
1195		ipr_err("Cache Directory Card Information:\n");
1196		ipr_log_vpd(&dev_entry->ioa_last_with_dev_vpd);
1197
1198		ipr_err("Adapter Card Information:\n");
1199		ipr_log_vpd(&dev_entry->cfc_last_with_dev_vpd);
1200
1201		ipr_err("Additional IOA Data: %08X %08X %08X %08X %08X\n",
1202			be32_to_cpu(dev_entry->ioa_data[0]),
1203			be32_to_cpu(dev_entry->ioa_data[1]),
1204			be32_to_cpu(dev_entry->ioa_data[2]),
1205			be32_to_cpu(dev_entry->ioa_data[3]),
1206			be32_to_cpu(dev_entry->ioa_data[4]));
1207	}
1208}
1209
1210/**
1211 * ipr_log_enhanced_array_error - Log an array configuration error.
1212 * @ioa_cfg:	ioa config struct
1213 * @hostrcb:	hostrcb struct
1214 *
1215 * Return value:
1216 * 	none
1217 **/
1218static void ipr_log_enhanced_array_error(struct ipr_ioa_cfg *ioa_cfg,
1219					 struct ipr_hostrcb *hostrcb)
1220{
1221	int i, num_entries;
1222	struct ipr_hostrcb_type_14_error *error;
1223	struct ipr_hostrcb_array_data_entry_enhanced *array_entry;
1224	const u8 zero_sn[IPR_SERIAL_NUM_LEN] = { [0 ... IPR_SERIAL_NUM_LEN-1] = '0' };
1225
1226	error = &hostrcb->hcam.u.error.u.type_14_error;
1227
1228	ipr_err_separator;
1229
1230	ipr_err("RAID %s Array Configuration: %d:%d:%d:%d\n",
1231		error->protection_level,
1232		ioa_cfg->host->host_no,
1233		error->last_func_vset_res_addr.bus,
1234		error->last_func_vset_res_addr.target,
1235		error->last_func_vset_res_addr.lun);
1236
1237	ipr_err_separator;
1238
1239	array_entry = error->array_member;
1240	num_entries = min_t(u32, be32_to_cpu(error->num_entries),
1241			    sizeof(error->array_member));
1242
1243	for (i = 0; i < num_entries; i++, array_entry++) {
1244		if (!memcmp(array_entry->vpd.vpd.sn, zero_sn, IPR_SERIAL_NUM_LEN))
1245			continue;
1246
1247		if (be32_to_cpu(error->exposed_mode_adn) == i)
1248			ipr_err("Exposed Array Member %d:\n", i);
1249		else
1250			ipr_err("Array Member %d:\n", i);
1251
1252		ipr_log_ext_vpd(&array_entry->vpd);
1253		ipr_phys_res_err(ioa_cfg, array_entry->dev_res_addr, "Current Location");
1254		ipr_phys_res_err(ioa_cfg, array_entry->expected_dev_res_addr,
1255				 "Expected Location");
1256
1257		ipr_err_separator;
1258	}
1259}
1260
1261/**
1262 * ipr_log_array_error - Log an array configuration error.
1263 * @ioa_cfg:	ioa config struct
1264 * @hostrcb:	hostrcb struct
1265 *
1266 * Return value:
1267 * 	none
1268 **/
1269static void ipr_log_array_error(struct ipr_ioa_cfg *ioa_cfg,
1270				struct ipr_hostrcb *hostrcb)
1271{
1272	int i;
1273	struct ipr_hostrcb_type_04_error *error;
1274	struct ipr_hostrcb_array_data_entry *array_entry;
1275	const u8 zero_sn[IPR_SERIAL_NUM_LEN] = { [0 ... IPR_SERIAL_NUM_LEN-1] = '0' };
1276
1277	error = &hostrcb->hcam.u.error.u.type_04_error;
1278
1279	ipr_err_separator;
1280
1281	ipr_err("RAID %s Array Configuration: %d:%d:%d:%d\n",
1282		error->protection_level,
1283		ioa_cfg->host->host_no,
1284		error->last_func_vset_res_addr.bus,
1285		error->last_func_vset_res_addr.target,
1286		error->last_func_vset_res_addr.lun);
1287
1288	ipr_err_separator;
1289
1290	array_entry = error->array_member;
1291
1292	for (i = 0; i < 18; i++) {
1293		if (!memcmp(array_entry->vpd.sn, zero_sn, IPR_SERIAL_NUM_LEN))
1294			continue;
1295
1296		if (be32_to_cpu(error->exposed_mode_adn) == i)
1297			ipr_err("Exposed Array Member %d:\n", i);
1298		else
1299			ipr_err("Array Member %d:\n", i);
1300
1301		ipr_log_vpd(&array_entry->vpd);
1302
1303		ipr_phys_res_err(ioa_cfg, array_entry->dev_res_addr, "Current Location");
1304		ipr_phys_res_err(ioa_cfg, array_entry->expected_dev_res_addr,
1305				 "Expected Location");
1306
1307		ipr_err_separator;
1308
1309		if (i == 9)
1310			array_entry = error->array_member2;
1311		else
1312			array_entry++;
1313	}
1314}
1315
1316/**
1317 * ipr_log_hex_data - Log additional hex IOA error data.
1318 * @ioa_cfg:	ioa config struct
1319 * @data:		IOA error data
1320 * @len:		data length
1321 *
1322 * Return value:
1323 * 	none
1324 **/
1325static void ipr_log_hex_data(struct ipr_ioa_cfg *ioa_cfg, u32 *data, int len)
1326{
1327	int i;
1328
1329	if (len == 0)
1330		return;
1331
1332	if (ioa_cfg->log_level <= IPR_DEFAULT_LOG_LEVEL)
1333		len = min_t(int, len, IPR_DEFAULT_MAX_ERROR_DUMP);
1334
1335	for (i = 0; i < len / 4; i += 4) {
1336		ipr_err("%08X: %08X %08X %08X %08X\n", i*4,
1337			be32_to_cpu(data[i]),
1338			be32_to_cpu(data[i+1]),
1339			be32_to_cpu(data[i+2]),
1340			be32_to_cpu(data[i+3]));
1341	}
1342}
1343
1344/**
1345 * ipr_log_enhanced_dual_ioa_error - Log an enhanced dual adapter error.
1346 * @ioa_cfg:	ioa config struct
1347 * @hostrcb:	hostrcb struct
1348 *
1349 * Return value:
1350 * 	none
1351 **/
1352static void ipr_log_enhanced_dual_ioa_error(struct ipr_ioa_cfg *ioa_cfg,
1353					    struct ipr_hostrcb *hostrcb)
1354{
1355	struct ipr_hostrcb_type_17_error *error;
1356
1357	error = &hostrcb->hcam.u.error.u.type_17_error;
1358	error->failure_reason[sizeof(error->failure_reason) - 1] = '\0';
1359	strstrip(error->failure_reason);
1360
1361	ipr_hcam_err(hostrcb, "%s [PRC: %08X]\n", error->failure_reason,
1362		     be32_to_cpu(hostrcb->hcam.u.error.prc));
1363	ipr_log_ext_vpd_compact("Remote IOA", hostrcb, &error->vpd);
1364	ipr_log_hex_data(ioa_cfg, error->data,
1365			 be32_to_cpu(hostrcb->hcam.length) -
1366			 (offsetof(struct ipr_hostrcb_error, u) +
1367			  offsetof(struct ipr_hostrcb_type_17_error, data)));
1368}
1369
1370/**
1371 * ipr_log_dual_ioa_error - Log a dual adapter error.
1372 * @ioa_cfg:	ioa config struct
1373 * @hostrcb:	hostrcb struct
1374 *
1375 * Return value:
1376 * 	none
1377 **/
1378static void ipr_log_dual_ioa_error(struct ipr_ioa_cfg *ioa_cfg,
1379				   struct ipr_hostrcb *hostrcb)
1380{
1381	struct ipr_hostrcb_type_07_error *error;
1382
1383	error = &hostrcb->hcam.u.error.u.type_07_error;
1384	error->failure_reason[sizeof(error->failure_reason) - 1] = '\0';
1385	strstrip(error->failure_reason);
1386
1387	ipr_hcam_err(hostrcb, "%s [PRC: %08X]\n", error->failure_reason,
1388		     be32_to_cpu(hostrcb->hcam.u.error.prc));
1389	ipr_log_vpd_compact("Remote IOA", hostrcb, &error->vpd);
1390	ipr_log_hex_data(ioa_cfg, error->data,
1391			 be32_to_cpu(hostrcb->hcam.length) -
1392			 (offsetof(struct ipr_hostrcb_error, u) +
1393			  offsetof(struct ipr_hostrcb_type_07_error, data)));
1394}
1395
1396static const struct {
1397	u8 active;
1398	char *desc;
1399} path_active_desc[] = {
1400	{ IPR_PATH_NO_INFO, "Path" },
1401	{ IPR_PATH_ACTIVE, "Active path" },
1402	{ IPR_PATH_NOT_ACTIVE, "Inactive path" }
1403};
1404
1405static const struct {
1406	u8 state;
1407	char *desc;
1408} path_state_desc[] = {
1409	{ IPR_PATH_STATE_NO_INFO, "has no path state information available" },
1410	{ IPR_PATH_HEALTHY, "is healthy" },
1411	{ IPR_PATH_DEGRADED, "is degraded" },
1412	{ IPR_PATH_FAILED, "is failed" }
1413};
1414
1415/**
1416 * ipr_log_fabric_path - Log a fabric path error
1417 * @hostrcb:	hostrcb struct
1418 * @fabric:		fabric descriptor
1419 *
1420 * Return value:
1421 * 	none
1422 **/
1423static void ipr_log_fabric_path(struct ipr_hostrcb *hostrcb,
1424				struct ipr_hostrcb_fabric_desc *fabric)
1425{
1426	int i, j;
1427	u8 path_state = fabric->path_state;
1428	u8 active = path_state & IPR_PATH_ACTIVE_MASK;
1429	u8 state = path_state & IPR_PATH_STATE_MASK;
1430
1431	for (i = 0; i < ARRAY_SIZE(path_active_desc); i++) {
1432		if (path_active_desc[i].active != active)
1433			continue;
1434
1435		for (j = 0; j < ARRAY_SIZE(path_state_desc); j++) {
1436			if (path_state_desc[j].state != state)
1437				continue;
1438
1439			if (fabric->cascaded_expander == 0xff && fabric->phy == 0xff) {
1440				ipr_hcam_err(hostrcb, "%s %s: IOA Port=%d\n",
1441					     path_active_desc[i].desc, path_state_desc[j].desc,
1442					     fabric->ioa_port);
1443			} else if (fabric->cascaded_expander == 0xff) {
1444				ipr_hcam_err(hostrcb, "%s %s: IOA Port=%d, Phy=%d\n",
1445					     path_active_desc[i].desc, path_state_desc[j].desc,
1446					     fabric->ioa_port, fabric->phy);
1447			} else if (fabric->phy == 0xff) {
1448				ipr_hcam_err(hostrcb, "%s %s: IOA Port=%d, Cascade=%d\n",
1449					     path_active_desc[i].desc, path_state_desc[j].desc,
1450					     fabric->ioa_port, fabric->cascaded_expander);
1451			} else {
1452				ipr_hcam_err(hostrcb, "%s %s: IOA Port=%d, Cascade=%d, Phy=%d\n",
1453					     path_active_desc[i].desc, path_state_desc[j].desc,
1454					     fabric->ioa_port, fabric->cascaded_expander, fabric->phy);
1455			}
1456			return;
1457		}
1458	}
1459
1460	ipr_err("Path state=%02X IOA Port=%d Cascade=%d Phy=%d\n", path_state,
1461		fabric->ioa_port, fabric->cascaded_expander, fabric->phy);
1462}
1463
1464static const struct {
1465	u8 type;
1466	char *desc;
1467} path_type_desc[] = {
1468	{ IPR_PATH_CFG_IOA_PORT, "IOA port" },
1469	{ IPR_PATH_CFG_EXP_PORT, "Expander port" },
1470	{ IPR_PATH_CFG_DEVICE_PORT, "Device port" },
1471	{ IPR_PATH_CFG_DEVICE_LUN, "Device LUN" }
1472};
1473
1474static const struct {
1475	u8 status;
1476	char *desc;
1477} path_status_desc[] = {
1478	{ IPR_PATH_CFG_NO_PROB, "Functional" },
1479	{ IPR_PATH_CFG_DEGRADED, "Degraded" },
1480	{ IPR_PATH_CFG_FAILED, "Failed" },
1481	{ IPR_PATH_CFG_SUSPECT, "Suspect" },
1482	{ IPR_PATH_NOT_DETECTED, "Missing" },
1483	{ IPR_PATH_INCORRECT_CONN, "Incorrectly connected" }
1484};
1485
1486static const char *link_rate[] = {
1487	"unknown",
1488	"disabled",
1489	"phy reset problem",
1490	"spinup hold",
1491	"port selector",
1492	"unknown",
1493	"unknown",
1494	"unknown",
1495	"1.5Gbps",
1496	"3.0Gbps",
1497	"unknown",
1498	"unknown",
1499	"unknown",
1500	"unknown",
1501	"unknown",
1502	"unknown"
1503};
1504
1505/**
1506 * ipr_log_path_elem - Log a fabric path element.
1507 * @hostrcb:	hostrcb struct
1508 * @cfg:		fabric path element struct
1509 *
1510 * Return value:
1511 * 	none
1512 **/
1513static void ipr_log_path_elem(struct ipr_hostrcb *hostrcb,
1514			      struct ipr_hostrcb_config_element *cfg)
1515{
1516	int i, j;
1517	u8 type = cfg->type_status & IPR_PATH_CFG_TYPE_MASK;
1518	u8 status = cfg->type_status & IPR_PATH_CFG_STATUS_MASK;
1519
1520	if (type == IPR_PATH_CFG_NOT_EXIST)
1521		return;
1522
1523	for (i = 0; i < ARRAY_SIZE(path_type_desc); i++) {
1524		if (path_type_desc[i].type != type)
1525			continue;
1526
1527		for (j = 0; j < ARRAY_SIZE(path_status_desc); j++) {
1528			if (path_status_desc[j].status != status)
1529				continue;
1530
1531			if (type == IPR_PATH_CFG_IOA_PORT) {
1532				ipr_hcam_err(hostrcb, "%s %s: Phy=%d, Link rate=%s, WWN=%08X%08X\n",
1533					     path_status_desc[j].desc, path_type_desc[i].desc,
1534					     cfg->phy, link_rate[cfg->link_rate & IPR_PHY_LINK_RATE_MASK],
1535					     be32_to_cpu(cfg->wwid[0]), be32_to_cpu(cfg->wwid[1]));
1536			} else {
1537				if (cfg->cascaded_expander == 0xff && cfg->phy == 0xff) {
1538					ipr_hcam_err(hostrcb, "%s %s: Link rate=%s, WWN=%08X%08X\n",
1539						     path_status_desc[j].desc, path_type_desc[i].desc,
1540						     link_rate[cfg->link_rate & IPR_PHY_LINK_RATE_MASK],
1541						     be32_to_cpu(cfg->wwid[0]), be32_to_cpu(cfg->wwid[1]));
1542				} else if (cfg->cascaded_expander == 0xff) {
1543					ipr_hcam_err(hostrcb, "%s %s: Phy=%d, Link rate=%s, "
1544						     "WWN=%08X%08X\n", path_status_desc[j].desc,
1545						     path_type_desc[i].desc, cfg->phy,
1546						     link_rate[cfg->link_rate & IPR_PHY_LINK_RATE_MASK],
1547						     be32_to_cpu(cfg->wwid[0]), be32_to_cpu(cfg->wwid[1]));
1548				} else if (cfg->phy == 0xff) {
1549					ipr_hcam_err(hostrcb, "%s %s: Cascade=%d, Link rate=%s, "
1550						     "WWN=%08X%08X\n", path_status_desc[j].desc,
1551						     path_type_desc[i].desc, cfg->cascaded_expander,
1552						     link_rate[cfg->link_rate & IPR_PHY_LINK_RATE_MASK],
1553						     be32_to_cpu(cfg->wwid[0]), be32_to_cpu(cfg->wwid[1]));
1554				} else {
1555					ipr_hcam_err(hostrcb, "%s %s: Cascade=%d, Phy=%d, Link rate=%s "
1556						     "WWN=%08X%08X\n", path_status_desc[j].desc,
1557						     path_type_desc[i].desc, cfg->cascaded_expander, cfg->phy,
1558						     link_rate[cfg->link_rate & IPR_PHY_LINK_RATE_MASK],
1559						     be32_to_cpu(cfg->wwid[0]), be32_to_cpu(cfg->wwid[1]));
1560				}
1561			}
1562			return;
1563		}
1564	}
1565
1566	ipr_hcam_err(hostrcb, "Path element=%02X: Cascade=%d Phy=%d Link rate=%s "
1567		     "WWN=%08X%08X\n", cfg->type_status, cfg->cascaded_expander, cfg->phy,
1568		     link_rate[cfg->link_rate & IPR_PHY_LINK_RATE_MASK],
1569		     be32_to_cpu(cfg->wwid[0]), be32_to_cpu(cfg->wwid[1]));
1570}
1571
1572/**
1573 * ipr_log_fabric_error - Log a fabric error.
1574 * @ioa_cfg:	ioa config struct
1575 * @hostrcb:	hostrcb struct
1576 *
1577 * Return value:
1578 * 	none
1579 **/
1580static void ipr_log_fabric_error(struct ipr_ioa_cfg *ioa_cfg,
1581				 struct ipr_hostrcb *hostrcb)
1582{
1583	struct ipr_hostrcb_type_20_error *error;
1584	struct ipr_hostrcb_fabric_desc *fabric;
1585	struct ipr_hostrcb_config_element *cfg;
1586	int i, add_len;
1587
1588	error = &hostrcb->hcam.u.error.u.type_20_error;
1589	error->failure_reason[sizeof(error->failure_reason) - 1] = '\0';
1590	ipr_hcam_err(hostrcb, "%s\n", error->failure_reason);
1591
1592	add_len = be32_to_cpu(hostrcb->hcam.length) -
1593		(offsetof(struct ipr_hostrcb_error, u) +
1594		 offsetof(struct ipr_hostrcb_type_20_error, desc));
1595
1596	for (i = 0, fabric = error->desc; i < error->num_entries; i++) {
1597		ipr_log_fabric_path(hostrcb, fabric);
1598		for_each_fabric_cfg(fabric, cfg)
1599			ipr_log_path_elem(hostrcb, cfg);
1600
1601		add_len -= be16_to_cpu(fabric->length);
1602		fabric = (struct ipr_hostrcb_fabric_desc *)
1603			((unsigned long)fabric + be16_to_cpu(fabric->length));
1604	}
1605
1606	ipr_log_hex_data(ioa_cfg, (u32 *)fabric, add_len);
1607}
1608
1609/**
1610 * ipr_log_generic_error - Log an adapter error.
1611 * @ioa_cfg:	ioa config struct
1612 * @hostrcb:	hostrcb struct
1613 *
1614 * Return value:
1615 * 	none
1616 **/
1617static void ipr_log_generic_error(struct ipr_ioa_cfg *ioa_cfg,
1618				  struct ipr_hostrcb *hostrcb)
1619{
1620	ipr_log_hex_data(ioa_cfg, hostrcb->hcam.u.raw.data,
1621			 be32_to_cpu(hostrcb->hcam.length));
1622}
1623
1624/**
1625 * ipr_get_error - Find the specfied IOASC in the ipr_error_table.
1626 * @ioasc:	IOASC
1627 *
1628 * This function will return the index of into the ipr_error_table
1629 * for the specified IOASC. If the IOASC is not in the table,
1630 * 0 will be returned, which points to the entry used for unknown errors.
1631 *
1632 * Return value:
1633 * 	index into the ipr_error_table
1634 **/
1635static u32 ipr_get_error(u32 ioasc)
1636{
1637	int i;
1638
1639	for (i = 0; i < ARRAY_SIZE(ipr_error_table); i++)
1640		if (ipr_error_table[i].ioasc == (ioasc & IPR_IOASC_IOASC_MASK))
1641			return i;
1642
1643	return 0;
1644}
1645
1646/**
1647 * ipr_handle_log_data - Log an adapter error.
1648 * @ioa_cfg:	ioa config struct
1649 * @hostrcb:	hostrcb struct
1650 *
1651 * This function logs an adapter error to the system.
1652 *
1653 * Return value:
1654 * 	none
1655 **/
1656static void ipr_handle_log_data(struct ipr_ioa_cfg *ioa_cfg,
1657				struct ipr_hostrcb *hostrcb)
1658{
1659	u32 ioasc;
1660	int error_index;
1661
1662	if (hostrcb->hcam.notify_type != IPR_HOST_RCB_NOTIF_TYPE_ERROR_LOG_ENTRY)
1663		return;
1664
1665	if (hostrcb->hcam.notifications_lost == IPR_HOST_RCB_NOTIFICATIONS_LOST)
1666		dev_err(&ioa_cfg->pdev->dev, "Error notifications lost\n");
1667
1668	ioasc = be32_to_cpu(hostrcb->hcam.u.error.failing_dev_ioasc);
1669
1670	if (ioasc == IPR_IOASC_BUS_WAS_RESET ||
1671	    ioasc == IPR_IOASC_BUS_WAS_RESET_BY_OTHER) {
1672		/* Tell the midlayer we had a bus reset so it will handle the UA properly */
1673		scsi_report_bus_reset(ioa_cfg->host,
1674				      hostrcb->hcam.u.error.failing_dev_res_addr.bus);
1675	}
1676
1677	error_index = ipr_get_error(ioasc);
1678
1679	if (!ipr_error_table[error_index].log_hcam)
1680		return;
1681
1682	ipr_hcam_err(hostrcb, "%s\n", ipr_error_table[error_index].error);
1683
1684	/* Set indication we have logged an error */
1685	ioa_cfg->errors_logged++;
1686
1687	if (ioa_cfg->log_level < ipr_error_table[error_index].log_hcam)
1688		return;
1689	if (be32_to_cpu(hostrcb->hcam.length) > sizeof(hostrcb->hcam.u.raw))
1690		hostrcb->hcam.length = cpu_to_be32(sizeof(hostrcb->hcam.u.raw));
1691
1692	switch (hostrcb->hcam.overlay_id) {
1693	case IPR_HOST_RCB_OVERLAY_ID_2:
1694		ipr_log_cache_error(ioa_cfg, hostrcb);
1695		break;
1696	case IPR_HOST_RCB_OVERLAY_ID_3:
1697		ipr_log_config_error(ioa_cfg, hostrcb);
1698		break;
1699	case IPR_HOST_RCB_OVERLAY_ID_4:
1700	case IPR_HOST_RCB_OVERLAY_ID_6:
1701		ipr_log_array_error(ioa_cfg, hostrcb);
1702		break;
1703	case IPR_HOST_RCB_OVERLAY_ID_7:
1704		ipr_log_dual_ioa_error(ioa_cfg, hostrcb);
1705		break;
1706	case IPR_HOST_RCB_OVERLAY_ID_12:
1707		ipr_log_enhanced_cache_error(ioa_cfg, hostrcb);
1708		break;
1709	case IPR_HOST_RCB_OVERLAY_ID_13:
1710		ipr_log_enhanced_config_error(ioa_cfg, hostrcb);
1711		break;
1712	case IPR_HOST_RCB_OVERLAY_ID_14:
1713	case IPR_HOST_RCB_OVERLAY_ID_16:
1714		ipr_log_enhanced_array_error(ioa_cfg, hostrcb);
1715		break;
1716	case IPR_HOST_RCB_OVERLAY_ID_17:
1717		ipr_log_enhanced_dual_ioa_error(ioa_cfg, hostrcb);
1718		break;
1719	case IPR_HOST_RCB_OVERLAY_ID_20:
1720		ipr_log_fabric_error(ioa_cfg, hostrcb);
1721		break;
1722	case IPR_HOST_RCB_OVERLAY_ID_1:
1723	case IPR_HOST_RCB_OVERLAY_ID_DEFAULT:
1724	default:
1725		ipr_log_generic_error(ioa_cfg, hostrcb);
1726		break;
1727	}
1728}
1729
1730/**
1731 * ipr_process_error - Op done function for an adapter error log.
1732 * @ipr_cmd:	ipr command struct
1733 *
1734 * This function is the op done function for an error log host
1735 * controlled async from the adapter. It will log the error and
1736 * send the HCAM back to the adapter.
1737 *
1738 * Return value:
1739 * 	none
1740 **/
1741static void ipr_process_error(struct ipr_cmnd *ipr_cmd)
1742{
1743	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
1744	struct ipr_hostrcb *hostrcb = ipr_cmd->u.hostrcb;
1745	u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
1746	u32 fd_ioasc = be32_to_cpu(hostrcb->hcam.u.error.failing_dev_ioasc);
1747
1748	list_del(&hostrcb->queue);
1749	list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q);
1750
1751	if (!ioasc) {
1752		ipr_handle_log_data(ioa_cfg, hostrcb);
1753		if (fd_ioasc == IPR_IOASC_NR_IOA_RESET_REQUIRED)
1754			ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_ABBREV);
1755	} else if (ioasc != IPR_IOASC_IOA_WAS_RESET) {
1756		dev_err(&ioa_cfg->pdev->dev,
1757			"Host RCB failed with IOASC: 0x%08X\n", ioasc);
1758	}
1759
1760	ipr_send_hcam(ioa_cfg, IPR_HCAM_CDB_OP_CODE_LOG_DATA, hostrcb);
1761}
1762
1763/**
1764 * ipr_timeout -  An internally generated op has timed out.
1765 * @ipr_cmd:	ipr command struct
1766 *
1767 * This function blocks host requests and initiates an
1768 * adapter reset.
1769 *
1770 * Return value:
1771 * 	none
1772 **/
1773static void ipr_timeout(struct ipr_cmnd *ipr_cmd)
1774{
1775	unsigned long lock_flags = 0;
1776	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
1777
1778	ENTER;
1779	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
1780
1781	ioa_cfg->errors_logged++;
1782	dev_err(&ioa_cfg->pdev->dev,
1783		"Adapter being reset due to command timeout.\n");
1784
1785	if (WAIT_FOR_DUMP == ioa_cfg->sdt_state)
1786		ioa_cfg->sdt_state = GET_DUMP;
1787
1788	if (!ioa_cfg->in_reset_reload || ioa_cfg->reset_cmd == ipr_cmd)
1789		ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE);
1790
1791	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
1792	LEAVE;
1793}
1794
1795/**
1796 * ipr_oper_timeout -  Adapter timed out transitioning to operational
1797 * @ipr_cmd:	ipr command struct
1798 *
1799 * This function blocks host requests and initiates an
1800 * adapter reset.
1801 *
1802 * Return value:
1803 * 	none
1804 **/
1805static void ipr_oper_timeout(struct ipr_cmnd *ipr_cmd)
1806{
1807	unsigned long lock_flags = 0;
1808	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
1809
1810	ENTER;
1811	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
1812
1813	ioa_cfg->errors_logged++;
1814	dev_err(&ioa_cfg->pdev->dev,
1815		"Adapter timed out transitioning to operational.\n");
1816
1817	if (WAIT_FOR_DUMP == ioa_cfg->sdt_state)
1818		ioa_cfg->sdt_state = GET_DUMP;
1819
1820	if (!ioa_cfg->in_reset_reload || ioa_cfg->reset_cmd == ipr_cmd) {
1821		if (ipr_fastfail)
1822			ioa_cfg->reset_retries += IPR_NUM_RESET_RELOAD_RETRIES;
1823		ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE);
1824	}
1825
1826	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
1827	LEAVE;
1828}
1829
1830/**
1831 * ipr_reset_reload - Reset/Reload the IOA
1832 * @ioa_cfg:		ioa config struct
1833 * @shutdown_type:	shutdown type
1834 *
1835 * This function resets the adapter and re-initializes it.
1836 * This function assumes that all new host commands have been stopped.
1837 * Return value:
1838 * 	SUCCESS / FAILED
1839 **/
1840static int ipr_reset_reload(struct ipr_ioa_cfg *ioa_cfg,
1841			    enum ipr_shutdown_type shutdown_type)
1842{
1843	if (!ioa_cfg->in_reset_reload)
1844		ipr_initiate_ioa_reset(ioa_cfg, shutdown_type);
1845
1846	spin_unlock_irq(ioa_cfg->host->host_lock);
1847	wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
1848	spin_lock_irq(ioa_cfg->host->host_lock);
1849
1850	/* If we got hit with a host reset while we were already resetting
1851	 the adapter for some reason, and the reset failed. */
1852	if (ioa_cfg->ioa_is_dead) {
1853		ipr_trace;
1854		return FAILED;
1855	}
1856
1857	return SUCCESS;
1858}
1859
1860/**
1861 * ipr_find_ses_entry - Find matching SES in SES table
1862 * @res:	resource entry struct of SES
1863 *
1864 * Return value:
1865 * 	pointer to SES table entry / NULL on failure
1866 **/
1867static const struct ipr_ses_table_entry *
1868ipr_find_ses_entry(struct ipr_resource_entry *res)
1869{
1870	int i, j, matches;
1871	const struct ipr_ses_table_entry *ste = ipr_ses_table;
1872
1873	for (i = 0; i < ARRAY_SIZE(ipr_ses_table); i++, ste++) {
1874		for (j = 0, matches = 0; j < IPR_PROD_ID_LEN; j++) {
1875			if (ste->compare_product_id_byte[j] == 'X') {
1876				if (res->cfgte.std_inq_data.vpids.product_id[j] == ste->product_id[j])
1877					matches++;
1878				else
1879					break;
1880			} else
1881				matches++;
1882		}
1883
1884		if (matches == IPR_PROD_ID_LEN)
1885			return ste;
1886	}
1887
1888	return NULL;
1889}
1890
1891/**
1892 * ipr_get_max_scsi_speed - Determine max SCSI speed for a given bus
1893 * @ioa_cfg:	ioa config struct
1894 * @bus:		SCSI bus
1895 * @bus_width:	bus width
1896 *
1897 * Return value:
1898 *	SCSI bus speed in units of 100KHz, 1600 is 160 MHz
1899 *	For a 2-byte wide SCSI bus, the maximum transfer speed is
1900 *	twice the maximum transfer rate (e.g. for a wide enabled bus,
1901 *	max 160MHz = max 320MB/sec).
1902 **/
1903static u32 ipr_get_max_scsi_speed(struct ipr_ioa_cfg *ioa_cfg, u8 bus, u8 bus_width)
1904{
1905	struct ipr_resource_entry *res;
1906	const struct ipr_ses_table_entry *ste;
1907	u32 max_xfer_rate = IPR_MAX_SCSI_RATE(bus_width);
1908
1909	/* Loop through each config table entry in the config table buffer */
1910	list_for_each_entry(res, &ioa_cfg->used_res_q, queue) {
1911		if (!(IPR_IS_SES_DEVICE(res->cfgte.std_inq_data)))
1912			continue;
1913
1914		if (bus != res->cfgte.res_addr.bus)
1915			continue;
1916
1917		if (!(ste = ipr_find_ses_entry(res)))
1918			continue;
1919
1920		max_xfer_rate = (ste->max_bus_speed_limit * 10) / (bus_width / 8);
1921	}
1922
1923	return max_xfer_rate;
1924}
1925
1926/**
1927 * ipr_wait_iodbg_ack - Wait for an IODEBUG ACK from the IOA
1928 * @ioa_cfg:		ioa config struct
1929 * @max_delay:		max delay in micro-seconds to wait
1930 *
1931 * Waits for an IODEBUG ACK from the IOA, doing busy looping.
1932 *
1933 * Return value:
1934 * 	0 on success / other on failure
1935 **/
1936static int ipr_wait_iodbg_ack(struct ipr_ioa_cfg *ioa_cfg, int max_delay)
1937{
1938	volatile u32 pcii_reg;
1939	int delay = 1;
1940
1941	/* Read interrupt reg until IOA signals IO Debug Acknowledge */
1942	while (delay < max_delay) {
1943		pcii_reg = readl(ioa_cfg->regs.sense_interrupt_reg);
1944
1945		if (pcii_reg & IPR_PCII_IO_DEBUG_ACKNOWLEDGE)
1946			return 0;
1947
1948		/* udelay cannot be used if delay is more than a few milliseconds */
1949		if ((delay / 1000) > MAX_UDELAY_MS)
1950			mdelay(delay / 1000);
1951		else
1952			udelay(delay);
1953
1954		delay += delay;
1955	}
1956	return -EIO;
1957}
1958
1959/**
1960 * ipr_get_ldump_data_section - Dump IOA memory
1961 * @ioa_cfg:			ioa config struct
1962 * @start_addr:			adapter address to dump
1963 * @dest:				destination kernel buffer
1964 * @length_in_words:	length to dump in 4 byte words
1965 *
1966 * Return value:
1967 * 	0 on success / -EIO on failure
1968 **/
1969static int ipr_get_ldump_data_section(struct ipr_ioa_cfg *ioa_cfg,
1970				      u32 start_addr,
1971				      __be32 *dest, u32 length_in_words)
1972{
1973	volatile u32 temp_pcii_reg;
1974	int i, delay = 0;
1975
1976	/* Write IOA interrupt reg starting LDUMP state  */
1977	writel((IPR_UPROCI_RESET_ALERT | IPR_UPROCI_IO_DEBUG_ALERT),
1978	       ioa_cfg->regs.set_uproc_interrupt_reg);
1979
1980	/* Wait for IO debug acknowledge */
1981	if (ipr_wait_iodbg_ack(ioa_cfg,
1982			       IPR_LDUMP_MAX_LONG_ACK_DELAY_IN_USEC)) {
1983		dev_err(&ioa_cfg->pdev->dev,
1984			"IOA dump long data transfer timeout\n");
1985		return -EIO;
1986	}
1987
1988	/* Signal LDUMP interlocked - clear IO debug ack */
1989	writel(IPR_PCII_IO_DEBUG_ACKNOWLEDGE,
1990	       ioa_cfg->regs.clr_interrupt_reg);
1991
1992	/* Write Mailbox with starting address */
1993	writel(start_addr, ioa_cfg->ioa_mailbox);
1994
1995	/* Signal address valid - clear IOA Reset alert */
1996	writel(IPR_UPROCI_RESET_ALERT,
1997	       ioa_cfg->regs.clr_uproc_interrupt_reg);
1998
1999	for (i = 0; i < length_in_words; i++) {
2000		/* Wait for IO debug acknowledge */
2001		if (ipr_wait_iodbg_ack(ioa_cfg,
2002				       IPR_LDUMP_MAX_SHORT_ACK_DELAY_IN_USEC)) {
2003			dev_err(&ioa_cfg->pdev->dev,
2004				"IOA dump short data transfer timeout\n");
2005			return -EIO;
2006		}
2007
2008		/* Read data from mailbox and increment destination pointer */
2009		*dest = cpu_to_be32(readl(ioa_cfg->ioa_mailbox));
2010		dest++;
2011
2012		/* For all but the last word of data, signal data received */
2013		if (i < (length_in_words - 1)) {
2014			/* Signal dump data received - Clear IO debug Ack */
2015			writel(IPR_PCII_IO_DEBUG_ACKNOWLEDGE,
2016			       ioa_cfg->regs.clr_interrupt_reg);
2017		}
2018	}
2019
2020	/* Signal end of block transfer. Set reset alert then clear IO debug ack */
2021	writel(IPR_UPROCI_RESET_ALERT,
2022	       ioa_cfg->regs.set_uproc_interrupt_reg);
2023
2024	writel(IPR_UPROCI_IO_DEBUG_ALERT,
2025	       ioa_cfg->regs.clr_uproc_interrupt_reg);
2026
2027	/* Signal dump data received - Clear IO debug Ack */
2028	writel(IPR_PCII_IO_DEBUG_ACKNOWLEDGE,
2029	       ioa_cfg->regs.clr_interrupt_reg);
2030
2031	/* Wait for IOA to signal LDUMP exit - IOA reset alert will be cleared */
2032	while (delay < IPR_LDUMP_MAX_SHORT_ACK_DELAY_IN_USEC) {
2033		temp_pcii_reg =
2034		    readl(ioa_cfg->regs.sense_uproc_interrupt_reg);
2035
2036		if (!(temp_pcii_reg & IPR_UPROCI_RESET_ALERT))
2037			return 0;
2038
2039		udelay(10);
2040		delay += 10;
2041	}
2042
2043	return 0;
2044}
2045
2046#ifdef CONFIG_SCSI_IPR_DUMP
2047/**
2048 * ipr_sdt_copy - Copy Smart Dump Table to kernel buffer
2049 * @ioa_cfg:		ioa config struct
2050 * @pci_address:	adapter address
2051 * @length:			length of data to copy
2052 *
2053 * Copy data from PCI adapter to kernel buffer.
2054 * Note: length MUST be a 4 byte multiple
2055 * Return value:
2056 * 	0 on success / other on failure
2057 **/
2058static int ipr_sdt_copy(struct ipr_ioa_cfg *ioa_cfg,
2059			unsigned long pci_address, u32 length)
2060{
2061	int bytes_copied = 0;
2062	int cur_len, rc, rem_len, rem_page_len;
2063	__be32 *page;
2064	unsigned long lock_flags = 0;
2065	struct ipr_ioa_dump *ioa_dump = &ioa_cfg->dump->ioa_dump;
2066
2067	while (bytes_copied < length &&
2068	       (ioa_dump->hdr.len + bytes_copied) < IPR_MAX_IOA_DUMP_SIZE) {
2069		if (ioa_dump->page_offset >= PAGE_SIZE ||
2070		    ioa_dump->page_offset == 0) {
2071			page = (__be32 *)__get_free_page(GFP_ATOMIC);
2072
2073			if (!page) {
2074				ipr_trace;
2075				return bytes_copied;
2076			}
2077
2078			ioa_dump->page_offset = 0;
2079			ioa_dump->ioa_data[ioa_dump->next_page_index] = page;
2080			ioa_dump->next_page_index++;
2081		} else
2082			page = ioa_dump->ioa_data[ioa_dump->next_page_index - 1];
2083
2084		rem_len = length - bytes_copied;
2085		rem_page_len = PAGE_SIZE - ioa_dump->page_offset;
2086		cur_len = min(rem_len, rem_page_len);
2087
2088		spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
2089		if (ioa_cfg->sdt_state == ABORT_DUMP) {
2090			rc = -EIO;
2091		} else {
2092			rc = ipr_get_ldump_data_section(ioa_cfg,
2093							pci_address + bytes_copied,
2094							&page[ioa_dump->page_offset / 4],
2095							(cur_len / sizeof(u32)));
2096		}
2097		spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
2098
2099		if (!rc) {
2100			ioa_dump->page_offset += cur_len;
2101			bytes_copied += cur_len;
2102		} else {
2103			ipr_trace;
2104			break;
2105		}
2106		schedule();
2107	}
2108
2109	return bytes_copied;
2110}
2111
2112/**
2113 * ipr_init_dump_entry_hdr - Initialize a dump entry header.
2114 * @hdr:	dump entry header struct
2115 *
2116 * Return value:
2117 * 	nothing
2118 **/
2119static void ipr_init_dump_entry_hdr(struct ipr_dump_entry_header *hdr)
2120{
2121	hdr->eye_catcher = IPR_DUMP_EYE_CATCHER;
2122	hdr->num_elems = 1;
2123	hdr->offset = sizeof(*hdr);
2124	hdr->status = IPR_DUMP_STATUS_SUCCESS;
2125}
2126
2127/**
2128 * ipr_dump_ioa_type_data - Fill in the adapter type in the dump.
2129 * @ioa_cfg:	ioa config struct
2130 * @driver_dump:	driver dump struct
2131 *
2132 * Return value:
2133 * 	nothing
2134 **/
2135static void ipr_dump_ioa_type_data(struct ipr_ioa_cfg *ioa_cfg,
2136				   struct ipr_driver_dump *driver_dump)
2137{
2138	struct ipr_inquiry_page3 *ucode_vpd = &ioa_cfg->vpd_cbs->page3_data;
2139
2140	ipr_init_dump_entry_hdr(&driver_dump->ioa_type_entry.hdr);
2141	driver_dump->ioa_type_entry.hdr.len =
2142		sizeof(struct ipr_dump_ioa_type_entry) -
2143		sizeof(struct ipr_dump_entry_header);
2144	driver_dump->ioa_type_entry.hdr.data_type = IPR_DUMP_DATA_TYPE_BINARY;
2145	driver_dump->ioa_type_entry.hdr.id = IPR_DUMP_DRIVER_TYPE_ID;
2146	driver_dump->ioa_type_entry.type = ioa_cfg->type;
2147	driver_dump->ioa_type_entry.fw_version = (ucode_vpd->major_release << 24) |
2148		(ucode_vpd->card_type << 16) | (ucode_vpd->minor_release[0] << 8) |
2149		ucode_vpd->minor_release[1];
2150	driver_dump->hdr.num_entries++;
2151}
2152
2153/**
2154 * ipr_dump_version_data - Fill in the driver version in the dump.
2155 * @ioa_cfg:	ioa config struct
2156 * @driver_dump:	driver dump struct
2157 *
2158 * Return value:
2159 * 	nothing
2160 **/
2161static void ipr_dump_version_data(struct ipr_ioa_cfg *ioa_cfg,
2162				  struct ipr_driver_dump *driver_dump)
2163{
2164	ipr_init_dump_entry_hdr(&driver_dump->version_entry.hdr);
2165	driver_dump->version_entry.hdr.len =
2166		sizeof(struct ipr_dump_version_entry) -
2167		sizeof(struct ipr_dump_entry_header);
2168	driver_dump->version_entry.hdr.data_type = IPR_DUMP_DATA_TYPE_ASCII;
2169	driver_dump->version_entry.hdr.id = IPR_DUMP_DRIVER_VERSION_ID;
2170	strcpy(driver_dump->version_entry.version, IPR_DRIVER_VERSION);
2171	driver_dump->hdr.num_entries++;
2172}
2173
2174/**
2175 * ipr_dump_trace_data - Fill in the IOA trace in the dump.
2176 * @ioa_cfg:	ioa config struct
2177 * @driver_dump:	driver dump struct
2178 *
2179 * Return value:
2180 * 	nothing
2181 **/
2182static void ipr_dump_trace_data(struct ipr_ioa_cfg *ioa_cfg,
2183				   struct ipr_driver_dump *driver_dump)
2184{
2185	ipr_init_dump_entry_hdr(&driver_dump->trace_entry.hdr);
2186	driver_dump->trace_entry.hdr.len =
2187		sizeof(struct ipr_dump_trace_entry) -
2188		sizeof(struct ipr_dump_entry_header);
2189	driver_dump->trace_entry.hdr.data_type = IPR_DUMP_DATA_TYPE_BINARY;
2190	driver_dump->trace_entry.hdr.id = IPR_DUMP_TRACE_ID;
2191	memcpy(driver_dump->trace_entry.trace, ioa_cfg->trace, IPR_TRACE_SIZE);
2192	driver_dump->hdr.num_entries++;
2193}
2194
2195/**
2196 * ipr_dump_location_data - Fill in the IOA location in the dump.
2197 * @ioa_cfg:	ioa config struct
2198 * @driver_dump:	driver dump struct
2199 *
2200 * Return value:
2201 * 	nothing
2202 **/
2203static void ipr_dump_location_data(struct ipr_ioa_cfg *ioa_cfg,
2204				   struct ipr_driver_dump *driver_dump)
2205{
2206	ipr_init_dump_entry_hdr(&driver_dump->location_entry.hdr);
2207	driver_dump->location_entry.hdr.len =
2208		sizeof(struct ipr_dump_location_entry) -
2209		sizeof(struct ipr_dump_entry_header);
2210	driver_dump->location_entry.hdr.data_type = IPR_DUMP_DATA_TYPE_ASCII;
2211	driver_dump->location_entry.hdr.id = IPR_DUMP_LOCATION_ID;
2212	strcpy(driver_dump->location_entry.location, ioa_cfg->pdev->dev.bus_id);
2213	driver_dump->hdr.num_entries++;
2214}
2215
2216/**
2217 * ipr_get_ioa_dump - Perform a dump of the driver and adapter.
2218 * @ioa_cfg:	ioa config struct
2219 * @dump:		dump struct
2220 *
2221 * Return value:
2222 * 	nothing
2223 **/
2224static void ipr_get_ioa_dump(struct ipr_ioa_cfg *ioa_cfg, struct ipr_dump *dump)
2225{
2226	unsigned long start_addr, sdt_word;
2227	unsigned long lock_flags = 0;
2228	struct ipr_driver_dump *driver_dump = &dump->driver_dump;
2229	struct ipr_ioa_dump *ioa_dump = &dump->ioa_dump;
2230	u32 num_entries, start_off, end_off;
2231	u32 bytes_to_copy, bytes_copied, rc;
2232	struct ipr_sdt *sdt;
2233	int i;
2234
2235	ENTER;
2236
2237	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
2238
2239	if (ioa_cfg->sdt_state != GET_DUMP) {
2240		spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
2241		return;
2242	}
2243
2244	start_addr = readl(ioa_cfg->ioa_mailbox);
2245
2246	if (!ipr_sdt_is_fmt2(start_addr)) {
2247		dev_err(&ioa_cfg->pdev->dev,
2248			"Invalid dump table format: %lx\n", start_addr);
2249		spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
2250		return;
2251	}
2252
2253	dev_err(&ioa_cfg->pdev->dev, "Dump of IOA initiated\n");
2254
2255	driver_dump->hdr.eye_catcher = IPR_DUMP_EYE_CATCHER;
2256
2257	/* Initialize the overall dump header */
2258	driver_dump->hdr.len = sizeof(struct ipr_driver_dump);
2259	driver_dump->hdr.num_entries = 1;
2260	driver_dump->hdr.first_entry_offset = sizeof(struct ipr_dump_header);
2261	driver_dump->hdr.status = IPR_DUMP_STATUS_SUCCESS;
2262	driver_dump->hdr.os = IPR_DUMP_OS_LINUX;
2263	driver_dump->hdr.driver_name = IPR_DUMP_DRIVER_NAME;
2264
2265	ipr_dump_version_data(ioa_cfg, driver_dump);
2266	ipr_dump_location_data(ioa_cfg, driver_dump);
2267	ipr_dump_ioa_type_data(ioa_cfg, driver_dump);
2268	ipr_dump_trace_data(ioa_cfg, driver_dump);
2269
2270	/* Update dump_header */
2271	driver_dump->hdr.len += sizeof(struct ipr_dump_entry_header);
2272
2273	/* IOA Dump entry */
2274	ipr_init_dump_entry_hdr(&ioa_dump->hdr);
2275	ioa_dump->format = IPR_SDT_FMT2;
2276	ioa_dump->hdr.len = 0;
2277	ioa_dump->hdr.data_type = IPR_DUMP_DATA_TYPE_BINARY;
2278	ioa_dump->hdr.id = IPR_DUMP_IOA_DUMP_ID;
2279
2280	/* First entries in sdt are actually a list of dump addresses and
2281	 lengths to gather the real dump data.  sdt represents the pointer
2282	 to the ioa generated dump table.  Dump data will be extracted based
2283	 on entries in this table */
2284	sdt = &ioa_dump->sdt;
2285
2286	rc = ipr_get_ldump_data_section(ioa_cfg, start_addr, (__be32 *)sdt,
2287					sizeof(struct ipr_sdt) / sizeof(__be32));
2288
2289	/* Smart Dump table is ready to use and the first entry is valid */
2290	if (rc || (be32_to_cpu(sdt->hdr.state) != IPR_FMT2_SDT_READY_TO_USE)) {
2291		dev_err(&ioa_cfg->pdev->dev,
2292			"Dump of IOA failed. Dump table not valid: %d, %X.\n",
2293			rc, be32_to_cpu(sdt->hdr.state));
2294		driver_dump->hdr.status = IPR_DUMP_STATUS_FAILED;
2295		ioa_cfg->sdt_state = DUMP_OBTAINED;
2296		spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
2297		return;
2298	}
2299
2300	num_entries = be32_to_cpu(sdt->hdr.num_entries_used);
2301
2302	if (num_entries > IPR_NUM_SDT_ENTRIES)
2303		num_entries = IPR_NUM_SDT_ENTRIES;
2304
2305	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
2306
2307	for (i = 0; i < num_entries; i++) {
2308		if (ioa_dump->hdr.len > IPR_MAX_IOA_DUMP_SIZE) {
2309			driver_dump->hdr.status = IPR_DUMP_STATUS_QUAL_SUCCESS;
2310			break;
2311		}
2312
2313		if (sdt->entry[i].flags & IPR_SDT_VALID_ENTRY) {
2314			sdt_word = be32_to_cpu(sdt->entry[i].bar_str_offset);
2315			start_off = sdt_word & IPR_FMT2_MBX_ADDR_MASK;
2316			end_off = be32_to_cpu(sdt->entry[i].end_offset);
2317
2318			if (ipr_sdt_is_fmt2(sdt_word) && sdt_word) {
2319				bytes_to_copy = end_off - start_off;
2320				if (bytes_to_copy > IPR_MAX_IOA_DUMP_SIZE) {
2321					sdt->entry[i].flags &= ~IPR_SDT_VALID_ENTRY;
2322					continue;
2323				}
2324
2325				/* Copy data from adapter to driver buffers */
2326				bytes_copied = ipr_sdt_copy(ioa_cfg, sdt_word,
2327							    bytes_to_copy);
2328
2329				ioa_dump->hdr.len += bytes_copied;
2330
2331				if (bytes_copied != bytes_to_copy) {
2332					driver_dump->hdr.status = IPR_DUMP_STATUS_QUAL_SUCCESS;
2333					break;
2334				}
2335			}
2336		}
2337	}
2338
2339	dev_err(&ioa_cfg->pdev->dev, "Dump of IOA completed.\n");
2340
2341	/* Update dump_header */
2342	driver_dump->hdr.len += ioa_dump->hdr.len;
2343	wmb();
2344	ioa_cfg->sdt_state = DUMP_OBTAINED;
2345	LEAVE;
2346}
2347
2348#else
2349#define ipr_get_ioa_dump(ioa_cfg, dump) do { } while(0)
2350#endif
2351
2352/**
2353 * ipr_release_dump - Free adapter dump memory
2354 * @kref:	kref struct
2355 *
2356 * Return value:
2357 *	nothing
2358 **/
2359static void ipr_release_dump(struct kref *kref)
2360{
2361	struct ipr_dump *dump = container_of(kref,struct ipr_dump,kref);
2362	struct ipr_ioa_cfg *ioa_cfg = dump->ioa_cfg;
2363	unsigned long lock_flags = 0;
2364	int i;
2365
2366	ENTER;
2367	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
2368	ioa_cfg->dump = NULL;
2369	ioa_cfg->sdt_state = INACTIVE;
2370	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
2371
2372	for (i = 0; i < dump->ioa_dump.next_page_index; i++)
2373		free_page((unsigned long) dump->ioa_dump.ioa_data[i]);
2374
2375	kfree(dump);
2376	LEAVE;
2377}
2378
2379/**
2380 * ipr_worker_thread - Worker thread
2381 * @work:		ioa config struct
2382 *
2383 * Called at task level from a work thread. This function takes care
2384 * of adding and removing device from the mid-layer as configuration
2385 * changes are detected by the adapter.
2386 *
2387 * Return value:
2388 * 	nothing
2389 **/
2390static void ipr_worker_thread(struct work_struct *work)
2391{
2392	unsigned long lock_flags;
2393	struct ipr_resource_entry *res;
2394	struct scsi_device *sdev;
2395	struct ipr_dump *dump;
2396	struct ipr_ioa_cfg *ioa_cfg =
2397		container_of(work, struct ipr_ioa_cfg, work_q);
2398	u8 bus, target, lun;
2399	int did_work;
2400
2401	ENTER;
2402	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
2403
2404	if (ioa_cfg->sdt_state == GET_DUMP) {
2405		dump = ioa_cfg->dump;
2406		if (!dump) {
2407			spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
2408			return;
2409		}
2410		kref_get(&dump->kref);
2411		spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
2412		ipr_get_ioa_dump(ioa_cfg, dump);
2413		kref_put(&dump->kref, ipr_release_dump);
2414
2415		spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
2416		if (ioa_cfg->sdt_state == DUMP_OBTAINED)
2417			ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE);
2418		spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
2419		return;
2420	}
2421
2422restart:
2423	do {
2424		did_work = 0;
2425		if (!ioa_cfg->allow_cmds || !ioa_cfg->allow_ml_add_del) {
2426			spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
2427			return;
2428		}
2429
2430		list_for_each_entry(res, &ioa_cfg->used_res_q, queue) {
2431			if (res->del_from_ml && res->sdev) {
2432				did_work = 1;
2433				sdev = res->sdev;
2434				if (!scsi_device_get(sdev)) {
2435					list_move_tail(&res->queue, &ioa_cfg->free_res_q);
2436					spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
2437					scsi_remove_device(sdev);
2438					scsi_device_put(sdev);
2439					spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
2440				}
2441				break;
2442			}
2443		}
2444	} while(did_work);
2445
2446	list_for_each_entry(res, &ioa_cfg->used_res_q, queue) {
2447		if (res->add_to_ml) {
2448			bus = res->cfgte.res_addr.bus;
2449			target = res->cfgte.res_addr.target;
2450			lun = res->cfgte.res_addr.lun;
2451			res->add_to_ml = 0;
2452			spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
2453			scsi_add_device(ioa_cfg->host, bus, target, lun);
2454			spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
2455			goto restart;
2456		}
2457	}
2458
2459	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
2460	kobject_uevent(&ioa_cfg->host->shost_classdev.kobj, KOBJ_CHANGE);
2461	LEAVE;
2462}
2463
2464#ifdef CONFIG_SCSI_IPR_TRACE
2465/**
2466 * ipr_read_trace - Dump the adapter trace
2467 * @kobj:		kobject struct
2468 * @buf:		buffer
2469 * @off:		offset
2470 * @count:		buffer size
2471 *
2472 * Return value:
2473 *	number of bytes printed to buffer
2474 **/
2475static ssize_t ipr_read_trace(struct kobject *kobj, char *buf,
2476			      loff_t off, size_t count)
2477{
2478	struct class_device *cdev = container_of(kobj,struct class_device,kobj);
2479	struct Scsi_Host *shost = class_to_shost(cdev);
2480	struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata;
2481	unsigned long lock_flags = 0;
2482	int size = IPR_TRACE_SIZE;
2483	char *src = (char *)ioa_cfg->trace;
2484
2485	if (off > size)
2486		return 0;
2487	if (off + count > size) {
2488		size -= off;
2489		count = size;
2490	}
2491
2492	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
2493	memcpy(buf, &src[off], count);
2494	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
2495	return count;
2496}
2497
2498static struct bin_attribute ipr_trace_attr = {
2499	.attr =	{
2500		.name = "trace",
2501		.mode = S_IRUGO,
2502	},
2503	.size = 0,
2504	.read = ipr_read_trace,
2505};
2506#endif
2507
2508static const struct {
2509	enum ipr_cache_state state;
2510	char *name;
2511} cache_state [] = {
2512	{ CACHE_NONE, "none" },
2513	{ CACHE_DISABLED, "disabled" },
2514	{ CACHE_ENABLED, "enabled" }
2515};
2516
2517/**
2518 * ipr_show_write_caching - Show the write caching attribute
2519 * @class_dev:	class device struct
2520 * @buf:		buffer
2521 *
2522 * Return value:
2523 *	number of bytes printed to buffer
2524 **/
2525static ssize_t ipr_show_write_caching(struct class_device *class_dev, char *buf)
2526{
2527	struct Scsi_Host *shost = class_to_shost(class_dev);
2528	struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata;
2529	unsigned long lock_flags = 0;
2530	int i, len = 0;
2531
2532	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
2533	for (i = 0; i < ARRAY_SIZE(cache_state); i++) {
2534		if (cache_state[i].state == ioa_cfg->cache_state) {
2535			len = snprintf(buf, PAGE_SIZE, "%s\n", cache_state[i].name);
2536			break;
2537		}
2538	}
2539	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
2540	return len;
2541}
2542
2543
2544/**
2545 * ipr_store_write_caching - Enable/disable adapter write cache
2546 * @class_dev:	class_device struct
2547 * @buf:		buffer
2548 * @count:		buffer size
2549 *
2550 * This function will enable/disable adapter write cache.
2551 *
2552 * Return value:
2553 * 	count on success / other on failure
2554 **/
2555static ssize_t ipr_store_write_caching(struct class_device *class_dev,
2556					const char *buf, size_t count)
2557{
2558	struct Scsi_Host *shost = class_to_shost(class_dev);
2559	struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata;
2560	unsigned long lock_flags = 0;
2561	enum ipr_cache_state new_state = CACHE_INVALID;
2562	int i;
2563
2564	if (!capable(CAP_SYS_ADMIN))
2565		return -EACCES;
2566	if (ioa_cfg->cache_state == CACHE_NONE)
2567		return -EINVAL;
2568
2569	for (i = 0; i < ARRAY_SIZE(cache_state); i++) {
2570		if (!strncmp(cache_state[i].name, buf, strlen(cache_state[i].name))) {
2571			new_state = cache_state[i].state;
2572			break;
2573		}
2574	}
2575
2576	if (new_state != CACHE_DISABLED && new_state != CACHE_ENABLED)
2577		return -EINVAL;
2578
2579	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
2580	if (ioa_cfg->cache_state == new_state) {
2581		spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
2582		return count;
2583	}
2584
2585	ioa_cfg->cache_state = new_state;
2586	dev_info(&ioa_cfg->pdev->dev, "%s adapter write cache.\n",
2587		 new_state == CACHE_ENABLED ? "Enabling" : "Disabling");
2588	if (!ioa_cfg->in_reset_reload)
2589		ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NORMAL);
2590	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
2591	wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
2592
2593	return count;
2594}
2595
2596static struct class_device_attribute ipr_ioa_cache_attr = {
2597	.attr = {
2598		.name =		"write_cache",
2599		.mode =		S_IRUGO | S_IWUSR,
2600	},
2601	.show = ipr_show_write_caching,
2602	.store = ipr_store_write_caching
2603};
2604
2605/**
2606 * ipr_show_fw_version - Show the firmware version
2607 * @class_dev:	class device struct
2608 * @buf:		buffer
2609 *
2610 * Return value:
2611 *	number of bytes printed to buffer
2612 **/
2613static ssize_t ipr_show_fw_version(struct class_device *class_dev, char *buf)
2614{
2615	struct Scsi_Host *shost = class_to_shost(class_dev);
2616	struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata;
2617	struct ipr_inquiry_page3 *ucode_vpd = &ioa_cfg->vpd_cbs->page3_data;
2618	unsigned long lock_flags = 0;
2619	int len;
2620
2621	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
2622	len = snprintf(buf, PAGE_SIZE, "%02X%02X%02X%02X\n",
2623		       ucode_vpd->major_release, ucode_vpd->card_type,
2624		       ucode_vpd->minor_release[0],
2625		       ucode_vpd->minor_release[1]);
2626	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
2627	return len;
2628}
2629
2630static struct class_device_attribute ipr_fw_version_attr = {
2631	.attr = {
2632		.name =		"fw_version",
2633		.mode =		S_IRUGO,
2634	},
2635	.show = ipr_show_fw_version,
2636};
2637
2638/**
2639 * ipr_show_log_level - Show the adapter's error logging level
2640 * @class_dev:	class device struct
2641 * @buf:		buffer
2642 *
2643 * Return value:
2644 * 	number of bytes printed to buffer
2645 **/
2646static ssize_t ipr_show_log_level(struct class_device *class_dev, char *buf)
2647{
2648	struct Scsi_Host *shost = class_to_shost(class_dev);
2649	struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata;
2650	unsigned long lock_flags = 0;
2651	int len;
2652
2653	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
2654	len = snprintf(buf, PAGE_SIZE, "%d\n", ioa_cfg->log_level);
2655	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
2656	return len;
2657}
2658
2659/**
2660 * ipr_store_log_level - Change the adapter's error logging level
2661 * @class_dev:	class device struct
2662 * @buf:		buffer
2663 *
2664 * Return value:
2665 * 	number of bytes printed to buffer
2666 **/
2667static ssize_t ipr_store_log_level(struct class_device *class_dev,
2668				   const char *buf, size_t count)
2669{
2670	struct Scsi_Host *shost = class_to_shost(class_dev);
2671	struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata;
2672	unsigned long lock_flags = 0;
2673
2674	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
2675	ioa_cfg->log_level = simple_strtoul(buf, NULL, 10);
2676	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
2677	return strlen(buf);
2678}
2679
2680static struct class_device_attribute ipr_log_level_attr = {
2681	.attr = {
2682		.name =		"log_level",
2683		.mode =		S_IRUGO | S_IWUSR,
2684	},
2685	.show = ipr_show_log_level,
2686	.store = ipr_store_log_level
2687};
2688
2689/**
2690 * ipr_store_diagnostics - IOA Diagnostics interface
2691 * @class_dev:	class_device struct
2692 * @buf:		buffer
2693 * @count:		buffer size
2694 *
2695 * This function will reset the adapter and wait a reasonable
2696 * amount of time for any errors that the adapter might log.
2697 *
2698 * Return value:
2699 * 	count on success / other on failure
2700 **/
2701static ssize_t ipr_store_diagnostics(struct class_device *class_dev,
2702				     const char *buf, size_t count)
2703{
2704	struct Scsi_Host *shost = class_to_shost(class_dev);
2705	struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata;
2706	unsigned long lock_flags = 0;
2707	int rc = count;
2708
2709	if (!capable(CAP_SYS_ADMIN))
2710		return -EACCES;
2711
2712	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
2713	while(ioa_cfg->in_reset_reload) {
2714		spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
2715		wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
2716		spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
2717	}
2718
2719	ioa_cfg->errors_logged = 0;
2720	ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NORMAL);
2721
2722	if (ioa_cfg->in_reset_reload) {
2723		spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
2724		wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
2725
2726		/* Wait for a second for any errors to be logged */
2727		msleep(1000);
2728	} else {
2729		spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
2730		return -EIO;
2731	}
2732
2733	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
2734	if (ioa_cfg->in_reset_reload || ioa_cfg->errors_logged)
2735		rc = -EIO;
2736	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
2737
2738	return rc;
2739}
2740
2741static struct class_device_attribute ipr_diagnostics_attr = {
2742	.attr = {
2743		.name =		"run_diagnostics",
2744		.mode =		S_IWUSR,
2745	},
2746	.store = ipr_store_diagnostics
2747};
2748
2749/**
2750 * ipr_show_adapter_state - Show the adapter's state
2751 * @class_dev:	class device struct
2752 * @buf:		buffer
2753 *
2754 * Return value:
2755 * 	number of bytes printed to buffer
2756 **/
2757static ssize_t ipr_show_adapter_state(struct class_device *class_dev, char *buf)
2758{
2759	struct Scsi_Host *shost = class_to_shost(class_dev);
2760	struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata;
2761	unsigned long lock_flags = 0;
2762	int len;
2763
2764	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
2765	if (ioa_cfg->ioa_is_dead)
2766		len = snprintf(buf, PAGE_SIZE, "offline\n");
2767	else
2768		len = snprintf(buf, PAGE_SIZE, "online\n");
2769	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
2770	return len;
2771}
2772
2773/**
2774 * ipr_store_adapter_state - Change adapter state
2775 * @class_dev:	class_device struct
2776 * @buf:		buffer
2777 * @count:		buffer size
2778 *
2779 * This function will change the adapter's state.
2780 *
2781 * Return value:
2782 * 	count on success / other on failure
2783 **/
2784static ssize_t ipr_store_adapter_state(struct class_device *class_dev,
2785				       const char *buf, size_t count)
2786{
2787	struct Scsi_Host *shost = class_to_shost(class_dev);
2788	struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata;
2789	unsigned long lock_flags;
2790	int result = count;
2791
2792	if (!capable(CAP_SYS_ADMIN))
2793		return -EACCES;
2794
2795	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
2796	if (ioa_cfg->ioa_is_dead && !strncmp(buf, "online", 6)) {
2797		ioa_cfg->ioa_is_dead = 0;
2798		ioa_cfg->reset_retries = 0;
2799		ioa_cfg->in_ioa_bringdown = 0;
2800		ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE);
2801	}
2802	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
2803	wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
2804
2805	return result;
2806}
2807
2808static struct class_device_attribute ipr_ioa_state_attr = {
2809	.attr = {
2810		.name =		"state",
2811		.mode =		S_IRUGO | S_IWUSR,
2812	},
2813	.show = ipr_show_adapter_state,
2814	.store = ipr_store_adapter_state
2815};
2816
2817/**
2818 * ipr_store_reset_adapter - Reset the adapter
2819 * @class_dev:	class_device struct
2820 * @buf:		buffer
2821 * @count:		buffer size
2822 *
2823 * This function will reset the adapter.
2824 *
2825 * Return value:
2826 * 	count on success / other on failure
2827 **/
2828static ssize_t ipr_store_reset_adapter(struct class_device *class_dev,
2829				       const char *buf, size_t count)
2830{
2831	struct Scsi_Host *shost = class_to_shost(class_dev);
2832	struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata;
2833	unsigned long lock_flags;
2834	int result = count;
2835
2836	if (!capable(CAP_SYS_ADMIN))
2837		return -EACCES;
2838
2839	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
2840	if (!ioa_cfg->in_reset_reload)
2841		ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NORMAL);
2842	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
2843	wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
2844
2845	return result;
2846}
2847
2848static struct class_device_attribute ipr_ioa_reset_attr = {
2849	.attr = {
2850		.name =		"reset_host",
2851		.mode =		S_IWUSR,
2852	},
2853	.store = ipr_store_reset_adapter
2854};
2855
2856/**
2857 * ipr_alloc_ucode_buffer - Allocates a microcode download buffer
2858 * @buf_len:		buffer length
2859 *
2860 * Allocates a DMA'able buffer in chunks and assembles a scatter/gather
2861 * list to use for microcode download
2862 *
2863 * Return value:
2864 * 	pointer to sglist / NULL on failure
2865 **/
2866static struct ipr_sglist *ipr_alloc_ucode_buffer(int buf_len)
2867{
2868	int sg_size, order, bsize_elem, num_elem, i, j;
2869	struct ipr_sglist *sglist;
2870	struct scatterlist *scatterlist;
2871	struct page *page;
2872
2873	/* Get the minimum size per scatter/gather element */
2874	sg_size = buf_len / (IPR_MAX_SGLIST - 1);
2875
2876	/* Get the actual size per element */
2877	order = get_order(sg_size);
2878
2879	/* Determine the actual number of bytes per element */
2880	bsize_elem = PAGE_SIZE * (1 << order);
2881
2882	/* Determine the actual number of sg entries needed */
2883	if (buf_len % bsize_elem)
2884		num_elem = (buf_len / bsize_elem) + 1;
2885	else
2886		num_elem = buf_len / bsize_elem;
2887
2888	/* Allocate a scatter/gather list for the DMA */
2889	sglist = kzalloc(sizeof(struct ipr_sglist) +
2890			 (sizeof(struct scatterlist) * (num_elem - 1)),
2891			 GFP_KERNEL);
2892
2893	if (sglist == NULL) {
2894		ipr_trace;
2895		return NULL;
2896	}
2897
2898	scatterlist = sglist->scatterlist;
2899
2900	sglist->order = order;
2901	sglist->num_sg = num_elem;
2902
2903	/* Allocate a bunch of sg elements */
2904	for (i = 0; i < num_elem; i++) {
2905		page = alloc_pages(GFP_KERNEL, order);
2906		if (!page) {
2907			ipr_trace;
2908
2909			/* Free up what we already allocated */
2910			for (j = i - 1; j >= 0; j--)
2911				__free_pages(scatterlist[j].page, order);
2912			kfree(sglist);
2913			return NULL;
2914		}
2915
2916		scatterlist[i].page = page;
2917	}
2918
2919	return sglist;
2920}
2921
2922/**
2923 * ipr_free_ucode_buffer - Frees a microcode download buffer
2924 * @p_dnld:		scatter/gather list pointer
2925 *
2926 * Free a DMA'able ucode download buffer previously allocated with
2927 * ipr_alloc_ucode_buffer
2928 *
2929 * Return value:
2930 * 	nothing
2931 **/
2932static void ipr_free_ucode_buffer(struct ipr_sglist *sglist)
2933{
2934	int i;
2935
2936	for (i = 0; i < sglist->num_sg; i++)
2937		__free_pages(sglist->scatterlist[i].page, sglist->order);
2938
2939	kfree(sglist);
2940}
2941
2942/**
2943 * ipr_copy_ucode_buffer - Copy user buffer to kernel buffer
2944 * @sglist:		scatter/gather list pointer
2945 * @buffer:		buffer pointer
2946 * @len:		buffer length
2947 *
2948 * Copy a microcode image from a user buffer into a buffer allocated by
2949 * ipr_alloc_ucode_buffer
2950 *
2951 * Return value:
2952 * 	0 on success / other on failure
2953 **/
2954static int ipr_copy_ucode_buffer(struct ipr_sglist *sglist,
2955				 u8 *buffer, u32 len)
2956{
2957	int bsize_elem, i, result = 0;
2958	struct scatterlist *scatterlist;
2959	void *kaddr;
2960
2961	/* Determine the actual number of bytes per element */
2962	bsize_elem = PAGE_SIZE * (1 << sglist->order);
2963
2964	scatterlist = sglist->scatterlist;
2965
2966	for (i = 0; i < (len / bsize_elem); i++, buffer += bsize_elem) {
2967		kaddr = kmap(scatterlist[i].page);
2968		memcpy(kaddr, buffer, bsize_elem);
2969		kunmap(scatterlist[i].page);
2970
2971		scatterlist[i].length = bsize_elem;
2972
2973		if (result != 0) {
2974			ipr_trace;
2975			return result;
2976		}
2977	}
2978
2979	if (len % bsize_elem) {
2980		kaddr = kmap(scatterlist[i].page);
2981		memcpy(kaddr, buffer, len % bsize_elem);
2982		kunmap(scatterlist[i].page);
2983
2984		scatterlist[i].length = len % bsize_elem;
2985	}
2986
2987	sglist->buffer_len = len;
2988	return result;
2989}
2990
2991/**
2992 * ipr_build_ucode_ioadl - Build a microcode download IOADL
2993 * @ipr_cmd:	ipr command struct
2994 * @sglist:		scatter/gather list
2995 *
2996 * Builds a microcode download IOA data list (IOADL).
2997 *
2998 **/
2999static void ipr_build_ucode_ioadl(struct ipr_cmnd *ipr_cmd,
3000				  struct ipr_sglist *sglist)
3001{
3002	struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
3003	struct ipr_ioadl_desc *ioadl = ipr_cmd->ioadl;
3004	struct scatterlist *scatterlist = sglist->scatterlist;
3005	int i;
3006
3007	ipr_cmd->dma_use_sg = sglist->num_dma_sg;
3008	ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_WRITE_NOT_READ;
3009	ioarcb->write_data_transfer_length = cpu_to_be32(sglist->buffer_len);
3010	ioarcb->write_ioadl_len =
3011		cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg);
3012
3013	for (i = 0; i < ipr_cmd->dma_use_sg; i++) {
3014		ioadl[i].flags_and_data_len =
3015			cpu_to_be32(IPR_IOADL_FLAGS_WRITE | sg_dma_len(&scatterlist[i]));
3016		ioadl[i].address =
3017			cpu_to_be32(sg_dma_address(&scatterlist[i]));
3018	}
3019
3020	ioadl[i-1].flags_and_data_len |=
3021		cpu_to_be32(IPR_IOADL_FLAGS_LAST);
3022}
3023
3024/**
3025 * ipr_update_ioa_ucode - Update IOA's microcode
3026 * @ioa_cfg:	ioa config struct
3027 * @sglist:		scatter/gather list
3028 *
3029 * Initiate an adapter reset to update the IOA's microcode
3030 *
3031 * Return value:
3032 * 	0 on success / -EIO on failure
3033 **/
3034static int ipr_update_ioa_ucode(struct ipr_ioa_cfg *ioa_cfg,
3035				struct ipr_sglist *sglist)
3036{
3037	unsigned long lock_flags;
3038
3039	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
3040	while(ioa_cfg->in_reset_reload) {
3041		spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
3042		wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
3043		spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
3044	}
3045
3046	if (ioa_cfg->ucode_sglist) {
3047		spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
3048		dev_err(&ioa_cfg->pdev->dev,
3049			"Microcode download already in progress\n");
3050		return -EIO;
3051	}
3052
3053	sglist->num_dma_sg = pci_map_sg(ioa_cfg->pdev, sglist->scatterlist,
3054					sglist->num_sg, DMA_TO_DEVICE);
3055
3056	if (!sglist->num_dma_sg) {
3057		spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
3058		dev_err(&ioa_cfg->pdev->dev,
3059			"Failed to map microcode download buffer!\n");
3060		return -EIO;
3061	}
3062
3063	ioa_cfg->ucode_sglist = sglist;
3064	ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NORMAL);
3065	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
3066	wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
3067
3068	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
3069	ioa_cfg->ucode_sglist = NULL;
3070	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
3071	return 0;
3072}
3073
3074/**
3075 * ipr_store_update_fw - Update the firmware on the adapter
3076 * @class_dev:	class_device struct
3077 * @buf:		buffer
3078 * @count:		buffer size
3079 *
3080 * This function will update the firmware on the adapter.
3081 *
3082 * Return value:
3083 * 	count on success / other on failure
3084 **/
3085static ssize_t ipr_store_update_fw(struct class_device *class_dev,
3086				       const char *buf, size_t count)
3087{
3088	struct Scsi_Host *shost = class_to_shost(class_dev);
3089	struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata;
3090	struct ipr_ucode_image_header *image_hdr;
3091	const struct firmware *fw_entry;
3092	struct ipr_sglist *sglist;
3093	char fname[100];
3094	char *src;
3095	int len, result, dnld_size;
3096
3097	if (!capable(CAP_SYS_ADMIN))
3098		return -EACCES;
3099
3100	len = snprintf(fname, 99, "%s", buf);
3101	fname[len-1] = '\0';
3102
3103	if(request_firmware(&fw_entry, fname, &ioa_cfg->pdev->dev)) {
3104		dev_err(&ioa_cfg->pdev->dev, "Firmware file %s not found\n", fname);
3105		return -EIO;
3106	}
3107
3108	image_hdr = (struct ipr_ucode_image_header *)fw_entry->data;
3109
3110	if (be32_to_cpu(image_hdr->header_length) > fw_entry->size ||
3111	    (ioa_cfg->vpd_cbs->page3_data.card_type &&
3112	     ioa_cfg->vpd_cbs->page3_data.card_type != image_hdr->card_type)) {
3113		dev_err(&ioa_cfg->pdev->dev, "Invalid microcode buffer\n");
3114		release_firmware(fw_entry);
3115		return -EINVAL;
3116	}
3117
3118	src = (u8 *)image_hdr + be32_to_cpu(image_hdr->header_length);
3119	dnld_size = fw_entry->size - be32_to_cpu(image_hdr->header_length);
3120	sglist = ipr_alloc_ucode_buffer(dnld_size);
3121
3122	if (!sglist) {
3123		dev_err(&ioa_cfg->pdev->dev, "Microcode buffer allocation failed\n");
3124		release_firmware(fw_entry);
3125		return -ENOMEM;
3126	}
3127
3128	result = ipr_copy_ucode_buffer(sglist, src, dnld_size);
3129
3130	if (result) {
3131		dev_err(&ioa_cfg->pdev->dev,
3132			"Microcode buffer copy to DMA buffer failed\n");
3133		goto out;
3134	}
3135
3136	result = ipr_update_ioa_ucode(ioa_cfg, sglist);
3137
3138	if (!result)
3139		result = count;
3140out:
3141	ipr_free_ucode_buffer(sglist);
3142	release_firmware(fw_entry);
3143	return result;
3144}
3145
3146static struct class_device_attribute ipr_update_fw_attr = {
3147	.attr = {
3148		.name =		"update_fw",
3149		.mode =		S_IWUSR,
3150	},
3151	.store = ipr_store_update_fw
3152};
3153
3154static struct class_device_attribute *ipr_ioa_attrs[] = {
3155	&ipr_fw_version_attr,
3156	&ipr_log_level_attr,
3157	&ipr_diagnostics_attr,
3158	&ipr_ioa_state_attr,
3159	&ipr_ioa_reset_attr,
3160	&ipr_update_fw_attr,
3161	&ipr_ioa_cache_attr,
3162	NULL,
3163};
3164
3165#ifdef CONFIG_SCSI_IPR_DUMP
3166/**
3167 * ipr_read_dump - Dump the adapter
3168 * @kobj:		kobject struct
3169 * @buf:		buffer
3170 * @off:		offset
3171 * @count:		buffer size
3172 *
3173 * Return value:
3174 *	number of bytes printed to buffer
3175 **/
3176static ssize_t ipr_read_dump(struct kobject *kobj, char *buf,
3177			      loff_t off, size_t count)
3178{
3179	struct class_device *cdev = container_of(kobj,struct class_device,kobj);
3180	struct Scsi_Host *shost = class_to_shost(cdev);
3181	struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata;
3182	struct ipr_dump *dump;
3183	unsigned long lock_flags = 0;
3184	char *src;
3185	int len;
3186	size_t rc = count;
3187
3188	if (!capable(CAP_SYS_ADMIN))
3189		return -EACCES;
3190
3191	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
3192	dump = ioa_cfg->dump;
3193
3194	if (ioa_cfg->sdt_state != DUMP_OBTAINED || !dump) {
3195		spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
3196		return 0;
3197	}
3198	kref_get(&dump->kref);
3199	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
3200
3201	if (off > dump->driver_dump.hdr.len) {
3202		kref_put(&dump->kref, ipr_release_dump);
3203		return 0;
3204	}
3205
3206	if (off + count > dump->driver_dump.hdr.len) {
3207		count = dump->driver_dump.hdr.len - off;
3208		rc = count;
3209	}
3210
3211	if (count && off < sizeof(dump->driver_dump)) {
3212		if (off + count > sizeof(dump->driver_dump))
3213			len = sizeof(dump->driver_dump) - off;
3214		else
3215			len = count;
3216		src = (u8 *)&dump->driver_dump + off;
3217		memcpy(buf, src, len);
3218		buf += len;
3219		off += len;
3220		count -= len;
3221	}
3222
3223	off -= sizeof(dump->driver_dump);
3224
3225	if (count && off < offsetof(struct ipr_ioa_dump, ioa_data)) {
3226		if (off + count > offsetof(struct ipr_ioa_dump, ioa_data))
3227			len = offsetof(struct ipr_ioa_dump, ioa_data) - off;
3228		else
3229			len = count;
3230		src = (u8 *)&dump->ioa_dump + off;
3231		memcpy(buf, src, len);
3232		buf += len;
3233		off += len;
3234		count -= len;
3235	}
3236
3237	off -= offsetof(struct ipr_ioa_dump, ioa_data);
3238
3239	while (count) {
3240		if ((off & PAGE_MASK) != ((off + count) & PAGE_MASK))
3241			len = PAGE_ALIGN(off) - off;
3242		else
3243			len = count;
3244		src = (u8 *)dump->ioa_dump.ioa_data[(off & PAGE_MASK) >> PAGE_SHIFT];
3245		src += off & ~PAGE_MASK;
3246		memcpy(buf, src, len);
3247		buf += len;
3248		off += len;
3249		count -= len;
3250	}
3251
3252	kref_put(&dump->kref, ipr_release_dump);
3253	return rc;
3254}
3255
3256/**
3257 * ipr_alloc_dump - Prepare for adapter dump
3258 * @ioa_cfg:	ioa config struct
3259 *
3260 * Return value:
3261 *	0 on success / other on failure
3262 **/
3263static int ipr_alloc_dump(struct ipr_ioa_cfg *ioa_cfg)
3264{
3265	struct ipr_dump *dump;
3266	unsigned long lock_flags = 0;
3267
3268	dump = kzalloc(sizeof(struct ipr_dump), GFP_KERNEL);
3269
3270	if (!dump) {
3271		ipr_err("Dump memory allocation failed\n");
3272		return -ENOMEM;
3273	}
3274
3275	kref_init(&dump->kref);
3276	dump->ioa_cfg = ioa_cfg;
3277
3278	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
3279
3280	if (INACTIVE != ioa_cfg->sdt_state) {
3281		spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
3282		kfree(dump);
3283		return 0;
3284	}
3285
3286	ioa_cfg->dump = dump;
3287	ioa_cfg->sdt_state = WAIT_FOR_DUMP;
3288	if (ioa_cfg->ioa_is_dead && !ioa_cfg->dump_taken) {
3289		ioa_cfg->dump_taken = 1;
3290		schedule_work(&ioa_cfg->work_q);
3291	}
3292	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
3293
3294	return 0;
3295}
3296
3297/**
3298 * ipr_free_dump - Free adapter dump memory
3299 * @ioa_cfg:	ioa config struct
3300 *
3301 * Return value:
3302 *	0 on success / other on failure
3303 **/
3304static int ipr_free_dump(struct ipr_ioa_cfg *ioa_cfg)
3305{
3306	struct ipr_dump *dump;
3307	unsigned long lock_flags = 0;
3308
3309	ENTER;
3310
3311	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
3312	dump = ioa_cfg->dump;
3313	if (!dump) {
3314		spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
3315		return 0;
3316	}
3317
3318	ioa_cfg->dump = NULL;
3319	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
3320
3321	kref_put(&dump->kref, ipr_release_dump);
3322
3323	LEAVE;
3324	return 0;
3325}
3326
3327/**
3328 * ipr_write_dump - Setup dump state of adapter
3329 * @kobj:		kobject struct
3330 * @buf:		buffer
3331 * @off:		offset
3332 * @count:		buffer size
3333 *
3334 * Return value:
3335 *	number of bytes printed to buffer
3336 **/
3337static ssize_t ipr_write_dump(struct kobject *kobj, char *buf,
3338			      loff_t off, size_t count)
3339{
3340	struct class_device *cdev = container_of(kobj,struct class_device,kobj);
3341	struct Scsi_Host *shost = class_to_shost(cdev);
3342	struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata;
3343	int rc;
3344
3345	if (!capable(CAP_SYS_ADMIN))
3346		return -EACCES;
3347
3348	if (buf[0] == '1')
3349		rc = ipr_alloc_dump(ioa_cfg);
3350	else if (buf[0] == '0')
3351		rc = ipr_free_dump(ioa_cfg);
3352	else
3353		return -EINVAL;
3354
3355	if (rc)
3356		return rc;
3357	else
3358		return count;
3359}
3360
3361static struct bin_attribute ipr_dump_attr = {
3362	.attr =	{
3363		.name = "dump",
3364		.mode = S_IRUSR | S_IWUSR,
3365	},
3366	.size = 0,
3367	.read = ipr_read_dump,
3368	.write = ipr_write_dump
3369};
3370#else
3371static int ipr_free_dump(struct ipr_ioa_cfg *ioa_cfg) { return 0; };
3372#endif
3373
3374/**
3375 * ipr_change_queue_depth - Change the device's queue depth
3376 * @sdev:	scsi device struct
3377 * @qdepth:	depth to set
3378 *
3379 * Return value:
3380 * 	actual depth set
3381 **/
3382static int ipr_change_queue_depth(struct scsi_device *sdev, int qdepth)
3383{
3384	struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)sdev->host->hostdata;
3385	struct ipr_resource_entry *res;
3386	unsigned long lock_flags = 0;
3387
3388	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
3389	res = (struct ipr_resource_entry *)sdev->hostdata;
3390
3391	if (res && ipr_is_gata(res) && qdepth > IPR_MAX_CMD_PER_ATA_LUN)
3392		qdepth = IPR_MAX_CMD_PER_ATA_LUN;
3393	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
3394
3395	scsi_adjust_queue_depth(sdev, scsi_get_tag_type(sdev), qdepth);
3396	return sdev->queue_depth;
3397}
3398
3399/**
3400 * ipr_change_queue_type - Change the device's queue type
3401 * @dsev:		scsi device struct
3402 * @tag_type:	type of tags to use
3403 *
3404 * Return value:
3405 * 	actual queue type set
3406 **/
3407static int ipr_change_queue_type(struct scsi_device *sdev, int tag_type)
3408{
3409	struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)sdev->host->hostdata;
3410	struct ipr_resource_entry *res;
3411	unsigned long lock_flags = 0;
3412
3413	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
3414	res = (struct ipr_resource_entry *)sdev->hostdata;
3415
3416	if (res) {
3417		if (ipr_is_gscsi(res) && sdev->tagged_supported) {
3418			/*
3419			 * We don't bother quiescing the device here since the
3420			 * adapter firmware does it for us.
3421			 */
3422			scsi_set_tag_type(sdev, tag_type);
3423
3424			if (tag_type)
3425				scsi_activate_tcq(sdev, sdev->queue_depth);
3426			else
3427				scsi_deactivate_tcq(sdev, sdev->queue_depth);
3428		} else
3429			tag_type = 0;
3430	} else
3431		tag_type = 0;
3432
3433	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
3434	return tag_type;
3435}
3436
3437/**
3438 * ipr_show_adapter_handle - Show the adapter's resource handle for this device
3439 * @dev:	device struct
3440 * @buf:	buffer
3441 *
3442 * Return value:
3443 * 	number of bytes printed to buffer
3444 **/
3445static ssize_t ipr_show_adapter_handle(struct device *dev, struct device_attribute *attr, char *buf)
3446{
3447	struct scsi_device *sdev = to_scsi_device(dev);
3448	struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)sdev->host->hostdata;
3449	struct ipr_resource_entry *res;
3450	unsigned long lock_flags = 0;
3451	ssize_t len = -ENXIO;
3452
3453	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
3454	res = (struct ipr_resource_entry *)sdev->hostdata;
3455	if (res)
3456		len = snprintf(buf, PAGE_SIZE, "%08X\n", res->cfgte.res_handle);
3457	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
3458	return len;
3459}
3460
3461static struct device_attribute ipr_adapter_handle_attr = {
3462	.attr = {
3463		.name = 	"adapter_handle",
3464		.mode =		S_IRUSR,
3465	},
3466	.show = ipr_show_adapter_handle
3467};
3468
3469static struct device_attribute *ipr_dev_attrs[] = {
3470	&ipr_adapter_handle_attr,
3471	NULL,
3472};
3473
3474/**
3475 * ipr_biosparam - Return the HSC mapping
3476 * @sdev:			scsi device struct
3477 * @block_device:	block device pointer
3478 * @capacity:		capacity of the device
3479 * @parm:			Array containing returned HSC values.
3480 *
3481 * This function generates the HSC parms that fdisk uses.
3482 * We want to make sure we return something that places partitions
3483 * on 4k boundaries for best performance with the IOA.
3484 *
3485 * Return value:
3486 * 	0 on success
3487 **/
3488static int ipr_biosparam(struct scsi_device *sdev,
3489			 struct block_device *block_device,
3490			 sector_t capacity, int *parm)
3491{
3492	int heads, sectors;
3493	sector_t cylinders;
3494
3495	heads = 128;
3496	sectors = 32;
3497
3498	cylinders = capacity;
3499	sector_div(cylinders, (128 * 32));
3500
3501	/* return result */
3502	parm[0] = heads;
3503	parm[1] = sectors;
3504	parm[2] = cylinders;
3505
3506	return 0;
3507}
3508
3509/**
3510 * ipr_find_starget - Find target based on bus/target.
3511 * @starget:	scsi target struct
3512 *
3513 * Return value:
3514 * 	resource entry pointer if found / NULL if not found
3515 **/
3516static struct ipr_resource_entry *ipr_find_starget(struct scsi_target *starget)
3517{
3518	struct Scsi_Host *shost = dev_to_shost(&starget->dev);
3519	struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) shost->hostdata;
3520	struct ipr_resource_entry *res;
3521
3522	list_for_each_entry(res, &ioa_cfg->used_res_q, queue) {
3523		if ((res->cfgte.res_addr.bus == starget->channel) &&
3524		    (res->cfgte.res_addr.target == starget->id) &&
3525		    (res->cfgte.res_addr.lun == 0)) {
3526			return res;
3527		}
3528	}
3529
3530	return NULL;
3531}
3532
3533static struct ata_port_info sata_port_info;
3534
3535/**
3536 * ipr_target_alloc - Prepare for commands to a SCSI target
3537 * @starget:	scsi target struct
3538 *
3539 * If the device is a SATA device, this function allocates an
3540 * ATA port with libata, else it does nothing.
3541 *
3542 * Return value:
3543 * 	0 on success / non-0 on failure
3544 **/
3545static int ipr_target_alloc(struct scsi_target *starget)
3546{
3547	struct Scsi_Host *shost = dev_to_shost(&starget->dev);
3548	struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) shost->hostdata;
3549	struct ipr_sata_port *sata_port;
3550	struct ata_port *ap;
3551	struct ipr_resource_entry *res;
3552	unsigned long lock_flags;
3553
3554	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
3555	res = ipr_find_starget(starget);
3556	starget->hostdata = NULL;
3557
3558	if (res && ipr_is_gata(res)) {
3559		spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
3560		sata_port = kzalloc(sizeof(*sata_port), GFP_KERNEL);
3561		if (!sata_port)
3562			return -ENOMEM;
3563
3564		ap = ata_sas_port_alloc(&ioa_cfg->ata_host, &sata_port_info, shost);
3565		if (ap) {
3566			spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
3567			sata_port->ioa_cfg = ioa_cfg;
3568			sata_port->ap = ap;
3569			sata_port->res = res;
3570
3571			res->sata_port = sata_port;
3572			ap->private_data = sata_port;
3573			starget->hostdata = sata_port;
3574		} else {
3575			kfree(sata_port);
3576			return -ENOMEM;
3577		}
3578	}
3579	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
3580
3581	return 0;
3582}
3583
3584/**
3585 * ipr_target_destroy - Destroy a SCSI target
3586 * @starget:	scsi target struct
3587 *
3588 * If the device was a SATA device, this function frees the libata
3589 * ATA port, else it does nothing.
3590 *
3591 **/
3592static void ipr_target_destroy(struct scsi_target *starget)
3593{
3594	struct ipr_sata_port *sata_port = starget->hostdata;
3595
3596	if (sata_port) {
3597		starget->hostdata = NULL;
3598		ata_sas_port_destroy(sata_port->ap);
3599		kfree(sata_port);
3600	}
3601}
3602
3603/**
3604 * ipr_find_sdev - Find device based on bus/target/lun.
3605 * @sdev:	scsi device struct
3606 *
3607 * Return value:
3608 * 	resource entry pointer if found / NULL if not found
3609 **/
3610static struct ipr_resource_entry *ipr_find_sdev(struct scsi_device *sdev)
3611{
3612	struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) sdev->host->hostdata;
3613	struct ipr_resource_entry *res;
3614
3615	list_for_each_entry(res, &ioa_cfg->used_res_q, queue) {
3616		if ((res->cfgte.res_addr.bus == sdev->channel) &&
3617		    (res->cfgte.res_addr.target == sdev->id) &&
3618		    (res->cfgte.res_addr.lun == sdev->lun))
3619			return res;
3620	}
3621
3622	return NULL;
3623}
3624
3625/**
3626 * ipr_slave_destroy - Unconfigure a SCSI device
3627 * @sdev:	scsi device struct
3628 *
3629 * Return value:
3630 * 	nothing
3631 **/
3632static void ipr_slave_destroy(struct scsi_device *sdev)
3633{
3634	struct ipr_resource_entry *res;
3635	struct ipr_ioa_cfg *ioa_cfg;
3636	unsigned long lock_flags = 0;
3637
3638	ioa_cfg = (struct ipr_ioa_cfg *) sdev->host->hostdata;
3639
3640	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
3641	res = (struct ipr_resource_entry *) sdev->hostdata;
3642	if (res) {
3643		if (res->sata_port)
3644			ata_port_disable(res->sata_port->ap);
3645		sdev->hostdata = NULL;
3646		res->sdev = NULL;
3647		res->sata_port = NULL;
3648	}
3649	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
3650}
3651
3652/**
3653 * ipr_slave_configure - Configure a SCSI device
3654 * @sdev:	scsi device struct
3655 *
3656 * This function configures the specified scsi device.
3657 *
3658 * Return value:
3659 * 	0 on success
3660 **/
3661static int ipr_slave_configure(struct scsi_device *sdev)
3662{
3663	struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) sdev->host->hostdata;
3664	struct ipr_resource_entry *res;
3665	unsigned long lock_flags = 0;
3666
3667	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
3668	res = sdev->hostdata;
3669	if (res) {
3670		if (ipr_is_af_dasd_device(res))
3671			sdev->type = TYPE_RAID;
3672		if (ipr_is_af_dasd_device(res) || ipr_is_ioa_resource(res)) {
3673			sdev->scsi_level = 4;
3674			sdev->no_uld_attach = 1;
3675		}
3676		if (ipr_is_vset_device(res)) {
3677			sdev->timeout = IPR_VSET_RW_TIMEOUT;
3678			blk_queue_max_sectors(sdev->request_queue, IPR_VSET_MAX_SECTORS);
3679		}
3680		if (ipr_is_vset_device(res) || ipr_is_scsi_disk(res))
3681			sdev->allow_restart = 1;
3682		if (ipr_is_gata(res) && res->sata_port) {
3683			scsi_adjust_queue_depth(sdev, 0, IPR_MAX_CMD_PER_ATA_LUN);
3684			ata_sas_slave_configure(sdev, res->sata_port->ap);
3685		} else {
3686			scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun);
3687		}
3688	}
3689	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
3690	return 0;
3691}
3692
3693/**
3694 * ipr_ata_slave_alloc - Prepare for commands to a SATA device
3695 * @sdev:	scsi device struct
3696 *
3697 * This function initializes an ATA port so that future commands
3698 * sent through queuecommand will work.
3699 *
3700 * Return value:
3701 * 	0 on success
3702 **/
3703static int ipr_ata_slave_alloc(struct scsi_device *sdev)
3704{
3705	struct ipr_sata_port *sata_port = NULL;
3706	int rc = -ENXIO;
3707
3708	ENTER;
3709	if (sdev->sdev_target)
3710		sata_port = sdev->sdev_target->hostdata;
3711	if (sata_port)
3712		rc = ata_sas_port_init(sata_port->ap);
3713	if (rc)
3714		ipr_slave_destroy(sdev);
3715
3716	LEAVE;
3717	return rc;
3718}
3719
3720/**
3721 * ipr_slave_alloc - Prepare for commands to a device.
3722 * @sdev:	scsi device struct
3723 *
3724 * This function saves a pointer to the resource entry
3725 * in the scsi device struct if the device exists. We
3726 * can then use this pointer in ipr_queuecommand when
3727 * handling new commands.
3728 *
3729 * Return value:
3730 * 	0 on success / -ENXIO if device does not exist
3731 **/
3732static int ipr_slave_alloc(struct scsi_device *sdev)
3733{
3734	struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) sdev->host->hostdata;
3735	struct ipr_resource_entry *res;
3736	unsigned long lock_flags;
3737	int rc = -ENXIO;
3738
3739	sdev->hostdata = NULL;
3740
3741	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
3742
3743	res = ipr_find_sdev(sdev);
3744	if (res) {
3745		res->sdev = sdev;
3746		res->add_to_ml = 0;
3747		res->in_erp = 0;
3748		sdev->hostdata = res;
3749		if (!ipr_is_naca_model(res))
3750			res->needs_sync_complete = 1;
3751		rc = 0;
3752		if (ipr_is_gata(res)) {
3753			spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
3754			return ipr_ata_slave_alloc(sdev);
3755		}
3756	}
3757
3758	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
3759
3760	return rc;
3761}
3762
3763/**
3764 * ipr_eh_host_reset - Reset the host adapter
3765 * @scsi_cmd:	scsi command struct
3766 *
3767 * Return value:
3768 * 	SUCCESS / FAILED
3769 **/
3770static int __ipr_eh_host_reset(struct scsi_cmnd * scsi_cmd)
3771{
3772	struct ipr_ioa_cfg *ioa_cfg;
3773	int rc;
3774
3775	ENTER;
3776	ioa_cfg = (struct ipr_ioa_cfg *) scsi_cmd->device->host->hostdata;
3777
3778	dev_err(&ioa_cfg->pdev->dev,
3779		"Adapter being reset as a result of error recovery.\n");
3780
3781	if (WAIT_FOR_DUMP == ioa_cfg->sdt_state)
3782		ioa_cfg->sdt_state = GET_DUMP;
3783
3784	rc = ipr_reset_reload(ioa_cfg, IPR_SHUTDOWN_ABBREV);
3785
3786	LEAVE;
3787	return rc;
3788}
3789
3790static int ipr_eh_host_reset(struct scsi_cmnd * cmd)
3791{
3792	int rc;
3793
3794	spin_lock_irq(cmd->device->host->host_lock);
3795	rc = __ipr_eh_host_reset(cmd);
3796	spin_unlock_irq(cmd->device->host->host_lock);
3797
3798	return rc;
3799}
3800
3801/**
3802 * ipr_device_reset - Reset the device
3803 * @ioa_cfg:	ioa config struct
3804 * @res:		resource entry struct
3805 *
3806 * This function issues a device reset to the affected device.
3807 * If the device is a SCSI device, a LUN reset will be sent
3808 * to the device first. If that does not work, a target reset
3809 * will be sent. If the device is a SATA device, a PHY reset will
3810 * be sent.
3811 *
3812 * Return value:
3813 *	0 on success / non-zero on failure
3814 **/
3815static int ipr_device_reset(struct ipr_ioa_cfg *ioa_cfg,
3816			    struct ipr_resource_entry *res)
3817{
3818	struct ipr_cmnd *ipr_cmd;
3819	struct ipr_ioarcb *ioarcb;
3820	struct ipr_cmd_pkt *cmd_pkt;
3821	struct ipr_ioarcb_ata_regs *regs;
3822	u32 ioasc;
3823
3824	ENTER;
3825	ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg);
3826	ioarcb = &ipr_cmd->ioarcb;
3827	cmd_pkt = &ioarcb->cmd_pkt;
3828	regs = &ioarcb->add_data.u.regs;
3829
3830	ioarcb->res_handle = res->cfgte.res_handle;
3831	cmd_pkt->request_type = IPR_RQTYPE_IOACMD;
3832	cmd_pkt->cdb[0] = IPR_RESET_DEVICE;
3833	if (ipr_is_gata(res)) {
3834		cmd_pkt->cdb[2] = IPR_ATA_PHY_RESET;
3835		ioarcb->add_cmd_parms_len = cpu_to_be32(sizeof(regs->flags));
3836		regs->flags |= IPR_ATA_FLAG_STATUS_ON_GOOD_COMPLETION;
3837	}
3838
3839	ipr_send_blocking_cmd(ipr_cmd, ipr_timeout, IPR_DEVICE_RESET_TIMEOUT);
3840	ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
3841	list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q);
3842	if (ipr_is_gata(res) && res->sata_port && ioasc != IPR_IOASC_IOA_WAS_RESET)
3843		memcpy(&res->sata_port->ioasa, &ipr_cmd->ioasa.u.gata,
3844		       sizeof(struct ipr_ioasa_gata));
3845
3846	LEAVE;
3847	return (IPR_IOASC_SENSE_KEY(ioasc) ? -EIO : 0);
3848}
3849
3850/**
3851 * ipr_sata_reset - Reset the SATA port
3852 * @ap:		SATA port to reset
3853 * @classes:	class of the attached device
3854 *
3855 * This function issues a SATA phy reset to the affected ATA port.
3856 *
3857 * Return value:
3858 *	0 on success / non-zero on failure
3859 **/
3860static int ipr_sata_reset(struct ata_port *ap, unsigned int *classes,
3861				unsigned long deadline)
3862{
3863	struct ipr_sata_port *sata_port = ap->private_data;
3864	struct ipr_ioa_cfg *ioa_cfg = sata_port->ioa_cfg;
3865	struct ipr_resource_entry *res;
3866	unsigned long lock_flags = 0;
3867	int rc = -ENXIO;
3868
3869	ENTER;
3870	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
3871	while(ioa_cfg->in_reset_reload) {
3872		spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
3873		wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
3874		spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
3875	}
3876
3877	res = sata_port->res;
3878	if (res) {
3879		rc = ipr_device_reset(ioa_cfg, res);
3880		switch(res->cfgte.proto) {
3881		case IPR_PROTO_SATA:
3882		case IPR_PROTO_SAS_STP:
3883			*classes = ATA_DEV_ATA;
3884			break;
3885		case IPR_PROTO_SATA_ATAPI:
3886		case IPR_PROTO_SAS_STP_ATAPI:
3887			*classes = ATA_DEV_ATAPI;
3888			break;
3889		default:
3890			*classes = ATA_DEV_UNKNOWN;
3891			break;
3892		};
3893	}
3894
3895	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
3896	LEAVE;
3897	return rc;
3898}
3899
3900/**
3901 * ipr_eh_dev_reset - Reset the device
3902 * @scsi_cmd:	scsi command struct
3903 *
3904 * This function issues a device reset to the affected device.
3905 * A LUN reset will be sent to the device first. If that does
3906 * not work, a target reset will be sent.
3907 *
3908 * Return value:
3909 *	SUCCESS / FAILED
3910 **/
3911static int __ipr_eh_dev_reset(struct scsi_cmnd * scsi_cmd)
3912{
3913	struct ipr_cmnd *ipr_cmd;
3914	struct ipr_ioa_cfg *ioa_cfg;
3915	struct ipr_resource_entry *res;
3916	struct ata_port *ap;
3917	int rc = 0;
3918
3919	ENTER;
3920	ioa_cfg = (struct ipr_ioa_cfg *) scsi_cmd->device->host->hostdata;
3921	res = scsi_cmd->device->hostdata;
3922
3923	if (!res)
3924		return FAILED;
3925
3926	/*
3927	 * If we are currently going through reset/reload, return failed. This will force the
3928	 * mid-layer to call ipr_eh_host_reset, which will then go to sleep and wait for the
3929	 * reset to complete
3930	 */
3931	if (ioa_cfg->in_reset_reload)
3932		return FAILED;
3933	if (ioa_cfg->ioa_is_dead)
3934		return FAILED;
3935
3936	list_for_each_entry(ipr_cmd, &ioa_cfg->pending_q, queue) {
3937		if (ipr_cmd->ioarcb.res_handle == res->cfgte.res_handle) {
3938			if (ipr_cmd->scsi_cmd)
3939				ipr_cmd->done = ipr_scsi_eh_done;
3940			if (ipr_cmd->qc)
3941				ipr_cmd->done = ipr_sata_eh_done;
3942			if (ipr_cmd->qc && !(ipr_cmd->qc->flags & ATA_QCFLAG_FAILED)) {
3943				ipr_cmd->qc->err_mask |= AC_ERR_TIMEOUT;
3944				ipr_cmd->qc->flags |= ATA_QCFLAG_FAILED;
3945			}
3946		}
3947	}
3948
3949	res->resetting_device = 1;
3950	scmd_printk(KERN_ERR, scsi_cmd, "Resetting device\n");
3951
3952	if (ipr_is_gata(res) && res->sata_port) {
3953		ap = res->sata_port->ap;
3954		spin_unlock_irq(scsi_cmd->device->host->host_lock);
3955		ata_do_eh(ap, NULL, NULL, ipr_sata_reset, NULL);
3956		spin_lock_irq(scsi_cmd->device->host->host_lock);
3957	} else
3958		rc = ipr_device_reset(ioa_cfg, res);
3959	res->resetting_device = 0;
3960
3961	LEAVE;
3962	return (rc ? FAILED : SUCCESS);
3963}
3964
3965static int ipr_eh_dev_reset(struct scsi_cmnd * cmd)
3966{
3967	int rc;
3968
3969	spin_lock_irq(cmd->device->host->host_lock);
3970	rc = __ipr_eh_dev_reset(cmd);
3971	spin_unlock_irq(cmd->device->host->host_lock);
3972
3973	return rc;
3974}
3975
3976/**
3977 * ipr_bus_reset_done - Op done function for bus reset.
3978 * @ipr_cmd:	ipr command struct
3979 *
3980 * This function is the op done function for a bus reset
3981 *
3982 * Return value:
3983 * 	none
3984 **/
3985static void ipr_bus_reset_done(struct ipr_cmnd *ipr_cmd)
3986{
3987	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
3988	struct ipr_resource_entry *res;
3989
3990	ENTER;
3991	list_for_each_entry(res, &ioa_cfg->used_res_q, queue) {
3992		if (!memcmp(&res->cfgte.res_handle, &ipr_cmd->ioarcb.res_handle,
3993			    sizeof(res->cfgte.res_handle))) {
3994			scsi_report_bus_reset(ioa_cfg->host, res->cfgte.res_addr.bus);
3995			break;
3996		}
3997	}
3998
3999	/*
4000	 * If abort has not completed, indicate the reset has, else call the
4001	 * abort's done function to wake the sleeping eh thread
4002	 */
4003	if (ipr_cmd->sibling->sibling)
4004		ipr_cmd->sibling->sibling = NULL;
4005	else
4006		ipr_cmd->sibling->done(ipr_cmd->sibling);
4007
4008	list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q);
4009	LEAVE;
4010}
4011
4012/**
4013 * ipr_abort_timeout - An abort task has timed out
4014 * @ipr_cmd:	ipr command struct
4015 *
4016 * This function handles when an abort task times out. If this
4017 * happens we issue a bus reset since we have resources tied
4018 * up that must be freed before returning to the midlayer.
4019 *
4020 * Return value:
4021 *	none
4022 **/
4023static void ipr_abort_timeout(struct ipr_cmnd *ipr_cmd)
4024{
4025	struct ipr_cmnd *reset_cmd;
4026	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
4027	struct ipr_cmd_pkt *cmd_pkt;
4028	unsigned long lock_flags = 0;
4029
4030	ENTER;
4031	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
4032	if (ipr_cmd->completion.done || ioa_cfg->in_reset_reload) {
4033		spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
4034		return;
4035	}
4036
4037	sdev_printk(KERN_ERR, ipr_cmd->u.sdev, "Abort timed out. Resetting bus.\n");
4038	reset_cmd = ipr_get_free_ipr_cmnd(ioa_cfg);
4039	ipr_cmd->sibling = reset_cmd;
4040	reset_cmd->sibling = ipr_cmd;
4041	reset_cmd->ioarcb.res_handle = ipr_cmd->ioarcb.res_handle;
4042	cmd_pkt = &reset_cmd->ioarcb.cmd_pkt;
4043	cmd_pkt->request_type = IPR_RQTYPE_IOACMD;
4044	cmd_pkt->cdb[0] = IPR_RESET_DEVICE;
4045	cmd_pkt->cdb[2] = IPR_RESET_TYPE_SELECT | IPR_BUS_RESET;
4046
4047	ipr_do_req(reset_cmd, ipr_bus_reset_done, ipr_timeout, IPR_DEVICE_RESET_TIMEOUT);
4048	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
4049	LEAVE;
4050}
4051
4052/**
4053 * ipr_cancel_op - Cancel specified op
4054 * @scsi_cmd:	scsi command struct
4055 *
4056 * This function cancels specified op.
4057 *
4058 * Return value:
4059 *	SUCCESS / FAILED
4060 **/
4061static int ipr_cancel_op(struct scsi_cmnd * scsi_cmd)
4062{
4063	struct ipr_cmnd *ipr_cmd;
4064	struct ipr_ioa_cfg *ioa_cfg;
4065	struct ipr_resource_entry *res;
4066	struct ipr_cmd_pkt *cmd_pkt;
4067	u32 ioasc;
4068	int op_found = 0;
4069
4070	ENTER;
4071	ioa_cfg = (struct ipr_ioa_cfg *)scsi_cmd->device->host->hostdata;
4072	res = scsi_cmd->device->hostdata;
4073
4074	/* If we are currently going through reset/reload, return failed.
4075	 * This will force the mid-layer to call ipr_eh_host_reset,
4076	 * which will then go to sleep and wait for the reset to complete
4077	 */
4078	if (ioa_cfg->in_reset_reload || ioa_cfg->ioa_is_dead)
4079		return FAILED;
4080	if (!res || !ipr_is_gscsi(res))
4081		return FAILED;
4082
4083	list_for_each_entry(ipr_cmd, &ioa_cfg->pending_q, queue) {
4084		if (ipr_cmd->scsi_cmd == scsi_cmd) {
4085			ipr_cmd->done = ipr_scsi_eh_done;
4086			op_found = 1;
4087			break;
4088		}
4089	}
4090
4091	if (!op_found)
4092		return SUCCESS;
4093
4094	ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg);
4095	ipr_cmd->ioarcb.res_handle = res->cfgte.res_handle;
4096	cmd_pkt = &ipr_cmd->ioarcb.cmd_pkt;
4097	cmd_pkt->request_type = IPR_RQTYPE_IOACMD;
4098	cmd_pkt->cdb[0] = IPR_CANCEL_ALL_REQUESTS;
4099	ipr_cmd->u.sdev = scsi_cmd->device;
4100
4101	scmd_printk(KERN_ERR, scsi_cmd, "Aborting command: %02X\n",
4102		    scsi_cmd->cmnd[0]);
4103	ipr_send_blocking_cmd(ipr_cmd, ipr_abort_timeout, IPR_CANCEL_ALL_TIMEOUT);
4104	ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
4105
4106	/*
4107	 * If the abort task timed out and we sent a bus reset, we will get
4108	 * one the following responses to the abort
4109	 */
4110	if (ioasc == IPR_IOASC_BUS_WAS_RESET || ioasc == IPR_IOASC_SYNC_REQUIRED) {
4111		ioasc = 0;
4112		ipr_trace;
4113	}
4114
4115	list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q);
4116	if (!ipr_is_naca_model(res))
4117		res->needs_sync_complete = 1;
4118
4119	LEAVE;
4120	return (IPR_IOASC_SENSE_KEY(ioasc) ? FAILED : SUCCESS);
4121}
4122
4123/**
4124 * ipr_eh_abort - Abort a single op
4125 * @scsi_cmd:	scsi command struct
4126 *
4127 * Return value:
4128 * 	SUCCESS / FAILED
4129 **/
4130static int ipr_eh_abort(struct scsi_cmnd * scsi_cmd)
4131{
4132	unsigned long flags;
4133	int rc;
4134
4135	ENTER;
4136
4137	spin_lock_irqsave(scsi_cmd->device->host->host_lock, flags);
4138	rc = ipr_cancel_op(scsi_cmd);
4139	spin_unlock_irqrestore(scsi_cmd->device->host->host_lock, flags);
4140
4141	LEAVE;
4142	return rc;
4143}
4144
4145/**
4146 * ipr_handle_other_interrupt - Handle "other" interrupts
4147 * @ioa_cfg:	ioa config struct
4148 * @int_reg:	interrupt register
4149 *
4150 * Return value:
4151 * 	IRQ_NONE / IRQ_HANDLED
4152 **/
4153static irqreturn_t ipr_handle_other_interrupt(struct ipr_ioa_cfg *ioa_cfg,
4154					      volatile u32 int_reg)
4155{
4156	irqreturn_t rc = IRQ_HANDLED;
4157
4158	if (int_reg & IPR_PCII_IOA_TRANS_TO_OPER) {
4159		/* Mask the interrupt */
4160		writel(IPR_PCII_IOA_TRANS_TO_OPER, ioa_cfg->regs.set_interrupt_mask_reg);
4161
4162		/* Clear the interrupt */
4163		writel(IPR_PCII_IOA_TRANS_TO_OPER, ioa_cfg->regs.clr_interrupt_reg);
4164		int_reg = readl(ioa_cfg->regs.sense_interrupt_reg);
4165
4166		list_del(&ioa_cfg->reset_cmd->queue);
4167		del_timer(&ioa_cfg->reset_cmd->timer);
4168		ipr_reset_ioa_job(ioa_cfg->reset_cmd);
4169	} else {
4170		if (int_reg & IPR_PCII_IOA_UNIT_CHECKED)
4171			ioa_cfg->ioa_unit_checked = 1;
4172		else
4173			dev_err(&ioa_cfg->pdev->dev,
4174				"Permanent IOA failure. 0x%08X\n", int_reg);
4175
4176		if (WAIT_FOR_DUMP == ioa_cfg->sdt_state)
4177			ioa_cfg->sdt_state = GET_DUMP;
4178
4179		ipr_mask_and_clear_interrupts(ioa_cfg, ~0);
4180		ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE);
4181	}
4182
4183	return rc;
4184}
4185
4186/**
4187 * ipr_isr - Interrupt service routine
4188 * @irq:	irq number
4189 * @devp:	pointer to ioa config struct
4190 *
4191 * Return value:
4192 * 	IRQ_NONE / IRQ_HANDLED
4193 **/
4194static irqreturn_t ipr_isr(int irq, void *devp)
4195{
4196	struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)devp;
4197	unsigned long lock_flags = 0;
4198	volatile u32 int_reg, int_mask_reg;
4199	u32 ioasc;
4200	u16 cmd_index;
4201	struct ipr_cmnd *ipr_cmd;
4202	irqreturn_t rc = IRQ_NONE;
4203
4204	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
4205
4206	/* If interrupts are disabled, ignore the interrupt */
4207	if (!ioa_cfg->allow_interrupts) {
4208		spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
4209		return IRQ_NONE;
4210	}
4211
4212	int_mask_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg);
4213	int_reg = readl(ioa_cfg->regs.sense_interrupt_reg) & ~int_mask_reg;
4214
4215	/* If an interrupt on the adapter did not occur, ignore it */
4216	if (unlikely((int_reg & IPR_PCII_OPER_INTERRUPTS) == 0)) {
4217		spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
4218		return IRQ_NONE;
4219	}
4220
4221	while (1) {
4222		ipr_cmd = NULL;
4223
4224		while ((be32_to_cpu(*ioa_cfg->hrrq_curr) & IPR_HRRQ_TOGGLE_BIT) ==
4225		       ioa_cfg->toggle_bit) {
4226
4227			cmd_index = (be32_to_cpu(*ioa_cfg->hrrq_curr) &
4228				     IPR_HRRQ_REQ_RESP_HANDLE_MASK) >> IPR_HRRQ_REQ_RESP_HANDLE_SHIFT;
4229
4230			if (unlikely(cmd_index >= IPR_NUM_CMD_BLKS)) {
4231				ioa_cfg->errors_logged++;
4232				dev_err(&ioa_cfg->pdev->dev, "Invalid response handle from IOA\n");
4233
4234				if (WAIT_FOR_DUMP == ioa_cfg->sdt_state)
4235					ioa_cfg->sdt_state = GET_DUMP;
4236
4237				ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE);
4238				spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
4239				return IRQ_HANDLED;
4240			}
4241
4242			ipr_cmd = ioa_cfg->ipr_cmnd_list[cmd_index];
4243
4244			ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
4245
4246			ipr_trc_hook(ipr_cmd, IPR_TRACE_FINISH, ioasc);
4247
4248			list_del(&ipr_cmd->queue);
4249			del_timer(&ipr_cmd->timer);
4250			ipr_cmd->done(ipr_cmd);
4251
4252			rc = IRQ_HANDLED;
4253
4254			if (ioa_cfg->hrrq_curr < ioa_cfg->hrrq_end) {
4255				ioa_cfg->hrrq_curr++;
4256			} else {
4257				ioa_cfg->hrrq_curr = ioa_cfg->hrrq_start;
4258				ioa_cfg->toggle_bit ^= 1u;
4259			}
4260		}
4261
4262		if (ipr_cmd != NULL) {
4263			/* Clear the PCI interrupt */
4264			writel(IPR_PCII_HRRQ_UPDATED, ioa_cfg->regs.clr_interrupt_reg);
4265			int_reg = readl(ioa_cfg->regs.sense_interrupt_reg) & ~int_mask_reg;
4266		} else
4267			break;
4268	}
4269
4270	if (unlikely(rc == IRQ_NONE))
4271		rc = ipr_handle_other_interrupt(ioa_cfg, int_reg);
4272
4273	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
4274	return rc;
4275}
4276
4277/**
4278 * ipr_build_ioadl - Build a scatter/gather list and map the buffer
4279 * @ioa_cfg:	ioa config struct
4280 * @ipr_cmd:	ipr command struct
4281 *
4282 * Return value:
4283 * 	0 on success / -1 on failure
4284 **/
4285static int ipr_build_ioadl(struct ipr_ioa_cfg *ioa_cfg,
4286			   struct ipr_cmnd *ipr_cmd)
4287{
4288	int i;
4289	struct scatterlist *sglist;
4290	u32 length;
4291	u32 ioadl_flags = 0;
4292	struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
4293	struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
4294	struct ipr_ioadl_desc *ioadl = ipr_cmd->ioadl;
4295
4296	length = scsi_cmd->request_bufflen;
4297
4298	if (length == 0)
4299		return 0;
4300
4301	if (scsi_cmd->use_sg) {
4302		ipr_cmd->dma_use_sg = pci_map_sg(ioa_cfg->pdev,
4303						 scsi_cmd->request_buffer,
4304						 scsi_cmd->use_sg,
4305						 scsi_cmd->sc_data_direction);
4306
4307		if (scsi_cmd->sc_data_direction == DMA_TO_DEVICE) {
4308			ioadl_flags = IPR_IOADL_FLAGS_WRITE;
4309			ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_WRITE_NOT_READ;
4310			ioarcb->write_data_transfer_length = cpu_to_be32(length);
4311			ioarcb->write_ioadl_len =
4312				cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg);
4313		} else if (scsi_cmd->sc_data_direction == DMA_FROM_DEVICE) {
4314			ioadl_flags = IPR_IOADL_FLAGS_READ;
4315			ioarcb->read_data_transfer_length = cpu_to_be32(length);
4316			ioarcb->read_ioadl_len =
4317				cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg);
4318		}
4319
4320		sglist = scsi_cmd->request_buffer;
4321
4322		if (ipr_cmd->dma_use_sg <= ARRAY_SIZE(ioarcb->add_data.u.ioadl)) {
4323			ioadl = ioarcb->add_data.u.ioadl;
4324			ioarcb->write_ioadl_addr =
4325				cpu_to_be32(be32_to_cpu(ioarcb->ioarcb_host_pci_addr) +
4326					    offsetof(struct ipr_ioarcb, add_data));
4327			ioarcb->read_ioadl_addr = ioarcb->write_ioadl_addr;
4328		}
4329
4330		for (i = 0; i < ipr_cmd->dma_use_sg; i++) {
4331			ioadl[i].flags_and_data_len =
4332				cpu_to_be32(ioadl_flags | sg_dma_len(&sglist[i]));
4333			ioadl[i].address =
4334				cpu_to_be32(sg_dma_address(&sglist[i]));
4335		}
4336
4337		if (likely(ipr_cmd->dma_use_sg)) {
4338			ioadl[i-1].flags_and_data_len |=
4339				cpu_to_be32(IPR_IOADL_FLAGS_LAST);
4340			return 0;
4341		} else
4342			dev_err(&ioa_cfg->pdev->dev, "pci_map_sg failed!\n");
4343	} else {
4344		if (scsi_cmd->sc_data_direction == DMA_TO_DEVICE) {
4345			ioadl_flags = IPR_IOADL_FLAGS_WRITE;
4346			ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_WRITE_NOT_READ;
4347			ioarcb->write_data_transfer_length = cpu_to_be32(length);
4348			ioarcb->write_ioadl_len = cpu_to_be32(sizeof(struct ipr_ioadl_desc));
4349		} else if (scsi_cmd->sc_data_direction == DMA_FROM_DEVICE) {
4350			ioadl_flags = IPR_IOADL_FLAGS_READ;
4351			ioarcb->read_data_transfer_length = cpu_to_be32(length);
4352			ioarcb->read_ioadl_len = cpu_to_be32(sizeof(struct ipr_ioadl_desc));
4353		}
4354
4355		ipr_cmd->dma_handle = pci_map_single(ioa_cfg->pdev,
4356						     scsi_cmd->request_buffer, length,
4357						     scsi_cmd->sc_data_direction);
4358
4359		if (likely(!pci_dma_mapping_error(ipr_cmd->dma_handle))) {
4360			ioadl = ioarcb->add_data.u.ioadl;
4361			ioarcb->write_ioadl_addr =
4362				cpu_to_be32(be32_to_cpu(ioarcb->ioarcb_host_pci_addr) +
4363					    offsetof(struct ipr_ioarcb, add_data));
4364			ioarcb->read_ioadl_addr = ioarcb->write_ioadl_addr;
4365			ipr_cmd->dma_use_sg = 1;
4366			ioadl[0].flags_and_data_len =
4367				cpu_to_be32(ioadl_flags | length | IPR_IOADL_FLAGS_LAST);
4368			ioadl[0].address = cpu_to_be32(ipr_cmd->dma_handle);
4369			return 0;
4370		} else
4371			dev_err(&ioa_cfg->pdev->dev, "pci_map_single failed!\n");
4372	}
4373
4374	return -1;
4375}
4376
4377/**
4378 * ipr_get_task_attributes - Translate SPI Q-Tag to task attributes
4379 * @scsi_cmd:	scsi command struct
4380 *
4381 * Return value:
4382 * 	task attributes
4383 **/
4384static u8 ipr_get_task_attributes(struct scsi_cmnd *scsi_cmd)
4385{
4386	u8 tag[2];
4387	u8 rc = IPR_FLAGS_LO_UNTAGGED_TASK;
4388
4389	if (scsi_populate_tag_msg(scsi_cmd, tag)) {
4390		switch (tag[0]) {
4391		case MSG_SIMPLE_TAG:
4392			rc = IPR_FLAGS_LO_SIMPLE_TASK;
4393			break;
4394		case MSG_HEAD_TAG:
4395			rc = IPR_FLAGS_LO_HEAD_OF_Q_TASK;
4396			break;
4397		case MSG_ORDERED_TAG:
4398			rc = IPR_FLAGS_LO_ORDERED_TASK;
4399			break;
4400		};
4401	}
4402
4403	return rc;
4404}
4405
4406/**
4407 * ipr_erp_done - Process completion of ERP for a device
4408 * @ipr_cmd:		ipr command struct
4409 *
4410 * This function copies the sense buffer into the scsi_cmd
4411 * struct and pushes the scsi_done function.
4412 *
4413 * Return value:
4414 * 	nothing
4415 **/
4416static void ipr_erp_done(struct ipr_cmnd *ipr_cmd)
4417{
4418	struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
4419	struct ipr_resource_entry *res = scsi_cmd->device->hostdata;
4420	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
4421	u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
4422
4423	if (IPR_IOASC_SENSE_KEY(ioasc) > 0) {
4424		scsi_cmd->result |= (DID_ERROR << 16);
4425		scmd_printk(KERN_ERR, scsi_cmd,
4426			    "Request Sense failed with IOASC: 0x%08X\n", ioasc);
4427	} else {
4428		memcpy(scsi_cmd->sense_buffer, ipr_cmd->sense_buffer,
4429		       SCSI_SENSE_BUFFERSIZE);
4430	}
4431
4432	if (res) {
4433		if (!ipr_is_naca_model(res))
4434			res->needs_sync_complete = 1;
4435		res->in_erp = 0;
4436	}
4437	ipr_unmap_sglist(ioa_cfg, ipr_cmd);
4438	list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q);
4439	scsi_cmd->scsi_done(scsi_cmd);
4440}
4441
4442/**
4443 * ipr_reinit_ipr_cmnd_for_erp - Re-initialize a cmnd block to be used for ERP
4444 * @ipr_cmd:	ipr command struct
4445 *
4446 * Return value:
4447 * 	none
4448 **/
4449static void ipr_reinit_ipr_cmnd_for_erp(struct ipr_cmnd *ipr_cmd)
4450{
4451	struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
4452	struct ipr_ioasa *ioasa = &ipr_cmd->ioasa;
4453	dma_addr_t dma_addr = be32_to_cpu(ioarcb->ioarcb_host_pci_addr);
4454
4455	memset(&ioarcb->cmd_pkt, 0, sizeof(struct ipr_cmd_pkt));
4456	ioarcb->write_data_transfer_length = 0;
4457	ioarcb->read_data_transfer_length = 0;
4458	ioarcb->write_ioadl_len = 0;
4459	ioarcb->read_ioadl_len = 0;
4460	ioasa->ioasc = 0;
4461	ioasa->residual_data_len = 0;
4462	ioarcb->write_ioadl_addr =
4463		cpu_to_be32(dma_addr + offsetof(struct ipr_cmnd, ioadl));
4464	ioarcb->read_ioadl_addr = ioarcb->write_ioadl_addr;
4465}
4466
4467/**
4468 * ipr_erp_request_sense - Send request sense to a device
4469 * @ipr_cmd:	ipr command struct
4470 *
4471 * This function sends a request sense to a device as a result
4472 * of a check condition.
4473 *
4474 * Return value:
4475 * 	nothing
4476 **/
4477static void ipr_erp_request_sense(struct ipr_cmnd *ipr_cmd)
4478{
4479	struct ipr_cmd_pkt *cmd_pkt = &ipr_cmd->ioarcb.cmd_pkt;
4480	u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
4481
4482	if (IPR_IOASC_SENSE_KEY(ioasc) > 0) {
4483		ipr_erp_done(ipr_cmd);
4484		return;
4485	}
4486
4487	ipr_reinit_ipr_cmnd_for_erp(ipr_cmd);
4488
4489	cmd_pkt->request_type = IPR_RQTYPE_SCSICDB;
4490	cmd_pkt->cdb[0] = REQUEST_SENSE;
4491	cmd_pkt->cdb[4] = SCSI_SENSE_BUFFERSIZE;
4492	cmd_pkt->flags_hi |= IPR_FLAGS_HI_SYNC_OVERRIDE;
4493	cmd_pkt->flags_hi |= IPR_FLAGS_HI_NO_ULEN_CHK;
4494	cmd_pkt->timeout = cpu_to_be16(IPR_REQUEST_SENSE_TIMEOUT / HZ);
4495
4496	ipr_cmd->ioadl[0].flags_and_data_len =
4497		cpu_to_be32(IPR_IOADL_FLAGS_READ_LAST | SCSI_SENSE_BUFFERSIZE);
4498	ipr_cmd->ioadl[0].address =
4499		cpu_to_be32(ipr_cmd->sense_buffer_dma);
4500
4501	ipr_cmd->ioarcb.read_ioadl_len =
4502		cpu_to_be32(sizeof(struct ipr_ioadl_desc));
4503	ipr_cmd->ioarcb.read_data_transfer_length =
4504		cpu_to_be32(SCSI_SENSE_BUFFERSIZE);
4505
4506	ipr_do_req(ipr_cmd, ipr_erp_done, ipr_timeout,
4507		   IPR_REQUEST_SENSE_TIMEOUT * 2);
4508}
4509
4510/**
4511 * ipr_erp_cancel_all - Send cancel all to a device
4512 * @ipr_cmd:	ipr command struct
4513 *
4514 * This function sends a cancel all to a device to clear the
4515 * queue. If we are running TCQ on the device, QERR is set to 1,
4516 * which means all outstanding ops have been dropped on the floor.
4517 * Cancel all will return them to us.
4518 *
4519 * Return value:
4520 * 	nothing
4521 **/
4522static void ipr_erp_cancel_all(struct ipr_cmnd *ipr_cmd)
4523{
4524	struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
4525	struct ipr_resource_entry *res = scsi_cmd->device->hostdata;
4526	struct ipr_cmd_pkt *cmd_pkt;
4527
4528	res->in_erp = 1;
4529
4530	ipr_reinit_ipr_cmnd_for_erp(ipr_cmd);
4531
4532	if (!scsi_get_tag_type(scsi_cmd->device)) {
4533		ipr_erp_request_sense(ipr_cmd);
4534		return;
4535	}
4536
4537	cmd_pkt = &ipr_cmd->ioarcb.cmd_pkt;
4538	cmd_pkt->request_type = IPR_RQTYPE_IOACMD;
4539	cmd_pkt->cdb[0] = IPR_CANCEL_ALL_REQUESTS;
4540
4541	ipr_do_req(ipr_cmd, ipr_erp_request_sense, ipr_timeout,
4542		   IPR_CANCEL_ALL_TIMEOUT);
4543}
4544
4545/**
4546 * ipr_dump_ioasa - Dump contents of IOASA
4547 * @ioa_cfg:	ioa config struct
4548 * @ipr_cmd:	ipr command struct
4549 * @res:		resource entry struct
4550 *
4551 * This function is invoked by the interrupt handler when ops
4552 * fail. It will log the IOASA if appropriate. Only called
4553 * for GPDD ops.
4554 *
4555 * Return value:
4556 * 	none
4557 **/
4558static void ipr_dump_ioasa(struct ipr_ioa_cfg *ioa_cfg,
4559			   struct ipr_cmnd *ipr_cmd, struct ipr_resource_entry *res)
4560{
4561	int i;
4562	u16 data_len;
4563	u32 ioasc, fd_ioasc;
4564	struct ipr_ioasa *ioasa = &ipr_cmd->ioasa;
4565	__be32 *ioasa_data = (__be32 *)ioasa;
4566	int error_index;
4567
4568	ioasc = be32_to_cpu(ioasa->ioasc) & IPR_IOASC_IOASC_MASK;
4569	fd_ioasc = be32_to_cpu(ioasa->fd_ioasc) & IPR_IOASC_IOASC_MASK;
4570
4571	if (0 == ioasc)
4572		return;
4573
4574	if (ioa_cfg->log_level < IPR_DEFAULT_LOG_LEVEL)
4575		return;
4576
4577	if (ioasc == IPR_IOASC_BUS_WAS_RESET && fd_ioasc)
4578		error_index = ipr_get_error(fd_ioasc);
4579	else
4580		error_index = ipr_get_error(ioasc);
4581
4582	if (ioa_cfg->log_level < IPR_MAX_LOG_LEVEL) {
4583		/* Don't log an error if the IOA already logged one */
4584		if (ioasa->ilid != 0)
4585			return;
4586
4587		if (!ipr_is_gscsi(res))
4588			return;
4589
4590		if (ipr_error_table[error_index].log_ioasa == 0)
4591			return;
4592	}
4593
4594	ipr_res_err(ioa_cfg, res, "%s\n", ipr_error_table[error_index].error);
4595
4596	if (sizeof(struct ipr_ioasa) < be16_to_cpu(ioasa->ret_stat_len))
4597		data_len = sizeof(struct ipr_ioasa);
4598	else
4599		data_len = be16_to_cpu(ioasa->ret_stat_len);
4600
4601	ipr_err("IOASA Dump:\n");
4602
4603	for (i = 0; i < data_len / 4; i += 4) {
4604		ipr_err("%08X: %08X %08X %08X %08X\n", i*4,
4605			be32_to_cpu(ioasa_data[i]),
4606			be32_to_cpu(ioasa_data[i+1]),
4607			be32_to_cpu(ioasa_data[i+2]),
4608			be32_to_cpu(ioasa_data[i+3]));
4609	}
4610}
4611
4612/**
4613 * ipr_gen_sense - Generate SCSI sense data from an IOASA
4614 * @ioasa:		IOASA
4615 * @sense_buf:	sense data buffer
4616 *
4617 * Return value:
4618 * 	none
4619 **/
4620static void ipr_gen_sense(struct ipr_cmnd *ipr_cmd)
4621{
4622	u32 failing_lba;
4623	u8 *sense_buf = ipr_cmd->scsi_cmd->sense_buffer;
4624	struct ipr_resource_entry *res = ipr_cmd->scsi_cmd->device->hostdata;
4625	struct ipr_ioasa *ioasa = &ipr_cmd->ioasa;
4626	u32 ioasc = be32_to_cpu(ioasa->ioasc);
4627
4628	memset(sense_buf, 0, SCSI_SENSE_BUFFERSIZE);
4629
4630	if (ioasc >= IPR_FIRST_DRIVER_IOASC)
4631		return;
4632
4633	ipr_cmd->scsi_cmd->result = SAM_STAT_CHECK_CONDITION;
4634
4635	if (ipr_is_vset_device(res) &&
4636	    ioasc == IPR_IOASC_MED_DO_NOT_REALLOC &&
4637	    ioasa->u.vset.failing_lba_hi != 0) {
4638		sense_buf[0] = 0x72;
4639		sense_buf[1] = IPR_IOASC_SENSE_KEY(ioasc);
4640		sense_buf[2] = IPR_IOASC_SENSE_CODE(ioasc);
4641		sense_buf[3] = IPR_IOASC_SENSE_QUAL(ioasc);
4642
4643		sense_buf[7] = 12;
4644		sense_buf[8] = 0;
4645		sense_buf[9] = 0x0A;
4646		sense_buf[10] = 0x80;
4647
4648		failing_lba = be32_to_cpu(ioasa->u.vset.failing_lba_hi);
4649
4650		sense_buf[12] = (failing_lba & 0xff000000) >> 24;
4651		sense_buf[13] = (failing_lba & 0x00ff0000) >> 16;
4652		sense_buf[14] = (failing_lba & 0x0000ff00) >> 8;
4653		sense_buf[15] = failing_lba & 0x000000ff;
4654
4655		failing_lba = be32_to_cpu(ioasa->u.vset.failing_lba_lo);
4656
4657		sense_buf[16] = (failing_lba & 0xff000000) >> 24;
4658		sense_buf[17] = (failing_lba & 0x00ff0000) >> 16;
4659		sense_buf[18] = (failing_lba & 0x0000ff00) >> 8;
4660		sense_buf[19] = failing_lba & 0x000000ff;
4661	} else {
4662		sense_buf[0] = 0x70;
4663		sense_buf[2] = IPR_IOASC_SENSE_KEY(ioasc);
4664		sense_buf[12] = IPR_IOASC_SENSE_CODE(ioasc);
4665		sense_buf[13] = IPR_IOASC_SENSE_QUAL(ioasc);
4666
4667		/* Illegal request */
4668		if ((IPR_IOASC_SENSE_KEY(ioasc) == 0x05) &&
4669		    (be32_to_cpu(ioasa->ioasc_specific) & IPR_FIELD_POINTER_VALID)) {
4670			sense_buf[7] = 10;	/* additional length */
4671
4672			/* IOARCB was in error */
4673			if (IPR_IOASC_SENSE_CODE(ioasc) == 0x24)
4674				sense_buf[15] = 0xC0;
4675			else	/* Parameter data was invalid */
4676				sense_buf[15] = 0x80;
4677
4678			sense_buf[16] =
4679			    ((IPR_FIELD_POINTER_MASK &
4680			      be32_to_cpu(ioasa->ioasc_specific)) >> 8) & 0xff;
4681			sense_buf[17] =
4682			    (IPR_FIELD_POINTER_MASK &
4683			     be32_to_cpu(ioasa->ioasc_specific)) & 0xff;
4684		} else {
4685			if (ioasc == IPR_IOASC_MED_DO_NOT_REALLOC) {
4686				if (ipr_is_vset_device(res))
4687					failing_lba = be32_to_cpu(ioasa->u.vset.failing_lba_lo);
4688				else
4689					failing_lba = be32_to_cpu(ioasa->u.dasd.failing_lba);
4690
4691				sense_buf[0] |= 0x80;	/* Or in the Valid bit */
4692				sense_buf[3] = (failing_lba & 0xff000000) >> 24;
4693				sense_buf[4] = (failing_lba & 0x00ff0000) >> 16;
4694				sense_buf[5] = (failing_lba & 0x0000ff00) >> 8;
4695				sense_buf[6] = failing_lba & 0x000000ff;
4696			}
4697
4698			sense_buf[7] = 6;	/* additional length */
4699		}
4700	}
4701}
4702
4703/**
4704 * ipr_get_autosense - Copy autosense data to sense buffer
4705 * @ipr_cmd:	ipr command struct
4706 *
4707 * This function copies the autosense buffer to the buffer
4708 * in the scsi_cmd, if there is autosense available.
4709 *
4710 * Return value:
4711 *	1 if autosense was available / 0 if not
4712 **/
4713static int ipr_get_autosense(struct ipr_cmnd *ipr_cmd)
4714{
4715	struct ipr_ioasa *ioasa = &ipr_cmd->ioasa;
4716
4717	if ((be32_to_cpu(ioasa->ioasc_specific) & IPR_AUTOSENSE_VALID) == 0)
4718		return 0;
4719
4720	memcpy(ipr_cmd->scsi_cmd->sense_buffer, ioasa->auto_sense.data,
4721	       min_t(u16, be16_to_cpu(ioasa->auto_sense.auto_sense_len),
4722		   SCSI_SENSE_BUFFERSIZE));
4723	return 1;
4724}
4725
4726/**
4727 * ipr_erp_start - Process an error response for a SCSI op
4728 * @ioa_cfg:	ioa config struct
4729 * @ipr_cmd:	ipr command struct
4730 *
4731 * This function determines whether or not to initiate ERP
4732 * on the affected device.
4733 *
4734 * Return value:
4735 * 	nothing
4736 **/
4737static void ipr_erp_start(struct ipr_ioa_cfg *ioa_cfg,
4738			      struct ipr_cmnd *ipr_cmd)
4739{
4740	struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
4741	struct ipr_resource_entry *res = scsi_cmd->device->hostdata;
4742	u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
4743	u32 masked_ioasc = ioasc & IPR_IOASC_IOASC_MASK;
4744
4745	if (!res) {
4746		ipr_scsi_eh_done(ipr_cmd);
4747		return;
4748	}
4749
4750	if (!ipr_is_gscsi(res) && masked_ioasc != IPR_IOASC_HW_DEV_BUS_STATUS)
4751		ipr_gen_sense(ipr_cmd);
4752
4753	ipr_dump_ioasa(ioa_cfg, ipr_cmd, res);
4754
4755	switch (masked_ioasc) {
4756	case IPR_IOASC_ABORTED_CMD_TERM_BY_HOST:
4757		if (ipr_is_naca_model(res))
4758			scsi_cmd->result |= (DID_ABORT << 16);
4759		else
4760			scsi_cmd->result |= (DID_IMM_RETRY << 16);
4761		break;
4762	case IPR_IOASC_IR_RESOURCE_HANDLE:
4763	case IPR_IOASC_IR_NO_CMDS_TO_2ND_IOA:
4764		scsi_cmd->result |= (DID_NO_CONNECT << 16);
4765		break;
4766	case IPR_IOASC_HW_SEL_TIMEOUT:
4767		scsi_cmd->result |= (DID_NO_CONNECT << 16);
4768		if (!ipr_is_naca_model(res))
4769			res->needs_sync_complete = 1;
4770		break;
4771	case IPR_IOASC_SYNC_REQUIRED:
4772		if (!res->in_erp)
4773			res->needs_sync_complete = 1;
4774		scsi_cmd->result |= (DID_IMM_RETRY << 16);
4775		break;
4776	case IPR_IOASC_MED_DO_NOT_REALLOC: /* prevent retries */
4777	case IPR_IOASA_IR_DUAL_IOA_DISABLED:
4778		scsi_cmd->result |= (DID_PASSTHROUGH << 16);
4779		break;
4780	case IPR_IOASC_BUS_WAS_RESET:
4781	case IPR_IOASC_BUS_WAS_RESET_BY_OTHER:
4782		/*
4783		 * Report the bus reset and ask for a retry. The device
4784		 * will give CC/UA the next command.
4785		 */
4786		if (!res->resetting_device)
4787			scsi_report_bus_reset(ioa_cfg->host, scsi_cmd->device->channel);
4788		scsi_cmd->result |= (DID_ERROR << 16);
4789		if (!ipr_is_naca_model(res))
4790			res->needs_sync_complete = 1;
4791		break;
4792	case IPR_IOASC_HW_DEV_BUS_STATUS:
4793		scsi_cmd->result |= IPR_IOASC_SENSE_STATUS(ioasc);
4794		if (IPR_IOASC_SENSE_STATUS(ioasc) == SAM_STAT_CHECK_CONDITION) {
4795			if (!ipr_get_autosense(ipr_cmd)) {
4796				if (!ipr_is_naca_model(res)) {
4797					ipr_erp_cancel_all(ipr_cmd);
4798					return;
4799				}
4800			}
4801		}
4802		if (!ipr_is_naca_model(res))
4803			res->needs_sync_complete = 1;
4804		break;
4805	case IPR_IOASC_NR_INIT_CMD_REQUIRED:
4806		break;
4807	default:
4808		if (IPR_IOASC_SENSE_KEY(ioasc) > RECOVERED_ERROR)
4809			scsi_cmd->result |= (DID_ERROR << 16);
4810		if (!ipr_is_vset_device(res) && !ipr_is_naca_model(res))
4811			res->needs_sync_complete = 1;
4812		break;
4813	}
4814
4815	ipr_unmap_sglist(ioa_cfg, ipr_cmd);
4816	list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q);
4817	scsi_cmd->scsi_done(scsi_cmd);
4818}
4819
4820/**
4821 * ipr_scsi_done - mid-layer done function
4822 * @ipr_cmd:	ipr command struct
4823 *
4824 * This function is invoked by the interrupt handler for
4825 * ops generated by the SCSI mid-layer
4826 *
4827 * Return value:
4828 * 	none
4829 **/
4830static void ipr_scsi_done(struct ipr_cmnd *ipr_cmd)
4831{
4832	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
4833	struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
4834	u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
4835
4836	scsi_cmd->resid = be32_to_cpu(ipr_cmd->ioasa.residual_data_len);
4837
4838	if (likely(IPR_IOASC_SENSE_KEY(ioasc) == 0)) {
4839		ipr_unmap_sglist(ioa_cfg, ipr_cmd);
4840		list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q);
4841		scsi_cmd->scsi_done(scsi_cmd);
4842	} else
4843		ipr_erp_start(ioa_cfg, ipr_cmd);
4844}
4845
4846/**
4847 * ipr_queuecommand - Queue a mid-layer request
4848 * @scsi_cmd:	scsi command struct
4849 * @done:		done function
4850 *
4851 * This function queues a request generated by the mid-layer.
4852 *
4853 * Return value:
4854 *	0 on success
4855 *	SCSI_MLQUEUE_DEVICE_BUSY if device is busy
4856 *	SCSI_MLQUEUE_HOST_BUSY if host is busy
4857 **/
4858static int ipr_queuecommand(struct scsi_cmnd *scsi_cmd,
4859			    void (*done) (struct scsi_cmnd *))
4860{
4861	struct ipr_ioa_cfg *ioa_cfg;
4862	struct ipr_resource_entry *res;
4863	struct ipr_ioarcb *ioarcb;
4864	struct ipr_cmnd *ipr_cmd;
4865	int rc = 0;
4866
4867	scsi_cmd->scsi_done = done;
4868	ioa_cfg = (struct ipr_ioa_cfg *)scsi_cmd->device->host->hostdata;
4869	res = scsi_cmd->device->hostdata;
4870	scsi_cmd->result = (DID_OK << 16);
4871
4872	/*
4873	 * We are currently blocking all devices due to a host reset
4874	 * We have told the host to stop giving us new requests, but
4875	 * ERP ops don't count. FIXME
4876	 */
4877	if (unlikely(!ioa_cfg->allow_cmds && !ioa_cfg->ioa_is_dead))
4878		return SCSI_MLQUEUE_HOST_BUSY;
4879
4880	/*
4881	 * FIXME - Create scsi_set_host_offline interface
4882	 *  and the ioa_is_dead check can be removed
4883	 */
4884	if (unlikely(ioa_cfg->ioa_is_dead || !res)) {
4885		memset(scsi_cmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
4886		scsi_cmd->result = (DID_NO_CONNECT << 16);
4887		scsi_cmd->scsi_done(scsi_cmd);
4888		return 0;
4889	}
4890
4891	if (ipr_is_gata(res) && res->sata_port)
4892		return ata_sas_queuecmd(scsi_cmd, done, res->sata_port->ap);
4893
4894	ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg);
4895	ioarcb = &ipr_cmd->ioarcb;
4896	list_add_tail(&ipr_cmd->queue, &ioa_cfg->pending_q);
4897
4898	memcpy(ioarcb->cmd_pkt.cdb, scsi_cmd->cmnd, scsi_cmd->cmd_len);
4899	ipr_cmd->scsi_cmd = scsi_cmd;
4900	ioarcb->res_handle = res->cfgte.res_handle;
4901	ipr_cmd->done = ipr_scsi_done;
4902	ipr_trc_hook(ipr_cmd, IPR_TRACE_START, IPR_GET_PHYS_LOC(res->cfgte.res_addr));
4903
4904	if (ipr_is_gscsi(res) || ipr_is_vset_device(res)) {
4905		if (scsi_cmd->underflow == 0)
4906			ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_NO_ULEN_CHK;
4907
4908		if (res->needs_sync_complete) {
4909			ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_SYNC_COMPLETE;
4910			res->needs_sync_complete = 0;
4911		}
4912
4913		ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_NO_LINK_DESC;
4914		ioarcb->cmd_pkt.flags_lo |= IPR_FLAGS_LO_DELAY_AFTER_RST;
4915		ioarcb->cmd_pkt.flags_lo |= IPR_FLAGS_LO_ALIGNED_BFR;
4916		ioarcb->cmd_pkt.flags_lo |= ipr_get_task_attributes(scsi_cmd);
4917	}
4918
4919	if (scsi_cmd->cmnd[0] >= 0xC0 &&
4920	    (!ipr_is_gscsi(res) || scsi_cmd->cmnd[0] == IPR_QUERY_RSRC_STATE))
4921		ioarcb->cmd_pkt.request_type = IPR_RQTYPE_IOACMD;
4922
4923	if (likely(rc == 0))
4924		rc = ipr_build_ioadl(ioa_cfg, ipr_cmd);
4925
4926	if (likely(rc == 0)) {
4927		mb();
4928		writel(be32_to_cpu(ipr_cmd->ioarcb.ioarcb_host_pci_addr),
4929		       ioa_cfg->regs.ioarrin_reg);
4930	} else {
4931		 list_move_tail(&ipr_cmd->queue, &ioa_cfg->free_q);
4932		 return SCSI_MLQUEUE_HOST_BUSY;
4933	}
4934
4935	return 0;
4936}
4937
4938/**
4939 * ipr_ioctl - IOCTL handler
4940 * @sdev:	scsi device struct
4941 * @cmd:	IOCTL cmd
4942 * @arg:	IOCTL arg
4943 *
4944 * Return value:
4945 * 	0 on success / other on failure
4946 **/
4947static int ipr_ioctl(struct scsi_device *sdev, int cmd, void __user *arg)
4948{
4949	struct ipr_resource_entry *res;
4950
4951	res = (struct ipr_resource_entry *)sdev->hostdata;
4952	if (res && ipr_is_gata(res))
4953		return ata_scsi_ioctl(sdev, cmd, arg);
4954
4955	return -EINVAL;
4956}
4957
4958/**
4959 * ipr_info - Get information about the card/driver
4960 * @scsi_host:	scsi host struct
4961 *
4962 * Return value:
4963 * 	pointer to buffer with description string
4964 **/
4965static const char * ipr_ioa_info(struct Scsi_Host *host)
4966{
4967	static char buffer[512];
4968	struct ipr_ioa_cfg *ioa_cfg;
4969	unsigned long lock_flags = 0;
4970
4971	ioa_cfg = (struct ipr_ioa_cfg *) host->hostdata;
4972
4973	spin_lock_irqsave(host->host_lock, lock_flags);
4974	sprintf(buffer, "IBM %X Storage Adapter", ioa_cfg->type);
4975	spin_unlock_irqrestore(host->host_lock, lock_flags);
4976
4977	return buffer;
4978}
4979
4980static struct scsi_host_template driver_template = {
4981	.module = THIS_MODULE,
4982	.name = "IPR",
4983	.info = ipr_ioa_info,
4984	.ioctl = ipr_ioctl,
4985	.queuecommand = ipr_queuecommand,
4986	.eh_abort_handler = ipr_eh_abort,
4987	.eh_device_reset_handler = ipr_eh_dev_reset,
4988	.eh_host_reset_handler = ipr_eh_host_reset,
4989	.slave_alloc = ipr_slave_alloc,
4990	.slave_configure = ipr_slave_configure,
4991	.slave_destroy = ipr_slave_destroy,
4992	.target_alloc = ipr_target_alloc,
4993	.target_destroy = ipr_target_destroy,
4994	.change_queue_depth = ipr_change_queue_depth,
4995	.change_queue_type = ipr_change_queue_type,
4996	.bios_param = ipr_biosparam,
4997	.can_queue = IPR_MAX_COMMANDS,
4998	.this_id = -1,
4999	.sg_tablesize = IPR_MAX_SGLIST,
5000	.max_sectors = IPR_IOA_MAX_SECTORS,
5001	.cmd_per_lun = IPR_MAX_CMD_PER_LUN,
5002	.use_clustering = ENABLE_CLUSTERING,
5003	.shost_attrs = ipr_ioa_attrs,
5004	.sdev_attrs = ipr_dev_attrs,
5005	.proc_name = IPR_NAME
5006};
5007
5008/**
5009 * ipr_ata_phy_reset - libata phy_reset handler
5010 * @ap:		ata port to reset
5011 *
5012 **/
5013static void ipr_ata_phy_reset(struct ata_port *ap)
5014{
5015	unsigned long flags;
5016	struct ipr_sata_port *sata_port = ap->private_data;
5017	struct ipr_resource_entry *res = sata_port->res;
5018	struct ipr_ioa_cfg *ioa_cfg = sata_port->ioa_cfg;
5019	int rc;
5020
5021	ENTER;
5022	spin_lock_irqsave(ioa_cfg->host->host_lock, flags);
5023	while(ioa_cfg->in_reset_reload) {
5024		spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags);
5025		wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
5026		spin_lock_irqsave(ioa_cfg->host->host_lock, flags);
5027	}
5028
5029	if (!ioa_cfg->allow_cmds)
5030		goto out_unlock;
5031
5032	rc = ipr_device_reset(ioa_cfg, res);
5033
5034	if (rc) {
5035		ap->ops->port_disable(ap);
5036		goto out_unlock;
5037	}
5038
5039	switch(res->cfgte.proto) {
5040	case IPR_PROTO_SATA:
5041	case IPR_PROTO_SAS_STP:
5042		ap->device[0].class = ATA_DEV_ATA;
5043		break;
5044	case IPR_PROTO_SATA_ATAPI:
5045	case IPR_PROTO_SAS_STP_ATAPI:
5046		ap->device[0].class = ATA_DEV_ATAPI;
5047		break;
5048	default:
5049		ap->device[0].class = ATA_DEV_UNKNOWN;
5050		ap->ops->port_disable(ap);
5051		break;
5052	};
5053
5054out_unlock:
5055	spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags);
5056	LEAVE;
5057}
5058
5059/**
5060 * ipr_ata_post_internal - Cleanup after an internal command
5061 * @qc:	ATA queued command
5062 *
5063 * Return value:
5064 * 	none
5065 **/
5066static void ipr_ata_post_internal(struct ata_queued_cmd *qc)
5067{
5068	struct ipr_sata_port *sata_port = qc->ap->private_data;
5069	struct ipr_ioa_cfg *ioa_cfg = sata_port->ioa_cfg;
5070	struct ipr_cmnd *ipr_cmd;
5071	unsigned long flags;
5072
5073	spin_lock_irqsave(ioa_cfg->host->host_lock, flags);
5074	while(ioa_cfg->in_reset_reload) {
5075		spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags);
5076		wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
5077		spin_lock_irqsave(ioa_cfg->host->host_lock, flags);
5078	}
5079
5080	list_for_each_entry(ipr_cmd, &ioa_cfg->pending_q, queue) {
5081		if (ipr_cmd->qc == qc) {
5082			ipr_device_reset(ioa_cfg, sata_port->res);
5083			break;
5084		}
5085	}
5086	spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags);
5087}
5088
5089/**
5090 * ipr_tf_read - Read the current ATA taskfile for the ATA port
5091 * @ap:	ATA port
5092 * @tf:	destination ATA taskfile
5093 *
5094 * Return value:
5095 * 	none
5096 **/
5097static void ipr_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
5098{
5099	struct ipr_sata_port *sata_port = ap->private_data;
5100	struct ipr_ioasa_gata *g = &sata_port->ioasa;
5101
5102	tf->feature = g->error;
5103	tf->nsect = g->nsect;
5104	tf->lbal = g->lbal;
5105	tf->lbam = g->lbam;
5106	tf->lbah = g->lbah;
5107	tf->device = g->device;
5108	tf->command = g->status;
5109	tf->hob_nsect = g->hob_nsect;
5110	tf->hob_lbal = g->hob_lbal;
5111	tf->hob_lbam = g->hob_lbam;
5112	tf->hob_lbah = g->hob_lbah;
5113	tf->ctl = g->alt_status;
5114}
5115
5116/**
5117 * ipr_copy_sata_tf - Copy a SATA taskfile to an IOA data structure
5118 * @regs:	destination
5119 * @tf:	source ATA taskfile
5120 *
5121 * Return value:
5122 * 	none
5123 **/
5124static void ipr_copy_sata_tf(struct ipr_ioarcb_ata_regs *regs,
5125			     struct ata_taskfile *tf)
5126{
5127	regs->feature = tf->feature;
5128	regs->nsect = tf->nsect;
5129	regs->lbal = tf->lbal;
5130	regs->lbam = tf->lbam;
5131	regs->lbah = tf->lbah;
5132	regs->device = tf->device;
5133	regs->command = tf->command;
5134	regs->hob_feature = tf->hob_feature;
5135	regs->hob_nsect = tf->hob_nsect;
5136	regs->hob_lbal = tf->hob_lbal;
5137	regs->hob_lbam = tf->hob_lbam;
5138	regs->hob_lbah = tf->hob_lbah;
5139	regs->ctl = tf->ctl;
5140}
5141
5142/**
5143 * ipr_sata_done - done function for SATA commands
5144 * @ipr_cmd:	ipr command struct
5145 *
5146 * This function is invoked by the interrupt handler for
5147 * ops generated by the SCSI mid-layer to SATA devices
5148 *
5149 * Return value:
5150 * 	none
5151 **/
5152static void ipr_sata_done(struct ipr_cmnd *ipr_cmd)
5153{
5154	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
5155	struct ata_queued_cmd *qc = ipr_cmd->qc;
5156	struct ipr_sata_port *sata_port = qc->ap->private_data;
5157	struct ipr_resource_entry *res = sata_port->res;
5158	u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
5159
5160	memcpy(&sata_port->ioasa, &ipr_cmd->ioasa.u.gata,
5161	       sizeof(struct ipr_ioasa_gata));
5162	ipr_dump_ioasa(ioa_cfg, ipr_cmd, res);
5163
5164	if (be32_to_cpu(ipr_cmd->ioasa.ioasc_specific) & IPR_ATA_DEVICE_WAS_RESET)
5165		scsi_report_device_reset(ioa_cfg->host, res->cfgte.res_addr.bus,
5166					 res->cfgte.res_addr.target);
5167
5168	if (IPR_IOASC_SENSE_KEY(ioasc) > RECOVERED_ERROR)
5169		qc->err_mask |= __ac_err_mask(ipr_cmd->ioasa.u.gata.status);
5170	else
5171		qc->err_mask |= ac_err_mask(ipr_cmd->ioasa.u.gata.status);
5172	list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q);
5173	ata_qc_complete(qc);
5174}
5175
5176/**
5177 * ipr_build_ata_ioadl - Build an ATA scatter/gather list
5178 * @ipr_cmd:	ipr command struct
5179 * @qc:		ATA queued command
5180 *
5181 **/
5182static void ipr_build_ata_ioadl(struct ipr_cmnd *ipr_cmd,
5183				struct ata_queued_cmd *qc)
5184{
5185	u32 ioadl_flags = 0;
5186	struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
5187	struct ipr_ioadl_desc *ioadl = ipr_cmd->ioadl;
5188	int len = qc->nbytes + qc->pad_len;
5189	struct scatterlist *sg;
5190
5191	if (len == 0)
5192		return;
5193
5194	if (qc->dma_dir == DMA_TO_DEVICE) {
5195		ioadl_flags = IPR_IOADL_FLAGS_WRITE;
5196		ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_WRITE_NOT_READ;
5197		ioarcb->write_data_transfer_length = cpu_to_be32(len);
5198		ioarcb->write_ioadl_len =
5199			cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg);
5200	} else if (qc->dma_dir == DMA_FROM_DEVICE) {
5201		ioadl_flags = IPR_IOADL_FLAGS_READ;
5202		ioarcb->read_data_transfer_length = cpu_to_be32(len);
5203		ioarcb->read_ioadl_len =
5204			cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg);
5205	}
5206
5207	ata_for_each_sg(sg, qc) {
5208		ioadl->flags_and_data_len = cpu_to_be32(ioadl_flags | sg_dma_len(sg));
5209		ioadl->address = cpu_to_be32(sg_dma_address(sg));
5210		if (ata_sg_is_last(sg, qc))
5211			ioadl->flags_and_data_len |= cpu_to_be32(IPR_IOADL_FLAGS_LAST);
5212		else
5213			ioadl++;
5214	}
5215}
5216
5217/**
5218 * ipr_qc_issue - Issue a SATA qc to a device
5219 * @qc:	queued command
5220 *
5221 * Return value:
5222 * 	0 if success
5223 **/
5224static unsigned int ipr_qc_issue(struct ata_queued_cmd *qc)
5225{
5226	struct ata_port *ap = qc->ap;
5227	struct ipr_sata_port *sata_port = ap->private_data;
5228	struct ipr_resource_entry *res = sata_port->res;
5229	struct ipr_ioa_cfg *ioa_cfg = sata_port->ioa_cfg;
5230	struct ipr_cmnd *ipr_cmd;
5231	struct ipr_ioarcb *ioarcb;
5232	struct ipr_ioarcb_ata_regs *regs;
5233
5234	if (unlikely(!ioa_cfg->allow_cmds || ioa_cfg->ioa_is_dead))
5235		return AC_ERR_SYSTEM;
5236
5237	ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg);
5238	ioarcb = &ipr_cmd->ioarcb;
5239	regs = &ioarcb->add_data.u.regs;
5240
5241	memset(&ioarcb->add_data, 0, sizeof(ioarcb->add_data));
5242	ioarcb->add_cmd_parms_len = cpu_to_be32(sizeof(ioarcb->add_data.u.regs));
5243
5244	list_add_tail(&ipr_cmd->queue, &ioa_cfg->pending_q);
5245	ipr_cmd->qc = qc;
5246	ipr_cmd->done = ipr_sata_done;
5247	ipr_cmd->ioarcb.res_handle = res->cfgte.res_handle;
5248	ioarcb->cmd_pkt.request_type = IPR_RQTYPE_ATA_PASSTHRU;
5249	ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_NO_LINK_DESC;
5250	ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_NO_ULEN_CHK;
5251	ipr_cmd->dma_use_sg = qc->pad_len ? qc->n_elem + 1 : qc->n_elem;
5252
5253	ipr_build_ata_ioadl(ipr_cmd, qc);
5254	regs->flags |= IPR_ATA_FLAG_STATUS_ON_GOOD_COMPLETION;
5255	ipr_copy_sata_tf(regs, &qc->tf);
5256	memcpy(ioarcb->cmd_pkt.cdb, qc->cdb, IPR_MAX_CDB_LEN);
5257	ipr_trc_hook(ipr_cmd, IPR_TRACE_START, IPR_GET_PHYS_LOC(res->cfgte.res_addr));
5258
5259	switch (qc->tf.protocol) {
5260	case ATA_PROT_NODATA:
5261	case ATA_PROT_PIO:
5262		break;
5263
5264	case ATA_PROT_DMA:
5265		regs->flags |= IPR_ATA_FLAG_XFER_TYPE_DMA;
5266		break;
5267
5268	case ATA_PROT_ATAPI:
5269	case ATA_PROT_ATAPI_NODATA:
5270		regs->flags |= IPR_ATA_FLAG_PACKET_CMD;
5271		break;
5272
5273	case ATA_PROT_ATAPI_DMA:
5274		regs->flags |= IPR_ATA_FLAG_PACKET_CMD;
5275		regs->flags |= IPR_ATA_FLAG_XFER_TYPE_DMA;
5276		break;
5277
5278	default:
5279		WARN_ON(1);
5280		return AC_ERR_INVALID;
5281	}
5282
5283	mb();
5284	writel(be32_to_cpu(ioarcb->ioarcb_host_pci_addr),
5285	       ioa_cfg->regs.ioarrin_reg);
5286	return 0;
5287}
5288
5289/**
5290 * ipr_ata_check_status - Return last ATA status
5291 * @ap:	ATA port
5292 *
5293 * Return value:
5294 * 	ATA status
5295 **/
5296static u8 ipr_ata_check_status(struct ata_port *ap)
5297{
5298	struct ipr_sata_port *sata_port = ap->private_data;
5299	return sata_port->ioasa.status;
5300}
5301
5302/**
5303 * ipr_ata_check_altstatus - Return last ATA altstatus
5304 * @ap:	ATA port
5305 *
5306 * Return value:
5307 * 	Alt ATA status
5308 **/
5309static u8 ipr_ata_check_altstatus(struct ata_port *ap)
5310{
5311	struct ipr_sata_port *sata_port = ap->private_data;
5312	return sata_port->ioasa.alt_status;
5313}
5314
5315static struct ata_port_operations ipr_sata_ops = {
5316	.port_disable = ata_port_disable,
5317	.check_status = ipr_ata_check_status,
5318	.check_altstatus = ipr_ata_check_altstatus,
5319	.dev_select = ata_noop_dev_select,
5320	.phy_reset = ipr_ata_phy_reset,
5321	.post_internal_cmd = ipr_ata_post_internal,
5322	.tf_read = ipr_tf_read,
5323	.qc_prep = ata_noop_qc_prep,
5324	.qc_issue = ipr_qc_issue,
5325	.port_start = ata_sas_port_start,
5326	.port_stop = ata_sas_port_stop
5327};
5328
5329static struct ata_port_info sata_port_info = {
5330	.flags	= ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | ATA_FLAG_SATA_RESET |
5331	ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA,
5332	.pio_mask	= 0x10, /* pio4 */
5333	.mwdma_mask = 0x07,
5334	.udma_mask	= 0x7f, /* udma0-6 */
5335	.port_ops	= &ipr_sata_ops
5336};
5337
5338#ifdef CONFIG_PPC_PSERIES
5339static const u16 ipr_blocked_processors[] = {
5340	PV_NORTHSTAR,
5341	PV_PULSAR,
5342	PV_POWER4,
5343	PV_ICESTAR,
5344	PV_SSTAR,
5345	PV_POWER4p,
5346	PV_630,
5347	PV_630p
5348};
5349
5350/**
5351 * ipr_invalid_adapter - Determine if this adapter is supported on this hardware
5352 * @ioa_cfg:	ioa cfg struct
5353 *
5354 * Adapters that use Gemstone revision < 3.1 do not work reliably on
5355 * certain pSeries hardware. This function determines if the given
5356 * adapter is in one of these confgurations or not.
5357 *
5358 * Return value:
5359 * 	1 if adapter is not supported / 0 if adapter is supported
5360 **/
5361static int ipr_invalid_adapter(struct ipr_ioa_cfg *ioa_cfg)
5362{
5363	u8 rev_id;
5364	int i;
5365
5366	if (ioa_cfg->type == 0x5702) {
5367		if (pci_read_config_byte(ioa_cfg->pdev, PCI_REVISION_ID,
5368					 &rev_id) == PCIBIOS_SUCCESSFUL) {
5369			if (rev_id < 4) {
5370				for (i = 0; i < ARRAY_SIZE(ipr_blocked_processors); i++){
5371					if (__is_processor(ipr_blocked_processors[i]))
5372						return 1;
5373				}
5374			}
5375		}
5376	}
5377	return 0;
5378}
5379#else
5380#define ipr_invalid_adapter(ioa_cfg) 0
5381#endif
5382
5383/**
5384 * ipr_ioa_bringdown_done - IOA bring down completion.
5385 * @ipr_cmd:	ipr command struct
5386 *
5387 * This function processes the completion of an adapter bring down.
5388 * It wakes any reset sleepers.
5389 *
5390 * Return value:
5391 * 	IPR_RC_JOB_RETURN
5392 **/
5393static int ipr_ioa_bringdown_done(struct ipr_cmnd *ipr_cmd)
5394{
5395	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
5396
5397	ENTER;
5398	ioa_cfg->in_reset_reload = 0;
5399	ioa_cfg->reset_retries = 0;
5400	list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q);
5401	wake_up_all(&ioa_cfg->reset_wait_q);
5402
5403	spin_unlock_irq(ioa_cfg->host->host_lock);
5404	scsi_unblock_requests(ioa_cfg->host);
5405	spin_lock_irq(ioa_cfg->host->host_lock);
5406	LEAVE;
5407
5408	return IPR_RC_JOB_RETURN;
5409}
5410
5411/**
5412 * ipr_ioa_reset_done - IOA reset completion.
5413 * @ipr_cmd:	ipr command struct
5414 *
5415 * This function processes the completion of an adapter reset.
5416 * It schedules any necessary mid-layer add/removes and
5417 * wakes any reset sleepers.
5418 *
5419 * Return value:
5420 * 	IPR_RC_JOB_RETURN
5421 **/
5422static int ipr_ioa_reset_done(struct ipr_cmnd *ipr_cmd)
5423{
5424	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
5425	struct ipr_resource_entry *res;
5426	struct ipr_hostrcb *hostrcb, *temp;
5427	int i = 0;
5428
5429	ENTER;
5430	ioa_cfg->in_reset_reload = 0;
5431	ioa_cfg->allow_cmds = 1;
5432	ioa_cfg->reset_cmd = NULL;
5433	ioa_cfg->doorbell |= IPR_RUNTIME_RESET;
5434
5435	list_for_each_entry(res, &ioa_cfg->used_res_q, queue) {
5436		if (ioa_cfg->allow_ml_add_del && (res->add_to_ml || res->del_from_ml)) {
5437			ipr_trace;
5438			break;
5439		}
5440	}
5441	schedule_work(&ioa_cfg->work_q);
5442
5443	list_for_each_entry_safe(hostrcb, temp, &ioa_cfg->hostrcb_free_q, queue) {
5444		list_del(&hostrcb->queue);
5445		if (i++ < IPR_NUM_LOG_HCAMS)
5446			ipr_send_hcam(ioa_cfg, IPR_HCAM_CDB_OP_CODE_LOG_DATA, hostrcb);
5447		else
5448			ipr_send_hcam(ioa_cfg, IPR_HCAM_CDB_OP_CODE_CONFIG_CHANGE, hostrcb);
5449	}
5450
5451	scsi_report_bus_reset(ioa_cfg->host, IPR_VSET_BUS);
5452	dev_info(&ioa_cfg->pdev->dev, "IOA initialized.\n");
5453
5454	ioa_cfg->reset_retries = 0;
5455	list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q);
5456	wake_up_all(&ioa_cfg->reset_wait_q);
5457
5458	spin_unlock_irq(ioa_cfg->host->host_lock);
5459	scsi_unblock_requests(ioa_cfg->host);
5460	spin_lock_irq(ioa_cfg->host->host_lock);
5461
5462	if (!ioa_cfg->allow_cmds)
5463		scsi_block_requests(ioa_cfg->host);
5464
5465	LEAVE;
5466	return IPR_RC_JOB_RETURN;
5467}
5468
5469/**
5470 * ipr_set_sup_dev_dflt - Initialize a Set Supported Device buffer
5471 * @supported_dev:	supported device struct
5472 * @vpids:			vendor product id struct
5473 *
5474 * Return value:
5475 * 	none
5476 **/
5477static void ipr_set_sup_dev_dflt(struct ipr_supported_device *supported_dev,
5478				 struct ipr_std_inq_vpids *vpids)
5479{
5480	memset(supported_dev, 0, sizeof(struct ipr_supported_device));
5481	memcpy(&supported_dev->vpids, vpids, sizeof(struct ipr_std_inq_vpids));
5482	supported_dev->num_records = 1;
5483	supported_dev->data_length =
5484		cpu_to_be16(sizeof(struct ipr_supported_device));
5485	supported_dev->reserved = 0;
5486}
5487
5488/**
5489 * ipr_set_supported_devs - Send Set Supported Devices for a device
5490 * @ipr_cmd:	ipr command struct
5491 *
5492 * This function send a Set Supported Devices to the adapter
5493 *
5494 * Return value:
5495 * 	IPR_RC_JOB_CONTINUE / IPR_RC_JOB_RETURN
5496 **/
5497static int ipr_set_supported_devs(struct ipr_cmnd *ipr_cmd)
5498{
5499	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
5500	struct ipr_supported_device *supp_dev = &ioa_cfg->vpd_cbs->supp_dev;
5501	struct ipr_ioadl_desc *ioadl = ipr_cmd->ioadl;
5502	struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
5503	struct ipr_resource_entry *res = ipr_cmd->u.res;
5504
5505	ipr_cmd->job_step = ipr_ioa_reset_done;
5506
5507	list_for_each_entry_continue(res, &ioa_cfg->used_res_q, queue) {
5508		if (!ipr_is_scsi_disk(res))
5509			continue;
5510
5511		ipr_cmd->u.res = res;
5512		ipr_set_sup_dev_dflt(supp_dev, &res->cfgte.std_inq_data.vpids);
5513
5514		ioarcb->res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE);
5515		ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_WRITE_NOT_READ;
5516		ioarcb->cmd_pkt.request_type = IPR_RQTYPE_IOACMD;
5517
5518		ioarcb->cmd_pkt.cdb[0] = IPR_SET_SUPPORTED_DEVICES;
5519		ioarcb->cmd_pkt.cdb[7] = (sizeof(struct ipr_supported_device) >> 8) & 0xff;
5520		ioarcb->cmd_pkt.cdb[8] = sizeof(struct ipr_supported_device) & 0xff;
5521
5522		ioadl->flags_and_data_len = cpu_to_be32(IPR_IOADL_FLAGS_WRITE_LAST |
5523							sizeof(struct ipr_supported_device));
5524		ioadl->address = cpu_to_be32(ioa_cfg->vpd_cbs_dma +
5525					     offsetof(struct ipr_misc_cbs, supp_dev));
5526		ioarcb->write_ioadl_len = cpu_to_be32(sizeof(struct ipr_ioadl_desc));
5527		ioarcb->write_data_transfer_length =
5528			cpu_to_be32(sizeof(struct ipr_supported_device));
5529
5530		ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout,
5531			   IPR_SET_SUP_DEVICE_TIMEOUT);
5532
5533		ipr_cmd->job_step = ipr_set_supported_devs;
5534		return IPR_RC_JOB_RETURN;
5535	}
5536
5537	return IPR_RC_JOB_CONTINUE;
5538}
5539
5540/**
5541 * ipr_setup_write_cache - Disable write cache if needed
5542 * @ipr_cmd:	ipr command struct
5543 *
5544 * This function sets up adapters write cache to desired setting
5545 *
5546 * Return value:
5547 * 	IPR_RC_JOB_CONTINUE / IPR_RC_JOB_RETURN
5548 **/
5549static int ipr_setup_write_cache(struct ipr_cmnd *ipr_cmd)
5550{
5551	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
5552
5553	ipr_cmd->job_step = ipr_set_supported_devs;
5554	ipr_cmd->u.res = list_entry(ioa_cfg->used_res_q.next,
5555				    struct ipr_resource_entry, queue);
5556
5557	if (ioa_cfg->cache_state != CACHE_DISABLED)
5558		return IPR_RC_JOB_CONTINUE;
5559
5560	ipr_cmd->ioarcb.res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE);
5561	ipr_cmd->ioarcb.cmd_pkt.request_type = IPR_RQTYPE_IOACMD;
5562	ipr_cmd->ioarcb.cmd_pkt.cdb[0] = IPR_IOA_SHUTDOWN;
5563	ipr_cmd->ioarcb.cmd_pkt.cdb[1] = IPR_SHUTDOWN_PREPARE_FOR_NORMAL;
5564
5565	ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
5566
5567	return IPR_RC_JOB_RETURN;
5568}
5569
5570/**
5571 * ipr_get_mode_page - Locate specified mode page
5572 * @mode_pages:	mode page buffer
5573 * @page_code:	page code to find
5574 * @len:		minimum required length for mode page
5575 *
5576 * Return value:
5577 * 	pointer to mode page / NULL on failure
5578 **/
5579static void *ipr_get_mode_page(struct ipr_mode_pages *mode_pages,
5580			       u32 page_code, u32 len)
5581{
5582	struct ipr_mode_page_hdr *mode_hdr;
5583	u32 page_length;
5584	u32 length;
5585
5586	if (!mode_pages || (mode_pages->hdr.length == 0))
5587		return NULL;
5588
5589	length = (mode_pages->hdr.length + 1) - 4 - mode_pages->hdr.block_desc_len;
5590	mode_hdr = (struct ipr_mode_page_hdr *)
5591		(mode_pages->data + mode_pages->hdr.block_desc_len);
5592
5593	while (length) {
5594		if (IPR_GET_MODE_PAGE_CODE(mode_hdr) == page_code) {
5595			if (mode_hdr->page_length >= (len - sizeof(struct ipr_mode_page_hdr)))
5596				return mode_hdr;
5597			break;
5598		} else {
5599			page_length = (sizeof(struct ipr_mode_page_hdr) +
5600				       mode_hdr->page_length);
5601			length -= page_length;
5602			mode_hdr = (struct ipr_mode_page_hdr *)
5603				((unsigned long)mode_hdr + page_length);
5604		}
5605	}
5606	return NULL;
5607}
5608
5609/**
5610 * ipr_check_term_power - Check for term power errors
5611 * @ioa_cfg:	ioa config struct
5612 * @mode_pages:	IOAFP mode pages buffer
5613 *
5614 * Check the IOAFP's mode page 28 for term power errors
5615 *
5616 * Return value:
5617 * 	nothing
5618 **/
5619static void ipr_check_term_power(struct ipr_ioa_cfg *ioa_cfg,
5620				 struct ipr_mode_pages *mode_pages)
5621{
5622	int i;
5623	int entry_length;
5624	struct ipr_dev_bus_entry *bus;
5625	struct ipr_mode_page28 *mode_page;
5626
5627	mode_page = ipr_get_mode_page(mode_pages, 0x28,
5628				      sizeof(struct ipr_mode_page28));
5629
5630	entry_length = mode_page->entry_length;
5631
5632	bus = mode_page->bus;
5633
5634	for (i = 0; i < mode_page->num_entries; i++) {
5635		if (bus->flags & IPR_SCSI_ATTR_NO_TERM_PWR) {
5636			dev_err(&ioa_cfg->pdev->dev,
5637				"Term power is absent on scsi bus %d\n",
5638				bus->res_addr.bus);
5639		}
5640
5641		bus = (struct ipr_dev_bus_entry *)((char *)bus + entry_length);
5642	}
5643}
5644
5645/**
5646 * ipr_scsi_bus_speed_limit - Limit the SCSI speed based on SES table
5647 * @ioa_cfg:	ioa config struct
5648 *
5649 * Looks through the config table checking for SES devices. If
5650 * the SES device is in the SES table indicating a maximum SCSI
5651 * bus speed, the speed is limited for the bus.
5652 *
5653 * Return value:
5654 * 	none
5655 **/
5656static void ipr_scsi_bus_speed_limit(struct ipr_ioa_cfg *ioa_cfg)
5657{
5658	u32 max_xfer_rate;
5659	int i;
5660
5661	for (i = 0; i < IPR_MAX_NUM_BUSES; i++) {
5662		max_xfer_rate = ipr_get_max_scsi_speed(ioa_cfg, i,
5663						       ioa_cfg->bus_attr[i].bus_width);
5664
5665		if (max_xfer_rate < ioa_cfg->bus_attr[i].max_xfer_rate)
5666			ioa_cfg->bus_attr[i].max_xfer_rate = max_xfer_rate;
5667	}
5668}
5669
5670/**
5671 * ipr_modify_ioafp_mode_page_28 - Modify IOAFP Mode Page 28
5672 * @ioa_cfg:	ioa config struct
5673 * @mode_pages:	mode page 28 buffer
5674 *
5675 * Updates mode page 28 based on driver configuration
5676 *
5677 * Return value:
5678 * 	none
5679 **/
5680static void ipr_modify_ioafp_mode_page_28(struct ipr_ioa_cfg *ioa_cfg,
5681					  	struct ipr_mode_pages *mode_pages)
5682{
5683	int i, entry_length;
5684	struct ipr_dev_bus_entry *bus;
5685	struct ipr_bus_attributes *bus_attr;
5686	struct ipr_mode_page28 *mode_page;
5687
5688	mode_page = ipr_get_mode_page(mode_pages, 0x28,
5689				      sizeof(struct ipr_mode_page28));
5690
5691	entry_length = mode_page->entry_length;
5692
5693	/* Loop for each device bus entry */
5694	for (i = 0, bus = mode_page->bus;
5695	     i < mode_page->num_entries;
5696	     i++, bus = (struct ipr_dev_bus_entry *)((u8 *)bus + entry_length)) {
5697		if (bus->res_addr.bus > IPR_MAX_NUM_BUSES) {
5698			dev_err(&ioa_cfg->pdev->dev,
5699				"Invalid resource address reported: 0x%08X\n",
5700				IPR_GET_PHYS_LOC(bus->res_addr));
5701			continue;
5702		}
5703
5704		bus_attr = &ioa_cfg->bus_attr[i];
5705		bus->extended_reset_delay = IPR_EXTENDED_RESET_DELAY;
5706		bus->bus_width = bus_attr->bus_width;
5707		bus->max_xfer_rate = cpu_to_be32(bus_attr->max_xfer_rate);
5708		bus->flags &= ~IPR_SCSI_ATTR_QAS_MASK;
5709		if (bus_attr->qas_enabled)
5710			bus->flags |= IPR_SCSI_ATTR_ENABLE_QAS;
5711		else
5712			bus->flags |= IPR_SCSI_ATTR_DISABLE_QAS;
5713	}
5714}
5715
5716/**
5717 * ipr_build_mode_select - Build a mode select command
5718 * @ipr_cmd:	ipr command struct
5719 * @res_handle:	resource handle to send command to
5720 * @parm:		Byte 2 of Mode Sense command
5721 * @dma_addr:	DMA buffer address
5722 * @xfer_len:	data transfer length
5723 *
5724 * Return value:
5725 * 	none
5726 **/
5727static void ipr_build_mode_select(struct ipr_cmnd *ipr_cmd,
5728				  __be32 res_handle, u8 parm, u32 dma_addr,
5729				  u8 xfer_len)
5730{
5731	struct ipr_ioadl_desc *ioadl = ipr_cmd->ioadl;
5732	struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
5733
5734	ioarcb->res_handle = res_handle;
5735	ioarcb->cmd_pkt.request_type = IPR_RQTYPE_SCSICDB;
5736	ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_WRITE_NOT_READ;
5737	ioarcb->cmd_pkt.cdb[0] = MODE_SELECT;
5738	ioarcb->cmd_pkt.cdb[1] = parm;
5739	ioarcb->cmd_pkt.cdb[4] = xfer_len;
5740
5741	ioadl->flags_and_data_len =
5742		cpu_to_be32(IPR_IOADL_FLAGS_WRITE_LAST | xfer_len);
5743	ioadl->address = cpu_to_be32(dma_addr);
5744	ioarcb->write_ioadl_len = cpu_to_be32(sizeof(struct ipr_ioadl_desc));
5745	ioarcb->write_data_transfer_length = cpu_to_be32(xfer_len);
5746}
5747
5748/**
5749 * ipr_ioafp_mode_select_page28 - Issue Mode Select Page 28 to IOA
5750 * @ipr_cmd:	ipr command struct
5751 *
5752 * This function sets up the SCSI bus attributes and sends
5753 * a Mode Select for Page 28 to activate them.
5754 *
5755 * Return value:
5756 * 	IPR_RC_JOB_RETURN
5757 **/
5758static int ipr_ioafp_mode_select_page28(struct ipr_cmnd *ipr_cmd)
5759{
5760	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
5761	struct ipr_mode_pages *mode_pages = &ioa_cfg->vpd_cbs->mode_pages;
5762	int length;
5763
5764	ENTER;
5765	ipr_scsi_bus_speed_limit(ioa_cfg);
5766	ipr_check_term_power(ioa_cfg, mode_pages);
5767	ipr_modify_ioafp_mode_page_28(ioa_cfg, mode_pages);
5768	length = mode_pages->hdr.length + 1;
5769	mode_pages->hdr.length = 0;
5770
5771	ipr_build_mode_select(ipr_cmd, cpu_to_be32(IPR_IOA_RES_HANDLE), 0x11,
5772			      ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, mode_pages),
5773			      length);
5774
5775	ipr_cmd->job_step = ipr_setup_write_cache;
5776	ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
5777
5778	LEAVE;
5779	return IPR_RC_JOB_RETURN;
5780}
5781
5782/**
5783 * ipr_build_mode_sense - Builds a mode sense command
5784 * @ipr_cmd:	ipr command struct
5785 * @res:		resource entry struct
5786 * @parm:		Byte 2 of mode sense command
5787 * @dma_addr:	DMA address of mode sense buffer
5788 * @xfer_len:	Size of DMA buffer
5789 *
5790 * Return value:
5791 * 	none
5792 **/
5793static void ipr_build_mode_sense(struct ipr_cmnd *ipr_cmd,
5794				 __be32 res_handle,
5795				 u8 parm, u32 dma_addr, u8 xfer_len)
5796{
5797	struct ipr_ioadl_desc *ioadl = ipr_cmd->ioadl;
5798	struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
5799
5800	ioarcb->res_handle = res_handle;
5801	ioarcb->cmd_pkt.cdb[0] = MODE_SENSE;
5802	ioarcb->cmd_pkt.cdb[2] = parm;
5803	ioarcb->cmd_pkt.cdb[4] = xfer_len;
5804	ioarcb->cmd_pkt.request_type = IPR_RQTYPE_SCSICDB;
5805
5806	ioadl->flags_and_data_len =
5807		cpu_to_be32(IPR_IOADL_FLAGS_READ_LAST | xfer_len);
5808	ioadl->address = cpu_to_be32(dma_addr);
5809	ioarcb->read_ioadl_len = cpu_to_be32(sizeof(struct ipr_ioadl_desc));
5810	ioarcb->read_data_transfer_length = cpu_to_be32(xfer_len);
5811}
5812
5813/**
5814 * ipr_reset_cmd_failed - Handle failure of IOA reset command
5815 * @ipr_cmd:	ipr command struct
5816 *
5817 * This function handles the failure of an IOA bringup command.
5818 *
5819 * Return value:
5820 * 	IPR_RC_JOB_RETURN
5821 **/
5822static int ipr_reset_cmd_failed(struct ipr_cmnd *ipr_cmd)
5823{
5824	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
5825	u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
5826
5827	dev_err(&ioa_cfg->pdev->dev,
5828		"0x%02X failed with IOASC: 0x%08X\n",
5829		ipr_cmd->ioarcb.cmd_pkt.cdb[0], ioasc);
5830
5831	ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE);
5832	list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q);
5833	return IPR_RC_JOB_RETURN;
5834}
5835
5836/**
5837 * ipr_reset_mode_sense_failed - Handle failure of IOAFP mode sense
5838 * @ipr_cmd:	ipr command struct
5839 *
5840 * This function handles the failure of a Mode Sense to the IOAFP.
5841 * Some adapters do not handle all mode pages.
5842 *
5843 * Return value:
5844 * 	IPR_RC_JOB_CONTINUE / IPR_RC_JOB_RETURN
5845 **/
5846static int ipr_reset_mode_sense_failed(struct ipr_cmnd *ipr_cmd)
5847{
5848	u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
5849
5850	if (ioasc == IPR_IOASC_IR_INVALID_REQ_TYPE_OR_PKT) {
5851		ipr_cmd->job_step = ipr_setup_write_cache;
5852		return IPR_RC_JOB_CONTINUE;
5853	}
5854
5855	return ipr_reset_cmd_failed(ipr_cmd);
5856}
5857
5858/**
5859 * ipr_ioafp_mode_sense_page28 - Issue Mode Sense Page 28 to IOA
5860 * @ipr_cmd:	ipr command struct
5861 *
5862 * This function send a Page 28 mode sense to the IOA to
5863 * retrieve SCSI bus attributes.
5864 *
5865 * Return value:
5866 * 	IPR_RC_JOB_RETURN
5867 **/
5868static int ipr_ioafp_mode_sense_page28(struct ipr_cmnd *ipr_cmd)
5869{
5870	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
5871
5872	ENTER;
5873	ipr_build_mode_sense(ipr_cmd, cpu_to_be32(IPR_IOA_RES_HANDLE),
5874			     0x28, ioa_cfg->vpd_cbs_dma +
5875			     offsetof(struct ipr_misc_cbs, mode_pages),
5876			     sizeof(struct ipr_mode_pages));
5877
5878	ipr_cmd->job_step = ipr_ioafp_mode_select_page28;
5879	ipr_cmd->job_step_failed = ipr_reset_mode_sense_failed;
5880
5881	ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
5882
5883	LEAVE;
5884	return IPR_RC_JOB_RETURN;
5885}
5886
5887/**
5888 * ipr_ioafp_mode_select_page24 - Issue Mode Select to IOA
5889 * @ipr_cmd:	ipr command struct
5890 *
5891 * This function enables dual IOA RAID support if possible.
5892 *
5893 * Return value:
5894 * 	IPR_RC_JOB_RETURN
5895 **/
5896static int ipr_ioafp_mode_select_page24(struct ipr_cmnd *ipr_cmd)
5897{
5898	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
5899	struct ipr_mode_pages *mode_pages = &ioa_cfg->vpd_cbs->mode_pages;
5900	struct ipr_mode_page24 *mode_page;
5901	int length;
5902
5903	ENTER;
5904	mode_page = ipr_get_mode_page(mode_pages, 0x24,
5905				      sizeof(struct ipr_mode_page24));
5906
5907	if (mode_page)
5908		mode_page->flags |= IPR_ENABLE_DUAL_IOA_AF;
5909
5910	length = mode_pages->hdr.length + 1;
5911	mode_pages->hdr.length = 0;
5912
5913	ipr_build_mode_select(ipr_cmd, cpu_to_be32(IPR_IOA_RES_HANDLE), 0x11,
5914			      ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, mode_pages),
5915			      length);
5916
5917	ipr_cmd->job_step = ipr_ioafp_mode_sense_page28;
5918	ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
5919
5920	LEAVE;
5921	return IPR_RC_JOB_RETURN;
5922}
5923
5924/**
5925 * ipr_reset_mode_sense_page24_failed - Handle failure of IOAFP mode sense
5926 * @ipr_cmd:	ipr command struct
5927 *
5928 * This function handles the failure of a Mode Sense to the IOAFP.
5929 * Some adapters do not handle all mode pages.
5930 *
5931 * Return value:
5932 * 	IPR_RC_JOB_CONTINUE / IPR_RC_JOB_RETURN
5933 **/
5934static int ipr_reset_mode_sense_page24_failed(struct ipr_cmnd *ipr_cmd)
5935{
5936	u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
5937
5938	if (ioasc == IPR_IOASC_IR_INVALID_REQ_TYPE_OR_PKT) {
5939		ipr_cmd->job_step = ipr_ioafp_mode_sense_page28;
5940		return IPR_RC_JOB_CONTINUE;
5941	}
5942
5943	return ipr_reset_cmd_failed(ipr_cmd);
5944}
5945
5946/**
5947 * ipr_ioafp_mode_sense_page24 - Issue Page 24 Mode Sense to IOA
5948 * @ipr_cmd:	ipr command struct
5949 *
5950 * This function send a mode sense to the IOA to retrieve
5951 * the IOA Advanced Function Control mode page.
5952 *
5953 * Return value:
5954 * 	IPR_RC_JOB_RETURN
5955 **/
5956static int ipr_ioafp_mode_sense_page24(struct ipr_cmnd *ipr_cmd)
5957{
5958	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
5959
5960	ENTER;
5961	ipr_build_mode_sense(ipr_cmd, cpu_to_be32(IPR_IOA_RES_HANDLE),
5962			     0x24, ioa_cfg->vpd_cbs_dma +
5963			     offsetof(struct ipr_misc_cbs, mode_pages),
5964			     sizeof(struct ipr_mode_pages));
5965
5966	ipr_cmd->job_step = ipr_ioafp_mode_select_page24;
5967	ipr_cmd->job_step_failed = ipr_reset_mode_sense_page24_failed;
5968
5969	ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
5970
5971	LEAVE;
5972	return IPR_RC_JOB_RETURN;
5973}
5974
5975/**
5976 * ipr_init_res_table - Initialize the resource table
5977 * @ipr_cmd:	ipr command struct
5978 *
5979 * This function looks through the existing resource table, comparing
5980 * it with the config table. This function will take care of old/new
5981 * devices and schedule adding/removing them from the mid-layer
5982 * as appropriate.
5983 *
5984 * Return value:
5985 * 	IPR_RC_JOB_CONTINUE
5986 **/
5987static int ipr_init_res_table(struct ipr_cmnd *ipr_cmd)
5988{
5989	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
5990	struct ipr_resource_entry *res, *temp;
5991	struct ipr_config_table_entry *cfgte;
5992	int found, i;
5993	LIST_HEAD(old_res);
5994
5995	ENTER;
5996	if (ioa_cfg->cfg_table->hdr.flags & IPR_UCODE_DOWNLOAD_REQ)
5997		dev_err(&ioa_cfg->pdev->dev, "Microcode download required\n");
5998
5999	list_for_each_entry_safe(res, temp, &ioa_cfg->used_res_q, queue)
6000		list_move_tail(&res->queue, &old_res);
6001
6002	for (i = 0; i < ioa_cfg->cfg_table->hdr.num_entries; i++) {
6003		cfgte = &ioa_cfg->cfg_table->dev[i];
6004		found = 0;
6005
6006		list_for_each_entry_safe(res, temp, &old_res, queue) {
6007			if (!memcmp(&res->cfgte.res_addr,
6008				    &cfgte->res_addr, sizeof(cfgte->res_addr))) {
6009				list_move_tail(&res->queue, &ioa_cfg->used_res_q);
6010				found = 1;
6011				break;
6012			}
6013		}
6014
6015		if (!found) {
6016			if (list_empty(&ioa_cfg->free_res_q)) {
6017				dev_err(&ioa_cfg->pdev->dev, "Too many devices attached\n");
6018				break;
6019			}
6020
6021			found = 1;
6022			res = list_entry(ioa_cfg->free_res_q.next,
6023					 struct ipr_resource_entry, queue);
6024			list_move_tail(&res->queue, &ioa_cfg->used_res_q);
6025			ipr_init_res_entry(res);
6026			res->add_to_ml = 1;
6027		}
6028
6029		if (found)
6030			memcpy(&res->cfgte, cfgte, sizeof(struct ipr_config_table_entry));
6031	}
6032
6033	list_for_each_entry_safe(res, temp, &old_res, queue) {
6034		if (res->sdev) {
6035			res->del_from_ml = 1;
6036			res->cfgte.res_handle = IPR_INVALID_RES_HANDLE;
6037			list_move_tail(&res->queue, &ioa_cfg->used_res_q);
6038		} else {
6039			list_move_tail(&res->queue, &ioa_cfg->free_res_q);
6040		}
6041	}
6042
6043	if (ioa_cfg->dual_raid && ipr_dual_ioa_raid)
6044		ipr_cmd->job_step = ipr_ioafp_mode_sense_page24;
6045	else
6046		ipr_cmd->job_step = ipr_ioafp_mode_sense_page28;
6047
6048	LEAVE;
6049	return IPR_RC_JOB_CONTINUE;
6050}
6051
6052/**
6053 * ipr_ioafp_query_ioa_cfg - Send a Query IOA Config to the adapter.
6054 * @ipr_cmd:	ipr command struct
6055 *
6056 * This function sends a Query IOA Configuration command
6057 * to the adapter to retrieve the IOA configuration table.
6058 *
6059 * Return value:
6060 * 	IPR_RC_JOB_RETURN
6061 **/
6062static int ipr_ioafp_query_ioa_cfg(struct ipr_cmnd *ipr_cmd)
6063{
6064	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6065	struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
6066	struct ipr_ioadl_desc *ioadl = ipr_cmd->ioadl;
6067	struct ipr_inquiry_page3 *ucode_vpd = &ioa_cfg->vpd_cbs->page3_data;
6068	struct ipr_inquiry_cap *cap = &ioa_cfg->vpd_cbs->cap;
6069
6070	ENTER;
6071	if (cap->cap & IPR_CAP_DUAL_IOA_RAID)
6072		ioa_cfg->dual_raid = 1;
6073	dev_info(&ioa_cfg->pdev->dev, "Adapter firmware version: %02X%02X%02X%02X\n",
6074		 ucode_vpd->major_release, ucode_vpd->card_type,
6075		 ucode_vpd->minor_release[0], ucode_vpd->minor_release[1]);
6076	ioarcb->cmd_pkt.request_type = IPR_RQTYPE_IOACMD;
6077	ioarcb->res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE);
6078
6079	ioarcb->cmd_pkt.cdb[0] = IPR_QUERY_IOA_CONFIG;
6080	ioarcb->cmd_pkt.cdb[7] = (sizeof(struct ipr_config_table) >> 8) & 0xff;
6081	ioarcb->cmd_pkt.cdb[8] = sizeof(struct ipr_config_table) & 0xff;
6082
6083	ioarcb->read_ioadl_len = cpu_to_be32(sizeof(struct ipr_ioadl_desc));
6084	ioarcb->read_data_transfer_length =
6085		cpu_to_be32(sizeof(struct ipr_config_table));
6086
6087	ioadl->address = cpu_to_be32(ioa_cfg->cfg_table_dma);
6088	ioadl->flags_and_data_len =
6089		cpu_to_be32(IPR_IOADL_FLAGS_READ_LAST | sizeof(struct ipr_config_table));
6090
6091	ipr_cmd->job_step = ipr_init_res_table;
6092
6093	ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
6094
6095	LEAVE;
6096	return IPR_RC_JOB_RETURN;
6097}
6098
6099/**
6100 * ipr_ioafp_inquiry - Send an Inquiry to the adapter.
6101 * @ipr_cmd:	ipr command struct
6102 *
6103 * This utility function sends an inquiry to the adapter.
6104 *
6105 * Return value:
6106 * 	none
6107 **/
6108static void ipr_ioafp_inquiry(struct ipr_cmnd *ipr_cmd, u8 flags, u8 page,
6109			      u32 dma_addr, u8 xfer_len)
6110{
6111	struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
6112	struct ipr_ioadl_desc *ioadl = ipr_cmd->ioadl;
6113
6114	ENTER;
6115	ioarcb->cmd_pkt.request_type = IPR_RQTYPE_SCSICDB;
6116	ioarcb->res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE);
6117
6118	ioarcb->cmd_pkt.cdb[0] = INQUIRY;
6119	ioarcb->cmd_pkt.cdb[1] = flags;
6120	ioarcb->cmd_pkt.cdb[2] = page;
6121	ioarcb->cmd_pkt.cdb[4] = xfer_len;
6122
6123	ioarcb->read_ioadl_len = cpu_to_be32(sizeof(struct ipr_ioadl_desc));
6124	ioarcb->read_data_transfer_length = cpu_to_be32(xfer_len);
6125
6126	ioadl->address = cpu_to_be32(dma_addr);
6127	ioadl->flags_and_data_len =
6128		cpu_to_be32(IPR_IOADL_FLAGS_READ_LAST | xfer_len);
6129
6130	ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
6131	LEAVE;
6132}
6133
6134/**
6135 * ipr_inquiry_page_supported - Is the given inquiry page supported
6136 * @page0:		inquiry page 0 buffer
6137 * @page:		page code.
6138 *
6139 * This function determines if the specified inquiry page is supported.
6140 *
6141 * Return value:
6142 *	1 if page is supported / 0 if not
6143 **/
6144static int ipr_inquiry_page_supported(struct ipr_inquiry_page0 *page0, u8 page)
6145{
6146	int i;
6147
6148	for (i = 0; i < min_t(u8, page0->len, IPR_INQUIRY_PAGE0_ENTRIES); i++)
6149		if (page0->page[i] == page)
6150			return 1;
6151
6152	return 0;
6153}
6154
6155/**
6156 * ipr_ioafp_cap_inquiry - Send a Page 0xD0 Inquiry to the adapter.
6157 * @ipr_cmd:	ipr command struct
6158 *
6159 * This function sends a Page 0xD0 inquiry to the adapter
6160 * to retrieve adapter capabilities.
6161 *
6162 * Return value:
6163 * 	IPR_RC_JOB_CONTINUE / IPR_RC_JOB_RETURN
6164 **/
6165static int ipr_ioafp_cap_inquiry(struct ipr_cmnd *ipr_cmd)
6166{
6167	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6168	struct ipr_inquiry_page0 *page0 = &ioa_cfg->vpd_cbs->page0_data;
6169	struct ipr_inquiry_cap *cap = &ioa_cfg->vpd_cbs->cap;
6170
6171	ENTER;
6172	ipr_cmd->job_step = ipr_ioafp_query_ioa_cfg;
6173	memset(cap, 0, sizeof(*cap));
6174
6175	if (ipr_inquiry_page_supported(page0, 0xD0)) {
6176		ipr_ioafp_inquiry(ipr_cmd, 1, 0xD0,
6177				  ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, cap),
6178				  sizeof(struct ipr_inquiry_cap));
6179		return IPR_RC_JOB_RETURN;
6180	}
6181
6182	LEAVE;
6183	return IPR_RC_JOB_CONTINUE;
6184}
6185
6186/**
6187 * ipr_ioafp_page3_inquiry - Send a Page 3 Inquiry to the adapter.
6188 * @ipr_cmd:	ipr command struct
6189 *
6190 * This function sends a Page 3 inquiry to the adapter
6191 * to retrieve software VPD information.
6192 *
6193 * Return value:
6194 * 	IPR_RC_JOB_CONTINUE / IPR_RC_JOB_RETURN
6195 **/
6196static int ipr_ioafp_page3_inquiry(struct ipr_cmnd *ipr_cmd)
6197{
6198	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6199	struct ipr_inquiry_page0 *page0 = &ioa_cfg->vpd_cbs->page0_data;
6200
6201	ENTER;
6202
6203	if (!ipr_inquiry_page_supported(page0, 1))
6204		ioa_cfg->cache_state = CACHE_NONE;
6205
6206	ipr_cmd->job_step = ipr_ioafp_cap_inquiry;
6207
6208	ipr_ioafp_inquiry(ipr_cmd, 1, 3,
6209			  ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, page3_data),
6210			  sizeof(struct ipr_inquiry_page3));
6211
6212	LEAVE;
6213	return IPR_RC_JOB_RETURN;
6214}
6215
6216/**
6217 * ipr_ioafp_page0_inquiry - Send a Page 0 Inquiry to the adapter.
6218 * @ipr_cmd:	ipr command struct
6219 *
6220 * This function sends a Page 0 inquiry to the adapter
6221 * to retrieve supported inquiry pages.
6222 *
6223 * Return value:
6224 * 	IPR_RC_JOB_CONTINUE / IPR_RC_JOB_RETURN
6225 **/
6226static int ipr_ioafp_page0_inquiry(struct ipr_cmnd *ipr_cmd)
6227{
6228	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6229	char type[5];
6230
6231	ENTER;
6232
6233	/* Grab the type out of the VPD and store it away */
6234	memcpy(type, ioa_cfg->vpd_cbs->ioa_vpd.std_inq_data.vpids.product_id, 4);
6235	type[4] = '\0';
6236	ioa_cfg->type = simple_strtoul((char *)type, NULL, 16);
6237
6238	ipr_cmd->job_step = ipr_ioafp_page3_inquiry;
6239
6240	ipr_ioafp_inquiry(ipr_cmd, 1, 0,
6241			  ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, page0_data),
6242			  sizeof(struct ipr_inquiry_page0));
6243
6244	LEAVE;
6245	return IPR_RC_JOB_RETURN;
6246}
6247
6248/**
6249 * ipr_ioafp_std_inquiry - Send a Standard Inquiry to the adapter.
6250 * @ipr_cmd:	ipr command struct
6251 *
6252 * This function sends a standard inquiry to the adapter.
6253 *
6254 * Return value:
6255 * 	IPR_RC_JOB_RETURN
6256 **/
6257static int ipr_ioafp_std_inquiry(struct ipr_cmnd *ipr_cmd)
6258{
6259	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6260
6261	ENTER;
6262	ipr_cmd->job_step = ipr_ioafp_page0_inquiry;
6263
6264	ipr_ioafp_inquiry(ipr_cmd, 0, 0,
6265			  ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, ioa_vpd),
6266			  sizeof(struct ipr_ioa_vpd));
6267
6268	LEAVE;
6269	return IPR_RC_JOB_RETURN;
6270}
6271
6272/**
6273 * ipr_ioafp_indentify_hrrq - Send Identify Host RRQ.
6274 * @ipr_cmd:	ipr command struct
6275 *
6276 * This function send an Identify Host Request Response Queue
6277 * command to establish the HRRQ with the adapter.
6278 *
6279 * Return value:
6280 * 	IPR_RC_JOB_RETURN
6281 **/
6282static int ipr_ioafp_indentify_hrrq(struct ipr_cmnd *ipr_cmd)
6283{
6284	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6285	struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
6286
6287	ENTER;
6288	dev_info(&ioa_cfg->pdev->dev, "Starting IOA initialization sequence.\n");
6289
6290	ioarcb->cmd_pkt.cdb[0] = IPR_ID_HOST_RR_Q;
6291	ioarcb->res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE);
6292
6293	ioarcb->cmd_pkt.request_type = IPR_RQTYPE_IOACMD;
6294	ioarcb->cmd_pkt.cdb[2] =
6295		((u32) ioa_cfg->host_rrq_dma >> 24) & 0xff;
6296	ioarcb->cmd_pkt.cdb[3] =
6297		((u32) ioa_cfg->host_rrq_dma >> 16) & 0xff;
6298	ioarcb->cmd_pkt.cdb[4] =
6299		((u32) ioa_cfg->host_rrq_dma >> 8) & 0xff;
6300	ioarcb->cmd_pkt.cdb[5] =
6301		((u32) ioa_cfg->host_rrq_dma) & 0xff;
6302	ioarcb->cmd_pkt.cdb[7] =
6303		((sizeof(u32) * IPR_NUM_CMD_BLKS) >> 8) & 0xff;
6304	ioarcb->cmd_pkt.cdb[8] =
6305		(sizeof(u32) * IPR_NUM_CMD_BLKS) & 0xff;
6306
6307	ipr_cmd->job_step = ipr_ioafp_std_inquiry;
6308
6309	ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
6310
6311	LEAVE;
6312	return IPR_RC_JOB_RETURN;
6313}
6314
6315/**
6316 * ipr_reset_timer_done - Adapter reset timer function
6317 * @ipr_cmd:	ipr command struct
6318 *
6319 * Description: This function is used in adapter reset processing
6320 * for timing events. If the reset_cmd pointer in the IOA
6321 * config struct is not this adapter's we are doing nested
6322 * resets and fail_all_ops will take care of freeing the
6323 * command block.
6324 *
6325 * Return value:
6326 * 	none
6327 **/
6328static void ipr_reset_timer_done(struct ipr_cmnd *ipr_cmd)
6329{
6330	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6331	unsigned long lock_flags = 0;
6332
6333	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
6334
6335	if (ioa_cfg->reset_cmd == ipr_cmd) {
6336		list_del(&ipr_cmd->queue);
6337		ipr_cmd->done(ipr_cmd);
6338	}
6339
6340	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
6341}
6342
6343/**
6344 * ipr_reset_start_timer - Start a timer for adapter reset job
6345 * @ipr_cmd:	ipr command struct
6346 * @timeout:	timeout value
6347 *
6348 * Description: This function is used in adapter reset processing
6349 * for timing events. If the reset_cmd pointer in the IOA
6350 * config struct is not this adapter's we are doing nested
6351 * resets and fail_all_ops will take care of freeing the
6352 * command block.
6353 *
6354 * Return value:
6355 * 	none
6356 **/
6357static void ipr_reset_start_timer(struct ipr_cmnd *ipr_cmd,
6358				  unsigned long timeout)
6359{
6360	list_add_tail(&ipr_cmd->queue, &ipr_cmd->ioa_cfg->pending_q);
6361	ipr_cmd->done = ipr_reset_ioa_job;
6362
6363	ipr_cmd->timer.data = (unsigned long) ipr_cmd;
6364	ipr_cmd->timer.expires = jiffies + timeout;
6365	ipr_cmd->timer.function = (void (*)(unsigned long))ipr_reset_timer_done;
6366	add_timer(&ipr_cmd->timer);
6367}
6368
6369/**
6370 * ipr_init_ioa_mem - Initialize ioa_cfg control block
6371 * @ioa_cfg:	ioa cfg struct
6372 *
6373 * Return value:
6374 * 	nothing
6375 **/
6376static void ipr_init_ioa_mem(struct ipr_ioa_cfg *ioa_cfg)
6377{
6378	memset(ioa_cfg->host_rrq, 0, sizeof(u32) * IPR_NUM_CMD_BLKS);
6379
6380	/* Initialize Host RRQ pointers */
6381	ioa_cfg->hrrq_start = ioa_cfg->host_rrq;
6382	ioa_cfg->hrrq_end = &ioa_cfg->host_rrq[IPR_NUM_CMD_BLKS - 1];
6383	ioa_cfg->hrrq_curr = ioa_cfg->hrrq_start;
6384	ioa_cfg->toggle_bit = 1;
6385
6386	/* Zero out config table */
6387	memset(ioa_cfg->cfg_table, 0, sizeof(struct ipr_config_table));
6388}
6389
6390/**
6391 * ipr_reset_enable_ioa - Enable the IOA following a reset.
6392 * @ipr_cmd:	ipr command struct
6393 *
6394 * This function reinitializes some control blocks and
6395 * enables destructive diagnostics on the adapter.
6396 *
6397 * Return value:
6398 * 	IPR_RC_JOB_RETURN
6399 **/
6400static int ipr_reset_enable_ioa(struct ipr_cmnd *ipr_cmd)
6401{
6402	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6403	volatile u32 int_reg;
6404
6405	ENTER;
6406	ipr_cmd->job_step = ipr_ioafp_indentify_hrrq;
6407	ipr_init_ioa_mem(ioa_cfg);
6408
6409	ioa_cfg->allow_interrupts = 1;
6410	int_reg = readl(ioa_cfg->regs.sense_interrupt_reg);
6411
6412	if (int_reg & IPR_PCII_IOA_TRANS_TO_OPER) {
6413		writel((IPR_PCII_ERROR_INTERRUPTS | IPR_PCII_HRRQ_UPDATED),
6414		       ioa_cfg->regs.clr_interrupt_mask_reg);
6415		int_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg);
6416		return IPR_RC_JOB_CONTINUE;
6417	}
6418
6419	/* Enable destructive diagnostics on IOA */
6420	writel(ioa_cfg->doorbell, ioa_cfg->regs.set_uproc_interrupt_reg);
6421
6422	writel(IPR_PCII_OPER_INTERRUPTS, ioa_cfg->regs.clr_interrupt_mask_reg);
6423	int_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg);
6424
6425	dev_info(&ioa_cfg->pdev->dev, "Initializing IOA.\n");
6426
6427	ipr_cmd->timer.data = (unsigned long) ipr_cmd;
6428	ipr_cmd->timer.expires = jiffies + (ioa_cfg->transop_timeout * HZ);
6429	ipr_cmd->timer.function = (void (*)(unsigned long))ipr_oper_timeout;
6430	ipr_cmd->done = ipr_reset_ioa_job;
6431	add_timer(&ipr_cmd->timer);
6432	list_add_tail(&ipr_cmd->queue, &ioa_cfg->pending_q);
6433
6434	LEAVE;
6435	return IPR_RC_JOB_RETURN;
6436}
6437
6438/**
6439 * ipr_reset_wait_for_dump - Wait for a dump to timeout.
6440 * @ipr_cmd:	ipr command struct
6441 *
6442 * This function is invoked when an adapter dump has run out
6443 * of processing time.
6444 *
6445 * Return value:
6446 * 	IPR_RC_JOB_CONTINUE
6447 **/
6448static int ipr_reset_wait_for_dump(struct ipr_cmnd *ipr_cmd)
6449{
6450	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6451
6452	if (ioa_cfg->sdt_state == GET_DUMP)
6453		ioa_cfg->sdt_state = ABORT_DUMP;
6454
6455	ipr_cmd->job_step = ipr_reset_alert;
6456
6457	return IPR_RC_JOB_CONTINUE;
6458}
6459
6460/**
6461 * ipr_unit_check_no_data - Log a unit check/no data error log
6462 * @ioa_cfg:		ioa config struct
6463 *
6464 * Logs an error indicating the adapter unit checked, but for some
6465 * reason, we were unable to fetch the unit check buffer.
6466 *
6467 * Return value:
6468 * 	nothing
6469 **/
6470static void ipr_unit_check_no_data(struct ipr_ioa_cfg *ioa_cfg)
6471{
6472	ioa_cfg->errors_logged++;
6473	dev_err(&ioa_cfg->pdev->dev, "IOA unit check with no data\n");
6474}
6475
6476/**
6477 * ipr_get_unit_check_buffer - Get the unit check buffer from the IOA
6478 * @ioa_cfg:		ioa config struct
6479 *
6480 * Fetches the unit check buffer from the adapter by clocking the data
6481 * through the mailbox register.
6482 *
6483 * Return value:
6484 * 	nothing
6485 **/
6486static void ipr_get_unit_check_buffer(struct ipr_ioa_cfg *ioa_cfg)
6487{
6488	unsigned long mailbox;
6489	struct ipr_hostrcb *hostrcb;
6490	struct ipr_uc_sdt sdt;
6491	int rc, length;
6492	u32 ioasc;
6493
6494	mailbox = readl(ioa_cfg->ioa_mailbox);
6495
6496	if (!ipr_sdt_is_fmt2(mailbox)) {
6497		ipr_unit_check_no_data(ioa_cfg);
6498		return;
6499	}
6500
6501	memset(&sdt, 0, sizeof(struct ipr_uc_sdt));
6502	rc = ipr_get_ldump_data_section(ioa_cfg, mailbox, (__be32 *) &sdt,
6503					(sizeof(struct ipr_uc_sdt)) / sizeof(__be32));
6504
6505	if (rc || (be32_to_cpu(sdt.hdr.state) != IPR_FMT2_SDT_READY_TO_USE) ||
6506	    !(sdt.entry[0].flags & IPR_SDT_VALID_ENTRY)) {
6507		ipr_unit_check_no_data(ioa_cfg);
6508		return;
6509	}
6510
6511	/* Find length of the first sdt entry (UC buffer) */
6512	length = (be32_to_cpu(sdt.entry[0].end_offset) -
6513		  be32_to_cpu(sdt.entry[0].bar_str_offset)) & IPR_FMT2_MBX_ADDR_MASK;
6514
6515	hostrcb = list_entry(ioa_cfg->hostrcb_free_q.next,
6516			     struct ipr_hostrcb, queue);
6517	list_del(&hostrcb->queue);
6518	memset(&hostrcb->hcam, 0, sizeof(hostrcb->hcam));
6519
6520	rc = ipr_get_ldump_data_section(ioa_cfg,
6521					be32_to_cpu(sdt.entry[0].bar_str_offset),
6522					(__be32 *)&hostrcb->hcam,
6523					min(length, (int)sizeof(hostrcb->hcam)) / sizeof(__be32));
6524
6525	if (!rc) {
6526		ipr_handle_log_data(ioa_cfg, hostrcb);
6527		ioasc = be32_to_cpu(hostrcb->hcam.u.error.failing_dev_ioasc);
6528		if (ioasc == IPR_IOASC_NR_IOA_RESET_REQUIRED &&
6529		    ioa_cfg->sdt_state == GET_DUMP)
6530			ioa_cfg->sdt_state = WAIT_FOR_DUMP;
6531	} else
6532		ipr_unit_check_no_data(ioa_cfg);
6533
6534	list_add_tail(&hostrcb->queue, &ioa_cfg->hostrcb_free_q);
6535}
6536
6537/**
6538 * ipr_reset_restore_cfg_space - Restore PCI config space.
6539 * @ipr_cmd:	ipr command struct
6540 *
6541 * Description: This function restores the saved PCI config space of
6542 * the adapter, fails all outstanding ops back to the callers, and
6543 * fetches the dump/unit check if applicable to this reset.
6544 *
6545 * Return value:
6546 * 	IPR_RC_JOB_CONTINUE / IPR_RC_JOB_RETURN
6547 **/
6548static int ipr_reset_restore_cfg_space(struct ipr_cmnd *ipr_cmd)
6549{
6550	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6551	int rc;
6552
6553	ENTER;
6554	rc = pci_restore_state(ioa_cfg->pdev);
6555
6556	if (rc != PCIBIOS_SUCCESSFUL) {
6557		ipr_cmd->ioasa.ioasc = cpu_to_be32(IPR_IOASC_PCI_ACCESS_ERROR);
6558		return IPR_RC_JOB_CONTINUE;
6559	}
6560
6561	if (ipr_set_pcix_cmd_reg(ioa_cfg)) {
6562		ipr_cmd->ioasa.ioasc = cpu_to_be32(IPR_IOASC_PCI_ACCESS_ERROR);
6563		return IPR_RC_JOB_CONTINUE;
6564	}
6565
6566	ipr_fail_all_ops(ioa_cfg);
6567
6568	if (ioa_cfg->ioa_unit_checked) {
6569		ioa_cfg->ioa_unit_checked = 0;
6570		ipr_get_unit_check_buffer(ioa_cfg);
6571		ipr_cmd->job_step = ipr_reset_alert;
6572		ipr_reset_start_timer(ipr_cmd, 0);
6573		return IPR_RC_JOB_RETURN;
6574	}
6575
6576	if (ioa_cfg->in_ioa_bringdown) {
6577		ipr_cmd->job_step = ipr_ioa_bringdown_done;
6578	} else {
6579		ipr_cmd->job_step = ipr_reset_enable_ioa;
6580
6581		if (GET_DUMP == ioa_cfg->sdt_state) {
6582			ipr_reset_start_timer(ipr_cmd, IPR_DUMP_TIMEOUT);
6583			ipr_cmd->job_step = ipr_reset_wait_for_dump;
6584			schedule_work(&ioa_cfg->work_q);
6585			return IPR_RC_JOB_RETURN;
6586		}
6587	}
6588
6589	ENTER;
6590	return IPR_RC_JOB_CONTINUE;
6591}
6592
6593/**
6594 * ipr_reset_bist_done - BIST has completed on the adapter.
6595 * @ipr_cmd:	ipr command struct
6596 *
6597 * Description: Unblock config space and resume the reset process.
6598 *
6599 * Return value:
6600 * 	IPR_RC_JOB_CONTINUE
6601 **/
6602static int ipr_reset_bist_done(struct ipr_cmnd *ipr_cmd)
6603{
6604	ENTER;
6605	pci_unblock_user_cfg_access(ipr_cmd->ioa_cfg->pdev);
6606	ipr_cmd->job_step = ipr_reset_restore_cfg_space;
6607	LEAVE;
6608	return IPR_RC_JOB_CONTINUE;
6609}
6610
6611/**
6612 * ipr_reset_start_bist - Run BIST on the adapter.
6613 * @ipr_cmd:	ipr command struct
6614 *
6615 * Description: This function runs BIST on the adapter, then delays 2 seconds.
6616 *
6617 * Return value:
6618 * 	IPR_RC_JOB_CONTINUE / IPR_RC_JOB_RETURN
6619 **/
6620static int ipr_reset_start_bist(struct ipr_cmnd *ipr_cmd)
6621{
6622	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6623	int rc;
6624
6625	ENTER;
6626	pci_block_user_cfg_access(ioa_cfg->pdev);
6627	rc = pci_write_config_byte(ioa_cfg->pdev, PCI_BIST, PCI_BIST_START);
6628
6629	if (rc != PCIBIOS_SUCCESSFUL) {
6630		pci_unblock_user_cfg_access(ipr_cmd->ioa_cfg->pdev);
6631		ipr_cmd->ioasa.ioasc = cpu_to_be32(IPR_IOASC_PCI_ACCESS_ERROR);
6632		rc = IPR_RC_JOB_CONTINUE;
6633	} else {
6634		ipr_cmd->job_step = ipr_reset_bist_done;
6635		ipr_reset_start_timer(ipr_cmd, IPR_WAIT_FOR_BIST_TIMEOUT);
6636		rc = IPR_RC_JOB_RETURN;
6637	}
6638
6639	LEAVE;
6640	return rc;
6641}
6642
6643/**
6644 * ipr_reset_allowed - Query whether or not IOA can be reset
6645 * @ioa_cfg:	ioa config struct
6646 *
6647 * Return value:
6648 * 	0 if reset not allowed / non-zero if reset is allowed
6649 **/
6650static int ipr_reset_allowed(struct ipr_ioa_cfg *ioa_cfg)
6651{
6652	volatile u32 temp_reg;
6653
6654	temp_reg = readl(ioa_cfg->regs.sense_interrupt_reg);
6655	return ((temp_reg & IPR_PCII_CRITICAL_OPERATION) == 0);
6656}
6657
6658/**
6659 * ipr_reset_wait_to_start_bist - Wait for permission to reset IOA.
6660 * @ipr_cmd:	ipr command struct
6661 *
6662 * Description: This function waits for adapter permission to run BIST,
6663 * then runs BIST. If the adapter does not give permission after a
6664 * reasonable time, we will reset the adapter anyway. The impact of
6665 * resetting the adapter without warning the adapter is the risk of
6666 * losing the persistent error log on the adapter. If the adapter is
6667 * reset while it is writing to the flash on the adapter, the flash
6668 * segment will have bad ECC and be zeroed.
6669 *
6670 * Return value:
6671 * 	IPR_RC_JOB_CONTINUE / IPR_RC_JOB_RETURN
6672 **/
6673static int ipr_reset_wait_to_start_bist(struct ipr_cmnd *ipr_cmd)
6674{
6675	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6676	int rc = IPR_RC_JOB_RETURN;
6677
6678	if (!ipr_reset_allowed(ioa_cfg) && ipr_cmd->u.time_left) {
6679		ipr_cmd->u.time_left -= IPR_CHECK_FOR_RESET_TIMEOUT;
6680		ipr_reset_start_timer(ipr_cmd, IPR_CHECK_FOR_RESET_TIMEOUT);
6681	} else {
6682		ipr_cmd->job_step = ipr_reset_start_bist;
6683		rc = IPR_RC_JOB_CONTINUE;
6684	}
6685
6686	return rc;
6687}
6688
6689/**
6690 * ipr_reset_alert_part2 - Alert the adapter of a pending reset
6691 * @ipr_cmd:	ipr command struct
6692 *
6693 * Description: This function alerts the adapter that it will be reset.
6694 * If memory space is not currently enabled, proceed directly
6695 * to running BIST on the adapter. The timer must always be started
6696 * so we guarantee we do not run BIST from ipr_isr.
6697 *
6698 * Return value:
6699 * 	IPR_RC_JOB_RETURN
6700 **/
6701static int ipr_reset_alert(struct ipr_cmnd *ipr_cmd)
6702{
6703	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6704	u16 cmd_reg;
6705	int rc;
6706
6707	ENTER;
6708	rc = pci_read_config_word(ioa_cfg->pdev, PCI_COMMAND, &cmd_reg);
6709
6710	if ((rc == PCIBIOS_SUCCESSFUL) && (cmd_reg & PCI_COMMAND_MEMORY)) {
6711		ipr_mask_and_clear_interrupts(ioa_cfg, ~0);
6712		writel(IPR_UPROCI_RESET_ALERT, ioa_cfg->regs.set_uproc_interrupt_reg);
6713		ipr_cmd->job_step = ipr_reset_wait_to_start_bist;
6714	} else {
6715		ipr_cmd->job_step = ipr_reset_start_bist;
6716	}
6717
6718	ipr_cmd->u.time_left = IPR_WAIT_FOR_RESET_TIMEOUT;
6719	ipr_reset_start_timer(ipr_cmd, IPR_CHECK_FOR_RESET_TIMEOUT);
6720
6721	LEAVE;
6722	return IPR_RC_JOB_RETURN;
6723}
6724
6725/**
6726 * ipr_reset_ucode_download_done - Microcode download completion
6727 * @ipr_cmd:	ipr command struct
6728 *
6729 * Description: This function unmaps the microcode download buffer.
6730 *
6731 * Return value:
6732 * 	IPR_RC_JOB_CONTINUE
6733 **/
6734static int ipr_reset_ucode_download_done(struct ipr_cmnd *ipr_cmd)
6735{
6736	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6737	struct ipr_sglist *sglist = ioa_cfg->ucode_sglist;
6738
6739	pci_unmap_sg(ioa_cfg->pdev, sglist->scatterlist,
6740		     sglist->num_sg, DMA_TO_DEVICE);
6741
6742	ipr_cmd->job_step = ipr_reset_alert;
6743	return IPR_RC_JOB_CONTINUE;
6744}
6745
6746/**
6747 * ipr_reset_ucode_download - Download microcode to the adapter
6748 * @ipr_cmd:	ipr command struct
6749 *
6750 * Description: This function checks to see if it there is microcode
6751 * to download to the adapter. If there is, a download is performed.
6752 *
6753 * Return value:
6754 * 	IPR_RC_JOB_CONTINUE / IPR_RC_JOB_RETURN
6755 **/
6756static int ipr_reset_ucode_download(struct ipr_cmnd *ipr_cmd)
6757{
6758	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6759	struct ipr_sglist *sglist = ioa_cfg->ucode_sglist;
6760
6761	ENTER;
6762	ipr_cmd->job_step = ipr_reset_alert;
6763
6764	if (!sglist)
6765		return IPR_RC_JOB_CONTINUE;
6766
6767	ipr_cmd->ioarcb.res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE);
6768	ipr_cmd->ioarcb.cmd_pkt.request_type = IPR_RQTYPE_SCSICDB;
6769	ipr_cmd->ioarcb.cmd_pkt.cdb[0] = WRITE_BUFFER;
6770	ipr_cmd->ioarcb.cmd_pkt.cdb[1] = IPR_WR_BUF_DOWNLOAD_AND_SAVE;
6771	ipr_cmd->ioarcb.cmd_pkt.cdb[6] = (sglist->buffer_len & 0xff0000) >> 16;
6772	ipr_cmd->ioarcb.cmd_pkt.cdb[7] = (sglist->buffer_len & 0x00ff00) >> 8;
6773	ipr_cmd->ioarcb.cmd_pkt.cdb[8] = sglist->buffer_len & 0x0000ff;
6774
6775	ipr_build_ucode_ioadl(ipr_cmd, sglist);
6776	ipr_cmd->job_step = ipr_reset_ucode_download_done;
6777
6778	ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout,
6779		   IPR_WRITE_BUFFER_TIMEOUT);
6780
6781	LEAVE;
6782	return IPR_RC_JOB_RETURN;
6783}
6784
6785/**
6786 * ipr_reset_shutdown_ioa - Shutdown the adapter
6787 * @ipr_cmd:	ipr command struct
6788 *
6789 * Description: This function issues an adapter shutdown of the
6790 * specified type to the specified adapter as part of the
6791 * adapter reset job.
6792 *
6793 * Return value:
6794 * 	IPR_RC_JOB_CONTINUE / IPR_RC_JOB_RETURN
6795 **/
6796static int ipr_reset_shutdown_ioa(struct ipr_cmnd *ipr_cmd)
6797{
6798	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6799	enum ipr_shutdown_type shutdown_type = ipr_cmd->u.shutdown_type;
6800	unsigned long timeout;
6801	int rc = IPR_RC_JOB_CONTINUE;
6802
6803	ENTER;
6804	if (shutdown_type != IPR_SHUTDOWN_NONE && !ioa_cfg->ioa_is_dead) {
6805		ipr_cmd->ioarcb.res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE);
6806		ipr_cmd->ioarcb.cmd_pkt.request_type = IPR_RQTYPE_IOACMD;
6807		ipr_cmd->ioarcb.cmd_pkt.cdb[0] = IPR_IOA_SHUTDOWN;
6808		ipr_cmd->ioarcb.cmd_pkt.cdb[1] = shutdown_type;
6809
6810		if (shutdown_type == IPR_SHUTDOWN_NORMAL)
6811			timeout = IPR_SHUTDOWN_TIMEOUT;
6812		else if (shutdown_type == IPR_SHUTDOWN_PREPARE_FOR_NORMAL)
6813			timeout = IPR_INTERNAL_TIMEOUT;
6814		else if (ioa_cfg->dual_raid && ipr_dual_ioa_raid)
6815			timeout = IPR_DUAL_IOA_ABBR_SHUTDOWN_TO;
6816		else
6817			timeout = IPR_ABBREV_SHUTDOWN_TIMEOUT;
6818
6819		ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, timeout);
6820
6821		rc = IPR_RC_JOB_RETURN;
6822		ipr_cmd->job_step = ipr_reset_ucode_download;
6823	} else
6824		ipr_cmd->job_step = ipr_reset_alert;
6825
6826	LEAVE;
6827	return rc;
6828}
6829
6830/**
6831 * ipr_reset_ioa_job - Adapter reset job
6832 * @ipr_cmd:	ipr command struct
6833 *
6834 * Description: This function is the job router for the adapter reset job.
6835 *
6836 * Return value:
6837 * 	none
6838 **/
6839static void ipr_reset_ioa_job(struct ipr_cmnd *ipr_cmd)
6840{
6841	u32 rc, ioasc;
6842	struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6843
6844	do {
6845		ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc);
6846
6847		if (ioa_cfg->reset_cmd != ipr_cmd) {
6848			/*
6849			 * We are doing nested adapter resets and this is
6850			 * not the current reset job.
6851			 */
6852			list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q);
6853			return;
6854		}
6855
6856		if (IPR_IOASC_SENSE_KEY(ioasc)) {
6857			rc = ipr_cmd->job_step_failed(ipr_cmd);
6858			if (rc == IPR_RC_JOB_RETURN)
6859				return;
6860		}
6861
6862		ipr_reinit_ipr_cmnd(ipr_cmd);
6863		ipr_cmd->job_step_failed = ipr_reset_cmd_failed;
6864		rc = ipr_cmd->job_step(ipr_cmd);
6865	} while(rc == IPR_RC_JOB_CONTINUE);
6866}
6867
6868/**
6869 * _ipr_initiate_ioa_reset - Initiate an adapter reset
6870 * @ioa_cfg:		ioa config struct
6871 * @job_step:		first job step of reset job
6872 * @shutdown_type:	shutdown type
6873 *
6874 * Description: This function will initiate the reset of the given adapter
6875 * starting at the selected job step.
6876 * If the caller needs to wait on the completion of the reset,
6877 * the caller must sleep on the reset_wait_q.
6878 *
6879 * Return value:
6880 * 	none
6881 **/
6882static void _ipr_initiate_ioa_reset(struct ipr_ioa_cfg *ioa_cfg,
6883				    int (*job_step) (struct ipr_cmnd *),
6884				    enum ipr_shutdown_type shutdown_type)
6885{
6886	struct ipr_cmnd *ipr_cmd;
6887
6888	ioa_cfg->in_reset_reload = 1;
6889	ioa_cfg->allow_cmds = 0;
6890	scsi_block_requests(ioa_cfg->host);
6891
6892	ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg);
6893	ioa_cfg->reset_cmd = ipr_cmd;
6894	ipr_cmd->job_step = job_step;
6895	ipr_cmd->u.shutdown_type = shutdown_type;
6896
6897	ipr_reset_ioa_job(ipr_cmd);
6898}
6899
6900/**
6901 * ipr_initiate_ioa_reset - Initiate an adapter reset
6902 * @ioa_cfg:		ioa config struct
6903 * @shutdown_type:	shutdown type
6904 *
6905 * Description: This function will initiate the reset of the given adapter.
6906 * If the caller needs to wait on the completion of the reset,
6907 * the caller must sleep on the reset_wait_q.
6908 *
6909 * Return value:
6910 * 	none
6911 **/
6912static void ipr_initiate_ioa_reset(struct ipr_ioa_cfg *ioa_cfg,
6913				   enum ipr_shutdown_type shutdown_type)
6914{
6915	if (ioa_cfg->ioa_is_dead)
6916		return;
6917
6918	if (ioa_cfg->in_reset_reload && ioa_cfg->sdt_state == GET_DUMP)
6919		ioa_cfg->sdt_state = ABORT_DUMP;
6920
6921	if (ioa_cfg->reset_retries++ >= IPR_NUM_RESET_RELOAD_RETRIES) {
6922		dev_err(&ioa_cfg->pdev->dev,
6923			"IOA taken offline - error recovery failed\n");
6924
6925		ioa_cfg->reset_retries = 0;
6926		ioa_cfg->ioa_is_dead = 1;
6927
6928		if (ioa_cfg->in_ioa_bringdown) {
6929			ioa_cfg->reset_cmd = NULL;
6930			ioa_cfg->in_reset_reload = 0;
6931			ipr_fail_all_ops(ioa_cfg);
6932			wake_up_all(&ioa_cfg->reset_wait_q);
6933
6934			spin_unlock_irq(ioa_cfg->host->host_lock);
6935			scsi_unblock_requests(ioa_cfg->host);
6936			spin_lock_irq(ioa_cfg->host->host_lock);
6937			return;
6938		} else {
6939			ioa_cfg->in_ioa_bringdown = 1;
6940			shutdown_type = IPR_SHUTDOWN_NONE;
6941		}
6942	}
6943
6944	_ipr_initiate_ioa_reset(ioa_cfg, ipr_reset_shutdown_ioa,
6945				shutdown_type);
6946}
6947
6948/**
6949 * ipr_reset_freeze - Hold off all I/O activity
6950 * @ipr_cmd:	ipr command struct
6951 *
6952 * Description: If the PCI slot is frozen, hold off all I/O
6953 * activity; then, as soon as the slot is available again,
6954 * initiate an adapter reset.
6955 */
6956static int ipr_reset_freeze(struct ipr_cmnd *ipr_cmd)
6957{
6958	/* Disallow new interrupts, avoid loop */
6959	ipr_cmd->ioa_cfg->allow_interrupts = 0;
6960	list_add_tail(&ipr_cmd->queue, &ipr_cmd->ioa_cfg->pending_q);
6961	ipr_cmd->done = ipr_reset_ioa_job;
6962	return IPR_RC_JOB_RETURN;
6963}
6964
6965/**
6966 * ipr_pci_frozen - Called when slot has experienced a PCI bus error.
6967 * @pdev:	PCI device struct
6968 *
6969 * Description: This routine is called to tell us that the PCI bus
6970 * is down. Can't do anything here, except put the device driver
6971 * into a holding pattern, waiting for the PCI bus to come back.
6972 */
6973static void ipr_pci_frozen(struct pci_dev *pdev)
6974{
6975	unsigned long flags = 0;
6976	struct ipr_ioa_cfg *ioa_cfg = pci_get_drvdata(pdev);
6977
6978	spin_lock_irqsave(ioa_cfg->host->host_lock, flags);
6979	_ipr_initiate_ioa_reset(ioa_cfg, ipr_reset_freeze, IPR_SHUTDOWN_NONE);
6980	spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags);
6981}
6982
6983/**
6984 * ipr_pci_slot_reset - Called when PCI slot has been reset.
6985 * @pdev:	PCI device struct
6986 *
6987 * Description: This routine is called by the pci error recovery
6988 * code after the PCI slot has been reset, just before we
6989 * should resume normal operations.
6990 */
6991static pci_ers_result_t ipr_pci_slot_reset(struct pci_dev *pdev)
6992{
6993	unsigned long flags = 0;
6994	struct ipr_ioa_cfg *ioa_cfg = pci_get_drvdata(pdev);
6995
6996	spin_lock_irqsave(ioa_cfg->host->host_lock, flags);
6997	_ipr_initiate_ioa_reset(ioa_cfg, ipr_reset_restore_cfg_space,
6998	                                 IPR_SHUTDOWN_NONE);
6999	spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags);
7000	return PCI_ERS_RESULT_RECOVERED;
7001}
7002
7003/**
7004 * ipr_pci_perm_failure - Called when PCI slot is dead for good.
7005 * @pdev:	PCI device struct
7006 *
7007 * Description: This routine is called when the PCI bus has
7008 * permanently failed.
7009 */
7010static void ipr_pci_perm_failure(struct pci_dev *pdev)
7011{
7012	unsigned long flags = 0;
7013	struct ipr_ioa_cfg *ioa_cfg = pci_get_drvdata(pdev);
7014
7015	spin_lock_irqsave(ioa_cfg->host->host_lock, flags);
7016	if (ioa_cfg->sdt_state == WAIT_FOR_DUMP)
7017		ioa_cfg->sdt_state = ABORT_DUMP;
7018	ioa_cfg->reset_retries = IPR_NUM_RESET_RELOAD_RETRIES;
7019	ioa_cfg->in_ioa_bringdown = 1;
7020	ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE);
7021	spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags);
7022}
7023
7024/**
7025 * ipr_pci_error_detected - Called when a PCI error is detected.
7026 * @pdev:	PCI device struct
7027 * @state:	PCI channel state
7028 *
7029 * Description: Called when a PCI error is detected.
7030 *
7031 * Return value:
7032 * 	PCI_ERS_RESULT_NEED_RESET or PCI_ERS_RESULT_DISCONNECT
7033 */
7034static pci_ers_result_t ipr_pci_error_detected(struct pci_dev *pdev,
7035					       pci_channel_state_t state)
7036{
7037	switch (state) {
7038	case pci_channel_io_frozen:
7039		ipr_pci_frozen(pdev);
7040		return PCI_ERS_RESULT_NEED_RESET;
7041	case pci_channel_io_perm_failure:
7042		ipr_pci_perm_failure(pdev);
7043		return PCI_ERS_RESULT_DISCONNECT;
7044		break;
7045	default:
7046		break;
7047	}
7048	return PCI_ERS_RESULT_NEED_RESET;
7049}
7050
7051/**
7052 * ipr_probe_ioa_part2 - Initializes IOAs found in ipr_probe_ioa(..)
7053 * @ioa_cfg:	ioa cfg struct
7054 *
7055 * Description: This is the second phase of adapter intialization
7056 * This function takes care of initilizing the adapter to the point
7057 * where it can accept new commands.
7058
7059 * Return value:
7060 * 	0 on sucess / -EIO on failure
7061 **/
7062static int __devinit ipr_probe_ioa_part2(struct ipr_ioa_cfg *ioa_cfg)
7063{
7064	int rc = 0;
7065	unsigned long host_lock_flags = 0;
7066
7067	ENTER;
7068	spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags);
7069	dev_dbg(&ioa_cfg->pdev->dev, "ioa_cfg adx: 0x%p\n", ioa_cfg);
7070	if (ioa_cfg->needs_hard_reset) {
7071		ioa_cfg->needs_hard_reset = 0;
7072		ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE);
7073	} else
7074		_ipr_initiate_ioa_reset(ioa_cfg, ipr_reset_enable_ioa,
7075					IPR_SHUTDOWN_NONE);
7076
7077	spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags);
7078	wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
7079	spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags);
7080
7081	if (ioa_cfg->ioa_is_dead) {
7082		rc = -EIO;
7083	} else if (ipr_invalid_adapter(ioa_cfg)) {
7084		if (!ipr_testmode)
7085			rc = -EIO;
7086
7087		dev_err(&ioa_cfg->pdev->dev,
7088			"Adapter not supported in this hardware configuration.\n");
7089	}
7090
7091	spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags);
7092
7093	LEAVE;
7094	return rc;
7095}
7096
7097/**
7098 * ipr_free_cmd_blks - Frees command blocks allocated for an adapter
7099 * @ioa_cfg:	ioa config struct
7100 *
7101 * Return value:
7102 * 	none
7103 **/
7104static void ipr_free_cmd_blks(struct ipr_ioa_cfg *ioa_cfg)
7105{
7106	int i;
7107
7108	for (i = 0; i < IPR_NUM_CMD_BLKS; i++) {
7109		if (ioa_cfg->ipr_cmnd_list[i])
7110			pci_pool_free(ioa_cfg->ipr_cmd_pool,
7111				      ioa_cfg->ipr_cmnd_list[i],
7112				      ioa_cfg->ipr_cmnd_list_dma[i]);
7113
7114		ioa_cfg->ipr_cmnd_list[i] = NULL;
7115	}
7116
7117	if (ioa_cfg->ipr_cmd_pool)
7118		pci_pool_destroy (ioa_cfg->ipr_cmd_pool);
7119
7120	ioa_cfg->ipr_cmd_pool = NULL;
7121}
7122
7123/**
7124 * ipr_free_mem - Frees memory allocated for an adapter
7125 * @ioa_cfg:	ioa cfg struct
7126 *
7127 * Return value:
7128 * 	nothing
7129 **/
7130static void ipr_free_mem(struct ipr_ioa_cfg *ioa_cfg)
7131{
7132	int i;
7133
7134	kfree(ioa_cfg->res_entries);
7135	pci_free_consistent(ioa_cfg->pdev, sizeof(struct ipr_misc_cbs),
7136			    ioa_cfg->vpd_cbs, ioa_cfg->vpd_cbs_dma);
7137	ipr_free_cmd_blks(ioa_cfg);
7138	pci_free_consistent(ioa_cfg->pdev, sizeof(u32) * IPR_NUM_CMD_BLKS,
7139			    ioa_cfg->host_rrq, ioa_cfg->host_rrq_dma);
7140	pci_free_consistent(ioa_cfg->pdev, sizeof(struct ipr_config_table),
7141			    ioa_cfg->cfg_table,
7142			    ioa_cfg->cfg_table_dma);
7143
7144	for (i = 0; i < IPR_NUM_HCAMS; i++) {
7145		pci_free_consistent(ioa_cfg->pdev,
7146				    sizeof(struct ipr_hostrcb),
7147				    ioa_cfg->hostrcb[i],
7148				    ioa_cfg->hostrcb_dma[i]);
7149	}
7150
7151	ipr_free_dump(ioa_cfg);
7152	kfree(ioa_cfg->trace);
7153}
7154
7155/**
7156 * ipr_free_all_resources - Free all allocated resources for an adapter.
7157 * @ipr_cmd:	ipr command struct
7158 *
7159 * This function frees all allocated resources for the
7160 * specified adapter.
7161 *
7162 * Return value:
7163 * 	none
7164 **/
7165static void ipr_free_all_resources(struct ipr_ioa_cfg *ioa_cfg)
7166{
7167	struct pci_dev *pdev = ioa_cfg->pdev;
7168
7169	ENTER;
7170	free_irq(pdev->irq, ioa_cfg);
7171	iounmap(ioa_cfg->hdw_dma_regs);
7172	pci_release_regions(pdev);
7173	ipr_free_mem(ioa_cfg);
7174	scsi_host_put(ioa_cfg->host);
7175	pci_disable_device(pdev);
7176	LEAVE;
7177}
7178
7179/**
7180 * ipr_alloc_cmd_blks - Allocate command blocks for an adapter
7181 * @ioa_cfg:	ioa config struct
7182 *
7183 * Return value:
7184 * 	0 on success / -ENOMEM on allocation failure
7185 **/
7186static int __devinit ipr_alloc_cmd_blks(struct ipr_ioa_cfg *ioa_cfg)
7187{
7188	struct ipr_cmnd *ipr_cmd;
7189	struct ipr_ioarcb *ioarcb;
7190	dma_addr_t dma_addr;
7191	int i;
7192
7193	ioa_cfg->ipr_cmd_pool = pci_pool_create (IPR_NAME, ioa_cfg->pdev,
7194						 sizeof(struct ipr_cmnd), 8, 0);
7195
7196	if (!ioa_cfg->ipr_cmd_pool)
7197		return -ENOMEM;
7198
7199	for (i = 0; i < IPR_NUM_CMD_BLKS; i++) {
7200		ipr_cmd = pci_pool_alloc (ioa_cfg->ipr_cmd_pool, GFP_KERNEL, &dma_addr);
7201
7202		if (!ipr_cmd) {
7203			ipr_free_cmd_blks(ioa_cfg);
7204			return -ENOMEM;
7205		}
7206
7207		memset(ipr_cmd, 0, sizeof(*ipr_cmd));
7208		ioa_cfg->ipr_cmnd_list[i] = ipr_cmd;
7209		ioa_cfg->ipr_cmnd_list_dma[i] = dma_addr;
7210
7211		ioarcb = &ipr_cmd->ioarcb;
7212		ioarcb->ioarcb_host_pci_addr = cpu_to_be32(dma_addr);
7213		ioarcb->host_response_handle = cpu_to_be32(i << 2);
7214		ioarcb->write_ioadl_addr =
7215			cpu_to_be32(dma_addr + offsetof(struct ipr_cmnd, ioadl));
7216		ioarcb->read_ioadl_addr = ioarcb->write_ioadl_addr;
7217		ioarcb->ioasa_host_pci_addr =
7218			cpu_to_be32(dma_addr + offsetof(struct ipr_cmnd, ioasa));
7219		ioarcb->ioasa_len = cpu_to_be16(sizeof(struct ipr_ioasa));
7220		ipr_cmd->cmd_index = i;
7221		ipr_cmd->ioa_cfg = ioa_cfg;
7222		ipr_cmd->sense_buffer_dma = dma_addr +
7223			offsetof(struct ipr_cmnd, sense_buffer);
7224
7225		list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q);
7226	}
7227
7228	return 0;
7229}
7230
7231/**
7232 * ipr_alloc_mem - Allocate memory for an adapter
7233 * @ioa_cfg:	ioa config struct
7234 *
7235 * Return value:
7236 * 	0 on success / non-zero for error
7237 **/
7238static int __devinit ipr_alloc_mem(struct ipr_ioa_cfg *ioa_cfg)
7239{
7240	struct pci_dev *pdev = ioa_cfg->pdev;
7241	int i, rc = -ENOMEM;
7242
7243	ENTER;
7244	ioa_cfg->res_entries = kzalloc(sizeof(struct ipr_resource_entry) *
7245				       IPR_MAX_PHYSICAL_DEVS, GFP_KERNEL);
7246
7247	if (!ioa_cfg->res_entries)
7248		goto out;
7249
7250	for (i = 0; i < IPR_MAX_PHYSICAL_DEVS; i++)
7251		list_add_tail(&ioa_cfg->res_entries[i].queue, &ioa_cfg->free_res_q);
7252
7253	ioa_cfg->vpd_cbs = pci_alloc_consistent(ioa_cfg->pdev,
7254						sizeof(struct ipr_misc_cbs),
7255						&ioa_cfg->vpd_cbs_dma);
7256
7257	if (!ioa_cfg->vpd_cbs)
7258		goto out_free_res_entries;
7259
7260	if (ipr_alloc_cmd_blks(ioa_cfg))
7261		goto out_free_vpd_cbs;
7262
7263	ioa_cfg->host_rrq = pci_alloc_consistent(ioa_cfg->pdev,
7264						 sizeof(u32) * IPR_NUM_CMD_BLKS,
7265						 &ioa_cfg->host_rrq_dma);
7266
7267	if (!ioa_cfg->host_rrq)
7268		goto out_ipr_free_cmd_blocks;
7269
7270	ioa_cfg->cfg_table = pci_alloc_consistent(ioa_cfg->pdev,
7271						  sizeof(struct ipr_config_table),
7272						  &ioa_cfg->cfg_table_dma);
7273
7274	if (!ioa_cfg->cfg_table)
7275		goto out_free_host_rrq;
7276
7277	for (i = 0; i < IPR_NUM_HCAMS; i++) {
7278		ioa_cfg->hostrcb[i] = pci_alloc_consistent(ioa_cfg->pdev,
7279							   sizeof(struct ipr_hostrcb),
7280							   &ioa_cfg->hostrcb_dma[i]);
7281
7282		if (!ioa_cfg->hostrcb[i])
7283			goto out_free_hostrcb_dma;
7284
7285		ioa_cfg->hostrcb[i]->hostrcb_dma =
7286			ioa_cfg->hostrcb_dma[i] + offsetof(struct ipr_hostrcb, hcam);
7287		ioa_cfg->hostrcb[i]->ioa_cfg = ioa_cfg;
7288		list_add_tail(&ioa_cfg->hostrcb[i]->queue, &ioa_cfg->hostrcb_free_q);
7289	}
7290
7291	ioa_cfg->trace = kzalloc(sizeof(struct ipr_trace_entry) *
7292				 IPR_NUM_TRACE_ENTRIES, GFP_KERNEL);
7293
7294	if (!ioa_cfg->trace)
7295		goto out_free_hostrcb_dma;
7296
7297	rc = 0;
7298out:
7299	LEAVE;
7300	return rc;
7301
7302out_free_hostrcb_dma:
7303	while (i-- > 0) {
7304		pci_free_consistent(pdev, sizeof(struct ipr_hostrcb),
7305				    ioa_cfg->hostrcb[i],
7306				    ioa_cfg->hostrcb_dma[i]);
7307	}
7308	pci_free_consistent(pdev, sizeof(struct ipr_config_table),
7309			    ioa_cfg->cfg_table, ioa_cfg->cfg_table_dma);
7310out_free_host_rrq:
7311	pci_free_consistent(pdev, sizeof(u32) * IPR_NUM_CMD_BLKS,
7312			    ioa_cfg->host_rrq, ioa_cfg->host_rrq_dma);
7313out_ipr_free_cmd_blocks:
7314	ipr_free_cmd_blks(ioa_cfg);
7315out_free_vpd_cbs:
7316	pci_free_consistent(pdev, sizeof(struct ipr_misc_cbs),
7317			    ioa_cfg->vpd_cbs, ioa_cfg->vpd_cbs_dma);
7318out_free_res_entries:
7319	kfree(ioa_cfg->res_entries);
7320	goto out;
7321}
7322
7323/**
7324 * ipr_initialize_bus_attr - Initialize SCSI bus attributes to default values
7325 * @ioa_cfg:	ioa config struct
7326 *
7327 * Return value:
7328 * 	none
7329 **/
7330static void __devinit ipr_initialize_bus_attr(struct ipr_ioa_cfg *ioa_cfg)
7331{
7332	int i;
7333
7334	for (i = 0; i < IPR_MAX_NUM_BUSES; i++) {
7335		ioa_cfg->bus_attr[i].bus = i;
7336		ioa_cfg->bus_attr[i].qas_enabled = 0;
7337		ioa_cfg->bus_attr[i].bus_width = IPR_DEFAULT_BUS_WIDTH;
7338		if (ipr_max_speed < ARRAY_SIZE(ipr_max_bus_speeds))
7339			ioa_cfg->bus_attr[i].max_xfer_rate = ipr_max_bus_speeds[ipr_max_speed];
7340		else
7341			ioa_cfg->bus_attr[i].max_xfer_rate = IPR_U160_SCSI_RATE;
7342	}
7343}
7344
7345/**
7346 * ipr_init_ioa_cfg - Initialize IOA config struct
7347 * @ioa_cfg:	ioa config struct
7348 * @host:		scsi host struct
7349 * @pdev:		PCI dev struct
7350 *
7351 * Return value:
7352 * 	none
7353 **/
7354static void __devinit ipr_init_ioa_cfg(struct ipr_ioa_cfg *ioa_cfg,
7355				       struct Scsi_Host *host, struct pci_dev *pdev)
7356{
7357	const struct ipr_interrupt_offsets *p;
7358	struct ipr_interrupts *t;
7359	void __iomem *base;
7360
7361	ioa_cfg->host = host;
7362	ioa_cfg->pdev = pdev;
7363	ioa_cfg->log_level = ipr_log_level;
7364	ioa_cfg->doorbell = IPR_DOORBELL;
7365	sprintf(ioa_cfg->eye_catcher, IPR_EYECATCHER);
7366	sprintf(ioa_cfg->trace_start, IPR_TRACE_START_LABEL);
7367	sprintf(ioa_cfg->ipr_free_label, IPR_FREEQ_LABEL);
7368	sprintf(ioa_cfg->ipr_pending_label, IPR_PENDQ_LABEL);
7369	sprintf(ioa_cfg->cfg_table_start, IPR_CFG_TBL_START);
7370	sprintf(ioa_cfg->resource_table_label, IPR_RES_TABLE_LABEL);
7371	sprintf(ioa_cfg->ipr_hcam_label, IPR_HCAM_LABEL);
7372	sprintf(ioa_cfg->ipr_cmd_label, IPR_CMD_LABEL);
7373
7374	INIT_LIST_HEAD(&ioa_cfg->free_q);
7375	INIT_LIST_HEAD(&ioa_cfg->pending_q);
7376	INIT_LIST_HEAD(&ioa_cfg->hostrcb_free_q);
7377	INIT_LIST_HEAD(&ioa_cfg->hostrcb_pending_q);
7378	INIT_LIST_HEAD(&ioa_cfg->free_res_q);
7379	INIT_LIST_HEAD(&ioa_cfg->used_res_q);
7380	INIT_WORK(&ioa_cfg->work_q, ipr_worker_thread);
7381	init_waitqueue_head(&ioa_cfg->reset_wait_q);
7382	ioa_cfg->sdt_state = INACTIVE;
7383	if (ipr_enable_cache)
7384		ioa_cfg->cache_state = CACHE_ENABLED;
7385	else
7386		ioa_cfg->cache_state = CACHE_DISABLED;
7387
7388	ipr_initialize_bus_attr(ioa_cfg);
7389
7390	host->max_id = IPR_MAX_NUM_TARGETS_PER_BUS;
7391	host->max_lun = IPR_MAX_NUM_LUNS_PER_TARGET;
7392	host->max_channel = IPR_MAX_BUS_TO_SCAN;
7393	host->unique_id = host->host_no;
7394	host->max_cmd_len = IPR_MAX_CDB_LEN;
7395	pci_set_drvdata(pdev, ioa_cfg);
7396
7397	p = &ioa_cfg->chip_cfg->regs;
7398	t = &ioa_cfg->regs;
7399	base = ioa_cfg->hdw_dma_regs;
7400
7401	t->set_interrupt_mask_reg = base + p->set_interrupt_mask_reg;
7402	t->clr_interrupt_mask_reg = base + p->clr_interrupt_mask_reg;
7403	t->sense_interrupt_mask_reg = base + p->sense_interrupt_mask_reg;
7404	t->clr_interrupt_reg = base + p->clr_interrupt_reg;
7405	t->sense_interrupt_reg = base + p->sense_interrupt_reg;
7406	t->ioarrin_reg = base + p->ioarrin_reg;
7407	t->sense_uproc_interrupt_reg = base + p->sense_uproc_interrupt_reg;
7408	t->set_uproc_interrupt_reg = base + p->set_uproc_interrupt_reg;
7409	t->clr_uproc_interrupt_reg = base + p->clr_uproc_interrupt_reg;
7410}
7411
7412/**
7413 * ipr_get_chip_cfg - Find adapter chip configuration
7414 * @dev_id:		PCI device id struct
7415 *
7416 * Return value:
7417 * 	ptr to chip config on success / NULL on failure
7418 **/
7419static const struct ipr_chip_cfg_t * __devinit
7420ipr_get_chip_cfg(const struct pci_device_id *dev_id)
7421{
7422	int i;
7423
7424	for (i = 0; i < ARRAY_SIZE(ipr_chip); i++)
7425		if (ipr_chip[i].vendor == dev_id->vendor &&
7426		    ipr_chip[i].device == dev_id->device)
7427			return ipr_chip[i].cfg;
7428	return NULL;
7429}
7430
7431/**
7432 * ipr_probe_ioa - Allocates memory and does first stage of initialization
7433 * @pdev:		PCI device struct
7434 * @dev_id:		PCI device id struct
7435 *
7436 * Return value:
7437 * 	0 on success / non-zero on failure
7438 **/
7439static int __devinit ipr_probe_ioa(struct pci_dev *pdev,
7440				   const struct pci_device_id *dev_id)
7441{
7442	struct ipr_ioa_cfg *ioa_cfg;
7443	struct Scsi_Host *host;
7444	unsigned long ipr_regs_pci;
7445	void __iomem *ipr_regs;
7446	int rc = PCIBIOS_SUCCESSFUL;
7447	volatile u32 mask, uproc, interrupts;
7448
7449	ENTER;
7450
7451	if ((rc = pci_enable_device(pdev))) {
7452		dev_err(&pdev->dev, "Cannot enable adapter\n");
7453		goto out;
7454	}
7455
7456	dev_info(&pdev->dev, "Found IOA with IRQ: %d\n", pdev->irq);
7457
7458	host = scsi_host_alloc(&driver_template, sizeof(*ioa_cfg));
7459
7460	if (!host) {
7461		dev_err(&pdev->dev, "call to scsi_host_alloc failed!\n");
7462		rc = -ENOMEM;
7463		goto out_disable;
7464	}
7465
7466	ioa_cfg = (struct ipr_ioa_cfg *)host->hostdata;
7467	memset(ioa_cfg, 0, sizeof(struct ipr_ioa_cfg));
7468	ata_host_init(&ioa_cfg->ata_host, &pdev->dev,
7469		      sata_port_info.flags, &ipr_sata_ops);
7470
7471	ioa_cfg->chip_cfg = ipr_get_chip_cfg(dev_id);
7472
7473	if (!ioa_cfg->chip_cfg) {
7474		dev_err(&pdev->dev, "Unknown adapter chipset 0x%04X 0x%04X\n",
7475			dev_id->vendor, dev_id->device);
7476		goto out_scsi_host_put;
7477	}
7478
7479	if (ipr_transop_timeout)
7480		ioa_cfg->transop_timeout = ipr_transop_timeout;
7481	else if (dev_id->driver_data & IPR_USE_LONG_TRANSOP_TIMEOUT)
7482		ioa_cfg->transop_timeout = IPR_LONG_OPERATIONAL_TIMEOUT;
7483	else
7484		ioa_cfg->transop_timeout = IPR_OPERATIONAL_TIMEOUT;
7485
7486	ipr_regs_pci = pci_resource_start(pdev, 0);
7487
7488	rc = pci_request_regions(pdev, IPR_NAME);
7489	if (rc < 0) {
7490		dev_err(&pdev->dev,
7491			"Couldn't register memory range of registers\n");
7492		goto out_scsi_host_put;
7493	}
7494
7495	ipr_regs = ioremap(ipr_regs_pci, pci_resource_len(pdev, 0));
7496
7497	if (!ipr_regs) {
7498		dev_err(&pdev->dev,
7499			"Couldn't map memory range of registers\n");
7500		rc = -ENOMEM;
7501		goto out_release_regions;
7502	}
7503
7504	ioa_cfg->hdw_dma_regs = ipr_regs;
7505	ioa_cfg->hdw_dma_regs_pci = ipr_regs_pci;
7506	ioa_cfg->ioa_mailbox = ioa_cfg->chip_cfg->mailbox + ipr_regs;
7507
7508	ipr_init_ioa_cfg(ioa_cfg, host, pdev);
7509
7510	pci_set_master(pdev);
7511
7512	rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
7513	if (rc < 0) {
7514		dev_err(&pdev->dev, "Failed to set PCI DMA mask\n");
7515		goto cleanup_nomem;
7516	}
7517
7518	rc = pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE,
7519				   ioa_cfg->chip_cfg->cache_line_size);
7520
7521	if (rc != PCIBIOS_SUCCESSFUL) {
7522		dev_err(&pdev->dev, "Write of cache line size failed\n");
7523		rc = -EIO;
7524		goto cleanup_nomem;
7525	}
7526
7527	/* Save away PCI config space for use following IOA reset */
7528	rc = pci_save_state(pdev);
7529
7530	if (rc != PCIBIOS_SUCCESSFUL) {
7531		dev_err(&pdev->dev, "Failed to save PCI config space\n");
7532		rc = -EIO;
7533		goto cleanup_nomem;
7534	}
7535
7536	if ((rc = ipr_save_pcix_cmd_reg(ioa_cfg)))
7537		goto cleanup_nomem;
7538
7539	if ((rc = ipr_set_pcix_cmd_reg(ioa_cfg)))
7540		goto cleanup_nomem;
7541
7542	rc = ipr_alloc_mem(ioa_cfg);
7543	if (rc < 0) {
7544		dev_err(&pdev->dev,
7545			"Couldn't allocate enough memory for device driver!\n");
7546		goto cleanup_nomem;
7547	}
7548
7549	/*
7550	 * If HRRQ updated interrupt is not masked, or reset alert is set,
7551	 * the card is in an unknown state and needs a hard reset
7552	 */
7553	mask = readl(ioa_cfg->regs.sense_interrupt_mask_reg);
7554	interrupts = readl(ioa_cfg->regs.sense_interrupt_reg);
7555	uproc = readl(ioa_cfg->regs.sense_uproc_interrupt_reg);
7556	if ((mask & IPR_PCII_HRRQ_UPDATED) == 0 || (uproc & IPR_UPROCI_RESET_ALERT))
7557		ioa_cfg->needs_hard_reset = 1;
7558	if (interrupts & IPR_PCII_ERROR_INTERRUPTS)
7559		ioa_cfg->needs_hard_reset = 1;
7560	if (interrupts & IPR_PCII_IOA_UNIT_CHECKED)
7561		ioa_cfg->ioa_unit_checked = 1;
7562
7563	ipr_mask_and_clear_interrupts(ioa_cfg, ~IPR_PCII_IOA_TRANS_TO_OPER);
7564	rc = request_irq(pdev->irq, ipr_isr, IRQF_SHARED, IPR_NAME, ioa_cfg);
7565
7566	if (rc) {
7567		dev_err(&pdev->dev, "Couldn't register IRQ %d! rc=%d\n",
7568			pdev->irq, rc);
7569		goto cleanup_nolog;
7570	}
7571
7572	spin_lock(&ipr_driver_lock);
7573	list_add_tail(&ioa_cfg->queue, &ipr_ioa_head);
7574	spin_unlock(&ipr_driver_lock);
7575
7576	LEAVE;
7577out:
7578	return rc;
7579
7580cleanup_nolog:
7581	ipr_free_mem(ioa_cfg);
7582cleanup_nomem:
7583	iounmap(ipr_regs);
7584out_release_regions:
7585	pci_release_regions(pdev);
7586out_scsi_host_put:
7587	scsi_host_put(host);
7588out_disable:
7589	pci_disable_device(pdev);
7590	goto out;
7591}
7592
7593/**
7594 * ipr_scan_vsets - Scans for VSET devices
7595 * @ioa_cfg:	ioa config struct
7596 *
7597 * Description: Since the VSET resources do not follow SAM in that we can have
7598 * sparse LUNs with no LUN 0, we have to scan for these ourselves.
7599 *
7600 * Return value:
7601 * 	none
7602 **/
7603static void ipr_scan_vsets(struct ipr_ioa_cfg *ioa_cfg)
7604{
7605	int target, lun;
7606
7607	for (target = 0; target < IPR_MAX_NUM_TARGETS_PER_BUS; target++)
7608		for (lun = 0; lun < IPR_MAX_NUM_VSET_LUNS_PER_TARGET; lun++ )
7609			scsi_add_device(ioa_cfg->host, IPR_VSET_BUS, target, lun);
7610}
7611
7612/**
7613 * ipr_initiate_ioa_bringdown - Bring down an adapter
7614 * @ioa_cfg:		ioa config struct
7615 * @shutdown_type:	shutdown type
7616 *
7617 * Description: This function will initiate bringing down the adapter.
7618 * This consists of issuing an IOA shutdown to the adapter
7619 * to flush the cache, and running BIST.
7620 * If the caller needs to wait on the completion of the reset,
7621 * the caller must sleep on the reset_wait_q.
7622 *
7623 * Return value:
7624 * 	none
7625 **/
7626static void ipr_initiate_ioa_bringdown(struct ipr_ioa_cfg *ioa_cfg,
7627				       enum ipr_shutdown_type shutdown_type)
7628{
7629	ENTER;
7630	if (ioa_cfg->sdt_state == WAIT_FOR_DUMP)
7631		ioa_cfg->sdt_state = ABORT_DUMP;
7632	ioa_cfg->reset_retries = 0;
7633	ioa_cfg->in_ioa_bringdown = 1;
7634	ipr_initiate_ioa_reset(ioa_cfg, shutdown_type);
7635	LEAVE;
7636}
7637
7638/**
7639 * __ipr_remove - Remove a single adapter
7640 * @pdev:	pci device struct
7641 *
7642 * Adapter hot plug remove entry point.
7643 *
7644 * Return value:
7645 * 	none
7646 **/
7647static void __ipr_remove(struct pci_dev *pdev)
7648{
7649	unsigned long host_lock_flags = 0;
7650	struct ipr_ioa_cfg *ioa_cfg = pci_get_drvdata(pdev);
7651	ENTER;
7652
7653	spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags);
7654	while(ioa_cfg->in_reset_reload) {
7655		spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags);
7656		wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
7657		spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags);
7658	}
7659
7660	ipr_initiate_ioa_bringdown(ioa_cfg, IPR_SHUTDOWN_NORMAL);
7661
7662	spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags);
7663	wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
7664	flush_scheduled_work();
7665	spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags);
7666
7667	spin_lock(&ipr_driver_lock);
7668	list_del(&ioa_cfg->queue);
7669	spin_unlock(&ipr_driver_lock);
7670
7671	if (ioa_cfg->sdt_state == ABORT_DUMP)
7672		ioa_cfg->sdt_state = WAIT_FOR_DUMP;
7673	spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags);
7674
7675	ipr_free_all_resources(ioa_cfg);
7676
7677	LEAVE;
7678}
7679
7680/**
7681 * ipr_remove - IOA hot plug remove entry point
7682 * @pdev:	pci device struct
7683 *
7684 * Adapter hot plug remove entry point.
7685 *
7686 * Return value:
7687 * 	none
7688 **/
7689static void ipr_remove(struct pci_dev *pdev)
7690{
7691	struct ipr_ioa_cfg *ioa_cfg = pci_get_drvdata(pdev);
7692
7693	ENTER;
7694
7695	ipr_remove_trace_file(&ioa_cfg->host->shost_classdev.kobj,
7696			      &ipr_trace_attr);
7697	ipr_remove_dump_file(&ioa_cfg->host->shost_classdev.kobj,
7698			     &ipr_dump_attr);
7699	scsi_remove_host(ioa_cfg->host);
7700
7701	__ipr_remove(pdev);
7702
7703	LEAVE;
7704}
7705
7706/**
7707 * ipr_probe - Adapter hot plug add entry point
7708 *
7709 * Return value:
7710 * 	0 on success / non-zero on failure
7711 **/
7712static int __devinit ipr_probe(struct pci_dev *pdev,
7713			       const struct pci_device_id *dev_id)
7714{
7715	struct ipr_ioa_cfg *ioa_cfg;
7716	int rc;
7717
7718	rc = ipr_probe_ioa(pdev, dev_id);
7719
7720	if (rc)
7721		return rc;
7722
7723	ioa_cfg = pci_get_drvdata(pdev);
7724	rc = ipr_probe_ioa_part2(ioa_cfg);
7725
7726	if (rc) {
7727		__ipr_remove(pdev);
7728		return rc;
7729	}
7730
7731	rc = scsi_add_host(ioa_cfg->host, &pdev->dev);
7732
7733	if (rc) {
7734		__ipr_remove(pdev);
7735		return rc;
7736	}
7737
7738	rc = ipr_create_trace_file(&ioa_cfg->host->shost_classdev.kobj,
7739				   &ipr_trace_attr);
7740
7741	if (rc) {
7742		scsi_remove_host(ioa_cfg->host);
7743		__ipr_remove(pdev);
7744		return rc;
7745	}
7746
7747	rc = ipr_create_dump_file(&ioa_cfg->host->shost_classdev.kobj,
7748				   &ipr_dump_attr);
7749
7750	if (rc) {
7751		ipr_remove_trace_file(&ioa_cfg->host->shost_classdev.kobj,
7752				      &ipr_trace_attr);
7753		scsi_remove_host(ioa_cfg->host);
7754		__ipr_remove(pdev);
7755		return rc;
7756	}
7757
7758	scsi_scan_host(ioa_cfg->host);
7759	ipr_scan_vsets(ioa_cfg);
7760	scsi_add_device(ioa_cfg->host, IPR_IOA_BUS, IPR_IOA_TARGET, IPR_IOA_LUN);
7761	ioa_cfg->allow_ml_add_del = 1;
7762	ioa_cfg->host->max_channel = IPR_VSET_BUS;
7763	schedule_work(&ioa_cfg->work_q);
7764	return 0;
7765}
7766
7767/**
7768 * ipr_shutdown - Shutdown handler.
7769 * @pdev:	pci device struct
7770 *
7771 * This function is invoked upon system shutdown/reboot. It will issue
7772 * an adapter shutdown to the adapter to flush the write cache.
7773 *
7774 * Return value:
7775 * 	none
7776 **/
7777static void ipr_shutdown(struct pci_dev *pdev)
7778{
7779	struct ipr_ioa_cfg *ioa_cfg = pci_get_drvdata(pdev);
7780	unsigned long lock_flags = 0;
7781
7782	spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
7783	while(ioa_cfg->in_reset_reload) {
7784		spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
7785		wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
7786		spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
7787	}
7788
7789	ipr_initiate_ioa_bringdown(ioa_cfg, IPR_SHUTDOWN_NORMAL);
7790	spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
7791	wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
7792}
7793
7794static struct pci_device_id ipr_pci_table[] __devinitdata = {
7795	{ PCI_VENDOR_ID_MYLEX, PCI_DEVICE_ID_IBM_GEMSTONE,
7796		PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_5702, 0, 0, 0 },
7797	{ PCI_VENDOR_ID_MYLEX, PCI_DEVICE_ID_IBM_GEMSTONE,
7798		PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_5703, 0, 0, 0 },
7799	{ PCI_VENDOR_ID_MYLEX, PCI_DEVICE_ID_IBM_GEMSTONE,
7800		PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_573D, 0, 0, 0 },
7801	{ PCI_VENDOR_ID_MYLEX, PCI_DEVICE_ID_IBM_GEMSTONE,
7802		PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_573E, 0, 0, 0 },
7803	{ PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CITRINE,
7804		PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_571B, 0, 0, 0 },
7805	{ PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CITRINE,
7806		PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_572E, 0, 0, 0 },
7807	{ PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CITRINE,
7808		PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_571A, 0, 0, 0 },
7809	{ PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CITRINE,
7810		PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_575B, 0, 0,
7811		IPR_USE_LONG_TRANSOP_TIMEOUT },
7812	{ PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_OBSIDIAN,
7813	      PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_572A, 0, 0, 0 },
7814	{ PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_OBSIDIAN,
7815	      PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_572B, 0, 0,
7816	      IPR_USE_LONG_TRANSOP_TIMEOUT },
7817	{ PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_OBSIDIAN,
7818	      PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_575C, 0, 0,
7819	      IPR_USE_LONG_TRANSOP_TIMEOUT },
7820	{ PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN,
7821	      PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_572A, 0, 0, 0 },
7822	{ PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN,
7823	      PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_572B, 0, 0,
7824	      IPR_USE_LONG_TRANSOP_TIMEOUT},
7825	{ PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN,
7826	      PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_575C, 0, 0,
7827	      IPR_USE_LONG_TRANSOP_TIMEOUT },
7828	{ PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN_E,
7829	      PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_574E, 0, 0,
7830	      IPR_USE_LONG_TRANSOP_TIMEOUT },
7831	{ PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN_E,
7832	      PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_575D, 0, 0,
7833	      IPR_USE_LONG_TRANSOP_TIMEOUT },
7834	{ PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN_E,
7835	      PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_57B3, 0, 0, 0 },
7836	{ PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN_E,
7837	      PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_57B7, 0, 0,
7838	      IPR_USE_LONG_TRANSOP_TIMEOUT },
7839	{ PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_SNIPE,
7840		PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_2780, 0, 0, 0 },
7841	{ PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_SCAMP,
7842		PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_571E, 0, 0, 0 },
7843	{ PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_SCAMP,
7844		PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_571F, 0, 0,
7845		IPR_USE_LONG_TRANSOP_TIMEOUT },
7846	{ PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_SCAMP,
7847		PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_572F, 0, 0,
7848		IPR_USE_LONG_TRANSOP_TIMEOUT },
7849	{ PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_SCAMP_E,
7850		PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_574D, 0, 0,
7851		IPR_USE_LONG_TRANSOP_TIMEOUT },
7852	{ }
7853};
7854MODULE_DEVICE_TABLE(pci, ipr_pci_table);
7855
7856static struct pci_error_handlers ipr_err_handler = {
7857	.error_detected = ipr_pci_error_detected,
7858	.slot_reset = ipr_pci_slot_reset,
7859};
7860
7861static struct pci_driver ipr_driver = {
7862	.name = IPR_NAME,
7863	.id_table = ipr_pci_table,
7864	.probe = ipr_probe,
7865	.remove = ipr_remove,
7866	.shutdown = ipr_shutdown,
7867	.err_handler = &ipr_err_handler,
7868	.dynids.use_driver_data = 1
7869};
7870
7871/**
7872 * ipr_init - Module entry point
7873 *
7874 * Return value:
7875 * 	0 on success / negative value on failure
7876 **/
7877static int __init ipr_init(void)
7878{
7879	ipr_info("IBM Power RAID SCSI Device Driver version: %s %s\n",
7880		 IPR_DRIVER_VERSION, IPR_DRIVER_DATE);
7881
7882	return pci_register_driver(&ipr_driver);
7883}
7884
7885/**
7886 * ipr_exit - Module unload
7887 *
7888 * Module unload entry point.
7889 *
7890 * Return value:
7891 * 	none
7892 **/
7893static void __exit ipr_exit(void)
7894{
7895	pci_unregister_driver(&ipr_driver);
7896}
7897
7898module_init(ipr_init);
7899module_exit(ipr_exit);
7900