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