Merge branch 'turbostat' of https://git.kernel.org/pub/scm/linux/kernel/git/lenb...
[firefly-linux-kernel-4.4.55.git] / drivers / scsi / megaraid / megaraid_sas_base.c
1 /*
2  *  Linux MegaRAID driver for SAS based RAID controllers
3  *
4  *  Copyright (c) 2003-2013  LSI Corporation
5  *  Copyright (c) 2013-2014  Avago Technologies
6  *
7  *  This program is free software; you can redistribute it and/or
8  *  modify it under the terms of the GNU General Public License
9  *  as published by the Free Software Foundation; either version 2
10  *  of the License, or (at your option) any later version.
11  *
12  *  This program is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
19  *
20  *  Authors: Avago Technologies
21  *           Sreenivas Bagalkote
22  *           Sumant Patro
23  *           Bo Yang
24  *           Adam Radford
25  *           Kashyap Desai <kashyap.desai@avagotech.com>
26  *           Sumit Saxena <sumit.saxena@avagotech.com>
27  *
28  *  Send feedback to: megaraidlinux.pdl@avagotech.com
29  *
30  *  Mail to: Avago Technologies, 350 West Trimble Road, Building 90,
31  *  San Jose, California 95131
32  */
33
34 #include <linux/kernel.h>
35 #include <linux/types.h>
36 #include <linux/pci.h>
37 #include <linux/list.h>
38 #include <linux/moduleparam.h>
39 #include <linux/module.h>
40 #include <linux/spinlock.h>
41 #include <linux/interrupt.h>
42 #include <linux/delay.h>
43 #include <linux/uio.h>
44 #include <linux/slab.h>
45 #include <asm/uaccess.h>
46 #include <linux/fs.h>
47 #include <linux/compat.h>
48 #include <linux/blkdev.h>
49 #include <linux/mutex.h>
50 #include <linux/poll.h>
51
52 #include <scsi/scsi.h>
53 #include <scsi/scsi_cmnd.h>
54 #include <scsi/scsi_device.h>
55 #include <scsi/scsi_host.h>
56 #include <scsi/scsi_tcq.h>
57 #include "megaraid_sas_fusion.h"
58 #include "megaraid_sas.h"
59
60 /*
61  * Number of sectors per IO command
62  * Will be set in megasas_init_mfi if user does not provide
63  */
64 static unsigned int max_sectors;
65 module_param_named(max_sectors, max_sectors, int, 0);
66 MODULE_PARM_DESC(max_sectors,
67         "Maximum number of sectors per IO command");
68
69 static int msix_disable;
70 module_param(msix_disable, int, S_IRUGO);
71 MODULE_PARM_DESC(msix_disable, "Disable MSI-X interrupt handling. Default: 0");
72
73 static unsigned int msix_vectors;
74 module_param(msix_vectors, int, S_IRUGO);
75 MODULE_PARM_DESC(msix_vectors, "MSI-X max vector count. Default: Set by FW");
76
77 static int allow_vf_ioctls;
78 module_param(allow_vf_ioctls, int, S_IRUGO);
79 MODULE_PARM_DESC(allow_vf_ioctls, "Allow ioctls in SR-IOV VF mode. Default: 0");
80
81 static unsigned int throttlequeuedepth = MEGASAS_THROTTLE_QUEUE_DEPTH;
82 module_param(throttlequeuedepth, int, S_IRUGO);
83 MODULE_PARM_DESC(throttlequeuedepth,
84         "Adapter queue depth when throttled due to I/O timeout. Default: 16");
85
86 int resetwaittime = MEGASAS_RESET_WAIT_TIME;
87 module_param(resetwaittime, int, S_IRUGO);
88 MODULE_PARM_DESC(resetwaittime, "Wait time in seconds after I/O timeout "
89                  "before resetting adapter. Default: 180");
90
91 int smp_affinity_enable = 1;
92 module_param(smp_affinity_enable, int, S_IRUGO);
93 MODULE_PARM_DESC(smp_affinity_enable, "SMP affinity feature enable/disbale Default: enable(1)");
94
95 MODULE_LICENSE("GPL");
96 MODULE_VERSION(MEGASAS_VERSION);
97 MODULE_AUTHOR("megaraidlinux.pdl@avagotech.com");
98 MODULE_DESCRIPTION("Avago MegaRAID SAS Driver");
99
100 int megasas_transition_to_ready(struct megasas_instance *instance, int ocr);
101 static int megasas_get_pd_list(struct megasas_instance *instance);
102 static int megasas_ld_list_query(struct megasas_instance *instance,
103                                  u8 query_type);
104 static int megasas_issue_init_mfi(struct megasas_instance *instance);
105 static int megasas_register_aen(struct megasas_instance *instance,
106                                 u32 seq_num, u32 class_locale_word);
107 /*
108  * PCI ID table for all supported controllers
109  */
110 static struct pci_device_id megasas_pci_table[] = {
111
112         {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1064R)},
113         /* xscale IOP */
114         {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1078R)},
115         /* ppc IOP */
116         {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1078DE)},
117         /* ppc IOP */
118         {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1078GEN2)},
119         /* gen2*/
120         {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS0079GEN2)},
121         /* gen2*/
122         {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS0073SKINNY)},
123         /* skinny*/
124         {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS0071SKINNY)},
125         /* skinny*/
126         {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_VERDE_ZCR)},
127         /* xscale IOP, vega */
128         {PCI_DEVICE(PCI_VENDOR_ID_DELL, PCI_DEVICE_ID_DELL_PERC5)},
129         /* xscale IOP */
130         {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FUSION)},
131         /* Fusion */
132         {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_PLASMA)},
133         /* Plasma */
134         {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_INVADER)},
135         /* Invader */
136         {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FURY)},
137         /* Fury */
138         {}
139 };
140
141 MODULE_DEVICE_TABLE(pci, megasas_pci_table);
142
143 static int megasas_mgmt_majorno;
144 struct megasas_mgmt_info megasas_mgmt_info;
145 static struct fasync_struct *megasas_async_queue;
146 static DEFINE_MUTEX(megasas_async_queue_mutex);
147
148 static int megasas_poll_wait_aen;
149 static DECLARE_WAIT_QUEUE_HEAD(megasas_poll_wait);
150 static u32 support_poll_for_event;
151 u32 megasas_dbg_lvl;
152 static u32 support_device_change;
153
154 /* define lock for aen poll */
155 spinlock_t poll_aen_lock;
156
157 void
158 megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd,
159                      u8 alt_status);
160 static u32
161 megasas_read_fw_status_reg_gen2(struct megasas_register_set __iomem *regs);
162 static int
163 megasas_adp_reset_gen2(struct megasas_instance *instance,
164                        struct megasas_register_set __iomem *reg_set);
165 static irqreturn_t megasas_isr(int irq, void *devp);
166 static u32
167 megasas_init_adapter_mfi(struct megasas_instance *instance);
168 u32
169 megasas_build_and_issue_cmd(struct megasas_instance *instance,
170                             struct scsi_cmnd *scmd);
171 static void megasas_complete_cmd_dpc(unsigned long instance_addr);
172 void
173 megasas_release_fusion(struct megasas_instance *instance);
174 int
175 megasas_ioc_init_fusion(struct megasas_instance *instance);
176 void
177 megasas_free_cmds_fusion(struct megasas_instance *instance);
178 u8
179 megasas_get_map_info(struct megasas_instance *instance);
180 int
181 megasas_sync_map_info(struct megasas_instance *instance);
182 int
183 wait_and_poll(struct megasas_instance *instance, struct megasas_cmd *cmd,
184         int seconds);
185 void megasas_reset_reply_desc(struct megasas_instance *instance);
186 int megasas_reset_fusion(struct Scsi_Host *shost, int iotimeout);
187 void megasas_fusion_ocr_wq(struct work_struct *work);
188 static int megasas_get_ld_vf_affiliation(struct megasas_instance *instance,
189                                          int initial);
190 int megasas_check_mpio_paths(struct megasas_instance *instance,
191                              struct scsi_cmnd *scmd);
192
193 void
194 megasas_issue_dcmd(struct megasas_instance *instance, struct megasas_cmd *cmd)
195 {
196         instance->instancet->fire_cmd(instance,
197                 cmd->frame_phys_addr, 0, instance->reg_set);
198 }
199
200 /**
201  * megasas_get_cmd -    Get a command from the free pool
202  * @instance:           Adapter soft state
203  *
204  * Returns a free command from the pool
205  */
206 struct megasas_cmd *megasas_get_cmd(struct megasas_instance
207                                                   *instance)
208 {
209         unsigned long flags;
210         struct megasas_cmd *cmd = NULL;
211
212         spin_lock_irqsave(&instance->mfi_pool_lock, flags);
213
214         if (!list_empty(&instance->cmd_pool)) {
215                 cmd = list_entry((&instance->cmd_pool)->next,
216                                  struct megasas_cmd, list);
217                 list_del_init(&cmd->list);
218         } else {
219                 printk(KERN_ERR "megasas: Command pool empty!\n");
220         }
221
222         spin_unlock_irqrestore(&instance->mfi_pool_lock, flags);
223         return cmd;
224 }
225
226 /**
227  * megasas_return_cmd - Return a cmd to free command pool
228  * @instance:           Adapter soft state
229  * @cmd:                Command packet to be returned to free command pool
230  */
231 inline void
232 megasas_return_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd)
233 {
234         unsigned long flags;
235         u32 blk_tags;
236         struct megasas_cmd_fusion *cmd_fusion;
237         struct fusion_context *fusion = instance->ctrl_context;
238
239         /* This flag is used only for fusion adapter.
240          * Wait for Interrupt for Polled mode DCMD
241          */
242         if (cmd->flags & DRV_DCMD_POLLED_MODE)
243                 return;
244
245         spin_lock_irqsave(&instance->mfi_pool_lock, flags);
246
247         if (fusion) {
248                 blk_tags = instance->max_scsi_cmds + cmd->index;
249                 cmd_fusion = fusion->cmd_list[blk_tags];
250                 megasas_return_cmd_fusion(instance, cmd_fusion);
251         }
252         cmd->scmd = NULL;
253         cmd->frame_count = 0;
254         cmd->flags = 0;
255         if (!fusion && reset_devices)
256                 cmd->frame->hdr.cmd = MFI_CMD_INVALID;
257         list_add(&cmd->list, (&instance->cmd_pool)->next);
258
259         spin_unlock_irqrestore(&instance->mfi_pool_lock, flags);
260
261 }
262
263 /**
264 *       The following functions are defined for xscale
265 *       (deviceid : 1064R, PERC5) controllers
266 */
267
268 /**
269  * megasas_enable_intr_xscale - Enables interrupts
270  * @regs:                       MFI register set
271  */
272 static inline void
273 megasas_enable_intr_xscale(struct megasas_instance *instance)
274 {
275         struct megasas_register_set __iomem *regs;
276         regs = instance->reg_set;
277         writel(0, &(regs)->outbound_intr_mask);
278
279         /* Dummy readl to force pci flush */
280         readl(&regs->outbound_intr_mask);
281 }
282
283 /**
284  * megasas_disable_intr_xscale -Disables interrupt
285  * @regs:                       MFI register set
286  */
287 static inline void
288 megasas_disable_intr_xscale(struct megasas_instance *instance)
289 {
290         struct megasas_register_set __iomem *regs;
291         u32 mask = 0x1f;
292         regs = instance->reg_set;
293         writel(mask, &regs->outbound_intr_mask);
294         /* Dummy readl to force pci flush */
295         readl(&regs->outbound_intr_mask);
296 }
297
298 /**
299  * megasas_read_fw_status_reg_xscale - returns the current FW status value
300  * @regs:                       MFI register set
301  */
302 static u32
303 megasas_read_fw_status_reg_xscale(struct megasas_register_set __iomem * regs)
304 {
305         return readl(&(regs)->outbound_msg_0);
306 }
307 /**
308  * megasas_clear_interrupt_xscale -     Check & clear interrupt
309  * @regs:                               MFI register set
310  */
311 static int
312 megasas_clear_intr_xscale(struct megasas_register_set __iomem * regs)
313 {
314         u32 status;
315         u32 mfiStatus = 0;
316         /*
317          * Check if it is our interrupt
318          */
319         status = readl(&regs->outbound_intr_status);
320
321         if (status & MFI_OB_INTR_STATUS_MASK)
322                 mfiStatus = MFI_INTR_FLAG_REPLY_MESSAGE;
323         if (status & MFI_XSCALE_OMR0_CHANGE_INTERRUPT)
324                 mfiStatus |= MFI_INTR_FLAG_FIRMWARE_STATE_CHANGE;
325
326         /*
327          * Clear the interrupt by writing back the same value
328          */
329         if (mfiStatus)
330                 writel(status, &regs->outbound_intr_status);
331
332         /* Dummy readl to force pci flush */
333         readl(&regs->outbound_intr_status);
334
335         return mfiStatus;
336 }
337
338 /**
339  * megasas_fire_cmd_xscale -    Sends command to the FW
340  * @frame_phys_addr :           Physical address of cmd
341  * @frame_count :               Number of frames for the command
342  * @regs :                      MFI register set
343  */
344 static inline void
345 megasas_fire_cmd_xscale(struct megasas_instance *instance,
346                 dma_addr_t frame_phys_addr,
347                 u32 frame_count,
348                 struct megasas_register_set __iomem *regs)
349 {
350         unsigned long flags;
351         spin_lock_irqsave(&instance->hba_lock, flags);
352         writel((frame_phys_addr >> 3)|(frame_count),
353                &(regs)->inbound_queue_port);
354         spin_unlock_irqrestore(&instance->hba_lock, flags);
355 }
356
357 /**
358  * megasas_adp_reset_xscale -  For controller reset
359  * @regs:                              MFI register set
360  */
361 static int
362 megasas_adp_reset_xscale(struct megasas_instance *instance,
363         struct megasas_register_set __iomem *regs)
364 {
365         u32 i;
366         u32 pcidata;
367         writel(MFI_ADP_RESET, &regs->inbound_doorbell);
368
369         for (i = 0; i < 3; i++)
370                 msleep(1000); /* sleep for 3 secs */
371         pcidata  = 0;
372         pci_read_config_dword(instance->pdev, MFI_1068_PCSR_OFFSET, &pcidata);
373         printk(KERN_NOTICE "pcidata = %x\n", pcidata);
374         if (pcidata & 0x2) {
375                 printk(KERN_NOTICE "mfi 1068 offset read=%x\n", pcidata);
376                 pcidata &= ~0x2;
377                 pci_write_config_dword(instance->pdev,
378                                 MFI_1068_PCSR_OFFSET, pcidata);
379
380                 for (i = 0; i < 2; i++)
381                         msleep(1000); /* need to wait 2 secs again */
382
383                 pcidata  = 0;
384                 pci_read_config_dword(instance->pdev,
385                                 MFI_1068_FW_HANDSHAKE_OFFSET, &pcidata);
386                 printk(KERN_NOTICE "1068 offset handshake read=%x\n", pcidata);
387                 if ((pcidata & 0xffff0000) == MFI_1068_FW_READY) {
388                         printk(KERN_NOTICE "1068 offset pcidt=%x\n", pcidata);
389                         pcidata = 0;
390                         pci_write_config_dword(instance->pdev,
391                                 MFI_1068_FW_HANDSHAKE_OFFSET, pcidata);
392                 }
393         }
394         return 0;
395 }
396
397 /**
398  * megasas_check_reset_xscale - For controller reset check
399  * @regs:                               MFI register set
400  */
401 static int
402 megasas_check_reset_xscale(struct megasas_instance *instance,
403                 struct megasas_register_set __iomem *regs)
404 {
405
406         if ((instance->adprecovery != MEGASAS_HBA_OPERATIONAL) &&
407             (le32_to_cpu(*instance->consumer) ==
408                 MEGASAS_ADPRESET_INPROG_SIGN))
409                 return 1;
410         return 0;
411 }
412
413 static struct megasas_instance_template megasas_instance_template_xscale = {
414
415         .fire_cmd = megasas_fire_cmd_xscale,
416         .enable_intr = megasas_enable_intr_xscale,
417         .disable_intr = megasas_disable_intr_xscale,
418         .clear_intr = megasas_clear_intr_xscale,
419         .read_fw_status_reg = megasas_read_fw_status_reg_xscale,
420         .adp_reset = megasas_adp_reset_xscale,
421         .check_reset = megasas_check_reset_xscale,
422         .service_isr = megasas_isr,
423         .tasklet = megasas_complete_cmd_dpc,
424         .init_adapter = megasas_init_adapter_mfi,
425         .build_and_issue_cmd = megasas_build_and_issue_cmd,
426         .issue_dcmd = megasas_issue_dcmd,
427 };
428
429 /**
430 *       This is the end of set of functions & definitions specific
431 *       to xscale (deviceid : 1064R, PERC5) controllers
432 */
433
434 /**
435 *       The following functions are defined for ppc (deviceid : 0x60)
436 *       controllers
437 */
438
439 /**
440  * megasas_enable_intr_ppc -    Enables interrupts
441  * @regs:                       MFI register set
442  */
443 static inline void
444 megasas_enable_intr_ppc(struct megasas_instance *instance)
445 {
446         struct megasas_register_set __iomem *regs;
447         regs = instance->reg_set;
448         writel(0xFFFFFFFF, &(regs)->outbound_doorbell_clear);
449
450         writel(~0x80000000, &(regs)->outbound_intr_mask);
451
452         /* Dummy readl to force pci flush */
453         readl(&regs->outbound_intr_mask);
454 }
455
456 /**
457  * megasas_disable_intr_ppc -   Disable interrupt
458  * @regs:                       MFI register set
459  */
460 static inline void
461 megasas_disable_intr_ppc(struct megasas_instance *instance)
462 {
463         struct megasas_register_set __iomem *regs;
464         u32 mask = 0xFFFFFFFF;
465         regs = instance->reg_set;
466         writel(mask, &regs->outbound_intr_mask);
467         /* Dummy readl to force pci flush */
468         readl(&regs->outbound_intr_mask);
469 }
470
471 /**
472  * megasas_read_fw_status_reg_ppc - returns the current FW status value
473  * @regs:                       MFI register set
474  */
475 static u32
476 megasas_read_fw_status_reg_ppc(struct megasas_register_set __iomem * regs)
477 {
478         return readl(&(regs)->outbound_scratch_pad);
479 }
480
481 /**
482  * megasas_clear_interrupt_ppc -        Check & clear interrupt
483  * @regs:                               MFI register set
484  */
485 static int
486 megasas_clear_intr_ppc(struct megasas_register_set __iomem * regs)
487 {
488         u32 status, mfiStatus = 0;
489
490         /*
491          * Check if it is our interrupt
492          */
493         status = readl(&regs->outbound_intr_status);
494
495         if (status & MFI_REPLY_1078_MESSAGE_INTERRUPT)
496                 mfiStatus = MFI_INTR_FLAG_REPLY_MESSAGE;
497
498         if (status & MFI_G2_OUTBOUND_DOORBELL_CHANGE_INTERRUPT)
499                 mfiStatus |= MFI_INTR_FLAG_FIRMWARE_STATE_CHANGE;
500
501         /*
502          * Clear the interrupt by writing back the same value
503          */
504         writel(status, &regs->outbound_doorbell_clear);
505
506         /* Dummy readl to force pci flush */
507         readl(&regs->outbound_doorbell_clear);
508
509         return mfiStatus;
510 }
511
512 /**
513  * megasas_fire_cmd_ppc -       Sends command to the FW
514  * @frame_phys_addr :           Physical address of cmd
515  * @frame_count :               Number of frames for the command
516  * @regs :                      MFI register set
517  */
518 static inline void
519 megasas_fire_cmd_ppc(struct megasas_instance *instance,
520                 dma_addr_t frame_phys_addr,
521                 u32 frame_count,
522                 struct megasas_register_set __iomem *regs)
523 {
524         unsigned long flags;
525         spin_lock_irqsave(&instance->hba_lock, flags);
526         writel((frame_phys_addr | (frame_count<<1))|1,
527                         &(regs)->inbound_queue_port);
528         spin_unlock_irqrestore(&instance->hba_lock, flags);
529 }
530
531 /**
532  * megasas_check_reset_ppc -    For controller reset check
533  * @regs:                               MFI register set
534  */
535 static int
536 megasas_check_reset_ppc(struct megasas_instance *instance,
537                         struct megasas_register_set __iomem *regs)
538 {
539         if (instance->adprecovery != MEGASAS_HBA_OPERATIONAL)
540                 return 1;
541
542         return 0;
543 }
544
545 static struct megasas_instance_template megasas_instance_template_ppc = {
546
547         .fire_cmd = megasas_fire_cmd_ppc,
548         .enable_intr = megasas_enable_intr_ppc,
549         .disable_intr = megasas_disable_intr_ppc,
550         .clear_intr = megasas_clear_intr_ppc,
551         .read_fw_status_reg = megasas_read_fw_status_reg_ppc,
552         .adp_reset = megasas_adp_reset_xscale,
553         .check_reset = megasas_check_reset_ppc,
554         .service_isr = megasas_isr,
555         .tasklet = megasas_complete_cmd_dpc,
556         .init_adapter = megasas_init_adapter_mfi,
557         .build_and_issue_cmd = megasas_build_and_issue_cmd,
558         .issue_dcmd = megasas_issue_dcmd,
559 };
560
561 /**
562  * megasas_enable_intr_skinny - Enables interrupts
563  * @regs:                       MFI register set
564  */
565 static inline void
566 megasas_enable_intr_skinny(struct megasas_instance *instance)
567 {
568         struct megasas_register_set __iomem *regs;
569         regs = instance->reg_set;
570         writel(0xFFFFFFFF, &(regs)->outbound_intr_mask);
571
572         writel(~MFI_SKINNY_ENABLE_INTERRUPT_MASK, &(regs)->outbound_intr_mask);
573
574         /* Dummy readl to force pci flush */
575         readl(&regs->outbound_intr_mask);
576 }
577
578 /**
579  * megasas_disable_intr_skinny -        Disables interrupt
580  * @regs:                       MFI register set
581  */
582 static inline void
583 megasas_disable_intr_skinny(struct megasas_instance *instance)
584 {
585         struct megasas_register_set __iomem *regs;
586         u32 mask = 0xFFFFFFFF;
587         regs = instance->reg_set;
588         writel(mask, &regs->outbound_intr_mask);
589         /* Dummy readl to force pci flush */
590         readl(&regs->outbound_intr_mask);
591 }
592
593 /**
594  * megasas_read_fw_status_reg_skinny - returns the current FW status value
595  * @regs:                       MFI register set
596  */
597 static u32
598 megasas_read_fw_status_reg_skinny(struct megasas_register_set __iomem *regs)
599 {
600         return readl(&(regs)->outbound_scratch_pad);
601 }
602
603 /**
604  * megasas_clear_interrupt_skinny -     Check & clear interrupt
605  * @regs:                               MFI register set
606  */
607 static int
608 megasas_clear_intr_skinny(struct megasas_register_set __iomem *regs)
609 {
610         u32 status;
611         u32 mfiStatus = 0;
612
613         /*
614          * Check if it is our interrupt
615          */
616         status = readl(&regs->outbound_intr_status);
617
618         if (!(status & MFI_SKINNY_ENABLE_INTERRUPT_MASK)) {
619                 return 0;
620         }
621
622         /*
623          * Check if it is our interrupt
624          */
625         if ((megasas_read_fw_status_reg_skinny(regs) & MFI_STATE_MASK) ==
626             MFI_STATE_FAULT) {
627                 mfiStatus = MFI_INTR_FLAG_FIRMWARE_STATE_CHANGE;
628         } else
629                 mfiStatus = MFI_INTR_FLAG_REPLY_MESSAGE;
630
631         /*
632          * Clear the interrupt by writing back the same value
633          */
634         writel(status, &regs->outbound_intr_status);
635
636         /*
637         * dummy read to flush PCI
638         */
639         readl(&regs->outbound_intr_status);
640
641         return mfiStatus;
642 }
643
644 /**
645  * megasas_fire_cmd_skinny -    Sends command to the FW
646  * @frame_phys_addr :           Physical address of cmd
647  * @frame_count :               Number of frames for the command
648  * @regs :                      MFI register set
649  */
650 static inline void
651 megasas_fire_cmd_skinny(struct megasas_instance *instance,
652                         dma_addr_t frame_phys_addr,
653                         u32 frame_count,
654                         struct megasas_register_set __iomem *regs)
655 {
656         unsigned long flags;
657         spin_lock_irqsave(&instance->hba_lock, flags);
658         writel(upper_32_bits(frame_phys_addr),
659                &(regs)->inbound_high_queue_port);
660         writel((lower_32_bits(frame_phys_addr) | (frame_count<<1))|1,
661                &(regs)->inbound_low_queue_port);
662         spin_unlock_irqrestore(&instance->hba_lock, flags);
663 }
664
665 /**
666  * megasas_check_reset_skinny - For controller reset check
667  * @regs:                               MFI register set
668  */
669 static int
670 megasas_check_reset_skinny(struct megasas_instance *instance,
671                                 struct megasas_register_set __iomem *regs)
672 {
673         if (instance->adprecovery != MEGASAS_HBA_OPERATIONAL)
674                 return 1;
675
676         return 0;
677 }
678
679 static struct megasas_instance_template megasas_instance_template_skinny = {
680
681         .fire_cmd = megasas_fire_cmd_skinny,
682         .enable_intr = megasas_enable_intr_skinny,
683         .disable_intr = megasas_disable_intr_skinny,
684         .clear_intr = megasas_clear_intr_skinny,
685         .read_fw_status_reg = megasas_read_fw_status_reg_skinny,
686         .adp_reset = megasas_adp_reset_gen2,
687         .check_reset = megasas_check_reset_skinny,
688         .service_isr = megasas_isr,
689         .tasklet = megasas_complete_cmd_dpc,
690         .init_adapter = megasas_init_adapter_mfi,
691         .build_and_issue_cmd = megasas_build_and_issue_cmd,
692         .issue_dcmd = megasas_issue_dcmd,
693 };
694
695
696 /**
697 *       The following functions are defined for gen2 (deviceid : 0x78 0x79)
698 *       controllers
699 */
700
701 /**
702  * megasas_enable_intr_gen2 -  Enables interrupts
703  * @regs:                      MFI register set
704  */
705 static inline void
706 megasas_enable_intr_gen2(struct megasas_instance *instance)
707 {
708         struct megasas_register_set __iomem *regs;
709         regs = instance->reg_set;
710         writel(0xFFFFFFFF, &(regs)->outbound_doorbell_clear);
711
712         /* write ~0x00000005 (4 & 1) to the intr mask*/
713         writel(~MFI_GEN2_ENABLE_INTERRUPT_MASK, &(regs)->outbound_intr_mask);
714
715         /* Dummy readl to force pci flush */
716         readl(&regs->outbound_intr_mask);
717 }
718
719 /**
720  * megasas_disable_intr_gen2 - Disables interrupt
721  * @regs:                      MFI register set
722  */
723 static inline void
724 megasas_disable_intr_gen2(struct megasas_instance *instance)
725 {
726         struct megasas_register_set __iomem *regs;
727         u32 mask = 0xFFFFFFFF;
728         regs = instance->reg_set;
729         writel(mask, &regs->outbound_intr_mask);
730         /* Dummy readl to force pci flush */
731         readl(&regs->outbound_intr_mask);
732 }
733
734 /**
735  * megasas_read_fw_status_reg_gen2 - returns the current FW status value
736  * @regs:                      MFI register set
737  */
738 static u32
739 megasas_read_fw_status_reg_gen2(struct megasas_register_set __iomem *regs)
740 {
741         return readl(&(regs)->outbound_scratch_pad);
742 }
743
744 /**
745  * megasas_clear_interrupt_gen2 -      Check & clear interrupt
746  * @regs:                              MFI register set
747  */
748 static int
749 megasas_clear_intr_gen2(struct megasas_register_set __iomem *regs)
750 {
751         u32 status;
752         u32 mfiStatus = 0;
753         /*
754          * Check if it is our interrupt
755          */
756         status = readl(&regs->outbound_intr_status);
757
758         if (status & MFI_INTR_FLAG_REPLY_MESSAGE) {
759                 mfiStatus = MFI_INTR_FLAG_REPLY_MESSAGE;
760         }
761         if (status & MFI_G2_OUTBOUND_DOORBELL_CHANGE_INTERRUPT) {
762                 mfiStatus |= MFI_INTR_FLAG_FIRMWARE_STATE_CHANGE;
763         }
764
765         /*
766          * Clear the interrupt by writing back the same value
767          */
768         if (mfiStatus)
769                 writel(status, &regs->outbound_doorbell_clear);
770
771         /* Dummy readl to force pci flush */
772         readl(&regs->outbound_intr_status);
773
774         return mfiStatus;
775 }
776 /**
777  * megasas_fire_cmd_gen2 -     Sends command to the FW
778  * @frame_phys_addr :          Physical address of cmd
779  * @frame_count :              Number of frames for the command
780  * @regs :                     MFI register set
781  */
782 static inline void
783 megasas_fire_cmd_gen2(struct megasas_instance *instance,
784                         dma_addr_t frame_phys_addr,
785                         u32 frame_count,
786                         struct megasas_register_set __iomem *regs)
787 {
788         unsigned long flags;
789         spin_lock_irqsave(&instance->hba_lock, flags);
790         writel((frame_phys_addr | (frame_count<<1))|1,
791                         &(regs)->inbound_queue_port);
792         spin_unlock_irqrestore(&instance->hba_lock, flags);
793 }
794
795 /**
796  * megasas_adp_reset_gen2 -     For controller reset
797  * @regs:                               MFI register set
798  */
799 static int
800 megasas_adp_reset_gen2(struct megasas_instance *instance,
801                         struct megasas_register_set __iomem *reg_set)
802 {
803         u32                     retry = 0 ;
804         u32                     HostDiag;
805         u32 __iomem             *seq_offset = &reg_set->seq_offset;
806         u32 __iomem             *hostdiag_offset = &reg_set->host_diag;
807
808         if (instance->instancet == &megasas_instance_template_skinny) {
809                 seq_offset = &reg_set->fusion_seq_offset;
810                 hostdiag_offset = &reg_set->fusion_host_diag;
811         }
812
813         writel(0, seq_offset);
814         writel(4, seq_offset);
815         writel(0xb, seq_offset);
816         writel(2, seq_offset);
817         writel(7, seq_offset);
818         writel(0xd, seq_offset);
819
820         msleep(1000);
821
822         HostDiag = (u32)readl(hostdiag_offset);
823
824         while ( !( HostDiag & DIAG_WRITE_ENABLE) ) {
825                 msleep(100);
826                 HostDiag = (u32)readl(hostdiag_offset);
827                 printk(KERN_NOTICE "RESETGEN2: retry=%x, hostdiag=%x\n",
828                                         retry, HostDiag);
829
830                 if (retry++ >= 100)
831                         return 1;
832
833         }
834
835         printk(KERN_NOTICE "ADP_RESET_GEN2: HostDiag=%x\n", HostDiag);
836
837         writel((HostDiag | DIAG_RESET_ADAPTER), hostdiag_offset);
838
839         ssleep(10);
840
841         HostDiag = (u32)readl(hostdiag_offset);
842         while ( ( HostDiag & DIAG_RESET_ADAPTER) ) {
843                 msleep(100);
844                 HostDiag = (u32)readl(hostdiag_offset);
845                 printk(KERN_NOTICE "RESET_GEN2: retry=%x, hostdiag=%x\n",
846                                 retry, HostDiag);
847
848                 if (retry++ >= 1000)
849                         return 1;
850
851         }
852         return 0;
853 }
854
855 /**
856  * megasas_check_reset_gen2 -   For controller reset check
857  * @regs:                               MFI register set
858  */
859 static int
860 megasas_check_reset_gen2(struct megasas_instance *instance,
861                 struct megasas_register_set __iomem *regs)
862 {
863         if (instance->adprecovery != MEGASAS_HBA_OPERATIONAL) {
864                 return 1;
865         }
866
867         return 0;
868 }
869
870 static struct megasas_instance_template megasas_instance_template_gen2 = {
871
872         .fire_cmd = megasas_fire_cmd_gen2,
873         .enable_intr = megasas_enable_intr_gen2,
874         .disable_intr = megasas_disable_intr_gen2,
875         .clear_intr = megasas_clear_intr_gen2,
876         .read_fw_status_reg = megasas_read_fw_status_reg_gen2,
877         .adp_reset = megasas_adp_reset_gen2,
878         .check_reset = megasas_check_reset_gen2,
879         .service_isr = megasas_isr,
880         .tasklet = megasas_complete_cmd_dpc,
881         .init_adapter = megasas_init_adapter_mfi,
882         .build_and_issue_cmd = megasas_build_and_issue_cmd,
883         .issue_dcmd = megasas_issue_dcmd,
884 };
885
886 /**
887 *       This is the end of set of functions & definitions
888 *       specific to gen2 (deviceid : 0x78, 0x79) controllers
889 */
890
891 /*
892  * Template added for TB (Fusion)
893  */
894 extern struct megasas_instance_template megasas_instance_template_fusion;
895
896 /**
897  * megasas_issue_polled -       Issues a polling command
898  * @instance:                   Adapter soft state
899  * @cmd:                        Command packet to be issued
900  *
901  * For polling, MFI requires the cmd_status to be set to MFI_STAT_INVALID_STATUS before posting.
902  */
903 int
904 megasas_issue_polled(struct megasas_instance *instance, struct megasas_cmd *cmd)
905 {
906         int seconds;
907
908         struct megasas_header *frame_hdr = &cmd->frame->hdr;
909
910         frame_hdr->cmd_status = MFI_CMD_STATUS_POLL_MODE;
911         frame_hdr->flags |= cpu_to_le16(MFI_FRAME_DONT_POST_IN_REPLY_QUEUE);
912
913         /*
914          * Issue the frame using inbound queue port
915          */
916         instance->instancet->issue_dcmd(instance, cmd);
917
918         /*
919          * Wait for cmd_status to change
920          */
921         if (instance->requestorId)
922                 seconds = MEGASAS_ROUTINE_WAIT_TIME_VF;
923         else
924                 seconds = MFI_POLL_TIMEOUT_SECS;
925         return wait_and_poll(instance, cmd, seconds);
926 }
927
928 /**
929  * megasas_issue_blocked_cmd -  Synchronous wrapper around regular FW cmds
930  * @instance:                   Adapter soft state
931  * @cmd:                        Command to be issued
932  * @timeout:                    Timeout in seconds
933  *
934  * This function waits on an event for the command to be returned from ISR.
935  * Max wait time is MEGASAS_INTERNAL_CMD_WAIT_TIME secs
936  * Used to issue ioctl commands.
937  */
938 int
939 megasas_issue_blocked_cmd(struct megasas_instance *instance,
940                           struct megasas_cmd *cmd, int timeout)
941 {
942         int ret = 0;
943         cmd->cmd_status_drv = MFI_STAT_INVALID_STATUS;
944
945         instance->instancet->issue_dcmd(instance, cmd);
946         if (timeout) {
947                 ret = wait_event_timeout(instance->int_cmd_wait_q,
948                                 cmd->cmd_status_drv != MFI_STAT_INVALID_STATUS, timeout * HZ);
949                 if (!ret)
950                         return 1;
951         } else
952                 wait_event(instance->int_cmd_wait_q,
953                                 cmd->cmd_status_drv != MFI_STAT_INVALID_STATUS);
954
955         return (cmd->cmd_status_drv == MFI_STAT_OK) ?
956                 0 : 1;
957 }
958
959 /**
960  * megasas_issue_blocked_abort_cmd -    Aborts previously issued cmd
961  * @instance:                           Adapter soft state
962  * @cmd_to_abort:                       Previously issued cmd to be aborted
963  * @timeout:                            Timeout in seconds
964  *
965  * MFI firmware can abort previously issued AEN comamnd (automatic event
966  * notification). The megasas_issue_blocked_abort_cmd() issues such abort
967  * cmd and waits for return status.
968  * Max wait time is MEGASAS_INTERNAL_CMD_WAIT_TIME secs
969  */
970 static int
971 megasas_issue_blocked_abort_cmd(struct megasas_instance *instance,
972                                 struct megasas_cmd *cmd_to_abort, int timeout)
973 {
974         struct megasas_cmd *cmd;
975         struct megasas_abort_frame *abort_fr;
976         int ret = 0;
977
978         cmd = megasas_get_cmd(instance);
979
980         if (!cmd)
981                 return -1;
982
983         abort_fr = &cmd->frame->abort;
984
985         /*
986          * Prepare and issue the abort frame
987          */
988         abort_fr->cmd = MFI_CMD_ABORT;
989         abort_fr->cmd_status = MFI_STAT_INVALID_STATUS;
990         abort_fr->flags = cpu_to_le16(0);
991         abort_fr->abort_context = cpu_to_le32(cmd_to_abort->index);
992         abort_fr->abort_mfi_phys_addr_lo =
993                 cpu_to_le32(lower_32_bits(cmd_to_abort->frame_phys_addr));
994         abort_fr->abort_mfi_phys_addr_hi =
995                 cpu_to_le32(upper_32_bits(cmd_to_abort->frame_phys_addr));
996
997         cmd->sync_cmd = 1;
998         cmd->cmd_status_drv = MFI_STAT_INVALID_STATUS;
999
1000         instance->instancet->issue_dcmd(instance, cmd);
1001
1002         if (timeout) {
1003                 ret = wait_event_timeout(instance->abort_cmd_wait_q,
1004                                 cmd->cmd_status_drv != MFI_STAT_INVALID_STATUS, timeout * HZ);
1005                 if (!ret) {
1006                         dev_err(&instance->pdev->dev, "Command timedout"
1007                                 "from %s\n", __func__);
1008                         return 1;
1009                 }
1010         } else
1011                 wait_event(instance->abort_cmd_wait_q,
1012                                 cmd->cmd_status_drv != MFI_STAT_INVALID_STATUS);
1013
1014         cmd->sync_cmd = 0;
1015
1016         megasas_return_cmd(instance, cmd);
1017         return 0;
1018 }
1019
1020 /**
1021  * megasas_make_sgl32 - Prepares 32-bit SGL
1022  * @instance:           Adapter soft state
1023  * @scp:                SCSI command from the mid-layer
1024  * @mfi_sgl:            SGL to be filled in
1025  *
1026  * If successful, this function returns the number of SG elements. Otherwise,
1027  * it returnes -1.
1028  */
1029 static int
1030 megasas_make_sgl32(struct megasas_instance *instance, struct scsi_cmnd *scp,
1031                    union megasas_sgl *mfi_sgl)
1032 {
1033         int i;
1034         int sge_count;
1035         struct scatterlist *os_sgl;
1036
1037         sge_count = scsi_dma_map(scp);
1038         BUG_ON(sge_count < 0);
1039
1040         if (sge_count) {
1041                 scsi_for_each_sg(scp, os_sgl, sge_count, i) {
1042                         mfi_sgl->sge32[i].length = cpu_to_le32(sg_dma_len(os_sgl));
1043                         mfi_sgl->sge32[i].phys_addr = cpu_to_le32(sg_dma_address(os_sgl));
1044                 }
1045         }
1046         return sge_count;
1047 }
1048
1049 /**
1050  * megasas_make_sgl64 - Prepares 64-bit SGL
1051  * @instance:           Adapter soft state
1052  * @scp:                SCSI command from the mid-layer
1053  * @mfi_sgl:            SGL to be filled in
1054  *
1055  * If successful, this function returns the number of SG elements. Otherwise,
1056  * it returnes -1.
1057  */
1058 static int
1059 megasas_make_sgl64(struct megasas_instance *instance, struct scsi_cmnd *scp,
1060                    union megasas_sgl *mfi_sgl)
1061 {
1062         int i;
1063         int sge_count;
1064         struct scatterlist *os_sgl;
1065
1066         sge_count = scsi_dma_map(scp);
1067         BUG_ON(sge_count < 0);
1068
1069         if (sge_count) {
1070                 scsi_for_each_sg(scp, os_sgl, sge_count, i) {
1071                         mfi_sgl->sge64[i].length = cpu_to_le32(sg_dma_len(os_sgl));
1072                         mfi_sgl->sge64[i].phys_addr = cpu_to_le64(sg_dma_address(os_sgl));
1073                 }
1074         }
1075         return sge_count;
1076 }
1077
1078 /**
1079  * megasas_make_sgl_skinny - Prepares IEEE SGL
1080  * @instance:           Adapter soft state
1081  * @scp:                SCSI command from the mid-layer
1082  * @mfi_sgl:            SGL to be filled in
1083  *
1084  * If successful, this function returns the number of SG elements. Otherwise,
1085  * it returnes -1.
1086  */
1087 static int
1088 megasas_make_sgl_skinny(struct megasas_instance *instance,
1089                 struct scsi_cmnd *scp, union megasas_sgl *mfi_sgl)
1090 {
1091         int i;
1092         int sge_count;
1093         struct scatterlist *os_sgl;
1094
1095         sge_count = scsi_dma_map(scp);
1096
1097         if (sge_count) {
1098                 scsi_for_each_sg(scp, os_sgl, sge_count, i) {
1099                         mfi_sgl->sge_skinny[i].length =
1100                                 cpu_to_le32(sg_dma_len(os_sgl));
1101                         mfi_sgl->sge_skinny[i].phys_addr =
1102                                 cpu_to_le64(sg_dma_address(os_sgl));
1103                         mfi_sgl->sge_skinny[i].flag = cpu_to_le32(0);
1104                 }
1105         }
1106         return sge_count;
1107 }
1108
1109  /**
1110  * megasas_get_frame_count - Computes the number of frames
1111  * @frame_type          : type of frame- io or pthru frame
1112  * @sge_count           : number of sg elements
1113  *
1114  * Returns the number of frames required for numnber of sge's (sge_count)
1115  */
1116
1117 static u32 megasas_get_frame_count(struct megasas_instance *instance,
1118                         u8 sge_count, u8 frame_type)
1119 {
1120         int num_cnt;
1121         int sge_bytes;
1122         u32 sge_sz;
1123         u32 frame_count=0;
1124
1125         sge_sz = (IS_DMA64) ? sizeof(struct megasas_sge64) :
1126             sizeof(struct megasas_sge32);
1127
1128         if (instance->flag_ieee) {
1129                 sge_sz = sizeof(struct megasas_sge_skinny);
1130         }
1131
1132         /*
1133          * Main frame can contain 2 SGEs for 64-bit SGLs and
1134          * 3 SGEs for 32-bit SGLs for ldio &
1135          * 1 SGEs for 64-bit SGLs and
1136          * 2 SGEs for 32-bit SGLs for pthru frame
1137          */
1138         if (unlikely(frame_type == PTHRU_FRAME)) {
1139                 if (instance->flag_ieee == 1) {
1140                         num_cnt = sge_count - 1;
1141                 } else if (IS_DMA64)
1142                         num_cnt = sge_count - 1;
1143                 else
1144                         num_cnt = sge_count - 2;
1145         } else {
1146                 if (instance->flag_ieee == 1) {
1147                         num_cnt = sge_count - 1;
1148                 } else if (IS_DMA64)
1149                         num_cnt = sge_count - 2;
1150                 else
1151                         num_cnt = sge_count - 3;
1152         }
1153
1154         if(num_cnt>0){
1155                 sge_bytes = sge_sz * num_cnt;
1156
1157                 frame_count = (sge_bytes / MEGAMFI_FRAME_SIZE) +
1158                     ((sge_bytes % MEGAMFI_FRAME_SIZE) ? 1 : 0) ;
1159         }
1160         /* Main frame */
1161         frame_count +=1;
1162
1163         if (frame_count > 7)
1164                 frame_count = 8;
1165         return frame_count;
1166 }
1167
1168 /**
1169  * megasas_build_dcdb - Prepares a direct cdb (DCDB) command
1170  * @instance:           Adapter soft state
1171  * @scp:                SCSI command
1172  * @cmd:                Command to be prepared in
1173  *
1174  * This function prepares CDB commands. These are typcially pass-through
1175  * commands to the devices.
1176  */
1177 static int
1178 megasas_build_dcdb(struct megasas_instance *instance, struct scsi_cmnd *scp,
1179                    struct megasas_cmd *cmd)
1180 {
1181         u32 is_logical;
1182         u32 device_id;
1183         u16 flags = 0;
1184         struct megasas_pthru_frame *pthru;
1185
1186         is_logical = MEGASAS_IS_LOGICAL(scp);
1187         device_id = MEGASAS_DEV_INDEX(scp);
1188         pthru = (struct megasas_pthru_frame *)cmd->frame;
1189
1190         if (scp->sc_data_direction == PCI_DMA_TODEVICE)
1191                 flags = MFI_FRAME_DIR_WRITE;
1192         else if (scp->sc_data_direction == PCI_DMA_FROMDEVICE)
1193                 flags = MFI_FRAME_DIR_READ;
1194         else if (scp->sc_data_direction == PCI_DMA_NONE)
1195                 flags = MFI_FRAME_DIR_NONE;
1196
1197         if (instance->flag_ieee == 1) {
1198                 flags |= MFI_FRAME_IEEE;
1199         }
1200
1201         /*
1202          * Prepare the DCDB frame
1203          */
1204         pthru->cmd = (is_logical) ? MFI_CMD_LD_SCSI_IO : MFI_CMD_PD_SCSI_IO;
1205         pthru->cmd_status = 0x0;
1206         pthru->scsi_status = 0x0;
1207         pthru->target_id = device_id;
1208         pthru->lun = scp->device->lun;
1209         pthru->cdb_len = scp->cmd_len;
1210         pthru->timeout = 0;
1211         pthru->pad_0 = 0;
1212         pthru->flags = cpu_to_le16(flags);
1213         pthru->data_xfer_len = cpu_to_le32(scsi_bufflen(scp));
1214
1215         memcpy(pthru->cdb, scp->cmnd, scp->cmd_len);
1216
1217         /*
1218         * If the command is for the tape device, set the
1219         * pthru timeout to the os layer timeout value.
1220         */
1221         if (scp->device->type == TYPE_TAPE) {
1222                 if ((scp->request->timeout / HZ) > 0xFFFF)
1223                         pthru->timeout = cpu_to_le16(0xFFFF);
1224                 else
1225                         pthru->timeout = cpu_to_le16(scp->request->timeout / HZ);
1226         }
1227
1228         /*
1229          * Construct SGL
1230          */
1231         if (instance->flag_ieee == 1) {
1232                 pthru->flags |= cpu_to_le16(MFI_FRAME_SGL64);
1233                 pthru->sge_count = megasas_make_sgl_skinny(instance, scp,
1234                                                       &pthru->sgl);
1235         } else if (IS_DMA64) {
1236                 pthru->flags |= cpu_to_le16(MFI_FRAME_SGL64);
1237                 pthru->sge_count = megasas_make_sgl64(instance, scp,
1238                                                       &pthru->sgl);
1239         } else
1240                 pthru->sge_count = megasas_make_sgl32(instance, scp,
1241                                                       &pthru->sgl);
1242
1243         if (pthru->sge_count > instance->max_num_sge) {
1244                 printk(KERN_ERR "megasas: DCDB two many SGE NUM=%x\n",
1245                         pthru->sge_count);
1246                 return 0;
1247         }
1248
1249         /*
1250          * Sense info specific
1251          */
1252         pthru->sense_len = SCSI_SENSE_BUFFERSIZE;
1253         pthru->sense_buf_phys_addr_hi =
1254                 cpu_to_le32(upper_32_bits(cmd->sense_phys_addr));
1255         pthru->sense_buf_phys_addr_lo =
1256                 cpu_to_le32(lower_32_bits(cmd->sense_phys_addr));
1257
1258         /*
1259          * Compute the total number of frames this command consumes. FW uses
1260          * this number to pull sufficient number of frames from host memory.
1261          */
1262         cmd->frame_count = megasas_get_frame_count(instance, pthru->sge_count,
1263                                                         PTHRU_FRAME);
1264
1265         return cmd->frame_count;
1266 }
1267
1268 /**
1269  * megasas_build_ldio - Prepares IOs to logical devices
1270  * @instance:           Adapter soft state
1271  * @scp:                SCSI command
1272  * @cmd:                Command to be prepared
1273  *
1274  * Frames (and accompanying SGLs) for regular SCSI IOs use this function.
1275  */
1276 static int
1277 megasas_build_ldio(struct megasas_instance *instance, struct scsi_cmnd *scp,
1278                    struct megasas_cmd *cmd)
1279 {
1280         u32 device_id;
1281         u8 sc = scp->cmnd[0];
1282         u16 flags = 0;
1283         struct megasas_io_frame *ldio;
1284
1285         device_id = MEGASAS_DEV_INDEX(scp);
1286         ldio = (struct megasas_io_frame *)cmd->frame;
1287
1288         if (scp->sc_data_direction == PCI_DMA_TODEVICE)
1289                 flags = MFI_FRAME_DIR_WRITE;
1290         else if (scp->sc_data_direction == PCI_DMA_FROMDEVICE)
1291                 flags = MFI_FRAME_DIR_READ;
1292
1293         if (instance->flag_ieee == 1) {
1294                 flags |= MFI_FRAME_IEEE;
1295         }
1296
1297         /*
1298          * Prepare the Logical IO frame: 2nd bit is zero for all read cmds
1299          */
1300         ldio->cmd = (sc & 0x02) ? MFI_CMD_LD_WRITE : MFI_CMD_LD_READ;
1301         ldio->cmd_status = 0x0;
1302         ldio->scsi_status = 0x0;
1303         ldio->target_id = device_id;
1304         ldio->timeout = 0;
1305         ldio->reserved_0 = 0;
1306         ldio->pad_0 = 0;
1307         ldio->flags = cpu_to_le16(flags);
1308         ldio->start_lba_hi = 0;
1309         ldio->access_byte = (scp->cmd_len != 6) ? scp->cmnd[1] : 0;
1310
1311         /*
1312          * 6-byte READ(0x08) or WRITE(0x0A) cdb
1313          */
1314         if (scp->cmd_len == 6) {
1315                 ldio->lba_count = cpu_to_le32((u32) scp->cmnd[4]);
1316                 ldio->start_lba_lo = cpu_to_le32(((u32) scp->cmnd[1] << 16) |
1317                                                  ((u32) scp->cmnd[2] << 8) |
1318                                                  (u32) scp->cmnd[3]);
1319
1320                 ldio->start_lba_lo &= cpu_to_le32(0x1FFFFF);
1321         }
1322
1323         /*
1324          * 10-byte READ(0x28) or WRITE(0x2A) cdb
1325          */
1326         else if (scp->cmd_len == 10) {
1327                 ldio->lba_count = cpu_to_le32((u32) scp->cmnd[8] |
1328                                               ((u32) scp->cmnd[7] << 8));
1329                 ldio->start_lba_lo = cpu_to_le32(((u32) scp->cmnd[2] << 24) |
1330                                                  ((u32) scp->cmnd[3] << 16) |
1331                                                  ((u32) scp->cmnd[4] << 8) |
1332                                                  (u32) scp->cmnd[5]);
1333         }
1334
1335         /*
1336          * 12-byte READ(0xA8) or WRITE(0xAA) cdb
1337          */
1338         else if (scp->cmd_len == 12) {
1339                 ldio->lba_count = cpu_to_le32(((u32) scp->cmnd[6] << 24) |
1340                                               ((u32) scp->cmnd[7] << 16) |
1341                                               ((u32) scp->cmnd[8] << 8) |
1342                                               (u32) scp->cmnd[9]);
1343
1344                 ldio->start_lba_lo = cpu_to_le32(((u32) scp->cmnd[2] << 24) |
1345                                                  ((u32) scp->cmnd[3] << 16) |
1346                                                  ((u32) scp->cmnd[4] << 8) |
1347                                                  (u32) scp->cmnd[5]);
1348         }
1349
1350         /*
1351          * 16-byte READ(0x88) or WRITE(0x8A) cdb
1352          */
1353         else if (scp->cmd_len == 16) {
1354                 ldio->lba_count = cpu_to_le32(((u32) scp->cmnd[10] << 24) |
1355                                               ((u32) scp->cmnd[11] << 16) |
1356                                               ((u32) scp->cmnd[12] << 8) |
1357                                               (u32) scp->cmnd[13]);
1358
1359                 ldio->start_lba_lo = cpu_to_le32(((u32) scp->cmnd[6] << 24) |
1360                                                  ((u32) scp->cmnd[7] << 16) |
1361                                                  ((u32) scp->cmnd[8] << 8) |
1362                                                  (u32) scp->cmnd[9]);
1363
1364                 ldio->start_lba_hi = cpu_to_le32(((u32) scp->cmnd[2] << 24) |
1365                                                  ((u32) scp->cmnd[3] << 16) |
1366                                                  ((u32) scp->cmnd[4] << 8) |
1367                                                  (u32) scp->cmnd[5]);
1368
1369         }
1370
1371         /*
1372          * Construct SGL
1373          */
1374         if (instance->flag_ieee) {
1375                 ldio->flags |= cpu_to_le16(MFI_FRAME_SGL64);
1376                 ldio->sge_count = megasas_make_sgl_skinny(instance, scp,
1377                                               &ldio->sgl);
1378         } else if (IS_DMA64) {
1379                 ldio->flags |= cpu_to_le16(MFI_FRAME_SGL64);
1380                 ldio->sge_count = megasas_make_sgl64(instance, scp, &ldio->sgl);
1381         } else
1382                 ldio->sge_count = megasas_make_sgl32(instance, scp, &ldio->sgl);
1383
1384         if (ldio->sge_count > instance->max_num_sge) {
1385                 printk(KERN_ERR "megasas: build_ld_io: sge_count = %x\n",
1386                         ldio->sge_count);
1387                 return 0;
1388         }
1389
1390         /*
1391          * Sense info specific
1392          */
1393         ldio->sense_len = SCSI_SENSE_BUFFERSIZE;
1394         ldio->sense_buf_phys_addr_hi = 0;
1395         ldio->sense_buf_phys_addr_lo = cpu_to_le32(cmd->sense_phys_addr);
1396
1397         /*
1398          * Compute the total number of frames this command consumes. FW uses
1399          * this number to pull sufficient number of frames from host memory.
1400          */
1401         cmd->frame_count = megasas_get_frame_count(instance,
1402                         ldio->sge_count, IO_FRAME);
1403
1404         return cmd->frame_count;
1405 }
1406
1407 /**
1408  * megasas_cmd_type -           Checks if the cmd is for logical drive/sysPD
1409  *                              and whether it's RW or non RW
1410  * @scmd:                       SCSI command
1411  *
1412  */
1413 inline int megasas_cmd_type(struct scsi_cmnd *cmd)
1414 {
1415         int ret;
1416
1417         switch (cmd->cmnd[0]) {
1418         case READ_10:
1419         case WRITE_10:
1420         case READ_12:
1421         case WRITE_12:
1422         case READ_6:
1423         case WRITE_6:
1424         case READ_16:
1425         case WRITE_16:
1426                 ret = (MEGASAS_IS_LOGICAL(cmd)) ?
1427                         READ_WRITE_LDIO : READ_WRITE_SYSPDIO;
1428                 break;
1429         default:
1430                 ret = (MEGASAS_IS_LOGICAL(cmd)) ?
1431                         NON_READ_WRITE_LDIO : NON_READ_WRITE_SYSPDIO;
1432         }
1433         return ret;
1434 }
1435
1436  /**
1437  * megasas_dump_pending_frames -        Dumps the frame address of all pending cmds
1438  *                                      in FW
1439  * @instance:                           Adapter soft state
1440  */
1441 static inline void
1442 megasas_dump_pending_frames(struct megasas_instance *instance)
1443 {
1444         struct megasas_cmd *cmd;
1445         int i,n;
1446         union megasas_sgl *mfi_sgl;
1447         struct megasas_io_frame *ldio;
1448         struct megasas_pthru_frame *pthru;
1449         u32 sgcount;
1450         u32 max_cmd = instance->max_fw_cmds;
1451
1452         printk(KERN_ERR "\nmegasas[%d]: Dumping Frame Phys Address of all pending cmds in FW\n",instance->host->host_no);
1453         printk(KERN_ERR "megasas[%d]: Total OS Pending cmds : %d\n",instance->host->host_no,atomic_read(&instance->fw_outstanding));
1454         if (IS_DMA64)
1455                 printk(KERN_ERR "\nmegasas[%d]: 64 bit SGLs were sent to FW\n",instance->host->host_no);
1456         else
1457                 printk(KERN_ERR "\nmegasas[%d]: 32 bit SGLs were sent to FW\n",instance->host->host_no);
1458
1459         printk(KERN_ERR "megasas[%d]: Pending OS cmds in FW : \n",instance->host->host_no);
1460         for (i = 0; i < max_cmd; i++) {
1461                 cmd = instance->cmd_list[i];
1462                 if(!cmd->scmd)
1463                         continue;
1464                 printk(KERN_ERR "megasas[%d]: Frame addr :0x%08lx : ",instance->host->host_no,(unsigned long)cmd->frame_phys_addr);
1465                 if (megasas_cmd_type(cmd->scmd) == READ_WRITE_LDIO) {
1466                         ldio = (struct megasas_io_frame *)cmd->frame;
1467                         mfi_sgl = &ldio->sgl;
1468                         sgcount = ldio->sge_count;
1469                         printk(KERN_ERR "megasas[%d]: frame count : 0x%x, Cmd : 0x%x, Tgt id : 0x%x,"
1470                         " lba lo : 0x%x, lba_hi : 0x%x, sense_buf addr : 0x%x,sge count : 0x%x\n",
1471                         instance->host->host_no, cmd->frame_count, ldio->cmd, ldio->target_id,
1472                         le32_to_cpu(ldio->start_lba_lo), le32_to_cpu(ldio->start_lba_hi),
1473                         le32_to_cpu(ldio->sense_buf_phys_addr_lo), sgcount);
1474                 }
1475                 else {
1476                         pthru = (struct megasas_pthru_frame *) cmd->frame;
1477                         mfi_sgl = &pthru->sgl;
1478                         sgcount = pthru->sge_count;
1479                         printk(KERN_ERR "megasas[%d]: frame count : 0x%x, Cmd : 0x%x, Tgt id : 0x%x, "
1480                         "lun : 0x%x, cdb_len : 0x%x, data xfer len : 0x%x, sense_buf addr : 0x%x,sge count : 0x%x\n",
1481                         instance->host->host_no, cmd->frame_count, pthru->cmd, pthru->target_id,
1482                         pthru->lun, pthru->cdb_len, le32_to_cpu(pthru->data_xfer_len),
1483                         le32_to_cpu(pthru->sense_buf_phys_addr_lo), sgcount);
1484                 }
1485         if(megasas_dbg_lvl & MEGASAS_DBG_LVL){
1486                 for (n = 0; n < sgcount; n++){
1487                         if (IS_DMA64)
1488                                 printk(KERN_ERR "megasas: sgl len : 0x%x, sgl addr : 0x%llx ",
1489                                         le32_to_cpu(mfi_sgl->sge64[n].length),
1490                                         le64_to_cpu(mfi_sgl->sge64[n].phys_addr));
1491                         else
1492                                 printk(KERN_ERR "megasas: sgl len : 0x%x, sgl addr : 0x%x ",
1493                                         le32_to_cpu(mfi_sgl->sge32[n].length),
1494                                         le32_to_cpu(mfi_sgl->sge32[n].phys_addr));
1495                         }
1496                 }
1497                 printk(KERN_ERR "\n");
1498         } /*for max_cmd*/
1499         printk(KERN_ERR "\nmegasas[%d]: Pending Internal cmds in FW : \n",instance->host->host_no);
1500         for (i = 0; i < max_cmd; i++) {
1501
1502                 cmd = instance->cmd_list[i];
1503
1504                 if(cmd->sync_cmd == 1){
1505                         printk(KERN_ERR "0x%08lx : ", (unsigned long)cmd->frame_phys_addr);
1506                 }
1507         }
1508         printk(KERN_ERR "megasas[%d]: Dumping Done.\n\n",instance->host->host_no);
1509 }
1510
1511 u32
1512 megasas_build_and_issue_cmd(struct megasas_instance *instance,
1513                             struct scsi_cmnd *scmd)
1514 {
1515         struct megasas_cmd *cmd;
1516         u32 frame_count;
1517
1518         cmd = megasas_get_cmd(instance);
1519         if (!cmd)
1520                 return SCSI_MLQUEUE_HOST_BUSY;
1521
1522         /*
1523          * Logical drive command
1524          */
1525         if (megasas_cmd_type(scmd) == READ_WRITE_LDIO)
1526                 frame_count = megasas_build_ldio(instance, scmd, cmd);
1527         else
1528                 frame_count = megasas_build_dcdb(instance, scmd, cmd);
1529
1530         if (!frame_count)
1531                 goto out_return_cmd;
1532
1533         cmd->scmd = scmd;
1534         scmd->SCp.ptr = (char *)cmd;
1535
1536         /*
1537          * Issue the command to the FW
1538          */
1539         atomic_inc(&instance->fw_outstanding);
1540
1541         instance->instancet->fire_cmd(instance, cmd->frame_phys_addr,
1542                                 cmd->frame_count-1, instance->reg_set);
1543
1544         return 0;
1545 out_return_cmd:
1546         megasas_return_cmd(instance, cmd);
1547         return 1;
1548 }
1549
1550
1551 /**
1552  * megasas_queue_command -      Queue entry point
1553  * @scmd:                       SCSI command to be queued
1554  * @done:                       Callback entry point
1555  */
1556 static int
1557 megasas_queue_command(struct Scsi_Host *shost, struct scsi_cmnd *scmd)
1558 {
1559         struct megasas_instance *instance;
1560         unsigned long flags;
1561
1562         instance = (struct megasas_instance *)
1563             scmd->device->host->hostdata;
1564
1565         if (instance->unload == 1) {
1566                 scmd->result = DID_NO_CONNECT << 16;
1567                 scmd->scsi_done(scmd);
1568                 return 0;
1569         }
1570
1571         if (instance->issuepend_done == 0)
1572                 return SCSI_MLQUEUE_HOST_BUSY;
1573
1574         spin_lock_irqsave(&instance->hba_lock, flags);
1575
1576         /* Check for an mpio path and adjust behavior */
1577         if (instance->adprecovery == MEGASAS_ADPRESET_SM_INFAULT) {
1578                 if (megasas_check_mpio_paths(instance, scmd) ==
1579                     (DID_RESET << 16)) {
1580                         spin_unlock_irqrestore(&instance->hba_lock, flags);
1581                         return SCSI_MLQUEUE_HOST_BUSY;
1582                 } else {
1583                         spin_unlock_irqrestore(&instance->hba_lock, flags);
1584                         scmd->result = DID_NO_CONNECT << 16;
1585                         scmd->scsi_done(scmd);
1586                         return 0;
1587                 }
1588         }
1589
1590         if (instance->adprecovery == MEGASAS_HW_CRITICAL_ERROR) {
1591                 spin_unlock_irqrestore(&instance->hba_lock, flags);
1592                 scmd->result = DID_NO_CONNECT << 16;
1593                 scmd->scsi_done(scmd);
1594                 return 0;
1595         }
1596
1597         if (instance->adprecovery != MEGASAS_HBA_OPERATIONAL) {
1598                 spin_unlock_irqrestore(&instance->hba_lock, flags);
1599                 return SCSI_MLQUEUE_HOST_BUSY;
1600         }
1601
1602         spin_unlock_irqrestore(&instance->hba_lock, flags);
1603
1604         scmd->result = 0;
1605
1606         if (MEGASAS_IS_LOGICAL(scmd) &&
1607             (scmd->device->id >= instance->fw_supported_vd_count ||
1608                 scmd->device->lun)) {
1609                 scmd->result = DID_BAD_TARGET << 16;
1610                 goto out_done;
1611         }
1612
1613         switch (scmd->cmnd[0]) {
1614         case SYNCHRONIZE_CACHE:
1615                 /*
1616                  * FW takes care of flush cache on its own
1617                  * No need to send it down
1618                  */
1619                 scmd->result = DID_OK << 16;
1620                 goto out_done;
1621         default:
1622                 break;
1623         }
1624
1625         if (instance->instancet->build_and_issue_cmd(instance, scmd)) {
1626                 printk(KERN_ERR "megasas: Err returned from build_and_issue_cmd\n");
1627                 return SCSI_MLQUEUE_HOST_BUSY;
1628         }
1629
1630         return 0;
1631
1632  out_done:
1633         scmd->scsi_done(scmd);
1634         return 0;
1635 }
1636
1637 static struct megasas_instance *megasas_lookup_instance(u16 host_no)
1638 {
1639         int i;
1640
1641         for (i = 0; i < megasas_mgmt_info.max_index; i++) {
1642
1643                 if ((megasas_mgmt_info.instance[i]) &&
1644                     (megasas_mgmt_info.instance[i]->host->host_no == host_no))
1645                         return megasas_mgmt_info.instance[i];
1646         }
1647
1648         return NULL;
1649 }
1650
1651 static int megasas_slave_configure(struct scsi_device *sdev)
1652 {
1653         /*
1654         * The RAID firmware may require extended timeouts.
1655         */
1656         blk_queue_rq_timeout(sdev->request_queue,
1657                 MEGASAS_DEFAULT_CMD_TIMEOUT * HZ);
1658
1659         return 0;
1660 }
1661
1662 static int megasas_slave_alloc(struct scsi_device *sdev)
1663 {
1664         u16             pd_index = 0;
1665         struct megasas_instance *instance ;
1666         instance = megasas_lookup_instance(sdev->host->host_no);
1667         if (sdev->channel < MEGASAS_MAX_PD_CHANNELS) {
1668                 /*
1669                  * Open the OS scan to the SYSTEM PD
1670                  */
1671                 pd_index =
1672                         (sdev->channel * MEGASAS_MAX_DEV_PER_CHANNEL) +
1673                         sdev->id;
1674                 if (instance->pd_list[pd_index].driveState ==
1675                                         MR_PD_STATE_SYSTEM) {
1676                         return 0;
1677                 }
1678                 return -ENXIO;
1679         }
1680         return 0;
1681 }
1682
1683 /*
1684 * megasas_complete_outstanding_ioctls - Complete outstanding ioctls after a
1685 *                                       kill adapter
1686 * @instance:                            Adapter soft state
1687 *
1688 */
1689 static void megasas_complete_outstanding_ioctls(struct megasas_instance *instance)
1690 {
1691         int i;
1692         struct megasas_cmd *cmd_mfi;
1693         struct megasas_cmd_fusion *cmd_fusion;
1694         struct fusion_context *fusion = instance->ctrl_context;
1695
1696         /* Find all outstanding ioctls */
1697         if (fusion) {
1698                 for (i = 0; i < instance->max_fw_cmds; i++) {
1699                         cmd_fusion = fusion->cmd_list[i];
1700                         if (cmd_fusion->sync_cmd_idx != (u32)ULONG_MAX) {
1701                                 cmd_mfi = instance->cmd_list[cmd_fusion->sync_cmd_idx];
1702                                 if (cmd_mfi->sync_cmd &&
1703                                         cmd_mfi->frame->hdr.cmd != MFI_CMD_ABORT)
1704                                         megasas_complete_cmd(instance,
1705                                                              cmd_mfi, DID_OK);
1706                         }
1707                 }
1708         } else {
1709                 for (i = 0; i < instance->max_fw_cmds; i++) {
1710                         cmd_mfi = instance->cmd_list[i];
1711                         if (cmd_mfi->sync_cmd && cmd_mfi->frame->hdr.cmd !=
1712                                 MFI_CMD_ABORT)
1713                                 megasas_complete_cmd(instance, cmd_mfi, DID_OK);
1714                 }
1715         }
1716 }
1717
1718
1719 void megaraid_sas_kill_hba(struct megasas_instance *instance)
1720 {
1721         /* Set critical error to block I/O & ioctls in case caller didn't */
1722         instance->adprecovery = MEGASAS_HW_CRITICAL_ERROR;
1723         /* Wait 1 second to ensure IO or ioctls in build have posted */
1724         msleep(1000);
1725         if ((instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
1726                 (instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0071SKINNY) ||
1727                 (instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
1728                 (instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA) ||
1729                 (instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
1730                 (instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
1731                 writel(MFI_STOP_ADP,
1732                         &instance->reg_set->doorbell);
1733                 /* Flush */
1734                 readl(&instance->reg_set->doorbell);
1735                 if (instance->mpio && instance->requestorId)
1736                         memset(instance->ld_ids, 0xff, MEGASAS_MAX_LD_IDS);
1737         } else {
1738                 writel(MFI_STOP_ADP,
1739                         &instance->reg_set->inbound_doorbell);
1740         }
1741         /* Complete outstanding ioctls when adapter is killed */
1742         megasas_complete_outstanding_ioctls(instance);
1743 }
1744
1745  /**
1746   * megasas_check_and_restore_queue_depth - Check if queue depth needs to be
1747   *                                     restored to max value
1748   * @instance:                  Adapter soft state
1749   *
1750   */
1751 void
1752 megasas_check_and_restore_queue_depth(struct megasas_instance *instance)
1753 {
1754         unsigned long flags;
1755
1756         if (instance->flag & MEGASAS_FW_BUSY
1757             && time_after(jiffies, instance->last_time + 5 * HZ)
1758             && atomic_read(&instance->fw_outstanding) <
1759             instance->throttlequeuedepth + 1) {
1760
1761                 spin_lock_irqsave(instance->host->host_lock, flags);
1762                 instance->flag &= ~MEGASAS_FW_BUSY;
1763
1764                 instance->host->can_queue = instance->max_scsi_cmds;
1765                 spin_unlock_irqrestore(instance->host->host_lock, flags);
1766         }
1767 }
1768
1769 /**
1770  * megasas_complete_cmd_dpc      -      Returns FW's controller structure
1771  * @instance_addr:                      Address of adapter soft state
1772  *
1773  * Tasklet to complete cmds
1774  */
1775 static void megasas_complete_cmd_dpc(unsigned long instance_addr)
1776 {
1777         u32 producer;
1778         u32 consumer;
1779         u32 context;
1780         struct megasas_cmd *cmd;
1781         struct megasas_instance *instance =
1782                                 (struct megasas_instance *)instance_addr;
1783         unsigned long flags;
1784
1785         /* If we have already declared adapter dead, donot complete cmds */
1786         if (instance->adprecovery == MEGASAS_HW_CRITICAL_ERROR )
1787                 return;
1788
1789         spin_lock_irqsave(&instance->completion_lock, flags);
1790
1791         producer = le32_to_cpu(*instance->producer);
1792         consumer = le32_to_cpu(*instance->consumer);
1793
1794         while (consumer != producer) {
1795                 context = le32_to_cpu(instance->reply_queue[consumer]);
1796                 if (context >= instance->max_fw_cmds) {
1797                         printk(KERN_ERR "Unexpected context value %x\n",
1798                                 context);
1799                         BUG();
1800                 }
1801
1802                 cmd = instance->cmd_list[context];
1803
1804                 megasas_complete_cmd(instance, cmd, DID_OK);
1805
1806                 consumer++;
1807                 if (consumer == (instance->max_fw_cmds + 1)) {
1808                         consumer = 0;
1809                 }
1810         }
1811
1812         *instance->consumer = cpu_to_le32(producer);
1813
1814         spin_unlock_irqrestore(&instance->completion_lock, flags);
1815
1816         /*
1817          * Check if we can restore can_queue
1818          */
1819         megasas_check_and_restore_queue_depth(instance);
1820 }
1821
1822 /**
1823  * megasas_start_timer - Initializes a timer object
1824  * @instance:           Adapter soft state
1825  * @timer:              timer object to be initialized
1826  * @fn:                 timer function
1827  * @interval:           time interval between timer function call
1828  *
1829  */
1830 void megasas_start_timer(struct megasas_instance *instance,
1831                         struct timer_list *timer,
1832                         void *fn, unsigned long interval)
1833 {
1834         init_timer(timer);
1835         timer->expires = jiffies + interval;
1836         timer->data = (unsigned long)instance;
1837         timer->function = fn;
1838         add_timer(timer);
1839 }
1840
1841 static void
1842 megasas_internal_reset_defer_cmds(struct megasas_instance *instance);
1843
1844 static void
1845 process_fw_state_change_wq(struct work_struct *work);
1846
1847 void megasas_do_ocr(struct megasas_instance *instance)
1848 {
1849         if ((instance->pdev->device == PCI_DEVICE_ID_LSI_SAS1064R) ||
1850         (instance->pdev->device == PCI_DEVICE_ID_DELL_PERC5) ||
1851         (instance->pdev->device == PCI_DEVICE_ID_LSI_VERDE_ZCR)) {
1852                 *instance->consumer = cpu_to_le32(MEGASAS_ADPRESET_INPROG_SIGN);
1853         }
1854         instance->instancet->disable_intr(instance);
1855         instance->adprecovery   = MEGASAS_ADPRESET_SM_INFAULT;
1856         instance->issuepend_done = 0;
1857
1858         atomic_set(&instance->fw_outstanding, 0);
1859         megasas_internal_reset_defer_cmds(instance);
1860         process_fw_state_change_wq(&instance->work_init);
1861 }
1862
1863 static int megasas_get_ld_vf_affiliation_111(struct megasas_instance *instance,
1864                                             int initial)
1865 {
1866         struct megasas_cmd *cmd;
1867         struct megasas_dcmd_frame *dcmd;
1868         struct MR_LD_VF_AFFILIATION_111 *new_affiliation_111 = NULL;
1869         dma_addr_t new_affiliation_111_h;
1870         int ld, retval = 0;
1871         u8 thisVf;
1872
1873         cmd = megasas_get_cmd(instance);
1874
1875         if (!cmd) {
1876                 printk(KERN_DEBUG "megasas: megasas_get_ld_vf_affiliation_111:"
1877                        "Failed to get cmd for scsi%d.\n",
1878                         instance->host->host_no);
1879                 return -ENOMEM;
1880         }
1881
1882         dcmd = &cmd->frame->dcmd;
1883
1884         if (!instance->vf_affiliation_111) {
1885                 printk(KERN_WARNING "megasas: SR-IOV: Couldn't get LD/VF "
1886                        "affiliation for scsi%d.\n", instance->host->host_no);
1887                 megasas_return_cmd(instance, cmd);
1888                 return -ENOMEM;
1889         }
1890
1891         if (initial)
1892                         memset(instance->vf_affiliation_111, 0,
1893                                sizeof(struct MR_LD_VF_AFFILIATION_111));
1894         else {
1895                 new_affiliation_111 =
1896                         pci_alloc_consistent(instance->pdev,
1897                                              sizeof(struct MR_LD_VF_AFFILIATION_111),
1898                                              &new_affiliation_111_h);
1899                 if (!new_affiliation_111) {
1900                         printk(KERN_DEBUG "megasas: SR-IOV: Couldn't allocate "
1901                                "memory for new affiliation for scsi%d.\n",
1902                                instance->host->host_no);
1903                         megasas_return_cmd(instance, cmd);
1904                         return -ENOMEM;
1905                 }
1906                 memset(new_affiliation_111, 0,
1907                        sizeof(struct MR_LD_VF_AFFILIATION_111));
1908         }
1909
1910         memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
1911
1912         dcmd->cmd = MFI_CMD_DCMD;
1913         dcmd->cmd_status = MFI_STAT_INVALID_STATUS;
1914         dcmd->sge_count = 1;
1915         dcmd->flags = cpu_to_le16(MFI_FRAME_DIR_BOTH);
1916         dcmd->timeout = 0;
1917         dcmd->pad_0 = 0;
1918         dcmd->data_xfer_len =
1919                 cpu_to_le32(sizeof(struct MR_LD_VF_AFFILIATION_111));
1920         dcmd->opcode = cpu_to_le32(MR_DCMD_LD_VF_MAP_GET_ALL_LDS_111);
1921
1922         if (initial)
1923                 dcmd->sgl.sge32[0].phys_addr =
1924                         cpu_to_le32(instance->vf_affiliation_111_h);
1925         else
1926                 dcmd->sgl.sge32[0].phys_addr =
1927                         cpu_to_le32(new_affiliation_111_h);
1928
1929         dcmd->sgl.sge32[0].length = cpu_to_le32(
1930                 sizeof(struct MR_LD_VF_AFFILIATION_111));
1931
1932         printk(KERN_WARNING "megasas: SR-IOV: Getting LD/VF affiliation for "
1933                "scsi%d\n", instance->host->host_no);
1934
1935         megasas_issue_blocked_cmd(instance, cmd, 0);
1936
1937         if (dcmd->cmd_status) {
1938                 printk(KERN_WARNING "megasas: SR-IOV: LD/VF affiliation DCMD"
1939                        " failed with status 0x%x for scsi%d.\n",
1940                        dcmd->cmd_status, instance->host->host_no);
1941                 retval = 1; /* Do a scan if we couldn't get affiliation */
1942                 goto out;
1943         }
1944
1945         if (!initial) {
1946                 thisVf = new_affiliation_111->thisVf;
1947                 for (ld = 0 ; ld < new_affiliation_111->vdCount; ld++)
1948                         if (instance->vf_affiliation_111->map[ld].policy[thisVf] !=
1949                             new_affiliation_111->map[ld].policy[thisVf]) {
1950                                 printk(KERN_WARNING "megasas: SR-IOV: "
1951                                        "Got new LD/VF affiliation "
1952                                        "for scsi%d.\n",
1953                                        instance->host->host_no);
1954                                 memcpy(instance->vf_affiliation_111,
1955                                        new_affiliation_111,
1956                                        sizeof(struct MR_LD_VF_AFFILIATION_111));
1957                                 retval = 1;
1958                                 goto out;
1959                         }
1960         }
1961 out:
1962         if (new_affiliation_111) {
1963                 pci_free_consistent(instance->pdev,
1964                                     sizeof(struct MR_LD_VF_AFFILIATION_111),
1965                                     new_affiliation_111,
1966                                     new_affiliation_111_h);
1967         }
1968
1969         megasas_return_cmd(instance, cmd);
1970
1971         return retval;
1972 }
1973
1974 static int megasas_get_ld_vf_affiliation_12(struct megasas_instance *instance,
1975                                             int initial)
1976 {
1977         struct megasas_cmd *cmd;
1978         struct megasas_dcmd_frame *dcmd;
1979         struct MR_LD_VF_AFFILIATION *new_affiliation = NULL;
1980         struct MR_LD_VF_MAP *newmap = NULL, *savedmap = NULL;
1981         dma_addr_t new_affiliation_h;
1982         int i, j, retval = 0, found = 0, doscan = 0;
1983         u8 thisVf;
1984
1985         cmd = megasas_get_cmd(instance);
1986
1987         if (!cmd) {
1988                 printk(KERN_DEBUG "megasas: megasas_get_ld_vf_affiliation12: "
1989                        "Failed to get cmd for scsi%d.\n",
1990                        instance->host->host_no);
1991                 return -ENOMEM;
1992         }
1993
1994         dcmd = &cmd->frame->dcmd;
1995
1996         if (!instance->vf_affiliation) {
1997                 printk(KERN_WARNING "megasas: SR-IOV: Couldn't get LD/VF "
1998                        "affiliation for scsi%d.\n", instance->host->host_no);
1999                 megasas_return_cmd(instance, cmd);
2000                 return -ENOMEM;
2001         }
2002
2003         if (initial)
2004                 memset(instance->vf_affiliation, 0, (MAX_LOGICAL_DRIVES + 1) *
2005                        sizeof(struct MR_LD_VF_AFFILIATION));
2006         else {
2007                 new_affiliation =
2008                         pci_alloc_consistent(instance->pdev,
2009                                              (MAX_LOGICAL_DRIVES + 1) *
2010                                              sizeof(struct MR_LD_VF_AFFILIATION),
2011                                              &new_affiliation_h);
2012                 if (!new_affiliation) {
2013                         printk(KERN_DEBUG "megasas: SR-IOV: Couldn't allocate "
2014                                "memory for new affiliation for scsi%d.\n",
2015                                instance->host->host_no);
2016                         megasas_return_cmd(instance, cmd);
2017                         return -ENOMEM;
2018                 }
2019                 memset(new_affiliation, 0, (MAX_LOGICAL_DRIVES + 1) *
2020                        sizeof(struct MR_LD_VF_AFFILIATION));
2021         }
2022
2023         memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
2024
2025         dcmd->cmd = MFI_CMD_DCMD;
2026         dcmd->cmd_status = MFI_STAT_INVALID_STATUS;
2027         dcmd->sge_count = 1;
2028         dcmd->flags = cpu_to_le16(MFI_FRAME_DIR_BOTH);
2029         dcmd->timeout = 0;
2030         dcmd->pad_0 = 0;
2031         dcmd->data_xfer_len = cpu_to_le32((MAX_LOGICAL_DRIVES + 1) *
2032                 sizeof(struct MR_LD_VF_AFFILIATION));
2033         dcmd->opcode = cpu_to_le32(MR_DCMD_LD_VF_MAP_GET_ALL_LDS);
2034
2035         if (initial)
2036                 dcmd->sgl.sge32[0].phys_addr =
2037                         cpu_to_le32(instance->vf_affiliation_h);
2038         else
2039                 dcmd->sgl.sge32[0].phys_addr =
2040                         cpu_to_le32(new_affiliation_h);
2041
2042         dcmd->sgl.sge32[0].length = cpu_to_le32((MAX_LOGICAL_DRIVES + 1) *
2043                 sizeof(struct MR_LD_VF_AFFILIATION));
2044
2045         printk(KERN_WARNING "megasas: SR-IOV: Getting LD/VF affiliation for "
2046                "scsi%d\n", instance->host->host_no);
2047
2048         megasas_issue_blocked_cmd(instance, cmd, 0);
2049
2050         if (dcmd->cmd_status) {
2051                 printk(KERN_WARNING "megasas: SR-IOV: LD/VF affiliation DCMD"
2052                        " failed with status 0x%x for scsi%d.\n",
2053                        dcmd->cmd_status, instance->host->host_no);
2054                 retval = 1; /* Do a scan if we couldn't get affiliation */
2055                 goto out;
2056         }
2057
2058         if (!initial) {
2059                 if (!new_affiliation->ldCount) {
2060                         printk(KERN_WARNING "megasas: SR-IOV: Got new LD/VF "
2061                                "affiliation for passive path for scsi%d.\n",
2062                                instance->host->host_no);
2063                         retval = 1;
2064                         goto out;
2065                 }
2066                 newmap = new_affiliation->map;
2067                 savedmap = instance->vf_affiliation->map;
2068                 thisVf = new_affiliation->thisVf;
2069                 for (i = 0 ; i < new_affiliation->ldCount; i++) {
2070                         found = 0;
2071                         for (j = 0; j < instance->vf_affiliation->ldCount;
2072                              j++) {
2073                                 if (newmap->ref.targetId ==
2074                                     savedmap->ref.targetId) {
2075                                         found = 1;
2076                                         if (newmap->policy[thisVf] !=
2077                                             savedmap->policy[thisVf]) {
2078                                                 doscan = 1;
2079                                                 goto out;
2080                                         }
2081                                 }
2082                                 savedmap = (struct MR_LD_VF_MAP *)
2083                                         ((unsigned char *)savedmap +
2084                                          savedmap->size);
2085                         }
2086                         if (!found && newmap->policy[thisVf] !=
2087                             MR_LD_ACCESS_HIDDEN) {
2088                                 doscan = 1;
2089                                 goto out;
2090                         }
2091                         newmap = (struct MR_LD_VF_MAP *)
2092                                 ((unsigned char *)newmap + newmap->size);
2093                 }
2094
2095                 newmap = new_affiliation->map;
2096                 savedmap = instance->vf_affiliation->map;
2097
2098                 for (i = 0 ; i < instance->vf_affiliation->ldCount; i++) {
2099                         found = 0;
2100                         for (j = 0 ; j < new_affiliation->ldCount; j++) {
2101                                 if (savedmap->ref.targetId ==
2102                                     newmap->ref.targetId) {
2103                                         found = 1;
2104                                         if (savedmap->policy[thisVf] !=
2105                                             newmap->policy[thisVf]) {
2106                                                 doscan = 1;
2107                                                 goto out;
2108                                         }
2109                                 }
2110                                 newmap = (struct MR_LD_VF_MAP *)
2111                                         ((unsigned char *)newmap +
2112                                          newmap->size);
2113                         }
2114                         if (!found && savedmap->policy[thisVf] !=
2115                             MR_LD_ACCESS_HIDDEN) {
2116                                 doscan = 1;
2117                                 goto out;
2118                         }
2119                         savedmap = (struct MR_LD_VF_MAP *)
2120                                 ((unsigned char *)savedmap +
2121                                  savedmap->size);
2122                 }
2123         }
2124 out:
2125         if (doscan) {
2126                 printk(KERN_WARNING "megasas: SR-IOV: Got new LD/VF "
2127                        "affiliation for scsi%d.\n", instance->host->host_no);
2128                 memcpy(instance->vf_affiliation, new_affiliation,
2129                        new_affiliation->size);
2130                 retval = 1;
2131         }
2132
2133         if (new_affiliation)
2134                 pci_free_consistent(instance->pdev,
2135                                     (MAX_LOGICAL_DRIVES + 1) *
2136                                     sizeof(struct MR_LD_VF_AFFILIATION),
2137                                     new_affiliation, new_affiliation_h);
2138         megasas_return_cmd(instance, cmd);
2139
2140         return retval;
2141 }
2142
2143 /* This function will get the current SR-IOV LD/VF affiliation */
2144 static int megasas_get_ld_vf_affiliation(struct megasas_instance *instance,
2145         int initial)
2146 {
2147         int retval;
2148
2149         if (instance->PlasmaFW111)
2150                 retval = megasas_get_ld_vf_affiliation_111(instance, initial);
2151         else
2152                 retval = megasas_get_ld_vf_affiliation_12(instance, initial);
2153         return retval;
2154 }
2155
2156 /* This function will tell FW to start the SR-IOV heartbeat */
2157 int megasas_sriov_start_heartbeat(struct megasas_instance *instance,
2158                                          int initial)
2159 {
2160         struct megasas_cmd *cmd;
2161         struct megasas_dcmd_frame *dcmd;
2162         int retval = 0;
2163
2164         cmd = megasas_get_cmd(instance);
2165
2166         if (!cmd) {
2167                 printk(KERN_DEBUG "megasas: megasas_sriov_start_heartbeat: "
2168                        "Failed to get cmd for scsi%d.\n",
2169                        instance->host->host_no);
2170                 return -ENOMEM;
2171         }
2172
2173         dcmd = &cmd->frame->dcmd;
2174
2175         if (initial) {
2176                 instance->hb_host_mem =
2177                         pci_zalloc_consistent(instance->pdev,
2178                                               sizeof(struct MR_CTRL_HB_HOST_MEM),
2179                                               &instance->hb_host_mem_h);
2180                 if (!instance->hb_host_mem) {
2181                         printk(KERN_DEBUG "megasas: SR-IOV: Couldn't allocate"
2182                                " memory for heartbeat host memory for "
2183                                "scsi%d.\n", instance->host->host_no);
2184                         retval = -ENOMEM;
2185                         goto out;
2186                 }
2187         }
2188
2189         memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
2190
2191         dcmd->mbox.s[0] = cpu_to_le16(sizeof(struct MR_CTRL_HB_HOST_MEM));
2192         dcmd->cmd = MFI_CMD_DCMD;
2193         dcmd->cmd_status = MFI_STAT_INVALID_STATUS;
2194         dcmd->sge_count = 1;
2195         dcmd->flags = cpu_to_le16(MFI_FRAME_DIR_BOTH);
2196         dcmd->timeout = 0;
2197         dcmd->pad_0 = 0;
2198         dcmd->data_xfer_len = cpu_to_le32(sizeof(struct MR_CTRL_HB_HOST_MEM));
2199         dcmd->opcode = cpu_to_le32(MR_DCMD_CTRL_SHARED_HOST_MEM_ALLOC);
2200         dcmd->sgl.sge32[0].phys_addr = cpu_to_le32(instance->hb_host_mem_h);
2201         dcmd->sgl.sge32[0].length = cpu_to_le32(sizeof(struct MR_CTRL_HB_HOST_MEM));
2202
2203         printk(KERN_WARNING "megasas: SR-IOV: Starting heartbeat for scsi%d\n",
2204                instance->host->host_no);
2205
2206         if (instance->ctrl_context && !instance->mask_interrupts)
2207                 retval = megasas_issue_blocked_cmd(instance, cmd,
2208                         MEGASAS_ROUTINE_WAIT_TIME_VF);
2209         else
2210                 retval = megasas_issue_polled(instance, cmd);
2211
2212         if (retval) {
2213                 dev_warn(&instance->pdev->dev, "SR-IOV: MR_DCMD_CTRL_SHARED_HOST"
2214                         "_MEM_ALLOC DCMD %s for scsi%d\n",
2215                         (dcmd->cmd_status == MFI_STAT_INVALID_STATUS) ?
2216                         "timed out" : "failed", instance->host->host_no);
2217                 retval = 1;
2218         }
2219
2220 out:
2221         megasas_return_cmd(instance, cmd);
2222
2223         return retval;
2224 }
2225
2226 /* Handler for SR-IOV heartbeat */
2227 void megasas_sriov_heartbeat_handler(unsigned long instance_addr)
2228 {
2229         struct megasas_instance *instance =
2230                 (struct megasas_instance *)instance_addr;
2231
2232         if (instance->hb_host_mem->HB.fwCounter !=
2233             instance->hb_host_mem->HB.driverCounter) {
2234                 instance->hb_host_mem->HB.driverCounter =
2235                         instance->hb_host_mem->HB.fwCounter;
2236                 mod_timer(&instance->sriov_heartbeat_timer,
2237                           jiffies + MEGASAS_SRIOV_HEARTBEAT_INTERVAL_VF);
2238         } else {
2239                 printk(KERN_WARNING "megasas: SR-IOV: Heartbeat never "
2240                        "completed for scsi%d\n", instance->host->host_no);
2241                 schedule_work(&instance->work_init);
2242         }
2243 }
2244
2245 /**
2246  * megasas_wait_for_outstanding -       Wait for all outstanding cmds
2247  * @instance:                           Adapter soft state
2248  *
2249  * This function waits for up to MEGASAS_RESET_WAIT_TIME seconds for FW to
2250  * complete all its outstanding commands. Returns error if one or more IOs
2251  * are pending after this time period. It also marks the controller dead.
2252  */
2253 static int megasas_wait_for_outstanding(struct megasas_instance *instance)
2254 {
2255         int i;
2256         u32 reset_index;
2257         u32 wait_time = MEGASAS_RESET_WAIT_TIME;
2258         u8 adprecovery;
2259         unsigned long flags;
2260         struct list_head clist_local;
2261         struct megasas_cmd *reset_cmd;
2262         u32 fw_state;
2263         u8 kill_adapter_flag;
2264
2265         spin_lock_irqsave(&instance->hba_lock, flags);
2266         adprecovery = instance->adprecovery;
2267         spin_unlock_irqrestore(&instance->hba_lock, flags);
2268
2269         if (adprecovery != MEGASAS_HBA_OPERATIONAL) {
2270
2271                 INIT_LIST_HEAD(&clist_local);
2272                 spin_lock_irqsave(&instance->hba_lock, flags);
2273                 list_splice_init(&instance->internal_reset_pending_q,
2274                                 &clist_local);
2275                 spin_unlock_irqrestore(&instance->hba_lock, flags);
2276
2277                 printk(KERN_NOTICE "megasas: HBA reset wait ...\n");
2278                 for (i = 0; i < wait_time; i++) {
2279                         msleep(1000);
2280                         spin_lock_irqsave(&instance->hba_lock, flags);
2281                         adprecovery = instance->adprecovery;
2282                         spin_unlock_irqrestore(&instance->hba_lock, flags);
2283                         if (adprecovery == MEGASAS_HBA_OPERATIONAL)
2284                                 break;
2285                 }
2286
2287                 if (adprecovery != MEGASAS_HBA_OPERATIONAL) {
2288                         printk(KERN_NOTICE "megasas: reset: Stopping HBA.\n");
2289                         spin_lock_irqsave(&instance->hba_lock, flags);
2290                         instance->adprecovery   = MEGASAS_HW_CRITICAL_ERROR;
2291                         spin_unlock_irqrestore(&instance->hba_lock, flags);
2292                         return FAILED;
2293                 }
2294
2295                 reset_index     = 0;
2296                 while (!list_empty(&clist_local)) {
2297                         reset_cmd       = list_entry((&clist_local)->next,
2298                                                 struct megasas_cmd, list);
2299                         list_del_init(&reset_cmd->list);
2300                         if (reset_cmd->scmd) {
2301                                 reset_cmd->scmd->result = DID_RESET << 16;
2302                                 printk(KERN_NOTICE "%d:%p reset [%02x]\n",
2303                                         reset_index, reset_cmd,
2304                                         reset_cmd->scmd->cmnd[0]);
2305
2306                                 reset_cmd->scmd->scsi_done(reset_cmd->scmd);
2307                                 megasas_return_cmd(instance, reset_cmd);
2308                         } else if (reset_cmd->sync_cmd) {
2309                                 printk(KERN_NOTICE "megasas:%p synch cmds"
2310                                                 "reset queue\n",
2311                                                 reset_cmd);
2312
2313                                 reset_cmd->cmd_status_drv = MFI_STAT_INVALID_STATUS;
2314                                 instance->instancet->fire_cmd(instance,
2315                                                 reset_cmd->frame_phys_addr,
2316                                                 0, instance->reg_set);
2317                         } else {
2318                                 printk(KERN_NOTICE "megasas: %p unexpected"
2319                                         "cmds lst\n",
2320                                         reset_cmd);
2321                         }
2322                         reset_index++;
2323                 }
2324
2325                 return SUCCESS;
2326         }
2327
2328         for (i = 0; i < resetwaittime; i++) {
2329
2330                 int outstanding = atomic_read(&instance->fw_outstanding);
2331
2332                 if (!outstanding)
2333                         break;
2334
2335                 if (!(i % MEGASAS_RESET_NOTICE_INTERVAL)) {
2336                         printk(KERN_NOTICE "megasas: [%2d]waiting for %d "
2337                                "commands to complete\n",i,outstanding);
2338                         /*
2339                          * Call cmd completion routine. Cmd to be
2340                          * be completed directly without depending on isr.
2341                          */
2342                         megasas_complete_cmd_dpc((unsigned long)instance);
2343                 }
2344
2345                 msleep(1000);
2346         }
2347
2348         i = 0;
2349         kill_adapter_flag = 0;
2350         do {
2351                 fw_state = instance->instancet->read_fw_status_reg(
2352                                         instance->reg_set) & MFI_STATE_MASK;
2353                 if ((fw_state == MFI_STATE_FAULT) &&
2354                         (instance->disableOnlineCtrlReset == 0)) {
2355                         if (i == 3) {
2356                                 kill_adapter_flag = 2;
2357                                 break;
2358                         }
2359                         megasas_do_ocr(instance);
2360                         kill_adapter_flag = 1;
2361
2362                         /* wait for 1 secs to let FW finish the pending cmds */
2363                         msleep(1000);
2364                 }
2365                 i++;
2366         } while (i <= 3);
2367
2368         if (atomic_read(&instance->fw_outstanding) &&
2369                                         !kill_adapter_flag) {
2370                 if (instance->disableOnlineCtrlReset == 0) {
2371
2372                         megasas_do_ocr(instance);
2373
2374                         /* wait for 5 secs to let FW finish the pending cmds */
2375                         for (i = 0; i < wait_time; i++) {
2376                                 int outstanding =
2377                                         atomic_read(&instance->fw_outstanding);
2378                                 if (!outstanding)
2379                                         return SUCCESS;
2380                                 msleep(1000);
2381                         }
2382                 }
2383         }
2384
2385         if (atomic_read(&instance->fw_outstanding) ||
2386                                         (kill_adapter_flag == 2)) {
2387                 printk(KERN_NOTICE "megaraid_sas: pending cmds after reset\n");
2388                 /*
2389                 * Send signal to FW to stop processing any pending cmds.
2390                 * The controller will be taken offline by the OS now.
2391                 */
2392                 if ((instance->pdev->device ==
2393                         PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
2394                         (instance->pdev->device ==
2395                         PCI_DEVICE_ID_LSI_SAS0071SKINNY)) {
2396                         writel(MFI_STOP_ADP,
2397                                 &instance->reg_set->doorbell);
2398                 } else {
2399                         writel(MFI_STOP_ADP,
2400                                 &instance->reg_set->inbound_doorbell);
2401                 }
2402                 megasas_dump_pending_frames(instance);
2403                 spin_lock_irqsave(&instance->hba_lock, flags);
2404                 instance->adprecovery   = MEGASAS_HW_CRITICAL_ERROR;
2405                 spin_unlock_irqrestore(&instance->hba_lock, flags);
2406                 return FAILED;
2407         }
2408
2409         printk(KERN_NOTICE "megaraid_sas: no pending cmds after reset\n");
2410
2411         return SUCCESS;
2412 }
2413
2414 /**
2415  * megasas_generic_reset -      Generic reset routine
2416  * @scmd:                       Mid-layer SCSI command
2417  *
2418  * This routine implements a generic reset handler for device, bus and host
2419  * reset requests. Device, bus and host specific reset handlers can use this
2420  * function after they do their specific tasks.
2421  */
2422 static int megasas_generic_reset(struct scsi_cmnd *scmd)
2423 {
2424         int ret_val;
2425         struct megasas_instance *instance;
2426
2427         instance = (struct megasas_instance *)scmd->device->host->hostdata;
2428
2429         scmd_printk(KERN_NOTICE, scmd, "megasas: RESET cmd=%x retries=%x\n",
2430                  scmd->cmnd[0], scmd->retries);
2431
2432         if (instance->adprecovery == MEGASAS_HW_CRITICAL_ERROR) {
2433                 printk(KERN_ERR "megasas: cannot recover from previous reset "
2434                        "failures\n");
2435                 return FAILED;
2436         }
2437
2438         ret_val = megasas_wait_for_outstanding(instance);
2439         if (ret_val == SUCCESS)
2440                 printk(KERN_NOTICE "megasas: reset successful \n");
2441         else
2442                 printk(KERN_ERR "megasas: failed to do reset\n");
2443
2444         return ret_val;
2445 }
2446
2447 /**
2448  * megasas_reset_timer - quiesce the adapter if required
2449  * @scmd:               scsi cmnd
2450  *
2451  * Sets the FW busy flag and reduces the host->can_queue if the
2452  * cmd has not been completed within the timeout period.
2453  */
2454 static enum
2455 blk_eh_timer_return megasas_reset_timer(struct scsi_cmnd *scmd)
2456 {
2457         struct megasas_instance *instance;
2458         unsigned long flags;
2459
2460         if (time_after(jiffies, scmd->jiffies_at_alloc +
2461                                 (MEGASAS_DEFAULT_CMD_TIMEOUT * 2) * HZ)) {
2462                 return BLK_EH_NOT_HANDLED;
2463         }
2464
2465         instance = (struct megasas_instance *)scmd->device->host->hostdata;
2466         if (!(instance->flag & MEGASAS_FW_BUSY)) {
2467                 /* FW is busy, throttle IO */
2468                 spin_lock_irqsave(instance->host->host_lock, flags);
2469
2470                 instance->host->can_queue = instance->throttlequeuedepth;
2471                 instance->last_time = jiffies;
2472                 instance->flag |= MEGASAS_FW_BUSY;
2473
2474                 spin_unlock_irqrestore(instance->host->host_lock, flags);
2475         }
2476         return BLK_EH_RESET_TIMER;
2477 }
2478
2479 /**
2480  * megasas_reset_device -       Device reset handler entry point
2481  */
2482 static int megasas_reset_device(struct scsi_cmnd *scmd)
2483 {
2484         int ret;
2485
2486         /*
2487          * First wait for all commands to complete
2488          */
2489         ret = megasas_generic_reset(scmd);
2490
2491         return ret;
2492 }
2493
2494 /**
2495  * megasas_reset_bus_host -     Bus & host reset handler entry point
2496  */
2497 static int megasas_reset_bus_host(struct scsi_cmnd *scmd)
2498 {
2499         int ret;
2500         struct megasas_instance *instance;
2501         instance = (struct megasas_instance *)scmd->device->host->hostdata;
2502
2503         /*
2504          * First wait for all commands to complete
2505          */
2506         if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
2507             (instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA) ||
2508             (instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
2509             (instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
2510                 ret = megasas_reset_fusion(scmd->device->host, 1);
2511         else
2512                 ret = megasas_generic_reset(scmd);
2513
2514         return ret;
2515 }
2516
2517 /**
2518  * megasas_bios_param - Returns disk geometry for a disk
2519  * @sdev:               device handle
2520  * @bdev:               block device
2521  * @capacity:           drive capacity
2522  * @geom:               geometry parameters
2523  */
2524 static int
2525 megasas_bios_param(struct scsi_device *sdev, struct block_device *bdev,
2526                  sector_t capacity, int geom[])
2527 {
2528         int heads;
2529         int sectors;
2530         sector_t cylinders;
2531         unsigned long tmp;
2532         /* Default heads (64) & sectors (32) */
2533         heads = 64;
2534         sectors = 32;
2535
2536         tmp = heads * sectors;
2537         cylinders = capacity;
2538
2539         sector_div(cylinders, tmp);
2540
2541         /*
2542          * Handle extended translation size for logical drives > 1Gb
2543          */
2544
2545         if (capacity >= 0x200000) {
2546                 heads = 255;
2547                 sectors = 63;
2548                 tmp = heads*sectors;
2549                 cylinders = capacity;
2550                 sector_div(cylinders, tmp);
2551         }
2552
2553         geom[0] = heads;
2554         geom[1] = sectors;
2555         geom[2] = cylinders;
2556
2557         return 0;
2558 }
2559
2560 static void megasas_aen_polling(struct work_struct *work);
2561
2562 /**
2563  * megasas_service_aen -        Processes an event notification
2564  * @instance:                   Adapter soft state
2565  * @cmd:                        AEN command completed by the ISR
2566  *
2567  * For AEN, driver sends a command down to FW that is held by the FW till an
2568  * event occurs. When an event of interest occurs, FW completes the command
2569  * that it was previously holding.
2570  *
2571  * This routines sends SIGIO signal to processes that have registered with the
2572  * driver for AEN.
2573  */
2574 static void
2575 megasas_service_aen(struct megasas_instance *instance, struct megasas_cmd *cmd)
2576 {
2577         unsigned long flags;
2578         /*
2579          * Don't signal app if it is just an aborted previously registered aen
2580          */
2581         if ((!cmd->abort_aen) && (instance->unload == 0)) {
2582                 spin_lock_irqsave(&poll_aen_lock, flags);
2583                 megasas_poll_wait_aen = 1;
2584                 spin_unlock_irqrestore(&poll_aen_lock, flags);
2585                 wake_up(&megasas_poll_wait);
2586                 kill_fasync(&megasas_async_queue, SIGIO, POLL_IN);
2587         }
2588         else
2589                 cmd->abort_aen = 0;
2590
2591         instance->aen_cmd = NULL;
2592
2593         megasas_return_cmd(instance, cmd);
2594
2595         if ((instance->unload == 0) &&
2596                 ((instance->issuepend_done == 1))) {
2597                 struct megasas_aen_event *ev;
2598                 ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
2599                 if (!ev) {
2600                         printk(KERN_ERR "megasas_service_aen: out of memory\n");
2601                 } else {
2602                         ev->instance = instance;
2603                         instance->ev = ev;
2604                         INIT_DELAYED_WORK(&ev->hotplug_work,
2605                                           megasas_aen_polling);
2606                         schedule_delayed_work(&ev->hotplug_work, 0);
2607                 }
2608         }
2609 }
2610
2611 static ssize_t
2612 megasas_fw_crash_buffer_store(struct device *cdev,
2613         struct device_attribute *attr, const char *buf, size_t count)
2614 {
2615         struct Scsi_Host *shost = class_to_shost(cdev);
2616         struct megasas_instance *instance =
2617                 (struct megasas_instance *) shost->hostdata;
2618         int val = 0;
2619         unsigned long flags;
2620
2621         if (kstrtoint(buf, 0, &val) != 0)
2622                 return -EINVAL;
2623
2624         spin_lock_irqsave(&instance->crashdump_lock, flags);
2625         instance->fw_crash_buffer_offset = val;
2626         spin_unlock_irqrestore(&instance->crashdump_lock, flags);
2627         return strlen(buf);
2628 }
2629
2630 static ssize_t
2631 megasas_fw_crash_buffer_show(struct device *cdev,
2632         struct device_attribute *attr, char *buf)
2633 {
2634         struct Scsi_Host *shost = class_to_shost(cdev);
2635         struct megasas_instance *instance =
2636                 (struct megasas_instance *) shost->hostdata;
2637         u32 size;
2638         unsigned long buff_addr;
2639         unsigned long dmachunk = CRASH_DMA_BUF_SIZE;
2640         unsigned long src_addr;
2641         unsigned long flags;
2642         u32 buff_offset;
2643
2644         spin_lock_irqsave(&instance->crashdump_lock, flags);
2645         buff_offset = instance->fw_crash_buffer_offset;
2646         if (!instance->crash_dump_buf &&
2647                 !((instance->fw_crash_state == AVAILABLE) ||
2648                 (instance->fw_crash_state == COPYING))) {
2649                 dev_err(&instance->pdev->dev,
2650                         "Firmware crash dump is not available\n");
2651                 spin_unlock_irqrestore(&instance->crashdump_lock, flags);
2652                 return -EINVAL;
2653         }
2654
2655         buff_addr = (unsigned long) buf;
2656
2657         if (buff_offset >
2658                 (instance->fw_crash_buffer_size * dmachunk)) {
2659                 dev_err(&instance->pdev->dev,
2660                         "Firmware crash dump offset is out of range\n");
2661                 spin_unlock_irqrestore(&instance->crashdump_lock, flags);
2662                 return 0;
2663         }
2664
2665         size = (instance->fw_crash_buffer_size * dmachunk) - buff_offset;
2666         size = (size >= PAGE_SIZE) ? (PAGE_SIZE - 1) : size;
2667
2668         src_addr = (unsigned long)instance->crash_buf[buff_offset / dmachunk] +
2669                 (buff_offset % dmachunk);
2670         memcpy(buf, (void *)src_addr,  size);
2671         spin_unlock_irqrestore(&instance->crashdump_lock, flags);
2672
2673         return size;
2674 }
2675
2676 static ssize_t
2677 megasas_fw_crash_buffer_size_show(struct device *cdev,
2678         struct device_attribute *attr, char *buf)
2679 {
2680         struct Scsi_Host *shost = class_to_shost(cdev);
2681         struct megasas_instance *instance =
2682                 (struct megasas_instance *) shost->hostdata;
2683
2684         return snprintf(buf, PAGE_SIZE, "%ld\n", (unsigned long)
2685                 ((instance->fw_crash_buffer_size) * 1024 * 1024)/PAGE_SIZE);
2686 }
2687
2688 static ssize_t
2689 megasas_fw_crash_state_store(struct device *cdev,
2690         struct device_attribute *attr, const char *buf, size_t count)
2691 {
2692         struct Scsi_Host *shost = class_to_shost(cdev);
2693         struct megasas_instance *instance =
2694                 (struct megasas_instance *) shost->hostdata;
2695         int val = 0;
2696         unsigned long flags;
2697
2698         if (kstrtoint(buf, 0, &val) != 0)
2699                 return -EINVAL;
2700
2701         if ((val <= AVAILABLE || val > COPY_ERROR)) {
2702                 dev_err(&instance->pdev->dev, "application updates invalid "
2703                         "firmware crash state\n");
2704                 return -EINVAL;
2705         }
2706
2707         instance->fw_crash_state = val;
2708
2709         if ((val == COPIED) || (val == COPY_ERROR)) {
2710                 spin_lock_irqsave(&instance->crashdump_lock, flags);
2711                 megasas_free_host_crash_buffer(instance);
2712                 spin_unlock_irqrestore(&instance->crashdump_lock, flags);
2713                 if (val == COPY_ERROR)
2714                         dev_info(&instance->pdev->dev, "application failed to "
2715                                 "copy Firmware crash dump\n");
2716                 else
2717                         dev_info(&instance->pdev->dev, "Firmware crash dump "
2718                                 "copied successfully\n");
2719         }
2720         return strlen(buf);
2721 }
2722
2723 static ssize_t
2724 megasas_fw_crash_state_show(struct device *cdev,
2725         struct device_attribute *attr, char *buf)
2726 {
2727         struct Scsi_Host *shost = class_to_shost(cdev);
2728         struct megasas_instance *instance =
2729                 (struct megasas_instance *) shost->hostdata;
2730         return snprintf(buf, PAGE_SIZE, "%d\n", instance->fw_crash_state);
2731 }
2732
2733 static ssize_t
2734 megasas_page_size_show(struct device *cdev,
2735         struct device_attribute *attr, char *buf)
2736 {
2737         return snprintf(buf, PAGE_SIZE, "%ld\n", (unsigned long)PAGE_SIZE - 1);
2738 }
2739
2740 static DEVICE_ATTR(fw_crash_buffer, S_IRUGO | S_IWUSR,
2741         megasas_fw_crash_buffer_show, megasas_fw_crash_buffer_store);
2742 static DEVICE_ATTR(fw_crash_buffer_size, S_IRUGO,
2743         megasas_fw_crash_buffer_size_show, NULL);
2744 static DEVICE_ATTR(fw_crash_state, S_IRUGO | S_IWUSR,
2745         megasas_fw_crash_state_show, megasas_fw_crash_state_store);
2746 static DEVICE_ATTR(page_size, S_IRUGO,
2747         megasas_page_size_show, NULL);
2748
2749 struct device_attribute *megaraid_host_attrs[] = {
2750         &dev_attr_fw_crash_buffer_size,
2751         &dev_attr_fw_crash_buffer,
2752         &dev_attr_fw_crash_state,
2753         &dev_attr_page_size,
2754         NULL,
2755 };
2756
2757 /*
2758  * Scsi host template for megaraid_sas driver
2759  */
2760 static struct scsi_host_template megasas_template = {
2761
2762         .module = THIS_MODULE,
2763         .name = "Avago SAS based MegaRAID driver",
2764         .proc_name = "megaraid_sas",
2765         .slave_configure = megasas_slave_configure,
2766         .slave_alloc = megasas_slave_alloc,
2767         .queuecommand = megasas_queue_command,
2768         .eh_device_reset_handler = megasas_reset_device,
2769         .eh_bus_reset_handler = megasas_reset_bus_host,
2770         .eh_host_reset_handler = megasas_reset_bus_host,
2771         .eh_timed_out = megasas_reset_timer,
2772         .shost_attrs = megaraid_host_attrs,
2773         .bios_param = megasas_bios_param,
2774         .use_clustering = ENABLE_CLUSTERING,
2775         .change_queue_depth = scsi_change_queue_depth,
2776         .no_write_same = 1,
2777 };
2778
2779 /**
2780  * megasas_complete_int_cmd -   Completes an internal command
2781  * @instance:                   Adapter soft state
2782  * @cmd:                        Command to be completed
2783  *
2784  * The megasas_issue_blocked_cmd() function waits for a command to complete
2785  * after it issues a command. This function wakes up that waiting routine by
2786  * calling wake_up() on the wait queue.
2787  */
2788 static void
2789 megasas_complete_int_cmd(struct megasas_instance *instance,
2790                          struct megasas_cmd *cmd)
2791 {
2792         cmd->cmd_status_drv = cmd->frame->io.cmd_status;
2793         wake_up(&instance->int_cmd_wait_q);
2794 }
2795
2796 /**
2797  * megasas_complete_abort -     Completes aborting a command
2798  * @instance:                   Adapter soft state
2799  * @cmd:                        Cmd that was issued to abort another cmd
2800  *
2801  * The megasas_issue_blocked_abort_cmd() function waits on abort_cmd_wait_q
2802  * after it issues an abort on a previously issued command. This function
2803  * wakes up all functions waiting on the same wait queue.
2804  */
2805 static void
2806 megasas_complete_abort(struct megasas_instance *instance,
2807                        struct megasas_cmd *cmd)
2808 {
2809         if (cmd->sync_cmd) {
2810                 cmd->sync_cmd = 0;
2811                 cmd->cmd_status_drv = 0;
2812                 wake_up(&instance->abort_cmd_wait_q);
2813         }
2814
2815         return;
2816 }
2817
2818 /**
2819  * megasas_complete_cmd -       Completes a command
2820  * @instance:                   Adapter soft state
2821  * @cmd:                        Command to be completed
2822  * @alt_status:                 If non-zero, use this value as status to
2823  *                              SCSI mid-layer instead of the value returned
2824  *                              by the FW. This should be used if caller wants
2825  *                              an alternate status (as in the case of aborted
2826  *                              commands)
2827  */
2828 void
2829 megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd,
2830                      u8 alt_status)
2831 {
2832         int exception = 0;
2833         struct megasas_header *hdr = &cmd->frame->hdr;
2834         unsigned long flags;
2835         struct fusion_context *fusion = instance->ctrl_context;
2836         u32 opcode;
2837
2838         /* flag for the retry reset */
2839         cmd->retry_for_fw_reset = 0;
2840
2841         if (cmd->scmd)
2842                 cmd->scmd->SCp.ptr = NULL;
2843
2844         switch (hdr->cmd) {
2845         case MFI_CMD_INVALID:
2846                 /* Some older 1068 controller FW may keep a pended
2847                    MR_DCMD_CTRL_EVENT_GET_INFO left over from the main kernel
2848                    when booting the kdump kernel.  Ignore this command to
2849                    prevent a kernel panic on shutdown of the kdump kernel. */
2850                 printk(KERN_WARNING "megaraid_sas: MFI_CMD_INVALID command "
2851                        "completed.\n");
2852                 printk(KERN_WARNING "megaraid_sas: If you have a controller "
2853                        "other than PERC5, please upgrade your firmware.\n");
2854                 break;
2855         case MFI_CMD_PD_SCSI_IO:
2856         case MFI_CMD_LD_SCSI_IO:
2857
2858                 /*
2859                  * MFI_CMD_PD_SCSI_IO and MFI_CMD_LD_SCSI_IO could have been
2860                  * issued either through an IO path or an IOCTL path. If it
2861                  * was via IOCTL, we will send it to internal completion.
2862                  */
2863                 if (cmd->sync_cmd) {
2864                         cmd->sync_cmd = 0;
2865                         megasas_complete_int_cmd(instance, cmd);
2866                         break;
2867                 }
2868
2869         case MFI_CMD_LD_READ:
2870         case MFI_CMD_LD_WRITE:
2871
2872                 if (alt_status) {
2873                         cmd->scmd->result = alt_status << 16;
2874                         exception = 1;
2875                 }
2876
2877                 if (exception) {
2878
2879                         atomic_dec(&instance->fw_outstanding);
2880
2881                         scsi_dma_unmap(cmd->scmd);
2882                         cmd->scmd->scsi_done(cmd->scmd);
2883                         megasas_return_cmd(instance, cmd);
2884
2885                         break;
2886                 }
2887
2888                 switch (hdr->cmd_status) {
2889
2890                 case MFI_STAT_OK:
2891                         cmd->scmd->result = DID_OK << 16;
2892                         break;
2893
2894                 case MFI_STAT_SCSI_IO_FAILED:
2895                 case MFI_STAT_LD_INIT_IN_PROGRESS:
2896                         cmd->scmd->result =
2897                             (DID_ERROR << 16) | hdr->scsi_status;
2898                         break;
2899
2900                 case MFI_STAT_SCSI_DONE_WITH_ERROR:
2901
2902                         cmd->scmd->result = (DID_OK << 16) | hdr->scsi_status;
2903
2904                         if (hdr->scsi_status == SAM_STAT_CHECK_CONDITION) {
2905                                 memset(cmd->scmd->sense_buffer, 0,
2906                                        SCSI_SENSE_BUFFERSIZE);
2907                                 memcpy(cmd->scmd->sense_buffer, cmd->sense,
2908                                        hdr->sense_len);
2909
2910                                 cmd->scmd->result |= DRIVER_SENSE << 24;
2911                         }
2912
2913                         break;
2914
2915                 case MFI_STAT_LD_OFFLINE:
2916                 case MFI_STAT_DEVICE_NOT_FOUND:
2917                         cmd->scmd->result = DID_BAD_TARGET << 16;
2918                         break;
2919
2920                 default:
2921                         printk(KERN_DEBUG "megasas: MFI FW status %#x\n",
2922                                hdr->cmd_status);
2923                         cmd->scmd->result = DID_ERROR << 16;
2924                         break;
2925                 }
2926
2927                 atomic_dec(&instance->fw_outstanding);
2928
2929                 scsi_dma_unmap(cmd->scmd);
2930                 cmd->scmd->scsi_done(cmd->scmd);
2931                 megasas_return_cmd(instance, cmd);
2932
2933                 break;
2934
2935         case MFI_CMD_SMP:
2936         case MFI_CMD_STP:
2937         case MFI_CMD_DCMD:
2938                 opcode = le32_to_cpu(cmd->frame->dcmd.opcode);
2939                 /* Check for LD map update */
2940                 if ((opcode == MR_DCMD_LD_MAP_GET_INFO)
2941                         && (cmd->frame->dcmd.mbox.b[1] == 1)) {
2942                         fusion->fast_path_io = 0;
2943                         spin_lock_irqsave(instance->host->host_lock, flags);
2944                         if (cmd->frame->hdr.cmd_status != 0) {
2945                                 if (cmd->frame->hdr.cmd_status !=
2946                                     MFI_STAT_NOT_FOUND)
2947                                         printk(KERN_WARNING "megasas: map sync"
2948                                                "failed, status = 0x%x.\n",
2949                                                cmd->frame->hdr.cmd_status);
2950                                 else {
2951                                         megasas_return_cmd(instance, cmd);
2952                                         spin_unlock_irqrestore(
2953                                                 instance->host->host_lock,
2954                                                 flags);
2955                                         break;
2956                                 }
2957                         } else
2958                                 instance->map_id++;
2959                         megasas_return_cmd(instance, cmd);
2960
2961                         /*
2962                          * Set fast path IO to ZERO.
2963                          * Validate Map will set proper value.
2964                          * Meanwhile all IOs will go as LD IO.
2965                          */
2966                         if (MR_ValidateMapInfo(instance))
2967                                 fusion->fast_path_io = 1;
2968                         else
2969                                 fusion->fast_path_io = 0;
2970                         megasas_sync_map_info(instance);
2971                         spin_unlock_irqrestore(instance->host->host_lock,
2972                                                flags);
2973                         break;
2974                 }
2975                 if (opcode == MR_DCMD_CTRL_EVENT_GET_INFO ||
2976                     opcode == MR_DCMD_CTRL_EVENT_GET) {
2977                         spin_lock_irqsave(&poll_aen_lock, flags);
2978                         megasas_poll_wait_aen = 0;
2979                         spin_unlock_irqrestore(&poll_aen_lock, flags);
2980                 }
2981
2982                 /*
2983                  * See if got an event notification
2984                  */
2985                 if (opcode == MR_DCMD_CTRL_EVENT_WAIT)
2986                         megasas_service_aen(instance, cmd);
2987                 else
2988                         megasas_complete_int_cmd(instance, cmd);
2989
2990                 break;
2991
2992         case MFI_CMD_ABORT:
2993                 /*
2994                  * Cmd issued to abort another cmd returned
2995                  */
2996                 megasas_complete_abort(instance, cmd);
2997                 break;
2998
2999         default:
3000                 printk("megasas: Unknown command completed! [0x%X]\n",
3001                        hdr->cmd);
3002                 break;
3003         }
3004 }
3005
3006 /**
3007  * megasas_issue_pending_cmds_again -   issue all pending cmds
3008  *                                      in FW again because of the fw reset
3009  * @instance:                           Adapter soft state
3010  */
3011 static inline void
3012 megasas_issue_pending_cmds_again(struct megasas_instance *instance)
3013 {
3014         struct megasas_cmd *cmd;
3015         struct list_head clist_local;
3016         union megasas_evt_class_locale class_locale;
3017         unsigned long flags;
3018         u32 seq_num;
3019
3020         INIT_LIST_HEAD(&clist_local);
3021         spin_lock_irqsave(&instance->hba_lock, flags);
3022         list_splice_init(&instance->internal_reset_pending_q, &clist_local);
3023         spin_unlock_irqrestore(&instance->hba_lock, flags);
3024
3025         while (!list_empty(&clist_local)) {
3026                 cmd     = list_entry((&clist_local)->next,
3027                                         struct megasas_cmd, list);
3028                 list_del_init(&cmd->list);
3029
3030                 if (cmd->sync_cmd || cmd->scmd) {
3031                         printk(KERN_NOTICE "megaraid_sas: command %p, %p:%d"
3032                                 "detected to be pending while HBA reset.\n",
3033                                         cmd, cmd->scmd, cmd->sync_cmd);
3034
3035                         cmd->retry_for_fw_reset++;
3036
3037                         if (cmd->retry_for_fw_reset == 3) {
3038                                 printk(KERN_NOTICE "megaraid_sas: cmd %p, %p:%d"
3039                                         "was tried multiple times during reset."
3040                                         "Shutting down the HBA\n",
3041                                         cmd, cmd->scmd, cmd->sync_cmd);
3042                                 instance->instancet->disable_intr(instance);
3043                                 atomic_set(&instance->fw_reset_no_pci_access, 1);
3044                                 megaraid_sas_kill_hba(instance);
3045                                 return;
3046                         }
3047                 }
3048
3049                 if (cmd->sync_cmd == 1) {
3050                         if (cmd->scmd) {
3051                                 printk(KERN_NOTICE "megaraid_sas: unexpected"
3052                                         "cmd attached to internal command!\n");
3053                         }
3054                         printk(KERN_NOTICE "megasas: %p synchronous cmd"
3055                                                 "on the internal reset queue,"
3056                                                 "issue it again.\n", cmd);
3057                         cmd->cmd_status_drv = MFI_STAT_INVALID_STATUS;
3058                         instance->instancet->fire_cmd(instance,
3059                                                         cmd->frame_phys_addr ,
3060                                                         0, instance->reg_set);
3061                 } else if (cmd->scmd) {
3062                         printk(KERN_NOTICE "megasas: %p scsi cmd [%02x]"
3063                         "detected on the internal queue, issue again.\n",
3064                         cmd, cmd->scmd->cmnd[0]);
3065
3066                         atomic_inc(&instance->fw_outstanding);
3067                         instance->instancet->fire_cmd(instance,
3068                                         cmd->frame_phys_addr,
3069                                         cmd->frame_count-1, instance->reg_set);
3070                 } else {
3071                         printk(KERN_NOTICE "megasas: %p unexpected cmd on the"
3072                                 "internal reset defer list while re-issue!!\n",
3073                                 cmd);
3074                 }
3075         }
3076
3077         if (instance->aen_cmd) {
3078                 printk(KERN_NOTICE "megaraid_sas: aen_cmd in def process\n");
3079                 megasas_return_cmd(instance, instance->aen_cmd);
3080
3081                 instance->aen_cmd       = NULL;
3082         }
3083
3084         /*
3085         * Initiate AEN (Asynchronous Event Notification)
3086         */
3087         seq_num = instance->last_seq_num;
3088         class_locale.members.reserved = 0;
3089         class_locale.members.locale = MR_EVT_LOCALE_ALL;
3090         class_locale.members.class = MR_EVT_CLASS_DEBUG;
3091
3092         megasas_register_aen(instance, seq_num, class_locale.word);
3093 }
3094
3095 /**
3096  * Move the internal reset pending commands to a deferred queue.
3097  *
3098  * We move the commands pending at internal reset time to a
3099  * pending queue. This queue would be flushed after successful
3100  * completion of the internal reset sequence. if the internal reset
3101  * did not complete in time, the kernel reset handler would flush
3102  * these commands.
3103  **/
3104 static void
3105 megasas_internal_reset_defer_cmds(struct megasas_instance *instance)
3106 {
3107         struct megasas_cmd *cmd;
3108         int i;
3109         u32 max_cmd = instance->max_fw_cmds;
3110         u32 defer_index;
3111         unsigned long flags;
3112
3113         defer_index     = 0;
3114         spin_lock_irqsave(&instance->mfi_pool_lock, flags);
3115         for (i = 0; i < max_cmd; i++) {
3116                 cmd = instance->cmd_list[i];
3117                 if (cmd->sync_cmd == 1 || cmd->scmd) {
3118                         printk(KERN_NOTICE "megasas: moving cmd[%d]:%p:%d:%p"
3119                                         "on the defer queue as internal\n",
3120                                 defer_index, cmd, cmd->sync_cmd, cmd->scmd);
3121
3122                         if (!list_empty(&cmd->list)) {
3123                                 printk(KERN_NOTICE "megaraid_sas: ERROR while"
3124                                         " moving this cmd:%p, %d %p, it was"
3125                                         "discovered on some list?\n",
3126                                         cmd, cmd->sync_cmd, cmd->scmd);
3127
3128                                 list_del_init(&cmd->list);
3129                         }
3130                         defer_index++;
3131                         list_add_tail(&cmd->list,
3132                                 &instance->internal_reset_pending_q);
3133                 }
3134         }
3135         spin_unlock_irqrestore(&instance->mfi_pool_lock, flags);
3136 }
3137
3138
3139 static void
3140 process_fw_state_change_wq(struct work_struct *work)
3141 {
3142         struct megasas_instance *instance =
3143                 container_of(work, struct megasas_instance, work_init);
3144         u32 wait;
3145         unsigned long flags;
3146
3147         if (instance->adprecovery != MEGASAS_ADPRESET_SM_INFAULT) {
3148                 printk(KERN_NOTICE "megaraid_sas: error, recovery st %x \n",
3149                                 instance->adprecovery);
3150                 return ;
3151         }
3152
3153         if (instance->adprecovery == MEGASAS_ADPRESET_SM_INFAULT) {
3154                 printk(KERN_NOTICE "megaraid_sas: FW detected to be in fault"
3155                                         "state, restarting it...\n");
3156
3157                 instance->instancet->disable_intr(instance);
3158                 atomic_set(&instance->fw_outstanding, 0);
3159
3160                 atomic_set(&instance->fw_reset_no_pci_access, 1);
3161                 instance->instancet->adp_reset(instance, instance->reg_set);
3162                 atomic_set(&instance->fw_reset_no_pci_access, 0 );
3163
3164                 printk(KERN_NOTICE "megaraid_sas: FW restarted successfully,"
3165                                         "initiating next stage...\n");
3166
3167                 printk(KERN_NOTICE "megaraid_sas: HBA recovery state machine,"
3168                                         "state 2 starting...\n");
3169
3170                 /*waitting for about 20 second before start the second init*/
3171                 for (wait = 0; wait < 30; wait++) {
3172                         msleep(1000);
3173                 }
3174
3175                 if (megasas_transition_to_ready(instance, 1)) {
3176                         printk(KERN_NOTICE "megaraid_sas:adapter not ready\n");
3177
3178                         atomic_set(&instance->fw_reset_no_pci_access, 1);
3179                         megaraid_sas_kill_hba(instance);
3180                         return ;
3181                 }
3182
3183                 if ((instance->pdev->device == PCI_DEVICE_ID_LSI_SAS1064R) ||
3184                         (instance->pdev->device == PCI_DEVICE_ID_DELL_PERC5) ||
3185                         (instance->pdev->device == PCI_DEVICE_ID_LSI_VERDE_ZCR)
3186                         ) {
3187                         *instance->consumer = *instance->producer;
3188                 } else {
3189                         *instance->consumer = 0;
3190                         *instance->producer = 0;
3191                 }
3192
3193                 megasas_issue_init_mfi(instance);
3194
3195                 spin_lock_irqsave(&instance->hba_lock, flags);
3196                 instance->adprecovery   = MEGASAS_HBA_OPERATIONAL;
3197                 spin_unlock_irqrestore(&instance->hba_lock, flags);
3198                 instance->instancet->enable_intr(instance);
3199
3200                 megasas_issue_pending_cmds_again(instance);
3201                 instance->issuepend_done = 1;
3202         }
3203         return ;
3204 }
3205
3206 /**
3207  * megasas_deplete_reply_queue -        Processes all completed commands
3208  * @instance:                           Adapter soft state
3209  * @alt_status:                         Alternate status to be returned to
3210  *                                      SCSI mid-layer instead of the status
3211  *                                      returned by the FW
3212  * Note: this must be called with hba lock held
3213  */
3214 static int
3215 megasas_deplete_reply_queue(struct megasas_instance *instance,
3216                                         u8 alt_status)
3217 {
3218         u32 mfiStatus;
3219         u32 fw_state;
3220
3221         if ((mfiStatus = instance->instancet->check_reset(instance,
3222                                         instance->reg_set)) == 1) {
3223                 return IRQ_HANDLED;
3224         }
3225
3226         if ((mfiStatus = instance->instancet->clear_intr(
3227                                                 instance->reg_set)
3228                                                 ) == 0) {
3229                 /* Hardware may not set outbound_intr_status in MSI-X mode */
3230                 if (!instance->msix_vectors)
3231                         return IRQ_NONE;
3232         }
3233
3234         instance->mfiStatus = mfiStatus;
3235
3236         if ((mfiStatus & MFI_INTR_FLAG_FIRMWARE_STATE_CHANGE)) {
3237                 fw_state = instance->instancet->read_fw_status_reg(
3238                                 instance->reg_set) & MFI_STATE_MASK;
3239
3240                 if (fw_state != MFI_STATE_FAULT) {
3241                         printk(KERN_NOTICE "megaraid_sas: fw state:%x\n",
3242                                                 fw_state);
3243                 }
3244
3245                 if ((fw_state == MFI_STATE_FAULT) &&
3246                                 (instance->disableOnlineCtrlReset == 0)) {
3247                         printk(KERN_NOTICE "megaraid_sas: wait adp restart\n");
3248
3249                         if ((instance->pdev->device ==
3250                                         PCI_DEVICE_ID_LSI_SAS1064R) ||
3251                                 (instance->pdev->device ==
3252                                         PCI_DEVICE_ID_DELL_PERC5) ||
3253                                 (instance->pdev->device ==
3254                                         PCI_DEVICE_ID_LSI_VERDE_ZCR)) {
3255
3256                                 *instance->consumer =
3257                                         cpu_to_le32(MEGASAS_ADPRESET_INPROG_SIGN);
3258                         }
3259
3260
3261                         instance->instancet->disable_intr(instance);
3262                         instance->adprecovery   = MEGASAS_ADPRESET_SM_INFAULT;
3263                         instance->issuepend_done = 0;
3264
3265                         atomic_set(&instance->fw_outstanding, 0);
3266                         megasas_internal_reset_defer_cmds(instance);
3267
3268                         printk(KERN_NOTICE "megasas: fwState=%x, stage:%d\n",
3269                                         fw_state, instance->adprecovery);
3270
3271                         schedule_work(&instance->work_init);
3272                         return IRQ_HANDLED;
3273
3274                 } else {
3275                         printk(KERN_NOTICE "megasas: fwstate:%x, dis_OCR=%x\n",
3276                                 fw_state, instance->disableOnlineCtrlReset);
3277                 }
3278         }
3279
3280         tasklet_schedule(&instance->isr_tasklet);
3281         return IRQ_HANDLED;
3282 }
3283 /**
3284  * megasas_isr - isr entry point
3285  */
3286 static irqreturn_t megasas_isr(int irq, void *devp)
3287 {
3288         struct megasas_irq_context *irq_context = devp;
3289         struct megasas_instance *instance = irq_context->instance;
3290         unsigned long flags;
3291         irqreturn_t     rc;
3292
3293         if (atomic_read(&instance->fw_reset_no_pci_access))
3294                 return IRQ_HANDLED;
3295
3296         spin_lock_irqsave(&instance->hba_lock, flags);
3297         rc =  megasas_deplete_reply_queue(instance, DID_OK);
3298         spin_unlock_irqrestore(&instance->hba_lock, flags);
3299
3300         return rc;
3301 }
3302
3303 /**
3304  * megasas_transition_to_ready -        Move the FW to READY state
3305  * @instance:                           Adapter soft state
3306  *
3307  * During the initialization, FW passes can potentially be in any one of
3308  * several possible states. If the FW in operational, waiting-for-handshake
3309  * states, driver must take steps to bring it to ready state. Otherwise, it
3310  * has to wait for the ready state.
3311  */
3312 int
3313 megasas_transition_to_ready(struct megasas_instance *instance, int ocr)
3314 {
3315         int i;
3316         u8 max_wait;
3317         u32 fw_state;
3318         u32 cur_state;
3319         u32 abs_state, curr_abs_state;
3320
3321         abs_state = instance->instancet->read_fw_status_reg(instance->reg_set);
3322         fw_state = abs_state & MFI_STATE_MASK;
3323
3324         if (fw_state != MFI_STATE_READY)
3325                 printk(KERN_INFO "megasas: Waiting for FW to come to ready"
3326                        " state\n");
3327
3328         while (fw_state != MFI_STATE_READY) {
3329
3330                 switch (fw_state) {
3331
3332                 case MFI_STATE_FAULT:
3333                         printk(KERN_DEBUG "megasas: FW in FAULT state!!\n");
3334                         if (ocr) {
3335                                 max_wait = MEGASAS_RESET_WAIT_TIME;
3336                                 cur_state = MFI_STATE_FAULT;
3337                                 break;
3338                         } else
3339                                 return -ENODEV;
3340
3341                 case MFI_STATE_WAIT_HANDSHAKE:
3342                         /*
3343                          * Set the CLR bit in inbound doorbell
3344                          */
3345                         if ((instance->pdev->device ==
3346                                 PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
3347                                 (instance->pdev->device ==
3348                                  PCI_DEVICE_ID_LSI_SAS0071SKINNY) ||
3349                                 (instance->pdev->device ==
3350                                 PCI_DEVICE_ID_LSI_FUSION) ||
3351                                 (instance->pdev->device ==
3352                                 PCI_DEVICE_ID_LSI_PLASMA) ||
3353                                 (instance->pdev->device ==
3354                                 PCI_DEVICE_ID_LSI_INVADER) ||
3355                                 (instance->pdev->device ==
3356                                 PCI_DEVICE_ID_LSI_FURY)) {
3357                                 writel(
3358                                   MFI_INIT_CLEAR_HANDSHAKE|MFI_INIT_HOTPLUG,
3359                                   &instance->reg_set->doorbell);
3360                         } else {
3361                                 writel(
3362                                     MFI_INIT_CLEAR_HANDSHAKE|MFI_INIT_HOTPLUG,
3363                                         &instance->reg_set->inbound_doorbell);
3364                         }
3365
3366                         max_wait = MEGASAS_RESET_WAIT_TIME;
3367                         cur_state = MFI_STATE_WAIT_HANDSHAKE;
3368                         break;
3369
3370                 case MFI_STATE_BOOT_MESSAGE_PENDING:
3371                         if ((instance->pdev->device ==
3372                              PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
3373                                 (instance->pdev->device ==
3374                                  PCI_DEVICE_ID_LSI_SAS0071SKINNY) ||
3375                             (instance->pdev->device ==
3376                              PCI_DEVICE_ID_LSI_FUSION) ||
3377                             (instance->pdev->device ==
3378                              PCI_DEVICE_ID_LSI_PLASMA) ||
3379                             (instance->pdev->device ==
3380                              PCI_DEVICE_ID_LSI_INVADER) ||
3381                             (instance->pdev->device ==
3382                              PCI_DEVICE_ID_LSI_FURY)) {
3383                                 writel(MFI_INIT_HOTPLUG,
3384                                        &instance->reg_set->doorbell);
3385                         } else
3386                                 writel(MFI_INIT_HOTPLUG,
3387                                         &instance->reg_set->inbound_doorbell);
3388
3389                         max_wait = MEGASAS_RESET_WAIT_TIME;
3390                         cur_state = MFI_STATE_BOOT_MESSAGE_PENDING;
3391                         break;
3392
3393                 case MFI_STATE_OPERATIONAL:
3394                         /*
3395                          * Bring it to READY state; assuming max wait 10 secs
3396                          */
3397                         instance->instancet->disable_intr(instance);
3398                         if ((instance->pdev->device ==
3399                                 PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
3400                                 (instance->pdev->device ==
3401                                 PCI_DEVICE_ID_LSI_SAS0071SKINNY)  ||
3402                                 (instance->pdev->device
3403                                         == PCI_DEVICE_ID_LSI_FUSION) ||
3404                                 (instance->pdev->device
3405                                         == PCI_DEVICE_ID_LSI_PLASMA) ||
3406                                 (instance->pdev->device
3407                                         == PCI_DEVICE_ID_LSI_INVADER) ||
3408                                 (instance->pdev->device
3409                                         == PCI_DEVICE_ID_LSI_FURY)) {
3410                                 writel(MFI_RESET_FLAGS,
3411                                         &instance->reg_set->doorbell);
3412                                 if ((instance->pdev->device ==
3413                                         PCI_DEVICE_ID_LSI_FUSION) ||
3414                                         (instance->pdev->device ==
3415                                         PCI_DEVICE_ID_LSI_PLASMA) ||
3416                                         (instance->pdev->device ==
3417                                         PCI_DEVICE_ID_LSI_INVADER) ||
3418                                         (instance->pdev->device ==
3419                                         PCI_DEVICE_ID_LSI_FURY)) {
3420                                         for (i = 0; i < (10 * 1000); i += 20) {
3421                                                 if (readl(
3422                                                             &instance->
3423                                                             reg_set->
3424                                                             doorbell) & 1)
3425                                                         msleep(20);
3426                                                 else
3427                                                         break;
3428                                         }
3429                                 }
3430                         } else
3431                                 writel(MFI_RESET_FLAGS,
3432                                         &instance->reg_set->inbound_doorbell);
3433
3434                         max_wait = MEGASAS_RESET_WAIT_TIME;
3435                         cur_state = MFI_STATE_OPERATIONAL;
3436                         break;
3437
3438                 case MFI_STATE_UNDEFINED:
3439                         /*
3440                          * This state should not last for more than 2 seconds
3441                          */
3442                         max_wait = MEGASAS_RESET_WAIT_TIME;
3443                         cur_state = MFI_STATE_UNDEFINED;
3444                         break;
3445
3446                 case MFI_STATE_BB_INIT:
3447                         max_wait = MEGASAS_RESET_WAIT_TIME;
3448                         cur_state = MFI_STATE_BB_INIT;
3449                         break;
3450
3451                 case MFI_STATE_FW_INIT:
3452                         max_wait = MEGASAS_RESET_WAIT_TIME;
3453                         cur_state = MFI_STATE_FW_INIT;
3454                         break;
3455
3456                 case MFI_STATE_FW_INIT_2:
3457                         max_wait = MEGASAS_RESET_WAIT_TIME;
3458                         cur_state = MFI_STATE_FW_INIT_2;
3459                         break;
3460
3461                 case MFI_STATE_DEVICE_SCAN:
3462                         max_wait = MEGASAS_RESET_WAIT_TIME;
3463                         cur_state = MFI_STATE_DEVICE_SCAN;
3464                         break;
3465
3466                 case MFI_STATE_FLUSH_CACHE:
3467                         max_wait = MEGASAS_RESET_WAIT_TIME;
3468                         cur_state = MFI_STATE_FLUSH_CACHE;
3469                         break;
3470
3471                 default:
3472                         printk(KERN_DEBUG "megasas: Unknown state 0x%x\n",
3473                                fw_state);
3474                         return -ENODEV;
3475                 }
3476
3477                 /*
3478                  * The cur_state should not last for more than max_wait secs
3479                  */
3480                 for (i = 0; i < (max_wait * 1000); i++) {
3481                         curr_abs_state = instance->instancet->
3482                                 read_fw_status_reg(instance->reg_set);
3483
3484                         if (abs_state == curr_abs_state) {
3485                                 msleep(1);
3486                         } else
3487                                 break;
3488                 }
3489
3490                 /*
3491                  * Return error if fw_state hasn't changed after max_wait
3492                  */
3493                 if (curr_abs_state == abs_state) {
3494                         printk(KERN_DEBUG "FW state [%d] hasn't changed "
3495                                "in %d secs\n", fw_state, max_wait);
3496                         return -ENODEV;
3497                 }
3498
3499                 abs_state = curr_abs_state;
3500                 fw_state = curr_abs_state & MFI_STATE_MASK;
3501         }
3502         printk(KERN_INFO "megasas: FW now in Ready state\n");
3503
3504         return 0;
3505 }
3506
3507 /**
3508  * megasas_teardown_frame_pool -        Destroy the cmd frame DMA pool
3509  * @instance:                           Adapter soft state
3510  */
3511 static void megasas_teardown_frame_pool(struct megasas_instance *instance)
3512 {
3513         int i;
3514         u32 max_cmd = instance->max_mfi_cmds;
3515         struct megasas_cmd *cmd;
3516
3517         if (!instance->frame_dma_pool)
3518                 return;
3519
3520         /*
3521          * Return all frames to pool
3522          */
3523         for (i = 0; i < max_cmd; i++) {
3524
3525                 cmd = instance->cmd_list[i];
3526
3527                 if (cmd->frame)
3528                         pci_pool_free(instance->frame_dma_pool, cmd->frame,
3529                                       cmd->frame_phys_addr);
3530
3531                 if (cmd->sense)
3532                         pci_pool_free(instance->sense_dma_pool, cmd->sense,
3533                                       cmd->sense_phys_addr);
3534         }
3535
3536         /*
3537          * Now destroy the pool itself
3538          */
3539         pci_pool_destroy(instance->frame_dma_pool);
3540         pci_pool_destroy(instance->sense_dma_pool);
3541
3542         instance->frame_dma_pool = NULL;
3543         instance->sense_dma_pool = NULL;
3544 }
3545
3546 /**
3547  * megasas_create_frame_pool -  Creates DMA pool for cmd frames
3548  * @instance:                   Adapter soft state
3549  *
3550  * Each command packet has an embedded DMA memory buffer that is used for
3551  * filling MFI frame and the SG list that immediately follows the frame. This
3552  * function creates those DMA memory buffers for each command packet by using
3553  * PCI pool facility.
3554  */
3555 static int megasas_create_frame_pool(struct megasas_instance *instance)
3556 {
3557         int i;
3558         u32 max_cmd;
3559         u32 sge_sz;
3560         u32 total_sz;
3561         u32 frame_count;
3562         struct megasas_cmd *cmd;
3563
3564         max_cmd = instance->max_mfi_cmds;
3565
3566         /*
3567          * Size of our frame is 64 bytes for MFI frame, followed by max SG
3568          * elements and finally SCSI_SENSE_BUFFERSIZE bytes for sense buffer
3569          */
3570         sge_sz = (IS_DMA64) ? sizeof(struct megasas_sge64) :
3571             sizeof(struct megasas_sge32);
3572
3573         if (instance->flag_ieee) {
3574                 sge_sz = sizeof(struct megasas_sge_skinny);
3575         }
3576
3577         /*
3578          * For MFI controllers.
3579          * max_num_sge = 60
3580          * max_sge_sz  = 16 byte (sizeof megasas_sge_skinny)
3581          * Total 960 byte (15 MFI frame of 64 byte)
3582          *
3583          * Fusion adapter require only 3 extra frame.
3584          * max_num_sge = 16 (defined as MAX_IOCTL_SGE)
3585          * max_sge_sz  = 12 byte (sizeof  megasas_sge64)
3586          * Total 192 byte (3 MFI frame of 64 byte)
3587          */
3588         frame_count = instance->ctrl_context ? (3 + 1) : (15 + 1);
3589         total_sz = MEGAMFI_FRAME_SIZE * frame_count;
3590         /*
3591          * Use DMA pool facility provided by PCI layer
3592          */
3593         instance->frame_dma_pool = pci_pool_create("megasas frame pool",
3594                                         instance->pdev, total_sz, 256, 0);
3595
3596         if (!instance->frame_dma_pool) {
3597                 printk(KERN_DEBUG "megasas: failed to setup frame pool\n");
3598                 return -ENOMEM;
3599         }
3600
3601         instance->sense_dma_pool = pci_pool_create("megasas sense pool",
3602                                                    instance->pdev, 128, 4, 0);
3603
3604         if (!instance->sense_dma_pool) {
3605                 printk(KERN_DEBUG "megasas: failed to setup sense pool\n");
3606
3607                 pci_pool_destroy(instance->frame_dma_pool);
3608                 instance->frame_dma_pool = NULL;
3609
3610                 return -ENOMEM;
3611         }
3612
3613         /*
3614          * Allocate and attach a frame to each of the commands in cmd_list.
3615          * By making cmd->index as the context instead of the &cmd, we can
3616          * always use 32bit context regardless of the architecture
3617          */
3618         for (i = 0; i < max_cmd; i++) {
3619
3620                 cmd = instance->cmd_list[i];
3621
3622                 cmd->frame = pci_pool_alloc(instance->frame_dma_pool,
3623                                             GFP_KERNEL, &cmd->frame_phys_addr);
3624
3625                 cmd->sense = pci_pool_alloc(instance->sense_dma_pool,
3626                                             GFP_KERNEL, &cmd->sense_phys_addr);
3627
3628                 /*
3629                  * megasas_teardown_frame_pool() takes care of freeing
3630                  * whatever has been allocated
3631                  */
3632                 if (!cmd->frame || !cmd->sense) {
3633                         printk(KERN_DEBUG "megasas: pci_pool_alloc failed \n");
3634                         megasas_teardown_frame_pool(instance);
3635                         return -ENOMEM;
3636                 }
3637
3638                 memset(cmd->frame, 0, total_sz);
3639                 cmd->frame->io.context = cpu_to_le32(cmd->index);
3640                 cmd->frame->io.pad_0 = 0;
3641                 if ((instance->pdev->device != PCI_DEVICE_ID_LSI_FUSION) &&
3642                     (instance->pdev->device != PCI_DEVICE_ID_LSI_PLASMA) &&
3643                     (instance->pdev->device != PCI_DEVICE_ID_LSI_INVADER) &&
3644                         (instance->pdev->device != PCI_DEVICE_ID_LSI_FURY) &&
3645                     (reset_devices))
3646                         cmd->frame->hdr.cmd = MFI_CMD_INVALID;
3647         }
3648
3649         return 0;
3650 }
3651
3652 /**
3653  * megasas_free_cmds -  Free all the cmds in the free cmd pool
3654  * @instance:           Adapter soft state
3655  */
3656 void megasas_free_cmds(struct megasas_instance *instance)
3657 {
3658         int i;
3659         /* First free the MFI frame pool */
3660         megasas_teardown_frame_pool(instance);
3661
3662         /* Free all the commands in the cmd_list */
3663         for (i = 0; i < instance->max_mfi_cmds; i++)
3664
3665                 kfree(instance->cmd_list[i]);
3666
3667         /* Free the cmd_list buffer itself */
3668         kfree(instance->cmd_list);
3669         instance->cmd_list = NULL;
3670
3671         INIT_LIST_HEAD(&instance->cmd_pool);
3672 }
3673
3674 /**
3675  * megasas_alloc_cmds - Allocates the command packets
3676  * @instance:           Adapter soft state
3677  *
3678  * Each command that is issued to the FW, whether IO commands from the OS or
3679  * internal commands like IOCTLs, are wrapped in local data structure called
3680  * megasas_cmd. The frame embedded in this megasas_cmd is actually issued to
3681  * the FW.
3682  *
3683  * Each frame has a 32-bit field called context (tag). This context is used
3684  * to get back the megasas_cmd from the frame when a frame gets completed in
3685  * the ISR. Typically the address of the megasas_cmd itself would be used as
3686  * the context. But we wanted to keep the differences between 32 and 64 bit
3687  * systems to the mininum. We always use 32 bit integers for the context. In
3688  * this driver, the 32 bit values are the indices into an array cmd_list.
3689  * This array is used only to look up the megasas_cmd given the context. The
3690  * free commands themselves are maintained in a linked list called cmd_pool.
3691  */
3692 int megasas_alloc_cmds(struct megasas_instance *instance)
3693 {
3694         int i;
3695         int j;
3696         u32 max_cmd;
3697         struct megasas_cmd *cmd;
3698         struct fusion_context *fusion;
3699
3700         fusion = instance->ctrl_context;
3701         max_cmd = instance->max_mfi_cmds;
3702
3703         /*
3704          * instance->cmd_list is an array of struct megasas_cmd pointers.
3705          * Allocate the dynamic array first and then allocate individual
3706          * commands.
3707          */
3708         instance->cmd_list = kcalloc(max_cmd, sizeof(struct megasas_cmd*), GFP_KERNEL);
3709
3710         if (!instance->cmd_list) {
3711                 printk(KERN_DEBUG "megasas: out of memory\n");
3712                 return -ENOMEM;
3713         }
3714
3715         memset(instance->cmd_list, 0, sizeof(struct megasas_cmd *) *max_cmd);
3716
3717         for (i = 0; i < max_cmd; i++) {
3718                 instance->cmd_list[i] = kmalloc(sizeof(struct megasas_cmd),
3719                                                 GFP_KERNEL);
3720
3721                 if (!instance->cmd_list[i]) {
3722
3723                         for (j = 0; j < i; j++)
3724                                 kfree(instance->cmd_list[j]);
3725
3726                         kfree(instance->cmd_list);
3727                         instance->cmd_list = NULL;
3728
3729                         return -ENOMEM;
3730                 }
3731         }
3732
3733         for (i = 0; i < max_cmd; i++) {
3734                 cmd = instance->cmd_list[i];
3735                 memset(cmd, 0, sizeof(struct megasas_cmd));
3736                 cmd->index = i;
3737                 cmd->scmd = NULL;
3738                 cmd->instance = instance;
3739
3740                 list_add_tail(&cmd->list, &instance->cmd_pool);
3741         }
3742
3743         /*
3744          * Create a frame pool and assign one frame to each cmd
3745          */
3746         if (megasas_create_frame_pool(instance)) {
3747                 printk(KERN_DEBUG "megasas: Error creating frame DMA pool\n");
3748                 megasas_free_cmds(instance);
3749         }
3750
3751         return 0;
3752 }
3753
3754 /*
3755  * megasas_get_pd_list_info -   Returns FW's pd_list structure
3756  * @instance:                           Adapter soft state
3757  * @pd_list:                            pd_list structure
3758  *
3759  * Issues an internal command (DCMD) to get the FW's controller PD
3760  * list structure.  This information is mainly used to find out SYSTEM
3761  * supported by the FW.
3762  */
3763 static int
3764 megasas_get_pd_list(struct megasas_instance *instance)
3765 {
3766         int ret = 0, pd_index = 0;
3767         struct megasas_cmd *cmd;
3768         struct megasas_dcmd_frame *dcmd;
3769         struct MR_PD_LIST *ci;
3770         struct MR_PD_ADDRESS *pd_addr;
3771         dma_addr_t ci_h = 0;
3772
3773         cmd = megasas_get_cmd(instance);
3774
3775         if (!cmd) {
3776                 printk(KERN_DEBUG "megasas (get_pd_list): Failed to get cmd\n");
3777                 return -ENOMEM;
3778         }
3779
3780         dcmd = &cmd->frame->dcmd;
3781
3782         ci = pci_alloc_consistent(instance->pdev,
3783                   MEGASAS_MAX_PD * sizeof(struct MR_PD_LIST), &ci_h);
3784
3785         if (!ci) {
3786                 printk(KERN_DEBUG "Failed to alloc mem for pd_list\n");
3787                 megasas_return_cmd(instance, cmd);
3788                 return -ENOMEM;
3789         }
3790
3791         memset(ci, 0, sizeof(*ci));
3792         memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
3793
3794         dcmd->mbox.b[0] = MR_PD_QUERY_TYPE_EXPOSED_TO_HOST;
3795         dcmd->mbox.b[1] = 0;
3796         dcmd->cmd = MFI_CMD_DCMD;
3797         dcmd->cmd_status = MFI_STAT_INVALID_STATUS;
3798         dcmd->sge_count = 1;
3799         dcmd->flags = cpu_to_le16(MFI_FRAME_DIR_READ);
3800         dcmd->timeout = 0;
3801         dcmd->pad_0 = 0;
3802         dcmd->data_xfer_len = cpu_to_le32(MEGASAS_MAX_PD * sizeof(struct MR_PD_LIST));
3803         dcmd->opcode = cpu_to_le32(MR_DCMD_PD_LIST_QUERY);
3804         dcmd->sgl.sge32[0].phys_addr = cpu_to_le32(ci_h);
3805         dcmd->sgl.sge32[0].length = cpu_to_le32(MEGASAS_MAX_PD * sizeof(struct MR_PD_LIST));
3806
3807         if (instance->ctrl_context && !instance->mask_interrupts)
3808                 ret = megasas_issue_blocked_cmd(instance, cmd,
3809                         MEGASAS_BLOCKED_CMD_TIMEOUT);
3810         else
3811                 ret = megasas_issue_polled(instance, cmd);
3812
3813         /*
3814         * the following function will get the instance PD LIST.
3815         */
3816
3817         pd_addr = ci->addr;
3818
3819         if ( ret == 0 &&
3820              (le32_to_cpu(ci->count) <
3821                   (MEGASAS_MAX_PD_CHANNELS * MEGASAS_MAX_DEV_PER_CHANNEL))) {
3822
3823                 memset(instance->local_pd_list, 0,
3824                         MEGASAS_MAX_PD * sizeof(struct megasas_pd_list));
3825
3826                 for (pd_index = 0; pd_index < le32_to_cpu(ci->count); pd_index++) {
3827
3828                         instance->local_pd_list[le16_to_cpu(pd_addr->deviceId)].tid     =
3829                                 le16_to_cpu(pd_addr->deviceId);
3830                         instance->local_pd_list[le16_to_cpu(pd_addr->deviceId)].driveType       =
3831                                                         pd_addr->scsiDevType;
3832                         instance->local_pd_list[le16_to_cpu(pd_addr->deviceId)].driveState      =
3833                                                         MR_PD_STATE_SYSTEM;
3834                         pd_addr++;
3835                 }
3836                 memcpy(instance->pd_list, instance->local_pd_list,
3837                         sizeof(instance->pd_list));
3838         }
3839
3840         pci_free_consistent(instance->pdev,
3841                                 MEGASAS_MAX_PD * sizeof(struct MR_PD_LIST),
3842                                 ci, ci_h);
3843
3844         megasas_return_cmd(instance, cmd);
3845
3846         return ret;
3847 }
3848
3849 /*
3850  * megasas_get_ld_list_info -   Returns FW's ld_list structure
3851  * @instance:                           Adapter soft state
3852  * @ld_list:                            ld_list structure
3853  *
3854  * Issues an internal command (DCMD) to get the FW's controller PD
3855  * list structure.  This information is mainly used to find out SYSTEM
3856  * supported by the FW.
3857  */
3858 static int
3859 megasas_get_ld_list(struct megasas_instance *instance)
3860 {
3861         int ret = 0, ld_index = 0, ids = 0;
3862         struct megasas_cmd *cmd;
3863         struct megasas_dcmd_frame *dcmd;
3864         struct MR_LD_LIST *ci;
3865         dma_addr_t ci_h = 0;
3866         u32 ld_count;
3867
3868         cmd = megasas_get_cmd(instance);
3869
3870         if (!cmd) {
3871                 printk(KERN_DEBUG "megasas_get_ld_list: Failed to get cmd\n");
3872                 return -ENOMEM;
3873         }
3874
3875         dcmd = &cmd->frame->dcmd;
3876
3877         ci = pci_alloc_consistent(instance->pdev,
3878                                 sizeof(struct MR_LD_LIST),
3879                                 &ci_h);
3880
3881         if (!ci) {
3882                 printk(KERN_DEBUG "Failed to alloc mem in get_ld_list\n");
3883                 megasas_return_cmd(instance, cmd);
3884                 return -ENOMEM;
3885         }
3886
3887         memset(ci, 0, sizeof(*ci));
3888         memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
3889
3890         if (instance->supportmax256vd)
3891                 dcmd->mbox.b[0] = 1;
3892         dcmd->cmd = MFI_CMD_DCMD;
3893         dcmd->cmd_status = MFI_STAT_INVALID_STATUS;
3894         dcmd->sge_count = 1;
3895         dcmd->flags = cpu_to_le16(MFI_FRAME_DIR_READ);
3896         dcmd->timeout = 0;
3897         dcmd->data_xfer_len = cpu_to_le32(sizeof(struct MR_LD_LIST));
3898         dcmd->opcode = cpu_to_le32(MR_DCMD_LD_GET_LIST);
3899         dcmd->sgl.sge32[0].phys_addr = cpu_to_le32(ci_h);
3900         dcmd->sgl.sge32[0].length = cpu_to_le32(sizeof(struct MR_LD_LIST));
3901         dcmd->pad_0  = 0;
3902
3903         if (instance->ctrl_context && !instance->mask_interrupts)
3904                 ret = megasas_issue_blocked_cmd(instance, cmd,
3905                         MEGASAS_BLOCKED_CMD_TIMEOUT);
3906         else
3907                 ret = megasas_issue_polled(instance, cmd);
3908
3909
3910         ld_count = le32_to_cpu(ci->ldCount);
3911
3912         /* the following function will get the instance PD LIST */
3913
3914         if ((ret == 0) && (ld_count <= instance->fw_supported_vd_count)) {
3915                 memset(instance->ld_ids, 0xff, MAX_LOGICAL_DRIVES_EXT);
3916
3917                 for (ld_index = 0; ld_index < ld_count; ld_index++) {
3918                         if (ci->ldList[ld_index].state != 0) {
3919                                 ids = ci->ldList[ld_index].ref.targetId;
3920                                 instance->ld_ids[ids] =
3921                                         ci->ldList[ld_index].ref.targetId;
3922                         }
3923                 }
3924         }
3925
3926         pci_free_consistent(instance->pdev,
3927                                 sizeof(struct MR_LD_LIST),
3928                                 ci,
3929                                 ci_h);
3930
3931         megasas_return_cmd(instance, cmd);
3932         return ret;
3933 }
3934
3935 /**
3936  * megasas_ld_list_query -      Returns FW's ld_list structure
3937  * @instance:                           Adapter soft state
3938  * @ld_list:                            ld_list structure
3939  *
3940  * Issues an internal command (DCMD) to get the FW's controller PD
3941  * list structure.  This information is mainly used to find out SYSTEM
3942  * supported by the FW.
3943  */
3944 static int
3945 megasas_ld_list_query(struct megasas_instance *instance, u8 query_type)
3946 {
3947         int ret = 0, ld_index = 0, ids = 0;
3948         struct megasas_cmd *cmd;
3949         struct megasas_dcmd_frame *dcmd;
3950         struct MR_LD_TARGETID_LIST *ci;
3951         dma_addr_t ci_h = 0;
3952         u32 tgtid_count;
3953
3954         cmd = megasas_get_cmd(instance);
3955
3956         if (!cmd) {
3957                 printk(KERN_WARNING
3958                        "megasas:(megasas_ld_list_query): Failed to get cmd\n");
3959                 return -ENOMEM;
3960         }
3961
3962         dcmd = &cmd->frame->dcmd;
3963
3964         ci = pci_alloc_consistent(instance->pdev,
3965                                   sizeof(struct MR_LD_TARGETID_LIST), &ci_h);
3966
3967         if (!ci) {
3968                 printk(KERN_WARNING
3969                        "megasas: Failed to alloc mem for ld_list_query\n");
3970                 megasas_return_cmd(instance, cmd);
3971                 return -ENOMEM;
3972         }
3973
3974         memset(ci, 0, sizeof(*ci));
3975         memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
3976
3977         dcmd->mbox.b[0] = query_type;
3978         if (instance->supportmax256vd)
3979                 dcmd->mbox.b[2] = 1;
3980
3981         dcmd->cmd = MFI_CMD_DCMD;
3982         dcmd->cmd_status = MFI_STAT_INVALID_STATUS;
3983         dcmd->sge_count = 1;
3984         dcmd->flags = cpu_to_le16(MFI_FRAME_DIR_READ);
3985         dcmd->timeout = 0;
3986         dcmd->data_xfer_len = cpu_to_le32(sizeof(struct MR_LD_TARGETID_LIST));
3987         dcmd->opcode = cpu_to_le32(MR_DCMD_LD_LIST_QUERY);
3988         dcmd->sgl.sge32[0].phys_addr = cpu_to_le32(ci_h);
3989         dcmd->sgl.sge32[0].length = cpu_to_le32(sizeof(struct MR_LD_TARGETID_LIST));
3990         dcmd->pad_0  = 0;
3991
3992         if (instance->ctrl_context && !instance->mask_interrupts)
3993                 ret = megasas_issue_blocked_cmd(instance, cmd,
3994                         MEGASAS_BLOCKED_CMD_TIMEOUT);
3995         else
3996                 ret = megasas_issue_polled(instance, cmd);
3997
3998         tgtid_count = le32_to_cpu(ci->count);
3999
4000         if ((ret == 0) && (tgtid_count <= (instance->fw_supported_vd_count))) {
4001                 memset(instance->ld_ids, 0xff, MEGASAS_MAX_LD_IDS);
4002                 for (ld_index = 0; ld_index < tgtid_count; ld_index++) {
4003                         ids = ci->targetId[ld_index];
4004                         instance->ld_ids[ids] = ci->targetId[ld_index];
4005                 }
4006
4007         }
4008
4009         pci_free_consistent(instance->pdev, sizeof(struct MR_LD_TARGETID_LIST),
4010                             ci, ci_h);
4011
4012         megasas_return_cmd(instance, cmd);
4013
4014         return ret;
4015 }
4016
4017 /*
4018  * megasas_update_ext_vd_details : Update details w.r.t Extended VD
4019  * instance                      : Controller's instance
4020 */
4021 static void megasas_update_ext_vd_details(struct megasas_instance *instance)
4022 {
4023         struct fusion_context *fusion;
4024         u32 old_map_sz;
4025         u32 new_map_sz;
4026
4027         fusion = instance->ctrl_context;
4028         /* For MFI based controllers return dummy success */
4029         if (!fusion)
4030                 return;
4031
4032         instance->supportmax256vd =
4033                 instance->ctrl_info->adapterOperations3.supportMaxExtLDs;
4034         /* Below is additional check to address future FW enhancement */
4035         if (instance->ctrl_info->max_lds > 64)
4036                 instance->supportmax256vd = 1;
4037
4038         instance->drv_supported_vd_count = MEGASAS_MAX_LD_CHANNELS
4039                                         * MEGASAS_MAX_DEV_PER_CHANNEL;
4040         instance->drv_supported_pd_count = MEGASAS_MAX_PD_CHANNELS
4041                                         * MEGASAS_MAX_DEV_PER_CHANNEL;
4042         if (instance->supportmax256vd) {
4043                 instance->fw_supported_vd_count = MAX_LOGICAL_DRIVES_EXT;
4044                 instance->fw_supported_pd_count = MAX_PHYSICAL_DEVICES;
4045         } else {
4046                 instance->fw_supported_vd_count = MAX_LOGICAL_DRIVES;
4047                 instance->fw_supported_pd_count = MAX_PHYSICAL_DEVICES;
4048         }
4049
4050         dev_info(&instance->pdev->dev,
4051                 "firmware type\t: %s\n",
4052                 instance->supportmax256vd ? "Extended VD(240 VD)firmware" :
4053                 "Legacy(64 VD) firmware");
4054
4055         old_map_sz =  sizeof(struct MR_FW_RAID_MAP) +
4056                                 (sizeof(struct MR_LD_SPAN_MAP) *
4057                                 (instance->fw_supported_vd_count - 1));
4058         new_map_sz =  sizeof(struct MR_FW_RAID_MAP_EXT);
4059         fusion->drv_map_sz =  sizeof(struct MR_DRV_RAID_MAP) +
4060                                 (sizeof(struct MR_LD_SPAN_MAP) *
4061                                 (instance->drv_supported_vd_count - 1));
4062
4063         fusion->max_map_sz = max(old_map_sz, new_map_sz);
4064
4065
4066         if (instance->supportmax256vd)
4067                 fusion->current_map_sz = new_map_sz;
4068         else
4069                 fusion->current_map_sz = old_map_sz;
4070
4071 }
4072
4073 /**
4074  * megasas_get_controller_info -        Returns FW's controller structure
4075  * @instance:                           Adapter soft state
4076  *
4077  * Issues an internal command (DCMD) to get the FW's controller structure.
4078  * This information is mainly used to find out the maximum IO transfer per
4079  * command supported by the FW.
4080  */
4081 int
4082 megasas_get_ctrl_info(struct megasas_instance *instance)
4083 {
4084         int ret = 0;
4085         struct megasas_cmd *cmd;
4086         struct megasas_dcmd_frame *dcmd;
4087         struct megasas_ctrl_info *ci;
4088         struct megasas_ctrl_info *ctrl_info;
4089         dma_addr_t ci_h = 0;
4090
4091         ctrl_info = instance->ctrl_info;
4092
4093         cmd = megasas_get_cmd(instance);
4094
4095         if (!cmd) {
4096                 printk(KERN_DEBUG "megasas: Failed to get a free cmd\n");
4097                 return -ENOMEM;
4098         }
4099
4100         dcmd = &cmd->frame->dcmd;
4101
4102         ci = pci_alloc_consistent(instance->pdev,
4103                                   sizeof(struct megasas_ctrl_info), &ci_h);
4104
4105         if (!ci) {
4106                 printk(KERN_DEBUG "Failed to alloc mem for ctrl info\n");
4107                 megasas_return_cmd(instance, cmd);
4108                 return -ENOMEM;
4109         }
4110
4111         memset(ci, 0, sizeof(*ci));
4112         memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
4113
4114         dcmd->cmd = MFI_CMD_DCMD;
4115         dcmd->cmd_status = MFI_STAT_INVALID_STATUS;
4116         dcmd->sge_count = 1;
4117         dcmd->flags = cpu_to_le16(MFI_FRAME_DIR_READ);
4118         dcmd->timeout = 0;
4119         dcmd->pad_0 = 0;
4120         dcmd->data_xfer_len = cpu_to_le32(sizeof(struct megasas_ctrl_info));
4121         dcmd->opcode = cpu_to_le32(MR_DCMD_CTRL_GET_INFO);
4122         dcmd->sgl.sge32[0].phys_addr = cpu_to_le32(ci_h);
4123         dcmd->sgl.sge32[0].length = cpu_to_le32(sizeof(struct megasas_ctrl_info));
4124         dcmd->mbox.b[0] = 1;
4125
4126         if (instance->ctrl_context && !instance->mask_interrupts)
4127                 ret = megasas_issue_blocked_cmd(instance, cmd,
4128                         MEGASAS_BLOCKED_CMD_TIMEOUT);
4129         else
4130                 ret = megasas_issue_polled(instance, cmd);
4131
4132         if (!ret) {
4133                 memcpy(ctrl_info, ci, sizeof(struct megasas_ctrl_info));
4134                 le32_to_cpus((u32 *)&ctrl_info->properties.OnOffProperties);
4135                 le32_to_cpus((u32 *)&ctrl_info->adapterOperations2);
4136                 le32_to_cpus((u32 *)&ctrl_info->adapterOperations3);
4137                 megasas_update_ext_vd_details(instance);
4138                 instance->is_imr = (ctrl_info->memory_size ? 0 : 1);
4139                 dev_info(&instance->pdev->dev,
4140                                 "controller type\t: %s(%dMB)\n",
4141                                 instance->is_imr ? "iMR" : "MR",
4142                                 le16_to_cpu(ctrl_info->memory_size));
4143         }
4144
4145         pci_free_consistent(instance->pdev, sizeof(struct megasas_ctrl_info),
4146                             ci, ci_h);
4147
4148         megasas_return_cmd(instance, cmd);
4149         return ret;
4150 }
4151
4152 /*
4153  * megasas_set_crash_dump_params -      Sends address of crash dump DMA buffer
4154  *                                      to firmware
4155  *
4156  * @instance:                           Adapter soft state
4157  * @crash_buf_state             -       tell FW to turn ON/OFF crash dump feature
4158                                         MR_CRASH_BUF_TURN_OFF = 0
4159                                         MR_CRASH_BUF_TURN_ON = 1
4160  * @return 0 on success non-zero on failure.
4161  * Issues an internal command (DCMD) to set parameters for crash dump feature.
4162  * Driver will send address of crash dump DMA buffer and set mbox to tell FW
4163  * that driver supports crash dump feature. This DCMD will be sent only if
4164  * crash dump feature is supported by the FW.
4165  *
4166  */
4167 int megasas_set_crash_dump_params(struct megasas_instance *instance,
4168         u8 crash_buf_state)
4169 {
4170         int ret = 0;
4171         struct megasas_cmd *cmd;
4172         struct megasas_dcmd_frame *dcmd;
4173
4174         cmd = megasas_get_cmd(instance);
4175
4176         if (!cmd) {
4177                 dev_err(&instance->pdev->dev, "Failed to get a free cmd\n");
4178                 return -ENOMEM;
4179         }
4180
4181
4182         dcmd = &cmd->frame->dcmd;
4183
4184         memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
4185         dcmd->mbox.b[0] = crash_buf_state;
4186         dcmd->cmd = MFI_CMD_DCMD;
4187         dcmd->cmd_status = MFI_STAT_INVALID_STATUS;
4188         dcmd->sge_count = 1;
4189         dcmd->flags = cpu_to_le16(MFI_FRAME_DIR_NONE);
4190         dcmd->timeout = 0;
4191         dcmd->pad_0 = 0;
4192         dcmd->data_xfer_len = cpu_to_le32(CRASH_DMA_BUF_SIZE);
4193         dcmd->opcode = cpu_to_le32(MR_DCMD_CTRL_SET_CRASH_DUMP_PARAMS);
4194         dcmd->sgl.sge32[0].phys_addr = cpu_to_le32(instance->crash_dump_h);
4195         dcmd->sgl.sge32[0].length = cpu_to_le32(CRASH_DMA_BUF_SIZE);
4196
4197         if (instance->ctrl_context && !instance->mask_interrupts)
4198                 ret = megasas_issue_blocked_cmd(instance, cmd,
4199                         MEGASAS_BLOCKED_CMD_TIMEOUT);
4200         else
4201                 ret = megasas_issue_polled(instance, cmd);
4202
4203         megasas_return_cmd(instance, cmd);
4204         return ret;
4205 }
4206
4207 /**
4208  * megasas_issue_init_mfi -     Initializes the FW
4209  * @instance:           Adapter soft state
4210  *
4211  * Issues the INIT MFI cmd
4212  */
4213 static int
4214 megasas_issue_init_mfi(struct megasas_instance *instance)
4215 {
4216         __le32 context;
4217
4218         struct megasas_cmd *cmd;
4219
4220         struct megasas_init_frame *init_frame;
4221         struct megasas_init_queue_info *initq_info;
4222         dma_addr_t init_frame_h;
4223         dma_addr_t initq_info_h;
4224
4225         /*
4226          * Prepare a init frame. Note the init frame points to queue info
4227          * structure. Each frame has SGL allocated after first 64 bytes. For
4228          * this frame - since we don't need any SGL - we use SGL's space as
4229          * queue info structure
4230          *
4231          * We will not get a NULL command below. We just created the pool.
4232          */
4233         cmd = megasas_get_cmd(instance);
4234
4235         init_frame = (struct megasas_init_frame *)cmd->frame;
4236         initq_info = (struct megasas_init_queue_info *)
4237                 ((unsigned long)init_frame + 64);
4238
4239         init_frame_h = cmd->frame_phys_addr;
4240         initq_info_h = init_frame_h + 64;
4241
4242         context = init_frame->context;
4243         memset(init_frame, 0, MEGAMFI_FRAME_SIZE);
4244         memset(initq_info, 0, sizeof(struct megasas_init_queue_info));
4245         init_frame->context = context;
4246
4247         initq_info->reply_queue_entries = cpu_to_le32(instance->max_fw_cmds + 1);
4248         initq_info->reply_queue_start_phys_addr_lo = cpu_to_le32(instance->reply_queue_h);
4249
4250         initq_info->producer_index_phys_addr_lo = cpu_to_le32(instance->producer_h);
4251         initq_info->consumer_index_phys_addr_lo = cpu_to_le32(instance->consumer_h);
4252
4253         init_frame->cmd = MFI_CMD_INIT;
4254         init_frame->cmd_status = MFI_STAT_INVALID_STATUS;
4255         init_frame->queue_info_new_phys_addr_lo =
4256                 cpu_to_le32(lower_32_bits(initq_info_h));
4257         init_frame->queue_info_new_phys_addr_hi =
4258                 cpu_to_le32(upper_32_bits(initq_info_h));
4259
4260         init_frame->data_xfer_len = cpu_to_le32(sizeof(struct megasas_init_queue_info));
4261
4262         /*
4263          * disable the intr before firing the init frame to FW
4264          */
4265         instance->instancet->disable_intr(instance);
4266
4267         /*
4268          * Issue the init frame in polled mode
4269          */
4270
4271         if (megasas_issue_polled(instance, cmd)) {
4272                 printk(KERN_ERR "megasas: Failed to init firmware\n");
4273                 megasas_return_cmd(instance, cmd);
4274                 goto fail_fw_init;
4275         }
4276
4277         megasas_return_cmd(instance, cmd);
4278
4279         return 0;
4280
4281 fail_fw_init:
4282         return -EINVAL;
4283 }
4284
4285 static u32
4286 megasas_init_adapter_mfi(struct megasas_instance *instance)
4287 {
4288         struct megasas_register_set __iomem *reg_set;
4289         u32 context_sz;
4290         u32 reply_q_sz;
4291
4292         reg_set = instance->reg_set;
4293
4294         /*
4295          * Get various operational parameters from status register
4296          */
4297         instance->max_fw_cmds = instance->instancet->read_fw_status_reg(reg_set) & 0x00FFFF;
4298         /*
4299          * Reduce the max supported cmds by 1. This is to ensure that the
4300          * reply_q_sz (1 more than the max cmd that driver may send)
4301          * does not exceed max cmds that the FW can support
4302          */
4303         instance->max_fw_cmds = instance->max_fw_cmds-1;
4304         instance->max_mfi_cmds = instance->max_fw_cmds;
4305         instance->max_num_sge = (instance->instancet->read_fw_status_reg(reg_set) & 0xFF0000) >>
4306                                         0x10;
4307         /*
4308          * For MFI skinny adapters, MEGASAS_SKINNY_INT_CMDS commands
4309          * are reserved for IOCTL + driver's internal DCMDs.
4310          */
4311         if ((instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
4312                 (instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0071SKINNY)) {
4313                 instance->max_scsi_cmds = (instance->max_fw_cmds -
4314                         MEGASAS_SKINNY_INT_CMDS);
4315                 sema_init(&instance->ioctl_sem, MEGASAS_SKINNY_INT_CMDS);
4316         } else {
4317                 instance->max_scsi_cmds = (instance->max_fw_cmds -
4318                         MEGASAS_INT_CMDS);
4319                 sema_init(&instance->ioctl_sem, (MEGASAS_MFI_IOCTL_CMDS));
4320         }
4321
4322         /*
4323          * Create a pool of commands
4324          */
4325         if (megasas_alloc_cmds(instance))
4326                 goto fail_alloc_cmds;
4327
4328         /*
4329          * Allocate memory for reply queue. Length of reply queue should
4330          * be _one_ more than the maximum commands handled by the firmware.
4331          *
4332          * Note: When FW completes commands, it places corresponding contex
4333          * values in this circular reply queue. This circular queue is a fairly
4334          * typical producer-consumer queue. FW is the producer (of completed
4335          * commands) and the driver is the consumer.
4336          */
4337         context_sz = sizeof(u32);
4338         reply_q_sz = context_sz * (instance->max_fw_cmds + 1);
4339
4340         instance->reply_queue = pci_alloc_consistent(instance->pdev,
4341                                                      reply_q_sz,
4342                                                      &instance->reply_queue_h);
4343
4344         if (!instance->reply_queue) {
4345                 printk(KERN_DEBUG "megasas: Out of DMA mem for reply queue\n");
4346                 goto fail_reply_queue;
4347         }
4348
4349         if (megasas_issue_init_mfi(instance))
4350                 goto fail_fw_init;
4351
4352         if (megasas_get_ctrl_info(instance)) {
4353                 dev_err(&instance->pdev->dev, "(%d): Could get controller info "
4354                         "Fail from %s %d\n", instance->unique_id,
4355                         __func__, __LINE__);
4356                 goto fail_fw_init;
4357         }
4358
4359         instance->fw_support_ieee = 0;
4360         instance->fw_support_ieee =
4361                 (instance->instancet->read_fw_status_reg(reg_set) &
4362                 0x04000000);
4363
4364         printk(KERN_NOTICE "megasas_init_mfi: fw_support_ieee=%d",
4365                         instance->fw_support_ieee);
4366
4367         if (instance->fw_support_ieee)
4368                 instance->flag_ieee = 1;
4369
4370         return 0;
4371
4372 fail_fw_init:
4373
4374         pci_free_consistent(instance->pdev, reply_q_sz,
4375                             instance->reply_queue, instance->reply_queue_h);
4376 fail_reply_queue:
4377         megasas_free_cmds(instance);
4378
4379 fail_alloc_cmds:
4380         return 1;
4381 }
4382
4383 /*
4384  * megasas_setup_irqs_msix -            register legacy interrupts.
4385  * @instance:                           Adapter soft state
4386  *
4387  * Do not enable interrupt, only setup ISRs.
4388  *
4389  * Return 0 on success.
4390  */
4391 static int
4392 megasas_setup_irqs_ioapic(struct megasas_instance *instance)
4393 {
4394         struct pci_dev *pdev;
4395
4396         pdev = instance->pdev;
4397         instance->irq_context[0].instance = instance;
4398         instance->irq_context[0].MSIxIndex = 0;
4399         if (request_irq(pdev->irq, instance->instancet->service_isr,
4400                 IRQF_SHARED, "megasas", &instance->irq_context[0])) {
4401                 dev_err(&instance->pdev->dev,
4402                                 "Failed to register IRQ from %s %d\n",
4403                                 __func__, __LINE__);
4404                 return -1;
4405         }
4406         return 0;
4407 }
4408
4409 /**
4410  * megasas_setup_irqs_msix -            register MSI-x interrupts.
4411  * @instance:                           Adapter soft state
4412  * @is_probe:                           Driver probe check
4413  *
4414  * Do not enable interrupt, only setup ISRs.
4415  *
4416  * Return 0 on success.
4417  */
4418 static int
4419 megasas_setup_irqs_msix(struct megasas_instance *instance, u8 is_probe)
4420 {
4421         int i, j, cpu;
4422         struct pci_dev *pdev;
4423
4424         pdev = instance->pdev;
4425
4426         /* Try MSI-x */
4427         cpu = cpumask_first(cpu_online_mask);
4428         for (i = 0; i < instance->msix_vectors; i++) {
4429                 instance->irq_context[i].instance = instance;
4430                 instance->irq_context[i].MSIxIndex = i;
4431                 if (request_irq(instance->msixentry[i].vector,
4432                         instance->instancet->service_isr, 0, "megasas",
4433                         &instance->irq_context[i])) {
4434                         dev_err(&instance->pdev->dev,
4435                                 "Failed to register IRQ for vector %d.\n", i);
4436                         for (j = 0; j < i; j++) {
4437                                 if (smp_affinity_enable)
4438                                         irq_set_affinity_hint(
4439                                                 instance->msixentry[j].vector, NULL);
4440                                 free_irq(instance->msixentry[j].vector,
4441                                         &instance->irq_context[j]);
4442                         }
4443                         /* Retry irq register for IO_APIC*/
4444                         instance->msix_vectors = 0;
4445                         if (is_probe)
4446                                 return megasas_setup_irqs_ioapic(instance);
4447                         else
4448                                 return -1;
4449                 }
4450                 if (smp_affinity_enable) {
4451                         if (irq_set_affinity_hint(instance->msixentry[i].vector,
4452                                 get_cpu_mask(cpu)))
4453                                 dev_err(&instance->pdev->dev,
4454                                         "Failed to set affinity hint"
4455                                         " for cpu %d\n", cpu);
4456                         cpu = cpumask_next(cpu, cpu_online_mask);
4457                 }
4458         }
4459         return 0;
4460 }
4461
4462 /*
4463  * megasas_destroy_irqs-                unregister interrupts.
4464  * @instance:                           Adapter soft state
4465  * return:                              void
4466  */
4467 static void
4468 megasas_destroy_irqs(struct megasas_instance *instance) {
4469
4470         int i;
4471
4472         if (instance->msix_vectors)
4473                 for (i = 0; i < instance->msix_vectors; i++) {
4474                         if (smp_affinity_enable)
4475                                 irq_set_affinity_hint(
4476                                         instance->msixentry[i].vector, NULL);
4477                         free_irq(instance->msixentry[i].vector,
4478                                  &instance->irq_context[i]);
4479                 }
4480         else
4481                 free_irq(instance->pdev->irq, &instance->irq_context[0]);
4482 }
4483
4484 /**
4485  * megasas_init_fw -    Initializes the FW
4486  * @instance:           Adapter soft state
4487  *
4488  * This is the main function for initializing firmware
4489  */
4490
4491 static int megasas_init_fw(struct megasas_instance *instance)
4492 {
4493         u32 max_sectors_1;
4494         u32 max_sectors_2;
4495         u32 tmp_sectors, msix_enable, scratch_pad_2;
4496         resource_size_t base_addr;
4497         struct megasas_register_set __iomem *reg_set;
4498         struct megasas_ctrl_info *ctrl_info = NULL;
4499         unsigned long bar_list;
4500         int i, loop, fw_msix_count = 0;
4501         struct IOV_111 *iovPtr;
4502
4503         /* Find first memory bar */
4504         bar_list = pci_select_bars(instance->pdev, IORESOURCE_MEM);
4505         instance->bar = find_first_bit(&bar_list, sizeof(unsigned long));
4506         if (pci_request_selected_regions(instance->pdev, instance->bar,
4507                                          "megasas: LSI")) {
4508                 printk(KERN_DEBUG "megasas: IO memory region busy!\n");
4509                 return -EBUSY;
4510         }
4511
4512         base_addr = pci_resource_start(instance->pdev, instance->bar);
4513         instance->reg_set = ioremap_nocache(base_addr, 8192);
4514
4515         if (!instance->reg_set) {
4516                 printk(KERN_DEBUG "megasas: Failed to map IO mem\n");
4517                 goto fail_ioremap;
4518         }
4519
4520         reg_set = instance->reg_set;
4521
4522         switch (instance->pdev->device) {
4523         case PCI_DEVICE_ID_LSI_FUSION:
4524         case PCI_DEVICE_ID_LSI_PLASMA:
4525         case PCI_DEVICE_ID_LSI_INVADER:
4526         case PCI_DEVICE_ID_LSI_FURY:
4527                 instance->instancet = &megasas_instance_template_fusion;
4528                 break;
4529         case PCI_DEVICE_ID_LSI_SAS1078R:
4530         case PCI_DEVICE_ID_LSI_SAS1078DE:
4531                 instance->instancet = &megasas_instance_template_ppc;
4532                 break;
4533         case PCI_DEVICE_ID_LSI_SAS1078GEN2:
4534         case PCI_DEVICE_ID_LSI_SAS0079GEN2:
4535                 instance->instancet = &megasas_instance_template_gen2;
4536                 break;
4537         case PCI_DEVICE_ID_LSI_SAS0073SKINNY:
4538         case PCI_DEVICE_ID_LSI_SAS0071SKINNY:
4539                 instance->instancet = &megasas_instance_template_skinny;
4540                 break;
4541         case PCI_DEVICE_ID_LSI_SAS1064R:
4542         case PCI_DEVICE_ID_DELL_PERC5:
4543         default:
4544                 instance->instancet = &megasas_instance_template_xscale;
4545                 break;
4546         }
4547
4548         if (megasas_transition_to_ready(instance, 0)) {
4549                 atomic_set(&instance->fw_reset_no_pci_access, 1);
4550                 instance->instancet->adp_reset
4551                         (instance, instance->reg_set);
4552                 atomic_set(&instance->fw_reset_no_pci_access, 0);
4553                 dev_info(&instance->pdev->dev,
4554                         "megasas: FW restarted successfully from %s!\n",
4555                         __func__);
4556
4557                 /*waitting for about 30 second before retry*/
4558                 ssleep(30);
4559
4560                 if (megasas_transition_to_ready(instance, 0))
4561                         goto fail_ready_state;
4562         }
4563
4564         /*
4565          * MSI-X host index 0 is common for all adapter.
4566          * It is used for all MPT based Adapters.
4567          */
4568         instance->reply_post_host_index_addr[0] =
4569                 (u32 __iomem *)((u8 __iomem *)instance->reg_set +
4570                 MPI2_REPLY_POST_HOST_INDEX_OFFSET);
4571
4572         /* Check if MSI-X is supported while in ready state */
4573         msix_enable = (instance->instancet->read_fw_status_reg(reg_set) &
4574                        0x4000000) >> 0x1a;
4575         if (msix_enable && !msix_disable) {
4576                 scratch_pad_2 = readl
4577                         (&instance->reg_set->outbound_scratch_pad_2);
4578                 /* Check max MSI-X vectors */
4579                 if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
4580                     (instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA)) {
4581                         instance->msix_vectors = (scratch_pad_2
4582                                 & MR_MAX_REPLY_QUEUES_OFFSET) + 1;
4583                         fw_msix_count = instance->msix_vectors;
4584                         if (msix_vectors)
4585                                 instance->msix_vectors =
4586                                         min(msix_vectors,
4587                                             instance->msix_vectors);
4588                 } else if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER)
4589                         || (instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
4590                         /* Invader/Fury supports more than 8 MSI-X */
4591                         instance->msix_vectors = ((scratch_pad_2
4592                                 & MR_MAX_REPLY_QUEUES_EXT_OFFSET)
4593                                 >> MR_MAX_REPLY_QUEUES_EXT_OFFSET_SHIFT) + 1;
4594                         fw_msix_count = instance->msix_vectors;
4595                         /* Save 1-15 reply post index address to local memory
4596                          * Index 0 is already saved from reg offset
4597                          * MPI2_REPLY_POST_HOST_INDEX_OFFSET
4598                          */
4599                         for (loop = 1; loop < MR_MAX_MSIX_REG_ARRAY; loop++) {
4600                                 instance->reply_post_host_index_addr[loop] =
4601                                         (u32 __iomem *)
4602                                         ((u8 __iomem *)instance->reg_set +
4603                                         MPI2_SUP_REPLY_POST_HOST_INDEX_OFFSET
4604                                         + (loop * 0x10));
4605                         }
4606                         if (msix_vectors)
4607                                 instance->msix_vectors = min(msix_vectors,
4608                                         instance->msix_vectors);
4609                 } else
4610                         instance->msix_vectors = 1;
4611                 /* Don't bother allocating more MSI-X vectors than cpus */
4612                 instance->msix_vectors = min(instance->msix_vectors,
4613                                              (unsigned int)num_online_cpus());
4614                 for (i = 0; i < instance->msix_vectors; i++)
4615                         instance->msixentry[i].entry = i;
4616                 i = pci_enable_msix_range(instance->pdev, instance->msixentry,
4617                                           1, instance->msix_vectors);
4618                 if (i > 0)
4619                         instance->msix_vectors = i;
4620                 else
4621                         instance->msix_vectors = 0;
4622         }
4623
4624         dev_info(&instance->pdev->dev,
4625                 "firmware supports msix\t: (%d)", fw_msix_count);
4626         dev_info(&instance->pdev->dev,
4627                 "current msix/online cpus\t: (%d/%d)\n",
4628                 instance->msix_vectors, (unsigned int)num_online_cpus());
4629
4630         if (instance->msix_vectors ?
4631                 megasas_setup_irqs_msix(instance, 1) :
4632                 megasas_setup_irqs_ioapic(instance))
4633                 goto fail_setup_irqs;
4634
4635         instance->ctrl_info = kzalloc(sizeof(struct megasas_ctrl_info),
4636                                 GFP_KERNEL);
4637         if (instance->ctrl_info == NULL)
4638                 goto fail_init_adapter;
4639
4640         /*
4641          * Below are default value for legacy Firmware.
4642          * non-fusion based controllers
4643          */
4644         instance->fw_supported_vd_count = MAX_LOGICAL_DRIVES;
4645         instance->fw_supported_pd_count = MAX_PHYSICAL_DEVICES;
4646         /* Get operational params, sge flags, send init cmd to controller */
4647         if (instance->instancet->init_adapter(instance))
4648                 goto fail_init_adapter;
4649
4650         tasklet_init(&instance->isr_tasklet, instance->instancet->tasklet,
4651                 (unsigned long)instance);
4652
4653         instance->instancet->enable_intr(instance);
4654
4655         printk(KERN_ERR "megasas: INIT adapter done\n");
4656
4657         /** for passthrough
4658         * the following function will get the PD LIST.
4659         */
4660
4661         memset(instance->pd_list, 0 ,
4662                 (MEGASAS_MAX_PD * sizeof(struct megasas_pd_list)));
4663         if (megasas_get_pd_list(instance) < 0) {
4664                 printk(KERN_ERR "megasas: failed to get PD list\n");
4665                 goto fail_get_pd_list;
4666         }
4667
4668         memset(instance->ld_ids, 0xff, MEGASAS_MAX_LD_IDS);
4669         if (megasas_ld_list_query(instance,
4670                                   MR_LD_QUERY_TYPE_EXPOSED_TO_HOST))
4671                 megasas_get_ld_list(instance);
4672
4673         /*
4674          * Compute the max allowed sectors per IO: The controller info has two
4675          * limits on max sectors. Driver should use the minimum of these two.
4676          *
4677          * 1 << stripe_sz_ops.min = max sectors per strip
4678          *
4679          * Note that older firmwares ( < FW ver 30) didn't report information
4680          * to calculate max_sectors_1. So the number ended up as zero always.
4681          */
4682         tmp_sectors = 0;
4683         ctrl_info = instance->ctrl_info;
4684
4685         max_sectors_1 = (1 << ctrl_info->stripe_sz_ops.min) *
4686                 le16_to_cpu(ctrl_info->max_strips_per_io);
4687         max_sectors_2 = le32_to_cpu(ctrl_info->max_request_size);
4688
4689         tmp_sectors = min_t(u32, max_sectors_1 , max_sectors_2);
4690
4691         instance->disableOnlineCtrlReset =
4692         ctrl_info->properties.OnOffProperties.disableOnlineCtrlReset;
4693         instance->mpio = ctrl_info->adapterOperations2.mpio;
4694         instance->UnevenSpanSupport =
4695                 ctrl_info->adapterOperations2.supportUnevenSpans;
4696         if (instance->UnevenSpanSupport) {
4697                 struct fusion_context *fusion = instance->ctrl_context;
4698                 if (MR_ValidateMapInfo(instance))
4699                         fusion->fast_path_io = 1;
4700                 else
4701                         fusion->fast_path_io = 0;
4702
4703         }
4704         if (ctrl_info->host_interface.SRIOV) {
4705                 if (!ctrl_info->adapterOperations2.activePassive)
4706                         instance->PlasmaFW111 = 1;
4707
4708                 if (!instance->PlasmaFW111)
4709                         instance->requestorId =
4710                                 ctrl_info->iov.requestorId;
4711                 else {
4712                         iovPtr = (struct IOV_111 *)((unsigned char *)ctrl_info + IOV_111_OFFSET);
4713                         instance->requestorId = iovPtr->requestorId;
4714                 }
4715                 dev_warn(&instance->pdev->dev, "I am VF "
4716                        "requestorId %d\n", instance->requestorId);
4717         }
4718
4719         instance->crash_dump_fw_support =
4720                 ctrl_info->adapterOperations3.supportCrashDump;
4721         instance->crash_dump_drv_support =
4722                 (instance->crash_dump_fw_support &&
4723                 instance->crash_dump_buf);
4724         if (instance->crash_dump_drv_support)
4725                 megasas_set_crash_dump_params(instance,
4726                         MR_CRASH_BUF_TURN_OFF);
4727
4728         else {
4729                 if (instance->crash_dump_buf)
4730                         pci_free_consistent(instance->pdev,
4731                                 CRASH_DMA_BUF_SIZE,
4732                                 instance->crash_dump_buf,
4733                                 instance->crash_dump_h);
4734                 instance->crash_dump_buf = NULL;
4735         }
4736
4737         instance->secure_jbod_support =
4738                 ctrl_info->adapterOperations3.supportSecurityonJBOD;
4739
4740         dev_info(&instance->pdev->dev,
4741                 "pci id\t\t: (0x%04x)/(0x%04x)/(0x%04x)/(0x%04x)\n",
4742                 le16_to_cpu(ctrl_info->pci.vendor_id),
4743                 le16_to_cpu(ctrl_info->pci.device_id),
4744                 le16_to_cpu(ctrl_info->pci.sub_vendor_id),
4745                 le16_to_cpu(ctrl_info->pci.sub_device_id));
4746         dev_info(&instance->pdev->dev, "unevenspan support      : %s\n",
4747                 instance->UnevenSpanSupport ? "yes" : "no");
4748         dev_info(&instance->pdev->dev, "disable ocr             : %s\n",
4749                 instance->disableOnlineCtrlReset ? "yes" : "no");
4750         dev_info(&instance->pdev->dev, "firmware crash dump     : %s\n",
4751                 instance->crash_dump_drv_support ? "yes" : "no");
4752         dev_info(&instance->pdev->dev, "secure jbod             : %s\n",
4753                 instance->secure_jbod_support ? "yes" : "no");
4754
4755
4756         instance->max_sectors_per_req = instance->max_num_sge *
4757                                                 PAGE_SIZE / 512;
4758         if (tmp_sectors && (instance->max_sectors_per_req > tmp_sectors))
4759                 instance->max_sectors_per_req = tmp_sectors;
4760
4761         /* Check for valid throttlequeuedepth module parameter */
4762         if (throttlequeuedepth &&
4763                         throttlequeuedepth <= instance->max_scsi_cmds)
4764                 instance->throttlequeuedepth = throttlequeuedepth;
4765         else
4766                 instance->throttlequeuedepth =
4767                                 MEGASAS_THROTTLE_QUEUE_DEPTH;
4768
4769
4770         /* Launch SR-IOV heartbeat timer */
4771         if (instance->requestorId) {
4772                 if (!megasas_sriov_start_heartbeat(instance, 1))
4773                         megasas_start_timer(instance,
4774                                             &instance->sriov_heartbeat_timer,
4775                                             megasas_sriov_heartbeat_handler,
4776                                             MEGASAS_SRIOV_HEARTBEAT_INTERVAL_VF);
4777                 else
4778                         instance->skip_heartbeat_timer_del = 1;
4779         }
4780
4781         return 0;
4782
4783 fail_get_pd_list:
4784         instance->instancet->disable_intr(instance);
4785 fail_init_adapter:
4786         megasas_destroy_irqs(instance);
4787 fail_setup_irqs:
4788         if (instance->msix_vectors)
4789                 pci_disable_msix(instance->pdev);
4790         instance->msix_vectors = 0;
4791 fail_ready_state:
4792         kfree(instance->ctrl_info);
4793         instance->ctrl_info = NULL;
4794         iounmap(instance->reg_set);
4795
4796       fail_ioremap:
4797         pci_release_selected_regions(instance->pdev, instance->bar);
4798
4799         return -EINVAL;
4800 }
4801
4802 /**
4803  * megasas_release_mfi -        Reverses the FW initialization
4804  * @instance:                   Adapter soft state
4805  */
4806 static void megasas_release_mfi(struct megasas_instance *instance)
4807 {
4808         u32 reply_q_sz = sizeof(u32) *(instance->max_mfi_cmds + 1);
4809
4810         if (instance->reply_queue)
4811                 pci_free_consistent(instance->pdev, reply_q_sz,
4812                             instance->reply_queue, instance->reply_queue_h);
4813
4814         megasas_free_cmds(instance);
4815
4816         iounmap(instance->reg_set);
4817
4818         pci_release_selected_regions(instance->pdev, instance->bar);
4819 }
4820
4821 /**
4822  * megasas_get_seq_num -        Gets latest event sequence numbers
4823  * @instance:                   Adapter soft state
4824  * @eli:                        FW event log sequence numbers information
4825  *
4826  * FW maintains a log of all events in a non-volatile area. Upper layers would
4827  * usually find out the latest sequence number of the events, the seq number at
4828  * the boot etc. They would "read" all the events below the latest seq number
4829  * by issuing a direct fw cmd (DCMD). For the future events (beyond latest seq
4830  * number), they would subsribe to AEN (asynchronous event notification) and
4831  * wait for the events to happen.
4832  */
4833 static int
4834 megasas_get_seq_num(struct megasas_instance *instance,
4835                     struct megasas_evt_log_info *eli)
4836 {
4837         struct megasas_cmd *cmd;
4838         struct megasas_dcmd_frame *dcmd;
4839         struct megasas_evt_log_info *el_info;
4840         dma_addr_t el_info_h = 0;
4841
4842         cmd = megasas_get_cmd(instance);
4843
4844         if (!cmd) {
4845                 return -ENOMEM;
4846         }
4847
4848         dcmd = &cmd->frame->dcmd;
4849         el_info = pci_alloc_consistent(instance->pdev,
4850                                        sizeof(struct megasas_evt_log_info),
4851                                        &el_info_h);
4852
4853         if (!el_info) {
4854                 megasas_return_cmd(instance, cmd);
4855                 return -ENOMEM;
4856         }
4857
4858         memset(el_info, 0, sizeof(*el_info));
4859         memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
4860
4861         dcmd->cmd = MFI_CMD_DCMD;
4862         dcmd->cmd_status = 0x0;
4863         dcmd->sge_count = 1;
4864         dcmd->flags = cpu_to_le16(MFI_FRAME_DIR_READ);
4865         dcmd->timeout = 0;
4866         dcmd->pad_0 = 0;
4867         dcmd->data_xfer_len = cpu_to_le32(sizeof(struct megasas_evt_log_info));
4868         dcmd->opcode = cpu_to_le32(MR_DCMD_CTRL_EVENT_GET_INFO);
4869         dcmd->sgl.sge32[0].phys_addr = cpu_to_le32(el_info_h);
4870         dcmd->sgl.sge32[0].length = cpu_to_le32(sizeof(struct megasas_evt_log_info));
4871
4872         if (megasas_issue_blocked_cmd(instance, cmd, 30))
4873                 dev_err(&instance->pdev->dev, "Command timedout"
4874                         "from %s\n", __func__);
4875         else {
4876                 /*
4877                  * Copy the data back into callers buffer
4878                  */
4879                 eli->newest_seq_num = el_info->newest_seq_num;
4880                 eli->oldest_seq_num = el_info->oldest_seq_num;
4881                 eli->clear_seq_num = el_info->clear_seq_num;
4882                 eli->shutdown_seq_num = el_info->shutdown_seq_num;
4883                 eli->boot_seq_num = el_info->boot_seq_num;
4884         }
4885
4886         pci_free_consistent(instance->pdev, sizeof(struct megasas_evt_log_info),
4887                             el_info, el_info_h);
4888
4889         megasas_return_cmd(instance, cmd);
4890
4891         return 0;
4892 }
4893
4894 /**
4895  * megasas_register_aen -       Registers for asynchronous event notification
4896  * @instance:                   Adapter soft state
4897  * @seq_num:                    The starting sequence number
4898  * @class_locale:               Class of the event
4899  *
4900  * This function subscribes for AEN for events beyond the @seq_num. It requests
4901  * to be notified if and only if the event is of type @class_locale
4902  */
4903 static int
4904 megasas_register_aen(struct megasas_instance *instance, u32 seq_num,
4905                      u32 class_locale_word)
4906 {
4907         int ret_val;
4908         struct megasas_cmd *cmd;
4909         struct megasas_dcmd_frame *dcmd;
4910         union megasas_evt_class_locale curr_aen;
4911         union megasas_evt_class_locale prev_aen;
4912
4913         /*
4914          * If there an AEN pending already (aen_cmd), check if the
4915          * class_locale of that pending AEN is inclusive of the new
4916          * AEN request we currently have. If it is, then we don't have
4917          * to do anything. In other words, whichever events the current
4918          * AEN request is subscribing to, have already been subscribed
4919          * to.
4920          *
4921          * If the old_cmd is _not_ inclusive, then we have to abort
4922          * that command, form a class_locale that is superset of both
4923          * old and current and re-issue to the FW
4924          */
4925
4926         curr_aen.word = class_locale_word;
4927
4928         if (instance->aen_cmd) {
4929
4930                 prev_aen.word =
4931                         le32_to_cpu(instance->aen_cmd->frame->dcmd.mbox.w[1]);
4932
4933                 /*
4934                  * A class whose enum value is smaller is inclusive of all
4935                  * higher values. If a PROGRESS (= -1) was previously
4936                  * registered, then a new registration requests for higher
4937                  * classes need not be sent to FW. They are automatically
4938                  * included.
4939                  *
4940                  * Locale numbers don't have such hierarchy. They are bitmap
4941                  * values
4942                  */
4943                 if ((prev_aen.members.class <= curr_aen.members.class) &&
4944                     !((prev_aen.members.locale & curr_aen.members.locale) ^
4945                       curr_aen.members.locale)) {
4946                         /*
4947                          * Previously issued event registration includes
4948                          * current request. Nothing to do.
4949                          */
4950                         return 0;
4951                 } else {
4952                         curr_aen.members.locale |= prev_aen.members.locale;
4953
4954                         if (prev_aen.members.class < curr_aen.members.class)
4955                                 curr_aen.members.class = prev_aen.members.class;
4956
4957                         instance->aen_cmd->abort_aen = 1;
4958                         ret_val = megasas_issue_blocked_abort_cmd(instance,
4959                                                                   instance->
4960                                                                   aen_cmd, 30);
4961
4962                         if (ret_val) {
4963                                 printk(KERN_DEBUG "megasas: Failed to abort "
4964                                        "previous AEN command\n");
4965                                 return ret_val;
4966                         }
4967                 }
4968         }
4969
4970         cmd = megasas_get_cmd(instance);
4971
4972         if (!cmd)
4973                 return -ENOMEM;
4974
4975         dcmd = &cmd->frame->dcmd;
4976
4977         memset(instance->evt_detail, 0, sizeof(struct megasas_evt_detail));
4978
4979         /*
4980          * Prepare DCMD for aen registration
4981          */
4982         memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
4983
4984         dcmd->cmd = MFI_CMD_DCMD;
4985         dcmd->cmd_status = 0x0;
4986         dcmd->sge_count = 1;
4987         dcmd->flags = cpu_to_le16(MFI_FRAME_DIR_READ);
4988         dcmd->timeout = 0;
4989         dcmd->pad_0 = 0;
4990         dcmd->data_xfer_len = cpu_to_le32(sizeof(struct megasas_evt_detail));
4991         dcmd->opcode = cpu_to_le32(MR_DCMD_CTRL_EVENT_WAIT);
4992         dcmd->mbox.w[0] = cpu_to_le32(seq_num);
4993         instance->last_seq_num = seq_num;
4994         dcmd->mbox.w[1] = cpu_to_le32(curr_aen.word);
4995         dcmd->sgl.sge32[0].phys_addr = cpu_to_le32(instance->evt_detail_h);
4996         dcmd->sgl.sge32[0].length = cpu_to_le32(sizeof(struct megasas_evt_detail));
4997
4998         if (instance->aen_cmd != NULL) {
4999                 megasas_return_cmd(instance, cmd);
5000                 return 0;
5001         }
5002
5003         /*
5004          * Store reference to the cmd used to register for AEN. When an
5005          * application wants us to register for AEN, we have to abort this
5006          * cmd and re-register with a new EVENT LOCALE supplied by that app
5007          */
5008         instance->aen_cmd = cmd;
5009
5010         /*
5011          * Issue the aen registration frame
5012          */
5013         instance->instancet->issue_dcmd(instance, cmd);
5014
5015         return 0;
5016 }
5017
5018 /**
5019  * megasas_start_aen -  Subscribes to AEN during driver load time
5020  * @instance:           Adapter soft state
5021  */
5022 static int megasas_start_aen(struct megasas_instance *instance)
5023 {
5024         struct megasas_evt_log_info eli;
5025         union megasas_evt_class_locale class_locale;
5026
5027         /*
5028          * Get the latest sequence number from FW
5029          */
5030         memset(&eli, 0, sizeof(eli));
5031
5032         if (megasas_get_seq_num(instance, &eli))
5033                 return -1;
5034
5035         /*
5036          * Register AEN with FW for latest sequence number plus 1
5037          */
5038         class_locale.members.reserved = 0;
5039         class_locale.members.locale = MR_EVT_LOCALE_ALL;
5040         class_locale.members.class = MR_EVT_CLASS_DEBUG;
5041
5042         return megasas_register_aen(instance,
5043                         le32_to_cpu(eli.newest_seq_num) + 1,
5044                         class_locale.word);
5045 }
5046
5047 /**
5048  * megasas_io_attach -  Attaches this driver to SCSI mid-layer
5049  * @instance:           Adapter soft state
5050  */
5051 static int megasas_io_attach(struct megasas_instance *instance)
5052 {
5053         struct Scsi_Host *host = instance->host;
5054         u32             error;
5055
5056         /*
5057          * Export parameters required by SCSI mid-layer
5058          */
5059         host->irq = instance->pdev->irq;
5060         host->unique_id = instance->unique_id;
5061         host->can_queue = instance->max_scsi_cmds;
5062         host->this_id = instance->init_id;
5063         host->sg_tablesize = instance->max_num_sge;
5064
5065         if (instance->fw_support_ieee)
5066                 instance->max_sectors_per_req = MEGASAS_MAX_SECTORS_IEEE;
5067
5068         /*
5069          * Check if the module parameter value for max_sectors can be used
5070          */
5071         if (max_sectors && max_sectors < instance->max_sectors_per_req)
5072                 instance->max_sectors_per_req = max_sectors;
5073         else {
5074                 if (max_sectors) {
5075                         if (((instance->pdev->device ==
5076                                 PCI_DEVICE_ID_LSI_SAS1078GEN2) ||
5077                                 (instance->pdev->device ==
5078                                 PCI_DEVICE_ID_LSI_SAS0079GEN2)) &&
5079                                 (max_sectors <= MEGASAS_MAX_SECTORS)) {
5080                                 instance->max_sectors_per_req = max_sectors;
5081                         } else {
5082                         printk(KERN_INFO "megasas: max_sectors should be > 0"
5083                                 "and <= %d (or < 1MB for GEN2 controller)\n",
5084                                 instance->max_sectors_per_req);
5085                         }
5086                 }
5087         }
5088
5089         host->max_sectors = instance->max_sectors_per_req;
5090         host->cmd_per_lun = MEGASAS_DEFAULT_CMD_PER_LUN;
5091         host->max_channel = MEGASAS_MAX_CHANNELS - 1;
5092         host->max_id = MEGASAS_MAX_DEV_PER_CHANNEL;
5093         host->max_lun = MEGASAS_MAX_LUN;
5094         host->max_cmd_len = 16;
5095
5096         /* Fusion only supports host reset */
5097         if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
5098             (instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA) ||
5099             (instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
5100             (instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
5101                 host->hostt->eh_device_reset_handler = NULL;
5102                 host->hostt->eh_bus_reset_handler = NULL;
5103         }
5104         error = scsi_init_shared_tag_map(host, host->can_queue);
5105         if (error) {
5106                 dev_err(&instance->pdev->dev,
5107                         "Failed to shared tag from %s %d\n",
5108                         __func__, __LINE__);
5109                 return -ENODEV;
5110         }
5111
5112         /*
5113          * Notify the mid-layer about the new controller
5114          */
5115         if (scsi_add_host(host, &instance->pdev->dev)) {
5116                 dev_err(&instance->pdev->dev,
5117                         "Failed to add host from %s %d\n",
5118                         __func__, __LINE__);
5119                 return -ENODEV;
5120         }
5121
5122         return 0;
5123 }
5124
5125 static int
5126 megasas_set_dma_mask(struct pci_dev *pdev)
5127 {
5128         /*
5129          * All our contollers are capable of performing 64-bit DMA
5130          */
5131         if (IS_DMA64) {
5132                 if (pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) != 0) {
5133
5134                         if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) != 0)
5135                                 goto fail_set_dma_mask;
5136                 }
5137         } else {
5138                 if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) != 0)
5139                         goto fail_set_dma_mask;
5140         }
5141         /*
5142          * Ensure that all data structures are allocated in 32-bit
5143          * memory.
5144          */
5145         if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)) != 0) {
5146                 /* Try 32bit DMA mask and 32 bit Consistent dma mask */
5147                 if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32))
5148                         && !pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)))
5149                         dev_info(&pdev->dev, "set 32bit DMA mask"
5150                                 "and 32 bit consistent mask\n");
5151                 else
5152                         goto fail_set_dma_mask;
5153         }
5154
5155         return 0;
5156
5157 fail_set_dma_mask:
5158         return 1;
5159 }
5160
5161 /**
5162  * megasas_probe_one -  PCI hotplug entry point
5163  * @pdev:               PCI device structure
5164  * @id:                 PCI ids of supported hotplugged adapter
5165  */
5166 static int megasas_probe_one(struct pci_dev *pdev,
5167                              const struct pci_device_id *id)
5168 {
5169         int rval, pos;
5170         struct Scsi_Host *host;
5171         struct megasas_instance *instance;
5172         u16 control = 0;
5173         struct fusion_context *fusion = NULL;
5174
5175         /* Reset MSI-X in the kdump kernel */
5176         if (reset_devices) {
5177                 pos = pci_find_capability(pdev, PCI_CAP_ID_MSIX);
5178                 if (pos) {
5179                         pci_read_config_word(pdev, pos + PCI_MSIX_FLAGS,
5180                                              &control);
5181                         if (control & PCI_MSIX_FLAGS_ENABLE) {
5182                                 dev_info(&pdev->dev, "resetting MSI-X\n");
5183                                 pci_write_config_word(pdev,
5184                                                       pos + PCI_MSIX_FLAGS,
5185                                                       control &
5186                                                       ~PCI_MSIX_FLAGS_ENABLE);
5187                         }
5188                 }
5189         }
5190
5191         /*
5192          * PCI prepping: enable device set bus mastering and dma mask
5193          */
5194         rval = pci_enable_device_mem(pdev);
5195
5196         if (rval) {
5197                 return rval;
5198         }
5199
5200         pci_set_master(pdev);
5201
5202         if (megasas_set_dma_mask(pdev))
5203                 goto fail_set_dma_mask;
5204
5205         host = scsi_host_alloc(&megasas_template,
5206                                sizeof(struct megasas_instance));
5207
5208         if (!host) {
5209                 printk(KERN_DEBUG "megasas: scsi_host_alloc failed\n");
5210                 goto fail_alloc_instance;
5211         }
5212
5213         instance = (struct megasas_instance *)host->hostdata;
5214         memset(instance, 0, sizeof(*instance));
5215         atomic_set( &instance->fw_reset_no_pci_access, 0 );
5216         instance->pdev = pdev;
5217
5218         switch (instance->pdev->device) {
5219         case PCI_DEVICE_ID_LSI_FUSION:
5220         case PCI_DEVICE_ID_LSI_PLASMA:
5221         case PCI_DEVICE_ID_LSI_INVADER:
5222         case PCI_DEVICE_ID_LSI_FURY:
5223         {
5224                 instance->ctrl_context_pages =
5225                         get_order(sizeof(struct fusion_context));
5226                 instance->ctrl_context = (void *)__get_free_pages(GFP_KERNEL,
5227                                 instance->ctrl_context_pages);
5228                 if (!instance->ctrl_context) {
5229                         printk(KERN_DEBUG "megasas: Failed to allocate "
5230                                "memory for Fusion context info\n");
5231                         goto fail_alloc_dma_buf;
5232                 }
5233                 fusion = instance->ctrl_context;
5234                 memset(fusion, 0,
5235                         ((1 << PAGE_SHIFT) << instance->ctrl_context_pages));
5236         }
5237         break;
5238         default: /* For all other supported controllers */
5239
5240                 instance->producer =
5241                         pci_alloc_consistent(pdev, sizeof(u32),
5242                                              &instance->producer_h);
5243                 instance->consumer =
5244                         pci_alloc_consistent(pdev, sizeof(u32),
5245                                              &instance->consumer_h);
5246
5247                 if (!instance->producer || !instance->consumer) {
5248                         printk(KERN_DEBUG "megasas: Failed to allocate"
5249                                "memory for producer, consumer\n");
5250                         goto fail_alloc_dma_buf;
5251                 }
5252
5253                 *instance->producer = 0;
5254                 *instance->consumer = 0;
5255                 break;
5256         }
5257
5258         instance->system_info_buf = pci_zalloc_consistent(pdev,
5259                                         sizeof(struct MR_DRV_SYSTEM_INFO),
5260                                         &instance->system_info_h);
5261
5262         if (!instance->system_info_buf)
5263                 dev_info(&instance->pdev->dev, "Can't allocate system info buffer\n");
5264
5265         /* Crash dump feature related initialisation*/
5266         instance->drv_buf_index = 0;
5267         instance->drv_buf_alloc = 0;
5268         instance->crash_dump_fw_support = 0;
5269         instance->crash_dump_app_support = 0;
5270         instance->fw_crash_state = UNAVAILABLE;
5271         spin_lock_init(&instance->crashdump_lock);
5272         instance->crash_dump_buf = NULL;
5273
5274         if (!reset_devices)
5275                 instance->crash_dump_buf = pci_alloc_consistent(pdev,
5276                                                 CRASH_DMA_BUF_SIZE,
5277                                                 &instance->crash_dump_h);
5278         if (!instance->crash_dump_buf)
5279                 dev_err(&instance->pdev->dev, "Can't allocate Firmware "
5280                         "crash dump DMA buffer\n");
5281
5282         megasas_poll_wait_aen = 0;
5283         instance->flag_ieee = 0;
5284         instance->ev = NULL;
5285         instance->issuepend_done = 1;
5286         instance->adprecovery = MEGASAS_HBA_OPERATIONAL;
5287         instance->is_imr = 0;
5288
5289         instance->evt_detail = pci_alloc_consistent(pdev,
5290                                                     sizeof(struct
5291                                                            megasas_evt_detail),
5292                                                     &instance->evt_detail_h);
5293
5294         if (!instance->evt_detail) {
5295                 printk(KERN_DEBUG "megasas: Failed to allocate memory for "
5296                        "event detail structure\n");
5297                 goto fail_alloc_dma_buf;
5298         }
5299
5300         /*
5301          * Initialize locks and queues
5302          */
5303         INIT_LIST_HEAD(&instance->cmd_pool);
5304         INIT_LIST_HEAD(&instance->internal_reset_pending_q);
5305
5306         atomic_set(&instance->fw_outstanding,0);
5307
5308         init_waitqueue_head(&instance->int_cmd_wait_q);
5309         init_waitqueue_head(&instance->abort_cmd_wait_q);
5310
5311         spin_lock_init(&instance->mfi_pool_lock);
5312         spin_lock_init(&instance->hba_lock);
5313         spin_lock_init(&instance->completion_lock);
5314
5315         mutex_init(&instance->aen_mutex);
5316         mutex_init(&instance->reset_mutex);
5317
5318         /*
5319          * Initialize PCI related and misc parameters
5320          */
5321         instance->host = host;
5322         instance->unique_id = pdev->bus->number << 8 | pdev->devfn;
5323         instance->init_id = MEGASAS_DEFAULT_INIT_ID;
5324         instance->ctrl_info = NULL;
5325
5326
5327         if ((instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
5328                 (instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0071SKINNY))
5329                 instance->flag_ieee = 1;
5330
5331         megasas_dbg_lvl = 0;
5332         instance->flag = 0;
5333         instance->unload = 1;
5334         instance->last_time = 0;
5335         instance->disableOnlineCtrlReset = 1;
5336         instance->UnevenSpanSupport = 0;
5337
5338         if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
5339             (instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA) ||
5340             (instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
5341             (instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
5342                 INIT_WORK(&instance->work_init, megasas_fusion_ocr_wq);
5343                 INIT_WORK(&instance->crash_init, megasas_fusion_crash_dump_wq);
5344         } else
5345                 INIT_WORK(&instance->work_init, process_fw_state_change_wq);
5346
5347         /*
5348          * Initialize MFI Firmware
5349          */
5350         if (megasas_init_fw(instance))
5351                 goto fail_init_mfi;
5352
5353         if (instance->requestorId) {
5354                 if (instance->PlasmaFW111) {
5355                         instance->vf_affiliation_111 =
5356                                 pci_alloc_consistent(pdev, sizeof(struct MR_LD_VF_AFFILIATION_111),
5357                                                      &instance->vf_affiliation_111_h);
5358                         if (!instance->vf_affiliation_111)
5359                                 printk(KERN_WARNING "megasas: Can't allocate "
5360                                        "memory for VF affiliation buffer\n");
5361                 } else {
5362                         instance->vf_affiliation =
5363                                 pci_alloc_consistent(pdev,
5364                                                      (MAX_LOGICAL_DRIVES + 1) *
5365                                                      sizeof(struct MR_LD_VF_AFFILIATION),
5366                                                      &instance->vf_affiliation_h);
5367                         if (!instance->vf_affiliation)
5368                                 printk(KERN_WARNING "megasas: Can't allocate "
5369                                        "memory for VF affiliation buffer\n");
5370                 }
5371         }
5372
5373         /*
5374          * Store instance in PCI softstate
5375          */
5376         pci_set_drvdata(pdev, instance);
5377
5378         /*
5379          * Add this controller to megasas_mgmt_info structure so that it
5380          * can be exported to management applications
5381          */
5382         megasas_mgmt_info.count++;
5383         megasas_mgmt_info.instance[megasas_mgmt_info.max_index] = instance;
5384         megasas_mgmt_info.max_index++;
5385
5386         /*
5387          * Register with SCSI mid-layer
5388          */
5389         if (megasas_io_attach(instance))
5390                 goto fail_io_attach;
5391
5392         instance->unload = 0;
5393         /*
5394          * Trigger SCSI to scan our drives
5395          */
5396         scsi_scan_host(host);
5397
5398         /*
5399          * Initiate AEN (Asynchronous Event Notification)
5400          */
5401         if (megasas_start_aen(instance)) {
5402                 printk(KERN_DEBUG "megasas: start aen failed\n");
5403                 goto fail_start_aen;
5404         }
5405
5406         /* Get current SR-IOV LD/VF affiliation */
5407         if (instance->requestorId)
5408                 megasas_get_ld_vf_affiliation(instance, 1);
5409
5410         return 0;
5411
5412       fail_start_aen:
5413       fail_io_attach:
5414         megasas_mgmt_info.count--;
5415         megasas_mgmt_info.instance[megasas_mgmt_info.max_index] = NULL;
5416         megasas_mgmt_info.max_index--;
5417
5418         instance->instancet->disable_intr(instance);
5419         megasas_destroy_irqs(instance);
5420
5421         if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
5422             (instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA) ||
5423             (instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
5424             (instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
5425                 megasas_release_fusion(instance);
5426         else
5427                 megasas_release_mfi(instance);
5428         if (instance->msix_vectors)
5429                 pci_disable_msix(instance->pdev);
5430 fail_init_mfi:
5431       fail_alloc_dma_buf:
5432         if (instance->evt_detail)
5433                 pci_free_consistent(pdev, sizeof(struct megasas_evt_detail),
5434                                     instance->evt_detail,
5435                                     instance->evt_detail_h);
5436
5437         if (instance->producer)
5438                 pci_free_consistent(pdev, sizeof(u32), instance->producer,
5439                                     instance->producer_h);
5440         if (instance->consumer)
5441                 pci_free_consistent(pdev, sizeof(u32), instance->consumer,
5442                                     instance->consumer_h);
5443         scsi_host_put(host);
5444
5445       fail_alloc_instance:
5446       fail_set_dma_mask:
5447         pci_disable_device(pdev);
5448
5449         return -ENODEV;
5450 }
5451
5452 /**
5453  * megasas_flush_cache -        Requests FW to flush all its caches
5454  * @instance:                   Adapter soft state
5455  */
5456 static void megasas_flush_cache(struct megasas_instance *instance)
5457 {
5458         struct megasas_cmd *cmd;
5459         struct megasas_dcmd_frame *dcmd;
5460
5461         if (instance->adprecovery == MEGASAS_HW_CRITICAL_ERROR)
5462                 return;
5463
5464         cmd = megasas_get_cmd(instance);
5465
5466         if (!cmd)
5467                 return;
5468
5469         dcmd = &cmd->frame->dcmd;
5470
5471         memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
5472
5473         dcmd->cmd = MFI_CMD_DCMD;
5474         dcmd->cmd_status = 0x0;
5475         dcmd->sge_count = 0;
5476         dcmd->flags = cpu_to_le16(MFI_FRAME_DIR_NONE);
5477         dcmd->timeout = 0;
5478         dcmd->pad_0 = 0;
5479         dcmd->data_xfer_len = 0;
5480         dcmd->opcode = cpu_to_le32(MR_DCMD_CTRL_CACHE_FLUSH);
5481         dcmd->mbox.b[0] = MR_FLUSH_CTRL_CACHE | MR_FLUSH_DISK_CACHE;
5482
5483         if (megasas_issue_blocked_cmd(instance, cmd, 30))
5484                 dev_err(&instance->pdev->dev, "Command timedout"
5485                         " from %s\n", __func__);
5486
5487         megasas_return_cmd(instance, cmd);
5488
5489         return;
5490 }
5491
5492 /**
5493  * megasas_shutdown_controller -        Instructs FW to shutdown the controller
5494  * @instance:                           Adapter soft state
5495  * @opcode:                             Shutdown/Hibernate
5496  */
5497 static void megasas_shutdown_controller(struct megasas_instance *instance,
5498                                         u32 opcode)
5499 {
5500         struct megasas_cmd *cmd;
5501         struct megasas_dcmd_frame *dcmd;
5502
5503         if (instance->adprecovery == MEGASAS_HW_CRITICAL_ERROR)
5504                 return;
5505
5506         cmd = megasas_get_cmd(instance);
5507
5508         if (!cmd)
5509                 return;
5510
5511         if (instance->aen_cmd)
5512                 megasas_issue_blocked_abort_cmd(instance,
5513                         instance->aen_cmd, 30);
5514         if (instance->map_update_cmd)
5515                 megasas_issue_blocked_abort_cmd(instance,
5516                         instance->map_update_cmd, 30);
5517         dcmd = &cmd->frame->dcmd;
5518
5519         memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
5520
5521         dcmd->cmd = MFI_CMD_DCMD;
5522         dcmd->cmd_status = 0x0;
5523         dcmd->sge_count = 0;
5524         dcmd->flags = cpu_to_le16(MFI_FRAME_DIR_NONE);
5525         dcmd->timeout = 0;
5526         dcmd->pad_0 = 0;
5527         dcmd->data_xfer_len = 0;
5528         dcmd->opcode = cpu_to_le32(opcode);
5529
5530         if (megasas_issue_blocked_cmd(instance, cmd, 30))
5531                 dev_err(&instance->pdev->dev, "Command timedout"
5532                         "from %s\n", __func__);
5533
5534         megasas_return_cmd(instance, cmd);
5535
5536         return;
5537 }
5538
5539 #ifdef CONFIG_PM
5540 /**
5541  * megasas_suspend -    driver suspend entry point
5542  * @pdev:               PCI device structure
5543  * @state:              PCI power state to suspend routine
5544  */
5545 static int
5546 megasas_suspend(struct pci_dev *pdev, pm_message_t state)
5547 {
5548         struct Scsi_Host *host;
5549         struct megasas_instance *instance;
5550
5551         instance = pci_get_drvdata(pdev);
5552         host = instance->host;
5553         instance->unload = 1;
5554
5555         /* Shutdown SR-IOV heartbeat timer */
5556         if (instance->requestorId && !instance->skip_heartbeat_timer_del)
5557                 del_timer_sync(&instance->sriov_heartbeat_timer);
5558
5559         megasas_flush_cache(instance);
5560         megasas_shutdown_controller(instance, MR_DCMD_HIBERNATE_SHUTDOWN);
5561
5562         /* cancel the delayed work if this work still in queue */
5563         if (instance->ev != NULL) {
5564                 struct megasas_aen_event *ev = instance->ev;
5565                 cancel_delayed_work_sync(&ev->hotplug_work);
5566                 instance->ev = NULL;
5567         }
5568
5569         tasklet_kill(&instance->isr_tasklet);
5570
5571         pci_set_drvdata(instance->pdev, instance);
5572         instance->instancet->disable_intr(instance);
5573
5574         megasas_destroy_irqs(instance);
5575
5576         if (instance->msix_vectors)
5577                 pci_disable_msix(instance->pdev);
5578
5579         pci_save_state(pdev);
5580         pci_disable_device(pdev);
5581
5582         pci_set_power_state(pdev, pci_choose_state(pdev, state));
5583
5584         return 0;
5585 }
5586
5587 /**
5588  * megasas_resume-      driver resume entry point
5589  * @pdev:               PCI device structure
5590  */
5591 static int
5592 megasas_resume(struct pci_dev *pdev)
5593 {
5594         int rval;
5595         struct Scsi_Host *host;
5596         struct megasas_instance *instance;
5597
5598         instance = pci_get_drvdata(pdev);
5599         host = instance->host;
5600         pci_set_power_state(pdev, PCI_D0);
5601         pci_enable_wake(pdev, PCI_D0, 0);
5602         pci_restore_state(pdev);
5603
5604         /*
5605          * PCI prepping: enable device set bus mastering and dma mask
5606          */
5607         rval = pci_enable_device_mem(pdev);
5608
5609         if (rval) {
5610                 printk(KERN_ERR "megasas: Enable device failed\n");
5611                 return rval;
5612         }
5613
5614         pci_set_master(pdev);
5615
5616         if (megasas_set_dma_mask(pdev))
5617                 goto fail_set_dma_mask;
5618
5619         /*
5620          * Initialize MFI Firmware
5621          */
5622
5623         atomic_set(&instance->fw_outstanding, 0);
5624
5625         /*
5626          * We expect the FW state to be READY
5627          */
5628         if (megasas_transition_to_ready(instance, 0))
5629                 goto fail_ready_state;
5630
5631         /* Now re-enable MSI-X */
5632         if (instance->msix_vectors &&
5633             pci_enable_msix_exact(instance->pdev, instance->msixentry,
5634                                   instance->msix_vectors))
5635                 goto fail_reenable_msix;
5636
5637         switch (instance->pdev->device) {
5638         case PCI_DEVICE_ID_LSI_FUSION:
5639         case PCI_DEVICE_ID_LSI_PLASMA:
5640         case PCI_DEVICE_ID_LSI_INVADER:
5641         case PCI_DEVICE_ID_LSI_FURY:
5642         {
5643                 megasas_reset_reply_desc(instance);
5644                 if (megasas_ioc_init_fusion(instance)) {
5645                         megasas_free_cmds(instance);
5646                         megasas_free_cmds_fusion(instance);
5647                         goto fail_init_mfi;
5648                 }
5649                 if (!megasas_get_map_info(instance))
5650                         megasas_sync_map_info(instance);
5651         }
5652         break;
5653         default:
5654                 *instance->producer = 0;
5655                 *instance->consumer = 0;
5656                 if (megasas_issue_init_mfi(instance))
5657                         goto fail_init_mfi;
5658                 break;
5659         }
5660
5661         tasklet_init(&instance->isr_tasklet, instance->instancet->tasklet,
5662                      (unsigned long)instance);
5663
5664         if (instance->msix_vectors ?
5665                         megasas_setup_irqs_msix(instance, 0) :
5666                         megasas_setup_irqs_ioapic(instance))
5667                 goto fail_init_mfi;
5668
5669         /* Re-launch SR-IOV heartbeat timer */
5670         if (instance->requestorId) {
5671                 if (!megasas_sriov_start_heartbeat(instance, 0))
5672                         megasas_start_timer(instance,
5673                                             &instance->sriov_heartbeat_timer,
5674                                             megasas_sriov_heartbeat_handler,
5675                                             MEGASAS_SRIOV_HEARTBEAT_INTERVAL_VF);
5676                 else {
5677                         instance->skip_heartbeat_timer_del = 1;
5678                         goto fail_init_mfi;
5679                 }
5680         }
5681
5682         instance->instancet->enable_intr(instance);
5683         instance->unload = 0;
5684
5685         /*
5686          * Initiate AEN (Asynchronous Event Notification)
5687          */
5688         if (megasas_start_aen(instance))
5689                 printk(KERN_ERR "megasas: Start AEN failed\n");
5690
5691         return 0;
5692
5693 fail_init_mfi:
5694         if (instance->evt_detail)
5695                 pci_free_consistent(pdev, sizeof(struct megasas_evt_detail),
5696                                 instance->evt_detail,
5697                                 instance->evt_detail_h);
5698
5699         if (instance->producer)
5700                 pci_free_consistent(pdev, sizeof(u32), instance->producer,
5701                                 instance->producer_h);
5702         if (instance->consumer)
5703                 pci_free_consistent(pdev, sizeof(u32), instance->consumer,
5704                                 instance->consumer_h);
5705         scsi_host_put(host);
5706
5707 fail_set_dma_mask:
5708 fail_ready_state:
5709 fail_reenable_msix:
5710
5711         pci_disable_device(pdev);
5712
5713         return -ENODEV;
5714 }
5715 #else
5716 #define megasas_suspend NULL
5717 #define megasas_resume  NULL
5718 #endif
5719
5720 /**
5721  * megasas_detach_one - PCI hot"un"plug entry point
5722  * @pdev:               PCI device structure
5723  */
5724 static void megasas_detach_one(struct pci_dev *pdev)
5725 {
5726         int i;
5727         struct Scsi_Host *host;
5728         struct megasas_instance *instance;
5729         struct fusion_context *fusion;
5730
5731         instance = pci_get_drvdata(pdev);
5732         instance->unload = 1;
5733         host = instance->host;
5734         fusion = instance->ctrl_context;
5735
5736         /* Shutdown SR-IOV heartbeat timer */
5737         if (instance->requestorId && !instance->skip_heartbeat_timer_del)
5738                 del_timer_sync(&instance->sriov_heartbeat_timer);
5739
5740         if (instance->fw_crash_state != UNAVAILABLE)
5741                 megasas_free_host_crash_buffer(instance);
5742         scsi_remove_host(instance->host);
5743         megasas_flush_cache(instance);
5744         megasas_shutdown_controller(instance, MR_DCMD_CTRL_SHUTDOWN);
5745
5746         /* cancel the delayed work if this work still in queue*/
5747         if (instance->ev != NULL) {
5748                 struct megasas_aen_event *ev = instance->ev;
5749                 cancel_delayed_work_sync(&ev->hotplug_work);
5750                 instance->ev = NULL;
5751         }
5752
5753         /* cancel all wait events */
5754         wake_up_all(&instance->int_cmd_wait_q);
5755
5756         tasklet_kill(&instance->isr_tasklet);
5757
5758         /*
5759          * Take the instance off the instance array. Note that we will not
5760          * decrement the max_index. We let this array be sparse array
5761          */
5762         for (i = 0; i < megasas_mgmt_info.max_index; i++) {
5763                 if (megasas_mgmt_info.instance[i] == instance) {
5764                         megasas_mgmt_info.count--;
5765                         megasas_mgmt_info.instance[i] = NULL;
5766
5767                         break;
5768                 }
5769         }
5770
5771         instance->instancet->disable_intr(instance);
5772
5773         megasas_destroy_irqs(instance);
5774
5775         if (instance->msix_vectors)
5776                 pci_disable_msix(instance->pdev);
5777
5778         switch (instance->pdev->device) {
5779         case PCI_DEVICE_ID_LSI_FUSION:
5780         case PCI_DEVICE_ID_LSI_PLASMA:
5781         case PCI_DEVICE_ID_LSI_INVADER:
5782         case PCI_DEVICE_ID_LSI_FURY:
5783                 megasas_release_fusion(instance);
5784                 for (i = 0; i < 2 ; i++) {
5785                         if (fusion->ld_map[i])
5786                                 dma_free_coherent(&instance->pdev->dev,
5787                                                   fusion->max_map_sz,
5788                                                   fusion->ld_map[i],
5789                                                   fusion->ld_map_phys[i]);
5790                         if (fusion->ld_drv_map[i])
5791                                 free_pages((ulong)fusion->ld_drv_map[i],
5792                                         fusion->drv_map_pages);
5793                 }
5794                 free_pages((ulong)instance->ctrl_context,
5795                         instance->ctrl_context_pages);
5796                 break;
5797         default:
5798                 megasas_release_mfi(instance);
5799                 pci_free_consistent(pdev, sizeof(u32),
5800                                     instance->producer,
5801                                     instance->producer_h);
5802                 pci_free_consistent(pdev, sizeof(u32),
5803                                     instance->consumer,
5804                                     instance->consumer_h);
5805                 break;
5806         }
5807
5808         kfree(instance->ctrl_info);
5809
5810         if (instance->evt_detail)
5811                 pci_free_consistent(pdev, sizeof(struct megasas_evt_detail),
5812                                 instance->evt_detail, instance->evt_detail_h);
5813
5814         if (instance->vf_affiliation)
5815                 pci_free_consistent(pdev, (MAX_LOGICAL_DRIVES + 1) *
5816                                     sizeof(struct MR_LD_VF_AFFILIATION),
5817                                     instance->vf_affiliation,
5818                                     instance->vf_affiliation_h);
5819
5820         if (instance->vf_affiliation_111)
5821                 pci_free_consistent(pdev,
5822                                     sizeof(struct MR_LD_VF_AFFILIATION_111),
5823                                     instance->vf_affiliation_111,
5824                                     instance->vf_affiliation_111_h);
5825
5826         if (instance->hb_host_mem)
5827                 pci_free_consistent(pdev, sizeof(struct MR_CTRL_HB_HOST_MEM),
5828                                     instance->hb_host_mem,
5829                                     instance->hb_host_mem_h);
5830
5831         if (instance->crash_dump_buf)
5832                 pci_free_consistent(pdev, CRASH_DMA_BUF_SIZE,
5833                             instance->crash_dump_buf, instance->crash_dump_h);
5834
5835         if (instance->system_info_buf)
5836                 pci_free_consistent(pdev, sizeof(struct MR_DRV_SYSTEM_INFO),
5837                                     instance->system_info_buf, instance->system_info_h);
5838
5839         scsi_host_put(host);
5840
5841         pci_disable_device(pdev);
5842
5843         return;
5844 }
5845
5846 /**
5847  * megasas_shutdown -   Shutdown entry point
5848  * @device:             Generic device structure
5849  */
5850 static void megasas_shutdown(struct pci_dev *pdev)
5851 {
5852         struct megasas_instance *instance = pci_get_drvdata(pdev);
5853
5854         instance->unload = 1;
5855         megasas_flush_cache(instance);
5856         megasas_shutdown_controller(instance, MR_DCMD_CTRL_SHUTDOWN);
5857         instance->instancet->disable_intr(instance);
5858         megasas_destroy_irqs(instance);
5859
5860         if (instance->msix_vectors)
5861                 pci_disable_msix(instance->pdev);
5862 }
5863
5864 /**
5865  * megasas_mgmt_open -  char node "open" entry point
5866  */
5867 static int megasas_mgmt_open(struct inode *inode, struct file *filep)
5868 {
5869         /*
5870          * Allow only those users with admin rights
5871          */
5872         if (!capable(CAP_SYS_ADMIN))
5873                 return -EACCES;
5874
5875         return 0;
5876 }
5877
5878 /**
5879  * megasas_mgmt_fasync -        Async notifier registration from applications
5880  *
5881  * This function adds the calling process to a driver global queue. When an
5882  * event occurs, SIGIO will be sent to all processes in this queue.
5883  */
5884 static int megasas_mgmt_fasync(int fd, struct file *filep, int mode)
5885 {
5886         int rc;
5887
5888         mutex_lock(&megasas_async_queue_mutex);
5889
5890         rc = fasync_helper(fd, filep, mode, &megasas_async_queue);
5891
5892         mutex_unlock(&megasas_async_queue_mutex);
5893
5894         if (rc >= 0) {
5895                 /* For sanity check when we get ioctl */
5896                 filep->private_data = filep;
5897                 return 0;
5898         }
5899
5900         printk(KERN_DEBUG "megasas: fasync_helper failed [%d]\n", rc);
5901
5902         return rc;
5903 }
5904
5905 /**
5906  * megasas_mgmt_poll -  char node "poll" entry point
5907  * */
5908 static unsigned int megasas_mgmt_poll(struct file *file, poll_table *wait)
5909 {
5910         unsigned int mask;
5911         unsigned long flags;
5912         poll_wait(file, &megasas_poll_wait, wait);
5913         spin_lock_irqsave(&poll_aen_lock, flags);
5914         if (megasas_poll_wait_aen)
5915                 mask =   (POLLIN | POLLRDNORM);
5916
5917         else
5918                 mask = 0;
5919         megasas_poll_wait_aen = 0;
5920         spin_unlock_irqrestore(&poll_aen_lock, flags);
5921         return mask;
5922 }
5923
5924 /*
5925  * megasas_set_crash_dump_params_ioctl:
5926  *              Send CRASH_DUMP_MODE DCMD to all controllers
5927  * @cmd:        MFI command frame
5928  */
5929
5930 static int megasas_set_crash_dump_params_ioctl(
5931         struct megasas_cmd *cmd)
5932 {
5933         struct megasas_instance *local_instance;
5934         int i, error = 0;
5935         int crash_support;
5936
5937         crash_support = cmd->frame->dcmd.mbox.w[0];
5938
5939         for (i = 0; i < megasas_mgmt_info.max_index; i++) {
5940                 local_instance = megasas_mgmt_info.instance[i];
5941                 if (local_instance && local_instance->crash_dump_drv_support) {
5942                         if ((local_instance->adprecovery ==
5943                                 MEGASAS_HBA_OPERATIONAL) &&
5944                                 !megasas_set_crash_dump_params(local_instance,
5945                                         crash_support)) {
5946                                 local_instance->crash_dump_app_support =
5947                                         crash_support;
5948                                 dev_info(&local_instance->pdev->dev,
5949                                         "Application firmware crash "
5950                                         "dump mode set success\n");
5951                                 error = 0;
5952                         } else {
5953                                 dev_info(&local_instance->pdev->dev,
5954                                         "Application firmware crash "
5955                                         "dump mode set failed\n");
5956                                 error = -1;
5957                         }
5958                 }
5959         }
5960         return error;
5961 }
5962
5963 /**
5964  * megasas_mgmt_fw_ioctl -      Issues management ioctls to FW
5965  * @instance:                   Adapter soft state
5966  * @argp:                       User's ioctl packet
5967  */
5968 static int
5969 megasas_mgmt_fw_ioctl(struct megasas_instance *instance,
5970                       struct megasas_iocpacket __user * user_ioc,
5971                       struct megasas_iocpacket *ioc)
5972 {
5973         struct megasas_sge32 *kern_sge32;
5974         struct megasas_cmd *cmd;
5975         void *kbuff_arr[MAX_IOCTL_SGE];
5976         dma_addr_t buf_handle = 0;
5977         int error = 0, i;
5978         void *sense = NULL;
5979         dma_addr_t sense_handle;
5980         unsigned long *sense_ptr;
5981
5982         memset(kbuff_arr, 0, sizeof(kbuff_arr));
5983
5984         if (ioc->sge_count > MAX_IOCTL_SGE) {
5985                 printk(KERN_DEBUG "megasas: SGE count [%d] >  max limit [%d]\n",
5986                        ioc->sge_count, MAX_IOCTL_SGE);
5987                 return -EINVAL;
5988         }
5989
5990         cmd = megasas_get_cmd(instance);
5991         if (!cmd) {
5992                 printk(KERN_DEBUG "megasas: Failed to get a cmd packet\n");
5993                 return -ENOMEM;
5994         }
5995
5996         /*
5997          * User's IOCTL packet has 2 frames (maximum). Copy those two
5998          * frames into our cmd's frames. cmd->frame's context will get
5999          * overwritten when we copy from user's frames. So set that value
6000          * alone separately
6001          */
6002         memcpy(cmd->frame, ioc->frame.raw, 2 * MEGAMFI_FRAME_SIZE);
6003         cmd->frame->hdr.context = cpu_to_le32(cmd->index);
6004         cmd->frame->hdr.pad_0 = 0;
6005         cmd->frame->hdr.flags &= cpu_to_le16(~(MFI_FRAME_IEEE |
6006                                                MFI_FRAME_SGL64 |
6007                                                MFI_FRAME_SENSE64));
6008
6009         if (cmd->frame->dcmd.opcode == MR_DRIVER_SET_APP_CRASHDUMP_MODE) {
6010                 error = megasas_set_crash_dump_params_ioctl(cmd);
6011                 megasas_return_cmd(instance, cmd);
6012                 return error;
6013         }
6014
6015         /*
6016          * The management interface between applications and the fw uses
6017          * MFI frames. E.g, RAID configuration changes, LD property changes
6018          * etc are accomplishes through different kinds of MFI frames. The
6019          * driver needs to care only about substituting user buffers with
6020          * kernel buffers in SGLs. The location of SGL is embedded in the
6021          * struct iocpacket itself.
6022          */
6023         kern_sge32 = (struct megasas_sge32 *)
6024             ((unsigned long)cmd->frame + ioc->sgl_off);
6025
6026         /*
6027          * For each user buffer, create a mirror buffer and copy in
6028          */
6029         for (i = 0; i < ioc->sge_count; i++) {
6030                 if (!ioc->sgl[i].iov_len)
6031                         continue;
6032
6033                 kbuff_arr[i] = dma_alloc_coherent(&instance->pdev->dev,
6034                                                     ioc->sgl[i].iov_len,
6035                                                     &buf_handle, GFP_KERNEL);
6036                 if (!kbuff_arr[i]) {
6037                         printk(KERN_DEBUG "megasas: Failed to alloc "
6038                                "kernel SGL buffer for IOCTL \n");
6039                         error = -ENOMEM;
6040                         goto out;
6041                 }
6042
6043                 /*
6044                  * We don't change the dma_coherent_mask, so
6045                  * pci_alloc_consistent only returns 32bit addresses
6046                  */
6047                 kern_sge32[i].phys_addr = cpu_to_le32(buf_handle);
6048                 kern_sge32[i].length = cpu_to_le32(ioc->sgl[i].iov_len);
6049
6050                 /*
6051                  * We created a kernel buffer corresponding to the
6052                  * user buffer. Now copy in from the user buffer
6053                  */
6054                 if (copy_from_user(kbuff_arr[i], ioc->sgl[i].iov_base,
6055                                    (u32) (ioc->sgl[i].iov_len))) {
6056                         error = -EFAULT;
6057                         goto out;
6058                 }
6059         }
6060
6061         if (ioc->sense_len) {
6062                 sense = dma_alloc_coherent(&instance->pdev->dev, ioc->sense_len,
6063                                              &sense_handle, GFP_KERNEL);
6064                 if (!sense) {
6065                         error = -ENOMEM;
6066                         goto out;
6067                 }
6068
6069                 sense_ptr =
6070                 (unsigned long *) ((unsigned long)cmd->frame + ioc->sense_off);
6071                 *sense_ptr = cpu_to_le32(sense_handle);
6072         }
6073
6074         /*
6075          * Set the sync_cmd flag so that the ISR knows not to complete this
6076          * cmd to the SCSI mid-layer
6077          */
6078         cmd->sync_cmd = 1;
6079         megasas_issue_blocked_cmd(instance, cmd, 0);
6080         cmd->sync_cmd = 0;
6081
6082         if (instance->unload == 1) {
6083                 dev_info(&instance->pdev->dev, "Driver unload is in progress "
6084                         "don't submit data to application\n");
6085                 goto out;
6086         }
6087         /*
6088          * copy out the kernel buffers to user buffers
6089          */
6090         for (i = 0; i < ioc->sge_count; i++) {
6091                 if (copy_to_user(ioc->sgl[i].iov_base, kbuff_arr[i],
6092                                  ioc->sgl[i].iov_len)) {
6093                         error = -EFAULT;
6094                         goto out;
6095                 }
6096         }
6097
6098         /*
6099          * copy out the sense
6100          */
6101         if (ioc->sense_len) {
6102                 /*
6103                  * sense_ptr points to the location that has the user
6104                  * sense buffer address
6105                  */
6106                 sense_ptr = (unsigned long *) ((unsigned long)ioc->frame.raw +
6107                                 ioc->sense_off);
6108
6109                 if (copy_to_user((void __user *)((unsigned long)(*sense_ptr)),
6110                                  sense, ioc->sense_len)) {
6111                         printk(KERN_ERR "megasas: Failed to copy out to user "
6112                                         "sense data\n");
6113                         error = -EFAULT;
6114                         goto out;
6115                 }
6116         }
6117
6118         /*
6119          * copy the status codes returned by the fw
6120          */
6121         if (copy_to_user(&user_ioc->frame.hdr.cmd_status,
6122                          &cmd->frame->hdr.cmd_status, sizeof(u8))) {
6123                 printk(KERN_DEBUG "megasas: Error copying out cmd_status\n");
6124                 error = -EFAULT;
6125         }
6126
6127       out:
6128         if (sense) {
6129                 dma_free_coherent(&instance->pdev->dev, ioc->sense_len,
6130                                     sense, sense_handle);
6131         }
6132
6133         for (i = 0; i < ioc->sge_count; i++) {
6134                 if (kbuff_arr[i])
6135                         dma_free_coherent(&instance->pdev->dev,
6136                                           le32_to_cpu(kern_sge32[i].length),
6137                                           kbuff_arr[i],
6138                                           le32_to_cpu(kern_sge32[i].phys_addr));
6139                         kbuff_arr[i] = NULL;
6140         }
6141
6142         megasas_return_cmd(instance, cmd);
6143         return error;
6144 }
6145
6146 static int megasas_mgmt_ioctl_fw(struct file *file, unsigned long arg)
6147 {
6148         struct megasas_iocpacket __user *user_ioc =
6149             (struct megasas_iocpacket __user *)arg;
6150         struct megasas_iocpacket *ioc;
6151         struct megasas_instance *instance;
6152         int error;
6153         int i;
6154         unsigned long flags;
6155         u32 wait_time = MEGASAS_RESET_WAIT_TIME;
6156
6157         ioc = kmalloc(sizeof(*ioc), GFP_KERNEL);
6158         if (!ioc)
6159                 return -ENOMEM;
6160
6161         if (copy_from_user(ioc, user_ioc, sizeof(*ioc))) {
6162                 error = -EFAULT;
6163                 goto out_kfree_ioc;
6164         }
6165
6166         instance = megasas_lookup_instance(ioc->host_no);
6167         if (!instance) {
6168                 error = -ENODEV;
6169                 goto out_kfree_ioc;
6170         }
6171
6172         /* Adjust ioctl wait time for VF mode */
6173         if (instance->requestorId)
6174                 wait_time = MEGASAS_ROUTINE_WAIT_TIME_VF;
6175
6176         /* Block ioctls in VF mode */
6177         if (instance->requestorId && !allow_vf_ioctls) {
6178                 error = -ENODEV;
6179                 goto out_kfree_ioc;
6180         }
6181
6182         if (instance->adprecovery == MEGASAS_HW_CRITICAL_ERROR) {
6183                 printk(KERN_ERR "Controller in crit error\n");
6184                 error = -ENODEV;
6185                 goto out_kfree_ioc;
6186         }
6187
6188         if (instance->unload == 1) {
6189                 error = -ENODEV;
6190                 goto out_kfree_ioc;
6191         }
6192
6193         if (down_interruptible(&instance->ioctl_sem)) {
6194                 error = -ERESTARTSYS;
6195                 goto out_kfree_ioc;
6196         }
6197
6198         for (i = 0; i < wait_time; i++) {
6199
6200                 spin_lock_irqsave(&instance->hba_lock, flags);
6201                 if (instance->adprecovery == MEGASAS_HBA_OPERATIONAL) {
6202                         spin_unlock_irqrestore(&instance->hba_lock, flags);
6203                         break;
6204                 }
6205                 spin_unlock_irqrestore(&instance->hba_lock, flags);
6206
6207                 if (!(i % MEGASAS_RESET_NOTICE_INTERVAL)) {
6208                         printk(KERN_NOTICE "megasas: waiting"
6209                                 "for controller reset to finish\n");
6210                 }
6211
6212                 msleep(1000);
6213         }
6214
6215         spin_lock_irqsave(&instance->hba_lock, flags);
6216         if (instance->adprecovery != MEGASAS_HBA_OPERATIONAL) {
6217                 spin_unlock_irqrestore(&instance->hba_lock, flags);
6218
6219                 printk(KERN_ERR "megaraid_sas: timed out while"
6220                         "waiting for HBA to recover\n");
6221                 error = -ENODEV;
6222                 goto out_up;
6223         }
6224         spin_unlock_irqrestore(&instance->hba_lock, flags);
6225
6226         error = megasas_mgmt_fw_ioctl(instance, user_ioc, ioc);
6227       out_up:
6228         up(&instance->ioctl_sem);
6229
6230       out_kfree_ioc:
6231         kfree(ioc);
6232         return error;
6233 }
6234
6235 static int megasas_mgmt_ioctl_aen(struct file *file, unsigned long arg)
6236 {
6237         struct megasas_instance *instance;
6238         struct megasas_aen aen;
6239         int error;
6240         int i;
6241         unsigned long flags;
6242         u32 wait_time = MEGASAS_RESET_WAIT_TIME;
6243
6244         if (file->private_data != file) {
6245                 printk(KERN_DEBUG "megasas: fasync_helper was not "
6246                        "called first\n");
6247                 return -EINVAL;
6248         }
6249
6250         if (copy_from_user(&aen, (void __user *)arg, sizeof(aen)))
6251                 return -EFAULT;
6252
6253         instance = megasas_lookup_instance(aen.host_no);
6254
6255         if (!instance)
6256                 return -ENODEV;
6257
6258         if (instance->adprecovery == MEGASAS_HW_CRITICAL_ERROR) {
6259                 return -ENODEV;
6260         }
6261
6262         if (instance->unload == 1) {
6263                 return -ENODEV;
6264         }
6265
6266         for (i = 0; i < wait_time; i++) {
6267
6268                 spin_lock_irqsave(&instance->hba_lock, flags);
6269                 if (instance->adprecovery == MEGASAS_HBA_OPERATIONAL) {
6270                         spin_unlock_irqrestore(&instance->hba_lock,
6271                                                 flags);
6272                         break;
6273                 }
6274
6275                 spin_unlock_irqrestore(&instance->hba_lock, flags);
6276
6277                 if (!(i % MEGASAS_RESET_NOTICE_INTERVAL)) {
6278                         printk(KERN_NOTICE "megasas: waiting for"
6279                                 "controller reset to finish\n");
6280                 }
6281
6282                 msleep(1000);
6283         }
6284
6285         spin_lock_irqsave(&instance->hba_lock, flags);
6286         if (instance->adprecovery != MEGASAS_HBA_OPERATIONAL) {
6287                 spin_unlock_irqrestore(&instance->hba_lock, flags);
6288                 printk(KERN_ERR "megaraid_sas: timed out while waiting"
6289                                 "for HBA to recover.\n");
6290                 return -ENODEV;
6291         }
6292         spin_unlock_irqrestore(&instance->hba_lock, flags);
6293
6294         mutex_lock(&instance->aen_mutex);
6295         error = megasas_register_aen(instance, aen.seq_num,
6296                                      aen.class_locale_word);
6297         mutex_unlock(&instance->aen_mutex);
6298         return error;
6299 }
6300
6301 /**
6302  * megasas_mgmt_ioctl - char node ioctl entry point
6303  */
6304 static long
6305 megasas_mgmt_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
6306 {
6307         switch (cmd) {
6308         case MEGASAS_IOC_FIRMWARE:
6309                 return megasas_mgmt_ioctl_fw(file, arg);
6310
6311         case MEGASAS_IOC_GET_AEN:
6312                 return megasas_mgmt_ioctl_aen(file, arg);
6313         }
6314
6315         return -ENOTTY;
6316 }
6317
6318 #ifdef CONFIG_COMPAT
6319 static int megasas_mgmt_compat_ioctl_fw(struct file *file, unsigned long arg)
6320 {
6321         struct compat_megasas_iocpacket __user *cioc =
6322             (struct compat_megasas_iocpacket __user *)arg;
6323         struct megasas_iocpacket __user *ioc =
6324             compat_alloc_user_space(sizeof(struct megasas_iocpacket));
6325         int i;
6326         int error = 0;
6327         compat_uptr_t ptr;
6328
6329         if (clear_user(ioc, sizeof(*ioc)))
6330                 return -EFAULT;
6331
6332         if (copy_in_user(&ioc->host_no, &cioc->host_no, sizeof(u16)) ||
6333             copy_in_user(&ioc->sgl_off, &cioc->sgl_off, sizeof(u32)) ||
6334             copy_in_user(&ioc->sense_off, &cioc->sense_off, sizeof(u32)) ||
6335             copy_in_user(&ioc->sense_len, &cioc->sense_len, sizeof(u32)) ||
6336             copy_in_user(ioc->frame.raw, cioc->frame.raw, 128) ||
6337             copy_in_user(&ioc->sge_count, &cioc->sge_count, sizeof(u32)))
6338                 return -EFAULT;
6339
6340         /*
6341          * The sense_ptr is used in megasas_mgmt_fw_ioctl only when
6342          * sense_len is not null, so prepare the 64bit value under
6343          * the same condition.
6344          */
6345         if (ioc->sense_len) {
6346                 void __user **sense_ioc_ptr =
6347                         (void __user **)(ioc->frame.raw + ioc->sense_off);
6348                 compat_uptr_t *sense_cioc_ptr =
6349                         (compat_uptr_t *)(cioc->frame.raw + cioc->sense_off);
6350                 if (get_user(ptr, sense_cioc_ptr) ||
6351                     put_user(compat_ptr(ptr), sense_ioc_ptr))
6352                         return -EFAULT;
6353         }
6354
6355         for (i = 0; i < MAX_IOCTL_SGE; i++) {
6356                 if (get_user(ptr, &cioc->sgl[i].iov_base) ||
6357                     put_user(compat_ptr(ptr), &ioc->sgl[i].iov_base) ||
6358                     copy_in_user(&ioc->sgl[i].iov_len,
6359                                  &cioc->sgl[i].iov_len, sizeof(compat_size_t)))
6360                         return -EFAULT;
6361         }
6362
6363         error = megasas_mgmt_ioctl_fw(file, (unsigned long)ioc);
6364
6365         if (copy_in_user(&cioc->frame.hdr.cmd_status,
6366                          &ioc->frame.hdr.cmd_status, sizeof(u8))) {
6367                 printk(KERN_DEBUG "megasas: error copy_in_user cmd_status\n");
6368                 return -EFAULT;
6369         }
6370         return error;
6371 }
6372
6373 static long
6374 megasas_mgmt_compat_ioctl(struct file *file, unsigned int cmd,
6375                           unsigned long arg)
6376 {
6377         switch (cmd) {
6378         case MEGASAS_IOC_FIRMWARE32:
6379                 return megasas_mgmt_compat_ioctl_fw(file, arg);
6380         case MEGASAS_IOC_GET_AEN:
6381                 return megasas_mgmt_ioctl_aen(file, arg);
6382         }
6383
6384         return -ENOTTY;
6385 }
6386 #endif
6387
6388 /*
6389  * File operations structure for management interface
6390  */
6391 static const struct file_operations megasas_mgmt_fops = {
6392         .owner = THIS_MODULE,
6393         .open = megasas_mgmt_open,
6394         .fasync = megasas_mgmt_fasync,
6395         .unlocked_ioctl = megasas_mgmt_ioctl,
6396         .poll = megasas_mgmt_poll,
6397 #ifdef CONFIG_COMPAT
6398         .compat_ioctl = megasas_mgmt_compat_ioctl,
6399 #endif
6400         .llseek = noop_llseek,
6401 };
6402
6403 /*
6404  * PCI hotplug support registration structure
6405  */
6406 static struct pci_driver megasas_pci_driver = {
6407
6408         .name = "megaraid_sas",
6409         .id_table = megasas_pci_table,
6410         .probe = megasas_probe_one,
6411         .remove = megasas_detach_one,
6412         .suspend = megasas_suspend,
6413         .resume = megasas_resume,
6414         .shutdown = megasas_shutdown,
6415 };
6416
6417 /*
6418  * Sysfs driver attributes
6419  */
6420 static ssize_t megasas_sysfs_show_version(struct device_driver *dd, char *buf)
6421 {
6422         return snprintf(buf, strlen(MEGASAS_VERSION) + 2, "%s\n",
6423                         MEGASAS_VERSION);
6424 }
6425
6426 static DRIVER_ATTR(version, S_IRUGO, megasas_sysfs_show_version, NULL);
6427
6428 static ssize_t
6429 megasas_sysfs_show_release_date(struct device_driver *dd, char *buf)
6430 {
6431         return snprintf(buf, strlen(MEGASAS_RELDATE) + 2, "%s\n",
6432                 MEGASAS_RELDATE);
6433 }
6434
6435 static DRIVER_ATTR(release_date, S_IRUGO, megasas_sysfs_show_release_date, NULL);
6436
6437 static ssize_t
6438 megasas_sysfs_show_support_poll_for_event(struct device_driver *dd, char *buf)
6439 {
6440         return sprintf(buf, "%u\n", support_poll_for_event);
6441 }
6442
6443 static DRIVER_ATTR(support_poll_for_event, S_IRUGO,
6444                         megasas_sysfs_show_support_poll_for_event, NULL);
6445
6446  static ssize_t
6447 megasas_sysfs_show_support_device_change(struct device_driver *dd, char *buf)
6448 {
6449         return sprintf(buf, "%u\n", support_device_change);
6450 }
6451
6452 static DRIVER_ATTR(support_device_change, S_IRUGO,
6453                         megasas_sysfs_show_support_device_change, NULL);
6454
6455 static ssize_t
6456 megasas_sysfs_show_dbg_lvl(struct device_driver *dd, char *buf)
6457 {
6458         return sprintf(buf, "%u\n", megasas_dbg_lvl);
6459 }
6460
6461 static ssize_t
6462 megasas_sysfs_set_dbg_lvl(struct device_driver *dd, const char *buf, size_t count)
6463 {
6464         int retval = count;
6465         if(sscanf(buf,"%u",&megasas_dbg_lvl)<1){
6466                 printk(KERN_ERR "megasas: could not set dbg_lvl\n");
6467                 retval = -EINVAL;
6468         }
6469         return retval;
6470 }
6471
6472 static DRIVER_ATTR(dbg_lvl, S_IRUGO|S_IWUSR, megasas_sysfs_show_dbg_lvl,
6473                 megasas_sysfs_set_dbg_lvl);
6474
6475 static void
6476 megasas_aen_polling(struct work_struct *work)
6477 {
6478         struct megasas_aen_event *ev =
6479                 container_of(work, struct megasas_aen_event, hotplug_work.work);
6480         struct megasas_instance *instance = ev->instance;
6481         union megasas_evt_class_locale class_locale;
6482         struct  Scsi_Host *host;
6483         struct  scsi_device *sdev1;
6484         u16     pd_index = 0;
6485         u16     ld_index = 0;
6486         int     i, j, doscan = 0;
6487         u32 seq_num, wait_time = MEGASAS_RESET_WAIT_TIME;
6488         int error;
6489
6490         if (!instance) {
6491                 printk(KERN_ERR "invalid instance!\n");
6492                 kfree(ev);
6493                 return;
6494         }
6495
6496         /* Adjust event workqueue thread wait time for VF mode */
6497         if (instance->requestorId)
6498                 wait_time = MEGASAS_ROUTINE_WAIT_TIME_VF;
6499
6500         /* Don't run the event workqueue thread if OCR is running */
6501         for (i = 0; i < wait_time; i++) {
6502                 if (instance->adprecovery == MEGASAS_HBA_OPERATIONAL)
6503                         break;
6504                 if (!(i % MEGASAS_RESET_NOTICE_INTERVAL)) {
6505                         printk(KERN_NOTICE "megasas: %s waiting for "
6506                                "controller reset to finish for scsi%d\n",
6507                                __func__, instance->host->host_no);
6508                 }
6509                 msleep(1000);
6510         }
6511
6512         instance->ev = NULL;
6513         host = instance->host;
6514         if (instance->evt_detail) {
6515
6516                 switch (le32_to_cpu(instance->evt_detail->code)) {
6517                 case MR_EVT_PD_INSERTED:
6518                         if (megasas_get_pd_list(instance) == 0) {
6519                         for (i = 0; i < MEGASAS_MAX_PD_CHANNELS; i++) {
6520                                 for (j = 0;
6521                                 j < MEGASAS_MAX_DEV_PER_CHANNEL;
6522                                 j++) {
6523
6524                                 pd_index =
6525                                 (i * MEGASAS_MAX_DEV_PER_CHANNEL) + j;
6526
6527                                 sdev1 =
6528                                 scsi_device_lookup(host, i, j, 0);
6529
6530                                 if (instance->pd_list[pd_index].driveState
6531                                                 == MR_PD_STATE_SYSTEM) {
6532                                                 if (!sdev1) {
6533                                                 scsi_add_device(host, i, j, 0);
6534                                                 }
6535
6536                                         if (sdev1)
6537                                                 scsi_device_put(sdev1);
6538                                         }
6539                                 }
6540                         }
6541                         }
6542                         doscan = 0;
6543                         break;
6544
6545                 case MR_EVT_PD_REMOVED:
6546                         if (megasas_get_pd_list(instance) == 0) {
6547                         for (i = 0; i < MEGASAS_MAX_PD_CHANNELS; i++) {
6548                                 for (j = 0;
6549                                 j < MEGASAS_MAX_DEV_PER_CHANNEL;
6550                                 j++) {
6551
6552                                 pd_index =
6553                                 (i * MEGASAS_MAX_DEV_PER_CHANNEL) + j;
6554
6555                                 sdev1 =
6556                                 scsi_device_lookup(host, i, j, 0);
6557
6558                                 if (instance->pd_list[pd_index].driveState
6559                                         == MR_PD_STATE_SYSTEM) {
6560                                         if (sdev1) {
6561                                                 scsi_device_put(sdev1);
6562                                         }
6563                                 } else {
6564                                         if (sdev1) {
6565                                                 scsi_remove_device(sdev1);
6566                                                 scsi_device_put(sdev1);
6567                                         }
6568                                 }
6569                                 }
6570                         }
6571                         }
6572                         doscan = 0;
6573                         break;
6574
6575                 case MR_EVT_LD_OFFLINE:
6576                 case MR_EVT_CFG_CLEARED:
6577                 case MR_EVT_LD_DELETED:
6578                         if (!instance->requestorId ||
6579                             (instance->requestorId &&
6580                              megasas_get_ld_vf_affiliation(instance, 0))) {
6581                                 if (megasas_ld_list_query(instance,
6582                                                           MR_LD_QUERY_TYPE_EXPOSED_TO_HOST))
6583                                         megasas_get_ld_list(instance);
6584                                 for (i = 0; i < MEGASAS_MAX_LD_CHANNELS; i++) {
6585                                         for (j = 0;
6586                                              j < MEGASAS_MAX_DEV_PER_CHANNEL;
6587                                              j++) {
6588
6589                                                 ld_index =
6590                                                         (i * MEGASAS_MAX_DEV_PER_CHANNEL) + j;
6591
6592                                                 sdev1 = scsi_device_lookup(host, MEGASAS_MAX_PD_CHANNELS + i, j, 0);
6593
6594                                                 if (instance->ld_ids[ld_index]
6595                                                     != 0xff) {
6596                                                         if (sdev1)
6597                                                                 scsi_device_put(sdev1);
6598                                                 } else {
6599                                                         if (sdev1) {
6600                                                                 scsi_remove_device(sdev1);
6601                                                                 scsi_device_put(sdev1);
6602                                                         }
6603                                                 }
6604                                         }
6605                                 }
6606                                 doscan = 0;
6607                         }
6608                         break;
6609                 case MR_EVT_LD_CREATED:
6610                         if (!instance->requestorId ||
6611                             (instance->requestorId &&
6612                              megasas_get_ld_vf_affiliation(instance, 0))) {
6613                                 if (megasas_ld_list_query(instance,
6614                                                           MR_LD_QUERY_TYPE_EXPOSED_TO_HOST))
6615                                         megasas_get_ld_list(instance);
6616                                 for (i = 0; i < MEGASAS_MAX_LD_CHANNELS; i++) {
6617                                         for (j = 0;
6618                                              j < MEGASAS_MAX_DEV_PER_CHANNEL;
6619                                              j++) {
6620                                                 ld_index =
6621                                                         (i * MEGASAS_MAX_DEV_PER_CHANNEL) + j;
6622
6623                                                 sdev1 = scsi_device_lookup(host, MEGASAS_MAX_PD_CHANNELS + i, j, 0);
6624
6625                                                 if (instance->ld_ids[ld_index]
6626                                                     != 0xff) {
6627                                                         if (!sdev1)
6628                                                                 scsi_add_device(host, MEGASAS_MAX_PD_CHANNELS + i, j, 0);
6629                                                 }
6630                                                 if (sdev1)
6631                                                         scsi_device_put(sdev1);
6632                                         }
6633                                 }
6634                                 doscan = 0;
6635                         }
6636                         break;
6637                 case MR_EVT_CTRL_HOST_BUS_SCAN_REQUESTED:
6638                 case MR_EVT_FOREIGN_CFG_IMPORTED:
6639                 case MR_EVT_LD_STATE_CHANGE:
6640                         doscan = 1;
6641                         break;
6642                 default:
6643                         doscan = 0;
6644                         break;
6645                 }
6646         } else {
6647                 printk(KERN_ERR "invalid evt_detail!\n");
6648                 kfree(ev);
6649                 return;
6650         }
6651
6652         if (doscan) {
6653                 printk(KERN_INFO "megaraid_sas: scanning for scsi%d...\n",
6654                        instance->host->host_no);
6655                 if (megasas_get_pd_list(instance) == 0) {
6656                         for (i = 0; i < MEGASAS_MAX_PD_CHANNELS; i++) {
6657                                 for (j = 0; j < MEGASAS_MAX_DEV_PER_CHANNEL; j++) {
6658                                         pd_index = i*MEGASAS_MAX_DEV_PER_CHANNEL + j;
6659                                         sdev1 = scsi_device_lookup(host, i, j, 0);
6660                                         if (instance->pd_list[pd_index].driveState ==
6661                                             MR_PD_STATE_SYSTEM) {
6662                                                 if (!sdev1) {
6663                                                         scsi_add_device(host, i, j, 0);
6664                                                 }
6665                                                 if (sdev1)
6666                                                         scsi_device_put(sdev1);
6667                                         } else {
6668                                                 if (sdev1) {
6669                                                         scsi_remove_device(sdev1);
6670                                                         scsi_device_put(sdev1);
6671                                                 }
6672                                         }
6673                                 }
6674                         }
6675                 }
6676
6677                 if (!instance->requestorId ||
6678                     (instance->requestorId &&
6679                      megasas_get_ld_vf_affiliation(instance, 0))) {
6680                         if (megasas_ld_list_query(instance,
6681                                                   MR_LD_QUERY_TYPE_EXPOSED_TO_HOST))
6682                                 megasas_get_ld_list(instance);
6683                         for (i = 0; i < MEGASAS_MAX_LD_CHANNELS; i++) {
6684                                 for (j = 0; j < MEGASAS_MAX_DEV_PER_CHANNEL;
6685                                      j++) {
6686                                         ld_index =
6687                                                 (i * MEGASAS_MAX_DEV_PER_CHANNEL) + j;
6688
6689                                         sdev1 = scsi_device_lookup(host,
6690                                                                    MEGASAS_MAX_PD_CHANNELS + i, j, 0);
6691                                         if (instance->ld_ids[ld_index]
6692                                             != 0xff) {
6693                                                 if (!sdev1)
6694                                                         scsi_add_device(host, MEGASAS_MAX_PD_CHANNELS + i, j, 0);
6695                                                 else
6696                                                         scsi_device_put(sdev1);
6697                                         } else {
6698                                                 if (sdev1) {
6699                                                         scsi_remove_device(sdev1);
6700                                                         scsi_device_put(sdev1);
6701                                                 }
6702                                         }
6703                                 }
6704                         }
6705                 }
6706         }
6707
6708         if ( instance->aen_cmd != NULL ) {
6709                 kfree(ev);
6710                 return ;
6711         }
6712
6713         seq_num = le32_to_cpu(instance->evt_detail->seq_num) + 1;
6714
6715         /* Register AEN with FW for latest sequence number plus 1 */
6716         class_locale.members.reserved = 0;
6717         class_locale.members.locale = MR_EVT_LOCALE_ALL;
6718         class_locale.members.class = MR_EVT_CLASS_DEBUG;
6719         mutex_lock(&instance->aen_mutex);
6720         error = megasas_register_aen(instance, seq_num,
6721                                         class_locale.word);
6722         mutex_unlock(&instance->aen_mutex);
6723
6724         if (error)
6725                 printk(KERN_ERR "register aen failed error %x\n", error);
6726
6727         kfree(ev);
6728 }
6729
6730 /**
6731  * megasas_init - Driver load entry point
6732  */
6733 static int __init megasas_init(void)
6734 {
6735         int rval;
6736
6737         /*
6738          * Announce driver version and other information
6739          */
6740         pr_info("megasas: %s\n", MEGASAS_VERSION);
6741
6742         spin_lock_init(&poll_aen_lock);
6743
6744         support_poll_for_event = 2;
6745         support_device_change = 1;
6746
6747         memset(&megasas_mgmt_info, 0, sizeof(megasas_mgmt_info));
6748
6749         /*
6750          * Register character device node
6751          */
6752         rval = register_chrdev(0, "megaraid_sas_ioctl", &megasas_mgmt_fops);
6753
6754         if (rval < 0) {
6755                 printk(KERN_DEBUG "megasas: failed to open device node\n");
6756                 return rval;
6757         }
6758
6759         megasas_mgmt_majorno = rval;
6760
6761         /*
6762          * Register ourselves as PCI hotplug module
6763          */
6764         rval = pci_register_driver(&megasas_pci_driver);
6765
6766         if (rval) {
6767                 printk(KERN_DEBUG "megasas: PCI hotplug registration failed \n");
6768                 goto err_pcidrv;
6769         }
6770
6771         rval = driver_create_file(&megasas_pci_driver.driver,
6772                                   &driver_attr_version);
6773         if (rval)
6774                 goto err_dcf_attr_ver;
6775
6776         rval = driver_create_file(&megasas_pci_driver.driver,
6777                                   &driver_attr_release_date);
6778         if (rval)
6779                 goto err_dcf_rel_date;
6780
6781         rval = driver_create_file(&megasas_pci_driver.driver,
6782                                 &driver_attr_support_poll_for_event);
6783         if (rval)
6784                 goto err_dcf_support_poll_for_event;
6785
6786         rval = driver_create_file(&megasas_pci_driver.driver,
6787                                   &driver_attr_dbg_lvl);
6788         if (rval)
6789                 goto err_dcf_dbg_lvl;
6790         rval = driver_create_file(&megasas_pci_driver.driver,
6791                                 &driver_attr_support_device_change);
6792         if (rval)
6793                 goto err_dcf_support_device_change;
6794
6795         return rval;
6796
6797 err_dcf_support_device_change:
6798         driver_remove_file(&megasas_pci_driver.driver,
6799                            &driver_attr_dbg_lvl);
6800 err_dcf_dbg_lvl:
6801         driver_remove_file(&megasas_pci_driver.driver,
6802                         &driver_attr_support_poll_for_event);
6803 err_dcf_support_poll_for_event:
6804         driver_remove_file(&megasas_pci_driver.driver,
6805                            &driver_attr_release_date);
6806 err_dcf_rel_date:
6807         driver_remove_file(&megasas_pci_driver.driver, &driver_attr_version);
6808 err_dcf_attr_ver:
6809         pci_unregister_driver(&megasas_pci_driver);
6810 err_pcidrv:
6811         unregister_chrdev(megasas_mgmt_majorno, "megaraid_sas_ioctl");
6812         return rval;
6813 }
6814
6815 /**
6816  * megasas_exit - Driver unload entry point
6817  */
6818 static void __exit megasas_exit(void)
6819 {
6820         driver_remove_file(&megasas_pci_driver.driver,
6821                            &driver_attr_dbg_lvl);
6822         driver_remove_file(&megasas_pci_driver.driver,
6823                         &driver_attr_support_poll_for_event);
6824         driver_remove_file(&megasas_pci_driver.driver,
6825                         &driver_attr_support_device_change);
6826         driver_remove_file(&megasas_pci_driver.driver,
6827                            &driver_attr_release_date);
6828         driver_remove_file(&megasas_pci_driver.driver, &driver_attr_version);
6829
6830         pci_unregister_driver(&megasas_pci_driver);
6831         unregister_chrdev(megasas_mgmt_majorno, "megaraid_sas_ioctl");
6832 }
6833
6834 module_init(megasas_init);
6835 module_exit(megasas_exit);