Merge tag 'for-linus' of git://github.com/openrisc/linux
[sfrench/cifs-2.6.git] / drivers / scsi / aacraid / aachba.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  *      Adaptec AAC series RAID controller driver
4  *      (c) Copyright 2001 Red Hat Inc.
5  *
6  * based on the old aacraid driver that is..
7  * Adaptec aacraid device driver for Linux.
8  *
9  * Copyright (c) 2000-2010 Adaptec, Inc.
10  *               2010-2015 PMC-Sierra, Inc. (aacraid@pmc-sierra.com)
11  *               2016-2017 Microsemi Corp. (aacraid@microsemi.com)
12  *
13  * Module Name:
14  *  aachba.c
15  *
16  * Abstract: Contains Interfaces to manage IOs.
17  */
18
19 #include <linux/kernel.h>
20 #include <linux/init.h>
21 #include <linux/types.h>
22 #include <linux/pci.h>
23 #include <linux/spinlock.h>
24 #include <linux/slab.h>
25 #include <linux/completion.h>
26 #include <linux/blkdev.h>
27 #include <linux/uaccess.h>
28 #include <linux/highmem.h> /* For flush_kernel_dcache_page */
29 #include <linux/module.h>
30
31 #include <asm/unaligned.h>
32
33 #include <scsi/scsi.h>
34 #include <scsi/scsi_cmnd.h>
35 #include <scsi/scsi_device.h>
36 #include <scsi/scsi_host.h>
37
38 #include "aacraid.h"
39
40 /* values for inqd_pdt: Peripheral device type in plain English */
41 #define INQD_PDT_DA     0x00    /* Direct-access (DISK) device */
42 #define INQD_PDT_PROC   0x03    /* Processor device */
43 #define INQD_PDT_CHNGR  0x08    /* Changer (jukebox, scsi2) */
44 #define INQD_PDT_COMM   0x09    /* Communication device (scsi2) */
45 #define INQD_PDT_NOLUN2 0x1f    /* Unknown Device (scsi2) */
46 #define INQD_PDT_NOLUN  0x7f    /* Logical Unit Not Present */
47
48 #define INQD_PDT_DMASK  0x1F    /* Peripheral Device Type Mask */
49 #define INQD_PDT_QMASK  0xE0    /* Peripheral Device Qualifer Mask */
50
51 /*
52  *      Sense codes
53  */
54
55 #define SENCODE_NO_SENSE                        0x00
56 #define SENCODE_END_OF_DATA                     0x00
57 #define SENCODE_BECOMING_READY                  0x04
58 #define SENCODE_INIT_CMD_REQUIRED               0x04
59 #define SENCODE_UNRECOVERED_READ_ERROR          0x11
60 #define SENCODE_PARAM_LIST_LENGTH_ERROR         0x1A
61 #define SENCODE_INVALID_COMMAND                 0x20
62 #define SENCODE_LBA_OUT_OF_RANGE                0x21
63 #define SENCODE_INVALID_CDB_FIELD               0x24
64 #define SENCODE_LUN_NOT_SUPPORTED               0x25
65 #define SENCODE_INVALID_PARAM_FIELD             0x26
66 #define SENCODE_PARAM_NOT_SUPPORTED             0x26
67 #define SENCODE_PARAM_VALUE_INVALID             0x26
68 #define SENCODE_RESET_OCCURRED                  0x29
69 #define SENCODE_LUN_NOT_SELF_CONFIGURED_YET     0x3E
70 #define SENCODE_INQUIRY_DATA_CHANGED            0x3F
71 #define SENCODE_SAVING_PARAMS_NOT_SUPPORTED     0x39
72 #define SENCODE_DIAGNOSTIC_FAILURE              0x40
73 #define SENCODE_INTERNAL_TARGET_FAILURE         0x44
74 #define SENCODE_INVALID_MESSAGE_ERROR           0x49
75 #define SENCODE_LUN_FAILED_SELF_CONFIG          0x4c
76 #define SENCODE_OVERLAPPED_COMMAND              0x4E
77
78 /*
79  *      Additional sense codes
80  */
81
82 #define ASENCODE_NO_SENSE                       0x00
83 #define ASENCODE_END_OF_DATA                    0x05
84 #define ASENCODE_BECOMING_READY                 0x01
85 #define ASENCODE_INIT_CMD_REQUIRED              0x02
86 #define ASENCODE_PARAM_LIST_LENGTH_ERROR        0x00
87 #define ASENCODE_INVALID_COMMAND                0x00
88 #define ASENCODE_LBA_OUT_OF_RANGE               0x00
89 #define ASENCODE_INVALID_CDB_FIELD              0x00
90 #define ASENCODE_LUN_NOT_SUPPORTED              0x00
91 #define ASENCODE_INVALID_PARAM_FIELD            0x00
92 #define ASENCODE_PARAM_NOT_SUPPORTED            0x01
93 #define ASENCODE_PARAM_VALUE_INVALID            0x02
94 #define ASENCODE_RESET_OCCURRED                 0x00
95 #define ASENCODE_LUN_NOT_SELF_CONFIGURED_YET    0x00
96 #define ASENCODE_INQUIRY_DATA_CHANGED           0x03
97 #define ASENCODE_SAVING_PARAMS_NOT_SUPPORTED    0x00
98 #define ASENCODE_DIAGNOSTIC_FAILURE             0x80
99 #define ASENCODE_INTERNAL_TARGET_FAILURE        0x00
100 #define ASENCODE_INVALID_MESSAGE_ERROR          0x00
101 #define ASENCODE_LUN_FAILED_SELF_CONFIG         0x00
102 #define ASENCODE_OVERLAPPED_COMMAND             0x00
103
104 #define BYTE0(x) (unsigned char)(x)
105 #define BYTE1(x) (unsigned char)((x) >> 8)
106 #define BYTE2(x) (unsigned char)((x) >> 16)
107 #define BYTE3(x) (unsigned char)((x) >> 24)
108
109 /* MODE_SENSE data format */
110 typedef struct {
111         struct {
112                 u8      data_length;
113                 u8      med_type;
114                 u8      dev_par;
115                 u8      bd_length;
116         } __attribute__((packed)) hd;
117         struct {
118                 u8      dens_code;
119                 u8      block_count[3];
120                 u8      reserved;
121                 u8      block_length[3];
122         } __attribute__((packed)) bd;
123                 u8      mpc_buf[3];
124 } __attribute__((packed)) aac_modep_data;
125
126 /* MODE_SENSE_10 data format */
127 typedef struct {
128         struct {
129                 u8      data_length[2];
130                 u8      med_type;
131                 u8      dev_par;
132                 u8      rsrvd[2];
133                 u8      bd_length[2];
134         } __attribute__((packed)) hd;
135         struct {
136                 u8      dens_code;
137                 u8      block_count[3];
138                 u8      reserved;
139                 u8      block_length[3];
140         } __attribute__((packed)) bd;
141                 u8      mpc_buf[3];
142 } __attribute__((packed)) aac_modep10_data;
143
144 /*------------------------------------------------------------------------------
145  *              S T R U C T S / T Y P E D E F S
146  *----------------------------------------------------------------------------*/
147 /* SCSI inquiry data */
148 struct inquiry_data {
149         u8 inqd_pdt;    /* Peripheral qualifier | Peripheral Device Type */
150         u8 inqd_dtq;    /* RMB | Device Type Qualifier */
151         u8 inqd_ver;    /* ISO version | ECMA version | ANSI-approved version */
152         u8 inqd_rdf;    /* AENC | TrmIOP | Response data format */
153         u8 inqd_len;    /* Additional length (n-4) */
154         u8 inqd_pad1[2];/* Reserved - must be zero */
155         u8 inqd_pad2;   /* RelAdr | WBus32 | WBus16 |  Sync  | Linked |Reserved| CmdQue | SftRe */
156         u8 inqd_vid[8]; /* Vendor ID */
157         u8 inqd_pid[16];/* Product ID */
158         u8 inqd_prl[4]; /* Product Revision Level */
159 };
160
161 /* Added for VPD 0x83 */
162 struct  tvpd_id_descriptor_type_1 {
163         u8 codeset:4;           /* VPD_CODE_SET */
164         u8 reserved:4;
165         u8 identifiertype:4;    /* VPD_IDENTIFIER_TYPE */
166         u8 reserved2:4;
167         u8 reserved3;
168         u8 identifierlength;
169         u8 venid[8];
170         u8 productid[16];
171         u8 serialnumber[8];     /* SN in ASCII */
172
173 };
174
175 struct tvpd_id_descriptor_type_2 {
176         u8 codeset:4;           /* VPD_CODE_SET */
177         u8 reserved:4;
178         u8 identifiertype:4;    /* VPD_IDENTIFIER_TYPE */
179         u8 reserved2:4;
180         u8 reserved3;
181         u8 identifierlength;
182         struct teu64id {
183                 u32 Serial;
184                  /* The serial number supposed to be 40 bits,
185                   * bit we only support 32, so make the last byte zero. */
186                 u8 reserved;
187                 u8 venid[3];
188         } eu64id;
189
190 };
191
192 struct tvpd_id_descriptor_type_3 {
193         u8 codeset : 4;          /* VPD_CODE_SET */
194         u8 reserved : 4;
195         u8 identifiertype : 4;   /* VPD_IDENTIFIER_TYPE */
196         u8 reserved2 : 4;
197         u8 reserved3;
198         u8 identifierlength;
199         u8 Identifier[16];
200 };
201
202 struct tvpd_page83 {
203         u8 DeviceType:5;
204         u8 DeviceTypeQualifier:3;
205         u8 PageCode;
206         u8 reserved;
207         u8 PageLength;
208         struct tvpd_id_descriptor_type_1 type1;
209         struct tvpd_id_descriptor_type_2 type2;
210         struct tvpd_id_descriptor_type_3 type3;
211 };
212
213 /*
214  *              M O D U L E   G L O B A L S
215  */
216
217 static long aac_build_sg(struct scsi_cmnd *scsicmd, struct sgmap *sgmap);
218 static long aac_build_sg64(struct scsi_cmnd *scsicmd, struct sgmap64 *psg);
219 static long aac_build_sgraw(struct scsi_cmnd *scsicmd, struct sgmapraw *psg);
220 static long aac_build_sgraw2(struct scsi_cmnd *scsicmd,
221                                 struct aac_raw_io2 *rio2, int sg_max);
222 static long aac_build_sghba(struct scsi_cmnd *scsicmd,
223                                 struct aac_hba_cmd_req *hbacmd,
224                                 int sg_max, u64 sg_address);
225 static int aac_convert_sgraw2(struct aac_raw_io2 *rio2,
226                                 int pages, int nseg, int nseg_new);
227 static int aac_send_srb_fib(struct scsi_cmnd* scsicmd);
228 static int aac_send_hba_fib(struct scsi_cmnd *scsicmd);
229 #ifdef AAC_DETAILED_STATUS_INFO
230 static char *aac_get_status_string(u32 status);
231 #endif
232
233 /*
234  *      Non dasd selection is handled entirely in aachba now
235  */
236
237 static int nondasd = -1;
238 static int aac_cache = 2;       /* WCE=0 to avoid performance problems */
239 static int dacmode = -1;
240 int aac_msi;
241 int aac_commit = -1;
242 int startup_timeout = 180;
243 int aif_timeout = 120;
244 int aac_sync_mode;  /* Only Sync. transfer - disabled */
245 int aac_convert_sgl = 1;        /* convert non-conformable s/g list - enabled */
246
247 module_param(aac_sync_mode, int, S_IRUGO|S_IWUSR);
248 MODULE_PARM_DESC(aac_sync_mode, "Force sync. transfer mode"
249         " 0=off, 1=on");
250 module_param(aac_convert_sgl, int, S_IRUGO|S_IWUSR);
251 MODULE_PARM_DESC(aac_convert_sgl, "Convert non-conformable s/g list"
252         " 0=off, 1=on");
253 module_param(nondasd, int, S_IRUGO|S_IWUSR);
254 MODULE_PARM_DESC(nondasd, "Control scanning of hba for nondasd devices."
255         " 0=off, 1=on");
256 module_param_named(cache, aac_cache, int, S_IRUGO|S_IWUSR);
257 MODULE_PARM_DESC(cache, "Disable Queue Flush commands:\n"
258         "\tbit 0 - Disable FUA in WRITE SCSI commands\n"
259         "\tbit 1 - Disable SYNCHRONIZE_CACHE SCSI command\n"
260         "\tbit 2 - Disable only if Battery is protecting Cache");
261 module_param(dacmode, int, S_IRUGO|S_IWUSR);
262 MODULE_PARM_DESC(dacmode, "Control whether dma addressing is using 64 bit DAC."
263         " 0=off, 1=on");
264 module_param_named(commit, aac_commit, int, S_IRUGO|S_IWUSR);
265 MODULE_PARM_DESC(commit, "Control whether a COMMIT_CONFIG is issued to the"
266         " adapter for foreign arrays.\n"
267         "This is typically needed in systems that do not have a BIOS."
268         " 0=off, 1=on");
269 module_param_named(msi, aac_msi, int, S_IRUGO|S_IWUSR);
270 MODULE_PARM_DESC(msi, "IRQ handling."
271         " 0=PIC(default), 1=MSI, 2=MSI-X)");
272 module_param(startup_timeout, int, S_IRUGO|S_IWUSR);
273 MODULE_PARM_DESC(startup_timeout, "The duration of time in seconds to wait for"
274         " adapter to have it's kernel up and\n"
275         "running. This is typically adjusted for large systems that do not"
276         " have a BIOS.");
277 module_param(aif_timeout, int, S_IRUGO|S_IWUSR);
278 MODULE_PARM_DESC(aif_timeout, "The duration of time in seconds to wait for"
279         " applications to pick up AIFs before\n"
280         "deregistering them. This is typically adjusted for heavily burdened"
281         " systems.");
282
283 int aac_fib_dump;
284 module_param(aac_fib_dump, int, 0644);
285 MODULE_PARM_DESC(aac_fib_dump, "Dump controller fibs prior to IOP_RESET 0=off, 1=on");
286
287 int numacb = -1;
288 module_param(numacb, int, S_IRUGO|S_IWUSR);
289 MODULE_PARM_DESC(numacb, "Request a limit to the number of adapter control"
290         " blocks (FIB) allocated. Valid values are 512 and down. Default is"
291         " to use suggestion from Firmware.");
292
293 int acbsize = -1;
294 module_param(acbsize, int, S_IRUGO|S_IWUSR);
295 MODULE_PARM_DESC(acbsize, "Request a specific adapter control block (FIB)"
296         " size. Valid values are 512, 2048, 4096 and 8192. Default is to use"
297         " suggestion from Firmware.");
298
299 int update_interval = 30 * 60;
300 module_param(update_interval, int, S_IRUGO|S_IWUSR);
301 MODULE_PARM_DESC(update_interval, "Interval in seconds between time sync"
302         " updates issued to adapter.");
303
304 int check_interval = 60;
305 module_param(check_interval, int, S_IRUGO|S_IWUSR);
306 MODULE_PARM_DESC(check_interval, "Interval in seconds between adapter health"
307         " checks.");
308
309 int aac_check_reset = 1;
310 module_param_named(check_reset, aac_check_reset, int, S_IRUGO|S_IWUSR);
311 MODULE_PARM_DESC(check_reset, "If adapter fails health check, reset the"
312         " adapter. a value of -1 forces the reset to adapters programmed to"
313         " ignore it.");
314
315 int expose_physicals = -1;
316 module_param(expose_physicals, int, S_IRUGO|S_IWUSR);
317 MODULE_PARM_DESC(expose_physicals, "Expose physical components of the arrays."
318         " -1=protect 0=off, 1=on");
319
320 int aac_reset_devices;
321 module_param_named(reset_devices, aac_reset_devices, int, S_IRUGO|S_IWUSR);
322 MODULE_PARM_DESC(reset_devices, "Force an adapter reset at initialization.");
323
324 int aac_wwn = 1;
325 module_param_named(wwn, aac_wwn, int, S_IRUGO|S_IWUSR);
326 MODULE_PARM_DESC(wwn, "Select a WWN type for the arrays:\n"
327         "\t0 - Disable\n"
328         "\t1 - Array Meta Data Signature (default)\n"
329         "\t2 - Adapter Serial Number");
330
331
332 static inline int aac_valid_context(struct scsi_cmnd *scsicmd,
333                 struct fib *fibptr) {
334         struct scsi_device *device;
335
336         if (unlikely(!scsicmd || !scsicmd->scsi_done)) {
337                 dprintk((KERN_WARNING "aac_valid_context: scsi command corrupt\n"));
338                 aac_fib_complete(fibptr);
339                 return 0;
340         }
341         scsicmd->SCp.phase = AAC_OWNER_MIDLEVEL;
342         device = scsicmd->device;
343         if (unlikely(!device)) {
344                 dprintk((KERN_WARNING "aac_valid_context: scsi device corrupt\n"));
345                 aac_fib_complete(fibptr);
346                 return 0;
347         }
348         return 1;
349 }
350
351 /**
352  *      aac_get_config_status   -       check the adapter configuration
353  *      @common: adapter to query
354  *
355  *      Query config status, and commit the configuration if needed.
356  */
357 int aac_get_config_status(struct aac_dev *dev, int commit_flag)
358 {
359         int status = 0;
360         struct fib * fibptr;
361
362         if (!(fibptr = aac_fib_alloc(dev)))
363                 return -ENOMEM;
364
365         aac_fib_init(fibptr);
366         {
367                 struct aac_get_config_status *dinfo;
368                 dinfo = (struct aac_get_config_status *) fib_data(fibptr);
369
370                 dinfo->command = cpu_to_le32(VM_ContainerConfig);
371                 dinfo->type = cpu_to_le32(CT_GET_CONFIG_STATUS);
372                 dinfo->count = cpu_to_le32(sizeof(((struct aac_get_config_status_resp *)NULL)->data));
373         }
374
375         status = aac_fib_send(ContainerCommand,
376                             fibptr,
377                             sizeof (struct aac_get_config_status),
378                             FsaNormal,
379                             1, 1,
380                             NULL, NULL);
381         if (status < 0) {
382                 printk(KERN_WARNING "aac_get_config_status: SendFIB failed.\n");
383         } else {
384                 struct aac_get_config_status_resp *reply
385                   = (struct aac_get_config_status_resp *) fib_data(fibptr);
386                 dprintk((KERN_WARNING
387                   "aac_get_config_status: response=%d status=%d action=%d\n",
388                   le32_to_cpu(reply->response),
389                   le32_to_cpu(reply->status),
390                   le32_to_cpu(reply->data.action)));
391                 if ((le32_to_cpu(reply->response) != ST_OK) ||
392                      (le32_to_cpu(reply->status) != CT_OK) ||
393                      (le32_to_cpu(reply->data.action) > CFACT_PAUSE)) {
394                         printk(KERN_WARNING "aac_get_config_status: Will not issue the Commit Configuration\n");
395                         status = -EINVAL;
396                 }
397         }
398         /* Do not set XferState to zero unless receives a response from F/W */
399         if (status >= 0)
400                 aac_fib_complete(fibptr);
401
402         /* Send a CT_COMMIT_CONFIG to enable discovery of devices */
403         if (status >= 0) {
404                 if ((aac_commit == 1) || commit_flag) {
405                         struct aac_commit_config * dinfo;
406                         aac_fib_init(fibptr);
407                         dinfo = (struct aac_commit_config *) fib_data(fibptr);
408
409                         dinfo->command = cpu_to_le32(VM_ContainerConfig);
410                         dinfo->type = cpu_to_le32(CT_COMMIT_CONFIG);
411
412                         status = aac_fib_send(ContainerCommand,
413                                     fibptr,
414                                     sizeof (struct aac_commit_config),
415                                     FsaNormal,
416                                     1, 1,
417                                     NULL, NULL);
418                         /* Do not set XferState to zero unless
419                          * receives a response from F/W */
420                         if (status >= 0)
421                                 aac_fib_complete(fibptr);
422                 } else if (aac_commit == 0) {
423                         printk(KERN_WARNING
424                           "aac_get_config_status: Foreign device configurations are being ignored\n");
425                 }
426         }
427         /* FIB should be freed only after getting the response from the F/W */
428         if (status != -ERESTARTSYS)
429                 aac_fib_free(fibptr);
430         return status;
431 }
432
433 static void aac_expose_phy_device(struct scsi_cmnd *scsicmd)
434 {
435         char inq_data;
436         scsi_sg_copy_to_buffer(scsicmd,  &inq_data, sizeof(inq_data));
437         if ((inq_data & 0x20) && (inq_data & 0x1f) == TYPE_DISK) {
438                 inq_data &= 0xdf;
439                 scsi_sg_copy_from_buffer(scsicmd, &inq_data, sizeof(inq_data));
440         }
441 }
442
443 /**
444  *      aac_get_containers      -       list containers
445  *      @common: adapter to probe
446  *
447  *      Make a list of all containers on this controller
448  */
449 int aac_get_containers(struct aac_dev *dev)
450 {
451         struct fsa_dev_info *fsa_dev_ptr;
452         u32 index;
453         int status = 0;
454         struct fib * fibptr;
455         struct aac_get_container_count *dinfo;
456         struct aac_get_container_count_resp *dresp;
457         int maximum_num_containers = MAXIMUM_NUM_CONTAINERS;
458
459         if (!(fibptr = aac_fib_alloc(dev)))
460                 return -ENOMEM;
461
462         aac_fib_init(fibptr);
463         dinfo = (struct aac_get_container_count *) fib_data(fibptr);
464         dinfo->command = cpu_to_le32(VM_ContainerConfig);
465         dinfo->type = cpu_to_le32(CT_GET_CONTAINER_COUNT);
466
467         status = aac_fib_send(ContainerCommand,
468                     fibptr,
469                     sizeof (struct aac_get_container_count),
470                     FsaNormal,
471                     1, 1,
472                     NULL, NULL);
473         if (status >= 0) {
474                 dresp = (struct aac_get_container_count_resp *)fib_data(fibptr);
475                 maximum_num_containers = le32_to_cpu(dresp->ContainerSwitchEntries);
476                 if (fibptr->dev->supplement_adapter_info.supported_options2 &
477                     AAC_OPTION_SUPPORTED_240_VOLUMES) {
478                         maximum_num_containers =
479                                 le32_to_cpu(dresp->MaxSimpleVolumes);
480                 }
481                 aac_fib_complete(fibptr);
482         }
483         /* FIB should be freed only after getting the response from the F/W */
484         if (status != -ERESTARTSYS)
485                 aac_fib_free(fibptr);
486
487         if (maximum_num_containers < MAXIMUM_NUM_CONTAINERS)
488                 maximum_num_containers = MAXIMUM_NUM_CONTAINERS;
489         if (dev->fsa_dev == NULL ||
490                 dev->maximum_num_containers != maximum_num_containers) {
491
492                 fsa_dev_ptr = dev->fsa_dev;
493
494                 dev->fsa_dev = kcalloc(maximum_num_containers,
495                                         sizeof(*fsa_dev_ptr), GFP_KERNEL);
496
497                 kfree(fsa_dev_ptr);
498                 fsa_dev_ptr = NULL;
499
500
501                 if (!dev->fsa_dev)
502                         return -ENOMEM;
503
504                 dev->maximum_num_containers = maximum_num_containers;
505         }
506         for (index = 0; index < dev->maximum_num_containers; index++) {
507                 dev->fsa_dev[index].devname[0] = '\0';
508                 dev->fsa_dev[index].valid = 0;
509
510                 status = aac_probe_container(dev, index);
511
512                 if (status < 0) {
513                         printk(KERN_WARNING "aac_get_containers: SendFIB failed.\n");
514                         break;
515                 }
516         }
517         return status;
518 }
519
520 static void get_container_name_callback(void *context, struct fib * fibptr)
521 {
522         struct aac_get_name_resp * get_name_reply;
523         struct scsi_cmnd * scsicmd;
524
525         scsicmd = (struct scsi_cmnd *) context;
526
527         if (!aac_valid_context(scsicmd, fibptr))
528                 return;
529
530         dprintk((KERN_DEBUG "get_container_name_callback[cpu %d]: t = %ld.\n", smp_processor_id(), jiffies));
531         BUG_ON(fibptr == NULL);
532
533         get_name_reply = (struct aac_get_name_resp *) fib_data(fibptr);
534         /* Failure is irrelevant, using default value instead */
535         if ((le32_to_cpu(get_name_reply->status) == CT_OK)
536          && (get_name_reply->data[0] != '\0')) {
537                 char *sp = get_name_reply->data;
538                 int data_size = FIELD_SIZEOF(struct aac_get_name_resp, data);
539
540                 sp[data_size - 1] = '\0';
541                 while (*sp == ' ')
542                         ++sp;
543                 if (*sp) {
544                         struct inquiry_data inq;
545                         char d[sizeof(((struct inquiry_data *)NULL)->inqd_pid)];
546                         int count = sizeof(d);
547                         char *dp = d;
548                         do {
549                                 *dp++ = (*sp) ? *sp++ : ' ';
550                         } while (--count > 0);
551
552                         scsi_sg_copy_to_buffer(scsicmd, &inq, sizeof(inq));
553                         memcpy(inq.inqd_pid, d, sizeof(d));
554                         scsi_sg_copy_from_buffer(scsicmd, &inq, sizeof(inq));
555                 }
556         }
557
558         scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
559
560         aac_fib_complete(fibptr);
561         scsicmd->scsi_done(scsicmd);
562 }
563
564 /**
565  *      aac_get_container_name  -       get container name, none blocking.
566  */
567 static int aac_get_container_name(struct scsi_cmnd * scsicmd)
568 {
569         int status;
570         int data_size;
571         struct aac_get_name *dinfo;
572         struct fib * cmd_fibcontext;
573         struct aac_dev * dev;
574
575         dev = (struct aac_dev *)scsicmd->device->host->hostdata;
576
577         data_size = FIELD_SIZEOF(struct aac_get_name_resp, data);
578
579         cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
580
581         aac_fib_init(cmd_fibcontext);
582         dinfo = (struct aac_get_name *) fib_data(cmd_fibcontext);
583         scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
584
585         dinfo->command = cpu_to_le32(VM_ContainerConfig);
586         dinfo->type = cpu_to_le32(CT_READ_NAME);
587         dinfo->cid = cpu_to_le32(scmd_id(scsicmd));
588         dinfo->count = cpu_to_le32(data_size - 1);
589
590         status = aac_fib_send(ContainerCommand,
591                   cmd_fibcontext,
592                   sizeof(struct aac_get_name_resp),
593                   FsaNormal,
594                   0, 1,
595                   (fib_callback)get_container_name_callback,
596                   (void *) scsicmd);
597
598         /*
599          *      Check that the command queued to the controller
600          */
601         if (status == -EINPROGRESS)
602                 return 0;
603
604         printk(KERN_WARNING "aac_get_container_name: aac_fib_send failed with status: %d.\n", status);
605         aac_fib_complete(cmd_fibcontext);
606         return -1;
607 }
608
609 static int aac_probe_container_callback2(struct scsi_cmnd * scsicmd)
610 {
611         struct fsa_dev_info *fsa_dev_ptr = ((struct aac_dev *)(scsicmd->device->host->hostdata))->fsa_dev;
612
613         if ((fsa_dev_ptr[scmd_id(scsicmd)].valid & 1))
614                 return aac_scsi_cmd(scsicmd);
615
616         scsicmd->result = DID_NO_CONNECT << 16;
617         scsicmd->scsi_done(scsicmd);
618         return 0;
619 }
620
621 static void _aac_probe_container2(void * context, struct fib * fibptr)
622 {
623         struct fsa_dev_info *fsa_dev_ptr;
624         int (*callback)(struct scsi_cmnd *);
625         struct scsi_cmnd * scsicmd = (struct scsi_cmnd *)context;
626         int i;
627
628
629         if (!aac_valid_context(scsicmd, fibptr))
630                 return;
631
632         scsicmd->SCp.Status = 0;
633         fsa_dev_ptr = fibptr->dev->fsa_dev;
634         if (fsa_dev_ptr) {
635                 struct aac_mount * dresp = (struct aac_mount *) fib_data(fibptr);
636                 __le32 sup_options2;
637
638                 fsa_dev_ptr += scmd_id(scsicmd);
639                 sup_options2 =
640                         fibptr->dev->supplement_adapter_info.supported_options2;
641
642                 if ((le32_to_cpu(dresp->status) == ST_OK) &&
643                     (le32_to_cpu(dresp->mnt[0].vol) != CT_NONE) &&
644                     (le32_to_cpu(dresp->mnt[0].state) != FSCS_HIDDEN)) {
645                         if (!(sup_options2 & AAC_OPTION_VARIABLE_BLOCK_SIZE)) {
646                                 dresp->mnt[0].fileinfo.bdevinfo.block_size = 0x200;
647                                 fsa_dev_ptr->block_size = 0x200;
648                         } else {
649                                 fsa_dev_ptr->block_size =
650                                         le32_to_cpu(dresp->mnt[0].fileinfo.bdevinfo.block_size);
651                         }
652                         for (i = 0; i < 16; i++)
653                                 fsa_dev_ptr->identifier[i] =
654                                         dresp->mnt[0].fileinfo.bdevinfo
655                                                                 .identifier[i];
656                         fsa_dev_ptr->valid = 1;
657                         /* sense_key holds the current state of the spin-up */
658                         if (dresp->mnt[0].state & cpu_to_le32(FSCS_NOT_READY))
659                                 fsa_dev_ptr->sense_data.sense_key = NOT_READY;
660                         else if (fsa_dev_ptr->sense_data.sense_key == NOT_READY)
661                                 fsa_dev_ptr->sense_data.sense_key = NO_SENSE;
662                         fsa_dev_ptr->type = le32_to_cpu(dresp->mnt[0].vol);
663                         fsa_dev_ptr->size
664                           = ((u64)le32_to_cpu(dresp->mnt[0].capacity)) +
665                             (((u64)le32_to_cpu(dresp->mnt[0].capacityhigh)) << 32);
666                         fsa_dev_ptr->ro = ((le32_to_cpu(dresp->mnt[0].state) & FSCS_READONLY) != 0);
667                 }
668                 if ((fsa_dev_ptr->valid & 1) == 0)
669                         fsa_dev_ptr->valid = 0;
670                 scsicmd->SCp.Status = le32_to_cpu(dresp->count);
671         }
672         aac_fib_complete(fibptr);
673         aac_fib_free(fibptr);
674         callback = (int (*)(struct scsi_cmnd *))(scsicmd->SCp.ptr);
675         scsicmd->SCp.ptr = NULL;
676         (*callback)(scsicmd);
677         return;
678 }
679
680 static void _aac_probe_container1(void * context, struct fib * fibptr)
681 {
682         struct scsi_cmnd * scsicmd;
683         struct aac_mount * dresp;
684         struct aac_query_mount *dinfo;
685         int status;
686
687         dresp = (struct aac_mount *) fib_data(fibptr);
688         if (!aac_supports_2T(fibptr->dev)) {
689                 dresp->mnt[0].capacityhigh = 0;
690                 if ((le32_to_cpu(dresp->status) == ST_OK) &&
691                         (le32_to_cpu(dresp->mnt[0].vol) != CT_NONE)) {
692                         _aac_probe_container2(context, fibptr);
693                         return;
694                 }
695         }
696         scsicmd = (struct scsi_cmnd *) context;
697
698         if (!aac_valid_context(scsicmd, fibptr))
699                 return;
700
701         aac_fib_init(fibptr);
702
703         dinfo = (struct aac_query_mount *)fib_data(fibptr);
704
705         if (fibptr->dev->supplement_adapter_info.supported_options2 &
706             AAC_OPTION_VARIABLE_BLOCK_SIZE)
707                 dinfo->command = cpu_to_le32(VM_NameServeAllBlk);
708         else
709                 dinfo->command = cpu_to_le32(VM_NameServe64);
710
711         dinfo->count = cpu_to_le32(scmd_id(scsicmd));
712         dinfo->type = cpu_to_le32(FT_FILESYS);
713         scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
714
715         status = aac_fib_send(ContainerCommand,
716                           fibptr,
717                           sizeof(struct aac_query_mount),
718                           FsaNormal,
719                           0, 1,
720                           _aac_probe_container2,
721                           (void *) scsicmd);
722         /*
723          *      Check that the command queued to the controller
724          */
725         if (status < 0 && status != -EINPROGRESS) {
726                 /* Inherit results from VM_NameServe, if any */
727                 dresp->status = cpu_to_le32(ST_OK);
728                 _aac_probe_container2(context, fibptr);
729         }
730 }
731
732 static int _aac_probe_container(struct scsi_cmnd * scsicmd, int (*callback)(struct scsi_cmnd *))
733 {
734         struct fib * fibptr;
735         int status = -ENOMEM;
736
737         if ((fibptr = aac_fib_alloc((struct aac_dev *)scsicmd->device->host->hostdata))) {
738                 struct aac_query_mount *dinfo;
739
740                 aac_fib_init(fibptr);
741
742                 dinfo = (struct aac_query_mount *)fib_data(fibptr);
743
744                 if (fibptr->dev->supplement_adapter_info.supported_options2 &
745                     AAC_OPTION_VARIABLE_BLOCK_SIZE)
746                         dinfo->command = cpu_to_le32(VM_NameServeAllBlk);
747                 else
748                         dinfo->command = cpu_to_le32(VM_NameServe);
749
750                 dinfo->count = cpu_to_le32(scmd_id(scsicmd));
751                 dinfo->type = cpu_to_le32(FT_FILESYS);
752                 scsicmd->SCp.ptr = (char *)callback;
753                 scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
754
755                 status = aac_fib_send(ContainerCommand,
756                           fibptr,
757                           sizeof(struct aac_query_mount),
758                           FsaNormal,
759                           0, 1,
760                           _aac_probe_container1,
761                           (void *) scsicmd);
762                 /*
763                  *      Check that the command queued to the controller
764                  */
765                 if (status == -EINPROGRESS)
766                         return 0;
767
768                 if (status < 0) {
769                         scsicmd->SCp.ptr = NULL;
770                         aac_fib_complete(fibptr);
771                         aac_fib_free(fibptr);
772                 }
773         }
774         if (status < 0) {
775                 struct fsa_dev_info *fsa_dev_ptr = ((struct aac_dev *)(scsicmd->device->host->hostdata))->fsa_dev;
776                 if (fsa_dev_ptr) {
777                         fsa_dev_ptr += scmd_id(scsicmd);
778                         if ((fsa_dev_ptr->valid & 1) == 0) {
779                                 fsa_dev_ptr->valid = 0;
780                                 return (*callback)(scsicmd);
781                         }
782                 }
783         }
784         return status;
785 }
786
787 /**
788  *      aac_probe_container             -       query a logical volume
789  *      @dev: device to query
790  *      @cid: container identifier
791  *
792  *      Queries the controller about the given volume. The volume information
793  *      is updated in the struct fsa_dev_info structure rather than returned.
794  */
795 static int aac_probe_container_callback1(struct scsi_cmnd * scsicmd)
796 {
797         scsicmd->device = NULL;
798         return 0;
799 }
800
801 int aac_probe_container(struct aac_dev *dev, int cid)
802 {
803         struct scsi_cmnd *scsicmd = kmalloc(sizeof(*scsicmd), GFP_KERNEL);
804         struct scsi_device *scsidev = kmalloc(sizeof(*scsidev), GFP_KERNEL);
805         int status;
806
807         if (!scsicmd || !scsidev) {
808                 kfree(scsicmd);
809                 kfree(scsidev);
810                 return -ENOMEM;
811         }
812         scsicmd->list.next = NULL;
813         scsicmd->scsi_done = (void (*)(struct scsi_cmnd*))aac_probe_container_callback1;
814
815         scsicmd->device = scsidev;
816         scsidev->sdev_state = 0;
817         scsidev->id = cid;
818         scsidev->host = dev->scsi_host_ptr;
819
820         if (_aac_probe_container(scsicmd, aac_probe_container_callback1) == 0)
821                 while (scsicmd->device == scsidev)
822                         schedule();
823         kfree(scsidev);
824         status = scsicmd->SCp.Status;
825         kfree(scsicmd);
826         return status;
827 }
828
829 /* Local Structure to set SCSI inquiry data strings */
830 struct scsi_inq {
831         char vid[8];         /* Vendor ID */
832         char pid[16];        /* Product ID */
833         char prl[4];         /* Product Revision Level */
834 };
835
836 /**
837  *      InqStrCopy      -       string merge
838  *      @a:     string to copy from
839  *      @b:     string to copy to
840  *
841  *      Copy a String from one location to another
842  *      without copying \0
843  */
844
845 static void inqstrcpy(char *a, char *b)
846 {
847
848         while (*a != (char)0)
849                 *b++ = *a++;
850 }
851
852 static char *container_types[] = {
853         "None",
854         "Volume",
855         "Mirror",
856         "Stripe",
857         "RAID5",
858         "SSRW",
859         "SSRO",
860         "Morph",
861         "Legacy",
862         "RAID4",
863         "RAID10",
864         "RAID00",
865         "V-MIRRORS",
866         "PSEUDO R4",
867         "RAID50",
868         "RAID5D",
869         "RAID5D0",
870         "RAID1E",
871         "RAID6",
872         "RAID60",
873         "Unknown"
874 };
875
876 char * get_container_type(unsigned tindex)
877 {
878         if (tindex >= ARRAY_SIZE(container_types))
879                 tindex = ARRAY_SIZE(container_types) - 1;
880         return container_types[tindex];
881 }
882
883 /* Function: setinqstr
884  *
885  * Arguments: [1] pointer to void [1] int
886  *
887  * Purpose: Sets SCSI inquiry data strings for vendor, product
888  * and revision level. Allows strings to be set in platform dependent
889  * files instead of in OS dependent driver source.
890  */
891
892 static void setinqstr(struct aac_dev *dev, void *data, int tindex)
893 {
894         struct scsi_inq *str;
895         struct aac_supplement_adapter_info *sup_adap_info;
896
897         sup_adap_info = &dev->supplement_adapter_info;
898         str = (struct scsi_inq *)(data); /* cast data to scsi inq block */
899         memset(str, ' ', sizeof(*str));
900
901         if (sup_adap_info->adapter_type_text[0]) {
902                 int c;
903                 char *cp;
904                 char *cname = kmemdup(sup_adap_info->adapter_type_text,
905                                 sizeof(sup_adap_info->adapter_type_text),
906                                                                 GFP_ATOMIC);
907                 if (!cname)
908                         return;
909
910                 cp = cname;
911                 if ((cp[0] == 'A') && (cp[1] == 'O') && (cp[2] == 'C'))
912                         inqstrcpy("SMC", str->vid);
913                 else {
914                         c = sizeof(str->vid);
915                         while (*cp && *cp != ' ' && --c)
916                                 ++cp;
917                         c = *cp;
918                         *cp = '\0';
919                         inqstrcpy(cname, str->vid);
920                         *cp = c;
921                         while (*cp && *cp != ' ')
922                                 ++cp;
923                 }
924                 while (*cp == ' ')
925                         ++cp;
926                 /* last six chars reserved for vol type */
927                 if (strlen(cp) > sizeof(str->pid))
928                         cp[sizeof(str->pid)] = '\0';
929                 inqstrcpy (cp, str->pid);
930
931                 kfree(cname);
932         } else {
933                 struct aac_driver_ident *mp = aac_get_driver_ident(dev->cardtype);
934
935                 inqstrcpy (mp->vname, str->vid);
936                 /* last six chars reserved for vol type */
937                 inqstrcpy (mp->model, str->pid);
938         }
939
940         if (tindex < ARRAY_SIZE(container_types)){
941                 char *findit = str->pid;
942
943                 for ( ; *findit != ' '; findit++); /* walk till we find a space */
944                 /* RAID is superfluous in the context of a RAID device */
945                 if (memcmp(findit-4, "RAID", 4) == 0)
946                         *(findit -= 4) = ' ';
947                 if (((findit - str->pid) + strlen(container_types[tindex]))
948                  < (sizeof(str->pid) + sizeof(str->prl)))
949                         inqstrcpy (container_types[tindex], findit + 1);
950         }
951         inqstrcpy ("V1.0", str->prl);
952 }
953
954 static void build_vpd83_type3(struct tvpd_page83 *vpdpage83data,
955                 struct aac_dev *dev, struct scsi_cmnd *scsicmd)
956 {
957         int container;
958
959         vpdpage83data->type3.codeset = 1;
960         vpdpage83data->type3.identifiertype = 3;
961         vpdpage83data->type3.identifierlength = sizeof(vpdpage83data->type3)
962                         - 4;
963
964         for (container = 0; container < dev->maximum_num_containers;
965                         container++) {
966
967                 if (scmd_id(scsicmd) == container) {
968                         memcpy(vpdpage83data->type3.Identifier,
969                                         dev->fsa_dev[container].identifier,
970                                         16);
971                         break;
972                 }
973         }
974 }
975
976 static void get_container_serial_callback(void *context, struct fib * fibptr)
977 {
978         struct aac_get_serial_resp * get_serial_reply;
979         struct scsi_cmnd * scsicmd;
980
981         BUG_ON(fibptr == NULL);
982
983         scsicmd = (struct scsi_cmnd *) context;
984         if (!aac_valid_context(scsicmd, fibptr))
985                 return;
986
987         get_serial_reply = (struct aac_get_serial_resp *) fib_data(fibptr);
988         /* Failure is irrelevant, using default value instead */
989         if (le32_to_cpu(get_serial_reply->status) == CT_OK) {
990                 /*Check to see if it's for VPD 0x83 or 0x80 */
991                 if (scsicmd->cmnd[2] == 0x83) {
992                         /* vpd page 0x83 - Device Identification Page */
993                         struct aac_dev *dev;
994                         int i;
995                         struct tvpd_page83 vpdpage83data;
996
997                         dev = (struct aac_dev *)scsicmd->device->host->hostdata;
998
999                         memset(((u8 *)&vpdpage83data), 0,
1000                                sizeof(vpdpage83data));
1001
1002                         /* DIRECT_ACCESS_DEVIC */
1003                         vpdpage83data.DeviceType = 0;
1004                         /* DEVICE_CONNECTED */
1005                         vpdpage83data.DeviceTypeQualifier = 0;
1006                         /* VPD_DEVICE_IDENTIFIERS */
1007                         vpdpage83data.PageCode = 0x83;
1008                         vpdpage83data.reserved = 0;
1009                         vpdpage83data.PageLength =
1010                                 sizeof(vpdpage83data.type1) +
1011                                 sizeof(vpdpage83data.type2);
1012
1013                         /* VPD 83 Type 3 is not supported for ARC */
1014                         if (dev->sa_firmware)
1015                                 vpdpage83data.PageLength +=
1016                                 sizeof(vpdpage83data.type3);
1017
1018                         /* T10 Vendor Identifier Field Format */
1019                         /* VpdcodesetAscii */
1020                         vpdpage83data.type1.codeset = 2;
1021                         /* VpdIdentifierTypeVendorId */
1022                         vpdpage83data.type1.identifiertype = 1;
1023                         vpdpage83data.type1.identifierlength =
1024                                 sizeof(vpdpage83data.type1) - 4;
1025
1026                         /* "ADAPTEC " for adaptec */
1027                         memcpy(vpdpage83data.type1.venid,
1028                                 "ADAPTEC ",
1029                                 sizeof(vpdpage83data.type1.venid));
1030                         memcpy(vpdpage83data.type1.productid,
1031                                 "ARRAY           ",
1032                                 sizeof(
1033                                 vpdpage83data.type1.productid));
1034
1035                         /* Convert to ascii based serial number.
1036                          * The LSB is the the end.
1037                          */
1038                         for (i = 0; i < 8; i++) {
1039                                 u8 temp =
1040                                         (u8)((get_serial_reply->uid >> ((7 - i) * 4)) & 0xF);
1041                                 if (temp  > 0x9) {
1042                                         vpdpage83data.type1.serialnumber[i] =
1043                                                         'A' + (temp - 0xA);
1044                                 } else {
1045                                         vpdpage83data.type1.serialnumber[i] =
1046                                                         '0' + temp;
1047                                 }
1048                         }
1049
1050                         /* VpdCodeSetBinary */
1051                         vpdpage83data.type2.codeset = 1;
1052                         /* VpdidentifiertypeEUI64 */
1053                         vpdpage83data.type2.identifiertype = 2;
1054                         vpdpage83data.type2.identifierlength =
1055                                 sizeof(vpdpage83data.type2) - 4;
1056
1057                         vpdpage83data.type2.eu64id.venid[0] = 0xD0;
1058                         vpdpage83data.type2.eu64id.venid[1] = 0;
1059                         vpdpage83data.type2.eu64id.venid[2] = 0;
1060
1061                         vpdpage83data.type2.eu64id.Serial =
1062                                                         get_serial_reply->uid;
1063                         vpdpage83data.type2.eu64id.reserved = 0;
1064
1065                         /*
1066                          * VpdIdentifierTypeFCPHName
1067                          * VPD 0x83 Type 3 not supported for ARC
1068                          */
1069                         if (dev->sa_firmware) {
1070                                 build_vpd83_type3(&vpdpage83data,
1071                                                 dev, scsicmd);
1072                         }
1073
1074                         /* Move the inquiry data to the response buffer. */
1075                         scsi_sg_copy_from_buffer(scsicmd, &vpdpage83data,
1076                                                  sizeof(vpdpage83data));
1077                 } else {
1078                         /* It must be for VPD 0x80 */
1079                         char sp[13];
1080                         /* EVPD bit set */
1081                         sp[0] = INQD_PDT_DA;
1082                         sp[1] = scsicmd->cmnd[2];
1083                         sp[2] = 0;
1084                         sp[3] = snprintf(sp+4, sizeof(sp)-4, "%08X",
1085                                 le32_to_cpu(get_serial_reply->uid));
1086                         scsi_sg_copy_from_buffer(scsicmd, sp,
1087                                                  sizeof(sp));
1088                 }
1089         }
1090
1091         scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
1092
1093         aac_fib_complete(fibptr);
1094         scsicmd->scsi_done(scsicmd);
1095 }
1096
1097 /**
1098  *      aac_get_container_serial - get container serial, none blocking.
1099  */
1100 static int aac_get_container_serial(struct scsi_cmnd * scsicmd)
1101 {
1102         int status;
1103         struct aac_get_serial *dinfo;
1104         struct fib * cmd_fibcontext;
1105         struct aac_dev * dev;
1106
1107         dev = (struct aac_dev *)scsicmd->device->host->hostdata;
1108
1109         cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
1110
1111         aac_fib_init(cmd_fibcontext);
1112         dinfo = (struct aac_get_serial *) fib_data(cmd_fibcontext);
1113
1114         dinfo->command = cpu_to_le32(VM_ContainerConfig);
1115         dinfo->type = cpu_to_le32(CT_CID_TO_32BITS_UID);
1116         dinfo->cid = cpu_to_le32(scmd_id(scsicmd));
1117         scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
1118
1119         status = aac_fib_send(ContainerCommand,
1120                   cmd_fibcontext,
1121                   sizeof(struct aac_get_serial_resp),
1122                   FsaNormal,
1123                   0, 1,
1124                   (fib_callback) get_container_serial_callback,
1125                   (void *) scsicmd);
1126
1127         /*
1128          *      Check that the command queued to the controller
1129          */
1130         if (status == -EINPROGRESS)
1131                 return 0;
1132
1133         printk(KERN_WARNING "aac_get_container_serial: aac_fib_send failed with status: %d.\n", status);
1134         aac_fib_complete(cmd_fibcontext);
1135         return -1;
1136 }
1137
1138 /* Function: setinqserial
1139  *
1140  * Arguments: [1] pointer to void [1] int
1141  *
1142  * Purpose: Sets SCSI Unit Serial number.
1143  *          This is a fake. We should read a proper
1144  *          serial number from the container. <SuSE>But
1145  *          without docs it's quite hard to do it :-)
1146  *          So this will have to do in the meantime.</SuSE>
1147  */
1148
1149 static int setinqserial(struct aac_dev *dev, void *data, int cid)
1150 {
1151         /*
1152          *      This breaks array migration.
1153          */
1154         return snprintf((char *)(data), sizeof(struct scsi_inq) - 4, "%08X%02X",
1155                         le32_to_cpu(dev->adapter_info.serial[0]), cid);
1156 }
1157
1158 static inline void set_sense(struct sense_data *sense_data, u8 sense_key,
1159         u8 sense_code, u8 a_sense_code, u8 bit_pointer, u16 field_pointer)
1160 {
1161         u8 *sense_buf = (u8 *)sense_data;
1162         /* Sense data valid, err code 70h */
1163         sense_buf[0] = 0x70; /* No info field */
1164         sense_buf[1] = 0;       /* Segment number, always zero */
1165
1166         sense_buf[2] = sense_key;       /* Sense key */
1167
1168         sense_buf[12] = sense_code;     /* Additional sense code */
1169         sense_buf[13] = a_sense_code;   /* Additional sense code qualifier */
1170
1171         if (sense_key == ILLEGAL_REQUEST) {
1172                 sense_buf[7] = 10;      /* Additional sense length */
1173
1174                 sense_buf[15] = bit_pointer;
1175                 /* Illegal parameter is in the parameter block */
1176                 if (sense_code == SENCODE_INVALID_CDB_FIELD)
1177                         sense_buf[15] |= 0xc0;/* Std sense key specific field */
1178                 /* Illegal parameter is in the CDB block */
1179                 sense_buf[16] = field_pointer >> 8;     /* MSB */
1180                 sense_buf[17] = field_pointer;          /* LSB */
1181         } else
1182                 sense_buf[7] = 6;       /* Additional sense length */
1183 }
1184
1185 static int aac_bounds_32(struct aac_dev * dev, struct scsi_cmnd * cmd, u64 lba)
1186 {
1187         if (lba & 0xffffffff00000000LL) {
1188                 int cid = scmd_id(cmd);
1189                 dprintk((KERN_DEBUG "aacraid: Illegal lba\n"));
1190                 cmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
1191                         SAM_STAT_CHECK_CONDITION;
1192                 set_sense(&dev->fsa_dev[cid].sense_data,
1193                   HARDWARE_ERROR, SENCODE_INTERNAL_TARGET_FAILURE,
1194                   ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0);
1195                 memcpy(cmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
1196                        min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
1197                              SCSI_SENSE_BUFFERSIZE));
1198                 cmd->scsi_done(cmd);
1199                 return 1;
1200         }
1201         return 0;
1202 }
1203
1204 static int aac_bounds_64(struct aac_dev * dev, struct scsi_cmnd * cmd, u64 lba)
1205 {
1206         return 0;
1207 }
1208
1209 static void io_callback(void *context, struct fib * fibptr);
1210
1211 static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count)
1212 {
1213         struct aac_dev *dev = fib->dev;
1214         u16 fibsize, command;
1215         long ret;
1216
1217         aac_fib_init(fib);
1218         if ((dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 ||
1219                 dev->comm_interface == AAC_COMM_MESSAGE_TYPE3) &&
1220                 !dev->sync_mode) {
1221                 struct aac_raw_io2 *readcmd2;
1222                 readcmd2 = (struct aac_raw_io2 *) fib_data(fib);
1223                 memset(readcmd2, 0, sizeof(struct aac_raw_io2));
1224                 readcmd2->blockLow = cpu_to_le32((u32)(lba&0xffffffff));
1225                 readcmd2->blockHigh = cpu_to_le32((u32)((lba&0xffffffff00000000LL)>>32));
1226                 readcmd2->byteCount = cpu_to_le32(count *
1227                         dev->fsa_dev[scmd_id(cmd)].block_size);
1228                 readcmd2->cid = cpu_to_le16(scmd_id(cmd));
1229                 readcmd2->flags = cpu_to_le16(RIO2_IO_TYPE_READ);
1230                 ret = aac_build_sgraw2(cmd, readcmd2,
1231                                 dev->scsi_host_ptr->sg_tablesize);
1232                 if (ret < 0)
1233                         return ret;
1234                 command = ContainerRawIo2;
1235                 fibsize = sizeof(struct aac_raw_io2) +
1236                         ((le32_to_cpu(readcmd2->sgeCnt)-1) * sizeof(struct sge_ieee1212));
1237         } else {
1238                 struct aac_raw_io *readcmd;
1239                 readcmd = (struct aac_raw_io *) fib_data(fib);
1240                 readcmd->block[0] = cpu_to_le32((u32)(lba&0xffffffff));
1241                 readcmd->block[1] = cpu_to_le32((u32)((lba&0xffffffff00000000LL)>>32));
1242                 readcmd->count = cpu_to_le32(count *
1243                         dev->fsa_dev[scmd_id(cmd)].block_size);
1244                 readcmd->cid = cpu_to_le16(scmd_id(cmd));
1245                 readcmd->flags = cpu_to_le16(RIO_TYPE_READ);
1246                 readcmd->bpTotal = 0;
1247                 readcmd->bpComplete = 0;
1248                 ret = aac_build_sgraw(cmd, &readcmd->sg);
1249                 if (ret < 0)
1250                         return ret;
1251                 command = ContainerRawIo;
1252                 fibsize = sizeof(struct aac_raw_io) +
1253                         ((le32_to_cpu(readcmd->sg.count)-1) * sizeof(struct sgentryraw));
1254         }
1255
1256         BUG_ON(fibsize > (fib->dev->max_fib_size - sizeof(struct aac_fibhdr)));
1257         /*
1258          *      Now send the Fib to the adapter
1259          */
1260         return aac_fib_send(command,
1261                           fib,
1262                           fibsize,
1263                           FsaNormal,
1264                           0, 1,
1265                           (fib_callback) io_callback,
1266                           (void *) cmd);
1267 }
1268
1269 static int aac_read_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count)
1270 {
1271         u16 fibsize;
1272         struct aac_read64 *readcmd;
1273         long ret;
1274
1275         aac_fib_init(fib);
1276         readcmd = (struct aac_read64 *) fib_data(fib);
1277         readcmd->command = cpu_to_le32(VM_CtHostRead64);
1278         readcmd->cid = cpu_to_le16(scmd_id(cmd));
1279         readcmd->sector_count = cpu_to_le16(count);
1280         readcmd->block = cpu_to_le32((u32)(lba&0xffffffff));
1281         readcmd->pad   = 0;
1282         readcmd->flags = 0;
1283
1284         ret = aac_build_sg64(cmd, &readcmd->sg);
1285         if (ret < 0)
1286                 return ret;
1287         fibsize = sizeof(struct aac_read64) +
1288                 ((le32_to_cpu(readcmd->sg.count) - 1) *
1289                  sizeof (struct sgentry64));
1290         BUG_ON (fibsize > (fib->dev->max_fib_size -
1291                                 sizeof(struct aac_fibhdr)));
1292         /*
1293          *      Now send the Fib to the adapter
1294          */
1295         return aac_fib_send(ContainerCommand64,
1296                           fib,
1297                           fibsize,
1298                           FsaNormal,
1299                           0, 1,
1300                           (fib_callback) io_callback,
1301                           (void *) cmd);
1302 }
1303
1304 static int aac_read_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count)
1305 {
1306         u16 fibsize;
1307         struct aac_read *readcmd;
1308         struct aac_dev *dev = fib->dev;
1309         long ret;
1310
1311         aac_fib_init(fib);
1312         readcmd = (struct aac_read *) fib_data(fib);
1313         readcmd->command = cpu_to_le32(VM_CtBlockRead);
1314         readcmd->cid = cpu_to_le32(scmd_id(cmd));
1315         readcmd->block = cpu_to_le32((u32)(lba&0xffffffff));
1316         readcmd->count = cpu_to_le32(count *
1317                 dev->fsa_dev[scmd_id(cmd)].block_size);
1318
1319         ret = aac_build_sg(cmd, &readcmd->sg);
1320         if (ret < 0)
1321                 return ret;
1322         fibsize = sizeof(struct aac_read) +
1323                         ((le32_to_cpu(readcmd->sg.count) - 1) *
1324                          sizeof (struct sgentry));
1325         BUG_ON (fibsize > (fib->dev->max_fib_size -
1326                                 sizeof(struct aac_fibhdr)));
1327         /*
1328          *      Now send the Fib to the adapter
1329          */
1330         return aac_fib_send(ContainerCommand,
1331                           fib,
1332                           fibsize,
1333                           FsaNormal,
1334                           0, 1,
1335                           (fib_callback) io_callback,
1336                           (void *) cmd);
1337 }
1338
1339 static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count, int fua)
1340 {
1341         struct aac_dev *dev = fib->dev;
1342         u16 fibsize, command;
1343         long ret;
1344
1345         aac_fib_init(fib);
1346         if ((dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 ||
1347                 dev->comm_interface == AAC_COMM_MESSAGE_TYPE3) &&
1348                 !dev->sync_mode) {
1349                 struct aac_raw_io2 *writecmd2;
1350                 writecmd2 = (struct aac_raw_io2 *) fib_data(fib);
1351                 memset(writecmd2, 0, sizeof(struct aac_raw_io2));
1352                 writecmd2->blockLow = cpu_to_le32((u32)(lba&0xffffffff));
1353                 writecmd2->blockHigh = cpu_to_le32((u32)((lba&0xffffffff00000000LL)>>32));
1354                 writecmd2->byteCount = cpu_to_le32(count *
1355                         dev->fsa_dev[scmd_id(cmd)].block_size);
1356                 writecmd2->cid = cpu_to_le16(scmd_id(cmd));
1357                 writecmd2->flags = (fua && ((aac_cache & 5) != 1) &&
1358                                                    (((aac_cache & 5) != 5) || !fib->dev->cache_protected)) ?
1359                         cpu_to_le16(RIO2_IO_TYPE_WRITE|RIO2_IO_SUREWRITE) :
1360                         cpu_to_le16(RIO2_IO_TYPE_WRITE);
1361                 ret = aac_build_sgraw2(cmd, writecmd2,
1362                                 dev->scsi_host_ptr->sg_tablesize);
1363                 if (ret < 0)
1364                         return ret;
1365                 command = ContainerRawIo2;
1366                 fibsize = sizeof(struct aac_raw_io2) +
1367                         ((le32_to_cpu(writecmd2->sgeCnt)-1) * sizeof(struct sge_ieee1212));
1368         } else {
1369                 struct aac_raw_io *writecmd;
1370                 writecmd = (struct aac_raw_io *) fib_data(fib);
1371                 writecmd->block[0] = cpu_to_le32((u32)(lba&0xffffffff));
1372                 writecmd->block[1] = cpu_to_le32((u32)((lba&0xffffffff00000000LL)>>32));
1373                 writecmd->count = cpu_to_le32(count *
1374                         dev->fsa_dev[scmd_id(cmd)].block_size);
1375                 writecmd->cid = cpu_to_le16(scmd_id(cmd));
1376                 writecmd->flags = (fua && ((aac_cache & 5) != 1) &&
1377                                                    (((aac_cache & 5) != 5) || !fib->dev->cache_protected)) ?
1378                         cpu_to_le16(RIO_TYPE_WRITE|RIO_SUREWRITE) :
1379                         cpu_to_le16(RIO_TYPE_WRITE);
1380                 writecmd->bpTotal = 0;
1381                 writecmd->bpComplete = 0;
1382                 ret = aac_build_sgraw(cmd, &writecmd->sg);
1383                 if (ret < 0)
1384                         return ret;
1385                 command = ContainerRawIo;
1386                 fibsize = sizeof(struct aac_raw_io) +
1387                         ((le32_to_cpu(writecmd->sg.count)-1) * sizeof (struct sgentryraw));
1388         }
1389
1390         BUG_ON(fibsize > (fib->dev->max_fib_size - sizeof(struct aac_fibhdr)));
1391         /*
1392          *      Now send the Fib to the adapter
1393          */
1394         return aac_fib_send(command,
1395                           fib,
1396                           fibsize,
1397                           FsaNormal,
1398                           0, 1,
1399                           (fib_callback) io_callback,
1400                           (void *) cmd);
1401 }
1402
1403 static int aac_write_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count, int fua)
1404 {
1405         u16 fibsize;
1406         struct aac_write64 *writecmd;
1407         long ret;
1408
1409         aac_fib_init(fib);
1410         writecmd = (struct aac_write64 *) fib_data(fib);
1411         writecmd->command = cpu_to_le32(VM_CtHostWrite64);
1412         writecmd->cid = cpu_to_le16(scmd_id(cmd));
1413         writecmd->sector_count = cpu_to_le16(count);
1414         writecmd->block = cpu_to_le32((u32)(lba&0xffffffff));
1415         writecmd->pad   = 0;
1416         writecmd->flags = 0;
1417
1418         ret = aac_build_sg64(cmd, &writecmd->sg);
1419         if (ret < 0)
1420                 return ret;
1421         fibsize = sizeof(struct aac_write64) +
1422                 ((le32_to_cpu(writecmd->sg.count) - 1) *
1423                  sizeof (struct sgentry64));
1424         BUG_ON (fibsize > (fib->dev->max_fib_size -
1425                                 sizeof(struct aac_fibhdr)));
1426         /*
1427          *      Now send the Fib to the adapter
1428          */
1429         return aac_fib_send(ContainerCommand64,
1430                           fib,
1431                           fibsize,
1432                           FsaNormal,
1433                           0, 1,
1434                           (fib_callback) io_callback,
1435                           (void *) cmd);
1436 }
1437
1438 static int aac_write_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count, int fua)
1439 {
1440         u16 fibsize;
1441         struct aac_write *writecmd;
1442         struct aac_dev *dev = fib->dev;
1443         long ret;
1444
1445         aac_fib_init(fib);
1446         writecmd = (struct aac_write *) fib_data(fib);
1447         writecmd->command = cpu_to_le32(VM_CtBlockWrite);
1448         writecmd->cid = cpu_to_le32(scmd_id(cmd));
1449         writecmd->block = cpu_to_le32((u32)(lba&0xffffffff));
1450         writecmd->count = cpu_to_le32(count *
1451                 dev->fsa_dev[scmd_id(cmd)].block_size);
1452         writecmd->sg.count = cpu_to_le32(1);
1453         /* ->stable is not used - it did mean which type of write */
1454
1455         ret = aac_build_sg(cmd, &writecmd->sg);
1456         if (ret < 0)
1457                 return ret;
1458         fibsize = sizeof(struct aac_write) +
1459                 ((le32_to_cpu(writecmd->sg.count) - 1) *
1460                  sizeof (struct sgentry));
1461         BUG_ON (fibsize > (fib->dev->max_fib_size -
1462                                 sizeof(struct aac_fibhdr)));
1463         /*
1464          *      Now send the Fib to the adapter
1465          */
1466         return aac_fib_send(ContainerCommand,
1467                           fib,
1468                           fibsize,
1469                           FsaNormal,
1470                           0, 1,
1471                           (fib_callback) io_callback,
1472                           (void *) cmd);
1473 }
1474
1475 static struct aac_srb * aac_scsi_common(struct fib * fib, struct scsi_cmnd * cmd)
1476 {
1477         struct aac_srb * srbcmd;
1478         u32 flag;
1479         u32 timeout;
1480         struct aac_dev *dev = fib->dev;
1481
1482         aac_fib_init(fib);
1483         switch(cmd->sc_data_direction){
1484         case DMA_TO_DEVICE:
1485                 flag = SRB_DataOut;
1486                 break;
1487         case DMA_BIDIRECTIONAL:
1488                 flag = SRB_DataIn | SRB_DataOut;
1489                 break;
1490         case DMA_FROM_DEVICE:
1491                 flag = SRB_DataIn;
1492                 break;
1493         case DMA_NONE:
1494         default:        /* shuts up some versions of gcc */
1495                 flag = SRB_NoDataXfer;
1496                 break;
1497         }
1498
1499         srbcmd = (struct aac_srb*) fib_data(fib);
1500         srbcmd->function = cpu_to_le32(SRBF_ExecuteScsi);
1501         srbcmd->channel  = cpu_to_le32(aac_logical_to_phys(scmd_channel(cmd)));
1502         srbcmd->id       = cpu_to_le32(scmd_id(cmd));
1503         srbcmd->lun      = cpu_to_le32(cmd->device->lun);
1504         srbcmd->flags    = cpu_to_le32(flag);
1505         timeout = cmd->request->timeout/HZ;
1506         if (timeout == 0)
1507                 timeout = (dev->sa_firmware ? AAC_SA_TIMEOUT : AAC_ARC_TIMEOUT);
1508         srbcmd->timeout  = cpu_to_le32(timeout);  // timeout in seconds
1509         srbcmd->retry_limit = 0; /* Obsolete parameter */
1510         srbcmd->cdb_size = cpu_to_le32(cmd->cmd_len);
1511         return srbcmd;
1512 }
1513
1514 static struct aac_hba_cmd_req *aac_construct_hbacmd(struct fib *fib,
1515                                                         struct scsi_cmnd *cmd)
1516 {
1517         struct aac_hba_cmd_req *hbacmd;
1518         struct aac_dev *dev;
1519         int bus, target;
1520         u64 address;
1521
1522         dev = (struct aac_dev *)cmd->device->host->hostdata;
1523
1524         hbacmd = (struct aac_hba_cmd_req *)fib->hw_fib_va;
1525         memset(hbacmd, 0, 96);  /* sizeof(*hbacmd) is not necessary */
1526         /* iu_type is a parameter of aac_hba_send */
1527         switch (cmd->sc_data_direction) {
1528         case DMA_TO_DEVICE:
1529                 hbacmd->byte1 = 2;
1530                 break;
1531         case DMA_FROM_DEVICE:
1532         case DMA_BIDIRECTIONAL:
1533                 hbacmd->byte1 = 1;
1534                 break;
1535         case DMA_NONE:
1536         default:
1537                 break;
1538         }
1539         hbacmd->lun[1] = cpu_to_le32(cmd->device->lun);
1540
1541         bus = aac_logical_to_phys(scmd_channel(cmd));
1542         target = scmd_id(cmd);
1543         hbacmd->it_nexus = dev->hba_map[bus][target].rmw_nexus;
1544
1545         /* we fill in reply_qid later in aac_src_deliver_message */
1546         /* we fill in iu_type, request_id later in aac_hba_send */
1547         /* we fill in emb_data_desc_count later in aac_build_sghba */
1548
1549         memcpy(hbacmd->cdb, cmd->cmnd, cmd->cmd_len);
1550         hbacmd->data_length = cpu_to_le32(scsi_bufflen(cmd));
1551
1552         address = (u64)fib->hw_error_pa;
1553         hbacmd->error_ptr_hi = cpu_to_le32((u32)(address >> 32));
1554         hbacmd->error_ptr_lo = cpu_to_le32((u32)(address & 0xffffffff));
1555         hbacmd->error_length = cpu_to_le32(FW_ERROR_BUFFER_SIZE);
1556
1557         return hbacmd;
1558 }
1559
1560 static void aac_srb_callback(void *context, struct fib * fibptr);
1561
1562 static int aac_scsi_64(struct fib * fib, struct scsi_cmnd * cmd)
1563 {
1564         u16 fibsize;
1565         struct aac_srb * srbcmd = aac_scsi_common(fib, cmd);
1566         long ret;
1567
1568         ret = aac_build_sg64(cmd, (struct sgmap64 *) &srbcmd->sg);
1569         if (ret < 0)
1570                 return ret;
1571         srbcmd->count = cpu_to_le32(scsi_bufflen(cmd));
1572
1573         memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb));
1574         memcpy(srbcmd->cdb, cmd->cmnd, cmd->cmd_len);
1575         /*
1576          *      Build Scatter/Gather list
1577          */
1578         fibsize = sizeof (struct aac_srb) - sizeof (struct sgentry) +
1579                 ((le32_to_cpu(srbcmd->sg.count) & 0xff) *
1580                  sizeof (struct sgentry64));
1581         BUG_ON (fibsize > (fib->dev->max_fib_size -
1582                                 sizeof(struct aac_fibhdr)));
1583
1584         /*
1585          *      Now send the Fib to the adapter
1586          */
1587         return aac_fib_send(ScsiPortCommand64, fib,
1588                                 fibsize, FsaNormal, 0, 1,
1589                                   (fib_callback) aac_srb_callback,
1590                                   (void *) cmd);
1591 }
1592
1593 static int aac_scsi_32(struct fib * fib, struct scsi_cmnd * cmd)
1594 {
1595         u16 fibsize;
1596         struct aac_srb * srbcmd = aac_scsi_common(fib, cmd);
1597         long ret;
1598
1599         ret = aac_build_sg(cmd, (struct sgmap *)&srbcmd->sg);
1600         if (ret < 0)
1601                 return ret;
1602         srbcmd->count = cpu_to_le32(scsi_bufflen(cmd));
1603
1604         memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb));
1605         memcpy(srbcmd->cdb, cmd->cmnd, cmd->cmd_len);
1606         /*
1607          *      Build Scatter/Gather list
1608          */
1609         fibsize = sizeof (struct aac_srb) +
1610                 (((le32_to_cpu(srbcmd->sg.count) & 0xff) - 1) *
1611                  sizeof (struct sgentry));
1612         BUG_ON (fibsize > (fib->dev->max_fib_size -
1613                                 sizeof(struct aac_fibhdr)));
1614
1615         /*
1616          *      Now send the Fib to the adapter
1617          */
1618         return aac_fib_send(ScsiPortCommand, fib, fibsize, FsaNormal, 0, 1,
1619                                   (fib_callback) aac_srb_callback, (void *) cmd);
1620 }
1621
1622 static int aac_scsi_32_64(struct fib * fib, struct scsi_cmnd * cmd)
1623 {
1624         if ((sizeof(dma_addr_t) > 4) && fib->dev->needs_dac &&
1625             (fib->dev->adapter_info.options & AAC_OPT_SGMAP_HOST64))
1626                 return FAILED;
1627         return aac_scsi_32(fib, cmd);
1628 }
1629
1630 static int aac_adapter_hba(struct fib *fib, struct scsi_cmnd *cmd)
1631 {
1632         struct aac_hba_cmd_req *hbacmd = aac_construct_hbacmd(fib, cmd);
1633         struct aac_dev *dev;
1634         long ret;
1635
1636         dev = (struct aac_dev *)cmd->device->host->hostdata;
1637
1638         ret = aac_build_sghba(cmd, hbacmd,
1639                 dev->scsi_host_ptr->sg_tablesize, (u64)fib->hw_sgl_pa);
1640         if (ret < 0)
1641                 return ret;
1642
1643         /*
1644          *      Now send the HBA command to the adapter
1645          */
1646         fib->hbacmd_size = 64 + le32_to_cpu(hbacmd->emb_data_desc_count) *
1647                 sizeof(struct aac_hba_sgl);
1648
1649         return aac_hba_send(HBA_IU_TYPE_SCSI_CMD_REQ, fib,
1650                                   (fib_callback) aac_hba_callback,
1651                                   (void *) cmd);
1652 }
1653
1654 static int aac_send_safw_bmic_cmd(struct aac_dev *dev,
1655         struct aac_srb_unit *srbu, void *xfer_buf, int xfer_len)
1656 {
1657         struct fib      *fibptr;
1658         dma_addr_t      addr;
1659         int             rcode;
1660         int             fibsize;
1661         struct aac_srb  *srb;
1662         struct aac_srb_reply *srb_reply;
1663         struct sgmap64  *sg64;
1664         u32 vbus;
1665         u32 vid;
1666
1667         if (!dev->sa_firmware)
1668                 return 0;
1669
1670         /* allocate FIB */
1671         fibptr = aac_fib_alloc(dev);
1672         if (!fibptr)
1673                 return -ENOMEM;
1674
1675         aac_fib_init(fibptr);
1676         fibptr->hw_fib_va->header.XferState &=
1677                 ~cpu_to_le32(FastResponseCapable);
1678
1679         fibsize  = sizeof(struct aac_srb) - sizeof(struct sgentry) +
1680                                                 sizeof(struct sgentry64);
1681
1682         /* allocate DMA buffer for response */
1683         addr = dma_map_single(&dev->pdev->dev, xfer_buf, xfer_len,
1684                                                         DMA_BIDIRECTIONAL);
1685         if (dma_mapping_error(&dev->pdev->dev, addr)) {
1686                 rcode = -ENOMEM;
1687                 goto fib_error;
1688         }
1689
1690         srb = fib_data(fibptr);
1691         memcpy(srb, &srbu->srb, sizeof(struct aac_srb));
1692
1693         vbus = (u32)le16_to_cpu(
1694                         dev->supplement_adapter_info.virt_device_bus);
1695         vid  = (u32)le16_to_cpu(
1696                         dev->supplement_adapter_info.virt_device_target);
1697
1698         /* set the common request fields */
1699         srb->channel            = cpu_to_le32(vbus);
1700         srb->id                 = cpu_to_le32(vid);
1701         srb->lun                = 0;
1702         srb->function           = cpu_to_le32(SRBF_ExecuteScsi);
1703         srb->timeout            = 0;
1704         srb->retry_limit        = 0;
1705         srb->cdb_size           = cpu_to_le32(16);
1706         srb->count              = cpu_to_le32(xfer_len);
1707
1708         sg64 = (struct sgmap64 *)&srb->sg;
1709         sg64->count             = cpu_to_le32(1);
1710         sg64->sg[0].addr[1]     = cpu_to_le32(upper_32_bits(addr));
1711         sg64->sg[0].addr[0]     = cpu_to_le32(lower_32_bits(addr));
1712         sg64->sg[0].count       = cpu_to_le32(xfer_len);
1713
1714         /*
1715          * Copy the updated data for other dumping or other usage if needed
1716          */
1717         memcpy(&srbu->srb, srb, sizeof(struct aac_srb));
1718
1719         /* issue request to the controller */
1720         rcode = aac_fib_send(ScsiPortCommand64, fibptr, fibsize, FsaNormal,
1721                                         1, 1, NULL, NULL);
1722
1723         if (rcode == -ERESTARTSYS)
1724                 rcode = -ERESTART;
1725
1726         if (unlikely(rcode < 0))
1727                 goto bmic_error;
1728
1729         srb_reply = (struct aac_srb_reply *)fib_data(fibptr);
1730         memcpy(&srbu->srb_reply, srb_reply, sizeof(struct aac_srb_reply));
1731
1732 bmic_error:
1733         dma_unmap_single(&dev->pdev->dev, addr, xfer_len, DMA_BIDIRECTIONAL);
1734 fib_error:
1735         aac_fib_complete(fibptr);
1736         aac_fib_free(fibptr);
1737         return rcode;
1738 }
1739
1740 static void aac_set_safw_target_qd(struct aac_dev *dev, int bus, int target)
1741 {
1742
1743         struct aac_ciss_identify_pd *identify_resp;
1744
1745         if (dev->hba_map[bus][target].devtype != AAC_DEVTYPE_NATIVE_RAW)
1746                 return;
1747
1748         identify_resp = dev->hba_map[bus][target].safw_identify_resp;
1749         if (identify_resp == NULL) {
1750                 dev->hba_map[bus][target].qd_limit = 32;
1751                 return;
1752         }
1753
1754         if (identify_resp->current_queue_depth_limit <= 0 ||
1755                 identify_resp->current_queue_depth_limit > 255)
1756                 dev->hba_map[bus][target].qd_limit = 32;
1757         else
1758                 dev->hba_map[bus][target].qd_limit =
1759                         identify_resp->current_queue_depth_limit;
1760 }
1761
1762 static int aac_issue_safw_bmic_identify(struct aac_dev *dev,
1763         struct aac_ciss_identify_pd **identify_resp, u32 bus, u32 target)
1764 {
1765         int rcode = -ENOMEM;
1766         int datasize;
1767         struct aac_srb_unit srbu;
1768         struct aac_srb *srbcmd;
1769         struct aac_ciss_identify_pd *identify_reply;
1770
1771         datasize = sizeof(struct aac_ciss_identify_pd);
1772         identify_reply = kmalloc(datasize, GFP_KERNEL);
1773         if (!identify_reply)
1774                 goto out;
1775
1776         memset(&srbu, 0, sizeof(struct aac_srb_unit));
1777
1778         srbcmd = &srbu.srb;
1779         srbcmd->flags   = cpu_to_le32(SRB_DataIn);
1780         srbcmd->cdb[0]  = 0x26;
1781         srbcmd->cdb[2]  = (u8)((AAC_MAX_LUN + target) & 0x00FF);
1782         srbcmd->cdb[6]  = CISS_IDENTIFY_PHYSICAL_DEVICE;
1783
1784         rcode = aac_send_safw_bmic_cmd(dev, &srbu, identify_reply, datasize);
1785         if (unlikely(rcode < 0))
1786                 goto mem_free_all;
1787
1788         *identify_resp = identify_reply;
1789
1790 out:
1791         return rcode;
1792 mem_free_all:
1793         kfree(identify_reply);
1794         goto out;
1795 }
1796
1797 static inline void aac_free_safw_ciss_luns(struct aac_dev *dev)
1798 {
1799         kfree(dev->safw_phys_luns);
1800         dev->safw_phys_luns = NULL;
1801 }
1802
1803 /**
1804  *      aac_get_safw_ciss_luns()        Process topology change
1805  *      @dev:           aac_dev structure
1806  *
1807  *      Execute a CISS REPORT PHYS LUNS and process the results into
1808  *      the current hba_map.
1809  */
1810 static int aac_get_safw_ciss_luns(struct aac_dev *dev)
1811 {
1812         int rcode = -ENOMEM;
1813         int datasize;
1814         struct aac_srb *srbcmd;
1815         struct aac_srb_unit srbu;
1816         struct aac_ciss_phys_luns_resp *phys_luns;
1817
1818         datasize = sizeof(struct aac_ciss_phys_luns_resp) +
1819                 (AAC_MAX_TARGETS - 1) * sizeof(struct _ciss_lun);
1820         phys_luns = kmalloc(datasize, GFP_KERNEL);
1821         if (phys_luns == NULL)
1822                 goto out;
1823
1824         memset(&srbu, 0, sizeof(struct aac_srb_unit));
1825
1826         srbcmd = &srbu.srb;
1827         srbcmd->flags   = cpu_to_le32(SRB_DataIn);
1828         srbcmd->cdb[0]  = CISS_REPORT_PHYSICAL_LUNS;
1829         srbcmd->cdb[1]  = 2; /* extended reporting */
1830         srbcmd->cdb[8]  = (u8)(datasize >> 8);
1831         srbcmd->cdb[9]  = (u8)(datasize);
1832
1833         rcode = aac_send_safw_bmic_cmd(dev, &srbu, phys_luns, datasize);
1834         if (unlikely(rcode < 0))
1835                 goto mem_free_all;
1836
1837         if (phys_luns->resp_flag != 2) {
1838                 rcode = -ENOMSG;
1839                 goto mem_free_all;
1840         }
1841
1842         dev->safw_phys_luns = phys_luns;
1843
1844 out:
1845         return rcode;
1846 mem_free_all:
1847         kfree(phys_luns);
1848         goto out;
1849 }
1850
1851 static inline u32 aac_get_safw_phys_lun_count(struct aac_dev *dev)
1852 {
1853         return get_unaligned_be32(&dev->safw_phys_luns->list_length[0])/24;
1854 }
1855
1856 static inline u32 aac_get_safw_phys_bus(struct aac_dev *dev, int lun)
1857 {
1858         return dev->safw_phys_luns->lun[lun].level2[1] & 0x3f;
1859 }
1860
1861 static inline u32 aac_get_safw_phys_target(struct aac_dev *dev, int lun)
1862 {
1863         return dev->safw_phys_luns->lun[lun].level2[0];
1864 }
1865
1866 static inline u32 aac_get_safw_phys_expose_flag(struct aac_dev *dev, int lun)
1867 {
1868         return dev->safw_phys_luns->lun[lun].bus >> 6;
1869 }
1870
1871 static inline u32 aac_get_safw_phys_attribs(struct aac_dev *dev, int lun)
1872 {
1873         return dev->safw_phys_luns->lun[lun].node_ident[9];
1874 }
1875
1876 static inline u32 aac_get_safw_phys_nexus(struct aac_dev *dev, int lun)
1877 {
1878         return *((u32 *)&dev->safw_phys_luns->lun[lun].node_ident[12]);
1879 }
1880
1881 static inline u32 aac_get_safw_phys_device_type(struct aac_dev *dev, int lun)
1882 {
1883         return dev->safw_phys_luns->lun[lun].node_ident[8];
1884 }
1885
1886 static inline void aac_free_safw_identify_resp(struct aac_dev *dev,
1887                                                 int bus, int target)
1888 {
1889         kfree(dev->hba_map[bus][target].safw_identify_resp);
1890         dev->hba_map[bus][target].safw_identify_resp = NULL;
1891 }
1892
1893 static inline void aac_free_safw_all_identify_resp(struct aac_dev *dev,
1894         int lun_count)
1895 {
1896         int luns;
1897         int i;
1898         u32 bus;
1899         u32 target;
1900
1901         luns = aac_get_safw_phys_lun_count(dev);
1902
1903         if (luns < lun_count)
1904                 lun_count = luns;
1905         else if (lun_count < 0)
1906                 lun_count = luns;
1907
1908         for (i = 0; i < lun_count; i++) {
1909                 bus = aac_get_safw_phys_bus(dev, i);
1910                 target = aac_get_safw_phys_target(dev, i);
1911
1912                 aac_free_safw_identify_resp(dev, bus, target);
1913         }
1914 }
1915
1916 static int aac_get_safw_attr_all_targets(struct aac_dev *dev)
1917 {
1918         int i;
1919         int rcode = 0;
1920         u32 lun_count;
1921         u32 bus;
1922         u32 target;
1923         struct aac_ciss_identify_pd *identify_resp = NULL;
1924
1925         lun_count = aac_get_safw_phys_lun_count(dev);
1926
1927         for (i = 0; i < lun_count; ++i) {
1928
1929                 bus = aac_get_safw_phys_bus(dev, i);
1930                 target = aac_get_safw_phys_target(dev, i);
1931
1932                 rcode = aac_issue_safw_bmic_identify(dev,
1933                                                 &identify_resp, bus, target);
1934
1935                 if (unlikely(rcode < 0))
1936                         goto free_identify_resp;
1937
1938                 dev->hba_map[bus][target].safw_identify_resp = identify_resp;
1939         }
1940
1941 out:
1942         return rcode;
1943 free_identify_resp:
1944         aac_free_safw_all_identify_resp(dev, i);
1945         goto out;
1946 }
1947
1948 /**
1949  *      aac_set_safw_attr_all_targets-  update current hba map with data from FW
1950  *      @dev:   aac_dev structure
1951  *      @phys_luns: FW information from report phys luns
1952  *      @rescan: Indicates scan type
1953  *
1954  *      Update our hba map with the information gathered from the FW
1955  */
1956 static void aac_set_safw_attr_all_targets(struct aac_dev *dev)
1957 {
1958         /* ok and extended reporting */
1959         u32 lun_count, nexus;
1960         u32 i, bus, target;
1961         u8 expose_flag, attribs;
1962
1963         lun_count = aac_get_safw_phys_lun_count(dev);
1964
1965         dev->scan_counter++;
1966
1967         for (i = 0; i < lun_count; ++i) {
1968
1969                 bus = aac_get_safw_phys_bus(dev, i);
1970                 target = aac_get_safw_phys_target(dev, i);
1971                 expose_flag = aac_get_safw_phys_expose_flag(dev, i);
1972                 attribs = aac_get_safw_phys_attribs(dev, i);
1973                 nexus = aac_get_safw_phys_nexus(dev, i);
1974
1975                 if (bus >= AAC_MAX_BUSES || target >= AAC_MAX_TARGETS)
1976                         continue;
1977
1978                 if (expose_flag != 0) {
1979                         dev->hba_map[bus][target].devtype =
1980                                 AAC_DEVTYPE_RAID_MEMBER;
1981                         continue;
1982                 }
1983
1984                 if (nexus != 0 && (attribs & 8)) {
1985                         dev->hba_map[bus][target].devtype =
1986                                 AAC_DEVTYPE_NATIVE_RAW;
1987                         dev->hba_map[bus][target].rmw_nexus =
1988                                         nexus;
1989                 } else
1990                         dev->hba_map[bus][target].devtype =
1991                                 AAC_DEVTYPE_ARC_RAW;
1992
1993                 dev->hba_map[bus][target].scan_counter = dev->scan_counter;
1994
1995                 aac_set_safw_target_qd(dev, bus, target);
1996         }
1997 }
1998
1999 static int aac_setup_safw_targets(struct aac_dev *dev)
2000 {
2001         int rcode = 0;
2002
2003         rcode = aac_get_containers(dev);
2004         if (unlikely(rcode < 0))
2005                 goto out;
2006
2007         rcode = aac_get_safw_ciss_luns(dev);
2008         if (unlikely(rcode < 0))
2009                 goto out;
2010
2011         rcode = aac_get_safw_attr_all_targets(dev);
2012         if (unlikely(rcode < 0))
2013                 goto free_ciss_luns;
2014
2015         aac_set_safw_attr_all_targets(dev);
2016
2017         aac_free_safw_all_identify_resp(dev, -1);
2018 free_ciss_luns:
2019         aac_free_safw_ciss_luns(dev);
2020 out:
2021         return rcode;
2022 }
2023
2024 int aac_setup_safw_adapter(struct aac_dev *dev)
2025 {
2026         return aac_setup_safw_targets(dev);
2027 }
2028
2029 int aac_get_adapter_info(struct aac_dev* dev)
2030 {
2031         struct fib* fibptr;
2032         int rcode;
2033         u32 tmp, bus, target;
2034         struct aac_adapter_info *info;
2035         struct aac_bus_info *command;
2036         struct aac_bus_info_response *bus_info;
2037
2038         if (!(fibptr = aac_fib_alloc(dev)))
2039                 return -ENOMEM;
2040
2041         aac_fib_init(fibptr);
2042         info = (struct aac_adapter_info *) fib_data(fibptr);
2043         memset(info,0,sizeof(*info));
2044
2045         rcode = aac_fib_send(RequestAdapterInfo,
2046                          fibptr,
2047                          sizeof(*info),
2048                          FsaNormal,
2049                          -1, 1, /* First `interrupt' command uses special wait */
2050                          NULL,
2051                          NULL);
2052
2053         if (rcode < 0) {
2054                 /* FIB should be freed only after
2055                  * getting the response from the F/W */
2056                 if (rcode != -ERESTARTSYS) {
2057                         aac_fib_complete(fibptr);
2058                         aac_fib_free(fibptr);
2059                 }
2060                 return rcode;
2061         }
2062         memcpy(&dev->adapter_info, info, sizeof(*info));
2063
2064         dev->supplement_adapter_info.virt_device_bus = 0xffff;
2065         if (dev->adapter_info.options & AAC_OPT_SUPPLEMENT_ADAPTER_INFO) {
2066                 struct aac_supplement_adapter_info * sinfo;
2067
2068                 aac_fib_init(fibptr);
2069
2070                 sinfo = (struct aac_supplement_adapter_info *) fib_data(fibptr);
2071
2072                 memset(sinfo,0,sizeof(*sinfo));
2073
2074                 rcode = aac_fib_send(RequestSupplementAdapterInfo,
2075                                  fibptr,
2076                                  sizeof(*sinfo),
2077                                  FsaNormal,
2078                                  1, 1,
2079                                  NULL,
2080                                  NULL);
2081
2082                 if (rcode >= 0)
2083                         memcpy(&dev->supplement_adapter_info, sinfo, sizeof(*sinfo));
2084                 if (rcode == -ERESTARTSYS) {
2085                         fibptr = aac_fib_alloc(dev);
2086                         if (!fibptr)
2087                                 return -ENOMEM;
2088                 }
2089
2090         }
2091
2092         /* reset all previous mapped devices (i.e. for init. after IOP_RESET) */
2093         for (bus = 0; bus < AAC_MAX_BUSES; bus++) {
2094                 for (target = 0; target < AAC_MAX_TARGETS; target++) {
2095                         dev->hba_map[bus][target].devtype = 0;
2096                         dev->hba_map[bus][target].qd_limit = 0;
2097                 }
2098         }
2099
2100         /*
2101          * GetBusInfo
2102          */
2103
2104         aac_fib_init(fibptr);
2105
2106         bus_info = (struct aac_bus_info_response *) fib_data(fibptr);
2107
2108         memset(bus_info, 0, sizeof(*bus_info));
2109
2110         command = (struct aac_bus_info *)bus_info;
2111
2112         command->Command = cpu_to_le32(VM_Ioctl);
2113         command->ObjType = cpu_to_le32(FT_DRIVE);
2114         command->MethodId = cpu_to_le32(1);
2115         command->CtlCmd = cpu_to_le32(GetBusInfo);
2116
2117         rcode = aac_fib_send(ContainerCommand,
2118                          fibptr,
2119                          sizeof (*bus_info),
2120                          FsaNormal,
2121                          1, 1,
2122                          NULL, NULL);
2123
2124         /* reasoned default */
2125         dev->maximum_num_physicals = 16;
2126         if (rcode >= 0 && le32_to_cpu(bus_info->Status) == ST_OK) {
2127                 dev->maximum_num_physicals = le32_to_cpu(bus_info->TargetsPerBus);
2128                 dev->maximum_num_channels = le32_to_cpu(bus_info->BusCount);
2129         }
2130
2131         if (!dev->in_reset) {
2132                 char buffer[16];
2133                 tmp = le32_to_cpu(dev->adapter_info.kernelrev);
2134                 printk(KERN_INFO "%s%d: kernel %d.%d-%d[%d] %.*s\n",
2135                         dev->name,
2136                         dev->id,
2137                         tmp>>24,
2138                         (tmp>>16)&0xff,
2139                         tmp&0xff,
2140                         le32_to_cpu(dev->adapter_info.kernelbuild),
2141                         (int)sizeof(dev->supplement_adapter_info.build_date),
2142                         dev->supplement_adapter_info.build_date);
2143                 tmp = le32_to_cpu(dev->adapter_info.monitorrev);
2144                 printk(KERN_INFO "%s%d: monitor %d.%d-%d[%d]\n",
2145                         dev->name, dev->id,
2146                         tmp>>24,(tmp>>16)&0xff,tmp&0xff,
2147                         le32_to_cpu(dev->adapter_info.monitorbuild));
2148                 tmp = le32_to_cpu(dev->adapter_info.biosrev);
2149                 printk(KERN_INFO "%s%d: bios %d.%d-%d[%d]\n",
2150                         dev->name, dev->id,
2151                         tmp>>24,(tmp>>16)&0xff,tmp&0xff,
2152                         le32_to_cpu(dev->adapter_info.biosbuild));
2153                 buffer[0] = '\0';
2154                 if (aac_get_serial_number(
2155                   shost_to_class(dev->scsi_host_ptr), buffer))
2156                         printk(KERN_INFO "%s%d: serial %s",
2157                           dev->name, dev->id, buffer);
2158                 if (dev->supplement_adapter_info.vpd_info.tsid[0]) {
2159                         printk(KERN_INFO "%s%d: TSID %.*s\n",
2160                           dev->name, dev->id,
2161                           (int)sizeof(dev->supplement_adapter_info
2162                                                         .vpd_info.tsid),
2163                                 dev->supplement_adapter_info.vpd_info.tsid);
2164                 }
2165                 if (!aac_check_reset || ((aac_check_reset == 1) &&
2166                   (dev->supplement_adapter_info.supported_options2 &
2167                   AAC_OPTION_IGNORE_RESET))) {
2168                         printk(KERN_INFO "%s%d: Reset Adapter Ignored\n",
2169                           dev->name, dev->id);
2170                 }
2171         }
2172
2173         dev->cache_protected = 0;
2174         dev->jbod = ((dev->supplement_adapter_info.feature_bits &
2175                 AAC_FEATURE_JBOD) != 0);
2176         dev->nondasd_support = 0;
2177         dev->raid_scsi_mode = 0;
2178         if(dev->adapter_info.options & AAC_OPT_NONDASD)
2179                 dev->nondasd_support = 1;
2180
2181         /*
2182          * If the firmware supports ROMB RAID/SCSI mode and we are currently
2183          * in RAID/SCSI mode, set the flag. For now if in this mode we will
2184          * force nondasd support on. If we decide to allow the non-dasd flag
2185          * additional changes changes will have to be made to support
2186          * RAID/SCSI.  the function aac_scsi_cmd in this module will have to be
2187          * changed to support the new dev->raid_scsi_mode flag instead of
2188          * leaching off of the dev->nondasd_support flag. Also in linit.c the
2189          * function aac_detect will have to be modified where it sets up the
2190          * max number of channels based on the aac->nondasd_support flag only.
2191          */
2192         if ((dev->adapter_info.options & AAC_OPT_SCSI_MANAGED) &&
2193             (dev->adapter_info.options & AAC_OPT_RAID_SCSI_MODE)) {
2194                 dev->nondasd_support = 1;
2195                 dev->raid_scsi_mode = 1;
2196         }
2197         if (dev->raid_scsi_mode != 0)
2198                 printk(KERN_INFO "%s%d: ROMB RAID/SCSI mode enabled\n",
2199                                 dev->name, dev->id);
2200
2201         if (nondasd != -1)
2202                 dev->nondasd_support = (nondasd!=0);
2203         if (dev->nondasd_support && !dev->in_reset)
2204                 printk(KERN_INFO "%s%d: Non-DASD support enabled.\n",dev->name, dev->id);
2205
2206         if (dma_get_required_mask(&dev->pdev->dev) > DMA_BIT_MASK(32))
2207                 dev->needs_dac = 1;
2208         dev->dac_support = 0;
2209         if ((sizeof(dma_addr_t) > 4) && dev->needs_dac &&
2210             (dev->adapter_info.options & AAC_OPT_SGMAP_HOST64)) {
2211                 if (!dev->in_reset)
2212                         printk(KERN_INFO "%s%d: 64bit support enabled.\n",
2213                                 dev->name, dev->id);
2214                 dev->dac_support = 1;
2215         }
2216
2217         if(dacmode != -1) {
2218                 dev->dac_support = (dacmode!=0);
2219         }
2220
2221         /* avoid problems with AAC_QUIRK_SCSI_32 controllers */
2222         if (dev->dac_support && (aac_get_driver_ident(dev->cardtype)->quirks
2223                 & AAC_QUIRK_SCSI_32)) {
2224                 dev->nondasd_support = 0;
2225                 dev->jbod = 0;
2226                 expose_physicals = 0;
2227         }
2228
2229         if (dev->dac_support) {
2230                 if (!pci_set_dma_mask(dev->pdev, DMA_BIT_MASK(64))) {
2231                         if (!dev->in_reset)
2232                                 dev_info(&dev->pdev->dev, "64 Bit DAC enabled\n");
2233                 } else if (!pci_set_dma_mask(dev->pdev, DMA_BIT_MASK(32))) {
2234                         dev_info(&dev->pdev->dev, "DMA mask set failed, 64 Bit DAC disabled\n");
2235                         dev->dac_support = 0;
2236                 } else {
2237                         dev_info(&dev->pdev->dev, "No suitable DMA available\n");
2238                         rcode = -ENOMEM;
2239                 }
2240         }
2241         /*
2242          * Deal with configuring for the individualized limits of each packet
2243          * interface.
2244          */
2245         dev->a_ops.adapter_scsi = (dev->dac_support)
2246           ? ((aac_get_driver_ident(dev->cardtype)->quirks & AAC_QUIRK_SCSI_32)
2247                                 ? aac_scsi_32_64
2248                                 : aac_scsi_64)
2249                                 : aac_scsi_32;
2250         if (dev->raw_io_interface) {
2251                 dev->a_ops.adapter_bounds = (dev->raw_io_64)
2252                                         ? aac_bounds_64
2253                                         : aac_bounds_32;
2254                 dev->a_ops.adapter_read = aac_read_raw_io;
2255                 dev->a_ops.adapter_write = aac_write_raw_io;
2256         } else {
2257                 dev->a_ops.adapter_bounds = aac_bounds_32;
2258                 dev->scsi_host_ptr->sg_tablesize = (dev->max_fib_size -
2259                         sizeof(struct aac_fibhdr) -
2260                         sizeof(struct aac_write) + sizeof(struct sgentry)) /
2261                                 sizeof(struct sgentry);
2262                 if (dev->dac_support) {
2263                         dev->a_ops.adapter_read = aac_read_block64;
2264                         dev->a_ops.adapter_write = aac_write_block64;
2265                         /*
2266                          * 38 scatter gather elements
2267                          */
2268                         dev->scsi_host_ptr->sg_tablesize =
2269                                 (dev->max_fib_size -
2270                                 sizeof(struct aac_fibhdr) -
2271                                 sizeof(struct aac_write64) +
2272                                 sizeof(struct sgentry64)) /
2273                                         sizeof(struct sgentry64);
2274                 } else {
2275                         dev->a_ops.adapter_read = aac_read_block;
2276                         dev->a_ops.adapter_write = aac_write_block;
2277                 }
2278                 dev->scsi_host_ptr->max_sectors = AAC_MAX_32BIT_SGBCOUNT;
2279                 if (!(dev->adapter_info.options & AAC_OPT_NEW_COMM)) {
2280                         /*
2281                          * Worst case size that could cause sg overflow when
2282                          * we break up SG elements that are larger than 64KB.
2283                          * Would be nice if we could tell the SCSI layer what
2284                          * the maximum SG element size can be. Worst case is
2285                          * (sg_tablesize-1) 4KB elements with one 64KB
2286                          * element.
2287                          *      32bit -> 468 or 238KB   64bit -> 424 or 212KB
2288                          */
2289                         dev->scsi_host_ptr->max_sectors =
2290                           (dev->scsi_host_ptr->sg_tablesize * 8) + 112;
2291                 }
2292         }
2293         if (!dev->sync_mode && dev->sa_firmware &&
2294                 dev->scsi_host_ptr->sg_tablesize > HBA_MAX_SG_SEPARATE)
2295                 dev->scsi_host_ptr->sg_tablesize = dev->sg_tablesize =
2296                         HBA_MAX_SG_SEPARATE;
2297
2298         /* FIB should be freed only after getting the response from the F/W */
2299         if (rcode != -ERESTARTSYS) {
2300                 aac_fib_complete(fibptr);
2301                 aac_fib_free(fibptr);
2302         }
2303
2304         return rcode;
2305 }
2306
2307
2308 static void io_callback(void *context, struct fib * fibptr)
2309 {
2310         struct aac_dev *dev;
2311         struct aac_read_reply *readreply;
2312         struct scsi_cmnd *scsicmd;
2313         u32 cid;
2314
2315         scsicmd = (struct scsi_cmnd *) context;
2316
2317         if (!aac_valid_context(scsicmd, fibptr))
2318                 return;
2319
2320         dev = fibptr->dev;
2321         cid = scmd_id(scsicmd);
2322
2323         if (nblank(dprintk(x))) {
2324                 u64 lba;
2325                 switch (scsicmd->cmnd[0]) {
2326                 case WRITE_6:
2327                 case READ_6:
2328                         lba = ((scsicmd->cmnd[1] & 0x1F) << 16) |
2329                             (scsicmd->cmnd[2] << 8) | scsicmd->cmnd[3];
2330                         break;
2331                 case WRITE_16:
2332                 case READ_16:
2333                         lba = ((u64)scsicmd->cmnd[2] << 56) |
2334                               ((u64)scsicmd->cmnd[3] << 48) |
2335                               ((u64)scsicmd->cmnd[4] << 40) |
2336                               ((u64)scsicmd->cmnd[5] << 32) |
2337                               ((u64)scsicmd->cmnd[6] << 24) |
2338                               (scsicmd->cmnd[7] << 16) |
2339                               (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9];
2340                         break;
2341                 case WRITE_12:
2342                 case READ_12:
2343                         lba = ((u64)scsicmd->cmnd[2] << 24) |
2344                               (scsicmd->cmnd[3] << 16) |
2345                               (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5];
2346                         break;
2347                 default:
2348                         lba = ((u64)scsicmd->cmnd[2] << 24) |
2349                                (scsicmd->cmnd[3] << 16) |
2350                                (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5];
2351                         break;
2352                 }
2353                 printk(KERN_DEBUG
2354                   "io_callback[cpu %d]: lba = %llu, t = %ld.\n",
2355                   smp_processor_id(), (unsigned long long)lba, jiffies);
2356         }
2357
2358         BUG_ON(fibptr == NULL);
2359
2360         scsi_dma_unmap(scsicmd);
2361
2362         readreply = (struct aac_read_reply *)fib_data(fibptr);
2363         switch (le32_to_cpu(readreply->status)) {
2364         case ST_OK:
2365                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
2366                         SAM_STAT_GOOD;
2367                 dev->fsa_dev[cid].sense_data.sense_key = NO_SENSE;
2368                 break;
2369         case ST_NOT_READY:
2370                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
2371                         SAM_STAT_CHECK_CONDITION;
2372                 set_sense(&dev->fsa_dev[cid].sense_data, NOT_READY,
2373                   SENCODE_BECOMING_READY, ASENCODE_BECOMING_READY, 0, 0);
2374                 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
2375                        min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
2376                              SCSI_SENSE_BUFFERSIZE));
2377                 break;
2378         case ST_MEDERR:
2379                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
2380                         SAM_STAT_CHECK_CONDITION;
2381                 set_sense(&dev->fsa_dev[cid].sense_data, MEDIUM_ERROR,
2382                   SENCODE_UNRECOVERED_READ_ERROR, ASENCODE_NO_SENSE, 0, 0);
2383                 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
2384                        min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
2385                              SCSI_SENSE_BUFFERSIZE));
2386                 break;
2387         default:
2388 #ifdef AAC_DETAILED_STATUS_INFO
2389                 printk(KERN_WARNING "io_callback: io failed, status = %d\n",
2390                   le32_to_cpu(readreply->status));
2391 #endif
2392                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
2393                         SAM_STAT_CHECK_CONDITION;
2394                 set_sense(&dev->fsa_dev[cid].sense_data,
2395                   HARDWARE_ERROR, SENCODE_INTERNAL_TARGET_FAILURE,
2396                   ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0);
2397                 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
2398                        min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
2399                              SCSI_SENSE_BUFFERSIZE));
2400                 break;
2401         }
2402         aac_fib_complete(fibptr);
2403
2404         scsicmd->scsi_done(scsicmd);
2405 }
2406
2407 static int aac_read(struct scsi_cmnd * scsicmd)
2408 {
2409         u64 lba;
2410         u32 count;
2411         int status;
2412         struct aac_dev *dev;
2413         struct fib * cmd_fibcontext;
2414         int cid;
2415
2416         dev = (struct aac_dev *)scsicmd->device->host->hostdata;
2417         /*
2418          *      Get block address and transfer length
2419          */
2420         switch (scsicmd->cmnd[0]) {
2421         case READ_6:
2422                 dprintk((KERN_DEBUG "aachba: received a read(6) command on id %d.\n", scmd_id(scsicmd)));
2423
2424                 lba = ((scsicmd->cmnd[1] & 0x1F) << 16) |
2425                         (scsicmd->cmnd[2] << 8) | scsicmd->cmnd[3];
2426                 count = scsicmd->cmnd[4];
2427
2428                 if (count == 0)
2429                         count = 256;
2430                 break;
2431         case READ_16:
2432                 dprintk((KERN_DEBUG "aachba: received a read(16) command on id %d.\n", scmd_id(scsicmd)));
2433
2434                 lba =   ((u64)scsicmd->cmnd[2] << 56) |
2435                         ((u64)scsicmd->cmnd[3] << 48) |
2436                         ((u64)scsicmd->cmnd[4] << 40) |
2437                         ((u64)scsicmd->cmnd[5] << 32) |
2438                         ((u64)scsicmd->cmnd[6] << 24) |
2439                         (scsicmd->cmnd[7] << 16) |
2440                         (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9];
2441                 count = (scsicmd->cmnd[10] << 24) |
2442                         (scsicmd->cmnd[11] << 16) |
2443                         (scsicmd->cmnd[12] << 8) | scsicmd->cmnd[13];
2444                 break;
2445         case READ_12:
2446                 dprintk((KERN_DEBUG "aachba: received a read(12) command on id %d.\n", scmd_id(scsicmd)));
2447
2448                 lba = ((u64)scsicmd->cmnd[2] << 24) |
2449                         (scsicmd->cmnd[3] << 16) |
2450                         (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5];
2451                 count = (scsicmd->cmnd[6] << 24) |
2452                         (scsicmd->cmnd[7] << 16) |
2453                         (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9];
2454                 break;
2455         default:
2456                 dprintk((KERN_DEBUG "aachba: received a read(10) command on id %d.\n", scmd_id(scsicmd)));
2457
2458                 lba = ((u64)scsicmd->cmnd[2] << 24) |
2459                         (scsicmd->cmnd[3] << 16) |
2460                         (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5];
2461                 count = (scsicmd->cmnd[7] << 8) | scsicmd->cmnd[8];
2462                 break;
2463         }
2464
2465         if ((lba + count) > (dev->fsa_dev[scmd_id(scsicmd)].size)) {
2466                 cid = scmd_id(scsicmd);
2467                 dprintk((KERN_DEBUG "aacraid: Illegal lba\n"));
2468                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
2469                         SAM_STAT_CHECK_CONDITION;
2470                 set_sense(&dev->fsa_dev[cid].sense_data,
2471                           ILLEGAL_REQUEST, SENCODE_LBA_OUT_OF_RANGE,
2472                           ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0);
2473                 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
2474                        min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
2475                              SCSI_SENSE_BUFFERSIZE));
2476                 scsicmd->scsi_done(scsicmd);
2477                 return 0;
2478         }
2479
2480         dprintk((KERN_DEBUG "aac_read[cpu %d]: lba = %llu, t = %ld.\n",
2481           smp_processor_id(), (unsigned long long)lba, jiffies));
2482         if (aac_adapter_bounds(dev,scsicmd,lba))
2483                 return 0;
2484         /*
2485          *      Alocate and initialize a Fib
2486          */
2487         cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
2488         scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
2489         status = aac_adapter_read(cmd_fibcontext, scsicmd, lba, count);
2490
2491         /*
2492          *      Check that the command queued to the controller
2493          */
2494         if (status == -EINPROGRESS)
2495                 return 0;
2496
2497         printk(KERN_WARNING "aac_read: aac_fib_send failed with status: %d.\n", status);
2498         /*
2499          *      For some reason, the Fib didn't queue, return QUEUE_FULL
2500          */
2501         scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_TASK_SET_FULL;
2502         scsicmd->scsi_done(scsicmd);
2503         aac_fib_complete(cmd_fibcontext);
2504         aac_fib_free(cmd_fibcontext);
2505         return 0;
2506 }
2507
2508 static int aac_write(struct scsi_cmnd * scsicmd)
2509 {
2510         u64 lba;
2511         u32 count;
2512         int fua;
2513         int status;
2514         struct aac_dev *dev;
2515         struct fib * cmd_fibcontext;
2516         int cid;
2517
2518         dev = (struct aac_dev *)scsicmd->device->host->hostdata;
2519         /*
2520          *      Get block address and transfer length
2521          */
2522         if (scsicmd->cmnd[0] == WRITE_6)        /* 6 byte command */
2523         {
2524                 lba = ((scsicmd->cmnd[1] & 0x1F) << 16) | (scsicmd->cmnd[2] << 8) | scsicmd->cmnd[3];
2525                 count = scsicmd->cmnd[4];
2526                 if (count == 0)
2527                         count = 256;
2528                 fua = 0;
2529         } else if (scsicmd->cmnd[0] == WRITE_16) { /* 16 byte command */
2530                 dprintk((KERN_DEBUG "aachba: received a write(16) command on id %d.\n", scmd_id(scsicmd)));
2531
2532                 lba =   ((u64)scsicmd->cmnd[2] << 56) |
2533                         ((u64)scsicmd->cmnd[3] << 48) |
2534                         ((u64)scsicmd->cmnd[4] << 40) |
2535                         ((u64)scsicmd->cmnd[5] << 32) |
2536                         ((u64)scsicmd->cmnd[6] << 24) |
2537                         (scsicmd->cmnd[7] << 16) |
2538                         (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9];
2539                 count = (scsicmd->cmnd[10] << 24) | (scsicmd->cmnd[11] << 16) |
2540                         (scsicmd->cmnd[12] << 8) | scsicmd->cmnd[13];
2541                 fua = scsicmd->cmnd[1] & 0x8;
2542         } else if (scsicmd->cmnd[0] == WRITE_12) { /* 12 byte command */
2543                 dprintk((KERN_DEBUG "aachba: received a write(12) command on id %d.\n", scmd_id(scsicmd)));
2544
2545                 lba = ((u64)scsicmd->cmnd[2] << 24) | (scsicmd->cmnd[3] << 16)
2546                     | (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5];
2547                 count = (scsicmd->cmnd[6] << 24) | (scsicmd->cmnd[7] << 16)
2548                       | (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9];
2549                 fua = scsicmd->cmnd[1] & 0x8;
2550         } else {
2551                 dprintk((KERN_DEBUG "aachba: received a write(10) command on id %d.\n", scmd_id(scsicmd)));
2552                 lba = ((u64)scsicmd->cmnd[2] << 24) | (scsicmd->cmnd[3] << 16) | (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5];
2553                 count = (scsicmd->cmnd[7] << 8) | scsicmd->cmnd[8];
2554                 fua = scsicmd->cmnd[1] & 0x8;
2555         }
2556
2557         if ((lba + count) > (dev->fsa_dev[scmd_id(scsicmd)].size)) {
2558                 cid = scmd_id(scsicmd);
2559                 dprintk((KERN_DEBUG "aacraid: Illegal lba\n"));
2560                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
2561                         SAM_STAT_CHECK_CONDITION;
2562                 set_sense(&dev->fsa_dev[cid].sense_data,
2563                           ILLEGAL_REQUEST, SENCODE_LBA_OUT_OF_RANGE,
2564                           ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0);
2565                 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
2566                        min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
2567                              SCSI_SENSE_BUFFERSIZE));
2568                 scsicmd->scsi_done(scsicmd);
2569                 return 0;
2570         }
2571
2572         dprintk((KERN_DEBUG "aac_write[cpu %d]: lba = %llu, t = %ld.\n",
2573           smp_processor_id(), (unsigned long long)lba, jiffies));
2574         if (aac_adapter_bounds(dev,scsicmd,lba))
2575                 return 0;
2576         /*
2577          *      Allocate and initialize a Fib then setup a BlockWrite command
2578          */
2579         cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
2580         scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
2581         status = aac_adapter_write(cmd_fibcontext, scsicmd, lba, count, fua);
2582
2583         /*
2584          *      Check that the command queued to the controller
2585          */
2586         if (status == -EINPROGRESS)
2587                 return 0;
2588
2589         printk(KERN_WARNING "aac_write: aac_fib_send failed with status: %d\n", status);
2590         /*
2591          *      For some reason, the Fib didn't queue, return QUEUE_FULL
2592          */
2593         scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_TASK_SET_FULL;
2594         scsicmd->scsi_done(scsicmd);
2595
2596         aac_fib_complete(cmd_fibcontext);
2597         aac_fib_free(cmd_fibcontext);
2598         return 0;
2599 }
2600
2601 static void synchronize_callback(void *context, struct fib *fibptr)
2602 {
2603         struct aac_synchronize_reply *synchronizereply;
2604         struct scsi_cmnd *cmd;
2605
2606         cmd = context;
2607
2608         if (!aac_valid_context(cmd, fibptr))
2609                 return;
2610
2611         dprintk((KERN_DEBUG "synchronize_callback[cpu %d]: t = %ld.\n",
2612                                 smp_processor_id(), jiffies));
2613         BUG_ON(fibptr == NULL);
2614
2615
2616         synchronizereply = fib_data(fibptr);
2617         if (le32_to_cpu(synchronizereply->status) == CT_OK)
2618                 cmd->result = DID_OK << 16 |
2619                         COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
2620         else {
2621                 struct scsi_device *sdev = cmd->device;
2622                 struct aac_dev *dev = fibptr->dev;
2623                 u32 cid = sdev_id(sdev);
2624                 printk(KERN_WARNING
2625                      "synchronize_callback: synchronize failed, status = %d\n",
2626                      le32_to_cpu(synchronizereply->status));
2627                 cmd->result = DID_OK << 16 |
2628                         COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
2629                 set_sense(&dev->fsa_dev[cid].sense_data,
2630                   HARDWARE_ERROR, SENCODE_INTERNAL_TARGET_FAILURE,
2631                   ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0);
2632                 memcpy(cmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
2633                        min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
2634                              SCSI_SENSE_BUFFERSIZE));
2635         }
2636
2637         aac_fib_complete(fibptr);
2638         aac_fib_free(fibptr);
2639         cmd->scsi_done(cmd);
2640 }
2641
2642 static int aac_synchronize(struct scsi_cmnd *scsicmd)
2643 {
2644         int status;
2645         struct fib *cmd_fibcontext;
2646         struct aac_synchronize *synchronizecmd;
2647         struct scsi_cmnd *cmd;
2648         struct scsi_device *sdev = scsicmd->device;
2649         int active = 0;
2650         struct aac_dev *aac;
2651         u64 lba = ((u64)scsicmd->cmnd[2] << 24) | (scsicmd->cmnd[3] << 16) |
2652                 (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5];
2653         u32 count = (scsicmd->cmnd[7] << 8) | scsicmd->cmnd[8];
2654         unsigned long flags;
2655
2656         /*
2657          * Wait for all outstanding queued commands to complete to this
2658          * specific target (block).
2659          */
2660         spin_lock_irqsave(&sdev->list_lock, flags);
2661         list_for_each_entry(cmd, &sdev->cmd_list, list)
2662                 if (cmd->SCp.phase == AAC_OWNER_FIRMWARE) {
2663                         u64 cmnd_lba;
2664                         u32 cmnd_count;
2665
2666                         if (cmd->cmnd[0] == WRITE_6) {
2667                                 cmnd_lba = ((cmd->cmnd[1] & 0x1F) << 16) |
2668                                         (cmd->cmnd[2] << 8) |
2669                                         cmd->cmnd[3];
2670                                 cmnd_count = cmd->cmnd[4];
2671                                 if (cmnd_count == 0)
2672                                         cmnd_count = 256;
2673                         } else if (cmd->cmnd[0] == WRITE_16) {
2674                                 cmnd_lba = ((u64)cmd->cmnd[2] << 56) |
2675                                         ((u64)cmd->cmnd[3] << 48) |
2676                                         ((u64)cmd->cmnd[4] << 40) |
2677                                         ((u64)cmd->cmnd[5] << 32) |
2678                                         ((u64)cmd->cmnd[6] << 24) |
2679                                         (cmd->cmnd[7] << 16) |
2680                                         (cmd->cmnd[8] << 8) |
2681                                         cmd->cmnd[9];
2682                                 cmnd_count = (cmd->cmnd[10] << 24) |
2683                                         (cmd->cmnd[11] << 16) |
2684                                         (cmd->cmnd[12] << 8) |
2685                                         cmd->cmnd[13];
2686                         } else if (cmd->cmnd[0] == WRITE_12) {
2687                                 cmnd_lba = ((u64)cmd->cmnd[2] << 24) |
2688                                         (cmd->cmnd[3] << 16) |
2689                                         (cmd->cmnd[4] << 8) |
2690                                         cmd->cmnd[5];
2691                                 cmnd_count = (cmd->cmnd[6] << 24) |
2692                                         (cmd->cmnd[7] << 16) |
2693                                         (cmd->cmnd[8] << 8) |
2694                                         cmd->cmnd[9];
2695                         } else if (cmd->cmnd[0] == WRITE_10) {
2696                                 cmnd_lba = ((u64)cmd->cmnd[2] << 24) |
2697                                         (cmd->cmnd[3] << 16) |
2698                                         (cmd->cmnd[4] << 8) |
2699                                         cmd->cmnd[5];
2700                                 cmnd_count = (cmd->cmnd[7] << 8) |
2701                                         cmd->cmnd[8];
2702                         } else
2703                                 continue;
2704                         if (((cmnd_lba + cmnd_count) < lba) ||
2705                           (count && ((lba + count) < cmnd_lba)))
2706                                 continue;
2707                         ++active;
2708                         break;
2709                 }
2710
2711         spin_unlock_irqrestore(&sdev->list_lock, flags);
2712
2713         /*
2714          *      Yield the processor (requeue for later)
2715          */
2716         if (active)
2717                 return SCSI_MLQUEUE_DEVICE_BUSY;
2718
2719         aac = (struct aac_dev *)sdev->host->hostdata;
2720         if (aac->in_reset)
2721                 return SCSI_MLQUEUE_HOST_BUSY;
2722
2723         /*
2724          *      Allocate and initialize a Fib
2725          */
2726         if (!(cmd_fibcontext = aac_fib_alloc(aac)))
2727                 return SCSI_MLQUEUE_HOST_BUSY;
2728
2729         aac_fib_init(cmd_fibcontext);
2730
2731         synchronizecmd = fib_data(cmd_fibcontext);
2732         synchronizecmd->command = cpu_to_le32(VM_ContainerConfig);
2733         synchronizecmd->type = cpu_to_le32(CT_FLUSH_CACHE);
2734         synchronizecmd->cid = cpu_to_le32(scmd_id(scsicmd));
2735         synchronizecmd->count =
2736              cpu_to_le32(sizeof(((struct aac_synchronize_reply *)NULL)->data));
2737         scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
2738
2739         /*
2740          *      Now send the Fib to the adapter
2741          */
2742         status = aac_fib_send(ContainerCommand,
2743                   cmd_fibcontext,
2744                   sizeof(struct aac_synchronize),
2745                   FsaNormal,
2746                   0, 1,
2747                   (fib_callback)synchronize_callback,
2748                   (void *)scsicmd);
2749
2750         /*
2751          *      Check that the command queued to the controller
2752          */
2753         if (status == -EINPROGRESS)
2754                 return 0;
2755
2756         printk(KERN_WARNING
2757                 "aac_synchronize: aac_fib_send failed with status: %d.\n", status);
2758         aac_fib_complete(cmd_fibcontext);
2759         aac_fib_free(cmd_fibcontext);
2760         return SCSI_MLQUEUE_HOST_BUSY;
2761 }
2762
2763 static void aac_start_stop_callback(void *context, struct fib *fibptr)
2764 {
2765         struct scsi_cmnd *scsicmd = context;
2766
2767         if (!aac_valid_context(scsicmd, fibptr))
2768                 return;
2769
2770         BUG_ON(fibptr == NULL);
2771
2772         scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
2773
2774         aac_fib_complete(fibptr);
2775         aac_fib_free(fibptr);
2776         scsicmd->scsi_done(scsicmd);
2777 }
2778
2779 static int aac_start_stop(struct scsi_cmnd *scsicmd)
2780 {
2781         int status;
2782         struct fib *cmd_fibcontext;
2783         struct aac_power_management *pmcmd;
2784         struct scsi_device *sdev = scsicmd->device;
2785         struct aac_dev *aac = (struct aac_dev *)sdev->host->hostdata;
2786
2787         if (!(aac->supplement_adapter_info.supported_options2 &
2788               AAC_OPTION_POWER_MANAGEMENT)) {
2789                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
2790                                   SAM_STAT_GOOD;
2791                 scsicmd->scsi_done(scsicmd);
2792                 return 0;
2793         }
2794
2795         if (aac->in_reset)
2796                 return SCSI_MLQUEUE_HOST_BUSY;
2797
2798         /*
2799          *      Allocate and initialize a Fib
2800          */
2801         cmd_fibcontext = aac_fib_alloc_tag(aac, scsicmd);
2802
2803         aac_fib_init(cmd_fibcontext);
2804
2805         pmcmd = fib_data(cmd_fibcontext);
2806         pmcmd->command = cpu_to_le32(VM_ContainerConfig);
2807         pmcmd->type = cpu_to_le32(CT_POWER_MANAGEMENT);
2808         /* Eject bit ignored, not relevant */
2809         pmcmd->sub = (scsicmd->cmnd[4] & 1) ?
2810                 cpu_to_le32(CT_PM_START_UNIT) : cpu_to_le32(CT_PM_STOP_UNIT);
2811         pmcmd->cid = cpu_to_le32(sdev_id(sdev));
2812         pmcmd->parm = (scsicmd->cmnd[1] & 1) ?
2813                 cpu_to_le32(CT_PM_UNIT_IMMEDIATE) : 0;
2814         scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
2815
2816         /*
2817          *      Now send the Fib to the adapter
2818          */
2819         status = aac_fib_send(ContainerCommand,
2820                   cmd_fibcontext,
2821                   sizeof(struct aac_power_management),
2822                   FsaNormal,
2823                   0, 1,
2824                   (fib_callback)aac_start_stop_callback,
2825                   (void *)scsicmd);
2826
2827         /*
2828          *      Check that the command queued to the controller
2829          */
2830         if (status == -EINPROGRESS)
2831                 return 0;
2832
2833         aac_fib_complete(cmd_fibcontext);
2834         aac_fib_free(cmd_fibcontext);
2835         return SCSI_MLQUEUE_HOST_BUSY;
2836 }
2837
2838 /**
2839  *      aac_scsi_cmd()          -       Process SCSI command
2840  *      @scsicmd:               SCSI command block
2841  *
2842  *      Emulate a SCSI command and queue the required request for the
2843  *      aacraid firmware.
2844  */
2845
2846 int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
2847 {
2848         u32 cid, bus;
2849         struct Scsi_Host *host = scsicmd->device->host;
2850         struct aac_dev *dev = (struct aac_dev *)host->hostdata;
2851         struct fsa_dev_info *fsa_dev_ptr = dev->fsa_dev;
2852
2853         if (fsa_dev_ptr == NULL)
2854                 return -1;
2855         /*
2856          *      If the bus, id or lun is out of range, return fail
2857          *      Test does not apply to ID 16, the pseudo id for the controller
2858          *      itself.
2859          */
2860         cid = scmd_id(scsicmd);
2861         if (cid != host->this_id) {
2862                 if (scmd_channel(scsicmd) == CONTAINER_CHANNEL) {
2863                         if((cid >= dev->maximum_num_containers) ||
2864                                         (scsicmd->device->lun != 0)) {
2865                                 scsicmd->result = DID_NO_CONNECT << 16;
2866                                 goto scsi_done_ret;
2867                         }
2868
2869                         /*
2870                          *      If the target container doesn't exist, it may have
2871                          *      been newly created
2872                          */
2873                         if (((fsa_dev_ptr[cid].valid & 1) == 0) ||
2874                           (fsa_dev_ptr[cid].sense_data.sense_key ==
2875                            NOT_READY)) {
2876                                 switch (scsicmd->cmnd[0]) {
2877                                 case SERVICE_ACTION_IN_16:
2878                                         if (!(dev->raw_io_interface) ||
2879                                             !(dev->raw_io_64) ||
2880                                             ((scsicmd->cmnd[1] & 0x1f) != SAI_READ_CAPACITY_16))
2881                                                 break;
2882                                         /* fall through */
2883                                 case INQUIRY:
2884                                 case READ_CAPACITY:
2885                                 case TEST_UNIT_READY:
2886                                         if (dev->in_reset)
2887                                                 return -1;
2888                                         return _aac_probe_container(scsicmd,
2889                                                         aac_probe_container_callback2);
2890                                 default:
2891                                         break;
2892                                 }
2893                         }
2894                 } else {  /* check for physical non-dasd devices */
2895                         bus = aac_logical_to_phys(scmd_channel(scsicmd));
2896
2897                         if (bus < AAC_MAX_BUSES && cid < AAC_MAX_TARGETS &&
2898                                 dev->hba_map[bus][cid].devtype
2899                                         == AAC_DEVTYPE_NATIVE_RAW) {
2900                                 if (dev->in_reset)
2901                                         return -1;
2902                                 return aac_send_hba_fib(scsicmd);
2903                         } else if (dev->nondasd_support || expose_physicals ||
2904                                 dev->jbod) {
2905                                 if (dev->in_reset)
2906                                         return -1;
2907                                 return aac_send_srb_fib(scsicmd);
2908                         } else {
2909                                 scsicmd->result = DID_NO_CONNECT << 16;
2910                                 goto scsi_done_ret;
2911                         }
2912                 }
2913         }
2914         /*
2915          * else Command for the controller itself
2916          */
2917         else if ((scsicmd->cmnd[0] != INQUIRY) &&       /* only INQUIRY & TUR cmnd supported for controller */
2918                 (scsicmd->cmnd[0] != TEST_UNIT_READY))
2919         {
2920                 dprintk((KERN_WARNING "Only INQUIRY & TUR command supported for controller, rcvd = 0x%x.\n", scsicmd->cmnd[0]));
2921                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
2922                 set_sense(&dev->fsa_dev[cid].sense_data,
2923                   ILLEGAL_REQUEST, SENCODE_INVALID_COMMAND,
2924                   ASENCODE_INVALID_COMMAND, 0, 0);
2925                 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
2926                        min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data),
2927                              SCSI_SENSE_BUFFERSIZE));
2928                 goto scsi_done_ret;
2929         }
2930
2931         switch (scsicmd->cmnd[0]) {
2932         case READ_6:
2933         case READ_10:
2934         case READ_12:
2935         case READ_16:
2936                 if (dev->in_reset)
2937                         return -1;
2938                 return aac_read(scsicmd);
2939
2940         case WRITE_6:
2941         case WRITE_10:
2942         case WRITE_12:
2943         case WRITE_16:
2944                 if (dev->in_reset)
2945                         return -1;
2946                 return aac_write(scsicmd);
2947
2948         case SYNCHRONIZE_CACHE:
2949                 if (((aac_cache & 6) == 6) && dev->cache_protected) {
2950                         scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
2951                                           SAM_STAT_GOOD;
2952                         break;
2953                 }
2954                 /* Issue FIB to tell Firmware to flush it's cache */
2955                 if ((aac_cache & 6) != 2)
2956                         return aac_synchronize(scsicmd);
2957                 /* fall through */
2958         case INQUIRY:
2959         {
2960                 struct inquiry_data inq_data;
2961
2962                 dprintk((KERN_DEBUG "INQUIRY command, ID: %d.\n", cid));
2963                 memset(&inq_data, 0, sizeof (struct inquiry_data));
2964
2965                 if ((scsicmd->cmnd[1] & 0x1) && aac_wwn) {
2966                         char *arr = (char *)&inq_data;
2967
2968                         /* EVPD bit set */
2969                         arr[0] = (scmd_id(scsicmd) == host->this_id) ?
2970                           INQD_PDT_PROC : INQD_PDT_DA;
2971                         if (scsicmd->cmnd[2] == 0) {
2972                                 /* supported vital product data pages */
2973                                 arr[3] = 3;
2974                                 arr[4] = 0x0;
2975                                 arr[5] = 0x80;
2976                                 arr[6] = 0x83;
2977                                 arr[1] = scsicmd->cmnd[2];
2978                                 scsi_sg_copy_from_buffer(scsicmd, &inq_data,
2979                                                          sizeof(inq_data));
2980                                 scsicmd->result = DID_OK << 16 |
2981                                                   COMMAND_COMPLETE << 8 |
2982                                                   SAM_STAT_GOOD;
2983                         } else if (scsicmd->cmnd[2] == 0x80) {
2984                                 /* unit serial number page */
2985                                 arr[3] = setinqserial(dev, &arr[4],
2986                                   scmd_id(scsicmd));
2987                                 arr[1] = scsicmd->cmnd[2];
2988                                 scsi_sg_copy_from_buffer(scsicmd, &inq_data,
2989                                                          sizeof(inq_data));
2990                                 if (aac_wwn != 2)
2991                                         return aac_get_container_serial(
2992                                                 scsicmd);
2993                                 scsicmd->result = DID_OK << 16 |
2994                                                   COMMAND_COMPLETE << 8 |
2995                                                   SAM_STAT_GOOD;
2996                         } else if (scsicmd->cmnd[2] == 0x83) {
2997                                 /* vpd page 0x83 - Device Identification Page */
2998                                 char *sno = (char *)&inq_data;
2999                                 sno[3] = setinqserial(dev, &sno[4],
3000                                                       scmd_id(scsicmd));
3001                                 if (aac_wwn != 2)
3002                                         return aac_get_container_serial(
3003                                                 scsicmd);
3004                                 scsicmd->result = DID_OK << 16 |
3005                                                   COMMAND_COMPLETE << 8 |
3006                                                   SAM_STAT_GOOD;
3007                         } else {
3008                                 /* vpd page not implemented */
3009                                 scsicmd->result = DID_OK << 16 |
3010                                   COMMAND_COMPLETE << 8 |
3011                                   SAM_STAT_CHECK_CONDITION;
3012                                 set_sense(&dev->fsa_dev[cid].sense_data,
3013                                   ILLEGAL_REQUEST, SENCODE_INVALID_CDB_FIELD,
3014                                   ASENCODE_NO_SENSE, 7, 2);
3015                                 memcpy(scsicmd->sense_buffer,
3016                                   &dev->fsa_dev[cid].sense_data,
3017                                   min_t(size_t,
3018                                         sizeof(dev->fsa_dev[cid].sense_data),
3019                                         SCSI_SENSE_BUFFERSIZE));
3020                         }
3021                         break;
3022                 }
3023                 inq_data.inqd_ver = 2;  /* claim compliance to SCSI-2 */
3024                 inq_data.inqd_rdf = 2;  /* A response data format value of two indicates that the data shall be in the format specified in SCSI-2 */
3025                 inq_data.inqd_len = 31;
3026                 /*Format for "pad2" is  RelAdr | WBus32 | WBus16 |  Sync  | Linked |Reserved| CmdQue | SftRe */
3027                 inq_data.inqd_pad2= 0x32 ;       /*WBus16|Sync|CmdQue */
3028                 /*
3029                  *      Set the Vendor, Product, and Revision Level
3030                  *      see: <vendor>.c i.e. aac.c
3031                  */
3032                 if (cid == host->this_id) {
3033                         setinqstr(dev, (void *) (inq_data.inqd_vid), ARRAY_SIZE(container_types));
3034                         inq_data.inqd_pdt = INQD_PDT_PROC;      /* Processor device */
3035                         scsi_sg_copy_from_buffer(scsicmd, &inq_data,
3036                                                  sizeof(inq_data));
3037                         scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
3038                                           SAM_STAT_GOOD;
3039                         break;
3040                 }
3041                 if (dev->in_reset)
3042                         return -1;
3043                 setinqstr(dev, (void *) (inq_data.inqd_vid), fsa_dev_ptr[cid].type);
3044                 inq_data.inqd_pdt = INQD_PDT_DA;        /* Direct/random access device */
3045                 scsi_sg_copy_from_buffer(scsicmd, &inq_data, sizeof(inq_data));
3046                 return aac_get_container_name(scsicmd);
3047         }
3048         case SERVICE_ACTION_IN_16:
3049                 if (!(dev->raw_io_interface) ||
3050                     !(dev->raw_io_64) ||
3051                     ((scsicmd->cmnd[1] & 0x1f) != SAI_READ_CAPACITY_16))
3052                         break;
3053         {
3054                 u64 capacity;
3055                 char cp[13];
3056                 unsigned int alloc_len;
3057
3058                 dprintk((KERN_DEBUG "READ CAPACITY_16 command.\n"));
3059                 capacity = fsa_dev_ptr[cid].size - 1;
3060                 cp[0] = (capacity >> 56) & 0xff;
3061                 cp[1] = (capacity >> 48) & 0xff;
3062                 cp[2] = (capacity >> 40) & 0xff;
3063                 cp[3] = (capacity >> 32) & 0xff;
3064                 cp[4] = (capacity >> 24) & 0xff;
3065                 cp[5] = (capacity >> 16) & 0xff;
3066                 cp[6] = (capacity >> 8) & 0xff;
3067                 cp[7] = (capacity >> 0) & 0xff;
3068                 cp[8] = (fsa_dev_ptr[cid].block_size >> 24) & 0xff;
3069                 cp[9] = (fsa_dev_ptr[cid].block_size >> 16) & 0xff;
3070                 cp[10] = (fsa_dev_ptr[cid].block_size >> 8) & 0xff;
3071                 cp[11] = (fsa_dev_ptr[cid].block_size) & 0xff;
3072                 cp[12] = 0;
3073
3074                 alloc_len = ((scsicmd->cmnd[10] << 24)
3075                              + (scsicmd->cmnd[11] << 16)
3076                              + (scsicmd->cmnd[12] << 8) + scsicmd->cmnd[13]);
3077
3078                 alloc_len = min_t(size_t, alloc_len, sizeof(cp));
3079                 scsi_sg_copy_from_buffer(scsicmd, cp, alloc_len);
3080                 if (alloc_len < scsi_bufflen(scsicmd))
3081                         scsi_set_resid(scsicmd,
3082                                        scsi_bufflen(scsicmd) - alloc_len);
3083
3084                 /* Do not cache partition table for arrays */
3085                 scsicmd->device->removable = 1;
3086
3087                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
3088                                   SAM_STAT_GOOD;
3089                 break;
3090         }
3091
3092         case READ_CAPACITY:
3093         {
3094                 u32 capacity;
3095                 char cp[8];
3096
3097                 dprintk((KERN_DEBUG "READ CAPACITY command.\n"));
3098                 if (fsa_dev_ptr[cid].size <= 0x100000000ULL)
3099                         capacity = fsa_dev_ptr[cid].size - 1;
3100                 else
3101                         capacity = (u32)-1;
3102
3103                 cp[0] = (capacity >> 24) & 0xff;
3104                 cp[1] = (capacity >> 16) & 0xff;
3105                 cp[2] = (capacity >> 8) & 0xff;
3106                 cp[3] = (capacity >> 0) & 0xff;
3107                 cp[4] = (fsa_dev_ptr[cid].block_size >> 24) & 0xff;
3108                 cp[5] = (fsa_dev_ptr[cid].block_size >> 16) & 0xff;
3109                 cp[6] = (fsa_dev_ptr[cid].block_size >> 8) & 0xff;
3110                 cp[7] = (fsa_dev_ptr[cid].block_size) & 0xff;
3111                 scsi_sg_copy_from_buffer(scsicmd, cp, sizeof(cp));
3112                 /* Do not cache partition table for arrays */
3113                 scsicmd->device->removable = 1;
3114                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
3115                                   SAM_STAT_GOOD;
3116                 break;
3117         }
3118
3119         case MODE_SENSE:
3120         {
3121                 int mode_buf_length = 4;
3122                 u32 capacity;
3123                 aac_modep_data mpd;
3124
3125                 if (fsa_dev_ptr[cid].size <= 0x100000000ULL)
3126                         capacity = fsa_dev_ptr[cid].size - 1;
3127                 else
3128                         capacity = (u32)-1;
3129
3130                 dprintk((KERN_DEBUG "MODE SENSE command.\n"));
3131                 memset((char *)&mpd, 0, sizeof(aac_modep_data));
3132
3133                 /* Mode data length */
3134                 mpd.hd.data_length = sizeof(mpd.hd) - 1;
3135                 /* Medium type - default */
3136                 mpd.hd.med_type = 0;
3137                 /* Device-specific param,
3138                    bit 8: 0/1 = write enabled/protected
3139                    bit 4: 0/1 = FUA enabled */
3140                 mpd.hd.dev_par = 0;
3141
3142                 if (dev->raw_io_interface && ((aac_cache & 5) != 1))
3143                         mpd.hd.dev_par = 0x10;
3144                 if (scsicmd->cmnd[1] & 0x8)
3145                         mpd.hd.bd_length = 0;   /* Block descriptor length */
3146                 else {
3147                         mpd.hd.bd_length = sizeof(mpd.bd);
3148                         mpd.hd.data_length += mpd.hd.bd_length;
3149                         mpd.bd.block_length[0] =
3150                                 (fsa_dev_ptr[cid].block_size >> 16) & 0xff;
3151                         mpd.bd.block_length[1] =
3152                                 (fsa_dev_ptr[cid].block_size >> 8) &  0xff;
3153                         mpd.bd.block_length[2] =
3154                                 fsa_dev_ptr[cid].block_size  & 0xff;
3155
3156                         mpd.mpc_buf[0] = scsicmd->cmnd[2];
3157                         if (scsicmd->cmnd[2] == 0x1C) {
3158                                 /* page length */
3159                                 mpd.mpc_buf[1] = 0xa;
3160                                 /* Mode data length */
3161                                 mpd.hd.data_length = 23;
3162                         } else {
3163                                 /* Mode data length */
3164                                 mpd.hd.data_length = 15;
3165                         }
3166
3167                         if (capacity > 0xffffff) {
3168                                 mpd.bd.block_count[0] = 0xff;
3169                                 mpd.bd.block_count[1] = 0xff;
3170                                 mpd.bd.block_count[2] = 0xff;
3171                         } else {
3172                                 mpd.bd.block_count[0] = (capacity >> 16) & 0xff;
3173                                 mpd.bd.block_count[1] = (capacity >> 8) & 0xff;
3174                                 mpd.bd.block_count[2] = capacity  & 0xff;
3175                         }
3176                 }
3177                 if (((scsicmd->cmnd[2] & 0x3f) == 8) ||
3178                   ((scsicmd->cmnd[2] & 0x3f) == 0x3f)) {
3179                         mpd.hd.data_length += 3;
3180                         mpd.mpc_buf[0] = 8;
3181                         mpd.mpc_buf[1] = 1;
3182                         mpd.mpc_buf[2] = ((aac_cache & 6) == 2)
3183                                 ? 0 : 0x04; /* WCE */
3184                         mode_buf_length = sizeof(mpd);
3185                 }
3186
3187                 if (mode_buf_length > scsicmd->cmnd[4])
3188                         mode_buf_length = scsicmd->cmnd[4];
3189                 else
3190                         mode_buf_length = sizeof(mpd);
3191                 scsi_sg_copy_from_buffer(scsicmd,
3192                                          (char *)&mpd,
3193                                          mode_buf_length);
3194                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
3195                                   SAM_STAT_GOOD;
3196                 break;
3197         }
3198         case MODE_SENSE_10:
3199         {
3200                 u32 capacity;
3201                 int mode_buf_length = 8;
3202                 aac_modep10_data mpd10;
3203
3204                 if (fsa_dev_ptr[cid].size <= 0x100000000ULL)
3205                         capacity = fsa_dev_ptr[cid].size - 1;
3206                 else
3207                         capacity = (u32)-1;
3208
3209                 dprintk((KERN_DEBUG "MODE SENSE 10 byte command.\n"));
3210                 memset((char *)&mpd10, 0, sizeof(aac_modep10_data));
3211                 /* Mode data length (MSB) */
3212                 mpd10.hd.data_length[0] = 0;
3213                 /* Mode data length (LSB) */
3214                 mpd10.hd.data_length[1] = sizeof(mpd10.hd) - 1;
3215                 /* Medium type - default */
3216                 mpd10.hd.med_type = 0;
3217                 /* Device-specific param,
3218                    bit 8: 0/1 = write enabled/protected
3219                    bit 4: 0/1 = FUA enabled */
3220                 mpd10.hd.dev_par = 0;
3221
3222                 if (dev->raw_io_interface && ((aac_cache & 5) != 1))
3223                         mpd10.hd.dev_par = 0x10;
3224                 mpd10.hd.rsrvd[0] = 0;  /* reserved */
3225                 mpd10.hd.rsrvd[1] = 0;  /* reserved */
3226                 if (scsicmd->cmnd[1] & 0x8) {
3227                         /* Block descriptor length (MSB) */
3228                         mpd10.hd.bd_length[0] = 0;
3229                         /* Block descriptor length (LSB) */
3230                         mpd10.hd.bd_length[1] = 0;
3231                 } else {
3232                         mpd10.hd.bd_length[0] = 0;
3233                         mpd10.hd.bd_length[1] = sizeof(mpd10.bd);
3234
3235                         mpd10.hd.data_length[1] += mpd10.hd.bd_length[1];
3236
3237                         mpd10.bd.block_length[0] =
3238                                 (fsa_dev_ptr[cid].block_size >> 16) & 0xff;
3239                         mpd10.bd.block_length[1] =
3240                                 (fsa_dev_ptr[cid].block_size >> 8) & 0xff;
3241                         mpd10.bd.block_length[2] =
3242                                 fsa_dev_ptr[cid].block_size  & 0xff;
3243
3244                         if (capacity > 0xffffff) {
3245                                 mpd10.bd.block_count[0] = 0xff;
3246                                 mpd10.bd.block_count[1] = 0xff;
3247                                 mpd10.bd.block_count[2] = 0xff;
3248                         } else {
3249                                 mpd10.bd.block_count[0] =
3250                                         (capacity >> 16) & 0xff;
3251                                 mpd10.bd.block_count[1] =
3252                                         (capacity >> 8) & 0xff;
3253                                 mpd10.bd.block_count[2] =
3254                                         capacity  & 0xff;
3255                         }
3256                 }
3257                 if (((scsicmd->cmnd[2] & 0x3f) == 8) ||
3258                   ((scsicmd->cmnd[2] & 0x3f) == 0x3f)) {
3259                         mpd10.hd.data_length[1] += 3;
3260                         mpd10.mpc_buf[0] = 8;
3261                         mpd10.mpc_buf[1] = 1;
3262                         mpd10.mpc_buf[2] = ((aac_cache & 6) == 2)
3263                                 ? 0 : 0x04; /* WCE */
3264                         mode_buf_length = sizeof(mpd10);
3265                         if (mode_buf_length > scsicmd->cmnd[8])
3266                                 mode_buf_length = scsicmd->cmnd[8];
3267                 }
3268                 scsi_sg_copy_from_buffer(scsicmd,
3269                                          (char *)&mpd10,
3270                                          mode_buf_length);
3271
3272                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
3273                                   SAM_STAT_GOOD;
3274                 break;
3275         }
3276         case REQUEST_SENSE:
3277                 dprintk((KERN_DEBUG "REQUEST SENSE command.\n"));
3278                 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
3279                                 sizeof(struct sense_data));
3280                 memset(&dev->fsa_dev[cid].sense_data, 0,
3281                                 sizeof(struct sense_data));
3282                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
3283                                   SAM_STAT_GOOD;
3284                 break;
3285
3286         case ALLOW_MEDIUM_REMOVAL:
3287                 dprintk((KERN_DEBUG "LOCK command.\n"));
3288                 if (scsicmd->cmnd[4])
3289                         fsa_dev_ptr[cid].locked = 1;
3290                 else
3291                         fsa_dev_ptr[cid].locked = 0;
3292
3293                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
3294                                   SAM_STAT_GOOD;
3295                 break;
3296         /*
3297          *      These commands are all No-Ops
3298          */
3299         case TEST_UNIT_READY:
3300                 if (fsa_dev_ptr[cid].sense_data.sense_key == NOT_READY) {
3301                         scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
3302                                 SAM_STAT_CHECK_CONDITION;
3303                         set_sense(&dev->fsa_dev[cid].sense_data,
3304                                   NOT_READY, SENCODE_BECOMING_READY,
3305                                   ASENCODE_BECOMING_READY, 0, 0);
3306                         memcpy(scsicmd->sense_buffer,
3307                                &dev->fsa_dev[cid].sense_data,
3308                                min_t(size_t,
3309                                      sizeof(dev->fsa_dev[cid].sense_data),
3310                                      SCSI_SENSE_BUFFERSIZE));
3311                         break;
3312                 }
3313                 /* fall through */
3314         case RESERVE:
3315         case RELEASE:
3316         case REZERO_UNIT:
3317         case REASSIGN_BLOCKS:
3318         case SEEK_10:
3319                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
3320                                   SAM_STAT_GOOD;
3321                 break;
3322
3323         case START_STOP:
3324                 return aac_start_stop(scsicmd);
3325
3326         /* FALLTHRU */
3327         default:
3328         /*
3329          *      Unhandled commands
3330          */
3331                 dprintk((KERN_WARNING "Unhandled SCSI Command: 0x%x.\n",
3332                                 scsicmd->cmnd[0]));
3333                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
3334                                 SAM_STAT_CHECK_CONDITION;
3335                 set_sense(&dev->fsa_dev[cid].sense_data,
3336                           ILLEGAL_REQUEST, SENCODE_INVALID_COMMAND,
3337                           ASENCODE_INVALID_COMMAND, 0, 0);
3338                 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
3339                                 min_t(size_t,
3340                                       sizeof(dev->fsa_dev[cid].sense_data),
3341                                       SCSI_SENSE_BUFFERSIZE));
3342         }
3343
3344 scsi_done_ret:
3345
3346         scsicmd->scsi_done(scsicmd);
3347         return 0;
3348 }
3349
3350 static int query_disk(struct aac_dev *dev, void __user *arg)
3351 {
3352         struct aac_query_disk qd;
3353         struct fsa_dev_info *fsa_dev_ptr;
3354
3355         fsa_dev_ptr = dev->fsa_dev;
3356         if (!fsa_dev_ptr)
3357                 return -EBUSY;
3358         if (copy_from_user(&qd, arg, sizeof (struct aac_query_disk)))
3359                 return -EFAULT;
3360         if (qd.cnum == -1) {
3361                 if (qd.id < 0 || qd.id >= dev->maximum_num_containers)
3362                         return -EINVAL;
3363                 qd.cnum = qd.id;
3364         } else if ((qd.bus == -1) && (qd.id == -1) && (qd.lun == -1)) {
3365                 if (qd.cnum < 0 || qd.cnum >= dev->maximum_num_containers)
3366                         return -EINVAL;
3367                 qd.instance = dev->scsi_host_ptr->host_no;
3368                 qd.bus = 0;
3369                 qd.id = CONTAINER_TO_ID(qd.cnum);
3370                 qd.lun = CONTAINER_TO_LUN(qd.cnum);
3371         }
3372         else return -EINVAL;
3373
3374         qd.valid = fsa_dev_ptr[qd.cnum].valid != 0;
3375         qd.locked = fsa_dev_ptr[qd.cnum].locked;
3376         qd.deleted = fsa_dev_ptr[qd.cnum].deleted;
3377
3378         if (fsa_dev_ptr[qd.cnum].devname[0] == '\0')
3379                 qd.unmapped = 1;
3380         else
3381                 qd.unmapped = 0;
3382
3383         strlcpy(qd.name, fsa_dev_ptr[qd.cnum].devname,
3384           min(sizeof(qd.name), sizeof(fsa_dev_ptr[qd.cnum].devname) + 1));
3385
3386         if (copy_to_user(arg, &qd, sizeof (struct aac_query_disk)))
3387                 return -EFAULT;
3388         return 0;
3389 }
3390
3391 static int force_delete_disk(struct aac_dev *dev, void __user *arg)
3392 {
3393         struct aac_delete_disk dd;
3394         struct fsa_dev_info *fsa_dev_ptr;
3395
3396         fsa_dev_ptr = dev->fsa_dev;
3397         if (!fsa_dev_ptr)
3398                 return -EBUSY;
3399
3400         if (copy_from_user(&dd, arg, sizeof (struct aac_delete_disk)))
3401                 return -EFAULT;
3402
3403         if (dd.cnum >= dev->maximum_num_containers)
3404                 return -EINVAL;
3405         /*
3406          *      Mark this container as being deleted.
3407          */
3408         fsa_dev_ptr[dd.cnum].deleted = 1;
3409         /*
3410          *      Mark the container as no longer valid
3411          */
3412         fsa_dev_ptr[dd.cnum].valid = 0;
3413         return 0;
3414 }
3415
3416 static int delete_disk(struct aac_dev *dev, void __user *arg)
3417 {
3418         struct aac_delete_disk dd;
3419         struct fsa_dev_info *fsa_dev_ptr;
3420
3421         fsa_dev_ptr = dev->fsa_dev;
3422         if (!fsa_dev_ptr)
3423                 return -EBUSY;
3424
3425         if (copy_from_user(&dd, arg, sizeof (struct aac_delete_disk)))
3426                 return -EFAULT;
3427
3428         if (dd.cnum >= dev->maximum_num_containers)
3429                 return -EINVAL;
3430         /*
3431          *      If the container is locked, it can not be deleted by the API.
3432          */
3433         if (fsa_dev_ptr[dd.cnum].locked)
3434                 return -EBUSY;
3435         else {
3436                 /*
3437                  *      Mark the container as no longer being valid.
3438                  */
3439                 fsa_dev_ptr[dd.cnum].valid = 0;
3440                 fsa_dev_ptr[dd.cnum].devname[0] = '\0';
3441                 return 0;
3442         }
3443 }
3444
3445 int aac_dev_ioctl(struct aac_dev *dev, unsigned int cmd, void __user *arg)
3446 {
3447         switch (cmd) {
3448         case FSACTL_QUERY_DISK:
3449                 return query_disk(dev, arg);
3450         case FSACTL_DELETE_DISK:
3451                 return delete_disk(dev, arg);
3452         case FSACTL_FORCE_DELETE_DISK:
3453                 return force_delete_disk(dev, arg);
3454         case FSACTL_GET_CONTAINERS:
3455                 return aac_get_containers(dev);
3456         default:
3457                 return -ENOTTY;
3458         }
3459 }
3460
3461 /**
3462  *
3463  * aac_srb_callback
3464  * @context: the context set in the fib - here it is scsi cmd
3465  * @fibptr: pointer to the fib
3466  *
3467  * Handles the completion of a scsi command to a non dasd device
3468  *
3469  */
3470
3471 static void aac_srb_callback(void *context, struct fib * fibptr)
3472 {
3473         struct aac_srb_reply *srbreply;
3474         struct scsi_cmnd *scsicmd;
3475
3476         scsicmd = (struct scsi_cmnd *) context;
3477
3478         if (!aac_valid_context(scsicmd, fibptr))
3479                 return;
3480
3481         BUG_ON(fibptr == NULL);
3482
3483         srbreply = (struct aac_srb_reply *) fib_data(fibptr);
3484
3485         scsicmd->sense_buffer[0] = '\0';  /* Initialize sense valid flag to false */
3486
3487         if (fibptr->flags & FIB_CONTEXT_FLAG_FASTRESP) {
3488                 /* fast response */
3489                 srbreply->srb_status = cpu_to_le32(SRB_STATUS_SUCCESS);
3490                 srbreply->scsi_status = cpu_to_le32(SAM_STAT_GOOD);
3491         } else {
3492                 /*
3493                  *      Calculate resid for sg
3494                  */
3495                 scsi_set_resid(scsicmd, scsi_bufflen(scsicmd)
3496                                    - le32_to_cpu(srbreply->data_xfer_length));
3497         }
3498
3499
3500         scsi_dma_unmap(scsicmd);
3501
3502         /* expose physical device if expose_physicald flag is on */
3503         if (scsicmd->cmnd[0] == INQUIRY && !(scsicmd->cmnd[1] & 0x01)
3504           && expose_physicals > 0)
3505                 aac_expose_phy_device(scsicmd);
3506
3507         /*
3508          * First check the fib status
3509          */
3510
3511         if (le32_to_cpu(srbreply->status) != ST_OK) {
3512                 int len;
3513
3514                 pr_warn("aac_srb_callback: srb failed, status = %d\n",
3515                                 le32_to_cpu(srbreply->status));
3516                 len = min_t(u32, le32_to_cpu(srbreply->sense_data_size),
3517                             SCSI_SENSE_BUFFERSIZE);
3518                 scsicmd->result = DID_ERROR << 16
3519                                 | COMMAND_COMPLETE << 8
3520                                 | SAM_STAT_CHECK_CONDITION;
3521                 memcpy(scsicmd->sense_buffer,
3522                                 srbreply->sense_data, len);
3523         }
3524
3525         /*
3526          * Next check the srb status
3527          */
3528         switch ((le32_to_cpu(srbreply->srb_status))&0x3f) {
3529         case SRB_STATUS_ERROR_RECOVERY:
3530         case SRB_STATUS_PENDING:
3531         case SRB_STATUS_SUCCESS:
3532                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
3533                 break;
3534         case SRB_STATUS_DATA_OVERRUN:
3535                 switch (scsicmd->cmnd[0]) {
3536                 case  READ_6:
3537                 case  WRITE_6:
3538                 case  READ_10:
3539                 case  WRITE_10:
3540                 case  READ_12:
3541                 case  WRITE_12:
3542                 case  READ_16:
3543                 case  WRITE_16:
3544                         if (le32_to_cpu(srbreply->data_xfer_length)
3545                                                 < scsicmd->underflow)
3546                                 pr_warn("aacraid: SCSI CMD underflow\n");
3547                         else
3548                                 pr_warn("aacraid: SCSI CMD Data Overrun\n");
3549                         scsicmd->result = DID_ERROR << 16
3550                                         | COMMAND_COMPLETE << 8;
3551                         break;
3552                 case INQUIRY:
3553                         scsicmd->result = DID_OK << 16
3554                                         | COMMAND_COMPLETE << 8;
3555                         break;
3556                 default:
3557                         scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
3558                         break;
3559                 }
3560                 break;
3561         case SRB_STATUS_ABORTED:
3562                 scsicmd->result = DID_ABORT << 16 | ABORT << 8;
3563                 break;
3564         case SRB_STATUS_ABORT_FAILED:
3565                 /*
3566                  * Not sure about this one - but assuming the
3567                  * hba was trying to abort for some reason
3568                  */
3569                 scsicmd->result = DID_ERROR << 16 | ABORT << 8;
3570                 break;
3571         case SRB_STATUS_PARITY_ERROR:
3572                 scsicmd->result = DID_PARITY << 16
3573                                 | MSG_PARITY_ERROR << 8;
3574                 break;
3575         case SRB_STATUS_NO_DEVICE:
3576         case SRB_STATUS_INVALID_PATH_ID:
3577         case SRB_STATUS_INVALID_TARGET_ID:
3578         case SRB_STATUS_INVALID_LUN:
3579         case SRB_STATUS_SELECTION_TIMEOUT:
3580                 scsicmd->result = DID_NO_CONNECT << 16
3581                                 | COMMAND_COMPLETE << 8;
3582                 break;
3583
3584         case SRB_STATUS_COMMAND_TIMEOUT:
3585         case SRB_STATUS_TIMEOUT:
3586                 scsicmd->result = DID_TIME_OUT << 16
3587                                 | COMMAND_COMPLETE << 8;
3588                 break;
3589
3590         case SRB_STATUS_BUSY:
3591                 scsicmd->result = DID_BUS_BUSY << 16
3592                                 | COMMAND_COMPLETE << 8;
3593                 break;
3594
3595         case SRB_STATUS_BUS_RESET:
3596                 scsicmd->result = DID_RESET << 16
3597                                 | COMMAND_COMPLETE << 8;
3598                 break;
3599
3600         case SRB_STATUS_MESSAGE_REJECTED:
3601                 scsicmd->result = DID_ERROR << 16
3602                                 | MESSAGE_REJECT << 8;
3603                 break;
3604         case SRB_STATUS_REQUEST_FLUSHED:
3605         case SRB_STATUS_ERROR:
3606         case SRB_STATUS_INVALID_REQUEST:
3607         case SRB_STATUS_REQUEST_SENSE_FAILED:
3608         case SRB_STATUS_NO_HBA:
3609         case SRB_STATUS_UNEXPECTED_BUS_FREE:
3610         case SRB_STATUS_PHASE_SEQUENCE_FAILURE:
3611         case SRB_STATUS_BAD_SRB_BLOCK_LENGTH:
3612         case SRB_STATUS_DELAYED_RETRY:
3613         case SRB_STATUS_BAD_FUNCTION:
3614         case SRB_STATUS_NOT_STARTED:
3615         case SRB_STATUS_NOT_IN_USE:
3616         case SRB_STATUS_FORCE_ABORT:
3617         case SRB_STATUS_DOMAIN_VALIDATION_FAIL:
3618         default:
3619 #ifdef AAC_DETAILED_STATUS_INFO
3620                 pr_info("aacraid: SRB ERROR(%u) %s scsi cmd 0x%x -scsi status 0x%x\n",
3621                         le32_to_cpu(srbreply->srb_status) & 0x3F,
3622                         aac_get_status_string(
3623                                 le32_to_cpu(srbreply->srb_status) & 0x3F),
3624                         scsicmd->cmnd[0],
3625                         le32_to_cpu(srbreply->scsi_status));
3626 #endif
3627                 /*
3628                  * When the CC bit is SET by the host in ATA pass thru CDB,
3629                  *  driver is supposed to return DID_OK
3630                  *
3631                  * When the CC bit is RESET by the host, driver should
3632                  *  return DID_ERROR
3633                  */
3634                 if ((scsicmd->cmnd[0] == ATA_12)
3635                         || (scsicmd->cmnd[0] == ATA_16)) {
3636
3637                         if (scsicmd->cmnd[2] & (0x01 << 5)) {
3638                                 scsicmd->result = DID_OK << 16
3639                                         | COMMAND_COMPLETE << 8;
3640                         break;
3641                         } else {
3642                                 scsicmd->result = DID_ERROR << 16
3643                                         | COMMAND_COMPLETE << 8;
3644                         break;
3645                         }
3646                 } else {
3647                         scsicmd->result = DID_ERROR << 16
3648                                 | COMMAND_COMPLETE << 8;
3649                         break;
3650                 }
3651         }
3652         if (le32_to_cpu(srbreply->scsi_status)
3653                         == SAM_STAT_CHECK_CONDITION) {
3654                 int len;
3655
3656                 scsicmd->result |= SAM_STAT_CHECK_CONDITION;
3657                 len = min_t(u32, le32_to_cpu(srbreply->sense_data_size),
3658                             SCSI_SENSE_BUFFERSIZE);
3659 #ifdef AAC_DETAILED_STATUS_INFO
3660                 pr_warn("aac_srb_callback: check condition, status = %d len=%d\n",
3661                                         le32_to_cpu(srbreply->status), len);
3662 #endif
3663                 memcpy(scsicmd->sense_buffer,
3664                                 srbreply->sense_data, len);
3665         }
3666
3667         /*
3668          * OR in the scsi status (already shifted up a bit)
3669          */
3670         scsicmd->result |= le32_to_cpu(srbreply->scsi_status);
3671
3672         aac_fib_complete(fibptr);
3673         scsicmd->scsi_done(scsicmd);
3674 }
3675
3676 static void hba_resp_task_complete(struct aac_dev *dev,
3677                                         struct scsi_cmnd *scsicmd,
3678                                         struct aac_hba_resp *err) {
3679
3680         scsicmd->result = err->status;
3681         /* set residual count */
3682         scsi_set_resid(scsicmd, le32_to_cpu(err->residual_count));
3683
3684         switch (err->status) {
3685         case SAM_STAT_GOOD:
3686                 scsicmd->result |= DID_OK << 16 | COMMAND_COMPLETE << 8;
3687                 break;
3688         case SAM_STAT_CHECK_CONDITION:
3689         {
3690                 int len;
3691
3692                 len = min_t(u8, err->sense_response_data_len,
3693                         SCSI_SENSE_BUFFERSIZE);
3694                 if (len)
3695                         memcpy(scsicmd->sense_buffer,
3696                                 err->sense_response_buf, len);
3697                 scsicmd->result |= DID_OK << 16 | COMMAND_COMPLETE << 8;
3698                 break;
3699         }
3700         case SAM_STAT_BUSY:
3701                 scsicmd->result |= DID_BUS_BUSY << 16 | COMMAND_COMPLETE << 8;
3702                 break;
3703         case SAM_STAT_TASK_ABORTED:
3704                 scsicmd->result |= DID_ABORT << 16 | ABORT << 8;
3705                 break;
3706         case SAM_STAT_RESERVATION_CONFLICT:
3707         case SAM_STAT_TASK_SET_FULL:
3708         default:
3709                 scsicmd->result |= DID_ERROR << 16 | COMMAND_COMPLETE << 8;
3710                 break;
3711         }
3712 }
3713
3714 static void hba_resp_task_failure(struct aac_dev *dev,
3715                                         struct scsi_cmnd *scsicmd,
3716                                         struct aac_hba_resp *err)
3717 {
3718         switch (err->status) {
3719         case HBA_RESP_STAT_HBAMODE_DISABLED:
3720         {
3721                 u32 bus, cid;
3722
3723                 bus = aac_logical_to_phys(scmd_channel(scsicmd));
3724                 cid = scmd_id(scsicmd);
3725                 if (dev->hba_map[bus][cid].devtype == AAC_DEVTYPE_NATIVE_RAW) {
3726                         dev->hba_map[bus][cid].devtype = AAC_DEVTYPE_ARC_RAW;
3727                         dev->hba_map[bus][cid].rmw_nexus = 0xffffffff;
3728                 }
3729                 scsicmd->result = DID_NO_CONNECT << 16 | COMMAND_COMPLETE << 8;
3730                 break;
3731         }
3732         case HBA_RESP_STAT_IO_ERROR:
3733         case HBA_RESP_STAT_NO_PATH_TO_DEVICE:
3734                 scsicmd->result = DID_OK << 16 |
3735                         COMMAND_COMPLETE << 8 | SAM_STAT_BUSY;
3736                 break;
3737         case HBA_RESP_STAT_IO_ABORTED:
3738                 scsicmd->result = DID_ABORT << 16 | ABORT << 8;
3739                 break;
3740         case HBA_RESP_STAT_INVALID_DEVICE:
3741                 scsicmd->result = DID_NO_CONNECT << 16 | COMMAND_COMPLETE << 8;
3742                 break;
3743         case HBA_RESP_STAT_UNDERRUN:
3744                 /* UNDERRUN is OK */
3745                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
3746                 break;
3747         case HBA_RESP_STAT_OVERRUN:
3748         default:
3749                 scsicmd->result = DID_ERROR << 16 | COMMAND_COMPLETE << 8;
3750                 break;
3751         }
3752 }
3753
3754 /**
3755  *
3756  * aac_hba_callback
3757  * @context: the context set in the fib - here it is scsi cmd
3758  * @fibptr: pointer to the fib
3759  *
3760  * Handles the completion of a native HBA scsi command
3761  *
3762  */
3763 void aac_hba_callback(void *context, struct fib *fibptr)
3764 {
3765         struct aac_dev *dev;
3766         struct scsi_cmnd *scsicmd;
3767
3768         struct aac_hba_resp *err =
3769                         &((struct aac_native_hba *)fibptr->hw_fib_va)->resp.err;
3770
3771         scsicmd = (struct scsi_cmnd *) context;
3772
3773         if (!aac_valid_context(scsicmd, fibptr))
3774                 return;
3775
3776         WARN_ON(fibptr == NULL);
3777         dev = fibptr->dev;
3778
3779         if (!(fibptr->flags & FIB_CONTEXT_FLAG_NATIVE_HBA_TMF))
3780                 scsi_dma_unmap(scsicmd);
3781
3782         if (fibptr->flags & FIB_CONTEXT_FLAG_FASTRESP) {
3783                 /* fast response */
3784                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
3785                 goto out;
3786         }
3787
3788         switch (err->service_response) {
3789         case HBA_RESP_SVCRES_TASK_COMPLETE:
3790                 hba_resp_task_complete(dev, scsicmd, err);
3791                 break;
3792         case HBA_RESP_SVCRES_FAILURE:
3793                 hba_resp_task_failure(dev, scsicmd, err);
3794                 break;
3795         case HBA_RESP_SVCRES_TMF_REJECTED:
3796                 scsicmd->result = DID_ERROR << 16 | MESSAGE_REJECT << 8;
3797                 break;
3798         case HBA_RESP_SVCRES_TMF_LUN_INVALID:
3799                 scsicmd->result = DID_NO_CONNECT << 16 | COMMAND_COMPLETE << 8;
3800                 break;
3801         case HBA_RESP_SVCRES_TMF_COMPLETE:
3802         case HBA_RESP_SVCRES_TMF_SUCCEEDED:
3803                 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
3804                 break;
3805         default:
3806                 scsicmd->result = DID_ERROR << 16 | COMMAND_COMPLETE << 8;
3807                 break;
3808         }
3809
3810 out:
3811         aac_fib_complete(fibptr);
3812
3813         if (fibptr->flags & FIB_CONTEXT_FLAG_NATIVE_HBA_TMF)
3814                 scsicmd->SCp.sent_command = 1;
3815         else
3816                 scsicmd->scsi_done(scsicmd);
3817 }
3818
3819 /**
3820  *
3821  * aac_send_srb_fib
3822  * @scsicmd: the scsi command block
3823  *
3824  * This routine will form a FIB and fill in the aac_srb from the
3825  * scsicmd passed in.
3826  */
3827
3828 static int aac_send_srb_fib(struct scsi_cmnd* scsicmd)
3829 {
3830         struct fib* cmd_fibcontext;
3831         struct aac_dev* dev;
3832         int status;
3833
3834         dev = (struct aac_dev *)scsicmd->device->host->hostdata;
3835         if (scmd_id(scsicmd) >= dev->maximum_num_physicals ||
3836                         scsicmd->device->lun > 7) {
3837                 scsicmd->result = DID_NO_CONNECT << 16;
3838                 scsicmd->scsi_done(scsicmd);
3839                 return 0;
3840         }
3841
3842         /*
3843          *      Allocate and initialize a Fib then setup a BlockWrite command
3844          */
3845         cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
3846         scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
3847         status = aac_adapter_scsi(cmd_fibcontext, scsicmd);
3848
3849         /*
3850          *      Check that the command queued to the controller
3851          */
3852         if (status == -EINPROGRESS)
3853                 return 0;
3854
3855         printk(KERN_WARNING "aac_srb: aac_fib_send failed with status: %d\n", status);
3856         aac_fib_complete(cmd_fibcontext);
3857         aac_fib_free(cmd_fibcontext);
3858
3859         return -1;
3860 }
3861
3862 /**
3863  *
3864  * aac_send_hba_fib
3865  * @scsicmd: the scsi command block
3866  *
3867  * This routine will form a FIB and fill in the aac_hba_cmd_req from the
3868  * scsicmd passed in.
3869  */
3870 static int aac_send_hba_fib(struct scsi_cmnd *scsicmd)
3871 {
3872         struct fib *cmd_fibcontext;
3873         struct aac_dev *dev;
3874         int status;
3875
3876         dev = shost_priv(scsicmd->device->host);
3877         if (scmd_id(scsicmd) >= dev->maximum_num_physicals ||
3878                         scsicmd->device->lun > AAC_MAX_LUN - 1) {
3879                 scsicmd->result = DID_NO_CONNECT << 16;
3880                 scsicmd->scsi_done(scsicmd);
3881                 return 0;
3882         }
3883
3884         /*
3885          *      Allocate and initialize a Fib then setup a BlockWrite command
3886          */
3887         cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
3888         if (!cmd_fibcontext)
3889                 return -1;
3890
3891         scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
3892         status = aac_adapter_hba(cmd_fibcontext, scsicmd);
3893
3894         /*
3895          *      Check that the command queued to the controller
3896          */
3897         if (status == -EINPROGRESS)
3898                 return 0;
3899
3900         pr_warn("aac_hba_cmd_req: aac_fib_send failed with status: %d\n",
3901                 status);
3902         aac_fib_complete(cmd_fibcontext);
3903         aac_fib_free(cmd_fibcontext);
3904
3905         return -1;
3906 }
3907
3908
3909 static long aac_build_sg(struct scsi_cmnd *scsicmd, struct sgmap *psg)
3910 {
3911         unsigned long byte_count = 0;
3912         int nseg;
3913         struct scatterlist *sg;
3914         int i;
3915
3916         // Get rid of old data
3917         psg->count = 0;
3918         psg->sg[0].addr = 0;
3919         psg->sg[0].count = 0;
3920
3921         nseg = scsi_dma_map(scsicmd);
3922         if (nseg <= 0)
3923                 return nseg;
3924
3925         psg->count = cpu_to_le32(nseg);
3926
3927         scsi_for_each_sg(scsicmd, sg, nseg, i) {
3928                 psg->sg[i].addr = cpu_to_le32(sg_dma_address(sg));
3929                 psg->sg[i].count = cpu_to_le32(sg_dma_len(sg));
3930                 byte_count += sg_dma_len(sg);
3931         }
3932         /* hba wants the size to be exact */
3933         if (byte_count > scsi_bufflen(scsicmd)) {
3934                 u32 temp = le32_to_cpu(psg->sg[i-1].count) -
3935                         (byte_count - scsi_bufflen(scsicmd));
3936                 psg->sg[i-1].count = cpu_to_le32(temp);
3937                 byte_count = scsi_bufflen(scsicmd);
3938         }
3939         /* Check for command underflow */
3940         if (scsicmd->underflow && (byte_count < scsicmd->underflow)) {
3941                 printk(KERN_WARNING"aacraid: cmd len %08lX cmd underflow %08X\n",
3942                        byte_count, scsicmd->underflow);
3943         }
3944
3945         return byte_count;
3946 }
3947
3948
3949 static long aac_build_sg64(struct scsi_cmnd *scsicmd, struct sgmap64 *psg)
3950 {
3951         unsigned long byte_count = 0;
3952         u64 addr;
3953         int nseg;
3954         struct scatterlist *sg;
3955         int i;
3956
3957         // Get rid of old data
3958         psg->count = 0;
3959         psg->sg[0].addr[0] = 0;
3960         psg->sg[0].addr[1] = 0;
3961         psg->sg[0].count = 0;
3962
3963         nseg = scsi_dma_map(scsicmd);
3964         if (nseg <= 0)
3965                 return nseg;
3966
3967         scsi_for_each_sg(scsicmd, sg, nseg, i) {
3968                 int count = sg_dma_len(sg);
3969                 addr = sg_dma_address(sg);
3970                 psg->sg[i].addr[0] = cpu_to_le32(addr & 0xffffffff);
3971                 psg->sg[i].addr[1] = cpu_to_le32(addr>>32);
3972                 psg->sg[i].count = cpu_to_le32(count);
3973                 byte_count += count;
3974         }
3975         psg->count = cpu_to_le32(nseg);
3976         /* hba wants the size to be exact */
3977         if (byte_count > scsi_bufflen(scsicmd)) {
3978                 u32 temp = le32_to_cpu(psg->sg[i-1].count) -
3979                         (byte_count - scsi_bufflen(scsicmd));
3980                 psg->sg[i-1].count = cpu_to_le32(temp);
3981                 byte_count = scsi_bufflen(scsicmd);
3982         }
3983         /* Check for command underflow */
3984         if (scsicmd->underflow && (byte_count < scsicmd->underflow)) {
3985                 printk(KERN_WARNING"aacraid: cmd len %08lX cmd underflow %08X\n",
3986                        byte_count, scsicmd->underflow);
3987         }
3988
3989         return byte_count;
3990 }
3991
3992 static long aac_build_sgraw(struct scsi_cmnd *scsicmd, struct sgmapraw *psg)
3993 {
3994         unsigned long byte_count = 0;
3995         int nseg;
3996         struct scatterlist *sg;
3997         int i;
3998
3999         // Get rid of old data
4000         psg->count = 0;
4001         psg->sg[0].next = 0;
4002         psg->sg[0].prev = 0;
4003         psg->sg[0].addr[0] = 0;
4004         psg->sg[0].addr[1] = 0;
4005         psg->sg[0].count = 0;
4006         psg->sg[0].flags = 0;
4007
4008         nseg = scsi_dma_map(scsicmd);
4009         if (nseg <= 0)
4010                 return nseg;
4011
4012         scsi_for_each_sg(scsicmd, sg, nseg, i) {
4013                 int count = sg_dma_len(sg);
4014                 u64 addr = sg_dma_address(sg);
4015                 psg->sg[i].next = 0;
4016                 psg->sg[i].prev = 0;
4017                 psg->sg[i].addr[1] = cpu_to_le32((u32)(addr>>32));
4018                 psg->sg[i].addr[0] = cpu_to_le32((u32)(addr & 0xffffffff));
4019                 psg->sg[i].count = cpu_to_le32(count);
4020                 psg->sg[i].flags = 0;
4021                 byte_count += count;
4022         }
4023         psg->count = cpu_to_le32(nseg);
4024         /* hba wants the size to be exact */
4025         if (byte_count > scsi_bufflen(scsicmd)) {
4026                 u32 temp = le32_to_cpu(psg->sg[i-1].count) -
4027                         (byte_count - scsi_bufflen(scsicmd));
4028                 psg->sg[i-1].count = cpu_to_le32(temp);
4029                 byte_count = scsi_bufflen(scsicmd);
4030         }
4031         /* Check for command underflow */
4032         if (scsicmd->underflow && (byte_count < scsicmd->underflow)) {
4033                 printk(KERN_WARNING"aacraid: cmd len %08lX cmd underflow %08X\n",
4034                        byte_count, scsicmd->underflow);
4035         }
4036
4037         return byte_count;
4038 }
4039
4040 static long aac_build_sgraw2(struct scsi_cmnd *scsicmd,
4041                                 struct aac_raw_io2 *rio2, int sg_max)
4042 {
4043         unsigned long byte_count = 0;
4044         int nseg;
4045         struct scatterlist *sg;
4046         int i, conformable = 0;
4047         u32 min_size = PAGE_SIZE, cur_size;
4048
4049         nseg = scsi_dma_map(scsicmd);
4050         if (nseg <= 0)
4051                 return nseg;
4052
4053         scsi_for_each_sg(scsicmd, sg, nseg, i) {
4054                 int count = sg_dma_len(sg);
4055                 u64 addr = sg_dma_address(sg);
4056
4057                 BUG_ON(i >= sg_max);
4058                 rio2->sge[i].addrHigh = cpu_to_le32((u32)(addr>>32));
4059                 rio2->sge[i].addrLow = cpu_to_le32((u32)(addr & 0xffffffff));
4060                 cur_size = cpu_to_le32(count);
4061                 rio2->sge[i].length = cur_size;
4062                 rio2->sge[i].flags = 0;
4063                 if (i == 0) {
4064                         conformable = 1;
4065                         rio2->sgeFirstSize = cur_size;
4066                 } else if (i == 1) {
4067                         rio2->sgeNominalSize = cur_size;
4068                         min_size = cur_size;
4069                 } else if ((i+1) < nseg && cur_size != rio2->sgeNominalSize) {
4070                         conformable = 0;
4071                         if (cur_size < min_size)
4072                                 min_size = cur_size;
4073                 }
4074                 byte_count += count;
4075         }
4076
4077         /* hba wants the size to be exact */
4078         if (byte_count > scsi_bufflen(scsicmd)) {
4079                 u32 temp = le32_to_cpu(rio2->sge[i-1].length) -
4080                         (byte_count - scsi_bufflen(scsicmd));
4081                 rio2->sge[i-1].length = cpu_to_le32(temp);
4082                 byte_count = scsi_bufflen(scsicmd);
4083         }
4084
4085         rio2->sgeCnt = cpu_to_le32(nseg);
4086         rio2->flags |= cpu_to_le16(RIO2_SG_FORMAT_IEEE1212);
4087         /* not conformable: evaluate required sg elements */
4088         if (!conformable) {
4089                 int j, nseg_new = nseg, err_found;
4090                 for (i = min_size / PAGE_SIZE; i >= 1; --i) {
4091                         err_found = 0;
4092                         nseg_new = 2;
4093                         for (j = 1; j < nseg - 1; ++j) {
4094                                 if (rio2->sge[j].length % (i*PAGE_SIZE)) {
4095                                         err_found = 1;
4096                                         break;
4097                                 }
4098                                 nseg_new += (rio2->sge[j].length / (i*PAGE_SIZE));
4099                         }
4100                         if (!err_found)
4101                                 break;
4102                 }
4103                 if (i > 0 && nseg_new <= sg_max) {
4104                         int ret = aac_convert_sgraw2(rio2, i, nseg, nseg_new);
4105
4106                         if (ret < 0)
4107                                 return ret;
4108                 }
4109         } else
4110                 rio2->flags |= cpu_to_le16(RIO2_SGL_CONFORMANT);
4111
4112         /* Check for command underflow */
4113         if (scsicmd->underflow && (byte_count < scsicmd->underflow)) {
4114                 printk(KERN_WARNING"aacraid: cmd len %08lX cmd underflow %08X\n",
4115                        byte_count, scsicmd->underflow);
4116         }
4117
4118         return byte_count;
4119 }
4120
4121 static int aac_convert_sgraw2(struct aac_raw_io2 *rio2, int pages, int nseg, int nseg_new)
4122 {
4123         struct sge_ieee1212 *sge;
4124         int i, j, pos;
4125         u32 addr_low;
4126
4127         if (aac_convert_sgl == 0)
4128                 return 0;
4129
4130         sge = kmalloc_array(nseg_new, sizeof(struct sge_ieee1212), GFP_ATOMIC);
4131         if (sge == NULL)
4132                 return -ENOMEM;
4133
4134         for (i = 1, pos = 1; i < nseg-1; ++i) {
4135                 for (j = 0; j < rio2->sge[i].length / (pages * PAGE_SIZE); ++j) {
4136                         addr_low = rio2->sge[i].addrLow + j * pages * PAGE_SIZE;
4137                         sge[pos].addrLow = addr_low;
4138                         sge[pos].addrHigh = rio2->sge[i].addrHigh;
4139                         if (addr_low < rio2->sge[i].addrLow)
4140                                 sge[pos].addrHigh++;
4141                         sge[pos].length = pages * PAGE_SIZE;
4142                         sge[pos].flags = 0;
4143                         pos++;
4144                 }
4145         }
4146         sge[pos] = rio2->sge[nseg-1];
4147         memcpy(&rio2->sge[1], &sge[1], (nseg_new-1)*sizeof(struct sge_ieee1212));
4148
4149         kfree(sge);
4150         rio2->sgeCnt = cpu_to_le32(nseg_new);
4151         rio2->flags |= cpu_to_le16(RIO2_SGL_CONFORMANT);
4152         rio2->sgeNominalSize = pages * PAGE_SIZE;
4153         return 0;
4154 }
4155
4156 static long aac_build_sghba(struct scsi_cmnd *scsicmd,
4157                         struct aac_hba_cmd_req *hbacmd,
4158                         int sg_max,
4159                         u64 sg_address)
4160 {
4161         unsigned long byte_count = 0;
4162         int nseg;
4163         struct scatterlist *sg;
4164         int i;
4165         u32 cur_size;
4166         struct aac_hba_sgl *sge;
4167
4168         nseg = scsi_dma_map(scsicmd);
4169         if (nseg <= 0) {
4170                 byte_count = nseg;
4171                 goto out;
4172         }
4173
4174         if (nseg > HBA_MAX_SG_EMBEDDED)
4175                 sge = &hbacmd->sge[2];
4176         else
4177                 sge = &hbacmd->sge[0];
4178
4179         scsi_for_each_sg(scsicmd, sg, nseg, i) {
4180                 int count = sg_dma_len(sg);
4181                 u64 addr = sg_dma_address(sg);
4182
4183                 WARN_ON(i >= sg_max);
4184                 sge->addr_hi = cpu_to_le32((u32)(addr>>32));
4185                 sge->addr_lo = cpu_to_le32((u32)(addr & 0xffffffff));
4186                 cur_size = cpu_to_le32(count);
4187                 sge->len = cur_size;
4188                 sge->flags = 0;
4189                 byte_count += count;
4190                 sge++;
4191         }
4192
4193         sge--;
4194         /* hba wants the size to be exact */
4195         if (byte_count > scsi_bufflen(scsicmd)) {
4196                 u32 temp;
4197
4198                 temp = le32_to_cpu(sge->len) - byte_count
4199                                                 - scsi_bufflen(scsicmd);
4200                 sge->len = cpu_to_le32(temp);
4201                 byte_count = scsi_bufflen(scsicmd);
4202         }
4203
4204         if (nseg <= HBA_MAX_SG_EMBEDDED) {
4205                 hbacmd->emb_data_desc_count = cpu_to_le32(nseg);
4206                 sge->flags = cpu_to_le32(0x40000000);
4207         } else {
4208                 /* not embedded */
4209                 hbacmd->sge[0].flags = cpu_to_le32(0x80000000);
4210                 hbacmd->emb_data_desc_count = (u8)cpu_to_le32(1);
4211                 hbacmd->sge[0].addr_hi = (u32)cpu_to_le32(sg_address >> 32);
4212                 hbacmd->sge[0].addr_lo =
4213                         cpu_to_le32((u32)(sg_address & 0xffffffff));
4214         }
4215
4216         /* Check for command underflow */
4217         if (scsicmd->underflow && (byte_count < scsicmd->underflow)) {
4218                 pr_warn("aacraid: cmd len %08lX cmd underflow %08X\n",
4219                                 byte_count, scsicmd->underflow);
4220         }
4221 out:
4222         return byte_count;
4223 }
4224
4225 #ifdef AAC_DETAILED_STATUS_INFO
4226
4227 struct aac_srb_status_info {
4228         u32     status;
4229         char    *str;
4230 };
4231
4232
4233 static struct aac_srb_status_info srb_status_info[] = {
4234         { SRB_STATUS_PENDING,           "Pending Status"},
4235         { SRB_STATUS_SUCCESS,           "Success"},
4236         { SRB_STATUS_ABORTED,           "Aborted Command"},
4237         { SRB_STATUS_ABORT_FAILED,      "Abort Failed"},
4238         { SRB_STATUS_ERROR,             "Error Event"},
4239         { SRB_STATUS_BUSY,              "Device Busy"},
4240         { SRB_STATUS_INVALID_REQUEST,   "Invalid Request"},
4241         { SRB_STATUS_INVALID_PATH_ID,   "Invalid Path ID"},
4242         { SRB_STATUS_NO_DEVICE,         "No Device"},
4243         { SRB_STATUS_TIMEOUT,           "Timeout"},
4244         { SRB_STATUS_SELECTION_TIMEOUT, "Selection Timeout"},
4245         { SRB_STATUS_COMMAND_TIMEOUT,   "Command Timeout"},
4246         { SRB_STATUS_MESSAGE_REJECTED,  "Message Rejected"},
4247         { SRB_STATUS_BUS_RESET,         "Bus Reset"},
4248         { SRB_STATUS_PARITY_ERROR,      "Parity Error"},
4249         { SRB_STATUS_REQUEST_SENSE_FAILED,"Request Sense Failed"},
4250         { SRB_STATUS_NO_HBA,            "No HBA"},
4251         { SRB_STATUS_DATA_OVERRUN,      "Data Overrun/Data Underrun"},
4252         { SRB_STATUS_UNEXPECTED_BUS_FREE,"Unexpected Bus Free"},
4253         { SRB_STATUS_PHASE_SEQUENCE_FAILURE,"Phase Error"},
4254         { SRB_STATUS_BAD_SRB_BLOCK_LENGTH,"Bad Srb Block Length"},
4255         { SRB_STATUS_REQUEST_FLUSHED,   "Request Flushed"},
4256         { SRB_STATUS_DELAYED_RETRY,     "Delayed Retry"},
4257         { SRB_STATUS_INVALID_LUN,       "Invalid LUN"},
4258         { SRB_STATUS_INVALID_TARGET_ID, "Invalid TARGET ID"},
4259         { SRB_STATUS_BAD_FUNCTION,      "Bad Function"},
4260         { SRB_STATUS_ERROR_RECOVERY,    "Error Recovery"},
4261         { SRB_STATUS_NOT_STARTED,       "Not Started"},
4262         { SRB_STATUS_NOT_IN_USE,        "Not In Use"},
4263         { SRB_STATUS_FORCE_ABORT,       "Force Abort"},
4264         { SRB_STATUS_DOMAIN_VALIDATION_FAIL,"Domain Validation Failure"},
4265         { 0xff,                         "Unknown Error"}
4266 };
4267
4268 char *aac_get_status_string(u32 status)
4269 {
4270         int i;
4271
4272         for (i = 0; i < ARRAY_SIZE(srb_status_info); i++)
4273                 if (srb_status_info[i].status == status)
4274                         return srb_status_info[i].str;
4275
4276         return "Bad Status Code";
4277 }
4278
4279 #endif