[SCSI] megaraid_sas: convert to use the data buffer accessors
[safe/jmp/linux-2.6] / drivers / scsi / megaraid / megaraid_sas.c
1 /*
2  *
3  *              Linux MegaRAID driver for SAS based RAID controllers
4  *
5  * Copyright (c) 2003-2005  LSI Logic Corporation.
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
10  *         2 of the License, or (at your option) any later version.
11  *
12  * FILE         : megaraid_sas.c
13  * Version      : v00.00.03.10-rc5
14  *
15  * Authors:
16  *      (email-id : megaraidlinux@lsi.com)
17  *      Sreenivas Bagalkote
18  *      Sumant Patro
19  *      Bo Yang
20  *
21  * List of supported controllers
22  *
23  * OEM  Product Name                    VID     DID     SSVID   SSID
24  * ---  ------------                    ---     ---     ----    ----
25  */
26
27 #include <linux/kernel.h>
28 #include <linux/types.h>
29 #include <linux/pci.h>
30 #include <linux/list.h>
31 #include <linux/moduleparam.h>
32 #include <linux/module.h>
33 #include <linux/spinlock.h>
34 #include <linux/interrupt.h>
35 #include <linux/delay.h>
36 #include <linux/uio.h>
37 #include <asm/uaccess.h>
38 #include <linux/fs.h>
39 #include <linux/compat.h>
40 #include <linux/blkdev.h>
41 #include <linux/mutex.h>
42
43 #include <scsi/scsi.h>
44 #include <scsi/scsi_cmnd.h>
45 #include <scsi/scsi_device.h>
46 #include <scsi/scsi_host.h>
47 #include "megaraid_sas.h"
48
49 MODULE_LICENSE("GPL");
50 MODULE_VERSION(MEGASAS_VERSION);
51 MODULE_AUTHOR("megaraidlinux@lsi.com");
52 MODULE_DESCRIPTION("LSI Logic MegaRAID SAS Driver");
53
54 /*
55  * PCI ID table for all supported controllers
56  */
57 static struct pci_device_id megasas_pci_table[] = {
58
59         {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1064R)},
60         /* xscale IOP */
61         {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1078R)},
62         /* ppc IOP */
63         {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_VERDE_ZCR)},
64         /* xscale IOP, vega */
65         {PCI_DEVICE(PCI_VENDOR_ID_DELL, PCI_DEVICE_ID_DELL_PERC5)},
66         /* xscale IOP */
67         {}
68 };
69
70 MODULE_DEVICE_TABLE(pci, megasas_pci_table);
71
72 static int megasas_mgmt_majorno;
73 static struct megasas_mgmt_info megasas_mgmt_info;
74 static struct fasync_struct *megasas_async_queue;
75 static DEFINE_MUTEX(megasas_async_queue_mutex);
76
77 static u32 megasas_dbg_lvl;
78
79 /**
80  * megasas_get_cmd -    Get a command from the free pool
81  * @instance:           Adapter soft state
82  *
83  * Returns a free command from the pool
84  */
85 static struct megasas_cmd *megasas_get_cmd(struct megasas_instance
86                                                   *instance)
87 {
88         unsigned long flags;
89         struct megasas_cmd *cmd = NULL;
90
91         spin_lock_irqsave(&instance->cmd_pool_lock, flags);
92
93         if (!list_empty(&instance->cmd_pool)) {
94                 cmd = list_entry((&instance->cmd_pool)->next,
95                                  struct megasas_cmd, list);
96                 list_del_init(&cmd->list);
97         } else {
98                 printk(KERN_ERR "megasas: Command pool empty!\n");
99         }
100
101         spin_unlock_irqrestore(&instance->cmd_pool_lock, flags);
102         return cmd;
103 }
104
105 /**
106  * megasas_return_cmd - Return a cmd to free command pool
107  * @instance:           Adapter soft state
108  * @cmd:                Command packet to be returned to free command pool
109  */
110 static inline void
111 megasas_return_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd)
112 {
113         unsigned long flags;
114
115         spin_lock_irqsave(&instance->cmd_pool_lock, flags);
116
117         cmd->scmd = NULL;
118         list_add_tail(&cmd->list, &instance->cmd_pool);
119
120         spin_unlock_irqrestore(&instance->cmd_pool_lock, flags);
121 }
122
123
124 /**
125 *       The following functions are defined for xscale 
126 *       (deviceid : 1064R, PERC5) controllers
127 */
128
129 /**
130  * megasas_enable_intr_xscale - Enables interrupts
131  * @regs:                       MFI register set
132  */
133 static inline void
134 megasas_enable_intr_xscale(struct megasas_register_set __iomem * regs)
135 {
136         writel(1, &(regs)->outbound_intr_mask);
137
138         /* Dummy readl to force pci flush */
139         readl(&regs->outbound_intr_mask);
140 }
141
142 /**
143  * megasas_disable_intr_xscale -Disables interrupt
144  * @regs:                       MFI register set
145  */
146 static inline void
147 megasas_disable_intr_xscale(struct megasas_register_set __iomem * regs)
148 {
149         u32 mask = 0x1f;
150         writel(mask, &regs->outbound_intr_mask);
151         /* Dummy readl to force pci flush */
152         readl(&regs->outbound_intr_mask);
153 }
154
155 /**
156  * megasas_read_fw_status_reg_xscale - returns the current FW status value
157  * @regs:                       MFI register set
158  */
159 static u32
160 megasas_read_fw_status_reg_xscale(struct megasas_register_set __iomem * regs)
161 {
162         return readl(&(regs)->outbound_msg_0);
163 }
164 /**
165  * megasas_clear_interrupt_xscale -     Check & clear interrupt
166  * @regs:                               MFI register set
167  */
168 static int 
169 megasas_clear_intr_xscale(struct megasas_register_set __iomem * regs)
170 {
171         u32 status;
172         /*
173          * Check if it is our interrupt
174          */
175         status = readl(&regs->outbound_intr_status);
176
177         if (!(status & MFI_OB_INTR_STATUS_MASK)) {
178                 return 1;
179         }
180
181         /*
182          * Clear the interrupt by writing back the same value
183          */
184         writel(status, &regs->outbound_intr_status);
185
186         return 0;
187 }
188
189 /**
190  * megasas_fire_cmd_xscale -    Sends command to the FW
191  * @frame_phys_addr :           Physical address of cmd
192  * @frame_count :               Number of frames for the command
193  * @regs :                      MFI register set
194  */
195 static inline void 
196 megasas_fire_cmd_xscale(dma_addr_t frame_phys_addr,u32 frame_count, struct megasas_register_set __iomem *regs)
197 {
198         writel((frame_phys_addr >> 3)|(frame_count),
199                &(regs)->inbound_queue_port);
200 }
201
202 static struct megasas_instance_template megasas_instance_template_xscale = {
203
204         .fire_cmd = megasas_fire_cmd_xscale,
205         .enable_intr = megasas_enable_intr_xscale,
206         .disable_intr = megasas_disable_intr_xscale,
207         .clear_intr = megasas_clear_intr_xscale,
208         .read_fw_status_reg = megasas_read_fw_status_reg_xscale,
209 };
210
211 /**
212 *       This is the end of set of functions & definitions specific 
213 *       to xscale (deviceid : 1064R, PERC5) controllers
214 */
215
216 /**
217 *       The following functions are defined for ppc (deviceid : 0x60) 
218 *       controllers
219 */
220
221 /**
222  * megasas_enable_intr_ppc -    Enables interrupts
223  * @regs:                       MFI register set
224  */
225 static inline void
226 megasas_enable_intr_ppc(struct megasas_register_set __iomem * regs)
227 {
228         writel(0xFFFFFFFF, &(regs)->outbound_doorbell_clear);
229     
230         writel(~0x80000004, &(regs)->outbound_intr_mask);
231
232         /* Dummy readl to force pci flush */
233         readl(&regs->outbound_intr_mask);
234 }
235
236 /**
237  * megasas_disable_intr_ppc -   Disable interrupt
238  * @regs:                       MFI register set
239  */
240 static inline void
241 megasas_disable_intr_ppc(struct megasas_register_set __iomem * regs)
242 {
243         u32 mask = 0xFFFFFFFF;
244         writel(mask, &regs->outbound_intr_mask);
245         /* Dummy readl to force pci flush */
246         readl(&regs->outbound_intr_mask);
247 }
248
249 /**
250  * megasas_read_fw_status_reg_ppc - returns the current FW status value
251  * @regs:                       MFI register set
252  */
253 static u32
254 megasas_read_fw_status_reg_ppc(struct megasas_register_set __iomem * regs)
255 {
256         return readl(&(regs)->outbound_scratch_pad);
257 }
258
259 /**
260  * megasas_clear_interrupt_ppc -        Check & clear interrupt
261  * @regs:                               MFI register set
262  */
263 static int 
264 megasas_clear_intr_ppc(struct megasas_register_set __iomem * regs)
265 {
266         u32 status;
267         /*
268          * Check if it is our interrupt
269          */
270         status = readl(&regs->outbound_intr_status);
271
272         if (!(status & MFI_REPLY_1078_MESSAGE_INTERRUPT)) {
273                 return 1;
274         }
275
276         /*
277          * Clear the interrupt by writing back the same value
278          */
279         writel(status, &regs->outbound_doorbell_clear);
280
281         return 0;
282 }
283 /**
284  * megasas_fire_cmd_ppc -       Sends command to the FW
285  * @frame_phys_addr :           Physical address of cmd
286  * @frame_count :               Number of frames for the command
287  * @regs :                      MFI register set
288  */
289 static inline void 
290 megasas_fire_cmd_ppc(dma_addr_t frame_phys_addr, u32 frame_count, struct megasas_register_set __iomem *regs)
291 {
292         writel((frame_phys_addr | (frame_count<<1))|1, 
293                         &(regs)->inbound_queue_port);
294 }
295
296 static struct megasas_instance_template megasas_instance_template_ppc = {
297         
298         .fire_cmd = megasas_fire_cmd_ppc,
299         .enable_intr = megasas_enable_intr_ppc,
300         .disable_intr = megasas_disable_intr_ppc,
301         .clear_intr = megasas_clear_intr_ppc,
302         .read_fw_status_reg = megasas_read_fw_status_reg_ppc,
303 };
304
305 /**
306 *       This is the end of set of functions & definitions
307 *       specific to ppc (deviceid : 0x60) controllers
308 */
309
310 /**
311  * megasas_issue_polled -       Issues a polling command
312  * @instance:                   Adapter soft state
313  * @cmd:                        Command packet to be issued 
314  *
315  * For polling, MFI requires the cmd_status to be set to 0xFF before posting.
316  */
317 static int
318 megasas_issue_polled(struct megasas_instance *instance, struct megasas_cmd *cmd)
319 {
320         int i;
321         u32 msecs = MFI_POLL_TIMEOUT_SECS * 1000;
322
323         struct megasas_header *frame_hdr = &cmd->frame->hdr;
324
325         frame_hdr->cmd_status = 0xFF;
326         frame_hdr->flags |= MFI_FRAME_DONT_POST_IN_REPLY_QUEUE;
327
328         /*
329          * Issue the frame using inbound queue port
330          */
331         instance->instancet->fire_cmd(cmd->frame_phys_addr ,0,instance->reg_set);
332
333         /*
334          * Wait for cmd_status to change
335          */
336         for (i = 0; (i < msecs) && (frame_hdr->cmd_status == 0xff); i++) {
337                 rmb();
338                 msleep(1);
339         }
340
341         if (frame_hdr->cmd_status == 0xff)
342                 return -ETIME;
343
344         return 0;
345 }
346
347 /**
348  * megasas_issue_blocked_cmd -  Synchronous wrapper around regular FW cmds
349  * @instance:                   Adapter soft state
350  * @cmd:                        Command to be issued
351  *
352  * This function waits on an event for the command to be returned from ISR.
353  * Max wait time is MEGASAS_INTERNAL_CMD_WAIT_TIME secs
354  * Used to issue ioctl commands.
355  */
356 static int
357 megasas_issue_blocked_cmd(struct megasas_instance *instance,
358                           struct megasas_cmd *cmd)
359 {
360         cmd->cmd_status = ENODATA;
361
362         instance->instancet->fire_cmd(cmd->frame_phys_addr ,0,instance->reg_set);
363
364         wait_event_timeout(instance->int_cmd_wait_q, (cmd->cmd_status != ENODATA),
365                 MEGASAS_INTERNAL_CMD_WAIT_TIME*HZ);
366
367         return 0;
368 }
369
370 /**
371  * megasas_issue_blocked_abort_cmd -    Aborts previously issued cmd
372  * @instance:                           Adapter soft state
373  * @cmd_to_abort:                       Previously issued cmd to be aborted
374  *
375  * MFI firmware can abort previously issued AEN comamnd (automatic event
376  * notification). The megasas_issue_blocked_abort_cmd() issues such abort
377  * cmd and waits for return status.
378  * Max wait time is MEGASAS_INTERNAL_CMD_WAIT_TIME secs
379  */
380 static int
381 megasas_issue_blocked_abort_cmd(struct megasas_instance *instance,
382                                 struct megasas_cmd *cmd_to_abort)
383 {
384         struct megasas_cmd *cmd;
385         struct megasas_abort_frame *abort_fr;
386
387         cmd = megasas_get_cmd(instance);
388
389         if (!cmd)
390                 return -1;
391
392         abort_fr = &cmd->frame->abort;
393
394         /*
395          * Prepare and issue the abort frame
396          */
397         abort_fr->cmd = MFI_CMD_ABORT;
398         abort_fr->cmd_status = 0xFF;
399         abort_fr->flags = 0;
400         abort_fr->abort_context = cmd_to_abort->index;
401         abort_fr->abort_mfi_phys_addr_lo = cmd_to_abort->frame_phys_addr;
402         abort_fr->abort_mfi_phys_addr_hi = 0;
403
404         cmd->sync_cmd = 1;
405         cmd->cmd_status = 0xFF;
406
407         instance->instancet->fire_cmd(cmd->frame_phys_addr ,0,instance->reg_set);
408
409         /*
410          * Wait for this cmd to complete
411          */
412         wait_event_timeout(instance->abort_cmd_wait_q, (cmd->cmd_status != 0xFF),
413                 MEGASAS_INTERNAL_CMD_WAIT_TIME*HZ);
414
415         megasas_return_cmd(instance, cmd);
416         return 0;
417 }
418
419 /**
420  * megasas_make_sgl32 - Prepares 32-bit SGL
421  * @instance:           Adapter soft state
422  * @scp:                SCSI command from the mid-layer
423  * @mfi_sgl:            SGL to be filled in
424  *
425  * If successful, this function returns the number of SG elements. Otherwise,
426  * it returnes -1.
427  */
428 static int
429 megasas_make_sgl32(struct megasas_instance *instance, struct scsi_cmnd *scp,
430                    union megasas_sgl *mfi_sgl)
431 {
432         int i;
433         int sge_count;
434         struct scatterlist *os_sgl;
435
436         sge_count = scsi_dma_map(scp);
437         BUG_ON(sge_count < 0);
438
439         if (sge_count) {
440                 scsi_for_each_sg(scp, os_sgl, sge_count, i) {
441                         mfi_sgl->sge32[i].length = sg_dma_len(os_sgl);
442                         mfi_sgl->sge32[i].phys_addr = sg_dma_address(os_sgl);
443                 }
444         }
445         return sge_count;
446 }
447
448 /**
449  * megasas_make_sgl64 - Prepares 64-bit SGL
450  * @instance:           Adapter soft state
451  * @scp:                SCSI command from the mid-layer
452  * @mfi_sgl:            SGL to be filled in
453  *
454  * If successful, this function returns the number of SG elements. Otherwise,
455  * it returnes -1.
456  */
457 static int
458 megasas_make_sgl64(struct megasas_instance *instance, struct scsi_cmnd *scp,
459                    union megasas_sgl *mfi_sgl)
460 {
461         int i;
462         int sge_count;
463         struct scatterlist *os_sgl;
464
465         sge_count = scsi_dma_map(scp);
466         BUG_ON(sge_count < 0);
467
468         if (sge_count) {
469                 scsi_for_each_sg(scp, os_sgl, sge_count, i) {
470                         mfi_sgl->sge64[i].length = sg_dma_len(os_sgl);
471                         mfi_sgl->sge64[i].phys_addr = sg_dma_address(os_sgl);
472                 }
473         }
474         return sge_count;
475 }
476
477  /**
478  * megasas_get_frame_count - Computes the number of frames
479  * @sge_count           : number of sg elements
480  *
481  * Returns the number of frames required for numnber of sge's (sge_count)
482  */
483
484 static u32 megasas_get_frame_count(u8 sge_count)
485 {
486         int num_cnt;
487         int sge_bytes;
488         u32 sge_sz;
489         u32 frame_count=0;
490
491         sge_sz = (IS_DMA64) ? sizeof(struct megasas_sge64) :
492             sizeof(struct megasas_sge32);
493
494         /*
495         * Main frame can contain 2 SGEs for 64-bit SGLs and
496         * 3 SGEs for 32-bit SGLs
497         */
498         if (IS_DMA64)
499                 num_cnt = sge_count - 2;
500         else
501                 num_cnt = sge_count - 3;
502
503         if(num_cnt>0){
504                 sge_bytes = sge_sz * num_cnt;
505
506                 frame_count = (sge_bytes / MEGAMFI_FRAME_SIZE) +
507                     ((sge_bytes % MEGAMFI_FRAME_SIZE) ? 1 : 0) ;
508         }
509         /* Main frame */
510         frame_count +=1;
511
512         if (frame_count > 7)
513                 frame_count = 8;
514         return frame_count;
515 }
516
517 /**
518  * megasas_build_dcdb - Prepares a direct cdb (DCDB) command
519  * @instance:           Adapter soft state
520  * @scp:                SCSI command
521  * @cmd:                Command to be prepared in
522  *
523  * This function prepares CDB commands. These are typcially pass-through
524  * commands to the devices.
525  */
526 static int
527 megasas_build_dcdb(struct megasas_instance *instance, struct scsi_cmnd *scp,
528                    struct megasas_cmd *cmd)
529 {
530         u32 is_logical;
531         u32 device_id;
532         u16 flags = 0;
533         struct megasas_pthru_frame *pthru;
534
535         is_logical = MEGASAS_IS_LOGICAL(scp);
536         device_id = MEGASAS_DEV_INDEX(instance, scp);
537         pthru = (struct megasas_pthru_frame *)cmd->frame;
538
539         if (scp->sc_data_direction == PCI_DMA_TODEVICE)
540                 flags = MFI_FRAME_DIR_WRITE;
541         else if (scp->sc_data_direction == PCI_DMA_FROMDEVICE)
542                 flags = MFI_FRAME_DIR_READ;
543         else if (scp->sc_data_direction == PCI_DMA_NONE)
544                 flags = MFI_FRAME_DIR_NONE;
545
546         /*
547          * Prepare the DCDB frame
548          */
549         pthru->cmd = (is_logical) ? MFI_CMD_LD_SCSI_IO : MFI_CMD_PD_SCSI_IO;
550         pthru->cmd_status = 0x0;
551         pthru->scsi_status = 0x0;
552         pthru->target_id = device_id;
553         pthru->lun = scp->device->lun;
554         pthru->cdb_len = scp->cmd_len;
555         pthru->timeout = 0;
556         pthru->flags = flags;
557         pthru->data_xfer_len = scsi_bufflen(scp);
558
559         memcpy(pthru->cdb, scp->cmnd, scp->cmd_len);
560
561         /*
562          * Construct SGL
563          */
564         if (IS_DMA64) {
565                 pthru->flags |= MFI_FRAME_SGL64;
566                 pthru->sge_count = megasas_make_sgl64(instance, scp,
567                                                       &pthru->sgl);
568         } else
569                 pthru->sge_count = megasas_make_sgl32(instance, scp,
570                                                       &pthru->sgl);
571
572         /*
573          * Sense info specific
574          */
575         pthru->sense_len = SCSI_SENSE_BUFFERSIZE;
576         pthru->sense_buf_phys_addr_hi = 0;
577         pthru->sense_buf_phys_addr_lo = cmd->sense_phys_addr;
578
579         /*
580          * Compute the total number of frames this command consumes. FW uses
581          * this number to pull sufficient number of frames from host memory.
582          */
583         cmd->frame_count = megasas_get_frame_count(pthru->sge_count);
584
585         return cmd->frame_count;
586 }
587
588 /**
589  * megasas_build_ldio - Prepares IOs to logical devices
590  * @instance:           Adapter soft state
591  * @scp:                SCSI command
592  * @cmd:                Command to to be prepared
593  *
594  * Frames (and accompanying SGLs) for regular SCSI IOs use this function.
595  */
596 static int
597 megasas_build_ldio(struct megasas_instance *instance, struct scsi_cmnd *scp,
598                    struct megasas_cmd *cmd)
599 {
600         u32 device_id;
601         u8 sc = scp->cmnd[0];
602         u16 flags = 0;
603         struct megasas_io_frame *ldio;
604
605         device_id = MEGASAS_DEV_INDEX(instance, scp);
606         ldio = (struct megasas_io_frame *)cmd->frame;
607
608         if (scp->sc_data_direction == PCI_DMA_TODEVICE)
609                 flags = MFI_FRAME_DIR_WRITE;
610         else if (scp->sc_data_direction == PCI_DMA_FROMDEVICE)
611                 flags = MFI_FRAME_DIR_READ;
612
613         /*
614          * Prepare the Logical IO frame: 2nd bit is zero for all read cmds
615          */
616         ldio->cmd = (sc & 0x02) ? MFI_CMD_LD_WRITE : MFI_CMD_LD_READ;
617         ldio->cmd_status = 0x0;
618         ldio->scsi_status = 0x0;
619         ldio->target_id = device_id;
620         ldio->timeout = 0;
621         ldio->reserved_0 = 0;
622         ldio->pad_0 = 0;
623         ldio->flags = flags;
624         ldio->start_lba_hi = 0;
625         ldio->access_byte = (scp->cmd_len != 6) ? scp->cmnd[1] : 0;
626
627         /*
628          * 6-byte READ(0x08) or WRITE(0x0A) cdb
629          */
630         if (scp->cmd_len == 6) {
631                 ldio->lba_count = (u32) scp->cmnd[4];
632                 ldio->start_lba_lo = ((u32) scp->cmnd[1] << 16) |
633                     ((u32) scp->cmnd[2] << 8) | (u32) scp->cmnd[3];
634
635                 ldio->start_lba_lo &= 0x1FFFFF;
636         }
637
638         /*
639          * 10-byte READ(0x28) or WRITE(0x2A) cdb
640          */
641         else if (scp->cmd_len == 10) {
642                 ldio->lba_count = (u32) scp->cmnd[8] |
643                     ((u32) scp->cmnd[7] << 8);
644                 ldio->start_lba_lo = ((u32) scp->cmnd[2] << 24) |
645                     ((u32) scp->cmnd[3] << 16) |
646                     ((u32) scp->cmnd[4] << 8) | (u32) scp->cmnd[5];
647         }
648
649         /*
650          * 12-byte READ(0xA8) or WRITE(0xAA) cdb
651          */
652         else if (scp->cmd_len == 12) {
653                 ldio->lba_count = ((u32) scp->cmnd[6] << 24) |
654                     ((u32) scp->cmnd[7] << 16) |
655                     ((u32) scp->cmnd[8] << 8) | (u32) scp->cmnd[9];
656
657                 ldio->start_lba_lo = ((u32) scp->cmnd[2] << 24) |
658                     ((u32) scp->cmnd[3] << 16) |
659                     ((u32) scp->cmnd[4] << 8) | (u32) scp->cmnd[5];
660         }
661
662         /*
663          * 16-byte READ(0x88) or WRITE(0x8A) cdb
664          */
665         else if (scp->cmd_len == 16) {
666                 ldio->lba_count = ((u32) scp->cmnd[10] << 24) |
667                     ((u32) scp->cmnd[11] << 16) |
668                     ((u32) scp->cmnd[12] << 8) | (u32) scp->cmnd[13];
669
670                 ldio->start_lba_lo = ((u32) scp->cmnd[6] << 24) |
671                     ((u32) scp->cmnd[7] << 16) |
672                     ((u32) scp->cmnd[8] << 8) | (u32) scp->cmnd[9];
673
674                 ldio->start_lba_hi = ((u32) scp->cmnd[2] << 24) |
675                     ((u32) scp->cmnd[3] << 16) |
676                     ((u32) scp->cmnd[4] << 8) | (u32) scp->cmnd[5];
677
678         }
679
680         /*
681          * Construct SGL
682          */
683         if (IS_DMA64) {
684                 ldio->flags |= MFI_FRAME_SGL64;
685                 ldio->sge_count = megasas_make_sgl64(instance, scp, &ldio->sgl);
686         } else
687                 ldio->sge_count = megasas_make_sgl32(instance, scp, &ldio->sgl);
688
689         /*
690          * Sense info specific
691          */
692         ldio->sense_len = SCSI_SENSE_BUFFERSIZE;
693         ldio->sense_buf_phys_addr_hi = 0;
694         ldio->sense_buf_phys_addr_lo = cmd->sense_phys_addr;
695
696         /*
697          * Compute the total number of frames this command consumes. FW uses
698          * this number to pull sufficient number of frames from host memory.
699          */
700         cmd->frame_count = megasas_get_frame_count(ldio->sge_count);
701
702         return cmd->frame_count;
703 }
704
705 /**
706  * megasas_is_ldio -            Checks if the cmd is for logical drive
707  * @scmd:                       SCSI command
708  *      
709  * Called by megasas_queue_command to find out if the command to be queued
710  * is a logical drive command   
711  */
712 static inline int megasas_is_ldio(struct scsi_cmnd *cmd)
713 {
714         if (!MEGASAS_IS_LOGICAL(cmd))
715                 return 0;
716         switch (cmd->cmnd[0]) {
717         case READ_10:
718         case WRITE_10:
719         case READ_12:
720         case WRITE_12:
721         case READ_6:
722         case WRITE_6:
723         case READ_16:
724         case WRITE_16:
725                 return 1;
726         default:
727                 return 0;
728         }
729 }
730
731  /**
732  * megasas_dump_pending_frames -        Dumps the frame address of all pending cmds
733  *                                      in FW
734  * @instance:                           Adapter soft state
735  */
736 static inline void
737 megasas_dump_pending_frames(struct megasas_instance *instance)
738 {
739         struct megasas_cmd *cmd;
740         int i,n;
741         union megasas_sgl *mfi_sgl;
742         struct megasas_io_frame *ldio;
743         struct megasas_pthru_frame *pthru;
744         u32 sgcount;
745         u32 max_cmd = instance->max_fw_cmds;
746
747         printk(KERN_ERR "\nmegasas[%d]: Dumping Frame Phys Address of all pending cmds in FW\n",instance->host->host_no);
748         printk(KERN_ERR "megasas[%d]: Total OS Pending cmds : %d\n",instance->host->host_no,atomic_read(&instance->fw_outstanding));
749         if (IS_DMA64)
750                 printk(KERN_ERR "\nmegasas[%d]: 64 bit SGLs were sent to FW\n",instance->host->host_no);
751         else
752                 printk(KERN_ERR "\nmegasas[%d]: 32 bit SGLs were sent to FW\n",instance->host->host_no);
753
754         printk(KERN_ERR "megasas[%d]: Pending OS cmds in FW : \n",instance->host->host_no);
755         for (i = 0; i < max_cmd; i++) {
756                 cmd = instance->cmd_list[i];
757                 if(!cmd->scmd)
758                         continue;
759                 printk(KERN_ERR "megasas[%d]: Frame addr :0x%08lx : ",instance->host->host_no,(unsigned long)cmd->frame_phys_addr);
760                 if (megasas_is_ldio(cmd->scmd)){
761                         ldio = (struct megasas_io_frame *)cmd->frame;
762                         mfi_sgl = &ldio->sgl;
763                         sgcount = ldio->sge_count;
764                         printk(KERN_ERR "megasas[%d]: frame count : 0x%x, Cmd : 0x%x, Tgt id : 0x%x, lba lo : 0x%x, lba_hi : 0x%x, sense_buf addr : 0x%x,sge count : 0x%x\n",instance->host->host_no, cmd->frame_count,ldio->cmd,ldio->target_id, ldio->start_lba_lo,ldio->start_lba_hi,ldio->sense_buf_phys_addr_lo,sgcount);
765                 }
766                 else {
767                         pthru = (struct megasas_pthru_frame *) cmd->frame;
768                         mfi_sgl = &pthru->sgl;
769                         sgcount = pthru->sge_count;
770                         printk(KERN_ERR "megasas[%d]: frame count : 0x%x, Cmd : 0x%x, Tgt id : 0x%x, lun : 0x%x, cdb_len : 0x%x, data xfer len : 0x%x, sense_buf addr : 0x%x,sge count : 0x%x\n",instance->host->host_no,cmd->frame_count,pthru->cmd,pthru->target_id,pthru->lun,pthru->cdb_len , pthru->data_xfer_len,pthru->sense_buf_phys_addr_lo,sgcount);
771                 }
772         if(megasas_dbg_lvl & MEGASAS_DBG_LVL){
773                 for (n = 0; n < sgcount; n++){
774                         if (IS_DMA64)
775                                 printk(KERN_ERR "megasas: sgl len : 0x%x, sgl addr : 0x%08lx ",mfi_sgl->sge64[n].length , (unsigned long)mfi_sgl->sge64[n].phys_addr) ;
776                         else
777                                 printk(KERN_ERR "megasas: sgl len : 0x%x, sgl addr : 0x%x ",mfi_sgl->sge32[n].length , mfi_sgl->sge32[n].phys_addr) ;
778                         }
779                 }
780                 printk(KERN_ERR "\n");
781         } /*for max_cmd*/
782         printk(KERN_ERR "\nmegasas[%d]: Pending Internal cmds in FW : \n",instance->host->host_no);
783         for (i = 0; i < max_cmd; i++) {
784
785                 cmd = instance->cmd_list[i];
786
787                 if(cmd->sync_cmd == 1){
788                         printk(KERN_ERR "0x%08lx : ", (unsigned long)cmd->frame_phys_addr);
789                 }
790         }
791         printk(KERN_ERR "megasas[%d]: Dumping Done.\n\n",instance->host->host_no);
792 }
793
794 /**
795  * megasas_queue_command -      Queue entry point
796  * @scmd:                       SCSI command to be queued
797  * @done:                       Callback entry point
798  */
799 static int
800 megasas_queue_command(struct scsi_cmnd *scmd, void (*done) (struct scsi_cmnd *))
801 {
802         u32 frame_count;
803         struct megasas_cmd *cmd;
804         struct megasas_instance *instance;
805
806         instance = (struct megasas_instance *)
807             scmd->device->host->hostdata;
808
809         /* Don't process if we have already declared adapter dead */
810         if (instance->hw_crit_error)
811                 return SCSI_MLQUEUE_HOST_BUSY;
812
813         scmd->scsi_done = done;
814         scmd->result = 0;
815
816         if (MEGASAS_IS_LOGICAL(scmd) &&
817             (scmd->device->id >= MEGASAS_MAX_LD || scmd->device->lun)) {
818                 scmd->result = DID_BAD_TARGET << 16;
819                 goto out_done;
820         }
821
822         switch (scmd->cmnd[0]) {
823         case SYNCHRONIZE_CACHE:
824                 /*
825                  * FW takes care of flush cache on its own
826                  * No need to send it down
827                  */
828                 scmd->result = DID_OK << 16;
829                 goto out_done;
830         default:
831                 break;
832         }
833
834         cmd = megasas_get_cmd(instance);
835         if (!cmd)
836                 return SCSI_MLQUEUE_HOST_BUSY;
837
838         /*
839          * Logical drive command
840          */
841         if (megasas_is_ldio(scmd))
842                 frame_count = megasas_build_ldio(instance, scmd, cmd);
843         else
844                 frame_count = megasas_build_dcdb(instance, scmd, cmd);
845
846         if (!frame_count)
847                 goto out_return_cmd;
848
849         cmd->scmd = scmd;
850         scmd->SCp.ptr = (char *)cmd;
851
852         /*
853          * Issue the command to the FW
854          */
855         atomic_inc(&instance->fw_outstanding);
856
857         instance->instancet->fire_cmd(cmd->frame_phys_addr ,cmd->frame_count-1,instance->reg_set);
858
859         return 0;
860
861  out_return_cmd:
862         megasas_return_cmd(instance, cmd);
863  out_done:
864         done(scmd);
865         return 0;
866 }
867
868 static int megasas_slave_configure(struct scsi_device *sdev)
869 {
870         /*
871          * Don't export physical disk devices to the disk driver.
872          *
873          * FIXME: Currently we don't export them to the midlayer at all.
874          *        That will be fixed once LSI engineers have audited the
875          *        firmware for possible issues.
876          */
877         if (sdev->channel < MEGASAS_MAX_PD_CHANNELS && sdev->type == TYPE_DISK)
878                 return -ENXIO;
879
880         /*
881          * The RAID firmware may require extended timeouts.
882          */
883         if (sdev->channel >= MEGASAS_MAX_PD_CHANNELS)
884                 sdev->timeout = MEGASAS_DEFAULT_CMD_TIMEOUT * HZ;
885         return 0;
886 }
887
888 /**
889  * megasas_wait_for_outstanding -       Wait for all outstanding cmds
890  * @instance:                           Adapter soft state
891  *
892  * This function waits for upto MEGASAS_RESET_WAIT_TIME seconds for FW to
893  * complete all its outstanding commands. Returns error if one or more IOs
894  * are pending after this time period. It also marks the controller dead.
895  */
896 static int megasas_wait_for_outstanding(struct megasas_instance *instance)
897 {
898         int i;
899         u32 wait_time = MEGASAS_RESET_WAIT_TIME;
900
901         for (i = 0; i < wait_time; i++) {
902
903                 int outstanding = atomic_read(&instance->fw_outstanding);
904
905                 if (!outstanding)
906                         break;
907
908                 if (!(i % MEGASAS_RESET_NOTICE_INTERVAL)) {
909                         printk(KERN_NOTICE "megasas: [%2d]waiting for %d "
910                                "commands to complete\n",i,outstanding);
911                 }
912
913                 msleep(1000);
914         }
915
916         if (atomic_read(&instance->fw_outstanding)) {
917                 /*
918                 * Send signal to FW to stop processing any pending cmds.
919                 * The controller will be taken offline by the OS now.
920                 */
921                 writel(MFI_STOP_ADP,
922                                 &instance->reg_set->inbound_doorbell);
923                 megasas_dump_pending_frames(instance);
924                 instance->hw_crit_error = 1;
925                 return FAILED;
926         }
927
928         return SUCCESS;
929 }
930
931 /**
932  * megasas_generic_reset -      Generic reset routine
933  * @scmd:                       Mid-layer SCSI command
934  *
935  * This routine implements a generic reset handler for device, bus and host
936  * reset requests. Device, bus and host specific reset handlers can use this
937  * function after they do their specific tasks.
938  */
939 static int megasas_generic_reset(struct scsi_cmnd *scmd)
940 {
941         int ret_val;
942         struct megasas_instance *instance;
943
944         instance = (struct megasas_instance *)scmd->device->host->hostdata;
945
946         scmd_printk(KERN_NOTICE, scmd, "megasas: RESET -%ld cmd=%x retries=%x\n",
947                  scmd->serial_number, scmd->cmnd[0], scmd->retries);
948
949         if (instance->hw_crit_error) {
950                 printk(KERN_ERR "megasas: cannot recover from previous reset "
951                        "failures\n");
952                 return FAILED;
953         }
954
955         ret_val = megasas_wait_for_outstanding(instance);
956         if (ret_val == SUCCESS)
957                 printk(KERN_NOTICE "megasas: reset successful \n");
958         else
959                 printk(KERN_ERR "megasas: failed to do reset\n");
960
961         return ret_val;
962 }
963
964 /**
965  * megasas_reset_timer - quiesce the adapter if required
966  * @scmd:               scsi cmnd
967  *
968  * Sets the FW busy flag and reduces the host->can_queue if the
969  * cmd has not been completed within the timeout period.
970  */
971 static enum
972 scsi_eh_timer_return megasas_reset_timer(struct scsi_cmnd *scmd)
973 {
974         struct megasas_cmd *cmd = (struct megasas_cmd *)scmd->SCp.ptr;
975         struct megasas_instance *instance;
976         unsigned long flags;
977
978         if (time_after(jiffies, scmd->jiffies_at_alloc +
979                                 (MEGASAS_DEFAULT_CMD_TIMEOUT * 2) * HZ)) {
980                 return EH_NOT_HANDLED;
981         }
982
983         instance = cmd->instance;
984         if (!(instance->flag & MEGASAS_FW_BUSY)) {
985                 /* FW is busy, throttle IO */
986                 spin_lock_irqsave(instance->host->host_lock, flags);
987
988                 instance->host->can_queue = 16;
989                 instance->last_time = jiffies;
990                 instance->flag |= MEGASAS_FW_BUSY;
991
992                 spin_unlock_irqrestore(instance->host->host_lock, flags);
993         }
994         return EH_RESET_TIMER;
995 }
996
997 /**
998  * megasas_reset_device -       Device reset handler entry point
999  */
1000 static int megasas_reset_device(struct scsi_cmnd *scmd)
1001 {
1002         int ret;
1003
1004         /*
1005          * First wait for all commands to complete
1006          */
1007         ret = megasas_generic_reset(scmd);
1008
1009         return ret;
1010 }
1011
1012 /**
1013  * megasas_reset_bus_host -     Bus & host reset handler entry point
1014  */
1015 static int megasas_reset_bus_host(struct scsi_cmnd *scmd)
1016 {
1017         int ret;
1018
1019         /*
1020          * First wait for all commands to complete
1021          */
1022         ret = megasas_generic_reset(scmd);
1023
1024         return ret;
1025 }
1026
1027 /**
1028  * megasas_bios_param - Returns disk geometry for a disk
1029  * @sdev:               device handle
1030  * @bdev:               block device
1031  * @capacity:           drive capacity
1032  * @geom:               geometry parameters
1033  */
1034 static int
1035 megasas_bios_param(struct scsi_device *sdev, struct block_device *bdev,
1036                  sector_t capacity, int geom[])
1037 {
1038         int heads;
1039         int sectors;
1040         sector_t cylinders;
1041         unsigned long tmp;
1042         /* Default heads (64) & sectors (32) */
1043         heads = 64;
1044         sectors = 32;
1045
1046         tmp = heads * sectors;
1047         cylinders = capacity;
1048
1049         sector_div(cylinders, tmp);
1050
1051         /*
1052          * Handle extended translation size for logical drives > 1Gb
1053          */
1054
1055         if (capacity >= 0x200000) {
1056                 heads = 255;
1057                 sectors = 63;
1058                 tmp = heads*sectors;
1059                 cylinders = capacity;
1060                 sector_div(cylinders, tmp);
1061         }
1062
1063         geom[0] = heads;
1064         geom[1] = sectors;
1065         geom[2] = cylinders;
1066
1067         return 0;
1068 }
1069
1070 /**
1071  * megasas_service_aen -        Processes an event notification
1072  * @instance:                   Adapter soft state
1073  * @cmd:                        AEN command completed by the ISR
1074  *
1075  * For AEN, driver sends a command down to FW that is held by the FW till an
1076  * event occurs. When an event of interest occurs, FW completes the command
1077  * that it was previously holding.
1078  *
1079  * This routines sends SIGIO signal to processes that have registered with the
1080  * driver for AEN.
1081  */
1082 static void
1083 megasas_service_aen(struct megasas_instance *instance, struct megasas_cmd *cmd)
1084 {
1085         /*
1086          * Don't signal app if it is just an aborted previously registered aen
1087          */
1088         if (!cmd->abort_aen)
1089                 kill_fasync(&megasas_async_queue, SIGIO, POLL_IN);
1090         else
1091                 cmd->abort_aen = 0;
1092
1093         instance->aen_cmd = NULL;
1094         megasas_return_cmd(instance, cmd);
1095 }
1096
1097 /*
1098  * Scsi host template for megaraid_sas driver
1099  */
1100 static struct scsi_host_template megasas_template = {
1101
1102         .module = THIS_MODULE,
1103         .name = "LSI Logic SAS based MegaRAID driver",
1104         .proc_name = "megaraid_sas",
1105         .slave_configure = megasas_slave_configure,
1106         .queuecommand = megasas_queue_command,
1107         .eh_device_reset_handler = megasas_reset_device,
1108         .eh_bus_reset_handler = megasas_reset_bus_host,
1109         .eh_host_reset_handler = megasas_reset_bus_host,
1110         .eh_timed_out = megasas_reset_timer,
1111         .bios_param = megasas_bios_param,
1112         .use_clustering = ENABLE_CLUSTERING,
1113 };
1114
1115 /**
1116  * megasas_complete_int_cmd -   Completes an internal command
1117  * @instance:                   Adapter soft state
1118  * @cmd:                        Command to be completed
1119  *
1120  * The megasas_issue_blocked_cmd() function waits for a command to complete
1121  * after it issues a command. This function wakes up that waiting routine by
1122  * calling wake_up() on the wait queue.
1123  */
1124 static void
1125 megasas_complete_int_cmd(struct megasas_instance *instance,
1126                          struct megasas_cmd *cmd)
1127 {
1128         cmd->cmd_status = cmd->frame->io.cmd_status;
1129
1130         if (cmd->cmd_status == ENODATA) {
1131                 cmd->cmd_status = 0;
1132         }
1133         wake_up(&instance->int_cmd_wait_q);
1134 }
1135
1136 /**
1137  * megasas_complete_abort -     Completes aborting a command
1138  * @instance:                   Adapter soft state
1139  * @cmd:                        Cmd that was issued to abort another cmd
1140  *
1141  * The megasas_issue_blocked_abort_cmd() function waits on abort_cmd_wait_q 
1142  * after it issues an abort on a previously issued command. This function 
1143  * wakes up all functions waiting on the same wait queue.
1144  */
1145 static void
1146 megasas_complete_abort(struct megasas_instance *instance,
1147                        struct megasas_cmd *cmd)
1148 {
1149         if (cmd->sync_cmd) {
1150                 cmd->sync_cmd = 0;
1151                 cmd->cmd_status = 0;
1152                 wake_up(&instance->abort_cmd_wait_q);
1153         }
1154
1155         return;
1156 }
1157
1158 /**
1159  * megasas_complete_cmd -       Completes a command
1160  * @instance:                   Adapter soft state
1161  * @cmd:                        Command to be completed
1162  * @alt_status:                 If non-zero, use this value as status to 
1163  *                              SCSI mid-layer instead of the value returned
1164  *                              by the FW. This should be used if caller wants
1165  *                              an alternate status (as in the case of aborted
1166  *                              commands)
1167  */
1168 static void
1169 megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd,
1170                      u8 alt_status)
1171 {
1172         int exception = 0;
1173         struct megasas_header *hdr = &cmd->frame->hdr;
1174
1175         if (cmd->scmd)
1176                 cmd->scmd->SCp.ptr = NULL;
1177
1178         switch (hdr->cmd) {
1179
1180         case MFI_CMD_PD_SCSI_IO:
1181         case MFI_CMD_LD_SCSI_IO:
1182
1183                 /*
1184                  * MFI_CMD_PD_SCSI_IO and MFI_CMD_LD_SCSI_IO could have been
1185                  * issued either through an IO path or an IOCTL path. If it
1186                  * was via IOCTL, we will send it to internal completion.
1187                  */
1188                 if (cmd->sync_cmd) {
1189                         cmd->sync_cmd = 0;
1190                         megasas_complete_int_cmd(instance, cmd);
1191                         break;
1192                 }
1193
1194         case MFI_CMD_LD_READ:
1195         case MFI_CMD_LD_WRITE:
1196
1197                 if (alt_status) {
1198                         cmd->scmd->result = alt_status << 16;
1199                         exception = 1;
1200                 }
1201
1202                 if (exception) {
1203
1204                         atomic_dec(&instance->fw_outstanding);
1205
1206                         scsi_dma_unmap(cmd->scmd);
1207                         cmd->scmd->scsi_done(cmd->scmd);
1208                         megasas_return_cmd(instance, cmd);
1209
1210                         break;
1211                 }
1212
1213                 switch (hdr->cmd_status) {
1214
1215                 case MFI_STAT_OK:
1216                         cmd->scmd->result = DID_OK << 16;
1217                         break;
1218
1219                 case MFI_STAT_SCSI_IO_FAILED:
1220                 case MFI_STAT_LD_INIT_IN_PROGRESS:
1221                         cmd->scmd->result =
1222                             (DID_ERROR << 16) | hdr->scsi_status;
1223                         break;
1224
1225                 case MFI_STAT_SCSI_DONE_WITH_ERROR:
1226
1227                         cmd->scmd->result = (DID_OK << 16) | hdr->scsi_status;
1228
1229                         if (hdr->scsi_status == SAM_STAT_CHECK_CONDITION) {
1230                                 memset(cmd->scmd->sense_buffer, 0,
1231                                        SCSI_SENSE_BUFFERSIZE);
1232                                 memcpy(cmd->scmd->sense_buffer, cmd->sense,
1233                                        hdr->sense_len);
1234
1235                                 cmd->scmd->result |= DRIVER_SENSE << 24;
1236                         }
1237
1238                         break;
1239
1240                 case MFI_STAT_LD_OFFLINE:
1241                 case MFI_STAT_DEVICE_NOT_FOUND:
1242                         cmd->scmd->result = DID_BAD_TARGET << 16;
1243                         break;
1244
1245                 default:
1246                         printk(KERN_DEBUG "megasas: MFI FW status %#x\n",
1247                                hdr->cmd_status);
1248                         cmd->scmd->result = DID_ERROR << 16;
1249                         break;
1250                 }
1251
1252                 atomic_dec(&instance->fw_outstanding);
1253
1254                 scsi_dma_unmap(cmd->scmd);
1255                 cmd->scmd->scsi_done(cmd->scmd);
1256                 megasas_return_cmd(instance, cmd);
1257
1258                 break;
1259
1260         case MFI_CMD_SMP:
1261         case MFI_CMD_STP:
1262         case MFI_CMD_DCMD:
1263
1264                 /*
1265                  * See if got an event notification
1266                  */
1267                 if (cmd->frame->dcmd.opcode == MR_DCMD_CTRL_EVENT_WAIT)
1268                         megasas_service_aen(instance, cmd);
1269                 else
1270                         megasas_complete_int_cmd(instance, cmd);
1271
1272                 break;
1273
1274         case MFI_CMD_ABORT:
1275                 /*
1276                  * Cmd issued to abort another cmd returned
1277                  */
1278                 megasas_complete_abort(instance, cmd);
1279                 break;
1280
1281         default:
1282                 printk("megasas: Unknown command completed! [0x%X]\n",
1283                        hdr->cmd);
1284                 break;
1285         }
1286 }
1287
1288 /**
1289  * megasas_deplete_reply_queue -        Processes all completed commands
1290  * @instance:                           Adapter soft state
1291  * @alt_status:                         Alternate status to be returned to
1292  *                                      SCSI mid-layer instead of the status
1293  *                                      returned by the FW
1294  */
1295 static int
1296 megasas_deplete_reply_queue(struct megasas_instance *instance, u8 alt_status)
1297 {
1298         /*
1299          * Check if it is our interrupt
1300          * Clear the interrupt 
1301          */
1302         if(instance->instancet->clear_intr(instance->reg_set))
1303                 return IRQ_NONE;
1304
1305         if (instance->hw_crit_error)
1306                 goto out_done;
1307         /*
1308          * Schedule the tasklet for cmd completion
1309          */
1310         tasklet_schedule(&instance->isr_tasklet);
1311 out_done:
1312         return IRQ_HANDLED;
1313 }
1314
1315 /**
1316  * megasas_isr - isr entry point
1317  */
1318 static irqreturn_t megasas_isr(int irq, void *devp)
1319 {
1320         return megasas_deplete_reply_queue((struct megasas_instance *)devp,
1321                                            DID_OK);
1322 }
1323
1324 /**
1325  * megasas_transition_to_ready -        Move the FW to READY state
1326  * @instance:                           Adapter soft state
1327  *
1328  * During the initialization, FW passes can potentially be in any one of
1329  * several possible states. If the FW in operational, waiting-for-handshake
1330  * states, driver must take steps to bring it to ready state. Otherwise, it
1331  * has to wait for the ready state.
1332  */
1333 static int
1334 megasas_transition_to_ready(struct megasas_instance* instance)
1335 {
1336         int i;
1337         u8 max_wait;
1338         u32 fw_state;
1339         u32 cur_state;
1340
1341         fw_state = instance->instancet->read_fw_status_reg(instance->reg_set) & MFI_STATE_MASK;
1342
1343         if (fw_state != MFI_STATE_READY)
1344                 printk(KERN_INFO "megasas: Waiting for FW to come to ready"
1345                        " state\n");
1346
1347         while (fw_state != MFI_STATE_READY) {
1348
1349                 switch (fw_state) {
1350
1351                 case MFI_STATE_FAULT:
1352
1353                         printk(KERN_DEBUG "megasas: FW in FAULT state!!\n");
1354                         return -ENODEV;
1355
1356                 case MFI_STATE_WAIT_HANDSHAKE:
1357                         /*
1358                          * Set the CLR bit in inbound doorbell
1359                          */
1360                         writel(MFI_INIT_CLEAR_HANDSHAKE|MFI_INIT_HOTPLUG,
1361                                 &instance->reg_set->inbound_doorbell);
1362
1363                         max_wait = 2;
1364                         cur_state = MFI_STATE_WAIT_HANDSHAKE;
1365                         break;
1366
1367                 case MFI_STATE_BOOT_MESSAGE_PENDING:
1368                         writel(MFI_INIT_HOTPLUG,
1369                                 &instance->reg_set->inbound_doorbell);
1370
1371                         max_wait = 10;
1372                         cur_state = MFI_STATE_BOOT_MESSAGE_PENDING;
1373                         break;
1374
1375                 case MFI_STATE_OPERATIONAL:
1376                         /*
1377                          * Bring it to READY state; assuming max wait 10 secs
1378                          */
1379                         instance->instancet->disable_intr(instance->reg_set);
1380                         writel(MFI_RESET_FLAGS, &instance->reg_set->inbound_doorbell);
1381
1382                         max_wait = 10;
1383                         cur_state = MFI_STATE_OPERATIONAL;
1384                         break;
1385
1386                 case MFI_STATE_UNDEFINED:
1387                         /*
1388                          * This state should not last for more than 2 seconds
1389                          */
1390                         max_wait = 2;
1391                         cur_state = MFI_STATE_UNDEFINED;
1392                         break;
1393
1394                 case MFI_STATE_BB_INIT:
1395                         max_wait = 2;
1396                         cur_state = MFI_STATE_BB_INIT;
1397                         break;
1398
1399                 case MFI_STATE_FW_INIT:
1400                         max_wait = 20;
1401                         cur_state = MFI_STATE_FW_INIT;
1402                         break;
1403
1404                 case MFI_STATE_FW_INIT_2:
1405                         max_wait = 20;
1406                         cur_state = MFI_STATE_FW_INIT_2;
1407                         break;
1408
1409                 case MFI_STATE_DEVICE_SCAN:
1410                         max_wait = 20;
1411                         cur_state = MFI_STATE_DEVICE_SCAN;
1412                         break;
1413
1414                 case MFI_STATE_FLUSH_CACHE:
1415                         max_wait = 20;
1416                         cur_state = MFI_STATE_FLUSH_CACHE;
1417                         break;
1418
1419                 default:
1420                         printk(KERN_DEBUG "megasas: Unknown state 0x%x\n",
1421                                fw_state);
1422                         return -ENODEV;
1423                 }
1424
1425                 /*
1426                  * The cur_state should not last for more than max_wait secs
1427                  */
1428                 for (i = 0; i < (max_wait * 1000); i++) {
1429                         fw_state = instance->instancet->read_fw_status_reg(instance->reg_set) &  
1430                                         MFI_STATE_MASK ;
1431
1432                         if (fw_state == cur_state) {
1433                                 msleep(1);
1434                         } else
1435                                 break;
1436                 }
1437
1438                 /*
1439                  * Return error if fw_state hasn't changed after max_wait
1440                  */
1441                 if (fw_state == cur_state) {
1442                         printk(KERN_DEBUG "FW state [%d] hasn't changed "
1443                                "in %d secs\n", fw_state, max_wait);
1444                         return -ENODEV;
1445                 }
1446         };
1447         printk(KERN_INFO "megasas: FW now in Ready state\n");
1448
1449         return 0;
1450 }
1451
1452 /**
1453  * megasas_teardown_frame_pool -        Destroy the cmd frame DMA pool
1454  * @instance:                           Adapter soft state
1455  */
1456 static void megasas_teardown_frame_pool(struct megasas_instance *instance)
1457 {
1458         int i;
1459         u32 max_cmd = instance->max_fw_cmds;
1460         struct megasas_cmd *cmd;
1461
1462         if (!instance->frame_dma_pool)
1463                 return;
1464
1465         /*
1466          * Return all frames to pool
1467          */
1468         for (i = 0; i < max_cmd; i++) {
1469
1470                 cmd = instance->cmd_list[i];
1471
1472                 if (cmd->frame)
1473                         pci_pool_free(instance->frame_dma_pool, cmd->frame,
1474                                       cmd->frame_phys_addr);
1475
1476                 if (cmd->sense)
1477                         pci_pool_free(instance->sense_dma_pool, cmd->sense,
1478                                       cmd->sense_phys_addr);
1479         }
1480
1481         /*
1482          * Now destroy the pool itself
1483          */
1484         pci_pool_destroy(instance->frame_dma_pool);
1485         pci_pool_destroy(instance->sense_dma_pool);
1486
1487         instance->frame_dma_pool = NULL;
1488         instance->sense_dma_pool = NULL;
1489 }
1490
1491 /**
1492  * megasas_create_frame_pool -  Creates DMA pool for cmd frames
1493  * @instance:                   Adapter soft state
1494  *
1495  * Each command packet has an embedded DMA memory buffer that is used for
1496  * filling MFI frame and the SG list that immediately follows the frame. This
1497  * function creates those DMA memory buffers for each command packet by using
1498  * PCI pool facility.
1499  */
1500 static int megasas_create_frame_pool(struct megasas_instance *instance)
1501 {
1502         int i;
1503         u32 max_cmd;
1504         u32 sge_sz;
1505         u32 sgl_sz;
1506         u32 total_sz;
1507         u32 frame_count;
1508         struct megasas_cmd *cmd;
1509
1510         max_cmd = instance->max_fw_cmds;
1511
1512         /*
1513          * Size of our frame is 64 bytes for MFI frame, followed by max SG
1514          * elements and finally SCSI_SENSE_BUFFERSIZE bytes for sense buffer
1515          */
1516         sge_sz = (IS_DMA64) ? sizeof(struct megasas_sge64) :
1517             sizeof(struct megasas_sge32);
1518
1519         /*
1520          * Calculated the number of 64byte frames required for SGL
1521          */
1522         sgl_sz = sge_sz * instance->max_num_sge;
1523         frame_count = (sgl_sz + MEGAMFI_FRAME_SIZE - 1) / MEGAMFI_FRAME_SIZE;
1524
1525         /*
1526          * We need one extra frame for the MFI command
1527          */
1528         frame_count++;
1529
1530         total_sz = MEGAMFI_FRAME_SIZE * frame_count;
1531         /*
1532          * Use DMA pool facility provided by PCI layer
1533          */
1534         instance->frame_dma_pool = pci_pool_create("megasas frame pool",
1535                                                    instance->pdev, total_sz, 64,
1536                                                    0);
1537
1538         if (!instance->frame_dma_pool) {
1539                 printk(KERN_DEBUG "megasas: failed to setup frame pool\n");
1540                 return -ENOMEM;
1541         }
1542
1543         instance->sense_dma_pool = pci_pool_create("megasas sense pool",
1544                                                    instance->pdev, 128, 4, 0);
1545
1546         if (!instance->sense_dma_pool) {
1547                 printk(KERN_DEBUG "megasas: failed to setup sense pool\n");
1548
1549                 pci_pool_destroy(instance->frame_dma_pool);
1550                 instance->frame_dma_pool = NULL;
1551
1552                 return -ENOMEM;
1553         }
1554
1555         /*
1556          * Allocate and attach a frame to each of the commands in cmd_list.
1557          * By making cmd->index as the context instead of the &cmd, we can
1558          * always use 32bit context regardless of the architecture
1559          */
1560         for (i = 0; i < max_cmd; i++) {
1561
1562                 cmd = instance->cmd_list[i];
1563
1564                 cmd->frame = pci_pool_alloc(instance->frame_dma_pool,
1565                                             GFP_KERNEL, &cmd->frame_phys_addr);
1566
1567                 cmd->sense = pci_pool_alloc(instance->sense_dma_pool,
1568                                             GFP_KERNEL, &cmd->sense_phys_addr);
1569
1570                 /*
1571                  * megasas_teardown_frame_pool() takes care of freeing
1572                  * whatever has been allocated
1573                  */
1574                 if (!cmd->frame || !cmd->sense) {
1575                         printk(KERN_DEBUG "megasas: pci_pool_alloc failed \n");
1576                         megasas_teardown_frame_pool(instance);
1577                         return -ENOMEM;
1578                 }
1579
1580                 cmd->frame->io.context = cmd->index;
1581         }
1582
1583         return 0;
1584 }
1585
1586 /**
1587  * megasas_free_cmds -  Free all the cmds in the free cmd pool
1588  * @instance:           Adapter soft state
1589  */
1590 static void megasas_free_cmds(struct megasas_instance *instance)
1591 {
1592         int i;
1593         /* First free the MFI frame pool */
1594         megasas_teardown_frame_pool(instance);
1595
1596         /* Free all the commands in the cmd_list */
1597         for (i = 0; i < instance->max_fw_cmds; i++)
1598                 kfree(instance->cmd_list[i]);
1599
1600         /* Free the cmd_list buffer itself */
1601         kfree(instance->cmd_list);
1602         instance->cmd_list = NULL;
1603
1604         INIT_LIST_HEAD(&instance->cmd_pool);
1605 }
1606
1607 /**
1608  * megasas_alloc_cmds - Allocates the command packets
1609  * @instance:           Adapter soft state
1610  *
1611  * Each command that is issued to the FW, whether IO commands from the OS or
1612  * internal commands like IOCTLs, are wrapped in local data structure called
1613  * megasas_cmd. The frame embedded in this megasas_cmd is actually issued to
1614  * the FW.
1615  *
1616  * Each frame has a 32-bit field called context (tag). This context is used
1617  * to get back the megasas_cmd from the frame when a frame gets completed in
1618  * the ISR. Typically the address of the megasas_cmd itself would be used as
1619  * the context. But we wanted to keep the differences between 32 and 64 bit
1620  * systems to the mininum. We always use 32 bit integers for the context. In
1621  * this driver, the 32 bit values are the indices into an array cmd_list.
1622  * This array is used only to look up the megasas_cmd given the context. The
1623  * free commands themselves are maintained in a linked list called cmd_pool.
1624  */
1625 static int megasas_alloc_cmds(struct megasas_instance *instance)
1626 {
1627         int i;
1628         int j;
1629         u32 max_cmd;
1630         struct megasas_cmd *cmd;
1631
1632         max_cmd = instance->max_fw_cmds;
1633
1634         /*
1635          * instance->cmd_list is an array of struct megasas_cmd pointers.
1636          * Allocate the dynamic array first and then allocate individual
1637          * commands.
1638          */
1639         instance->cmd_list = kmalloc(sizeof(struct megasas_cmd *) * max_cmd,
1640                                      GFP_KERNEL);
1641
1642         if (!instance->cmd_list) {
1643                 printk(KERN_DEBUG "megasas: out of memory\n");
1644                 return -ENOMEM;
1645         }
1646
1647         memset(instance->cmd_list, 0, sizeof(struct megasas_cmd *) * max_cmd);
1648
1649         for (i = 0; i < max_cmd; i++) {
1650                 instance->cmd_list[i] = kmalloc(sizeof(struct megasas_cmd),
1651                                                 GFP_KERNEL);
1652
1653                 if (!instance->cmd_list[i]) {
1654
1655                         for (j = 0; j < i; j++)
1656                                 kfree(instance->cmd_list[j]);
1657
1658                         kfree(instance->cmd_list);
1659                         instance->cmd_list = NULL;
1660
1661                         return -ENOMEM;
1662                 }
1663         }
1664
1665         /*
1666          * Add all the commands to command pool (instance->cmd_pool)
1667          */
1668         for (i = 0; i < max_cmd; i++) {
1669                 cmd = instance->cmd_list[i];
1670                 memset(cmd, 0, sizeof(struct megasas_cmd));
1671                 cmd->index = i;
1672                 cmd->instance = instance;
1673
1674                 list_add_tail(&cmd->list, &instance->cmd_pool);
1675         }
1676
1677         /*
1678          * Create a frame pool and assign one frame to each cmd
1679          */
1680         if (megasas_create_frame_pool(instance)) {
1681                 printk(KERN_DEBUG "megasas: Error creating frame DMA pool\n");
1682                 megasas_free_cmds(instance);
1683         }
1684
1685         return 0;
1686 }
1687
1688 /**
1689  * megasas_get_controller_info -        Returns FW's controller structure
1690  * @instance:                           Adapter soft state
1691  * @ctrl_info:                          Controller information structure
1692  *
1693  * Issues an internal command (DCMD) to get the FW's controller structure.
1694  * This information is mainly used to find out the maximum IO transfer per
1695  * command supported by the FW.
1696  */
1697 static int
1698 megasas_get_ctrl_info(struct megasas_instance *instance,
1699                       struct megasas_ctrl_info *ctrl_info)
1700 {
1701         int ret = 0;
1702         struct megasas_cmd *cmd;
1703         struct megasas_dcmd_frame *dcmd;
1704         struct megasas_ctrl_info *ci;
1705         dma_addr_t ci_h = 0;
1706
1707         cmd = megasas_get_cmd(instance);
1708
1709         if (!cmd) {
1710                 printk(KERN_DEBUG "megasas: Failed to get a free cmd\n");
1711                 return -ENOMEM;
1712         }
1713
1714         dcmd = &cmd->frame->dcmd;
1715
1716         ci = pci_alloc_consistent(instance->pdev,
1717                                   sizeof(struct megasas_ctrl_info), &ci_h);
1718
1719         if (!ci) {
1720                 printk(KERN_DEBUG "Failed to alloc mem for ctrl info\n");
1721                 megasas_return_cmd(instance, cmd);
1722                 return -ENOMEM;
1723         }
1724
1725         memset(ci, 0, sizeof(*ci));
1726         memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
1727
1728         dcmd->cmd = MFI_CMD_DCMD;
1729         dcmd->cmd_status = 0xFF;
1730         dcmd->sge_count = 1;
1731         dcmd->flags = MFI_FRAME_DIR_READ;
1732         dcmd->timeout = 0;
1733         dcmd->data_xfer_len = sizeof(struct megasas_ctrl_info);
1734         dcmd->opcode = MR_DCMD_CTRL_GET_INFO;
1735         dcmd->sgl.sge32[0].phys_addr = ci_h;
1736         dcmd->sgl.sge32[0].length = sizeof(struct megasas_ctrl_info);
1737
1738         if (!megasas_issue_polled(instance, cmd)) {
1739                 ret = 0;
1740                 memcpy(ctrl_info, ci, sizeof(struct megasas_ctrl_info));
1741         } else {
1742                 ret = -1;
1743         }
1744
1745         pci_free_consistent(instance->pdev, sizeof(struct megasas_ctrl_info),
1746                             ci, ci_h);
1747
1748         megasas_return_cmd(instance, cmd);
1749         return ret;
1750 }
1751
1752 /**
1753  * megasas_complete_cmd_dpc      -      Returns FW's controller structure
1754  * @instance_addr:                      Address of adapter soft state
1755  *
1756  * Tasklet to complete cmds
1757  */
1758 static void megasas_complete_cmd_dpc(unsigned long instance_addr)
1759 {
1760         u32 producer;
1761         u32 consumer;
1762         u32 context;
1763         struct megasas_cmd *cmd;
1764         struct megasas_instance *instance = (struct megasas_instance *)instance_addr;
1765         unsigned long flags;
1766
1767         /* If we have already declared adapter dead, donot complete cmds */
1768         if (instance->hw_crit_error)
1769                 return;
1770
1771         producer = *instance->producer;
1772         consumer = *instance->consumer;
1773
1774         while (consumer != producer) {
1775                 context = instance->reply_queue[consumer];
1776
1777                 cmd = instance->cmd_list[context];
1778
1779                 megasas_complete_cmd(instance, cmd, DID_OK);
1780
1781                 consumer++;
1782                 if (consumer == (instance->max_fw_cmds + 1)) {
1783                         consumer = 0;
1784                 }
1785         }
1786
1787         *instance->consumer = producer;
1788
1789         /*
1790          * Check if we can restore can_queue
1791          */
1792         if (instance->flag & MEGASAS_FW_BUSY
1793                 && time_after(jiffies, instance->last_time + 5 * HZ)
1794                 && atomic_read(&instance->fw_outstanding) < 17) {
1795
1796                 spin_lock_irqsave(instance->host->host_lock, flags);
1797                 instance->flag &= ~MEGASAS_FW_BUSY;
1798                 instance->host->can_queue =
1799                                 instance->max_fw_cmds - MEGASAS_INT_CMDS;
1800
1801                 spin_unlock_irqrestore(instance->host->host_lock, flags);
1802         }
1803
1804 }
1805
1806 /**
1807  * megasas_init_mfi -   Initializes the FW
1808  * @instance:           Adapter soft state
1809  *
1810  * This is the main function for initializing MFI firmware.
1811  */
1812 static int megasas_init_mfi(struct megasas_instance *instance)
1813 {
1814         u32 context_sz;
1815         u32 reply_q_sz;
1816         u32 max_sectors_1;
1817         u32 max_sectors_2;
1818         struct megasas_register_set __iomem *reg_set;
1819
1820         struct megasas_cmd *cmd;
1821         struct megasas_ctrl_info *ctrl_info;
1822
1823         struct megasas_init_frame *init_frame;
1824         struct megasas_init_queue_info *initq_info;
1825         dma_addr_t init_frame_h;
1826         dma_addr_t initq_info_h;
1827
1828         /*
1829          * Map the message registers
1830          */
1831         instance->base_addr = pci_resource_start(instance->pdev, 0);
1832
1833         if (pci_request_regions(instance->pdev, "megasas: LSI Logic")) {
1834                 printk(KERN_DEBUG "megasas: IO memory region busy!\n");
1835                 return -EBUSY;
1836         }
1837
1838         instance->reg_set = ioremap_nocache(instance->base_addr, 8192);
1839
1840         if (!instance->reg_set) {
1841                 printk(KERN_DEBUG "megasas: Failed to map IO mem\n");
1842                 goto fail_ioremap;
1843         }
1844
1845         reg_set = instance->reg_set;
1846
1847         switch(instance->pdev->device)
1848         {
1849                 case PCI_DEVICE_ID_LSI_SAS1078R:        
1850                         instance->instancet = &megasas_instance_template_ppc;
1851                         break;
1852                 case PCI_DEVICE_ID_LSI_SAS1064R:
1853                 case PCI_DEVICE_ID_DELL_PERC5:
1854                 default:
1855                         instance->instancet = &megasas_instance_template_xscale;
1856                         break;
1857         }
1858
1859         /*
1860          * We expect the FW state to be READY
1861          */
1862         if (megasas_transition_to_ready(instance))
1863                 goto fail_ready_state;
1864
1865         /*
1866          * Get various operational parameters from status register
1867          */
1868         instance->max_fw_cmds = instance->instancet->read_fw_status_reg(reg_set) & 0x00FFFF;
1869         /*
1870          * Reduce the max supported cmds by 1. This is to ensure that the
1871          * reply_q_sz (1 more than the max cmd that driver may send)
1872          * does not exceed max cmds that the FW can support
1873          */
1874         instance->max_fw_cmds = instance->max_fw_cmds-1;
1875         instance->max_num_sge = (instance->instancet->read_fw_status_reg(reg_set) & 0xFF0000) >> 
1876                                         0x10;
1877         /*
1878          * Create a pool of commands
1879          */
1880         if (megasas_alloc_cmds(instance))
1881                 goto fail_alloc_cmds;
1882
1883         /*
1884          * Allocate memory for reply queue. Length of reply queue should
1885          * be _one_ more than the maximum commands handled by the firmware.
1886          *
1887          * Note: When FW completes commands, it places corresponding contex
1888          * values in this circular reply queue. This circular queue is a fairly
1889          * typical producer-consumer queue. FW is the producer (of completed
1890          * commands) and the driver is the consumer.
1891          */
1892         context_sz = sizeof(u32);
1893         reply_q_sz = context_sz * (instance->max_fw_cmds + 1);
1894
1895         instance->reply_queue = pci_alloc_consistent(instance->pdev,
1896                                                      reply_q_sz,
1897                                                      &instance->reply_queue_h);
1898
1899         if (!instance->reply_queue) {
1900                 printk(KERN_DEBUG "megasas: Out of DMA mem for reply queue\n");
1901                 goto fail_reply_queue;
1902         }
1903
1904         /*
1905          * Prepare a init frame. Note the init frame points to queue info
1906          * structure. Each frame has SGL allocated after first 64 bytes. For
1907          * this frame - since we don't need any SGL - we use SGL's space as
1908          * queue info structure
1909          *
1910          * We will not get a NULL command below. We just created the pool.
1911          */
1912         cmd = megasas_get_cmd(instance);
1913
1914         init_frame = (struct megasas_init_frame *)cmd->frame;
1915         initq_info = (struct megasas_init_queue_info *)
1916             ((unsigned long)init_frame + 64);
1917
1918         init_frame_h = cmd->frame_phys_addr;
1919         initq_info_h = init_frame_h + 64;
1920
1921         memset(init_frame, 0, MEGAMFI_FRAME_SIZE);
1922         memset(initq_info, 0, sizeof(struct megasas_init_queue_info));
1923
1924         initq_info->reply_queue_entries = instance->max_fw_cmds + 1;
1925         initq_info->reply_queue_start_phys_addr_lo = instance->reply_queue_h;
1926
1927         initq_info->producer_index_phys_addr_lo = instance->producer_h;
1928         initq_info->consumer_index_phys_addr_lo = instance->consumer_h;
1929
1930         init_frame->cmd = MFI_CMD_INIT;
1931         init_frame->cmd_status = 0xFF;
1932         init_frame->queue_info_new_phys_addr_lo = initq_info_h;
1933
1934         init_frame->data_xfer_len = sizeof(struct megasas_init_queue_info);
1935
1936         /*
1937          * disable the intr before firing the init frame to FW
1938          */
1939         instance->instancet->disable_intr(instance->reg_set);
1940
1941         /*
1942          * Issue the init frame in polled mode
1943          */
1944         if (megasas_issue_polled(instance, cmd)) {
1945                 printk(KERN_DEBUG "megasas: Failed to init firmware\n");
1946                 goto fail_fw_init;
1947         }
1948
1949         megasas_return_cmd(instance, cmd);
1950
1951         ctrl_info = kmalloc(sizeof(struct megasas_ctrl_info), GFP_KERNEL);
1952
1953         /*
1954          * Compute the max allowed sectors per IO: The controller info has two
1955          * limits on max sectors. Driver should use the minimum of these two.
1956          *
1957          * 1 << stripe_sz_ops.min = max sectors per strip
1958          *
1959          * Note that older firmwares ( < FW ver 30) didn't report information
1960          * to calculate max_sectors_1. So the number ended up as zero always.
1961          */
1962         if (ctrl_info && !megasas_get_ctrl_info(instance, ctrl_info)) {
1963
1964                 max_sectors_1 = (1 << ctrl_info->stripe_sz_ops.min) *
1965                     ctrl_info->max_strips_per_io;
1966                 max_sectors_2 = ctrl_info->max_request_size;
1967
1968                 instance->max_sectors_per_req = (max_sectors_1 < max_sectors_2)
1969                     ? max_sectors_1 : max_sectors_2;
1970         } else
1971                 instance->max_sectors_per_req = instance->max_num_sge *
1972                     PAGE_SIZE / 512;
1973
1974         kfree(ctrl_info);
1975
1976         /*
1977         * Setup tasklet for cmd completion
1978         */
1979
1980         tasklet_init(&instance->isr_tasklet, megasas_complete_cmd_dpc,
1981                         (unsigned long)instance);
1982         return 0;
1983
1984       fail_fw_init:
1985         megasas_return_cmd(instance, cmd);
1986
1987         pci_free_consistent(instance->pdev, reply_q_sz,
1988                             instance->reply_queue, instance->reply_queue_h);
1989       fail_reply_queue:
1990         megasas_free_cmds(instance);
1991
1992       fail_alloc_cmds:
1993       fail_ready_state:
1994         iounmap(instance->reg_set);
1995
1996       fail_ioremap:
1997         pci_release_regions(instance->pdev);
1998
1999         return -EINVAL;
2000 }
2001
2002 /**
2003  * megasas_release_mfi -        Reverses the FW initialization
2004  * @intance:                    Adapter soft state
2005  */
2006 static void megasas_release_mfi(struct megasas_instance *instance)
2007 {
2008         u32 reply_q_sz = sizeof(u32) * (instance->max_fw_cmds + 1);
2009
2010         pci_free_consistent(instance->pdev, reply_q_sz,
2011                             instance->reply_queue, instance->reply_queue_h);
2012
2013         megasas_free_cmds(instance);
2014
2015         iounmap(instance->reg_set);
2016
2017         pci_release_regions(instance->pdev);
2018 }
2019
2020 /**
2021  * megasas_get_seq_num -        Gets latest event sequence numbers
2022  * @instance:                   Adapter soft state
2023  * @eli:                        FW event log sequence numbers information
2024  *
2025  * FW maintains a log of all events in a non-volatile area. Upper layers would
2026  * usually find out the latest sequence number of the events, the seq number at
2027  * the boot etc. They would "read" all the events below the latest seq number
2028  * by issuing a direct fw cmd (DCMD). For the future events (beyond latest seq
2029  * number), they would subsribe to AEN (asynchronous event notification) and
2030  * wait for the events to happen.
2031  */
2032 static int
2033 megasas_get_seq_num(struct megasas_instance *instance,
2034                     struct megasas_evt_log_info *eli)
2035 {
2036         struct megasas_cmd *cmd;
2037         struct megasas_dcmd_frame *dcmd;
2038         struct megasas_evt_log_info *el_info;
2039         dma_addr_t el_info_h = 0;
2040
2041         cmd = megasas_get_cmd(instance);
2042
2043         if (!cmd) {
2044                 return -ENOMEM;
2045         }
2046
2047         dcmd = &cmd->frame->dcmd;
2048         el_info = pci_alloc_consistent(instance->pdev,
2049                                        sizeof(struct megasas_evt_log_info),
2050                                        &el_info_h);
2051
2052         if (!el_info) {
2053                 megasas_return_cmd(instance, cmd);
2054                 return -ENOMEM;
2055         }
2056
2057         memset(el_info, 0, sizeof(*el_info));
2058         memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
2059
2060         dcmd->cmd = MFI_CMD_DCMD;
2061         dcmd->cmd_status = 0x0;
2062         dcmd->sge_count = 1;
2063         dcmd->flags = MFI_FRAME_DIR_READ;
2064         dcmd->timeout = 0;
2065         dcmd->data_xfer_len = sizeof(struct megasas_evt_log_info);
2066         dcmd->opcode = MR_DCMD_CTRL_EVENT_GET_INFO;
2067         dcmd->sgl.sge32[0].phys_addr = el_info_h;
2068         dcmd->sgl.sge32[0].length = sizeof(struct megasas_evt_log_info);
2069
2070         megasas_issue_blocked_cmd(instance, cmd);
2071
2072         /*
2073          * Copy the data back into callers buffer
2074          */
2075         memcpy(eli, el_info, sizeof(struct megasas_evt_log_info));
2076
2077         pci_free_consistent(instance->pdev, sizeof(struct megasas_evt_log_info),
2078                             el_info, el_info_h);
2079
2080         megasas_return_cmd(instance, cmd);
2081
2082         return 0;
2083 }
2084
2085 /**
2086  * megasas_register_aen -       Registers for asynchronous event notification
2087  * @instance:                   Adapter soft state
2088  * @seq_num:                    The starting sequence number
2089  * @class_locale:               Class of the event
2090  *
2091  * This function subscribes for AEN for events beyond the @seq_num. It requests
2092  * to be notified if and only if the event is of type @class_locale
2093  */
2094 static int
2095 megasas_register_aen(struct megasas_instance *instance, u32 seq_num,
2096                      u32 class_locale_word)
2097 {
2098         int ret_val;
2099         struct megasas_cmd *cmd;
2100         struct megasas_dcmd_frame *dcmd;
2101         union megasas_evt_class_locale curr_aen;
2102         union megasas_evt_class_locale prev_aen;
2103
2104         /*
2105          * If there an AEN pending already (aen_cmd), check if the
2106          * class_locale of that pending AEN is inclusive of the new
2107          * AEN request we currently have. If it is, then we don't have
2108          * to do anything. In other words, whichever events the current
2109          * AEN request is subscribing to, have already been subscribed
2110          * to.
2111          *
2112          * If the old_cmd is _not_ inclusive, then we have to abort
2113          * that command, form a class_locale that is superset of both
2114          * old and current and re-issue to the FW
2115          */
2116
2117         curr_aen.word = class_locale_word;
2118
2119         if (instance->aen_cmd) {
2120
2121                 prev_aen.word = instance->aen_cmd->frame->dcmd.mbox.w[1];
2122
2123                 /*
2124                  * A class whose enum value is smaller is inclusive of all
2125                  * higher values. If a PROGRESS (= -1) was previously
2126                  * registered, then a new registration requests for higher
2127                  * classes need not be sent to FW. They are automatically
2128                  * included.
2129                  *
2130                  * Locale numbers don't have such hierarchy. They are bitmap
2131                  * values
2132                  */
2133                 if ((prev_aen.members.class <= curr_aen.members.class) &&
2134                     !((prev_aen.members.locale & curr_aen.members.locale) ^
2135                       curr_aen.members.locale)) {
2136                         /*
2137                          * Previously issued event registration includes
2138                          * current request. Nothing to do.
2139                          */
2140                         return 0;
2141                 } else {
2142                         curr_aen.members.locale |= prev_aen.members.locale;
2143
2144                         if (prev_aen.members.class < curr_aen.members.class)
2145                                 curr_aen.members.class = prev_aen.members.class;
2146
2147                         instance->aen_cmd->abort_aen = 1;
2148                         ret_val = megasas_issue_blocked_abort_cmd(instance,
2149                                                                   instance->
2150                                                                   aen_cmd);
2151
2152                         if (ret_val) {
2153                                 printk(KERN_DEBUG "megasas: Failed to abort "
2154                                        "previous AEN command\n");
2155                                 return ret_val;
2156                         }
2157                 }
2158         }
2159
2160         cmd = megasas_get_cmd(instance);
2161
2162         if (!cmd)
2163                 return -ENOMEM;
2164
2165         dcmd = &cmd->frame->dcmd;
2166
2167         memset(instance->evt_detail, 0, sizeof(struct megasas_evt_detail));
2168
2169         /*
2170          * Prepare DCMD for aen registration
2171          */
2172         memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
2173
2174         dcmd->cmd = MFI_CMD_DCMD;
2175         dcmd->cmd_status = 0x0;
2176         dcmd->sge_count = 1;
2177         dcmd->flags = MFI_FRAME_DIR_READ;
2178         dcmd->timeout = 0;
2179         dcmd->data_xfer_len = sizeof(struct megasas_evt_detail);
2180         dcmd->opcode = MR_DCMD_CTRL_EVENT_WAIT;
2181         dcmd->mbox.w[0] = seq_num;
2182         dcmd->mbox.w[1] = curr_aen.word;
2183         dcmd->sgl.sge32[0].phys_addr = (u32) instance->evt_detail_h;
2184         dcmd->sgl.sge32[0].length = sizeof(struct megasas_evt_detail);
2185
2186         /*
2187          * Store reference to the cmd used to register for AEN. When an
2188          * application wants us to register for AEN, we have to abort this
2189          * cmd and re-register with a new EVENT LOCALE supplied by that app
2190          */
2191         instance->aen_cmd = cmd;
2192
2193         /*
2194          * Issue the aen registration frame
2195          */
2196         instance->instancet->fire_cmd(cmd->frame_phys_addr ,0,instance->reg_set);
2197
2198         return 0;
2199 }
2200
2201 /**
2202  * megasas_start_aen -  Subscribes to AEN during driver load time
2203  * @instance:           Adapter soft state
2204  */
2205 static int megasas_start_aen(struct megasas_instance *instance)
2206 {
2207         struct megasas_evt_log_info eli;
2208         union megasas_evt_class_locale class_locale;
2209
2210         /*
2211          * Get the latest sequence number from FW
2212          */
2213         memset(&eli, 0, sizeof(eli));
2214
2215         if (megasas_get_seq_num(instance, &eli))
2216                 return -1;
2217
2218         /*
2219          * Register AEN with FW for latest sequence number plus 1
2220          */
2221         class_locale.members.reserved = 0;
2222         class_locale.members.locale = MR_EVT_LOCALE_ALL;
2223         class_locale.members.class = MR_EVT_CLASS_DEBUG;
2224
2225         return megasas_register_aen(instance, eli.newest_seq_num + 1,
2226                                     class_locale.word);
2227 }
2228
2229 /**
2230  * megasas_io_attach -  Attaches this driver to SCSI mid-layer
2231  * @instance:           Adapter soft state
2232  */
2233 static int megasas_io_attach(struct megasas_instance *instance)
2234 {
2235         struct Scsi_Host *host = instance->host;
2236
2237         /*
2238          * Export parameters required by SCSI mid-layer
2239          */
2240         host->irq = instance->pdev->irq;
2241         host->unique_id = instance->unique_id;
2242         host->can_queue = instance->max_fw_cmds - MEGASAS_INT_CMDS;
2243         host->this_id = instance->init_id;
2244         host->sg_tablesize = instance->max_num_sge;
2245         host->max_sectors = instance->max_sectors_per_req;
2246         host->cmd_per_lun = 128;
2247         host->max_channel = MEGASAS_MAX_CHANNELS - 1;
2248         host->max_id = MEGASAS_MAX_DEV_PER_CHANNEL;
2249         host->max_lun = MEGASAS_MAX_LUN;
2250         host->max_cmd_len = 16;
2251
2252         /*
2253          * Notify the mid-layer about the new controller
2254          */
2255         if (scsi_add_host(host, &instance->pdev->dev)) {
2256                 printk(KERN_DEBUG "megasas: scsi_add_host failed\n");
2257                 return -ENODEV;
2258         }
2259
2260         /*
2261          * Trigger SCSI to scan our drives
2262          */
2263         scsi_scan_host(host);
2264         return 0;
2265 }
2266
2267 /**
2268  * megasas_probe_one -  PCI hotplug entry point
2269  * @pdev:               PCI device structure
2270  * @id:                 PCI ids of supported hotplugged adapter 
2271  */
2272 static int __devinit
2273 megasas_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
2274 {
2275         int rval;
2276         struct Scsi_Host *host;
2277         struct megasas_instance *instance;
2278
2279         /*
2280          * Announce PCI information
2281          */
2282         printk(KERN_INFO "megasas: %#4.04x:%#4.04x:%#4.04x:%#4.04x: ",
2283                pdev->vendor, pdev->device, pdev->subsystem_vendor,
2284                pdev->subsystem_device);
2285
2286         printk("bus %d:slot %d:func %d\n",
2287                pdev->bus->number, PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn));
2288
2289         /*
2290          * PCI prepping: enable device set bus mastering and dma mask
2291          */
2292         rval = pci_enable_device(pdev);
2293
2294         if (rval) {
2295                 return rval;
2296         }
2297
2298         pci_set_master(pdev);
2299
2300         /*
2301          * All our contollers are capable of performing 64-bit DMA
2302          */
2303         if (IS_DMA64) {
2304                 if (pci_set_dma_mask(pdev, DMA_64BIT_MASK) != 0) {
2305
2306                         if (pci_set_dma_mask(pdev, DMA_32BIT_MASK) != 0)
2307                                 goto fail_set_dma_mask;
2308                 }
2309         } else {
2310                 if (pci_set_dma_mask(pdev, DMA_32BIT_MASK) != 0)
2311                         goto fail_set_dma_mask;
2312         }
2313
2314         host = scsi_host_alloc(&megasas_template,
2315                                sizeof(struct megasas_instance));
2316
2317         if (!host) {
2318                 printk(KERN_DEBUG "megasas: scsi_host_alloc failed\n");
2319                 goto fail_alloc_instance;
2320         }
2321
2322         instance = (struct megasas_instance *)host->hostdata;
2323         memset(instance, 0, sizeof(*instance));
2324
2325         instance->producer = pci_alloc_consistent(pdev, sizeof(u32),
2326                                                   &instance->producer_h);
2327         instance->consumer = pci_alloc_consistent(pdev, sizeof(u32),
2328                                                   &instance->consumer_h);
2329
2330         if (!instance->producer || !instance->consumer) {
2331                 printk(KERN_DEBUG "megasas: Failed to allocate memory for "
2332                        "producer, consumer\n");
2333                 goto fail_alloc_dma_buf;
2334         }
2335
2336         *instance->producer = 0;
2337         *instance->consumer = 0;
2338
2339         instance->evt_detail = pci_alloc_consistent(pdev,
2340                                                     sizeof(struct
2341                                                            megasas_evt_detail),
2342                                                     &instance->evt_detail_h);
2343
2344         if (!instance->evt_detail) {
2345                 printk(KERN_DEBUG "megasas: Failed to allocate memory for "
2346                        "event detail structure\n");
2347                 goto fail_alloc_dma_buf;
2348         }
2349
2350         /*
2351          * Initialize locks and queues
2352          */
2353         INIT_LIST_HEAD(&instance->cmd_pool);
2354
2355         atomic_set(&instance->fw_outstanding,0);
2356
2357         init_waitqueue_head(&instance->int_cmd_wait_q);
2358         init_waitqueue_head(&instance->abort_cmd_wait_q);
2359
2360         spin_lock_init(&instance->cmd_pool_lock);
2361
2362         sema_init(&instance->aen_mutex, 1);
2363         sema_init(&instance->ioctl_sem, MEGASAS_INT_CMDS);
2364
2365         /*
2366          * Initialize PCI related and misc parameters
2367          */
2368         instance->pdev = pdev;
2369         instance->host = host;
2370         instance->unique_id = pdev->bus->number << 8 | pdev->devfn;
2371         instance->init_id = MEGASAS_DEFAULT_INIT_ID;
2372
2373         megasas_dbg_lvl = 0;
2374         instance->flag = 0;
2375         instance->last_time = 0;
2376
2377         /*
2378          * Initialize MFI Firmware
2379          */
2380         if (megasas_init_mfi(instance))
2381                 goto fail_init_mfi;
2382
2383         /*
2384          * Register IRQ
2385          */
2386         if (request_irq(pdev->irq, megasas_isr, IRQF_SHARED, "megasas", instance)) {
2387                 printk(KERN_DEBUG "megasas: Failed to register IRQ\n");
2388                 goto fail_irq;
2389         }
2390
2391         instance->instancet->enable_intr(instance->reg_set);
2392
2393         /*
2394          * Store instance in PCI softstate
2395          */
2396         pci_set_drvdata(pdev, instance);
2397
2398         /*
2399          * Add this controller to megasas_mgmt_info structure so that it
2400          * can be exported to management applications
2401          */
2402         megasas_mgmt_info.count++;
2403         megasas_mgmt_info.instance[megasas_mgmt_info.max_index] = instance;
2404         megasas_mgmt_info.max_index++;
2405
2406         /*
2407          * Initiate AEN (Asynchronous Event Notification)
2408          */
2409         if (megasas_start_aen(instance)) {
2410                 printk(KERN_DEBUG "megasas: start aen failed\n");
2411                 goto fail_start_aen;
2412         }
2413
2414         /*
2415          * Register with SCSI mid-layer
2416          */
2417         if (megasas_io_attach(instance))
2418                 goto fail_io_attach;
2419
2420         return 0;
2421
2422       fail_start_aen:
2423       fail_io_attach:
2424         megasas_mgmt_info.count--;
2425         megasas_mgmt_info.instance[megasas_mgmt_info.max_index] = NULL;
2426         megasas_mgmt_info.max_index--;
2427
2428         pci_set_drvdata(pdev, NULL);
2429         instance->instancet->disable_intr(instance->reg_set);
2430         free_irq(instance->pdev->irq, instance);
2431
2432         megasas_release_mfi(instance);
2433
2434       fail_irq:
2435       fail_init_mfi:
2436       fail_alloc_dma_buf:
2437         if (instance->evt_detail)
2438                 pci_free_consistent(pdev, sizeof(struct megasas_evt_detail),
2439                                     instance->evt_detail,
2440                                     instance->evt_detail_h);
2441
2442         if (instance->producer)
2443                 pci_free_consistent(pdev, sizeof(u32), instance->producer,
2444                                     instance->producer_h);
2445         if (instance->consumer)
2446                 pci_free_consistent(pdev, sizeof(u32), instance->consumer,
2447                                     instance->consumer_h);
2448         scsi_host_put(host);
2449
2450       fail_alloc_instance:
2451       fail_set_dma_mask:
2452         pci_disable_device(pdev);
2453
2454         return -ENODEV;
2455 }
2456
2457 /**
2458  * megasas_flush_cache -        Requests FW to flush all its caches
2459  * @instance:                   Adapter soft state
2460  */
2461 static void megasas_flush_cache(struct megasas_instance *instance)
2462 {
2463         struct megasas_cmd *cmd;
2464         struct megasas_dcmd_frame *dcmd;
2465
2466         cmd = megasas_get_cmd(instance);
2467
2468         if (!cmd)
2469                 return;
2470
2471         dcmd = &cmd->frame->dcmd;
2472
2473         memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
2474
2475         dcmd->cmd = MFI_CMD_DCMD;
2476         dcmd->cmd_status = 0x0;
2477         dcmd->sge_count = 0;
2478         dcmd->flags = MFI_FRAME_DIR_NONE;
2479         dcmd->timeout = 0;
2480         dcmd->data_xfer_len = 0;
2481         dcmd->opcode = MR_DCMD_CTRL_CACHE_FLUSH;
2482         dcmd->mbox.b[0] = MR_FLUSH_CTRL_CACHE | MR_FLUSH_DISK_CACHE;
2483
2484         megasas_issue_blocked_cmd(instance, cmd);
2485
2486         megasas_return_cmd(instance, cmd);
2487
2488         return;
2489 }
2490
2491 /**
2492  * megasas_shutdown_controller -        Instructs FW to shutdown the controller
2493  * @instance:                           Adapter soft state
2494  */
2495 static void megasas_shutdown_controller(struct megasas_instance *instance)
2496 {
2497         struct megasas_cmd *cmd;
2498         struct megasas_dcmd_frame *dcmd;
2499
2500         cmd = megasas_get_cmd(instance);
2501
2502         if (!cmd)
2503                 return;
2504
2505         if (instance->aen_cmd)
2506                 megasas_issue_blocked_abort_cmd(instance, instance->aen_cmd);
2507
2508         dcmd = &cmd->frame->dcmd;
2509
2510         memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
2511
2512         dcmd->cmd = MFI_CMD_DCMD;
2513         dcmd->cmd_status = 0x0;
2514         dcmd->sge_count = 0;
2515         dcmd->flags = MFI_FRAME_DIR_NONE;
2516         dcmd->timeout = 0;
2517         dcmd->data_xfer_len = 0;
2518         dcmd->opcode = MR_DCMD_CTRL_SHUTDOWN;
2519
2520         megasas_issue_blocked_cmd(instance, cmd);
2521
2522         megasas_return_cmd(instance, cmd);
2523
2524         return;
2525 }
2526
2527 /**
2528  * megasas_detach_one - PCI hot"un"plug entry point
2529  * @pdev:               PCI device structure
2530  */
2531 static void megasas_detach_one(struct pci_dev *pdev)
2532 {
2533         int i;
2534         struct Scsi_Host *host;
2535         struct megasas_instance *instance;
2536
2537         instance = pci_get_drvdata(pdev);
2538         host = instance->host;
2539
2540         scsi_remove_host(instance->host);
2541         megasas_flush_cache(instance);
2542         megasas_shutdown_controller(instance);
2543         tasklet_kill(&instance->isr_tasklet);
2544
2545         /*
2546          * Take the instance off the instance array. Note that we will not
2547          * decrement the max_index. We let this array be sparse array
2548          */
2549         for (i = 0; i < megasas_mgmt_info.max_index; i++) {
2550                 if (megasas_mgmt_info.instance[i] == instance) {
2551                         megasas_mgmt_info.count--;
2552                         megasas_mgmt_info.instance[i] = NULL;
2553
2554                         break;
2555                 }
2556         }
2557
2558         pci_set_drvdata(instance->pdev, NULL);
2559
2560         instance->instancet->disable_intr(instance->reg_set);
2561
2562         free_irq(instance->pdev->irq, instance);
2563
2564         megasas_release_mfi(instance);
2565
2566         pci_free_consistent(pdev, sizeof(struct megasas_evt_detail),
2567                             instance->evt_detail, instance->evt_detail_h);
2568
2569         pci_free_consistent(pdev, sizeof(u32), instance->producer,
2570                             instance->producer_h);
2571
2572         pci_free_consistent(pdev, sizeof(u32), instance->consumer,
2573                             instance->consumer_h);
2574
2575         scsi_host_put(host);
2576
2577         pci_set_drvdata(pdev, NULL);
2578
2579         pci_disable_device(pdev);
2580
2581         return;
2582 }
2583
2584 /**
2585  * megasas_shutdown -   Shutdown entry point
2586  * @device:             Generic device structure
2587  */
2588 static void megasas_shutdown(struct pci_dev *pdev)
2589 {
2590         struct megasas_instance *instance = pci_get_drvdata(pdev);
2591         megasas_flush_cache(instance);
2592 }
2593
2594 /**
2595  * megasas_mgmt_open -  char node "open" entry point
2596  */
2597 static int megasas_mgmt_open(struct inode *inode, struct file *filep)
2598 {
2599         /*
2600          * Allow only those users with admin rights
2601          */
2602         if (!capable(CAP_SYS_ADMIN))
2603                 return -EACCES;
2604
2605         return 0;
2606 }
2607
2608 /**
2609  * megasas_mgmt_release - char node "release" entry point
2610  */
2611 static int megasas_mgmt_release(struct inode *inode, struct file *filep)
2612 {
2613         filep->private_data = NULL;
2614         fasync_helper(-1, filep, 0, &megasas_async_queue);
2615
2616         return 0;
2617 }
2618
2619 /**
2620  * megasas_mgmt_fasync -        Async notifier registration from applications
2621  *
2622  * This function adds the calling process to a driver global queue. When an
2623  * event occurs, SIGIO will be sent to all processes in this queue.
2624  */
2625 static int megasas_mgmt_fasync(int fd, struct file *filep, int mode)
2626 {
2627         int rc;
2628
2629         mutex_lock(&megasas_async_queue_mutex);
2630
2631         rc = fasync_helper(fd, filep, mode, &megasas_async_queue);
2632
2633         mutex_unlock(&megasas_async_queue_mutex);
2634
2635         if (rc >= 0) {
2636                 /* For sanity check when we get ioctl */
2637                 filep->private_data = filep;
2638                 return 0;
2639         }
2640
2641         printk(KERN_DEBUG "megasas: fasync_helper failed [%d]\n", rc);
2642
2643         return rc;
2644 }
2645
2646 /**
2647  * megasas_mgmt_fw_ioctl -      Issues management ioctls to FW
2648  * @instance:                   Adapter soft state
2649  * @argp:                       User's ioctl packet
2650  */
2651 static int
2652 megasas_mgmt_fw_ioctl(struct megasas_instance *instance,
2653                       struct megasas_iocpacket __user * user_ioc,
2654                       struct megasas_iocpacket *ioc)
2655 {
2656         struct megasas_sge32 *kern_sge32;
2657         struct megasas_cmd *cmd;
2658         void *kbuff_arr[MAX_IOCTL_SGE];
2659         dma_addr_t buf_handle = 0;
2660         int error = 0, i;
2661         void *sense = NULL;
2662         dma_addr_t sense_handle;
2663         u32 *sense_ptr;
2664
2665         memset(kbuff_arr, 0, sizeof(kbuff_arr));
2666
2667         if (ioc->sge_count > MAX_IOCTL_SGE) {
2668                 printk(KERN_DEBUG "megasas: SGE count [%d] >  max limit [%d]\n",
2669                        ioc->sge_count, MAX_IOCTL_SGE);
2670                 return -EINVAL;
2671         }
2672
2673         cmd = megasas_get_cmd(instance);
2674         if (!cmd) {
2675                 printk(KERN_DEBUG "megasas: Failed to get a cmd packet\n");
2676                 return -ENOMEM;
2677         }
2678
2679         /*
2680          * User's IOCTL packet has 2 frames (maximum). Copy those two
2681          * frames into our cmd's frames. cmd->frame's context will get
2682          * overwritten when we copy from user's frames. So set that value
2683          * alone separately
2684          */
2685         memcpy(cmd->frame, ioc->frame.raw, 2 * MEGAMFI_FRAME_SIZE);
2686         cmd->frame->hdr.context = cmd->index;
2687
2688         /*
2689          * The management interface between applications and the fw uses
2690          * MFI frames. E.g, RAID configuration changes, LD property changes
2691          * etc are accomplishes through different kinds of MFI frames. The
2692          * driver needs to care only about substituting user buffers with
2693          * kernel buffers in SGLs. The location of SGL is embedded in the
2694          * struct iocpacket itself.
2695          */
2696         kern_sge32 = (struct megasas_sge32 *)
2697             ((unsigned long)cmd->frame + ioc->sgl_off);
2698
2699         /*
2700          * For each user buffer, create a mirror buffer and copy in
2701          */
2702         for (i = 0; i < ioc->sge_count; i++) {
2703                 kbuff_arr[i] = dma_alloc_coherent(&instance->pdev->dev,
2704                                                     ioc->sgl[i].iov_len,
2705                                                     &buf_handle, GFP_KERNEL);
2706                 if (!kbuff_arr[i]) {
2707                         printk(KERN_DEBUG "megasas: Failed to alloc "
2708                                "kernel SGL buffer for IOCTL \n");
2709                         error = -ENOMEM;
2710                         goto out;
2711                 }
2712
2713                 /*
2714                  * We don't change the dma_coherent_mask, so
2715                  * pci_alloc_consistent only returns 32bit addresses
2716                  */
2717                 kern_sge32[i].phys_addr = (u32) buf_handle;
2718                 kern_sge32[i].length = ioc->sgl[i].iov_len;
2719
2720                 /*
2721                  * We created a kernel buffer corresponding to the
2722                  * user buffer. Now copy in from the user buffer
2723                  */
2724                 if (copy_from_user(kbuff_arr[i], ioc->sgl[i].iov_base,
2725                                    (u32) (ioc->sgl[i].iov_len))) {
2726                         error = -EFAULT;
2727                         goto out;
2728                 }
2729         }
2730
2731         if (ioc->sense_len) {
2732                 sense = dma_alloc_coherent(&instance->pdev->dev, ioc->sense_len,
2733                                              &sense_handle, GFP_KERNEL);
2734                 if (!sense) {
2735                         error = -ENOMEM;
2736                         goto out;
2737                 }
2738
2739                 sense_ptr =
2740                     (u32 *) ((unsigned long)cmd->frame + ioc->sense_off);
2741                 *sense_ptr = sense_handle;
2742         }
2743
2744         /*
2745          * Set the sync_cmd flag so that the ISR knows not to complete this
2746          * cmd to the SCSI mid-layer
2747          */
2748         cmd->sync_cmd = 1;
2749         megasas_issue_blocked_cmd(instance, cmd);
2750         cmd->sync_cmd = 0;
2751
2752         /*
2753          * copy out the kernel buffers to user buffers
2754          */
2755         for (i = 0; i < ioc->sge_count; i++) {
2756                 if (copy_to_user(ioc->sgl[i].iov_base, kbuff_arr[i],
2757                                  ioc->sgl[i].iov_len)) {
2758                         error = -EFAULT;
2759                         goto out;
2760                 }
2761         }
2762
2763         /*
2764          * copy out the sense
2765          */
2766         if (ioc->sense_len) {
2767                 /*
2768                  * sense_ptr points to the location that has the user
2769                  * sense buffer address
2770                  */
2771                 sense_ptr = (u32 *) ((unsigned long)ioc->frame.raw +
2772                                      ioc->sense_off);
2773
2774                 if (copy_to_user((void __user *)((unsigned long)(*sense_ptr)),
2775                                  sense, ioc->sense_len)) {
2776                         error = -EFAULT;
2777                         goto out;
2778                 }
2779         }
2780
2781         /*
2782          * copy the status codes returned by the fw
2783          */
2784         if (copy_to_user(&user_ioc->frame.hdr.cmd_status,
2785                          &cmd->frame->hdr.cmd_status, sizeof(u8))) {
2786                 printk(KERN_DEBUG "megasas: Error copying out cmd_status\n");
2787                 error = -EFAULT;
2788         }
2789
2790       out:
2791         if (sense) {
2792                 dma_free_coherent(&instance->pdev->dev, ioc->sense_len,
2793                                     sense, sense_handle);
2794         }
2795
2796         for (i = 0; i < ioc->sge_count && kbuff_arr[i]; i++) {
2797                 dma_free_coherent(&instance->pdev->dev,
2798                                     kern_sge32[i].length,
2799                                     kbuff_arr[i], kern_sge32[i].phys_addr);
2800         }
2801
2802         megasas_return_cmd(instance, cmd);
2803         return error;
2804 }
2805
2806 static struct megasas_instance *megasas_lookup_instance(u16 host_no)
2807 {
2808         int i;
2809
2810         for (i = 0; i < megasas_mgmt_info.max_index; i++) {
2811
2812                 if ((megasas_mgmt_info.instance[i]) &&
2813                     (megasas_mgmt_info.instance[i]->host->host_no == host_no))
2814                         return megasas_mgmt_info.instance[i];
2815         }
2816
2817         return NULL;
2818 }
2819
2820 static int megasas_mgmt_ioctl_fw(struct file *file, unsigned long arg)
2821 {
2822         struct megasas_iocpacket __user *user_ioc =
2823             (struct megasas_iocpacket __user *)arg;
2824         struct megasas_iocpacket *ioc;
2825         struct megasas_instance *instance;
2826         int error;
2827
2828         ioc = kmalloc(sizeof(*ioc), GFP_KERNEL);
2829         if (!ioc)
2830                 return -ENOMEM;
2831
2832         if (copy_from_user(ioc, user_ioc, sizeof(*ioc))) {
2833                 error = -EFAULT;
2834                 goto out_kfree_ioc;
2835         }
2836
2837         instance = megasas_lookup_instance(ioc->host_no);
2838         if (!instance) {
2839                 error = -ENODEV;
2840                 goto out_kfree_ioc;
2841         }
2842
2843         /*
2844          * We will allow only MEGASAS_INT_CMDS number of parallel ioctl cmds
2845          */
2846         if (down_interruptible(&instance->ioctl_sem)) {
2847                 error = -ERESTARTSYS;
2848                 goto out_kfree_ioc;
2849         }
2850         error = megasas_mgmt_fw_ioctl(instance, user_ioc, ioc);
2851         up(&instance->ioctl_sem);
2852
2853       out_kfree_ioc:
2854         kfree(ioc);
2855         return error;
2856 }
2857
2858 static int megasas_mgmt_ioctl_aen(struct file *file, unsigned long arg)
2859 {
2860         struct megasas_instance *instance;
2861         struct megasas_aen aen;
2862         int error;
2863
2864         if (file->private_data != file) {
2865                 printk(KERN_DEBUG "megasas: fasync_helper was not "
2866                        "called first\n");
2867                 return -EINVAL;
2868         }
2869
2870         if (copy_from_user(&aen, (void __user *)arg, sizeof(aen)))
2871                 return -EFAULT;
2872
2873         instance = megasas_lookup_instance(aen.host_no);
2874
2875         if (!instance)
2876                 return -ENODEV;
2877
2878         down(&instance->aen_mutex);
2879         error = megasas_register_aen(instance, aen.seq_num,
2880                                      aen.class_locale_word);
2881         up(&instance->aen_mutex);
2882         return error;
2883 }
2884
2885 /**
2886  * megasas_mgmt_ioctl - char node ioctl entry point
2887  */
2888 static long
2889 megasas_mgmt_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
2890 {
2891         switch (cmd) {
2892         case MEGASAS_IOC_FIRMWARE:
2893                 return megasas_mgmt_ioctl_fw(file, arg);
2894
2895         case MEGASAS_IOC_GET_AEN:
2896                 return megasas_mgmt_ioctl_aen(file, arg);
2897         }
2898
2899         return -ENOTTY;
2900 }
2901
2902 #ifdef CONFIG_COMPAT
2903 static int megasas_mgmt_compat_ioctl_fw(struct file *file, unsigned long arg)
2904 {
2905         struct compat_megasas_iocpacket __user *cioc =
2906             (struct compat_megasas_iocpacket __user *)arg;
2907         struct megasas_iocpacket __user *ioc =
2908             compat_alloc_user_space(sizeof(struct megasas_iocpacket));
2909         int i;
2910         int error = 0;
2911
2912         if (clear_user(ioc, sizeof(*ioc)))
2913                 return -EFAULT;
2914
2915         if (copy_in_user(&ioc->host_no, &cioc->host_no, sizeof(u16)) ||
2916             copy_in_user(&ioc->sgl_off, &cioc->sgl_off, sizeof(u32)) ||
2917             copy_in_user(&ioc->sense_off, &cioc->sense_off, sizeof(u32)) ||
2918             copy_in_user(&ioc->sense_len, &cioc->sense_len, sizeof(u32)) ||
2919             copy_in_user(ioc->frame.raw, cioc->frame.raw, 128) ||
2920             copy_in_user(&ioc->sge_count, &cioc->sge_count, sizeof(u32)))
2921                 return -EFAULT;
2922
2923         for (i = 0; i < MAX_IOCTL_SGE; i++) {
2924                 compat_uptr_t ptr;
2925
2926                 if (get_user(ptr, &cioc->sgl[i].iov_base) ||
2927                     put_user(compat_ptr(ptr), &ioc->sgl[i].iov_base) ||
2928                     copy_in_user(&ioc->sgl[i].iov_len,
2929                                  &cioc->sgl[i].iov_len, sizeof(compat_size_t)))
2930                         return -EFAULT;
2931         }
2932
2933         error = megasas_mgmt_ioctl_fw(file, (unsigned long)ioc);
2934
2935         if (copy_in_user(&cioc->frame.hdr.cmd_status,
2936                          &ioc->frame.hdr.cmd_status, sizeof(u8))) {
2937                 printk(KERN_DEBUG "megasas: error copy_in_user cmd_status\n");
2938                 return -EFAULT;
2939         }
2940         return error;
2941 }
2942
2943 static long
2944 megasas_mgmt_compat_ioctl(struct file *file, unsigned int cmd,
2945                           unsigned long arg)
2946 {
2947         switch (cmd) {
2948         case MEGASAS_IOC_FIRMWARE32:
2949                 return megasas_mgmt_compat_ioctl_fw(file, arg);
2950         case MEGASAS_IOC_GET_AEN:
2951                 return megasas_mgmt_ioctl_aen(file, arg);
2952         }
2953
2954         return -ENOTTY;
2955 }
2956 #endif
2957
2958 /*
2959  * File operations structure for management interface
2960  */
2961 static const struct file_operations megasas_mgmt_fops = {
2962         .owner = THIS_MODULE,
2963         .open = megasas_mgmt_open,
2964         .release = megasas_mgmt_release,
2965         .fasync = megasas_mgmt_fasync,
2966         .unlocked_ioctl = megasas_mgmt_ioctl,
2967 #ifdef CONFIG_COMPAT
2968         .compat_ioctl = megasas_mgmt_compat_ioctl,
2969 #endif
2970 };
2971
2972 /*
2973  * PCI hotplug support registration structure
2974  */
2975 static struct pci_driver megasas_pci_driver = {
2976
2977         .name = "megaraid_sas",
2978         .id_table = megasas_pci_table,
2979         .probe = megasas_probe_one,
2980         .remove = __devexit_p(megasas_detach_one),
2981         .shutdown = megasas_shutdown,
2982 };
2983
2984 /*
2985  * Sysfs driver attributes
2986  */
2987 static ssize_t megasas_sysfs_show_version(struct device_driver *dd, char *buf)
2988 {
2989         return snprintf(buf, strlen(MEGASAS_VERSION) + 2, "%s\n",
2990                         MEGASAS_VERSION);
2991 }
2992
2993 static DRIVER_ATTR(version, S_IRUGO, megasas_sysfs_show_version, NULL);
2994
2995 static ssize_t
2996 megasas_sysfs_show_release_date(struct device_driver *dd, char *buf)
2997 {
2998         return snprintf(buf, strlen(MEGASAS_RELDATE) + 2, "%s\n",
2999                         MEGASAS_RELDATE);
3000 }
3001
3002 static DRIVER_ATTR(release_date, S_IRUGO, megasas_sysfs_show_release_date,
3003                    NULL);
3004
3005 static ssize_t
3006 megasas_sysfs_show_dbg_lvl(struct device_driver *dd, char *buf)
3007 {
3008         return sprintf(buf,"%u",megasas_dbg_lvl);
3009 }
3010
3011 static ssize_t
3012 megasas_sysfs_set_dbg_lvl(struct device_driver *dd, const char *buf, size_t count)
3013 {
3014         int retval = count;
3015         if(sscanf(buf,"%u",&megasas_dbg_lvl)<1){
3016                 printk(KERN_ERR "megasas: could not set dbg_lvl\n");
3017                 retval = -EINVAL;
3018         }
3019         return retval;
3020 }
3021
3022 static DRIVER_ATTR(dbg_lvl, S_IRUGO|S_IWUGO, megasas_sysfs_show_dbg_lvl,
3023                    megasas_sysfs_set_dbg_lvl);
3024
3025 /**
3026  * megasas_init - Driver load entry point
3027  */
3028 static int __init megasas_init(void)
3029 {
3030         int rval;
3031
3032         /*
3033          * Announce driver version and other information
3034          */
3035         printk(KERN_INFO "megasas: %s %s\n", MEGASAS_VERSION,
3036                MEGASAS_EXT_VERSION);
3037
3038         memset(&megasas_mgmt_info, 0, sizeof(megasas_mgmt_info));
3039
3040         /*
3041          * Register character device node
3042          */
3043         rval = register_chrdev(0, "megaraid_sas_ioctl", &megasas_mgmt_fops);
3044
3045         if (rval < 0) {
3046                 printk(KERN_DEBUG "megasas: failed to open device node\n");
3047                 return rval;
3048         }
3049
3050         megasas_mgmt_majorno = rval;
3051
3052         /*
3053          * Register ourselves as PCI hotplug module
3054          */
3055         rval = pci_register_driver(&megasas_pci_driver);
3056
3057         if (rval) {
3058                 printk(KERN_DEBUG "megasas: PCI hotplug regisration failed \n");
3059                 goto err_pcidrv;
3060         }
3061
3062         rval = driver_create_file(&megasas_pci_driver.driver,
3063                                   &driver_attr_version);
3064         if (rval)
3065                 goto err_dcf_attr_ver;
3066         rval = driver_create_file(&megasas_pci_driver.driver,
3067                                   &driver_attr_release_date);
3068         if (rval)
3069                 goto err_dcf_rel_date;
3070         rval = driver_create_file(&megasas_pci_driver.driver,
3071                                   &driver_attr_dbg_lvl);
3072         if (rval)
3073                 goto err_dcf_dbg_lvl;
3074
3075         return rval;
3076 err_dcf_dbg_lvl:
3077         driver_remove_file(&megasas_pci_driver.driver,
3078                            &driver_attr_release_date);
3079 err_dcf_rel_date:
3080         driver_remove_file(&megasas_pci_driver.driver, &driver_attr_version);
3081 err_dcf_attr_ver:
3082         pci_unregister_driver(&megasas_pci_driver);
3083 err_pcidrv:
3084         unregister_chrdev(megasas_mgmt_majorno, "megaraid_sas_ioctl");
3085         return rval;
3086 }
3087
3088 /**
3089  * megasas_exit - Driver unload entry point
3090  */
3091 static void __exit megasas_exit(void)
3092 {
3093         driver_remove_file(&megasas_pci_driver.driver,
3094                            &driver_attr_dbg_lvl);
3095         driver_remove_file(&megasas_pci_driver.driver,
3096                            &driver_attr_release_date);
3097         driver_remove_file(&megasas_pci_driver.driver, &driver_attr_version);
3098
3099         pci_unregister_driver(&megasas_pci_driver);
3100         unregister_chrdev(megasas_mgmt_majorno, "megaraid_sas_ioctl");
3101 }
3102
3103 module_init(megasas_init);
3104 module_exit(megasas_exit);