2 * Linux MegaRAID driver for SAS based RAID controllers
4 * Copyright (c) 2003-2013 LSI Corporation
5 * Copyright (c) 2013-2016 Avago Technologies
6 * Copyright (c) 2016-2018 Broadcom Inc.
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 * Authors: Broadcom Inc.
26 * Kashyap Desai <kashyap.desai@broadcom.com>
27 * Sumit Saxena <sumit.saxena@broadcom.com>
29 * Send feedback to: megaraidlinux.pdl@broadcom.com
32 #include <linux/kernel.h>
33 #include <linux/types.h>
34 #include <linux/pci.h>
35 #include <linux/list.h>
36 #include <linux/moduleparam.h>
37 #include <linux/module.h>
38 #include <linux/spinlock.h>
39 #include <linux/interrupt.h>
40 #include <linux/delay.h>
41 #include <linux/uio.h>
42 #include <linux/slab.h>
43 #include <linux/uaccess.h>
44 #include <asm/unaligned.h>
46 #include <linux/compat.h>
47 #include <linux/blkdev.h>
48 #include <linux/mutex.h>
49 #include <linux/poll.h>
50 #include <linux/vmalloc.h>
52 #include <scsi/scsi.h>
53 #include <scsi/scsi_cmnd.h>
54 #include <scsi/scsi_device.h>
55 #include <scsi/scsi_host.h>
56 #include <scsi/scsi_tcq.h>
57 #include "megaraid_sas_fusion.h"
58 #include "megaraid_sas.h"
61 * Number of sectors per IO command
62 * Will be set in megasas_init_mfi if user does not provide
64 static unsigned int max_sectors
;
65 module_param_named(max_sectors
, max_sectors
, int, 0);
66 MODULE_PARM_DESC(max_sectors
,
67 "Maximum number of sectors per IO command");
69 static int msix_disable
;
70 module_param(msix_disable
, int, S_IRUGO
);
71 MODULE_PARM_DESC(msix_disable
, "Disable MSI-X interrupt handling. Default: 0");
73 static unsigned int msix_vectors
;
74 module_param(msix_vectors
, int, S_IRUGO
);
75 MODULE_PARM_DESC(msix_vectors
, "MSI-X max vector count. Default: Set by FW");
77 static int allow_vf_ioctls
;
78 module_param(allow_vf_ioctls
, int, S_IRUGO
);
79 MODULE_PARM_DESC(allow_vf_ioctls
, "Allow ioctls in SR-IOV VF mode. Default: 0");
81 static unsigned int throttlequeuedepth
= MEGASAS_THROTTLE_QUEUE_DEPTH
;
82 module_param(throttlequeuedepth
, int, S_IRUGO
);
83 MODULE_PARM_DESC(throttlequeuedepth
,
84 "Adapter queue depth when throttled due to I/O timeout. Default: 16");
86 unsigned int resetwaittime
= MEGASAS_RESET_WAIT_TIME
;
87 module_param(resetwaittime
, int, S_IRUGO
);
88 MODULE_PARM_DESC(resetwaittime
, "Wait time in (1-180s) after I/O timeout before resetting adapter. Default: 180s");
90 int smp_affinity_enable
= 1;
91 module_param(smp_affinity_enable
, int, S_IRUGO
);
92 MODULE_PARM_DESC(smp_affinity_enable
, "SMP affinity feature enable/disable Default: enable(1)");
95 module_param(rdpq_enable
, int, S_IRUGO
);
96 MODULE_PARM_DESC(rdpq_enable
, "Allocate reply queue in chunks for large queue depth enable/disable Default: enable(1)");
98 unsigned int dual_qdepth_disable
;
99 module_param(dual_qdepth_disable
, int, S_IRUGO
);
100 MODULE_PARM_DESC(dual_qdepth_disable
, "Disable dual queue depth feature. Default: 0");
102 unsigned int scmd_timeout
= MEGASAS_DEFAULT_CMD_TIMEOUT
;
103 module_param(scmd_timeout
, int, S_IRUGO
);
104 MODULE_PARM_DESC(scmd_timeout
, "scsi command timeout (10-90s), default 90s. See megasas_reset_timer.");
106 MODULE_LICENSE("GPL");
107 MODULE_VERSION(MEGASAS_VERSION
);
108 MODULE_AUTHOR("megaraidlinux.pdl@broadcom.com");
109 MODULE_DESCRIPTION("Broadcom MegaRAID SAS Driver");
111 int megasas_transition_to_ready(struct megasas_instance
*instance
, int ocr
);
112 static int megasas_get_pd_list(struct megasas_instance
*instance
);
113 static int megasas_ld_list_query(struct megasas_instance
*instance
,
115 static int megasas_issue_init_mfi(struct megasas_instance
*instance
);
116 static int megasas_register_aen(struct megasas_instance
*instance
,
117 u32 seq_num
, u32 class_locale_word
);
118 static void megasas_get_pd_info(struct megasas_instance
*instance
,
119 struct scsi_device
*sdev
);
122 * PCI ID table for all supported controllers
124 static struct pci_device_id megasas_pci_table
[] = {
126 {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC
, PCI_DEVICE_ID_LSI_SAS1064R
)},
128 {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC
, PCI_DEVICE_ID_LSI_SAS1078R
)},
130 {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC
, PCI_DEVICE_ID_LSI_SAS1078DE
)},
132 {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC
, PCI_DEVICE_ID_LSI_SAS1078GEN2
)},
134 {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC
, PCI_DEVICE_ID_LSI_SAS0079GEN2
)},
136 {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC
, PCI_DEVICE_ID_LSI_SAS0073SKINNY
)},
138 {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC
, PCI_DEVICE_ID_LSI_SAS0071SKINNY
)},
140 {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC
, PCI_DEVICE_ID_LSI_VERDE_ZCR
)},
141 /* xscale IOP, vega */
142 {PCI_DEVICE(PCI_VENDOR_ID_DELL
, PCI_DEVICE_ID_DELL_PERC5
)},
144 {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC
, PCI_DEVICE_ID_LSI_FUSION
)},
146 {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC
, PCI_DEVICE_ID_LSI_PLASMA
)},
148 {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC
, PCI_DEVICE_ID_LSI_INVADER
)},
150 {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC
, PCI_DEVICE_ID_LSI_FURY
)},
152 {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC
, PCI_DEVICE_ID_LSI_INTRUDER
)},
154 {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC
, PCI_DEVICE_ID_LSI_INTRUDER_24
)},
155 /* Intruder 24 port*/
156 {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC
, PCI_DEVICE_ID_LSI_CUTLASS_52
)},
157 {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC
, PCI_DEVICE_ID_LSI_CUTLASS_53
)},
159 {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC
, PCI_DEVICE_ID_LSI_VENTURA
)},
160 {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC
, PCI_DEVICE_ID_LSI_CRUSADER
)},
161 {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC
, PCI_DEVICE_ID_LSI_HARPOON
)},
162 {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC
, PCI_DEVICE_ID_LSI_TOMCAT
)},
163 {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC
, PCI_DEVICE_ID_LSI_VENTURA_4PORT
)},
164 {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC
, PCI_DEVICE_ID_LSI_CRUSADER_4PORT
)},
165 {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC
, PCI_DEVICE_ID_LSI_AERO_10E1
)},
166 {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC
, PCI_DEVICE_ID_LSI_AERO_10E2
)},
167 {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC
, PCI_DEVICE_ID_LSI_AERO_10E5
)},
168 {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC
, PCI_DEVICE_ID_LSI_AERO_10E6
)},
172 MODULE_DEVICE_TABLE(pci
, megasas_pci_table
);
174 static int megasas_mgmt_majorno
;
175 struct megasas_mgmt_info megasas_mgmt_info
;
176 static struct fasync_struct
*megasas_async_queue
;
177 static DEFINE_MUTEX(megasas_async_queue_mutex
);
179 static int megasas_poll_wait_aen
;
180 static DECLARE_WAIT_QUEUE_HEAD(megasas_poll_wait
);
181 static u32 support_poll_for_event
;
183 static u32 support_device_change
;
184 static bool support_nvme_encapsulation
;
186 /* define lock for aen poll */
187 spinlock_t poll_aen_lock
;
190 megasas_complete_cmd(struct megasas_instance
*instance
, struct megasas_cmd
*cmd
,
193 megasas_read_fw_status_reg_gen2(struct megasas_instance
*instance
);
195 megasas_adp_reset_gen2(struct megasas_instance
*instance
,
196 struct megasas_register_set __iomem
*reg_set
);
197 static irqreturn_t
megasas_isr(int irq
, void *devp
);
199 megasas_init_adapter_mfi(struct megasas_instance
*instance
);
201 megasas_build_and_issue_cmd(struct megasas_instance
*instance
,
202 struct scsi_cmnd
*scmd
);
203 static void megasas_complete_cmd_dpc(unsigned long instance_addr
);
205 wait_and_poll(struct megasas_instance
*instance
, struct megasas_cmd
*cmd
,
207 void megasas_fusion_ocr_wq(struct work_struct
*work
);
208 static int megasas_get_ld_vf_affiliation(struct megasas_instance
*instance
,
211 megasas_set_dma_mask(struct megasas_instance
*instance
);
213 megasas_alloc_ctrl_mem(struct megasas_instance
*instance
);
215 megasas_free_ctrl_mem(struct megasas_instance
*instance
);
217 megasas_alloc_ctrl_dma_buffers(struct megasas_instance
*instance
);
219 megasas_free_ctrl_dma_buffers(struct megasas_instance
*instance
);
221 megasas_init_ctrl_params(struct megasas_instance
*instance
);
223 u32
megasas_readl(struct megasas_instance
*instance
,
224 const volatile void __iomem
*addr
)
228 * Due to a HW errata in Aero controllers, reads to certain
229 * Fusion registers could intermittently return all zeroes.
230 * This behavior is transient in nature and subsequent reads will
231 * return valid value. As a workaround in driver, retry readl for
232 * upto three times until a non-zero value is read.
234 if (instance
->adapter_type
== AERO_SERIES
) {
236 ret_val
= readl(addr
);
238 } while (ret_val
== 0 && i
< 3);
246 * megasas_set_dma_settings - Populate DMA address, length and flags for DCMDs
247 * @instance: Adapter soft state
248 * @dcmd: DCMD frame inside MFI command
249 * @dma_addr: DMA address of buffer to be passed to FW
250 * @dma_len: Length of DMA buffer to be passed to FW
253 void megasas_set_dma_settings(struct megasas_instance
*instance
,
254 struct megasas_dcmd_frame
*dcmd
,
255 dma_addr_t dma_addr
, u32 dma_len
)
257 if (instance
->consistent_mask_64bit
) {
258 dcmd
->sgl
.sge64
[0].phys_addr
= cpu_to_le64(dma_addr
);
259 dcmd
->sgl
.sge64
[0].length
= cpu_to_le32(dma_len
);
260 dcmd
->flags
= cpu_to_le16(dcmd
->flags
| MFI_FRAME_SGL64
);
263 dcmd
->sgl
.sge32
[0].phys_addr
=
264 cpu_to_le32(lower_32_bits(dma_addr
));
265 dcmd
->sgl
.sge32
[0].length
= cpu_to_le32(dma_len
);
266 dcmd
->flags
= cpu_to_le16(dcmd
->flags
);
271 megasas_issue_dcmd(struct megasas_instance
*instance
, struct megasas_cmd
*cmd
)
273 instance
->instancet
->fire_cmd(instance
,
274 cmd
->frame_phys_addr
, 0, instance
->reg_set
);
279 * megasas_get_cmd - Get a command from the free pool
280 * @instance: Adapter soft state
282 * Returns a free command from the pool
284 struct megasas_cmd
*megasas_get_cmd(struct megasas_instance
288 struct megasas_cmd
*cmd
= NULL
;
290 spin_lock_irqsave(&instance
->mfi_pool_lock
, flags
);
292 if (!list_empty(&instance
->cmd_pool
)) {
293 cmd
= list_entry((&instance
->cmd_pool
)->next
,
294 struct megasas_cmd
, list
);
295 list_del_init(&cmd
->list
);
297 dev_err(&instance
->pdev
->dev
, "Command pool empty!\n");
300 spin_unlock_irqrestore(&instance
->mfi_pool_lock
, flags
);
305 * megasas_return_cmd - Return a cmd to free command pool
306 * @instance: Adapter soft state
307 * @cmd: Command packet to be returned to free command pool
310 megasas_return_cmd(struct megasas_instance
*instance
, struct megasas_cmd
*cmd
)
314 struct megasas_cmd_fusion
*cmd_fusion
;
315 struct fusion_context
*fusion
= instance
->ctrl_context
;
317 /* This flag is used only for fusion adapter.
318 * Wait for Interrupt for Polled mode DCMD
320 if (cmd
->flags
& DRV_DCMD_POLLED_MODE
)
323 spin_lock_irqsave(&instance
->mfi_pool_lock
, flags
);
326 blk_tags
= instance
->max_scsi_cmds
+ cmd
->index
;
327 cmd_fusion
= fusion
->cmd_list
[blk_tags
];
328 megasas_return_cmd_fusion(instance
, cmd_fusion
);
331 cmd
->frame_count
= 0;
333 memset(cmd
->frame
, 0, instance
->mfi_frame_size
);
334 cmd
->frame
->io
.context
= cpu_to_le32(cmd
->index
);
335 if (!fusion
&& reset_devices
)
336 cmd
->frame
->hdr
.cmd
= MFI_CMD_INVALID
;
337 list_add(&cmd
->list
, (&instance
->cmd_pool
)->next
);
339 spin_unlock_irqrestore(&instance
->mfi_pool_lock
, flags
);
344 format_timestamp(uint32_t timestamp
)
346 static char buffer
[32];
348 if ((timestamp
& 0xff000000) == 0xff000000)
349 snprintf(buffer
, sizeof(buffer
), "boot + %us", timestamp
&
352 snprintf(buffer
, sizeof(buffer
), "%us", timestamp
);
357 format_class(int8_t class)
359 static char buffer
[6];
362 case MFI_EVT_CLASS_DEBUG
:
364 case MFI_EVT_CLASS_PROGRESS
:
366 case MFI_EVT_CLASS_INFO
:
368 case MFI_EVT_CLASS_WARNING
:
370 case MFI_EVT_CLASS_CRITICAL
:
372 case MFI_EVT_CLASS_FATAL
:
374 case MFI_EVT_CLASS_DEAD
:
377 snprintf(buffer
, sizeof(buffer
), "%d", class);
383 * megasas_decode_evt: Decode FW AEN event and print critical event
385 * @instance: Adapter soft state
388 megasas_decode_evt(struct megasas_instance
*instance
)
390 struct megasas_evt_detail
*evt_detail
= instance
->evt_detail
;
391 union megasas_evt_class_locale class_locale
;
392 class_locale
.word
= le32_to_cpu(evt_detail
->cl
.word
);
394 if (class_locale
.members
.class >= MFI_EVT_CLASS_CRITICAL
)
395 dev_info(&instance
->pdev
->dev
, "%d (%s/0x%04x/%s) - %s\n",
396 le32_to_cpu(evt_detail
->seq_num
),
397 format_timestamp(le32_to_cpu(evt_detail
->time_stamp
)),
398 (class_locale
.members
.locale
),
399 format_class(class_locale
.members
.class),
400 evt_detail
->description
);
404 * The following functions are defined for xscale
405 * (deviceid : 1064R, PERC5) controllers
409 * megasas_enable_intr_xscale - Enables interrupts
410 * @regs: MFI register set
413 megasas_enable_intr_xscale(struct megasas_instance
*instance
)
415 struct megasas_register_set __iomem
*regs
;
417 regs
= instance
->reg_set
;
418 writel(0, &(regs
)->outbound_intr_mask
);
420 /* Dummy readl to force pci flush */
421 readl(®s
->outbound_intr_mask
);
425 * megasas_disable_intr_xscale -Disables interrupt
426 * @regs: MFI register set
429 megasas_disable_intr_xscale(struct megasas_instance
*instance
)
431 struct megasas_register_set __iomem
*regs
;
434 regs
= instance
->reg_set
;
435 writel(mask
, ®s
->outbound_intr_mask
);
436 /* Dummy readl to force pci flush */
437 readl(®s
->outbound_intr_mask
);
441 * megasas_read_fw_status_reg_xscale - returns the current FW status value
442 * @regs: MFI register set
445 megasas_read_fw_status_reg_xscale(struct megasas_instance
*instance
)
447 return readl(&instance
->reg_set
->outbound_msg_0
);
450 * megasas_clear_interrupt_xscale - Check & clear interrupt
451 * @regs: MFI register set
454 megasas_clear_intr_xscale(struct megasas_instance
*instance
)
458 struct megasas_register_set __iomem
*regs
;
459 regs
= instance
->reg_set
;
462 * Check if it is our interrupt
464 status
= readl(®s
->outbound_intr_status
);
466 if (status
& MFI_OB_INTR_STATUS_MASK
)
467 mfiStatus
= MFI_INTR_FLAG_REPLY_MESSAGE
;
468 if (status
& MFI_XSCALE_OMR0_CHANGE_INTERRUPT
)
469 mfiStatus
|= MFI_INTR_FLAG_FIRMWARE_STATE_CHANGE
;
472 * Clear the interrupt by writing back the same value
475 writel(status
, ®s
->outbound_intr_status
);
477 /* Dummy readl to force pci flush */
478 readl(®s
->outbound_intr_status
);
484 * megasas_fire_cmd_xscale - Sends command to the FW
485 * @frame_phys_addr : Physical address of cmd
486 * @frame_count : Number of frames for the command
487 * @regs : MFI register set
490 megasas_fire_cmd_xscale(struct megasas_instance
*instance
,
491 dma_addr_t frame_phys_addr
,
493 struct megasas_register_set __iomem
*regs
)
497 spin_lock_irqsave(&instance
->hba_lock
, flags
);
498 writel((frame_phys_addr
>> 3)|(frame_count
),
499 &(regs
)->inbound_queue_port
);
500 spin_unlock_irqrestore(&instance
->hba_lock
, flags
);
504 * megasas_adp_reset_xscale - For controller reset
505 * @regs: MFI register set
508 megasas_adp_reset_xscale(struct megasas_instance
*instance
,
509 struct megasas_register_set __iomem
*regs
)
514 writel(MFI_ADP_RESET
, ®s
->inbound_doorbell
);
516 for (i
= 0; i
< 3; i
++)
517 msleep(1000); /* sleep for 3 secs */
519 pci_read_config_dword(instance
->pdev
, MFI_1068_PCSR_OFFSET
, &pcidata
);
520 dev_notice(&instance
->pdev
->dev
, "pcidata = %x\n", pcidata
);
522 dev_notice(&instance
->pdev
->dev
, "mfi 1068 offset read=%x\n", pcidata
);
524 pci_write_config_dword(instance
->pdev
,
525 MFI_1068_PCSR_OFFSET
, pcidata
);
527 for (i
= 0; i
< 2; i
++)
528 msleep(1000); /* need to wait 2 secs again */
531 pci_read_config_dword(instance
->pdev
,
532 MFI_1068_FW_HANDSHAKE_OFFSET
, &pcidata
);
533 dev_notice(&instance
->pdev
->dev
, "1068 offset handshake read=%x\n", pcidata
);
534 if ((pcidata
& 0xffff0000) == MFI_1068_FW_READY
) {
535 dev_notice(&instance
->pdev
->dev
, "1068 offset pcidt=%x\n", pcidata
);
537 pci_write_config_dword(instance
->pdev
,
538 MFI_1068_FW_HANDSHAKE_OFFSET
, pcidata
);
545 * megasas_check_reset_xscale - For controller reset check
546 * @regs: MFI register set
549 megasas_check_reset_xscale(struct megasas_instance
*instance
,
550 struct megasas_register_set __iomem
*regs
)
552 if ((atomic_read(&instance
->adprecovery
) != MEGASAS_HBA_OPERATIONAL
) &&
553 (le32_to_cpu(*instance
->consumer
) ==
554 MEGASAS_ADPRESET_INPROG_SIGN
))
559 static struct megasas_instance_template megasas_instance_template_xscale
= {
561 .fire_cmd
= megasas_fire_cmd_xscale
,
562 .enable_intr
= megasas_enable_intr_xscale
,
563 .disable_intr
= megasas_disable_intr_xscale
,
564 .clear_intr
= megasas_clear_intr_xscale
,
565 .read_fw_status_reg
= megasas_read_fw_status_reg_xscale
,
566 .adp_reset
= megasas_adp_reset_xscale
,
567 .check_reset
= megasas_check_reset_xscale
,
568 .service_isr
= megasas_isr
,
569 .tasklet
= megasas_complete_cmd_dpc
,
570 .init_adapter
= megasas_init_adapter_mfi
,
571 .build_and_issue_cmd
= megasas_build_and_issue_cmd
,
572 .issue_dcmd
= megasas_issue_dcmd
,
576 * This is the end of set of functions & definitions specific
577 * to xscale (deviceid : 1064R, PERC5) controllers
581 * The following functions are defined for ppc (deviceid : 0x60)
586 * megasas_enable_intr_ppc - Enables interrupts
587 * @regs: MFI register set
590 megasas_enable_intr_ppc(struct megasas_instance
*instance
)
592 struct megasas_register_set __iomem
*regs
;
594 regs
= instance
->reg_set
;
595 writel(0xFFFFFFFF, &(regs
)->outbound_doorbell_clear
);
597 writel(~0x80000000, &(regs
)->outbound_intr_mask
);
599 /* Dummy readl to force pci flush */
600 readl(®s
->outbound_intr_mask
);
604 * megasas_disable_intr_ppc - Disable interrupt
605 * @regs: MFI register set
608 megasas_disable_intr_ppc(struct megasas_instance
*instance
)
610 struct megasas_register_set __iomem
*regs
;
611 u32 mask
= 0xFFFFFFFF;
613 regs
= instance
->reg_set
;
614 writel(mask
, ®s
->outbound_intr_mask
);
615 /* Dummy readl to force pci flush */
616 readl(®s
->outbound_intr_mask
);
620 * megasas_read_fw_status_reg_ppc - returns the current FW status value
621 * @regs: MFI register set
624 megasas_read_fw_status_reg_ppc(struct megasas_instance
*instance
)
626 return readl(&instance
->reg_set
->outbound_scratch_pad_0
);
630 * megasas_clear_interrupt_ppc - Check & clear interrupt
631 * @regs: MFI register set
634 megasas_clear_intr_ppc(struct megasas_instance
*instance
)
636 u32 status
, mfiStatus
= 0;
637 struct megasas_register_set __iomem
*regs
;
638 regs
= instance
->reg_set
;
641 * Check if it is our interrupt
643 status
= readl(®s
->outbound_intr_status
);
645 if (status
& MFI_REPLY_1078_MESSAGE_INTERRUPT
)
646 mfiStatus
= MFI_INTR_FLAG_REPLY_MESSAGE
;
648 if (status
& MFI_G2_OUTBOUND_DOORBELL_CHANGE_INTERRUPT
)
649 mfiStatus
|= MFI_INTR_FLAG_FIRMWARE_STATE_CHANGE
;
652 * Clear the interrupt by writing back the same value
654 writel(status
, ®s
->outbound_doorbell_clear
);
656 /* Dummy readl to force pci flush */
657 readl(®s
->outbound_doorbell_clear
);
663 * megasas_fire_cmd_ppc - Sends command to the FW
664 * @frame_phys_addr : Physical address of cmd
665 * @frame_count : Number of frames for the command
666 * @regs : MFI register set
669 megasas_fire_cmd_ppc(struct megasas_instance
*instance
,
670 dma_addr_t frame_phys_addr
,
672 struct megasas_register_set __iomem
*regs
)
676 spin_lock_irqsave(&instance
->hba_lock
, flags
);
677 writel((frame_phys_addr
| (frame_count
<<1))|1,
678 &(regs
)->inbound_queue_port
);
679 spin_unlock_irqrestore(&instance
->hba_lock
, flags
);
683 * megasas_check_reset_ppc - For controller reset check
684 * @regs: MFI register set
687 megasas_check_reset_ppc(struct megasas_instance
*instance
,
688 struct megasas_register_set __iomem
*regs
)
690 if (atomic_read(&instance
->adprecovery
) != MEGASAS_HBA_OPERATIONAL
)
696 static struct megasas_instance_template megasas_instance_template_ppc
= {
698 .fire_cmd
= megasas_fire_cmd_ppc
,
699 .enable_intr
= megasas_enable_intr_ppc
,
700 .disable_intr
= megasas_disable_intr_ppc
,
701 .clear_intr
= megasas_clear_intr_ppc
,
702 .read_fw_status_reg
= megasas_read_fw_status_reg_ppc
,
703 .adp_reset
= megasas_adp_reset_xscale
,
704 .check_reset
= megasas_check_reset_ppc
,
705 .service_isr
= megasas_isr
,
706 .tasklet
= megasas_complete_cmd_dpc
,
707 .init_adapter
= megasas_init_adapter_mfi
,
708 .build_and_issue_cmd
= megasas_build_and_issue_cmd
,
709 .issue_dcmd
= megasas_issue_dcmd
,
713 * megasas_enable_intr_skinny - Enables interrupts
714 * @regs: MFI register set
717 megasas_enable_intr_skinny(struct megasas_instance
*instance
)
719 struct megasas_register_set __iomem
*regs
;
721 regs
= instance
->reg_set
;
722 writel(0xFFFFFFFF, &(regs
)->outbound_intr_mask
);
724 writel(~MFI_SKINNY_ENABLE_INTERRUPT_MASK
, &(regs
)->outbound_intr_mask
);
726 /* Dummy readl to force pci flush */
727 readl(®s
->outbound_intr_mask
);
731 * megasas_disable_intr_skinny - Disables interrupt
732 * @regs: MFI register set
735 megasas_disable_intr_skinny(struct megasas_instance
*instance
)
737 struct megasas_register_set __iomem
*regs
;
738 u32 mask
= 0xFFFFFFFF;
740 regs
= instance
->reg_set
;
741 writel(mask
, ®s
->outbound_intr_mask
);
742 /* Dummy readl to force pci flush */
743 readl(®s
->outbound_intr_mask
);
747 * megasas_read_fw_status_reg_skinny - returns the current FW status value
748 * @regs: MFI register set
751 megasas_read_fw_status_reg_skinny(struct megasas_instance
*instance
)
753 return readl(&instance
->reg_set
->outbound_scratch_pad_0
);
757 * megasas_clear_interrupt_skinny - Check & clear interrupt
758 * @regs: MFI register set
761 megasas_clear_intr_skinny(struct megasas_instance
*instance
)
765 struct megasas_register_set __iomem
*regs
;
766 regs
= instance
->reg_set
;
769 * Check if it is our interrupt
771 status
= readl(®s
->outbound_intr_status
);
773 if (!(status
& MFI_SKINNY_ENABLE_INTERRUPT_MASK
)) {
778 * Check if it is our interrupt
780 if ((megasas_read_fw_status_reg_skinny(instance
) & MFI_STATE_MASK
) ==
782 mfiStatus
= MFI_INTR_FLAG_FIRMWARE_STATE_CHANGE
;
784 mfiStatus
= MFI_INTR_FLAG_REPLY_MESSAGE
;
787 * Clear the interrupt by writing back the same value
789 writel(status
, ®s
->outbound_intr_status
);
792 * dummy read to flush PCI
794 readl(®s
->outbound_intr_status
);
800 * megasas_fire_cmd_skinny - Sends command to the FW
801 * @frame_phys_addr : Physical address of cmd
802 * @frame_count : Number of frames for the command
803 * @regs : MFI register set
806 megasas_fire_cmd_skinny(struct megasas_instance
*instance
,
807 dma_addr_t frame_phys_addr
,
809 struct megasas_register_set __iomem
*regs
)
813 spin_lock_irqsave(&instance
->hba_lock
, flags
);
814 writel(upper_32_bits(frame_phys_addr
),
815 &(regs
)->inbound_high_queue_port
);
816 writel((lower_32_bits(frame_phys_addr
) | (frame_count
<<1))|1,
817 &(regs
)->inbound_low_queue_port
);
819 spin_unlock_irqrestore(&instance
->hba_lock
, flags
);
823 * megasas_check_reset_skinny - For controller reset check
824 * @regs: MFI register set
827 megasas_check_reset_skinny(struct megasas_instance
*instance
,
828 struct megasas_register_set __iomem
*regs
)
830 if (atomic_read(&instance
->adprecovery
) != MEGASAS_HBA_OPERATIONAL
)
836 static struct megasas_instance_template megasas_instance_template_skinny
= {
838 .fire_cmd
= megasas_fire_cmd_skinny
,
839 .enable_intr
= megasas_enable_intr_skinny
,
840 .disable_intr
= megasas_disable_intr_skinny
,
841 .clear_intr
= megasas_clear_intr_skinny
,
842 .read_fw_status_reg
= megasas_read_fw_status_reg_skinny
,
843 .adp_reset
= megasas_adp_reset_gen2
,
844 .check_reset
= megasas_check_reset_skinny
,
845 .service_isr
= megasas_isr
,
846 .tasklet
= megasas_complete_cmd_dpc
,
847 .init_adapter
= megasas_init_adapter_mfi
,
848 .build_and_issue_cmd
= megasas_build_and_issue_cmd
,
849 .issue_dcmd
= megasas_issue_dcmd
,
854 * The following functions are defined for gen2 (deviceid : 0x78 0x79)
859 * megasas_enable_intr_gen2 - Enables interrupts
860 * @regs: MFI register set
863 megasas_enable_intr_gen2(struct megasas_instance
*instance
)
865 struct megasas_register_set __iomem
*regs
;
867 regs
= instance
->reg_set
;
868 writel(0xFFFFFFFF, &(regs
)->outbound_doorbell_clear
);
870 /* write ~0x00000005 (4 & 1) to the intr mask*/
871 writel(~MFI_GEN2_ENABLE_INTERRUPT_MASK
, &(regs
)->outbound_intr_mask
);
873 /* Dummy readl to force pci flush */
874 readl(®s
->outbound_intr_mask
);
878 * megasas_disable_intr_gen2 - Disables interrupt
879 * @regs: MFI register set
882 megasas_disable_intr_gen2(struct megasas_instance
*instance
)
884 struct megasas_register_set __iomem
*regs
;
885 u32 mask
= 0xFFFFFFFF;
887 regs
= instance
->reg_set
;
888 writel(mask
, ®s
->outbound_intr_mask
);
889 /* Dummy readl to force pci flush */
890 readl(®s
->outbound_intr_mask
);
894 * megasas_read_fw_status_reg_gen2 - returns the current FW status value
895 * @regs: MFI register set
898 megasas_read_fw_status_reg_gen2(struct megasas_instance
*instance
)
900 return readl(&instance
->reg_set
->outbound_scratch_pad_0
);
904 * megasas_clear_interrupt_gen2 - Check & clear interrupt
905 * @regs: MFI register set
908 megasas_clear_intr_gen2(struct megasas_instance
*instance
)
912 struct megasas_register_set __iomem
*regs
;
913 regs
= instance
->reg_set
;
916 * Check if it is our interrupt
918 status
= readl(®s
->outbound_intr_status
);
920 if (status
& MFI_INTR_FLAG_REPLY_MESSAGE
) {
921 mfiStatus
= MFI_INTR_FLAG_REPLY_MESSAGE
;
923 if (status
& MFI_G2_OUTBOUND_DOORBELL_CHANGE_INTERRUPT
) {
924 mfiStatus
|= MFI_INTR_FLAG_FIRMWARE_STATE_CHANGE
;
928 * Clear the interrupt by writing back the same value
931 writel(status
, ®s
->outbound_doorbell_clear
);
933 /* Dummy readl to force pci flush */
934 readl(®s
->outbound_intr_status
);
939 * megasas_fire_cmd_gen2 - Sends command to the FW
940 * @frame_phys_addr : Physical address of cmd
941 * @frame_count : Number of frames for the command
942 * @regs : MFI register set
945 megasas_fire_cmd_gen2(struct megasas_instance
*instance
,
946 dma_addr_t frame_phys_addr
,
948 struct megasas_register_set __iomem
*regs
)
952 spin_lock_irqsave(&instance
->hba_lock
, flags
);
953 writel((frame_phys_addr
| (frame_count
<<1))|1,
954 &(regs
)->inbound_queue_port
);
955 spin_unlock_irqrestore(&instance
->hba_lock
, flags
);
959 * megasas_adp_reset_gen2 - For controller reset
960 * @regs: MFI register set
963 megasas_adp_reset_gen2(struct megasas_instance
*instance
,
964 struct megasas_register_set __iomem
*reg_set
)
968 u32 __iomem
*seq_offset
= ®_set
->seq_offset
;
969 u32 __iomem
*hostdiag_offset
= ®_set
->host_diag
;
971 if (instance
->instancet
== &megasas_instance_template_skinny
) {
972 seq_offset
= ®_set
->fusion_seq_offset
;
973 hostdiag_offset
= ®_set
->fusion_host_diag
;
976 writel(0, seq_offset
);
977 writel(4, seq_offset
);
978 writel(0xb, seq_offset
);
979 writel(2, seq_offset
);
980 writel(7, seq_offset
);
981 writel(0xd, seq_offset
);
985 HostDiag
= (u32
)readl(hostdiag_offset
);
987 while (!(HostDiag
& DIAG_WRITE_ENABLE
)) {
989 HostDiag
= (u32
)readl(hostdiag_offset
);
990 dev_notice(&instance
->pdev
->dev
, "RESETGEN2: retry=%x, hostdiag=%x\n",
998 dev_notice(&instance
->pdev
->dev
, "ADP_RESET_GEN2: HostDiag=%x\n", HostDiag
);
1000 writel((HostDiag
| DIAG_RESET_ADAPTER
), hostdiag_offset
);
1004 HostDiag
= (u32
)readl(hostdiag_offset
);
1005 while (HostDiag
& DIAG_RESET_ADAPTER
) {
1007 HostDiag
= (u32
)readl(hostdiag_offset
);
1008 dev_notice(&instance
->pdev
->dev
, "RESET_GEN2: retry=%x, hostdiag=%x\n",
1011 if (retry
++ >= 1000)
1019 * megasas_check_reset_gen2 - For controller reset check
1020 * @regs: MFI register set
1023 megasas_check_reset_gen2(struct megasas_instance
*instance
,
1024 struct megasas_register_set __iomem
*regs
)
1026 if (atomic_read(&instance
->adprecovery
) != MEGASAS_HBA_OPERATIONAL
)
1032 static struct megasas_instance_template megasas_instance_template_gen2
= {
1034 .fire_cmd
= megasas_fire_cmd_gen2
,
1035 .enable_intr
= megasas_enable_intr_gen2
,
1036 .disable_intr
= megasas_disable_intr_gen2
,
1037 .clear_intr
= megasas_clear_intr_gen2
,
1038 .read_fw_status_reg
= megasas_read_fw_status_reg_gen2
,
1039 .adp_reset
= megasas_adp_reset_gen2
,
1040 .check_reset
= megasas_check_reset_gen2
,
1041 .service_isr
= megasas_isr
,
1042 .tasklet
= megasas_complete_cmd_dpc
,
1043 .init_adapter
= megasas_init_adapter_mfi
,
1044 .build_and_issue_cmd
= megasas_build_and_issue_cmd
,
1045 .issue_dcmd
= megasas_issue_dcmd
,
1049 * This is the end of set of functions & definitions
1050 * specific to gen2 (deviceid : 0x78, 0x79) controllers
1054 * Template added for TB (Fusion)
1056 extern struct megasas_instance_template megasas_instance_template_fusion
;
1059 * megasas_issue_polled - Issues a polling command
1060 * @instance: Adapter soft state
1061 * @cmd: Command packet to be issued
1063 * For polling, MFI requires the cmd_status to be set to MFI_STAT_INVALID_STATUS before posting.
1066 megasas_issue_polled(struct megasas_instance
*instance
, struct megasas_cmd
*cmd
)
1068 struct megasas_header
*frame_hdr
= &cmd
->frame
->hdr
;
1070 frame_hdr
->cmd_status
= MFI_STAT_INVALID_STATUS
;
1071 frame_hdr
->flags
|= cpu_to_le16(MFI_FRAME_DONT_POST_IN_REPLY_QUEUE
);
1073 if (atomic_read(&instance
->adprecovery
) == MEGASAS_HW_CRITICAL_ERROR
) {
1074 dev_err(&instance
->pdev
->dev
, "Failed from %s %d\n",
1075 __func__
, __LINE__
);
1076 return DCMD_NOT_FIRED
;
1079 instance
->instancet
->issue_dcmd(instance
, cmd
);
1081 return wait_and_poll(instance
, cmd
, instance
->requestorId
?
1082 MEGASAS_ROUTINE_WAIT_TIME_VF
: MFI_IO_TIMEOUT_SECS
);
1086 * megasas_issue_blocked_cmd - Synchronous wrapper around regular FW cmds
1087 * @instance: Adapter soft state
1088 * @cmd: Command to be issued
1089 * @timeout: Timeout in seconds
1091 * This function waits on an event for the command to be returned from ISR.
1092 * Max wait time is MEGASAS_INTERNAL_CMD_WAIT_TIME secs
1093 * Used to issue ioctl commands.
1096 megasas_issue_blocked_cmd(struct megasas_instance
*instance
,
1097 struct megasas_cmd
*cmd
, int timeout
)
1100 cmd
->cmd_status_drv
= MFI_STAT_INVALID_STATUS
;
1102 if (atomic_read(&instance
->adprecovery
) == MEGASAS_HW_CRITICAL_ERROR
) {
1103 dev_err(&instance
->pdev
->dev
, "Failed from %s %d\n",
1104 __func__
, __LINE__
);
1105 return DCMD_NOT_FIRED
;
1108 instance
->instancet
->issue_dcmd(instance
, cmd
);
1111 ret
= wait_event_timeout(instance
->int_cmd_wait_q
,
1112 cmd
->cmd_status_drv
!= MFI_STAT_INVALID_STATUS
, timeout
* HZ
);
1114 dev_err(&instance
->pdev
->dev
, "Failed from %s %d DCMD Timed out\n",
1115 __func__
, __LINE__
);
1116 return DCMD_TIMEOUT
;
1119 wait_event(instance
->int_cmd_wait_q
,
1120 cmd
->cmd_status_drv
!= MFI_STAT_INVALID_STATUS
);
1122 return (cmd
->cmd_status_drv
== MFI_STAT_OK
) ?
1123 DCMD_SUCCESS
: DCMD_FAILED
;
1127 * megasas_issue_blocked_abort_cmd - Aborts previously issued cmd
1128 * @instance: Adapter soft state
1129 * @cmd_to_abort: Previously issued cmd to be aborted
1130 * @timeout: Timeout in seconds
1132 * MFI firmware can abort previously issued AEN comamnd (automatic event
1133 * notification). The megasas_issue_blocked_abort_cmd() issues such abort
1134 * cmd and waits for return status.
1135 * Max wait time is MEGASAS_INTERNAL_CMD_WAIT_TIME secs
1138 megasas_issue_blocked_abort_cmd(struct megasas_instance
*instance
,
1139 struct megasas_cmd
*cmd_to_abort
, int timeout
)
1141 struct megasas_cmd
*cmd
;
1142 struct megasas_abort_frame
*abort_fr
;
1145 cmd
= megasas_get_cmd(instance
);
1150 abort_fr
= &cmd
->frame
->abort
;
1153 * Prepare and issue the abort frame
1155 abort_fr
->cmd
= MFI_CMD_ABORT
;
1156 abort_fr
->cmd_status
= MFI_STAT_INVALID_STATUS
;
1157 abort_fr
->flags
= cpu_to_le16(0);
1158 abort_fr
->abort_context
= cpu_to_le32(cmd_to_abort
->index
);
1159 abort_fr
->abort_mfi_phys_addr_lo
=
1160 cpu_to_le32(lower_32_bits(cmd_to_abort
->frame_phys_addr
));
1161 abort_fr
->abort_mfi_phys_addr_hi
=
1162 cpu_to_le32(upper_32_bits(cmd_to_abort
->frame_phys_addr
));
1165 cmd
->cmd_status_drv
= MFI_STAT_INVALID_STATUS
;
1167 if (atomic_read(&instance
->adprecovery
) == MEGASAS_HW_CRITICAL_ERROR
) {
1168 dev_err(&instance
->pdev
->dev
, "Failed from %s %d\n",
1169 __func__
, __LINE__
);
1170 return DCMD_NOT_FIRED
;
1173 instance
->instancet
->issue_dcmd(instance
, cmd
);
1176 ret
= wait_event_timeout(instance
->abort_cmd_wait_q
,
1177 cmd
->cmd_status_drv
!= MFI_STAT_INVALID_STATUS
, timeout
* HZ
);
1179 dev_err(&instance
->pdev
->dev
, "Failed from %s %d Abort Timed out\n",
1180 __func__
, __LINE__
);
1181 return DCMD_TIMEOUT
;
1184 wait_event(instance
->abort_cmd_wait_q
,
1185 cmd
->cmd_status_drv
!= MFI_STAT_INVALID_STATUS
);
1189 megasas_return_cmd(instance
, cmd
);
1190 return (cmd
->cmd_status_drv
== MFI_STAT_OK
) ?
1191 DCMD_SUCCESS
: DCMD_FAILED
;
1195 * megasas_make_sgl32 - Prepares 32-bit SGL
1196 * @instance: Adapter soft state
1197 * @scp: SCSI command from the mid-layer
1198 * @mfi_sgl: SGL to be filled in
1200 * If successful, this function returns the number of SG elements. Otherwise,
1204 megasas_make_sgl32(struct megasas_instance
*instance
, struct scsi_cmnd
*scp
,
1205 union megasas_sgl
*mfi_sgl
)
1209 struct scatterlist
*os_sgl
;
1211 sge_count
= scsi_dma_map(scp
);
1212 BUG_ON(sge_count
< 0);
1215 scsi_for_each_sg(scp
, os_sgl
, sge_count
, i
) {
1216 mfi_sgl
->sge32
[i
].length
= cpu_to_le32(sg_dma_len(os_sgl
));
1217 mfi_sgl
->sge32
[i
].phys_addr
= cpu_to_le32(sg_dma_address(os_sgl
));
1224 * megasas_make_sgl64 - Prepares 64-bit SGL
1225 * @instance: Adapter soft state
1226 * @scp: SCSI command from the mid-layer
1227 * @mfi_sgl: SGL to be filled in
1229 * If successful, this function returns the number of SG elements. Otherwise,
1233 megasas_make_sgl64(struct megasas_instance
*instance
, struct scsi_cmnd
*scp
,
1234 union megasas_sgl
*mfi_sgl
)
1238 struct scatterlist
*os_sgl
;
1240 sge_count
= scsi_dma_map(scp
);
1241 BUG_ON(sge_count
< 0);
1244 scsi_for_each_sg(scp
, os_sgl
, sge_count
, i
) {
1245 mfi_sgl
->sge64
[i
].length
= cpu_to_le32(sg_dma_len(os_sgl
));
1246 mfi_sgl
->sge64
[i
].phys_addr
= cpu_to_le64(sg_dma_address(os_sgl
));
1253 * megasas_make_sgl_skinny - Prepares IEEE SGL
1254 * @instance: Adapter soft state
1255 * @scp: SCSI command from the mid-layer
1256 * @mfi_sgl: SGL to be filled in
1258 * If successful, this function returns the number of SG elements. Otherwise,
1262 megasas_make_sgl_skinny(struct megasas_instance
*instance
,
1263 struct scsi_cmnd
*scp
, union megasas_sgl
*mfi_sgl
)
1267 struct scatterlist
*os_sgl
;
1269 sge_count
= scsi_dma_map(scp
);
1272 scsi_for_each_sg(scp
, os_sgl
, sge_count
, i
) {
1273 mfi_sgl
->sge_skinny
[i
].length
=
1274 cpu_to_le32(sg_dma_len(os_sgl
));
1275 mfi_sgl
->sge_skinny
[i
].phys_addr
=
1276 cpu_to_le64(sg_dma_address(os_sgl
));
1277 mfi_sgl
->sge_skinny
[i
].flag
= cpu_to_le32(0);
1284 * megasas_get_frame_count - Computes the number of frames
1285 * @frame_type : type of frame- io or pthru frame
1286 * @sge_count : number of sg elements
1288 * Returns the number of frames required for numnber of sge's (sge_count)
1291 static u32
megasas_get_frame_count(struct megasas_instance
*instance
,
1292 u8 sge_count
, u8 frame_type
)
1297 u32 frame_count
= 0;
1299 sge_sz
= (IS_DMA64
) ? sizeof(struct megasas_sge64
) :
1300 sizeof(struct megasas_sge32
);
1302 if (instance
->flag_ieee
) {
1303 sge_sz
= sizeof(struct megasas_sge_skinny
);
1307 * Main frame can contain 2 SGEs for 64-bit SGLs and
1308 * 3 SGEs for 32-bit SGLs for ldio &
1309 * 1 SGEs for 64-bit SGLs and
1310 * 2 SGEs for 32-bit SGLs for pthru frame
1312 if (unlikely(frame_type
== PTHRU_FRAME
)) {
1313 if (instance
->flag_ieee
== 1) {
1314 num_cnt
= sge_count
- 1;
1315 } else if (IS_DMA64
)
1316 num_cnt
= sge_count
- 1;
1318 num_cnt
= sge_count
- 2;
1320 if (instance
->flag_ieee
== 1) {
1321 num_cnt
= sge_count
- 1;
1322 } else if (IS_DMA64
)
1323 num_cnt
= sge_count
- 2;
1325 num_cnt
= sge_count
- 3;
1329 sge_bytes
= sge_sz
* num_cnt
;
1331 frame_count
= (sge_bytes
/ MEGAMFI_FRAME_SIZE
) +
1332 ((sge_bytes
% MEGAMFI_FRAME_SIZE
) ? 1 : 0) ;
1337 if (frame_count
> 7)
1343 * megasas_build_dcdb - Prepares a direct cdb (DCDB) command
1344 * @instance: Adapter soft state
1345 * @scp: SCSI command
1346 * @cmd: Command to be prepared in
1348 * This function prepares CDB commands. These are typcially pass-through
1349 * commands to the devices.
1352 megasas_build_dcdb(struct megasas_instance
*instance
, struct scsi_cmnd
*scp
,
1353 struct megasas_cmd
*cmd
)
1358 struct megasas_pthru_frame
*pthru
;
1360 is_logical
= MEGASAS_IS_LOGICAL(scp
->device
);
1361 device_id
= MEGASAS_DEV_INDEX(scp
);
1362 pthru
= (struct megasas_pthru_frame
*)cmd
->frame
;
1364 if (scp
->sc_data_direction
== DMA_TO_DEVICE
)
1365 flags
= MFI_FRAME_DIR_WRITE
;
1366 else if (scp
->sc_data_direction
== DMA_FROM_DEVICE
)
1367 flags
= MFI_FRAME_DIR_READ
;
1368 else if (scp
->sc_data_direction
== DMA_NONE
)
1369 flags
= MFI_FRAME_DIR_NONE
;
1371 if (instance
->flag_ieee
== 1) {
1372 flags
|= MFI_FRAME_IEEE
;
1376 * Prepare the DCDB frame
1378 pthru
->cmd
= (is_logical
) ? MFI_CMD_LD_SCSI_IO
: MFI_CMD_PD_SCSI_IO
;
1379 pthru
->cmd_status
= 0x0;
1380 pthru
->scsi_status
= 0x0;
1381 pthru
->target_id
= device_id
;
1382 pthru
->lun
= scp
->device
->lun
;
1383 pthru
->cdb_len
= scp
->cmd_len
;
1386 pthru
->flags
= cpu_to_le16(flags
);
1387 pthru
->data_xfer_len
= cpu_to_le32(scsi_bufflen(scp
));
1389 memcpy(pthru
->cdb
, scp
->cmnd
, scp
->cmd_len
);
1392 * If the command is for the tape device, set the
1393 * pthru timeout to the os layer timeout value.
1395 if (scp
->device
->type
== TYPE_TAPE
) {
1396 if ((scp
->request
->timeout
/ HZ
) > 0xFFFF)
1397 pthru
->timeout
= cpu_to_le16(0xFFFF);
1399 pthru
->timeout
= cpu_to_le16(scp
->request
->timeout
/ HZ
);
1405 if (instance
->flag_ieee
== 1) {
1406 pthru
->flags
|= cpu_to_le16(MFI_FRAME_SGL64
);
1407 pthru
->sge_count
= megasas_make_sgl_skinny(instance
, scp
,
1409 } else if (IS_DMA64
) {
1410 pthru
->flags
|= cpu_to_le16(MFI_FRAME_SGL64
);
1411 pthru
->sge_count
= megasas_make_sgl64(instance
, scp
,
1414 pthru
->sge_count
= megasas_make_sgl32(instance
, scp
,
1417 if (pthru
->sge_count
> instance
->max_num_sge
) {
1418 dev_err(&instance
->pdev
->dev
, "DCDB too many SGE NUM=%x\n",
1424 * Sense info specific
1426 pthru
->sense_len
= SCSI_SENSE_BUFFERSIZE
;
1427 pthru
->sense_buf_phys_addr_hi
=
1428 cpu_to_le32(upper_32_bits(cmd
->sense_phys_addr
));
1429 pthru
->sense_buf_phys_addr_lo
=
1430 cpu_to_le32(lower_32_bits(cmd
->sense_phys_addr
));
1433 * Compute the total number of frames this command consumes. FW uses
1434 * this number to pull sufficient number of frames from host memory.
1436 cmd
->frame_count
= megasas_get_frame_count(instance
, pthru
->sge_count
,
1439 return cmd
->frame_count
;
1443 * megasas_build_ldio - Prepares IOs to logical devices
1444 * @instance: Adapter soft state
1445 * @scp: SCSI command
1446 * @cmd: Command to be prepared
1448 * Frames (and accompanying SGLs) for regular SCSI IOs use this function.
1451 megasas_build_ldio(struct megasas_instance
*instance
, struct scsi_cmnd
*scp
,
1452 struct megasas_cmd
*cmd
)
1455 u8 sc
= scp
->cmnd
[0];
1457 struct megasas_io_frame
*ldio
;
1459 device_id
= MEGASAS_DEV_INDEX(scp
);
1460 ldio
= (struct megasas_io_frame
*)cmd
->frame
;
1462 if (scp
->sc_data_direction
== DMA_TO_DEVICE
)
1463 flags
= MFI_FRAME_DIR_WRITE
;
1464 else if (scp
->sc_data_direction
== DMA_FROM_DEVICE
)
1465 flags
= MFI_FRAME_DIR_READ
;
1467 if (instance
->flag_ieee
== 1) {
1468 flags
|= MFI_FRAME_IEEE
;
1472 * Prepare the Logical IO frame: 2nd bit is zero for all read cmds
1474 ldio
->cmd
= (sc
& 0x02) ? MFI_CMD_LD_WRITE
: MFI_CMD_LD_READ
;
1475 ldio
->cmd_status
= 0x0;
1476 ldio
->scsi_status
= 0x0;
1477 ldio
->target_id
= device_id
;
1479 ldio
->reserved_0
= 0;
1481 ldio
->flags
= cpu_to_le16(flags
);
1482 ldio
->start_lba_hi
= 0;
1483 ldio
->access_byte
= (scp
->cmd_len
!= 6) ? scp
->cmnd
[1] : 0;
1486 * 6-byte READ(0x08) or WRITE(0x0A) cdb
1488 if (scp
->cmd_len
== 6) {
1489 ldio
->lba_count
= cpu_to_le32((u32
) scp
->cmnd
[4]);
1490 ldio
->start_lba_lo
= cpu_to_le32(((u32
) scp
->cmnd
[1] << 16) |
1491 ((u32
) scp
->cmnd
[2] << 8) |
1492 (u32
) scp
->cmnd
[3]);
1494 ldio
->start_lba_lo
&= cpu_to_le32(0x1FFFFF);
1498 * 10-byte READ(0x28) or WRITE(0x2A) cdb
1500 else if (scp
->cmd_len
== 10) {
1501 ldio
->lba_count
= cpu_to_le32((u32
) scp
->cmnd
[8] |
1502 ((u32
) scp
->cmnd
[7] << 8));
1503 ldio
->start_lba_lo
= cpu_to_le32(((u32
) scp
->cmnd
[2] << 24) |
1504 ((u32
) scp
->cmnd
[3] << 16) |
1505 ((u32
) scp
->cmnd
[4] << 8) |
1506 (u32
) scp
->cmnd
[5]);
1510 * 12-byte READ(0xA8) or WRITE(0xAA) cdb
1512 else if (scp
->cmd_len
== 12) {
1513 ldio
->lba_count
= cpu_to_le32(((u32
) scp
->cmnd
[6] << 24) |
1514 ((u32
) scp
->cmnd
[7] << 16) |
1515 ((u32
) scp
->cmnd
[8] << 8) |
1516 (u32
) scp
->cmnd
[9]);
1518 ldio
->start_lba_lo
= cpu_to_le32(((u32
) scp
->cmnd
[2] << 24) |
1519 ((u32
) scp
->cmnd
[3] << 16) |
1520 ((u32
) scp
->cmnd
[4] << 8) |
1521 (u32
) scp
->cmnd
[5]);
1525 * 16-byte READ(0x88) or WRITE(0x8A) cdb
1527 else if (scp
->cmd_len
== 16) {
1528 ldio
->lba_count
= cpu_to_le32(((u32
) scp
->cmnd
[10] << 24) |
1529 ((u32
) scp
->cmnd
[11] << 16) |
1530 ((u32
) scp
->cmnd
[12] << 8) |
1531 (u32
) scp
->cmnd
[13]);
1533 ldio
->start_lba_lo
= cpu_to_le32(((u32
) scp
->cmnd
[6] << 24) |
1534 ((u32
) scp
->cmnd
[7] << 16) |
1535 ((u32
) scp
->cmnd
[8] << 8) |
1536 (u32
) scp
->cmnd
[9]);
1538 ldio
->start_lba_hi
= cpu_to_le32(((u32
) scp
->cmnd
[2] << 24) |
1539 ((u32
) scp
->cmnd
[3] << 16) |
1540 ((u32
) scp
->cmnd
[4] << 8) |
1541 (u32
) scp
->cmnd
[5]);
1548 if (instance
->flag_ieee
) {
1549 ldio
->flags
|= cpu_to_le16(MFI_FRAME_SGL64
);
1550 ldio
->sge_count
= megasas_make_sgl_skinny(instance
, scp
,
1552 } else if (IS_DMA64
) {
1553 ldio
->flags
|= cpu_to_le16(MFI_FRAME_SGL64
);
1554 ldio
->sge_count
= megasas_make_sgl64(instance
, scp
, &ldio
->sgl
);
1556 ldio
->sge_count
= megasas_make_sgl32(instance
, scp
, &ldio
->sgl
);
1558 if (ldio
->sge_count
> instance
->max_num_sge
) {
1559 dev_err(&instance
->pdev
->dev
, "build_ld_io: sge_count = %x\n",
1565 * Sense info specific
1567 ldio
->sense_len
= SCSI_SENSE_BUFFERSIZE
;
1568 ldio
->sense_buf_phys_addr_hi
= 0;
1569 ldio
->sense_buf_phys_addr_lo
= cpu_to_le32(cmd
->sense_phys_addr
);
1572 * Compute the total number of frames this command consumes. FW uses
1573 * this number to pull sufficient number of frames from host memory.
1575 cmd
->frame_count
= megasas_get_frame_count(instance
,
1576 ldio
->sge_count
, IO_FRAME
);
1578 return cmd
->frame_count
;
1582 * megasas_cmd_type - Checks if the cmd is for logical drive/sysPD
1583 * and whether it's RW or non RW
1584 * @scmd: SCSI command
1587 inline int megasas_cmd_type(struct scsi_cmnd
*cmd
)
1591 switch (cmd
->cmnd
[0]) {
1600 ret
= (MEGASAS_IS_LOGICAL(cmd
->device
)) ?
1601 READ_WRITE_LDIO
: READ_WRITE_SYSPDIO
;
1604 ret
= (MEGASAS_IS_LOGICAL(cmd
->device
)) ?
1605 NON_READ_WRITE_LDIO
: NON_READ_WRITE_SYSPDIO
;
1611 * megasas_dump_pending_frames - Dumps the frame address of all pending cmds
1613 * @instance: Adapter soft state
1616 megasas_dump_pending_frames(struct megasas_instance
*instance
)
1618 struct megasas_cmd
*cmd
;
1620 union megasas_sgl
*mfi_sgl
;
1621 struct megasas_io_frame
*ldio
;
1622 struct megasas_pthru_frame
*pthru
;
1624 u16 max_cmd
= instance
->max_fw_cmds
;
1626 dev_err(&instance
->pdev
->dev
, "[%d]: Dumping Frame Phys Address of all pending cmds in FW\n",instance
->host
->host_no
);
1627 dev_err(&instance
->pdev
->dev
, "[%d]: Total OS Pending cmds : %d\n",instance
->host
->host_no
,atomic_read(&instance
->fw_outstanding
));
1629 dev_err(&instance
->pdev
->dev
, "[%d]: 64 bit SGLs were sent to FW\n",instance
->host
->host_no
);
1631 dev_err(&instance
->pdev
->dev
, "[%d]: 32 bit SGLs were sent to FW\n",instance
->host
->host_no
);
1633 dev_err(&instance
->pdev
->dev
, "[%d]: Pending OS cmds in FW : \n",instance
->host
->host_no
);
1634 for (i
= 0; i
< max_cmd
; i
++) {
1635 cmd
= instance
->cmd_list
[i
];
1638 dev_err(&instance
->pdev
->dev
, "[%d]: Frame addr :0x%08lx : ",instance
->host
->host_no
,(unsigned long)cmd
->frame_phys_addr
);
1639 if (megasas_cmd_type(cmd
->scmd
) == READ_WRITE_LDIO
) {
1640 ldio
= (struct megasas_io_frame
*)cmd
->frame
;
1641 mfi_sgl
= &ldio
->sgl
;
1642 sgcount
= ldio
->sge_count
;
1643 dev_err(&instance
->pdev
->dev
, "[%d]: frame count : 0x%x, Cmd : 0x%x, Tgt id : 0x%x,"
1644 " lba lo : 0x%x, lba_hi : 0x%x, sense_buf addr : 0x%x,sge count : 0x%x\n",
1645 instance
->host
->host_no
, cmd
->frame_count
, ldio
->cmd
, ldio
->target_id
,
1646 le32_to_cpu(ldio
->start_lba_lo
), le32_to_cpu(ldio
->start_lba_hi
),
1647 le32_to_cpu(ldio
->sense_buf_phys_addr_lo
), sgcount
);
1649 pthru
= (struct megasas_pthru_frame
*) cmd
->frame
;
1650 mfi_sgl
= &pthru
->sgl
;
1651 sgcount
= pthru
->sge_count
;
1652 dev_err(&instance
->pdev
->dev
, "[%d]: frame count : 0x%x, Cmd : 0x%x, Tgt id : 0x%x, "
1653 "lun : 0x%x, cdb_len : 0x%x, data xfer len : 0x%x, sense_buf addr : 0x%x,sge count : 0x%x\n",
1654 instance
->host
->host_no
, cmd
->frame_count
, pthru
->cmd
, pthru
->target_id
,
1655 pthru
->lun
, pthru
->cdb_len
, le32_to_cpu(pthru
->data_xfer_len
),
1656 le32_to_cpu(pthru
->sense_buf_phys_addr_lo
), sgcount
);
1658 if (megasas_dbg_lvl
& MEGASAS_DBG_LVL
) {
1659 for (n
= 0; n
< sgcount
; n
++) {
1661 dev_err(&instance
->pdev
->dev
, "sgl len : 0x%x, sgl addr : 0x%llx\n",
1662 le32_to_cpu(mfi_sgl
->sge64
[n
].length
),
1663 le64_to_cpu(mfi_sgl
->sge64
[n
].phys_addr
));
1665 dev_err(&instance
->pdev
->dev
, "sgl len : 0x%x, sgl addr : 0x%x\n",
1666 le32_to_cpu(mfi_sgl
->sge32
[n
].length
),
1667 le32_to_cpu(mfi_sgl
->sge32
[n
].phys_addr
));
1671 dev_err(&instance
->pdev
->dev
, "[%d]: Pending Internal cmds in FW : \n",instance
->host
->host_no
);
1672 for (i
= 0; i
< max_cmd
; i
++) {
1674 cmd
= instance
->cmd_list
[i
];
1676 if (cmd
->sync_cmd
== 1)
1677 dev_err(&instance
->pdev
->dev
, "0x%08lx : ", (unsigned long)cmd
->frame_phys_addr
);
1679 dev_err(&instance
->pdev
->dev
, "[%d]: Dumping Done\n\n",instance
->host
->host_no
);
1683 megasas_build_and_issue_cmd(struct megasas_instance
*instance
,
1684 struct scsi_cmnd
*scmd
)
1686 struct megasas_cmd
*cmd
;
1689 cmd
= megasas_get_cmd(instance
);
1691 return SCSI_MLQUEUE_HOST_BUSY
;
1694 * Logical drive command
1696 if (megasas_cmd_type(scmd
) == READ_WRITE_LDIO
)
1697 frame_count
= megasas_build_ldio(instance
, scmd
, cmd
);
1699 frame_count
= megasas_build_dcdb(instance
, scmd
, cmd
);
1702 goto out_return_cmd
;
1705 scmd
->SCp
.ptr
= (char *)cmd
;
1708 * Issue the command to the FW
1710 atomic_inc(&instance
->fw_outstanding
);
1712 instance
->instancet
->fire_cmd(instance
, cmd
->frame_phys_addr
,
1713 cmd
->frame_count
-1, instance
->reg_set
);
1717 megasas_return_cmd(instance
, cmd
);
1718 return SCSI_MLQUEUE_HOST_BUSY
;
1723 * megasas_queue_command - Queue entry point
1724 * @scmd: SCSI command to be queued
1725 * @done: Callback entry point
1728 megasas_queue_command(struct Scsi_Host
*shost
, struct scsi_cmnd
*scmd
)
1730 struct megasas_instance
*instance
;
1731 struct MR_PRIV_DEVICE
*mr_device_priv_data
;
1733 instance
= (struct megasas_instance
*)
1734 scmd
->device
->host
->hostdata
;
1736 if (instance
->unload
== 1) {
1737 scmd
->result
= DID_NO_CONNECT
<< 16;
1738 scmd
->scsi_done(scmd
);
1742 if (instance
->issuepend_done
== 0)
1743 return SCSI_MLQUEUE_HOST_BUSY
;
1746 /* Check for an mpio path and adjust behavior */
1747 if (atomic_read(&instance
->adprecovery
) == MEGASAS_ADPRESET_SM_INFAULT
) {
1748 if (megasas_check_mpio_paths(instance
, scmd
) ==
1749 (DID_REQUEUE
<< 16)) {
1750 return SCSI_MLQUEUE_HOST_BUSY
;
1752 scmd
->result
= DID_NO_CONNECT
<< 16;
1753 scmd
->scsi_done(scmd
);
1758 if (atomic_read(&instance
->adprecovery
) == MEGASAS_HW_CRITICAL_ERROR
) {
1759 scmd
->result
= DID_NO_CONNECT
<< 16;
1760 scmd
->scsi_done(scmd
);
1764 mr_device_priv_data
= scmd
->device
->hostdata
;
1765 if (!mr_device_priv_data
) {
1766 scmd
->result
= DID_NO_CONNECT
<< 16;
1767 scmd
->scsi_done(scmd
);
1771 if (atomic_read(&instance
->adprecovery
) != MEGASAS_HBA_OPERATIONAL
)
1772 return SCSI_MLQUEUE_HOST_BUSY
;
1774 if (mr_device_priv_data
->tm_busy
)
1775 return SCSI_MLQUEUE_DEVICE_BUSY
;
1780 if (MEGASAS_IS_LOGICAL(scmd
->device
) &&
1781 (scmd
->device
->id
>= instance
->fw_supported_vd_count
||
1782 scmd
->device
->lun
)) {
1783 scmd
->result
= DID_BAD_TARGET
<< 16;
1787 if ((scmd
->cmnd
[0] == SYNCHRONIZE_CACHE
) &&
1788 MEGASAS_IS_LOGICAL(scmd
->device
) &&
1789 (!instance
->fw_sync_cache_support
)) {
1790 scmd
->result
= DID_OK
<< 16;
1794 return instance
->instancet
->build_and_issue_cmd(instance
, scmd
);
1797 scmd
->scsi_done(scmd
);
1801 static struct megasas_instance
*megasas_lookup_instance(u16 host_no
)
1805 for (i
= 0; i
< megasas_mgmt_info
.max_index
; i
++) {
1807 if ((megasas_mgmt_info
.instance
[i
]) &&
1808 (megasas_mgmt_info
.instance
[i
]->host
->host_no
== host_no
))
1809 return megasas_mgmt_info
.instance
[i
];
1816 * megasas_set_dynamic_target_properties -
1817 * Device property set by driver may not be static and it is required to be
1821 * set dma alignment (only for eedp protection enable vd).
1823 * @sdev: OS provided scsi device
1827 void megasas_set_dynamic_target_properties(struct scsi_device
*sdev
,
1828 bool is_target_prop
)
1830 u16 pd_index
= 0, ld
;
1832 struct megasas_instance
*instance
;
1833 struct fusion_context
*fusion
;
1834 struct MR_PRIV_DEVICE
*mr_device_priv_data
;
1835 struct MR_PD_CFG_SEQ_NUM_SYNC
*pd_sync
;
1836 struct MR_LD_RAID
*raid
;
1837 struct MR_DRV_RAID_MAP_ALL
*local_map_ptr
;
1839 instance
= megasas_lookup_instance(sdev
->host
->host_no
);
1840 fusion
= instance
->ctrl_context
;
1841 mr_device_priv_data
= sdev
->hostdata
;
1843 if (!fusion
|| !mr_device_priv_data
)
1846 if (MEGASAS_IS_LOGICAL(sdev
)) {
1847 device_id
= ((sdev
->channel
% 2) * MEGASAS_MAX_DEV_PER_CHANNEL
)
1849 local_map_ptr
= fusion
->ld_drv_map
[(instance
->map_id
& 1)];
1850 ld
= MR_TargetIdToLdGet(device_id
, local_map_ptr
);
1851 if (ld
>= instance
->fw_supported_vd_count
)
1853 raid
= MR_LdRaidGet(ld
, local_map_ptr
);
1855 if (raid
->capability
.ldPiMode
== MR_PROT_INFO_TYPE_CONTROLLER
)
1856 blk_queue_update_dma_alignment(sdev
->request_queue
, 0x7);
1858 mr_device_priv_data
->is_tm_capable
=
1859 raid
->capability
.tmCapable
;
1860 } else if (instance
->use_seqnum_jbod_fp
) {
1861 pd_index
= (sdev
->channel
* MEGASAS_MAX_DEV_PER_CHANNEL
) +
1863 pd_sync
= (void *)fusion
->pd_seq_sync
1864 [(instance
->pd_seq_map_id
- 1) & 1];
1865 mr_device_priv_data
->is_tm_capable
=
1866 pd_sync
->seq
[pd_index
].capability
.tmCapable
;
1869 if (is_target_prop
&& instance
->tgt_prop
->reset_tmo
) {
1871 * If FW provides a target reset timeout value, driver will use
1872 * it. If not set, fallback to default values.
1874 mr_device_priv_data
->target_reset_tmo
=
1875 min_t(u8
, instance
->max_reset_tmo
,
1876 instance
->tgt_prop
->reset_tmo
);
1877 mr_device_priv_data
->task_abort_tmo
= instance
->task_abort_tmo
;
1879 mr_device_priv_data
->target_reset_tmo
=
1880 MEGASAS_DEFAULT_TM_TIMEOUT
;
1881 mr_device_priv_data
->task_abort_tmo
=
1882 MEGASAS_DEFAULT_TM_TIMEOUT
;
1887 * megasas_set_nvme_device_properties -
1889 * set virtual page boundary = 4K (current mr_nvme_pg_size is 4K).
1890 * set maximum io transfer = MDTS of NVME device provided by MR firmware.
1892 * MR firmware provides value in KB. Caller of this function converts
1895 * e.a MDTS=5 means 2^5 * nvme page size. (In case of 4K page size,
1896 * MR firmware provides value 128 as (32 * 4K) = 128K.
1898 * @sdev: scsi device
1899 * @max_io_size: maximum io transfer size
1903 megasas_set_nvme_device_properties(struct scsi_device
*sdev
, u32 max_io_size
)
1905 struct megasas_instance
*instance
;
1906 u32 mr_nvme_pg_size
;
1908 instance
= (struct megasas_instance
*)sdev
->host
->hostdata
;
1909 mr_nvme_pg_size
= max_t(u32
, instance
->nvme_page_size
,
1910 MR_DEFAULT_NVME_PAGE_SIZE
);
1912 blk_queue_max_hw_sectors(sdev
->request_queue
, (max_io_size
/ 512));
1914 blk_queue_flag_set(QUEUE_FLAG_NOMERGES
, sdev
->request_queue
);
1915 blk_queue_virt_boundary(sdev
->request_queue
, mr_nvme_pg_size
- 1);
1920 * megasas_set_static_target_properties -
1921 * Device property set by driver are static and it is not required to be
1922 * updated after OCR.
1925 * set device queue depth
1926 * set nvme device properties. see - megasas_set_nvme_device_properties
1928 * @sdev: scsi device
1929 * @is_target_prop true, if fw provided target properties.
1931 static void megasas_set_static_target_properties(struct scsi_device
*sdev
,
1932 bool is_target_prop
)
1934 u16 target_index
= 0;
1936 u32 device_qd
= MEGASAS_DEFAULT_CMD_PER_LUN
;
1937 u32 max_io_size_kb
= MR_DEFAULT_NVME_MDTS_KB
;
1939 struct megasas_instance
*instance
;
1940 struct MR_PRIV_DEVICE
*mr_device_priv_data
;
1942 instance
= megasas_lookup_instance(sdev
->host
->host_no
);
1943 mr_device_priv_data
= sdev
->hostdata
;
1944 interface_type
= mr_device_priv_data
->interface_type
;
1947 * The RAID firmware may require extended timeouts.
1949 blk_queue_rq_timeout(sdev
->request_queue
, scmd_timeout
* HZ
);
1951 target_index
= (sdev
->channel
* MEGASAS_MAX_DEV_PER_CHANNEL
) + sdev
->id
;
1953 switch (interface_type
) {
1955 device_qd
= MEGASAS_SAS_QD
;
1958 device_qd
= MEGASAS_SATA_QD
;
1961 device_qd
= MEGASAS_NVME_QD
;
1965 if (is_target_prop
) {
1966 tgt_device_qd
= le32_to_cpu(instance
->tgt_prop
->device_qdepth
);
1967 if (tgt_device_qd
&&
1968 (tgt_device_qd
<= instance
->host
->can_queue
))
1969 device_qd
= tgt_device_qd
;
1971 /* max_io_size_kb will be set to non zero for
1972 * nvme based vd and syspd.
1974 max_io_size_kb
= le32_to_cpu(instance
->tgt_prop
->max_io_size_kb
);
1977 if (instance
->nvme_page_size
&& max_io_size_kb
)
1978 megasas_set_nvme_device_properties(sdev
, (max_io_size_kb
<< 10));
1980 scsi_change_queue_depth(sdev
, device_qd
);
1985 static int megasas_slave_configure(struct scsi_device
*sdev
)
1988 struct megasas_instance
*instance
;
1989 int ret_target_prop
= DCMD_FAILED
;
1990 bool is_target_prop
= false;
1992 instance
= megasas_lookup_instance(sdev
->host
->host_no
);
1993 if (instance
->pd_list_not_supported
) {
1994 if (!MEGASAS_IS_LOGICAL(sdev
) && sdev
->type
== TYPE_DISK
) {
1995 pd_index
= (sdev
->channel
* MEGASAS_MAX_DEV_PER_CHANNEL
) +
1997 if (instance
->pd_list
[pd_index
].driveState
!=
2003 mutex_lock(&instance
->reset_mutex
);
2004 /* Send DCMD to Firmware and cache the information */
2005 if ((instance
->pd_info
) && !MEGASAS_IS_LOGICAL(sdev
))
2006 megasas_get_pd_info(instance
, sdev
);
2008 /* Some ventura firmware may not have instance->nvme_page_size set.
2009 * Do not send MR_DCMD_DRV_GET_TARGET_PROP
2011 if ((instance
->tgt_prop
) && (instance
->nvme_page_size
))
2012 ret_target_prop
= megasas_get_target_prop(instance
, sdev
);
2014 is_target_prop
= (ret_target_prop
== DCMD_SUCCESS
) ? true : false;
2015 megasas_set_static_target_properties(sdev
, is_target_prop
);
2017 /* This sdev property may change post OCR */
2018 megasas_set_dynamic_target_properties(sdev
, is_target_prop
);
2020 mutex_unlock(&instance
->reset_mutex
);
2025 static int megasas_slave_alloc(struct scsi_device
*sdev
)
2028 struct megasas_instance
*instance
;
2029 struct MR_PRIV_DEVICE
*mr_device_priv_data
;
2031 instance
= megasas_lookup_instance(sdev
->host
->host_no
);
2032 if (!MEGASAS_IS_LOGICAL(sdev
)) {
2034 * Open the OS scan to the SYSTEM PD
2037 (sdev
->channel
* MEGASAS_MAX_DEV_PER_CHANNEL
) +
2039 if ((instance
->pd_list_not_supported
||
2040 instance
->pd_list
[pd_index
].driveState
==
2041 MR_PD_STATE_SYSTEM
)) {
2048 mr_device_priv_data
= kzalloc(sizeof(*mr_device_priv_data
),
2050 if (!mr_device_priv_data
)
2052 sdev
->hostdata
= mr_device_priv_data
;
2054 atomic_set(&mr_device_priv_data
->r1_ldio_hint
,
2055 instance
->r1_ldio_hint_default
);
2059 static void megasas_slave_destroy(struct scsi_device
*sdev
)
2061 kfree(sdev
->hostdata
);
2062 sdev
->hostdata
= NULL
;
2066 * megasas_complete_outstanding_ioctls - Complete outstanding ioctls after a
2068 * @instance: Adapter soft state
2071 static void megasas_complete_outstanding_ioctls(struct megasas_instance
*instance
)
2074 struct megasas_cmd
*cmd_mfi
;
2075 struct megasas_cmd_fusion
*cmd_fusion
;
2076 struct fusion_context
*fusion
= instance
->ctrl_context
;
2078 /* Find all outstanding ioctls */
2080 for (i
= 0; i
< instance
->max_fw_cmds
; i
++) {
2081 cmd_fusion
= fusion
->cmd_list
[i
];
2082 if (cmd_fusion
->sync_cmd_idx
!= (u32
)ULONG_MAX
) {
2083 cmd_mfi
= instance
->cmd_list
[cmd_fusion
->sync_cmd_idx
];
2084 if (cmd_mfi
->sync_cmd
&&
2085 (cmd_mfi
->frame
->hdr
.cmd
!= MFI_CMD_ABORT
)) {
2086 cmd_mfi
->frame
->hdr
.cmd_status
=
2087 MFI_STAT_WRONG_STATE
;
2088 megasas_complete_cmd(instance
,
2094 for (i
= 0; i
< instance
->max_fw_cmds
; i
++) {
2095 cmd_mfi
= instance
->cmd_list
[i
];
2096 if (cmd_mfi
->sync_cmd
&& cmd_mfi
->frame
->hdr
.cmd
!=
2098 megasas_complete_cmd(instance
, cmd_mfi
, DID_OK
);
2104 void megaraid_sas_kill_hba(struct megasas_instance
*instance
)
2106 /* Set critical error to block I/O & ioctls in case caller didn't */
2107 atomic_set(&instance
->adprecovery
, MEGASAS_HW_CRITICAL_ERROR
);
2108 /* Wait 1 second to ensure IO or ioctls in build have posted */
2110 if ((instance
->pdev
->device
== PCI_DEVICE_ID_LSI_SAS0073SKINNY
) ||
2111 (instance
->pdev
->device
== PCI_DEVICE_ID_LSI_SAS0071SKINNY
) ||
2112 (instance
->adapter_type
!= MFI_SERIES
)) {
2113 if (!instance
->requestorId
) {
2114 writel(MFI_STOP_ADP
, &instance
->reg_set
->doorbell
);
2116 readl(&instance
->reg_set
->doorbell
);
2118 if (instance
->requestorId
&& instance
->peerIsPresent
)
2119 memset(instance
->ld_ids
, 0xff, MEGASAS_MAX_LD_IDS
);
2121 writel(MFI_STOP_ADP
,
2122 &instance
->reg_set
->inbound_doorbell
);
2124 /* Complete outstanding ioctls when adapter is killed */
2125 megasas_complete_outstanding_ioctls(instance
);
2129 * megasas_check_and_restore_queue_depth - Check if queue depth needs to be
2130 * restored to max value
2131 * @instance: Adapter soft state
2135 megasas_check_and_restore_queue_depth(struct megasas_instance
*instance
)
2137 unsigned long flags
;
2139 if (instance
->flag
& MEGASAS_FW_BUSY
2140 && time_after(jiffies
, instance
->last_time
+ 5 * HZ
)
2141 && atomic_read(&instance
->fw_outstanding
) <
2142 instance
->throttlequeuedepth
+ 1) {
2144 spin_lock_irqsave(instance
->host
->host_lock
, flags
);
2145 instance
->flag
&= ~MEGASAS_FW_BUSY
;
2147 instance
->host
->can_queue
= instance
->cur_can_queue
;
2148 spin_unlock_irqrestore(instance
->host
->host_lock
, flags
);
2153 * megasas_complete_cmd_dpc - Returns FW's controller structure
2154 * @instance_addr: Address of adapter soft state
2156 * Tasklet to complete cmds
2158 static void megasas_complete_cmd_dpc(unsigned long instance_addr
)
2163 struct megasas_cmd
*cmd
;
2164 struct megasas_instance
*instance
=
2165 (struct megasas_instance
*)instance_addr
;
2166 unsigned long flags
;
2168 /* If we have already declared adapter dead, donot complete cmds */
2169 if (atomic_read(&instance
->adprecovery
) == MEGASAS_HW_CRITICAL_ERROR
)
2172 spin_lock_irqsave(&instance
->completion_lock
, flags
);
2174 producer
= le32_to_cpu(*instance
->producer
);
2175 consumer
= le32_to_cpu(*instance
->consumer
);
2177 while (consumer
!= producer
) {
2178 context
= le32_to_cpu(instance
->reply_queue
[consumer
]);
2179 if (context
>= instance
->max_fw_cmds
) {
2180 dev_err(&instance
->pdev
->dev
, "Unexpected context value %x\n",
2185 cmd
= instance
->cmd_list
[context
];
2187 megasas_complete_cmd(instance
, cmd
, DID_OK
);
2190 if (consumer
== (instance
->max_fw_cmds
+ 1)) {
2195 *instance
->consumer
= cpu_to_le32(producer
);
2197 spin_unlock_irqrestore(&instance
->completion_lock
, flags
);
2200 * Check if we can restore can_queue
2202 megasas_check_and_restore_queue_depth(instance
);
2205 static void megasas_sriov_heartbeat_handler(struct timer_list
*t
);
2208 * megasas_start_timer - Initializes sriov heartbeat timer object
2209 * @instance: Adapter soft state
2212 void megasas_start_timer(struct megasas_instance
*instance
)
2214 struct timer_list
*timer
= &instance
->sriov_heartbeat_timer
;
2216 timer_setup(timer
, megasas_sriov_heartbeat_handler
, 0);
2217 timer
->expires
= jiffies
+ MEGASAS_SRIOV_HEARTBEAT_INTERVAL_VF
;
2222 megasas_internal_reset_defer_cmds(struct megasas_instance
*instance
);
2225 process_fw_state_change_wq(struct work_struct
*work
);
2227 void megasas_do_ocr(struct megasas_instance
*instance
)
2229 if ((instance
->pdev
->device
== PCI_DEVICE_ID_LSI_SAS1064R
) ||
2230 (instance
->pdev
->device
== PCI_DEVICE_ID_DELL_PERC5
) ||
2231 (instance
->pdev
->device
== PCI_DEVICE_ID_LSI_VERDE_ZCR
)) {
2232 *instance
->consumer
= cpu_to_le32(MEGASAS_ADPRESET_INPROG_SIGN
);
2234 instance
->instancet
->disable_intr(instance
);
2235 atomic_set(&instance
->adprecovery
, MEGASAS_ADPRESET_SM_INFAULT
);
2236 instance
->issuepend_done
= 0;
2238 atomic_set(&instance
->fw_outstanding
, 0);
2239 megasas_internal_reset_defer_cmds(instance
);
2240 process_fw_state_change_wq(&instance
->work_init
);
2243 static int megasas_get_ld_vf_affiliation_111(struct megasas_instance
*instance
,
2246 struct megasas_cmd
*cmd
;
2247 struct megasas_dcmd_frame
*dcmd
;
2248 struct MR_LD_VF_AFFILIATION_111
*new_affiliation_111
= NULL
;
2249 dma_addr_t new_affiliation_111_h
;
2253 cmd
= megasas_get_cmd(instance
);
2256 dev_printk(KERN_DEBUG
, &instance
->pdev
->dev
, "megasas_get_ld_vf_affiliation_111:"
2257 "Failed to get cmd for scsi%d\n",
2258 instance
->host
->host_no
);
2262 dcmd
= &cmd
->frame
->dcmd
;
2264 if (!instance
->vf_affiliation_111
) {
2265 dev_warn(&instance
->pdev
->dev
, "SR-IOV: Couldn't get LD/VF "
2266 "affiliation for scsi%d\n", instance
->host
->host_no
);
2267 megasas_return_cmd(instance
, cmd
);
2272 memset(instance
->vf_affiliation_111
, 0,
2273 sizeof(struct MR_LD_VF_AFFILIATION_111
));
2275 new_affiliation_111
=
2276 dma_alloc_coherent(&instance
->pdev
->dev
,
2277 sizeof(struct MR_LD_VF_AFFILIATION_111
),
2278 &new_affiliation_111_h
, GFP_KERNEL
);
2279 if (!new_affiliation_111
) {
2280 dev_printk(KERN_DEBUG
, &instance
->pdev
->dev
, "SR-IOV: Couldn't allocate "
2281 "memory for new affiliation for scsi%d\n",
2282 instance
->host
->host_no
);
2283 megasas_return_cmd(instance
, cmd
);
2288 memset(dcmd
->mbox
.b
, 0, MFI_MBOX_SIZE
);
2290 dcmd
->cmd
= MFI_CMD_DCMD
;
2291 dcmd
->cmd_status
= MFI_STAT_INVALID_STATUS
;
2292 dcmd
->sge_count
= 1;
2293 dcmd
->flags
= cpu_to_le16(MFI_FRAME_DIR_BOTH
);
2296 dcmd
->data_xfer_len
=
2297 cpu_to_le32(sizeof(struct MR_LD_VF_AFFILIATION_111
));
2298 dcmd
->opcode
= cpu_to_le32(MR_DCMD_LD_VF_MAP_GET_ALL_LDS_111
);
2301 dcmd
->sgl
.sge32
[0].phys_addr
=
2302 cpu_to_le32(instance
->vf_affiliation_111_h
);
2304 dcmd
->sgl
.sge32
[0].phys_addr
=
2305 cpu_to_le32(new_affiliation_111_h
);
2307 dcmd
->sgl
.sge32
[0].length
= cpu_to_le32(
2308 sizeof(struct MR_LD_VF_AFFILIATION_111
));
2310 dev_warn(&instance
->pdev
->dev
, "SR-IOV: Getting LD/VF affiliation for "
2311 "scsi%d\n", instance
->host
->host_no
);
2313 if (megasas_issue_blocked_cmd(instance
, cmd
, 0) != DCMD_SUCCESS
) {
2314 dev_warn(&instance
->pdev
->dev
, "SR-IOV: LD/VF affiliation DCMD"
2315 " failed with status 0x%x for scsi%d\n",
2316 dcmd
->cmd_status
, instance
->host
->host_no
);
2317 retval
= 1; /* Do a scan if we couldn't get affiliation */
2322 thisVf
= new_affiliation_111
->thisVf
;
2323 for (ld
= 0 ; ld
< new_affiliation_111
->vdCount
; ld
++)
2324 if (instance
->vf_affiliation_111
->map
[ld
].policy
[thisVf
] !=
2325 new_affiliation_111
->map
[ld
].policy
[thisVf
]) {
2326 dev_warn(&instance
->pdev
->dev
, "SR-IOV: "
2327 "Got new LD/VF affiliation for scsi%d\n",
2328 instance
->host
->host_no
);
2329 memcpy(instance
->vf_affiliation_111
,
2330 new_affiliation_111
,
2331 sizeof(struct MR_LD_VF_AFFILIATION_111
));
2337 if (new_affiliation_111
) {
2338 dma_free_coherent(&instance
->pdev
->dev
,
2339 sizeof(struct MR_LD_VF_AFFILIATION_111
),
2340 new_affiliation_111
,
2341 new_affiliation_111_h
);
2344 megasas_return_cmd(instance
, cmd
);
2349 static int megasas_get_ld_vf_affiliation_12(struct megasas_instance
*instance
,
2352 struct megasas_cmd
*cmd
;
2353 struct megasas_dcmd_frame
*dcmd
;
2354 struct MR_LD_VF_AFFILIATION
*new_affiliation
= NULL
;
2355 struct MR_LD_VF_MAP
*newmap
= NULL
, *savedmap
= NULL
;
2356 dma_addr_t new_affiliation_h
;
2357 int i
, j
, retval
= 0, found
= 0, doscan
= 0;
2360 cmd
= megasas_get_cmd(instance
);
2363 dev_printk(KERN_DEBUG
, &instance
->pdev
->dev
, "megasas_get_ld_vf_affiliation12: "
2364 "Failed to get cmd for scsi%d\n",
2365 instance
->host
->host_no
);
2369 dcmd
= &cmd
->frame
->dcmd
;
2371 if (!instance
->vf_affiliation
) {
2372 dev_warn(&instance
->pdev
->dev
, "SR-IOV: Couldn't get LD/VF "
2373 "affiliation for scsi%d\n", instance
->host
->host_no
);
2374 megasas_return_cmd(instance
, cmd
);
2379 memset(instance
->vf_affiliation
, 0, (MAX_LOGICAL_DRIVES
+ 1) *
2380 sizeof(struct MR_LD_VF_AFFILIATION
));
2383 dma_alloc_coherent(&instance
->pdev
->dev
,
2384 (MAX_LOGICAL_DRIVES
+ 1) * sizeof(struct MR_LD_VF_AFFILIATION
),
2385 &new_affiliation_h
, GFP_KERNEL
);
2386 if (!new_affiliation
) {
2387 dev_printk(KERN_DEBUG
, &instance
->pdev
->dev
, "SR-IOV: Couldn't allocate "
2388 "memory for new affiliation for scsi%d\n",
2389 instance
->host
->host_no
);
2390 megasas_return_cmd(instance
, cmd
);
2395 memset(dcmd
->mbox
.b
, 0, MFI_MBOX_SIZE
);
2397 dcmd
->cmd
= MFI_CMD_DCMD
;
2398 dcmd
->cmd_status
= MFI_STAT_INVALID_STATUS
;
2399 dcmd
->sge_count
= 1;
2400 dcmd
->flags
= cpu_to_le16(MFI_FRAME_DIR_BOTH
);
2403 dcmd
->data_xfer_len
= cpu_to_le32((MAX_LOGICAL_DRIVES
+ 1) *
2404 sizeof(struct MR_LD_VF_AFFILIATION
));
2405 dcmd
->opcode
= cpu_to_le32(MR_DCMD_LD_VF_MAP_GET_ALL_LDS
);
2408 dcmd
->sgl
.sge32
[0].phys_addr
=
2409 cpu_to_le32(instance
->vf_affiliation_h
);
2411 dcmd
->sgl
.sge32
[0].phys_addr
=
2412 cpu_to_le32(new_affiliation_h
);
2414 dcmd
->sgl
.sge32
[0].length
= cpu_to_le32((MAX_LOGICAL_DRIVES
+ 1) *
2415 sizeof(struct MR_LD_VF_AFFILIATION
));
2417 dev_warn(&instance
->pdev
->dev
, "SR-IOV: Getting LD/VF affiliation for "
2418 "scsi%d\n", instance
->host
->host_no
);
2421 if (megasas_issue_blocked_cmd(instance
, cmd
, 0) != DCMD_SUCCESS
) {
2422 dev_warn(&instance
->pdev
->dev
, "SR-IOV: LD/VF affiliation DCMD"
2423 " failed with status 0x%x for scsi%d\n",
2424 dcmd
->cmd_status
, instance
->host
->host_no
);
2425 retval
= 1; /* Do a scan if we couldn't get affiliation */
2430 if (!new_affiliation
->ldCount
) {
2431 dev_warn(&instance
->pdev
->dev
, "SR-IOV: Got new LD/VF "
2432 "affiliation for passive path for scsi%d\n",
2433 instance
->host
->host_no
);
2437 newmap
= new_affiliation
->map
;
2438 savedmap
= instance
->vf_affiliation
->map
;
2439 thisVf
= new_affiliation
->thisVf
;
2440 for (i
= 0 ; i
< new_affiliation
->ldCount
; i
++) {
2442 for (j
= 0; j
< instance
->vf_affiliation
->ldCount
;
2444 if (newmap
->ref
.targetId
==
2445 savedmap
->ref
.targetId
) {
2447 if (newmap
->policy
[thisVf
] !=
2448 savedmap
->policy
[thisVf
]) {
2453 savedmap
= (struct MR_LD_VF_MAP
*)
2454 ((unsigned char *)savedmap
+
2457 if (!found
&& newmap
->policy
[thisVf
] !=
2458 MR_LD_ACCESS_HIDDEN
) {
2462 newmap
= (struct MR_LD_VF_MAP
*)
2463 ((unsigned char *)newmap
+ newmap
->size
);
2466 newmap
= new_affiliation
->map
;
2467 savedmap
= instance
->vf_affiliation
->map
;
2469 for (i
= 0 ; i
< instance
->vf_affiliation
->ldCount
; i
++) {
2471 for (j
= 0 ; j
< new_affiliation
->ldCount
; j
++) {
2472 if (savedmap
->ref
.targetId
==
2473 newmap
->ref
.targetId
) {
2475 if (savedmap
->policy
[thisVf
] !=
2476 newmap
->policy
[thisVf
]) {
2481 newmap
= (struct MR_LD_VF_MAP
*)
2482 ((unsigned char *)newmap
+
2485 if (!found
&& savedmap
->policy
[thisVf
] !=
2486 MR_LD_ACCESS_HIDDEN
) {
2490 savedmap
= (struct MR_LD_VF_MAP
*)
2491 ((unsigned char *)savedmap
+
2497 dev_warn(&instance
->pdev
->dev
, "SR-IOV: Got new LD/VF "
2498 "affiliation for scsi%d\n", instance
->host
->host_no
);
2499 memcpy(instance
->vf_affiliation
, new_affiliation
,
2500 new_affiliation
->size
);
2504 if (new_affiliation
)
2505 dma_free_coherent(&instance
->pdev
->dev
,
2506 (MAX_LOGICAL_DRIVES
+ 1) *
2507 sizeof(struct MR_LD_VF_AFFILIATION
),
2508 new_affiliation
, new_affiliation_h
);
2509 megasas_return_cmd(instance
, cmd
);
2514 /* This function will get the current SR-IOV LD/VF affiliation */
2515 static int megasas_get_ld_vf_affiliation(struct megasas_instance
*instance
,
2520 if (instance
->PlasmaFW111
)
2521 retval
= megasas_get_ld_vf_affiliation_111(instance
, initial
);
2523 retval
= megasas_get_ld_vf_affiliation_12(instance
, initial
);
2527 /* This function will tell FW to start the SR-IOV heartbeat */
2528 int megasas_sriov_start_heartbeat(struct megasas_instance
*instance
,
2531 struct megasas_cmd
*cmd
;
2532 struct megasas_dcmd_frame
*dcmd
;
2535 cmd
= megasas_get_cmd(instance
);
2538 dev_printk(KERN_DEBUG
, &instance
->pdev
->dev
, "megasas_sriov_start_heartbeat: "
2539 "Failed to get cmd for scsi%d\n",
2540 instance
->host
->host_no
);
2544 dcmd
= &cmd
->frame
->dcmd
;
2547 instance
->hb_host_mem
=
2548 dma_alloc_coherent(&instance
->pdev
->dev
,
2549 sizeof(struct MR_CTRL_HB_HOST_MEM
),
2550 &instance
->hb_host_mem_h
,
2552 if (!instance
->hb_host_mem
) {
2553 dev_printk(KERN_DEBUG
, &instance
->pdev
->dev
, "SR-IOV: Couldn't allocate"
2554 " memory for heartbeat host memory for scsi%d\n",
2555 instance
->host
->host_no
);
2561 memset(dcmd
->mbox
.b
, 0, MFI_MBOX_SIZE
);
2563 dcmd
->mbox
.s
[0] = cpu_to_le16(sizeof(struct MR_CTRL_HB_HOST_MEM
));
2564 dcmd
->cmd
= MFI_CMD_DCMD
;
2565 dcmd
->cmd_status
= MFI_STAT_INVALID_STATUS
;
2566 dcmd
->sge_count
= 1;
2567 dcmd
->flags
= cpu_to_le16(MFI_FRAME_DIR_BOTH
);
2570 dcmd
->data_xfer_len
= cpu_to_le32(sizeof(struct MR_CTRL_HB_HOST_MEM
));
2571 dcmd
->opcode
= cpu_to_le32(MR_DCMD_CTRL_SHARED_HOST_MEM_ALLOC
);
2573 megasas_set_dma_settings(instance
, dcmd
, instance
->hb_host_mem_h
,
2574 sizeof(struct MR_CTRL_HB_HOST_MEM
));
2576 dev_warn(&instance
->pdev
->dev
, "SR-IOV: Starting heartbeat for scsi%d\n",
2577 instance
->host
->host_no
);
2579 if ((instance
->adapter_type
!= MFI_SERIES
) &&
2580 !instance
->mask_interrupts
)
2581 retval
= megasas_issue_blocked_cmd(instance
, cmd
,
2582 MEGASAS_ROUTINE_WAIT_TIME_VF
);
2584 retval
= megasas_issue_polled(instance
, cmd
);
2587 dev_warn(&instance
->pdev
->dev
, "SR-IOV: MR_DCMD_CTRL_SHARED_HOST"
2588 "_MEM_ALLOC DCMD %s for scsi%d\n",
2589 (dcmd
->cmd_status
== MFI_STAT_INVALID_STATUS
) ?
2590 "timed out" : "failed", instance
->host
->host_no
);
2595 megasas_return_cmd(instance
, cmd
);
2600 /* Handler for SR-IOV heartbeat */
2601 static void megasas_sriov_heartbeat_handler(struct timer_list
*t
)
2603 struct megasas_instance
*instance
=
2604 from_timer(instance
, t
, sriov_heartbeat_timer
);
2606 if (instance
->hb_host_mem
->HB
.fwCounter
!=
2607 instance
->hb_host_mem
->HB
.driverCounter
) {
2608 instance
->hb_host_mem
->HB
.driverCounter
=
2609 instance
->hb_host_mem
->HB
.fwCounter
;
2610 mod_timer(&instance
->sriov_heartbeat_timer
,
2611 jiffies
+ MEGASAS_SRIOV_HEARTBEAT_INTERVAL_VF
);
2613 dev_warn(&instance
->pdev
->dev
, "SR-IOV: Heartbeat never "
2614 "completed for scsi%d\n", instance
->host
->host_no
);
2615 schedule_work(&instance
->work_init
);
2620 * megasas_wait_for_outstanding - Wait for all outstanding cmds
2621 * @instance: Adapter soft state
2623 * This function waits for up to MEGASAS_RESET_WAIT_TIME seconds for FW to
2624 * complete all its outstanding commands. Returns error if one or more IOs
2625 * are pending after this time period. It also marks the controller dead.
2627 static int megasas_wait_for_outstanding(struct megasas_instance
*instance
)
2629 int i
, sl
, outstanding
;
2631 u32 wait_time
= MEGASAS_RESET_WAIT_TIME
;
2632 unsigned long flags
;
2633 struct list_head clist_local
;
2634 struct megasas_cmd
*reset_cmd
;
2637 if (atomic_read(&instance
->adprecovery
) == MEGASAS_HW_CRITICAL_ERROR
) {
2638 dev_info(&instance
->pdev
->dev
, "%s:%d HBA is killed.\n",
2639 __func__
, __LINE__
);
2643 if (atomic_read(&instance
->adprecovery
) != MEGASAS_HBA_OPERATIONAL
) {
2645 INIT_LIST_HEAD(&clist_local
);
2646 spin_lock_irqsave(&instance
->hba_lock
, flags
);
2647 list_splice_init(&instance
->internal_reset_pending_q
,
2649 spin_unlock_irqrestore(&instance
->hba_lock
, flags
);
2651 dev_notice(&instance
->pdev
->dev
, "HBA reset wait ...\n");
2652 for (i
= 0; i
< wait_time
; i
++) {
2654 if (atomic_read(&instance
->adprecovery
) == MEGASAS_HBA_OPERATIONAL
)
2658 if (atomic_read(&instance
->adprecovery
) != MEGASAS_HBA_OPERATIONAL
) {
2659 dev_notice(&instance
->pdev
->dev
, "reset: Stopping HBA.\n");
2660 atomic_set(&instance
->adprecovery
, MEGASAS_HW_CRITICAL_ERROR
);
2665 while (!list_empty(&clist_local
)) {
2666 reset_cmd
= list_entry((&clist_local
)->next
,
2667 struct megasas_cmd
, list
);
2668 list_del_init(&reset_cmd
->list
);
2669 if (reset_cmd
->scmd
) {
2670 reset_cmd
->scmd
->result
= DID_REQUEUE
<< 16;
2671 dev_notice(&instance
->pdev
->dev
, "%d:%p reset [%02x]\n",
2672 reset_index
, reset_cmd
,
2673 reset_cmd
->scmd
->cmnd
[0]);
2675 reset_cmd
->scmd
->scsi_done(reset_cmd
->scmd
);
2676 megasas_return_cmd(instance
, reset_cmd
);
2677 } else if (reset_cmd
->sync_cmd
) {
2678 dev_notice(&instance
->pdev
->dev
, "%p synch cmds"
2682 reset_cmd
->cmd_status_drv
= MFI_STAT_INVALID_STATUS
;
2683 instance
->instancet
->fire_cmd(instance
,
2684 reset_cmd
->frame_phys_addr
,
2685 0, instance
->reg_set
);
2687 dev_notice(&instance
->pdev
->dev
, "%p unexpected"
2697 for (i
= 0; i
< resetwaittime
; i
++) {
2698 outstanding
= atomic_read(&instance
->fw_outstanding
);
2703 if (!(i
% MEGASAS_RESET_NOTICE_INTERVAL
)) {
2704 dev_notice(&instance
->pdev
->dev
, "[%2d]waiting for %d "
2705 "commands to complete\n",i
,outstanding
);
2707 * Call cmd completion routine. Cmd to be
2708 * be completed directly without depending on isr.
2710 megasas_complete_cmd_dpc((unsigned long)instance
);
2717 outstanding
= atomic_read(&instance
->fw_outstanding
);
2718 fw_state
= instance
->instancet
->read_fw_status_reg(instance
) & MFI_STATE_MASK
;
2720 if ((!outstanding
&& (fw_state
== MFI_STATE_OPERATIONAL
)))
2721 goto no_outstanding
;
2723 if (instance
->disableOnlineCtrlReset
)
2724 goto kill_hba_and_failed
;
2726 if ((fw_state
== MFI_STATE_FAULT
) || atomic_read(&instance
->fw_outstanding
)) {
2727 dev_info(&instance
->pdev
->dev
,
2728 "%s:%d waiting_for_outstanding: before issue OCR. FW state = 0x%x, oustanding 0x%x\n",
2729 __func__
, __LINE__
, fw_state
, atomic_read(&instance
->fw_outstanding
));
2731 goto kill_hba_and_failed
;
2732 megasas_do_ocr(instance
);
2734 if (atomic_read(&instance
->adprecovery
) == MEGASAS_HW_CRITICAL_ERROR
) {
2735 dev_info(&instance
->pdev
->dev
, "%s:%d OCR failed and HBA is killed.\n",
2736 __func__
, __LINE__
);
2739 dev_info(&instance
->pdev
->dev
, "%s:%d waiting_for_outstanding: after issue OCR.\n",
2740 __func__
, __LINE__
);
2742 for (sl
= 0; sl
< 10; sl
++)
2745 outstanding
= atomic_read(&instance
->fw_outstanding
);
2747 fw_state
= instance
->instancet
->read_fw_status_reg(instance
) & MFI_STATE_MASK
;
2748 if ((!outstanding
&& (fw_state
== MFI_STATE_OPERATIONAL
)))
2749 goto no_outstanding
;
2756 dev_info(&instance
->pdev
->dev
, "%s:%d no more pending commands remain after reset handling.\n",
2757 __func__
, __LINE__
);
2760 kill_hba_and_failed
:
2762 /* Reset not supported, kill adapter */
2763 dev_info(&instance
->pdev
->dev
, "%s:%d killing adapter scsi%d"
2764 " disableOnlineCtrlReset %d fw_outstanding %d \n",
2765 __func__
, __LINE__
, instance
->host
->host_no
, instance
->disableOnlineCtrlReset
,
2766 atomic_read(&instance
->fw_outstanding
));
2767 megasas_dump_pending_frames(instance
);
2768 megaraid_sas_kill_hba(instance
);
2774 * megasas_generic_reset - Generic reset routine
2775 * @scmd: Mid-layer SCSI command
2777 * This routine implements a generic reset handler for device, bus and host
2778 * reset requests. Device, bus and host specific reset handlers can use this
2779 * function after they do their specific tasks.
2781 static int megasas_generic_reset(struct scsi_cmnd
*scmd
)
2784 struct megasas_instance
*instance
;
2786 instance
= (struct megasas_instance
*)scmd
->device
->host
->hostdata
;
2788 scmd_printk(KERN_NOTICE
, scmd
, "megasas: RESET cmd=%x retries=%x\n",
2789 scmd
->cmnd
[0], scmd
->retries
);
2791 if (atomic_read(&instance
->adprecovery
) == MEGASAS_HW_CRITICAL_ERROR
) {
2792 dev_err(&instance
->pdev
->dev
, "cannot recover from previous reset failures\n");
2796 ret_val
= megasas_wait_for_outstanding(instance
);
2797 if (ret_val
== SUCCESS
)
2798 dev_notice(&instance
->pdev
->dev
, "reset successful\n");
2800 dev_err(&instance
->pdev
->dev
, "failed to do reset\n");
2806 * megasas_reset_timer - quiesce the adapter if required
2809 * Sets the FW busy flag and reduces the host->can_queue if the
2810 * cmd has not been completed within the timeout period.
2813 blk_eh_timer_return
megasas_reset_timer(struct scsi_cmnd
*scmd
)
2815 struct megasas_instance
*instance
;
2816 unsigned long flags
;
2818 if (time_after(jiffies
, scmd
->jiffies_at_alloc
+
2819 (scmd_timeout
* 2) * HZ
)) {
2823 instance
= (struct megasas_instance
*)scmd
->device
->host
->hostdata
;
2824 if (!(instance
->flag
& MEGASAS_FW_BUSY
)) {
2825 /* FW is busy, throttle IO */
2826 spin_lock_irqsave(instance
->host
->host_lock
, flags
);
2828 instance
->host
->can_queue
= instance
->throttlequeuedepth
;
2829 instance
->last_time
= jiffies
;
2830 instance
->flag
|= MEGASAS_FW_BUSY
;
2832 spin_unlock_irqrestore(instance
->host
->host_lock
, flags
);
2834 return BLK_EH_RESET_TIMER
;
2838 * megasas_dump_frame - This function will dump MPT/MFI frame
2841 megasas_dump_frame(void *mpi_request
, int sz
)
2844 __le32
*mfp
= (__le32
*)mpi_request
;
2846 printk(KERN_INFO
"IO request frame:\n\t");
2847 for (i
= 0; i
< sz
/ sizeof(__le32
); i
++) {
2848 if (i
&& ((i
% 8) == 0))
2850 printk("%08x ", le32_to_cpu(mfp
[i
]));
2856 * megasas_reset_bus_host - Bus & host reset handler entry point
2858 static int megasas_reset_bus_host(struct scsi_cmnd
*scmd
)
2861 struct megasas_instance
*instance
;
2863 instance
= (struct megasas_instance
*)scmd
->device
->host
->hostdata
;
2865 scmd_printk(KERN_INFO
, scmd
,
2866 "Controller reset is requested due to IO timeout\n"
2867 "SCSI command pointer: (%p)\t SCSI host state: %d\t"
2868 " SCSI host busy: %d\t FW outstanding: %d\n",
2869 scmd
, scmd
->device
->host
->shost_state
,
2870 scsi_host_busy(scmd
->device
->host
),
2871 atomic_read(&instance
->fw_outstanding
));
2874 * First wait for all commands to complete
2876 if (instance
->adapter_type
== MFI_SERIES
) {
2877 ret
= megasas_generic_reset(scmd
);
2879 struct megasas_cmd_fusion
*cmd
;
2880 cmd
= (struct megasas_cmd_fusion
*)scmd
->SCp
.ptr
;
2882 megasas_dump_frame(cmd
->io_request
,
2883 MEGA_MPI2_RAID_DEFAULT_IO_FRAME_SIZE
);
2884 ret
= megasas_reset_fusion(scmd
->device
->host
,
2885 SCSIIO_TIMEOUT_OCR
);
2892 * megasas_task_abort - Issues task abort request to firmware
2893 * (supported only for fusion adapters)
2894 * @scmd: SCSI command pointer
2896 static int megasas_task_abort(struct scsi_cmnd
*scmd
)
2899 struct megasas_instance
*instance
;
2901 instance
= (struct megasas_instance
*)scmd
->device
->host
->hostdata
;
2903 if (instance
->adapter_type
!= MFI_SERIES
)
2904 ret
= megasas_task_abort_fusion(scmd
);
2906 sdev_printk(KERN_NOTICE
, scmd
->device
, "TASK ABORT not supported\n");
2914 * megasas_reset_target: Issues target reset request to firmware
2915 * (supported only for fusion adapters)
2916 * @scmd: SCSI command pointer
2918 static int megasas_reset_target(struct scsi_cmnd
*scmd
)
2921 struct megasas_instance
*instance
;
2923 instance
= (struct megasas_instance
*)scmd
->device
->host
->hostdata
;
2925 if (instance
->adapter_type
!= MFI_SERIES
)
2926 ret
= megasas_reset_target_fusion(scmd
);
2928 sdev_printk(KERN_NOTICE
, scmd
->device
, "TARGET RESET not supported\n");
2936 * megasas_bios_param - Returns disk geometry for a disk
2937 * @sdev: device handle
2938 * @bdev: block device
2939 * @capacity: drive capacity
2940 * @geom: geometry parameters
2943 megasas_bios_param(struct scsi_device
*sdev
, struct block_device
*bdev
,
2944 sector_t capacity
, int geom
[])
2951 /* Default heads (64) & sectors (32) */
2955 tmp
= heads
* sectors
;
2956 cylinders
= capacity
;
2958 sector_div(cylinders
, tmp
);
2961 * Handle extended translation size for logical drives > 1Gb
2964 if (capacity
>= 0x200000) {
2967 tmp
= heads
*sectors
;
2968 cylinders
= capacity
;
2969 sector_div(cylinders
, tmp
);
2974 geom
[2] = cylinders
;
2979 static void megasas_aen_polling(struct work_struct
*work
);
2982 * megasas_service_aen - Processes an event notification
2983 * @instance: Adapter soft state
2984 * @cmd: AEN command completed by the ISR
2986 * For AEN, driver sends a command down to FW that is held by the FW till an
2987 * event occurs. When an event of interest occurs, FW completes the command
2988 * that it was previously holding.
2990 * This routines sends SIGIO signal to processes that have registered with the
2994 megasas_service_aen(struct megasas_instance
*instance
, struct megasas_cmd
*cmd
)
2996 unsigned long flags
;
2999 * Don't signal app if it is just an aborted previously registered aen
3001 if ((!cmd
->abort_aen
) && (instance
->unload
== 0)) {
3002 spin_lock_irqsave(&poll_aen_lock
, flags
);
3003 megasas_poll_wait_aen
= 1;
3004 spin_unlock_irqrestore(&poll_aen_lock
, flags
);
3005 wake_up(&megasas_poll_wait
);
3006 kill_fasync(&megasas_async_queue
, SIGIO
, POLL_IN
);
3011 instance
->aen_cmd
= NULL
;
3013 megasas_return_cmd(instance
, cmd
);
3015 if ((instance
->unload
== 0) &&
3016 ((instance
->issuepend_done
== 1))) {
3017 struct megasas_aen_event
*ev
;
3019 ev
= kzalloc(sizeof(*ev
), GFP_ATOMIC
);
3021 dev_err(&instance
->pdev
->dev
, "megasas_service_aen: out of memory\n");
3023 ev
->instance
= instance
;
3025 INIT_DELAYED_WORK(&ev
->hotplug_work
,
3026 megasas_aen_polling
);
3027 schedule_delayed_work(&ev
->hotplug_work
, 0);
3033 megasas_fw_crash_buffer_store(struct device
*cdev
,
3034 struct device_attribute
*attr
, const char *buf
, size_t count
)
3036 struct Scsi_Host
*shost
= class_to_shost(cdev
);
3037 struct megasas_instance
*instance
=
3038 (struct megasas_instance
*) shost
->hostdata
;
3040 unsigned long flags
;
3042 if (kstrtoint(buf
, 0, &val
) != 0)
3045 spin_lock_irqsave(&instance
->crashdump_lock
, flags
);
3046 instance
->fw_crash_buffer_offset
= val
;
3047 spin_unlock_irqrestore(&instance
->crashdump_lock
, flags
);
3052 megasas_fw_crash_buffer_show(struct device
*cdev
,
3053 struct device_attribute
*attr
, char *buf
)
3055 struct Scsi_Host
*shost
= class_to_shost(cdev
);
3056 struct megasas_instance
*instance
=
3057 (struct megasas_instance
*) shost
->hostdata
;
3059 unsigned long buff_addr
;
3060 unsigned long dmachunk
= CRASH_DMA_BUF_SIZE
;
3061 unsigned long src_addr
;
3062 unsigned long flags
;
3065 spin_lock_irqsave(&instance
->crashdump_lock
, flags
);
3066 buff_offset
= instance
->fw_crash_buffer_offset
;
3067 if (!instance
->crash_dump_buf
&&
3068 !((instance
->fw_crash_state
== AVAILABLE
) ||
3069 (instance
->fw_crash_state
== COPYING
))) {
3070 dev_err(&instance
->pdev
->dev
,
3071 "Firmware crash dump is not available\n");
3072 spin_unlock_irqrestore(&instance
->crashdump_lock
, flags
);
3076 buff_addr
= (unsigned long) buf
;
3078 if (buff_offset
> (instance
->fw_crash_buffer_size
* dmachunk
)) {
3079 dev_err(&instance
->pdev
->dev
,
3080 "Firmware crash dump offset is out of range\n");
3081 spin_unlock_irqrestore(&instance
->crashdump_lock
, flags
);
3085 size
= (instance
->fw_crash_buffer_size
* dmachunk
) - buff_offset
;
3086 size
= (size
>= PAGE_SIZE
) ? (PAGE_SIZE
- 1) : size
;
3088 src_addr
= (unsigned long)instance
->crash_buf
[buff_offset
/ dmachunk
] +
3089 (buff_offset
% dmachunk
);
3090 memcpy(buf
, (void *)src_addr
, size
);
3091 spin_unlock_irqrestore(&instance
->crashdump_lock
, flags
);
3097 megasas_fw_crash_buffer_size_show(struct device
*cdev
,
3098 struct device_attribute
*attr
, char *buf
)
3100 struct Scsi_Host
*shost
= class_to_shost(cdev
);
3101 struct megasas_instance
*instance
=
3102 (struct megasas_instance
*) shost
->hostdata
;
3104 return snprintf(buf
, PAGE_SIZE
, "%ld\n", (unsigned long)
3105 ((instance
->fw_crash_buffer_size
) * 1024 * 1024)/PAGE_SIZE
);
3109 megasas_fw_crash_state_store(struct device
*cdev
,
3110 struct device_attribute
*attr
, const char *buf
, size_t count
)
3112 struct Scsi_Host
*shost
= class_to_shost(cdev
);
3113 struct megasas_instance
*instance
=
3114 (struct megasas_instance
*) shost
->hostdata
;
3116 unsigned long flags
;
3118 if (kstrtoint(buf
, 0, &val
) != 0)
3121 if ((val
<= AVAILABLE
|| val
> COPY_ERROR
)) {
3122 dev_err(&instance
->pdev
->dev
, "application updates invalid "
3123 "firmware crash state\n");
3127 instance
->fw_crash_state
= val
;
3129 if ((val
== COPIED
) || (val
== COPY_ERROR
)) {
3130 spin_lock_irqsave(&instance
->crashdump_lock
, flags
);
3131 megasas_free_host_crash_buffer(instance
);
3132 spin_unlock_irqrestore(&instance
->crashdump_lock
, flags
);
3133 if (val
== COPY_ERROR
)
3134 dev_info(&instance
->pdev
->dev
, "application failed to "
3135 "copy Firmware crash dump\n");
3137 dev_info(&instance
->pdev
->dev
, "Firmware crash dump "
3138 "copied successfully\n");
3144 megasas_fw_crash_state_show(struct device
*cdev
,
3145 struct device_attribute
*attr
, char *buf
)
3147 struct Scsi_Host
*shost
= class_to_shost(cdev
);
3148 struct megasas_instance
*instance
=
3149 (struct megasas_instance
*) shost
->hostdata
;
3151 return snprintf(buf
, PAGE_SIZE
, "%d\n", instance
->fw_crash_state
);
3155 megasas_page_size_show(struct device
*cdev
,
3156 struct device_attribute
*attr
, char *buf
)
3158 return snprintf(buf
, PAGE_SIZE
, "%ld\n", (unsigned long)PAGE_SIZE
- 1);
3162 megasas_ldio_outstanding_show(struct device
*cdev
, struct device_attribute
*attr
,
3165 struct Scsi_Host
*shost
= class_to_shost(cdev
);
3166 struct megasas_instance
*instance
= (struct megasas_instance
*)shost
->hostdata
;
3168 return snprintf(buf
, PAGE_SIZE
, "%d\n", atomic_read(&instance
->ldio_outstanding
));
3172 megasas_fw_cmds_outstanding_show(struct device
*cdev
,
3173 struct device_attribute
*attr
, char *buf
)
3175 struct Scsi_Host
*shost
= class_to_shost(cdev
);
3176 struct megasas_instance
*instance
= (struct megasas_instance
*)shost
->hostdata
;
3178 return snprintf(buf
, PAGE_SIZE
, "%d\n", atomic_read(&instance
->fw_outstanding
));
3181 static DEVICE_ATTR(fw_crash_buffer
, S_IRUGO
| S_IWUSR
,
3182 megasas_fw_crash_buffer_show
, megasas_fw_crash_buffer_store
);
3183 static DEVICE_ATTR(fw_crash_buffer_size
, S_IRUGO
,
3184 megasas_fw_crash_buffer_size_show
, NULL
);
3185 static DEVICE_ATTR(fw_crash_state
, S_IRUGO
| S_IWUSR
,
3186 megasas_fw_crash_state_show
, megasas_fw_crash_state_store
);
3187 static DEVICE_ATTR(page_size
, S_IRUGO
,
3188 megasas_page_size_show
, NULL
);
3189 static DEVICE_ATTR(ldio_outstanding
, S_IRUGO
,
3190 megasas_ldio_outstanding_show
, NULL
);
3191 static DEVICE_ATTR(fw_cmds_outstanding
, S_IRUGO
,
3192 megasas_fw_cmds_outstanding_show
, NULL
);
3194 struct device_attribute
*megaraid_host_attrs
[] = {
3195 &dev_attr_fw_crash_buffer_size
,
3196 &dev_attr_fw_crash_buffer
,
3197 &dev_attr_fw_crash_state
,
3198 &dev_attr_page_size
,
3199 &dev_attr_ldio_outstanding
,
3200 &dev_attr_fw_cmds_outstanding
,
3205 * Scsi host template for megaraid_sas driver
3207 static struct scsi_host_template megasas_template
= {
3209 .module
= THIS_MODULE
,
3210 .name
= "Avago SAS based MegaRAID driver",
3211 .proc_name
= "megaraid_sas",
3212 .slave_configure
= megasas_slave_configure
,
3213 .slave_alloc
= megasas_slave_alloc
,
3214 .slave_destroy
= megasas_slave_destroy
,
3215 .queuecommand
= megasas_queue_command
,
3216 .eh_target_reset_handler
= megasas_reset_target
,
3217 .eh_abort_handler
= megasas_task_abort
,
3218 .eh_host_reset_handler
= megasas_reset_bus_host
,
3219 .eh_timed_out
= megasas_reset_timer
,
3220 .shost_attrs
= megaraid_host_attrs
,
3221 .bios_param
= megasas_bios_param
,
3222 .change_queue_depth
= scsi_change_queue_depth
,
3227 * megasas_complete_int_cmd - Completes an internal command
3228 * @instance: Adapter soft state
3229 * @cmd: Command to be completed
3231 * The megasas_issue_blocked_cmd() function waits for a command to complete
3232 * after it issues a command. This function wakes up that waiting routine by
3233 * calling wake_up() on the wait queue.
3236 megasas_complete_int_cmd(struct megasas_instance
*instance
,
3237 struct megasas_cmd
*cmd
)
3239 cmd
->cmd_status_drv
= cmd
->frame
->io
.cmd_status
;
3240 wake_up(&instance
->int_cmd_wait_q
);
3244 * megasas_complete_abort - Completes aborting a command
3245 * @instance: Adapter soft state
3246 * @cmd: Cmd that was issued to abort another cmd
3248 * The megasas_issue_blocked_abort_cmd() function waits on abort_cmd_wait_q
3249 * after it issues an abort on a previously issued command. This function
3250 * wakes up all functions waiting on the same wait queue.
3253 megasas_complete_abort(struct megasas_instance
*instance
,
3254 struct megasas_cmd
*cmd
)
3256 if (cmd
->sync_cmd
) {
3258 cmd
->cmd_status_drv
= 0;
3259 wake_up(&instance
->abort_cmd_wait_q
);
3264 * megasas_complete_cmd - Completes a command
3265 * @instance: Adapter soft state
3266 * @cmd: Command to be completed
3267 * @alt_status: If non-zero, use this value as status to
3268 * SCSI mid-layer instead of the value returned
3269 * by the FW. This should be used if caller wants
3270 * an alternate status (as in the case of aborted
3274 megasas_complete_cmd(struct megasas_instance
*instance
, struct megasas_cmd
*cmd
,
3278 struct megasas_header
*hdr
= &cmd
->frame
->hdr
;
3279 unsigned long flags
;
3280 struct fusion_context
*fusion
= instance
->ctrl_context
;
3283 /* flag for the retry reset */
3284 cmd
->retry_for_fw_reset
= 0;
3287 cmd
->scmd
->SCp
.ptr
= NULL
;
3290 case MFI_CMD_INVALID
:
3291 /* Some older 1068 controller FW may keep a pended
3292 MR_DCMD_CTRL_EVENT_GET_INFO left over from the main kernel
3293 when booting the kdump kernel. Ignore this command to
3294 prevent a kernel panic on shutdown of the kdump kernel. */
3295 dev_warn(&instance
->pdev
->dev
, "MFI_CMD_INVALID command "
3297 dev_warn(&instance
->pdev
->dev
, "If you have a controller "
3298 "other than PERC5, please upgrade your firmware\n");
3300 case MFI_CMD_PD_SCSI_IO
:
3301 case MFI_CMD_LD_SCSI_IO
:
3304 * MFI_CMD_PD_SCSI_IO and MFI_CMD_LD_SCSI_IO could have been
3305 * issued either through an IO path or an IOCTL path. If it
3306 * was via IOCTL, we will send it to internal completion.
3308 if (cmd
->sync_cmd
) {
3310 megasas_complete_int_cmd(instance
, cmd
);
3315 case MFI_CMD_LD_READ
:
3316 case MFI_CMD_LD_WRITE
:
3319 cmd
->scmd
->result
= alt_status
<< 16;
3325 atomic_dec(&instance
->fw_outstanding
);
3327 scsi_dma_unmap(cmd
->scmd
);
3328 cmd
->scmd
->scsi_done(cmd
->scmd
);
3329 megasas_return_cmd(instance
, cmd
);
3334 switch (hdr
->cmd_status
) {
3337 cmd
->scmd
->result
= DID_OK
<< 16;
3340 case MFI_STAT_SCSI_IO_FAILED
:
3341 case MFI_STAT_LD_INIT_IN_PROGRESS
:
3343 (DID_ERROR
<< 16) | hdr
->scsi_status
;
3346 case MFI_STAT_SCSI_DONE_WITH_ERROR
:
3348 cmd
->scmd
->result
= (DID_OK
<< 16) | hdr
->scsi_status
;
3350 if (hdr
->scsi_status
== SAM_STAT_CHECK_CONDITION
) {
3351 memset(cmd
->scmd
->sense_buffer
, 0,
3352 SCSI_SENSE_BUFFERSIZE
);
3353 memcpy(cmd
->scmd
->sense_buffer
, cmd
->sense
,
3356 cmd
->scmd
->result
|= DRIVER_SENSE
<< 24;
3361 case MFI_STAT_LD_OFFLINE
:
3362 case MFI_STAT_DEVICE_NOT_FOUND
:
3363 cmd
->scmd
->result
= DID_BAD_TARGET
<< 16;
3367 dev_printk(KERN_DEBUG
, &instance
->pdev
->dev
, "MFI FW status %#x\n",
3369 cmd
->scmd
->result
= DID_ERROR
<< 16;
3373 atomic_dec(&instance
->fw_outstanding
);
3375 scsi_dma_unmap(cmd
->scmd
);
3376 cmd
->scmd
->scsi_done(cmd
->scmd
);
3377 megasas_return_cmd(instance
, cmd
);
3384 megasas_complete_int_cmd(instance
, cmd
);
3388 opcode
= le32_to_cpu(cmd
->frame
->dcmd
.opcode
);
3389 /* Check for LD map update */
3390 if ((opcode
== MR_DCMD_LD_MAP_GET_INFO
)
3391 && (cmd
->frame
->dcmd
.mbox
.b
[1] == 1)) {
3392 fusion
->fast_path_io
= 0;
3393 spin_lock_irqsave(instance
->host
->host_lock
, flags
);
3394 status
= cmd
->frame
->hdr
.cmd_status
;
3395 instance
->map_update_cmd
= NULL
;
3396 if (status
!= MFI_STAT_OK
) {
3397 if (status
!= MFI_STAT_NOT_FOUND
)
3398 dev_warn(&instance
->pdev
->dev
, "map syncfailed, status = 0x%x\n",
3399 cmd
->frame
->hdr
.cmd_status
);
3401 megasas_return_cmd(instance
, cmd
);
3402 spin_unlock_irqrestore(
3403 instance
->host
->host_lock
,
3409 megasas_return_cmd(instance
, cmd
);
3412 * Set fast path IO to ZERO.
3413 * Validate Map will set proper value.
3414 * Meanwhile all IOs will go as LD IO.
3416 if (status
== MFI_STAT_OK
&&
3417 (MR_ValidateMapInfo(instance
, (instance
->map_id
+ 1)))) {
3419 fusion
->fast_path_io
= 1;
3421 fusion
->fast_path_io
= 0;
3424 megasas_sync_map_info(instance
);
3425 spin_unlock_irqrestore(instance
->host
->host_lock
,
3429 if (opcode
== MR_DCMD_CTRL_EVENT_GET_INFO
||
3430 opcode
== MR_DCMD_CTRL_EVENT_GET
) {
3431 spin_lock_irqsave(&poll_aen_lock
, flags
);
3432 megasas_poll_wait_aen
= 0;
3433 spin_unlock_irqrestore(&poll_aen_lock
, flags
);
3436 /* FW has an updated PD sequence */
3437 if ((opcode
== MR_DCMD_SYSTEM_PD_MAP_GET_INFO
) &&
3438 (cmd
->frame
->dcmd
.mbox
.b
[0] == 1)) {
3440 spin_lock_irqsave(instance
->host
->host_lock
, flags
);
3441 status
= cmd
->frame
->hdr
.cmd_status
;
3442 instance
->jbod_seq_cmd
= NULL
;
3443 megasas_return_cmd(instance
, cmd
);
3445 if (status
== MFI_STAT_OK
) {
3446 instance
->pd_seq_map_id
++;
3447 /* Re-register a pd sync seq num cmd */
3448 if (megasas_sync_pd_seq_num(instance
, true))
3449 instance
->use_seqnum_jbod_fp
= false;
3451 instance
->use_seqnum_jbod_fp
= false;
3453 spin_unlock_irqrestore(instance
->host
->host_lock
, flags
);
3458 * See if got an event notification
3460 if (opcode
== MR_DCMD_CTRL_EVENT_WAIT
)
3461 megasas_service_aen(instance
, cmd
);
3463 megasas_complete_int_cmd(instance
, cmd
);
3469 * Cmd issued to abort another cmd returned
3471 megasas_complete_abort(instance
, cmd
);
3475 dev_info(&instance
->pdev
->dev
, "Unknown command completed! [0x%X]\n",
3477 megasas_complete_int_cmd(instance
, cmd
);
3483 * megasas_issue_pending_cmds_again - issue all pending cmds
3484 * in FW again because of the fw reset
3485 * @instance: Adapter soft state
3488 megasas_issue_pending_cmds_again(struct megasas_instance
*instance
)
3490 struct megasas_cmd
*cmd
;
3491 struct list_head clist_local
;
3492 union megasas_evt_class_locale class_locale
;
3493 unsigned long flags
;
3496 INIT_LIST_HEAD(&clist_local
);
3497 spin_lock_irqsave(&instance
->hba_lock
, flags
);
3498 list_splice_init(&instance
->internal_reset_pending_q
, &clist_local
);
3499 spin_unlock_irqrestore(&instance
->hba_lock
, flags
);
3501 while (!list_empty(&clist_local
)) {
3502 cmd
= list_entry((&clist_local
)->next
,
3503 struct megasas_cmd
, list
);
3504 list_del_init(&cmd
->list
);
3506 if (cmd
->sync_cmd
|| cmd
->scmd
) {
3507 dev_notice(&instance
->pdev
->dev
, "command %p, %p:%d"
3508 "detected to be pending while HBA reset\n",
3509 cmd
, cmd
->scmd
, cmd
->sync_cmd
);
3511 cmd
->retry_for_fw_reset
++;
3513 if (cmd
->retry_for_fw_reset
== 3) {
3514 dev_notice(&instance
->pdev
->dev
, "cmd %p, %p:%d"
3515 "was tried multiple times during reset."
3516 "Shutting down the HBA\n",
3517 cmd
, cmd
->scmd
, cmd
->sync_cmd
);
3518 instance
->instancet
->disable_intr(instance
);
3519 atomic_set(&instance
->fw_reset_no_pci_access
, 1);
3520 megaraid_sas_kill_hba(instance
);
3525 if (cmd
->sync_cmd
== 1) {
3527 dev_notice(&instance
->pdev
->dev
, "unexpected"
3528 "cmd attached to internal command!\n");
3530 dev_notice(&instance
->pdev
->dev
, "%p synchronous cmd"
3531 "on the internal reset queue,"
3532 "issue it again.\n", cmd
);
3533 cmd
->cmd_status_drv
= MFI_STAT_INVALID_STATUS
;
3534 instance
->instancet
->fire_cmd(instance
,
3535 cmd
->frame_phys_addr
,
3536 0, instance
->reg_set
);
3537 } else if (cmd
->scmd
) {
3538 dev_notice(&instance
->pdev
->dev
, "%p scsi cmd [%02x]"
3539 "detected on the internal queue, issue again.\n",
3540 cmd
, cmd
->scmd
->cmnd
[0]);
3542 atomic_inc(&instance
->fw_outstanding
);
3543 instance
->instancet
->fire_cmd(instance
,
3544 cmd
->frame_phys_addr
,
3545 cmd
->frame_count
-1, instance
->reg_set
);
3547 dev_notice(&instance
->pdev
->dev
, "%p unexpected cmd on the"
3548 "internal reset defer list while re-issue!!\n",
3553 if (instance
->aen_cmd
) {
3554 dev_notice(&instance
->pdev
->dev
, "aen_cmd in def process\n");
3555 megasas_return_cmd(instance
, instance
->aen_cmd
);
3557 instance
->aen_cmd
= NULL
;
3561 * Initiate AEN (Asynchronous Event Notification)
3563 seq_num
= instance
->last_seq_num
;
3564 class_locale
.members
.reserved
= 0;
3565 class_locale
.members
.locale
= MR_EVT_LOCALE_ALL
;
3566 class_locale
.members
.class = MR_EVT_CLASS_DEBUG
;
3568 megasas_register_aen(instance
, seq_num
, class_locale
.word
);
3572 * Move the internal reset pending commands to a deferred queue.
3574 * We move the commands pending at internal reset time to a
3575 * pending queue. This queue would be flushed after successful
3576 * completion of the internal reset sequence. if the internal reset
3577 * did not complete in time, the kernel reset handler would flush
3581 megasas_internal_reset_defer_cmds(struct megasas_instance
*instance
)
3583 struct megasas_cmd
*cmd
;
3585 u16 max_cmd
= instance
->max_fw_cmds
;
3587 unsigned long flags
;
3590 spin_lock_irqsave(&instance
->mfi_pool_lock
, flags
);
3591 for (i
= 0; i
< max_cmd
; i
++) {
3592 cmd
= instance
->cmd_list
[i
];
3593 if (cmd
->sync_cmd
== 1 || cmd
->scmd
) {
3594 dev_notice(&instance
->pdev
->dev
, "moving cmd[%d]:%p:%d:%p"
3595 "on the defer queue as internal\n",
3596 defer_index
, cmd
, cmd
->sync_cmd
, cmd
->scmd
);
3598 if (!list_empty(&cmd
->list
)) {
3599 dev_notice(&instance
->pdev
->dev
, "ERROR while"
3600 " moving this cmd:%p, %d %p, it was"
3601 "discovered on some list?\n",
3602 cmd
, cmd
->sync_cmd
, cmd
->scmd
);
3604 list_del_init(&cmd
->list
);
3607 list_add_tail(&cmd
->list
,
3608 &instance
->internal_reset_pending_q
);
3611 spin_unlock_irqrestore(&instance
->mfi_pool_lock
, flags
);
3616 process_fw_state_change_wq(struct work_struct
*work
)
3618 struct megasas_instance
*instance
=
3619 container_of(work
, struct megasas_instance
, work_init
);
3621 unsigned long flags
;
3623 if (atomic_read(&instance
->adprecovery
) != MEGASAS_ADPRESET_SM_INFAULT
) {
3624 dev_notice(&instance
->pdev
->dev
, "error, recovery st %x\n",
3625 atomic_read(&instance
->adprecovery
));
3629 if (atomic_read(&instance
->adprecovery
) == MEGASAS_ADPRESET_SM_INFAULT
) {
3630 dev_notice(&instance
->pdev
->dev
, "FW detected to be in fault"
3631 "state, restarting it...\n");
3633 instance
->instancet
->disable_intr(instance
);
3634 atomic_set(&instance
->fw_outstanding
, 0);
3636 atomic_set(&instance
->fw_reset_no_pci_access
, 1);
3637 instance
->instancet
->adp_reset(instance
, instance
->reg_set
);
3638 atomic_set(&instance
->fw_reset_no_pci_access
, 0);
3640 dev_notice(&instance
->pdev
->dev
, "FW restarted successfully,"
3641 "initiating next stage...\n");
3643 dev_notice(&instance
->pdev
->dev
, "HBA recovery state machine,"
3644 "state 2 starting...\n");
3646 /* waiting for about 20 second before start the second init */
3647 for (wait
= 0; wait
< 30; wait
++) {
3651 if (megasas_transition_to_ready(instance
, 1)) {
3652 dev_notice(&instance
->pdev
->dev
, "adapter not ready\n");
3654 atomic_set(&instance
->fw_reset_no_pci_access
, 1);
3655 megaraid_sas_kill_hba(instance
);
3659 if ((instance
->pdev
->device
== PCI_DEVICE_ID_LSI_SAS1064R
) ||
3660 (instance
->pdev
->device
== PCI_DEVICE_ID_DELL_PERC5
) ||
3661 (instance
->pdev
->device
== PCI_DEVICE_ID_LSI_VERDE_ZCR
)
3663 *instance
->consumer
= *instance
->producer
;
3665 *instance
->consumer
= 0;
3666 *instance
->producer
= 0;
3669 megasas_issue_init_mfi(instance
);
3671 spin_lock_irqsave(&instance
->hba_lock
, flags
);
3672 atomic_set(&instance
->adprecovery
, MEGASAS_HBA_OPERATIONAL
);
3673 spin_unlock_irqrestore(&instance
->hba_lock
, flags
);
3674 instance
->instancet
->enable_intr(instance
);
3676 megasas_issue_pending_cmds_again(instance
);
3677 instance
->issuepend_done
= 1;
3682 * megasas_deplete_reply_queue - Processes all completed commands
3683 * @instance: Adapter soft state
3684 * @alt_status: Alternate status to be returned to
3685 * SCSI mid-layer instead of the status
3686 * returned by the FW
3687 * Note: this must be called with hba lock held
3690 megasas_deplete_reply_queue(struct megasas_instance
*instance
,
3696 if ((mfiStatus
= instance
->instancet
->check_reset(instance
,
3697 instance
->reg_set
)) == 1) {
3701 mfiStatus
= instance
->instancet
->clear_intr(instance
);
3702 if (mfiStatus
== 0) {
3703 /* Hardware may not set outbound_intr_status in MSI-X mode */
3704 if (!instance
->msix_vectors
)
3708 instance
->mfiStatus
= mfiStatus
;
3710 if ((mfiStatus
& MFI_INTR_FLAG_FIRMWARE_STATE_CHANGE
)) {
3711 fw_state
= instance
->instancet
->read_fw_status_reg(
3712 instance
) & MFI_STATE_MASK
;
3714 if (fw_state
!= MFI_STATE_FAULT
) {
3715 dev_notice(&instance
->pdev
->dev
, "fw state:%x\n",
3719 if ((fw_state
== MFI_STATE_FAULT
) &&
3720 (instance
->disableOnlineCtrlReset
== 0)) {
3721 dev_notice(&instance
->pdev
->dev
, "wait adp restart\n");
3723 if ((instance
->pdev
->device
==
3724 PCI_DEVICE_ID_LSI_SAS1064R
) ||
3725 (instance
->pdev
->device
==
3726 PCI_DEVICE_ID_DELL_PERC5
) ||
3727 (instance
->pdev
->device
==
3728 PCI_DEVICE_ID_LSI_VERDE_ZCR
)) {
3730 *instance
->consumer
=
3731 cpu_to_le32(MEGASAS_ADPRESET_INPROG_SIGN
);
3735 instance
->instancet
->disable_intr(instance
);
3736 atomic_set(&instance
->adprecovery
, MEGASAS_ADPRESET_SM_INFAULT
);
3737 instance
->issuepend_done
= 0;
3739 atomic_set(&instance
->fw_outstanding
, 0);
3740 megasas_internal_reset_defer_cmds(instance
);
3742 dev_notice(&instance
->pdev
->dev
, "fwState=%x, stage:%d\n",
3743 fw_state
, atomic_read(&instance
->adprecovery
));
3745 schedule_work(&instance
->work_init
);
3749 dev_notice(&instance
->pdev
->dev
, "fwstate:%x, dis_OCR=%x\n",
3750 fw_state
, instance
->disableOnlineCtrlReset
);
3754 tasklet_schedule(&instance
->isr_tasklet
);
3758 * megasas_isr - isr entry point
3760 static irqreturn_t
megasas_isr(int irq
, void *devp
)
3762 struct megasas_irq_context
*irq_context
= devp
;
3763 struct megasas_instance
*instance
= irq_context
->instance
;
3764 unsigned long flags
;
3767 if (atomic_read(&instance
->fw_reset_no_pci_access
))
3770 spin_lock_irqsave(&instance
->hba_lock
, flags
);
3771 rc
= megasas_deplete_reply_queue(instance
, DID_OK
);
3772 spin_unlock_irqrestore(&instance
->hba_lock
, flags
);
3778 * megasas_transition_to_ready - Move the FW to READY state
3779 * @instance: Adapter soft state
3781 * During the initialization, FW passes can potentially be in any one of
3782 * several possible states. If the FW in operational, waiting-for-handshake
3783 * states, driver must take steps to bring it to ready state. Otherwise, it
3784 * has to wait for the ready state.
3787 megasas_transition_to_ready(struct megasas_instance
*instance
, int ocr
)
3793 u32 abs_state
, curr_abs_state
;
3795 abs_state
= instance
->instancet
->read_fw_status_reg(instance
);
3796 fw_state
= abs_state
& MFI_STATE_MASK
;
3798 if (fw_state
!= MFI_STATE_READY
)
3799 dev_info(&instance
->pdev
->dev
, "Waiting for FW to come to ready"
3802 while (fw_state
!= MFI_STATE_READY
) {
3806 case MFI_STATE_FAULT
:
3807 dev_printk(KERN_DEBUG
, &instance
->pdev
->dev
, "FW in FAULT state!!\n");
3809 max_wait
= MEGASAS_RESET_WAIT_TIME
;
3810 cur_state
= MFI_STATE_FAULT
;
3815 case MFI_STATE_WAIT_HANDSHAKE
:
3817 * Set the CLR bit in inbound doorbell
3819 if ((instance
->pdev
->device
==
3820 PCI_DEVICE_ID_LSI_SAS0073SKINNY
) ||
3821 (instance
->pdev
->device
==
3822 PCI_DEVICE_ID_LSI_SAS0071SKINNY
) ||
3823 (instance
->adapter_type
!= MFI_SERIES
))
3825 MFI_INIT_CLEAR_HANDSHAKE
|MFI_INIT_HOTPLUG
,
3826 &instance
->reg_set
->doorbell
);
3829 MFI_INIT_CLEAR_HANDSHAKE
|MFI_INIT_HOTPLUG
,
3830 &instance
->reg_set
->inbound_doorbell
);
3832 max_wait
= MEGASAS_RESET_WAIT_TIME
;
3833 cur_state
= MFI_STATE_WAIT_HANDSHAKE
;
3836 case MFI_STATE_BOOT_MESSAGE_PENDING
:
3837 if ((instance
->pdev
->device
==
3838 PCI_DEVICE_ID_LSI_SAS0073SKINNY
) ||
3839 (instance
->pdev
->device
==
3840 PCI_DEVICE_ID_LSI_SAS0071SKINNY
) ||
3841 (instance
->adapter_type
!= MFI_SERIES
))
3842 writel(MFI_INIT_HOTPLUG
,
3843 &instance
->reg_set
->doorbell
);
3845 writel(MFI_INIT_HOTPLUG
,
3846 &instance
->reg_set
->inbound_doorbell
);
3848 max_wait
= MEGASAS_RESET_WAIT_TIME
;
3849 cur_state
= MFI_STATE_BOOT_MESSAGE_PENDING
;
3852 case MFI_STATE_OPERATIONAL
:
3854 * Bring it to READY state; assuming max wait 10 secs
3856 instance
->instancet
->disable_intr(instance
);
3857 if ((instance
->pdev
->device
==
3858 PCI_DEVICE_ID_LSI_SAS0073SKINNY
) ||
3859 (instance
->pdev
->device
==
3860 PCI_DEVICE_ID_LSI_SAS0071SKINNY
) ||
3861 (instance
->adapter_type
!= MFI_SERIES
)) {
3862 writel(MFI_RESET_FLAGS
,
3863 &instance
->reg_set
->doorbell
);
3865 if (instance
->adapter_type
!= MFI_SERIES
) {
3866 for (i
= 0; i
< (10 * 1000); i
+= 20) {
3878 writel(MFI_RESET_FLAGS
,
3879 &instance
->reg_set
->inbound_doorbell
);
3881 max_wait
= MEGASAS_RESET_WAIT_TIME
;
3882 cur_state
= MFI_STATE_OPERATIONAL
;
3885 case MFI_STATE_UNDEFINED
:
3887 * This state should not last for more than 2 seconds
3889 max_wait
= MEGASAS_RESET_WAIT_TIME
;
3890 cur_state
= MFI_STATE_UNDEFINED
;
3893 case MFI_STATE_BB_INIT
:
3894 max_wait
= MEGASAS_RESET_WAIT_TIME
;
3895 cur_state
= MFI_STATE_BB_INIT
;
3898 case MFI_STATE_FW_INIT
:
3899 max_wait
= MEGASAS_RESET_WAIT_TIME
;
3900 cur_state
= MFI_STATE_FW_INIT
;
3903 case MFI_STATE_FW_INIT_2
:
3904 max_wait
= MEGASAS_RESET_WAIT_TIME
;
3905 cur_state
= MFI_STATE_FW_INIT_2
;
3908 case MFI_STATE_DEVICE_SCAN
:
3909 max_wait
= MEGASAS_RESET_WAIT_TIME
;
3910 cur_state
= MFI_STATE_DEVICE_SCAN
;
3913 case MFI_STATE_FLUSH_CACHE
:
3914 max_wait
= MEGASAS_RESET_WAIT_TIME
;
3915 cur_state
= MFI_STATE_FLUSH_CACHE
;
3919 dev_printk(KERN_DEBUG
, &instance
->pdev
->dev
, "Unknown state 0x%x\n",
3925 * The cur_state should not last for more than max_wait secs
3927 for (i
= 0; i
< max_wait
; i
++) {
3928 curr_abs_state
= instance
->instancet
->
3929 read_fw_status_reg(instance
);
3931 if (abs_state
== curr_abs_state
) {
3938 * Return error if fw_state hasn't changed after max_wait
3940 if (curr_abs_state
== abs_state
) {
3941 dev_printk(KERN_DEBUG
, &instance
->pdev
->dev
, "FW state [%d] hasn't changed "
3942 "in %d secs\n", fw_state
, max_wait
);
3946 abs_state
= curr_abs_state
;
3947 fw_state
= curr_abs_state
& MFI_STATE_MASK
;
3949 dev_info(&instance
->pdev
->dev
, "FW now in Ready state\n");
3955 * megasas_teardown_frame_pool - Destroy the cmd frame DMA pool
3956 * @instance: Adapter soft state
3958 static void megasas_teardown_frame_pool(struct megasas_instance
*instance
)
3961 u16 max_cmd
= instance
->max_mfi_cmds
;
3962 struct megasas_cmd
*cmd
;
3964 if (!instance
->frame_dma_pool
)
3968 * Return all frames to pool
3970 for (i
= 0; i
< max_cmd
; i
++) {
3972 cmd
= instance
->cmd_list
[i
];
3975 dma_pool_free(instance
->frame_dma_pool
, cmd
->frame
,
3976 cmd
->frame_phys_addr
);
3979 dma_pool_free(instance
->sense_dma_pool
, cmd
->sense
,
3980 cmd
->sense_phys_addr
);
3984 * Now destroy the pool itself
3986 dma_pool_destroy(instance
->frame_dma_pool
);
3987 dma_pool_destroy(instance
->sense_dma_pool
);
3989 instance
->frame_dma_pool
= NULL
;
3990 instance
->sense_dma_pool
= NULL
;
3994 * megasas_create_frame_pool - Creates DMA pool for cmd frames
3995 * @instance: Adapter soft state
3997 * Each command packet has an embedded DMA memory buffer that is used for
3998 * filling MFI frame and the SG list that immediately follows the frame. This
3999 * function creates those DMA memory buffers for each command packet by using
4000 * PCI pool facility.
4002 static int megasas_create_frame_pool(struct megasas_instance
*instance
)
4008 struct megasas_cmd
*cmd
;
4010 max_cmd
= instance
->max_mfi_cmds
;
4013 * Size of our frame is 64 bytes for MFI frame, followed by max SG
4014 * elements and finally SCSI_SENSE_BUFFERSIZE bytes for sense buffer
4016 sge_sz
= (IS_DMA64
) ? sizeof(struct megasas_sge64
) :
4017 sizeof(struct megasas_sge32
);
4019 if (instance
->flag_ieee
)
4020 sge_sz
= sizeof(struct megasas_sge_skinny
);
4023 * For MFI controllers.
4025 * max_sge_sz = 16 byte (sizeof megasas_sge_skinny)
4026 * Total 960 byte (15 MFI frame of 64 byte)
4028 * Fusion adapter require only 3 extra frame.
4029 * max_num_sge = 16 (defined as MAX_IOCTL_SGE)
4030 * max_sge_sz = 12 byte (sizeof megasas_sge64)
4031 * Total 192 byte (3 MFI frame of 64 byte)
4033 frame_count
= (instance
->adapter_type
== MFI_SERIES
) ?
4035 instance
->mfi_frame_size
= MEGAMFI_FRAME_SIZE
* frame_count
;
4037 * Use DMA pool facility provided by PCI layer
4039 instance
->frame_dma_pool
= dma_pool_create("megasas frame pool",
4040 &instance
->pdev
->dev
,
4041 instance
->mfi_frame_size
, 256, 0);
4043 if (!instance
->frame_dma_pool
) {
4044 dev_printk(KERN_DEBUG
, &instance
->pdev
->dev
, "failed to setup frame pool\n");
4048 instance
->sense_dma_pool
= dma_pool_create("megasas sense pool",
4049 &instance
->pdev
->dev
, 128,
4052 if (!instance
->sense_dma_pool
) {
4053 dev_printk(KERN_DEBUG
, &instance
->pdev
->dev
, "failed to setup sense pool\n");
4055 dma_pool_destroy(instance
->frame_dma_pool
);
4056 instance
->frame_dma_pool
= NULL
;
4062 * Allocate and attach a frame to each of the commands in cmd_list.
4063 * By making cmd->index as the context instead of the &cmd, we can
4064 * always use 32bit context regardless of the architecture
4066 for (i
= 0; i
< max_cmd
; i
++) {
4068 cmd
= instance
->cmd_list
[i
];
4070 cmd
->frame
= dma_pool_zalloc(instance
->frame_dma_pool
,
4071 GFP_KERNEL
, &cmd
->frame_phys_addr
);
4073 cmd
->sense
= dma_pool_alloc(instance
->sense_dma_pool
,
4074 GFP_KERNEL
, &cmd
->sense_phys_addr
);
4077 * megasas_teardown_frame_pool() takes care of freeing
4078 * whatever has been allocated
4080 if (!cmd
->frame
|| !cmd
->sense
) {
4081 dev_printk(KERN_DEBUG
, &instance
->pdev
->dev
, "dma_pool_alloc failed\n");
4082 megasas_teardown_frame_pool(instance
);
4086 cmd
->frame
->io
.context
= cpu_to_le32(cmd
->index
);
4087 cmd
->frame
->io
.pad_0
= 0;
4088 if ((instance
->adapter_type
== MFI_SERIES
) && reset_devices
)
4089 cmd
->frame
->hdr
.cmd
= MFI_CMD_INVALID
;
4096 * megasas_free_cmds - Free all the cmds in the free cmd pool
4097 * @instance: Adapter soft state
4099 void megasas_free_cmds(struct megasas_instance
*instance
)
4103 /* First free the MFI frame pool */
4104 megasas_teardown_frame_pool(instance
);
4106 /* Free all the commands in the cmd_list */
4107 for (i
= 0; i
< instance
->max_mfi_cmds
; i
++)
4109 kfree(instance
->cmd_list
[i
]);
4111 /* Free the cmd_list buffer itself */
4112 kfree(instance
->cmd_list
);
4113 instance
->cmd_list
= NULL
;
4115 INIT_LIST_HEAD(&instance
->cmd_pool
);
4119 * megasas_alloc_cmds - Allocates the command packets
4120 * @instance: Adapter soft state
4122 * Each command that is issued to the FW, whether IO commands from the OS or
4123 * internal commands like IOCTLs, are wrapped in local data structure called
4124 * megasas_cmd. The frame embedded in this megasas_cmd is actually issued to
4127 * Each frame has a 32-bit field called context (tag). This context is used
4128 * to get back the megasas_cmd from the frame when a frame gets completed in
4129 * the ISR. Typically the address of the megasas_cmd itself would be used as
4130 * the context. But we wanted to keep the differences between 32 and 64 bit
4131 * systems to the mininum. We always use 32 bit integers for the context. In
4132 * this driver, the 32 bit values are the indices into an array cmd_list.
4133 * This array is used only to look up the megasas_cmd given the context. The
4134 * free commands themselves are maintained in a linked list called cmd_pool.
4136 int megasas_alloc_cmds(struct megasas_instance
*instance
)
4141 struct megasas_cmd
*cmd
;
4143 max_cmd
= instance
->max_mfi_cmds
;
4146 * instance->cmd_list is an array of struct megasas_cmd pointers.
4147 * Allocate the dynamic array first and then allocate individual
4150 instance
->cmd_list
= kcalloc(max_cmd
, sizeof(struct megasas_cmd
*), GFP_KERNEL
);
4152 if (!instance
->cmd_list
) {
4153 dev_printk(KERN_DEBUG
, &instance
->pdev
->dev
, "out of memory\n");
4157 memset(instance
->cmd_list
, 0, sizeof(struct megasas_cmd
*) *max_cmd
);
4159 for (i
= 0; i
< max_cmd
; i
++) {
4160 instance
->cmd_list
[i
] = kmalloc(sizeof(struct megasas_cmd
),
4163 if (!instance
->cmd_list
[i
]) {
4165 for (j
= 0; j
< i
; j
++)
4166 kfree(instance
->cmd_list
[j
]);
4168 kfree(instance
->cmd_list
);
4169 instance
->cmd_list
= NULL
;
4175 for (i
= 0; i
< max_cmd
; i
++) {
4176 cmd
= instance
->cmd_list
[i
];
4177 memset(cmd
, 0, sizeof(struct megasas_cmd
));
4180 cmd
->instance
= instance
;
4182 list_add_tail(&cmd
->list
, &instance
->cmd_pool
);
4186 * Create a frame pool and assign one frame to each cmd
4188 if (megasas_create_frame_pool(instance
)) {
4189 dev_printk(KERN_DEBUG
, &instance
->pdev
->dev
, "Error creating frame DMA pool\n");
4190 megasas_free_cmds(instance
);
4197 * dcmd_timeout_ocr_possible - Check if OCR is possible based on Driver/FW state.
4198 * @instance: Adapter soft state
4200 * Return 0 for only Fusion adapter, if driver load/unload is not in progress
4201 * or FW is not under OCR.
4204 dcmd_timeout_ocr_possible(struct megasas_instance
*instance
) {
4206 if (instance
->adapter_type
== MFI_SERIES
)
4207 return KILL_ADAPTER
;
4208 else if (instance
->unload
||
4209 test_bit(MEGASAS_FUSION_IN_RESET
, &instance
->reset_flags
))
4210 return IGNORE_TIMEOUT
;
4212 return INITIATE_OCR
;
4216 megasas_get_pd_info(struct megasas_instance
*instance
, struct scsi_device
*sdev
)
4219 struct megasas_cmd
*cmd
;
4220 struct megasas_dcmd_frame
*dcmd
;
4222 struct MR_PRIV_DEVICE
*mr_device_priv_data
;
4225 device_id
= (sdev
->channel
* MEGASAS_MAX_DEV_PER_CHANNEL
) + sdev
->id
;
4226 cmd
= megasas_get_cmd(instance
);
4229 dev_err(&instance
->pdev
->dev
, "Failed to get cmd %s\n", __func__
);
4233 dcmd
= &cmd
->frame
->dcmd
;
4235 memset(instance
->pd_info
, 0, sizeof(*instance
->pd_info
));
4236 memset(dcmd
->mbox
.b
, 0, MFI_MBOX_SIZE
);
4238 dcmd
->mbox
.s
[0] = cpu_to_le16(device_id
);
4239 dcmd
->cmd
= MFI_CMD_DCMD
;
4240 dcmd
->cmd_status
= 0xFF;
4241 dcmd
->sge_count
= 1;
4242 dcmd
->flags
= MFI_FRAME_DIR_READ
;
4245 dcmd
->data_xfer_len
= cpu_to_le32(sizeof(struct MR_PD_INFO
));
4246 dcmd
->opcode
= cpu_to_le32(MR_DCMD_PD_GET_INFO
);
4248 megasas_set_dma_settings(instance
, dcmd
, instance
->pd_info_h
,
4249 sizeof(struct MR_PD_INFO
));
4251 if ((instance
->adapter_type
!= MFI_SERIES
) &&
4252 !instance
->mask_interrupts
)
4253 ret
= megasas_issue_blocked_cmd(instance
, cmd
, MFI_IO_TIMEOUT_SECS
);
4255 ret
= megasas_issue_polled(instance
, cmd
);
4259 mr_device_priv_data
= sdev
->hostdata
;
4260 le16_to_cpus((u16
*)&instance
->pd_info
->state
.ddf
.pdType
);
4261 mr_device_priv_data
->interface_type
=
4262 instance
->pd_info
->state
.ddf
.pdType
.intf
;
4267 switch (dcmd_timeout_ocr_possible(instance
)) {
4269 cmd
->flags
|= DRV_DCMD_SKIP_REFIRE
;
4270 megasas_reset_fusion(instance
->host
,
4271 MFI_IO_TIMEOUT_OCR
);
4274 megaraid_sas_kill_hba(instance
);
4276 case IGNORE_TIMEOUT
:
4277 dev_info(&instance
->pdev
->dev
, "Ignore DCMD timeout: %s %d\n",
4278 __func__
, __LINE__
);
4285 if (ret
!= DCMD_TIMEOUT
)
4286 megasas_return_cmd(instance
, cmd
);
4291 * megasas_get_pd_list_info - Returns FW's pd_list structure
4292 * @instance: Adapter soft state
4293 * @pd_list: pd_list structure
4295 * Issues an internal command (DCMD) to get the FW's controller PD
4296 * list structure. This information is mainly used to find out SYSTEM
4297 * supported by the FW.
4300 megasas_get_pd_list(struct megasas_instance
*instance
)
4302 int ret
= 0, pd_index
= 0;
4303 struct megasas_cmd
*cmd
;
4304 struct megasas_dcmd_frame
*dcmd
;
4305 struct MR_PD_LIST
*ci
;
4306 struct MR_PD_ADDRESS
*pd_addr
;
4307 dma_addr_t ci_h
= 0;
4309 if (instance
->pd_list_not_supported
) {
4310 dev_info(&instance
->pdev
->dev
, "MR_DCMD_PD_LIST_QUERY "
4311 "not supported by firmware\n");
4315 ci
= instance
->pd_list_buf
;
4316 ci_h
= instance
->pd_list_buf_h
;
4318 cmd
= megasas_get_cmd(instance
);
4321 dev_printk(KERN_DEBUG
, &instance
->pdev
->dev
, "(get_pd_list): Failed to get cmd\n");
4325 dcmd
= &cmd
->frame
->dcmd
;
4327 memset(ci
, 0, sizeof(*ci
));
4328 memset(dcmd
->mbox
.b
, 0, MFI_MBOX_SIZE
);
4330 dcmd
->mbox
.b
[0] = MR_PD_QUERY_TYPE_EXPOSED_TO_HOST
;
4331 dcmd
->mbox
.b
[1] = 0;
4332 dcmd
->cmd
= MFI_CMD_DCMD
;
4333 dcmd
->cmd_status
= MFI_STAT_INVALID_STATUS
;
4334 dcmd
->sge_count
= 1;
4335 dcmd
->flags
= MFI_FRAME_DIR_READ
;
4338 dcmd
->data_xfer_len
= cpu_to_le32(MEGASAS_MAX_PD
* sizeof(struct MR_PD_LIST
));
4339 dcmd
->opcode
= cpu_to_le32(MR_DCMD_PD_LIST_QUERY
);
4341 megasas_set_dma_settings(instance
, dcmd
, instance
->pd_list_buf_h
,
4342 (MEGASAS_MAX_PD
* sizeof(struct MR_PD_LIST
)));
4344 if ((instance
->adapter_type
!= MFI_SERIES
) &&
4345 !instance
->mask_interrupts
)
4346 ret
= megasas_issue_blocked_cmd(instance
, cmd
,
4347 MFI_IO_TIMEOUT_SECS
);
4349 ret
= megasas_issue_polled(instance
, cmd
);
4353 dev_info(&instance
->pdev
->dev
, "MR_DCMD_PD_LIST_QUERY "
4354 "failed/not supported by firmware\n");
4356 if (instance
->adapter_type
!= MFI_SERIES
)
4357 megaraid_sas_kill_hba(instance
);
4359 instance
->pd_list_not_supported
= 1;
4363 switch (dcmd_timeout_ocr_possible(instance
)) {
4365 cmd
->flags
|= DRV_DCMD_SKIP_REFIRE
;
4367 * DCMD failed from AEN path.
4368 * AEN path already hold reset_mutex to avoid PCI access
4369 * while OCR is in progress.
4371 mutex_unlock(&instance
->reset_mutex
);
4372 megasas_reset_fusion(instance
->host
,
4373 MFI_IO_TIMEOUT_OCR
);
4374 mutex_lock(&instance
->reset_mutex
);
4377 megaraid_sas_kill_hba(instance
);
4379 case IGNORE_TIMEOUT
:
4380 dev_info(&instance
->pdev
->dev
, "Ignore DCMD timeout: %s %d \n",
4381 __func__
, __LINE__
);
4390 if ((le32_to_cpu(ci
->count
) >
4391 (MEGASAS_MAX_PD_CHANNELS
* MEGASAS_MAX_DEV_PER_CHANNEL
)))
4394 memset(instance
->local_pd_list
, 0,
4395 MEGASAS_MAX_PD
* sizeof(struct megasas_pd_list
));
4397 for (pd_index
= 0; pd_index
< le32_to_cpu(ci
->count
); pd_index
++) {
4398 instance
->local_pd_list
[le16_to_cpu(pd_addr
->deviceId
)].tid
=
4399 le16_to_cpu(pd_addr
->deviceId
);
4400 instance
->local_pd_list
[le16_to_cpu(pd_addr
->deviceId
)].driveType
=
4401 pd_addr
->scsiDevType
;
4402 instance
->local_pd_list
[le16_to_cpu(pd_addr
->deviceId
)].driveState
=
4407 memcpy(instance
->pd_list
, instance
->local_pd_list
,
4408 sizeof(instance
->pd_list
));
4413 if (ret
!= DCMD_TIMEOUT
)
4414 megasas_return_cmd(instance
, cmd
);
4420 * megasas_get_ld_list_info - Returns FW's ld_list structure
4421 * @instance: Adapter soft state
4422 * @ld_list: ld_list structure
4424 * Issues an internal command (DCMD) to get the FW's controller PD
4425 * list structure. This information is mainly used to find out SYSTEM
4426 * supported by the FW.
4429 megasas_get_ld_list(struct megasas_instance
*instance
)
4431 int ret
= 0, ld_index
= 0, ids
= 0;
4432 struct megasas_cmd
*cmd
;
4433 struct megasas_dcmd_frame
*dcmd
;
4434 struct MR_LD_LIST
*ci
;
4435 dma_addr_t ci_h
= 0;
4438 ci
= instance
->ld_list_buf
;
4439 ci_h
= instance
->ld_list_buf_h
;
4441 cmd
= megasas_get_cmd(instance
);
4444 dev_printk(KERN_DEBUG
, &instance
->pdev
->dev
, "megasas_get_ld_list: Failed to get cmd\n");
4448 dcmd
= &cmd
->frame
->dcmd
;
4450 memset(ci
, 0, sizeof(*ci
));
4451 memset(dcmd
->mbox
.b
, 0, MFI_MBOX_SIZE
);
4453 if (instance
->supportmax256vd
)
4454 dcmd
->mbox
.b
[0] = 1;
4455 dcmd
->cmd
= MFI_CMD_DCMD
;
4456 dcmd
->cmd_status
= MFI_STAT_INVALID_STATUS
;
4457 dcmd
->sge_count
= 1;
4458 dcmd
->flags
= MFI_FRAME_DIR_READ
;
4460 dcmd
->data_xfer_len
= cpu_to_le32(sizeof(struct MR_LD_LIST
));
4461 dcmd
->opcode
= cpu_to_le32(MR_DCMD_LD_GET_LIST
);
4464 megasas_set_dma_settings(instance
, dcmd
, ci_h
,
4465 sizeof(struct MR_LD_LIST
));
4467 if ((instance
->adapter_type
!= MFI_SERIES
) &&
4468 !instance
->mask_interrupts
)
4469 ret
= megasas_issue_blocked_cmd(instance
, cmd
,
4470 MFI_IO_TIMEOUT_SECS
);
4472 ret
= megasas_issue_polled(instance
, cmd
);
4474 ld_count
= le32_to_cpu(ci
->ldCount
);
4478 megaraid_sas_kill_hba(instance
);
4482 switch (dcmd_timeout_ocr_possible(instance
)) {
4484 cmd
->flags
|= DRV_DCMD_SKIP_REFIRE
;
4486 * DCMD failed from AEN path.
4487 * AEN path already hold reset_mutex to avoid PCI access
4488 * while OCR is in progress.
4490 mutex_unlock(&instance
->reset_mutex
);
4491 megasas_reset_fusion(instance
->host
,
4492 MFI_IO_TIMEOUT_OCR
);
4493 mutex_lock(&instance
->reset_mutex
);
4496 megaraid_sas_kill_hba(instance
);
4498 case IGNORE_TIMEOUT
:
4499 dev_info(&instance
->pdev
->dev
, "Ignore DCMD timeout: %s %d\n",
4500 __func__
, __LINE__
);
4507 if (ld_count
> instance
->fw_supported_vd_count
)
4510 memset(instance
->ld_ids
, 0xff, MAX_LOGICAL_DRIVES_EXT
);
4512 for (ld_index
= 0; ld_index
< ld_count
; ld_index
++) {
4513 if (ci
->ldList
[ld_index
].state
!= 0) {
4514 ids
= ci
->ldList
[ld_index
].ref
.targetId
;
4515 instance
->ld_ids
[ids
] = ci
->ldList
[ld_index
].ref
.targetId
;
4522 if (ret
!= DCMD_TIMEOUT
)
4523 megasas_return_cmd(instance
, cmd
);
4529 * megasas_ld_list_query - Returns FW's ld_list structure
4530 * @instance: Adapter soft state
4531 * @ld_list: ld_list structure
4533 * Issues an internal command (DCMD) to get the FW's controller PD
4534 * list structure. This information is mainly used to find out SYSTEM
4535 * supported by the FW.
4538 megasas_ld_list_query(struct megasas_instance
*instance
, u8 query_type
)
4540 int ret
= 0, ld_index
= 0, ids
= 0;
4541 struct megasas_cmd
*cmd
;
4542 struct megasas_dcmd_frame
*dcmd
;
4543 struct MR_LD_TARGETID_LIST
*ci
;
4544 dma_addr_t ci_h
= 0;
4547 ci
= instance
->ld_targetid_list_buf
;
4548 ci_h
= instance
->ld_targetid_list_buf_h
;
4550 cmd
= megasas_get_cmd(instance
);
4553 dev_warn(&instance
->pdev
->dev
,
4554 "megasas_ld_list_query: Failed to get cmd\n");
4558 dcmd
= &cmd
->frame
->dcmd
;
4560 memset(ci
, 0, sizeof(*ci
));
4561 memset(dcmd
->mbox
.b
, 0, MFI_MBOX_SIZE
);
4563 dcmd
->mbox
.b
[0] = query_type
;
4564 if (instance
->supportmax256vd
)
4565 dcmd
->mbox
.b
[2] = 1;
4567 dcmd
->cmd
= MFI_CMD_DCMD
;
4568 dcmd
->cmd_status
= MFI_STAT_INVALID_STATUS
;
4569 dcmd
->sge_count
= 1;
4570 dcmd
->flags
= MFI_FRAME_DIR_READ
;
4572 dcmd
->data_xfer_len
= cpu_to_le32(sizeof(struct MR_LD_TARGETID_LIST
));
4573 dcmd
->opcode
= cpu_to_le32(MR_DCMD_LD_LIST_QUERY
);
4576 megasas_set_dma_settings(instance
, dcmd
, ci_h
,
4577 sizeof(struct MR_LD_TARGETID_LIST
));
4579 if ((instance
->adapter_type
!= MFI_SERIES
) &&
4580 !instance
->mask_interrupts
)
4581 ret
= megasas_issue_blocked_cmd(instance
, cmd
, MFI_IO_TIMEOUT_SECS
);
4583 ret
= megasas_issue_polled(instance
, cmd
);
4587 dev_info(&instance
->pdev
->dev
,
4588 "DCMD not supported by firmware - %s %d\n",
4589 __func__
, __LINE__
);
4590 ret
= megasas_get_ld_list(instance
);
4593 switch (dcmd_timeout_ocr_possible(instance
)) {
4595 cmd
->flags
|= DRV_DCMD_SKIP_REFIRE
;
4597 * DCMD failed from AEN path.
4598 * AEN path already hold reset_mutex to avoid PCI access
4599 * while OCR is in progress.
4601 mutex_unlock(&instance
->reset_mutex
);
4602 megasas_reset_fusion(instance
->host
,
4603 MFI_IO_TIMEOUT_OCR
);
4604 mutex_lock(&instance
->reset_mutex
);
4607 megaraid_sas_kill_hba(instance
);
4609 case IGNORE_TIMEOUT
:
4610 dev_info(&instance
->pdev
->dev
, "Ignore DCMD timeout: %s %d\n",
4611 __func__
, __LINE__
);
4617 tgtid_count
= le32_to_cpu(ci
->count
);
4619 if ((tgtid_count
> (instance
->fw_supported_vd_count
)))
4622 memset(instance
->ld_ids
, 0xff, MEGASAS_MAX_LD_IDS
);
4623 for (ld_index
= 0; ld_index
< tgtid_count
; ld_index
++) {
4624 ids
= ci
->targetId
[ld_index
];
4625 instance
->ld_ids
[ids
] = ci
->targetId
[ld_index
];
4631 if (ret
!= DCMD_TIMEOUT
)
4632 megasas_return_cmd(instance
, cmd
);
4638 * megasas_update_ext_vd_details : Update details w.r.t Extended VD
4639 * instance : Controller's instance
4641 static void megasas_update_ext_vd_details(struct megasas_instance
*instance
)
4643 struct fusion_context
*fusion
;
4644 u32 ventura_map_sz
= 0;
4646 fusion
= instance
->ctrl_context
;
4647 /* For MFI based controllers return dummy success */
4651 instance
->supportmax256vd
=
4652 instance
->ctrl_info_buf
->adapterOperations3
.supportMaxExtLDs
;
4653 /* Below is additional check to address future FW enhancement */
4654 if (instance
->ctrl_info_buf
->max_lds
> 64)
4655 instance
->supportmax256vd
= 1;
4657 instance
->drv_supported_vd_count
= MEGASAS_MAX_LD_CHANNELS
4658 * MEGASAS_MAX_DEV_PER_CHANNEL
;
4659 instance
->drv_supported_pd_count
= MEGASAS_MAX_PD_CHANNELS
4660 * MEGASAS_MAX_DEV_PER_CHANNEL
;
4661 if (instance
->supportmax256vd
) {
4662 instance
->fw_supported_vd_count
= MAX_LOGICAL_DRIVES_EXT
;
4663 instance
->fw_supported_pd_count
= MAX_PHYSICAL_DEVICES
;
4665 instance
->fw_supported_vd_count
= MAX_LOGICAL_DRIVES
;
4666 instance
->fw_supported_pd_count
= MAX_PHYSICAL_DEVICES
;
4669 dev_info(&instance
->pdev
->dev
,
4670 "FW provided supportMaxExtLDs: %d\tmax_lds: %d\n",
4671 instance
->ctrl_info_buf
->adapterOperations3
.supportMaxExtLDs
? 1 : 0,
4672 instance
->ctrl_info_buf
->max_lds
);
4674 if (instance
->max_raid_mapsize
) {
4675 ventura_map_sz
= instance
->max_raid_mapsize
*
4676 MR_MIN_MAP_SIZE
; /* 64k */
4677 fusion
->current_map_sz
= ventura_map_sz
;
4678 fusion
->max_map_sz
= ventura_map_sz
;
4680 fusion
->old_map_sz
= sizeof(struct MR_FW_RAID_MAP
) +
4681 (sizeof(struct MR_LD_SPAN_MAP
) *
4682 (instance
->fw_supported_vd_count
- 1));
4683 fusion
->new_map_sz
= sizeof(struct MR_FW_RAID_MAP_EXT
);
4685 fusion
->max_map_sz
=
4686 max(fusion
->old_map_sz
, fusion
->new_map_sz
);
4688 if (instance
->supportmax256vd
)
4689 fusion
->current_map_sz
= fusion
->new_map_sz
;
4691 fusion
->current_map_sz
= fusion
->old_map_sz
;
4693 /* irrespective of FW raid maps, driver raid map is constant */
4694 fusion
->drv_map_sz
= sizeof(struct MR_DRV_RAID_MAP_ALL
);
4698 * dcmd.opcode - MR_DCMD_CTRL_SNAPDUMP_GET_PROPERTIES
4699 * dcmd.hdr.length - number of bytes to read
4700 * dcmd.sge - Ptr to MR_SNAPDUMP_PROPERTIES
4701 * Desc: Fill in snapdump properties
4702 * Status: MFI_STAT_OK- Command successful
4704 void megasas_get_snapdump_properties(struct megasas_instance
*instance
)
4707 struct megasas_cmd
*cmd
;
4708 struct megasas_dcmd_frame
*dcmd
;
4709 struct MR_SNAPDUMP_PROPERTIES
*ci
;
4710 dma_addr_t ci_h
= 0;
4712 ci
= instance
->snapdump_prop
;
4713 ci_h
= instance
->snapdump_prop_h
;
4718 cmd
= megasas_get_cmd(instance
);
4721 dev_dbg(&instance
->pdev
->dev
, "Failed to get a free cmd\n");
4725 dcmd
= &cmd
->frame
->dcmd
;
4727 memset(ci
, 0, sizeof(*ci
));
4728 memset(dcmd
->mbox
.b
, 0, MFI_MBOX_SIZE
);
4730 dcmd
->cmd
= MFI_CMD_DCMD
;
4731 dcmd
->cmd_status
= MFI_STAT_INVALID_STATUS
;
4732 dcmd
->sge_count
= 1;
4733 dcmd
->flags
= MFI_FRAME_DIR_READ
;
4736 dcmd
->data_xfer_len
= cpu_to_le32(sizeof(struct MR_SNAPDUMP_PROPERTIES
));
4737 dcmd
->opcode
= cpu_to_le32(MR_DCMD_CTRL_SNAPDUMP_GET_PROPERTIES
);
4739 megasas_set_dma_settings(instance
, dcmd
, ci_h
,
4740 sizeof(struct MR_SNAPDUMP_PROPERTIES
));
4742 if (!instance
->mask_interrupts
) {
4743 ret
= megasas_issue_blocked_cmd(instance
, cmd
,
4744 MFI_IO_TIMEOUT_SECS
);
4746 ret
= megasas_issue_polled(instance
, cmd
);
4747 cmd
->flags
|= DRV_DCMD_SKIP_REFIRE
;
4752 instance
->snapdump_wait_time
=
4753 min_t(u8
, ci
->trigger_min_num_sec_before_ocr
,
4754 MEGASAS_MAX_SNAP_DUMP_WAIT_TIME
);
4758 switch (dcmd_timeout_ocr_possible(instance
)) {
4760 cmd
->flags
|= DRV_DCMD_SKIP_REFIRE
;
4761 megasas_reset_fusion(instance
->host
,
4762 MFI_IO_TIMEOUT_OCR
);
4765 megaraid_sas_kill_hba(instance
);
4767 case IGNORE_TIMEOUT
:
4768 dev_info(&instance
->pdev
->dev
, "Ignore DCMD timeout: %s %d\n",
4769 __func__
, __LINE__
);
4774 if (ret
!= DCMD_TIMEOUT
)
4775 megasas_return_cmd(instance
, cmd
);
4779 * megasas_get_controller_info - Returns FW's controller structure
4780 * @instance: Adapter soft state
4782 * Issues an internal command (DCMD) to get the FW's controller structure.
4783 * This information is mainly used to find out the maximum IO transfer per
4784 * command supported by the FW.
4787 megasas_get_ctrl_info(struct megasas_instance
*instance
)
4790 struct megasas_cmd
*cmd
;
4791 struct megasas_dcmd_frame
*dcmd
;
4792 struct megasas_ctrl_info
*ci
;
4793 dma_addr_t ci_h
= 0;
4795 ci
= instance
->ctrl_info_buf
;
4796 ci_h
= instance
->ctrl_info_buf_h
;
4798 cmd
= megasas_get_cmd(instance
);
4801 dev_printk(KERN_DEBUG
, &instance
->pdev
->dev
, "Failed to get a free cmd\n");
4805 dcmd
= &cmd
->frame
->dcmd
;
4807 memset(ci
, 0, sizeof(*ci
));
4808 memset(dcmd
->mbox
.b
, 0, MFI_MBOX_SIZE
);
4810 dcmd
->cmd
= MFI_CMD_DCMD
;
4811 dcmd
->cmd_status
= MFI_STAT_INVALID_STATUS
;
4812 dcmd
->sge_count
= 1;
4813 dcmd
->flags
= MFI_FRAME_DIR_READ
;
4816 dcmd
->data_xfer_len
= cpu_to_le32(sizeof(struct megasas_ctrl_info
));
4817 dcmd
->opcode
= cpu_to_le32(MR_DCMD_CTRL_GET_INFO
);
4818 dcmd
->mbox
.b
[0] = 1;
4820 megasas_set_dma_settings(instance
, dcmd
, ci_h
,
4821 sizeof(struct megasas_ctrl_info
));
4823 if ((instance
->adapter_type
!= MFI_SERIES
) &&
4824 !instance
->mask_interrupts
) {
4825 ret
= megasas_issue_blocked_cmd(instance
, cmd
, MFI_IO_TIMEOUT_SECS
);
4827 ret
= megasas_issue_polled(instance
, cmd
);
4828 cmd
->flags
|= DRV_DCMD_SKIP_REFIRE
;
4833 /* Save required controller information in
4834 * CPU endianness format.
4836 le32_to_cpus((u32
*)&ci
->properties
.OnOffProperties
);
4837 le16_to_cpus((u16
*)&ci
->properties
.on_off_properties2
);
4838 le32_to_cpus((u32
*)&ci
->adapterOperations2
);
4839 le32_to_cpus((u32
*)&ci
->adapterOperations3
);
4840 le16_to_cpus((u16
*)&ci
->adapter_operations4
);
4842 /* Update the latest Ext VD info.
4843 * From Init path, store current firmware details.
4844 * From OCR path, detect any firmware properties changes.
4845 * in case of Firmware upgrade without system reboot.
4847 megasas_update_ext_vd_details(instance
);
4848 instance
->use_seqnum_jbod_fp
=
4849 ci
->adapterOperations3
.useSeqNumJbodFP
;
4850 instance
->support_morethan256jbod
=
4851 ci
->adapter_operations4
.support_pd_map_target_id
;
4852 instance
->support_nvme_passthru
=
4853 ci
->adapter_operations4
.support_nvme_passthru
;
4854 instance
->task_abort_tmo
= ci
->TaskAbortTO
;
4855 instance
->max_reset_tmo
= ci
->MaxResetTO
;
4857 /*Check whether controller is iMR or MR */
4858 instance
->is_imr
= (ci
->memory_size
? 0 : 1);
4860 instance
->snapdump_wait_time
=
4861 (ci
->properties
.on_off_properties2
.enable_snap_dump
?
4862 MEGASAS_DEFAULT_SNAP_DUMP_WAIT_TIME
: 0);
4864 dev_info(&instance
->pdev
->dev
,
4865 "controller type\t: %s(%dMB)\n",
4866 instance
->is_imr
? "iMR" : "MR",
4867 le16_to_cpu(ci
->memory_size
));
4869 instance
->disableOnlineCtrlReset
=
4870 ci
->properties
.OnOffProperties
.disableOnlineCtrlReset
;
4871 instance
->secure_jbod_support
=
4872 ci
->adapterOperations3
.supportSecurityonJBOD
;
4873 dev_info(&instance
->pdev
->dev
, "Online Controller Reset(OCR)\t: %s\n",
4874 instance
->disableOnlineCtrlReset
? "Disabled" : "Enabled");
4875 dev_info(&instance
->pdev
->dev
, "Secure JBOD support\t: %s\n",
4876 instance
->secure_jbod_support
? "Yes" : "No");
4877 dev_info(&instance
->pdev
->dev
, "NVMe passthru support\t: %s\n",
4878 instance
->support_nvme_passthru
? "Yes" : "No");
4879 dev_info(&instance
->pdev
->dev
,
4880 "FW provided TM TaskAbort/Reset timeout\t: %d secs/%d secs\n",
4881 instance
->task_abort_tmo
, instance
->max_reset_tmo
);
4886 switch (dcmd_timeout_ocr_possible(instance
)) {
4888 cmd
->flags
|= DRV_DCMD_SKIP_REFIRE
;
4889 megasas_reset_fusion(instance
->host
,
4890 MFI_IO_TIMEOUT_OCR
);
4893 megaraid_sas_kill_hba(instance
);
4895 case IGNORE_TIMEOUT
:
4896 dev_info(&instance
->pdev
->dev
, "Ignore DCMD timeout: %s %d\n",
4897 __func__
, __LINE__
);
4902 megaraid_sas_kill_hba(instance
);
4907 if (ret
!= DCMD_TIMEOUT
)
4908 megasas_return_cmd(instance
, cmd
);
4914 * megasas_set_crash_dump_params - Sends address of crash dump DMA buffer
4917 * @instance: Adapter soft state
4918 * @crash_buf_state - tell FW to turn ON/OFF crash dump feature
4919 MR_CRASH_BUF_TURN_OFF = 0
4920 MR_CRASH_BUF_TURN_ON = 1
4921 * @return 0 on success non-zero on failure.
4922 * Issues an internal command (DCMD) to set parameters for crash dump feature.
4923 * Driver will send address of crash dump DMA buffer and set mbox to tell FW
4924 * that driver supports crash dump feature. This DCMD will be sent only if
4925 * crash dump feature is supported by the FW.
4928 int megasas_set_crash_dump_params(struct megasas_instance
*instance
,
4932 struct megasas_cmd
*cmd
;
4933 struct megasas_dcmd_frame
*dcmd
;
4935 cmd
= megasas_get_cmd(instance
);
4938 dev_err(&instance
->pdev
->dev
, "Failed to get a free cmd\n");
4943 dcmd
= &cmd
->frame
->dcmd
;
4945 memset(dcmd
->mbox
.b
, 0, MFI_MBOX_SIZE
);
4946 dcmd
->mbox
.b
[0] = crash_buf_state
;
4947 dcmd
->cmd
= MFI_CMD_DCMD
;
4948 dcmd
->cmd_status
= MFI_STAT_INVALID_STATUS
;
4949 dcmd
->sge_count
= 1;
4950 dcmd
->flags
= MFI_FRAME_DIR_NONE
;
4953 dcmd
->data_xfer_len
= cpu_to_le32(CRASH_DMA_BUF_SIZE
);
4954 dcmd
->opcode
= cpu_to_le32(MR_DCMD_CTRL_SET_CRASH_DUMP_PARAMS
);
4956 megasas_set_dma_settings(instance
, dcmd
, instance
->crash_dump_h
,
4957 CRASH_DMA_BUF_SIZE
);
4959 if ((instance
->adapter_type
!= MFI_SERIES
) &&
4960 !instance
->mask_interrupts
)
4961 ret
= megasas_issue_blocked_cmd(instance
, cmd
, MFI_IO_TIMEOUT_SECS
);
4963 ret
= megasas_issue_polled(instance
, cmd
);
4965 if (ret
== DCMD_TIMEOUT
) {
4966 switch (dcmd_timeout_ocr_possible(instance
)) {
4968 cmd
->flags
|= DRV_DCMD_SKIP_REFIRE
;
4969 megasas_reset_fusion(instance
->host
,
4970 MFI_IO_TIMEOUT_OCR
);
4973 megaraid_sas_kill_hba(instance
);
4975 case IGNORE_TIMEOUT
:
4976 dev_info(&instance
->pdev
->dev
, "Ignore DCMD timeout: %s %d\n",
4977 __func__
, __LINE__
);
4981 megasas_return_cmd(instance
, cmd
);
4987 * megasas_issue_init_mfi - Initializes the FW
4988 * @instance: Adapter soft state
4990 * Issues the INIT MFI cmd
4993 megasas_issue_init_mfi(struct megasas_instance
*instance
)
4996 struct megasas_cmd
*cmd
;
4997 struct megasas_init_frame
*init_frame
;
4998 struct megasas_init_queue_info
*initq_info
;
4999 dma_addr_t init_frame_h
;
5000 dma_addr_t initq_info_h
;
5003 * Prepare a init frame. Note the init frame points to queue info
5004 * structure. Each frame has SGL allocated after first 64 bytes. For
5005 * this frame - since we don't need any SGL - we use SGL's space as
5006 * queue info structure
5008 * We will not get a NULL command below. We just created the pool.
5010 cmd
= megasas_get_cmd(instance
);
5012 init_frame
= (struct megasas_init_frame
*)cmd
->frame
;
5013 initq_info
= (struct megasas_init_queue_info
*)
5014 ((unsigned long)init_frame
+ 64);
5016 init_frame_h
= cmd
->frame_phys_addr
;
5017 initq_info_h
= init_frame_h
+ 64;
5019 context
= init_frame
->context
;
5020 memset(init_frame
, 0, MEGAMFI_FRAME_SIZE
);
5021 memset(initq_info
, 0, sizeof(struct megasas_init_queue_info
));
5022 init_frame
->context
= context
;
5024 initq_info
->reply_queue_entries
= cpu_to_le32(instance
->max_fw_cmds
+ 1);
5025 initq_info
->reply_queue_start_phys_addr_lo
= cpu_to_le32(instance
->reply_queue_h
);
5027 initq_info
->producer_index_phys_addr_lo
= cpu_to_le32(instance
->producer_h
);
5028 initq_info
->consumer_index_phys_addr_lo
= cpu_to_le32(instance
->consumer_h
);
5030 init_frame
->cmd
= MFI_CMD_INIT
;
5031 init_frame
->cmd_status
= MFI_STAT_INVALID_STATUS
;
5032 init_frame
->queue_info_new_phys_addr_lo
=
5033 cpu_to_le32(lower_32_bits(initq_info_h
));
5034 init_frame
->queue_info_new_phys_addr_hi
=
5035 cpu_to_le32(upper_32_bits(initq_info_h
));
5037 init_frame
->data_xfer_len
= cpu_to_le32(sizeof(struct megasas_init_queue_info
));
5040 * disable the intr before firing the init frame to FW
5042 instance
->instancet
->disable_intr(instance
);
5045 * Issue the init frame in polled mode
5048 if (megasas_issue_polled(instance
, cmd
)) {
5049 dev_err(&instance
->pdev
->dev
, "Failed to init firmware\n");
5050 megasas_return_cmd(instance
, cmd
);
5054 megasas_return_cmd(instance
, cmd
);
5063 megasas_init_adapter_mfi(struct megasas_instance
*instance
)
5069 * Get various operational parameters from status register
5071 instance
->max_fw_cmds
= instance
->instancet
->read_fw_status_reg(instance
) & 0x00FFFF;
5073 * Reduce the max supported cmds by 1. This is to ensure that the
5074 * reply_q_sz (1 more than the max cmd that driver may send)
5075 * does not exceed max cmds that the FW can support
5077 instance
->max_fw_cmds
= instance
->max_fw_cmds
-1;
5078 instance
->max_mfi_cmds
= instance
->max_fw_cmds
;
5079 instance
->max_num_sge
= (instance
->instancet
->read_fw_status_reg(instance
) & 0xFF0000) >>
5082 * For MFI skinny adapters, MEGASAS_SKINNY_INT_CMDS commands
5083 * are reserved for IOCTL + driver's internal DCMDs.
5085 if ((instance
->pdev
->device
== PCI_DEVICE_ID_LSI_SAS0073SKINNY
) ||
5086 (instance
->pdev
->device
== PCI_DEVICE_ID_LSI_SAS0071SKINNY
)) {
5087 instance
->max_scsi_cmds
= (instance
->max_fw_cmds
-
5088 MEGASAS_SKINNY_INT_CMDS
);
5089 sema_init(&instance
->ioctl_sem
, MEGASAS_SKINNY_INT_CMDS
);
5091 instance
->max_scsi_cmds
= (instance
->max_fw_cmds
-
5093 sema_init(&instance
->ioctl_sem
, (MEGASAS_MFI_IOCTL_CMDS
));
5096 instance
->cur_can_queue
= instance
->max_scsi_cmds
;
5098 * Create a pool of commands
5100 if (megasas_alloc_cmds(instance
))
5101 goto fail_alloc_cmds
;
5104 * Allocate memory for reply queue. Length of reply queue should
5105 * be _one_ more than the maximum commands handled by the firmware.
5107 * Note: When FW completes commands, it places corresponding contex
5108 * values in this circular reply queue. This circular queue is a fairly
5109 * typical producer-consumer queue. FW is the producer (of completed
5110 * commands) and the driver is the consumer.
5112 context_sz
= sizeof(u32
);
5113 reply_q_sz
= context_sz
* (instance
->max_fw_cmds
+ 1);
5115 instance
->reply_queue
= dma_alloc_coherent(&instance
->pdev
->dev
,
5116 reply_q_sz
, &instance
->reply_queue_h
, GFP_KERNEL
);
5118 if (!instance
->reply_queue
) {
5119 dev_printk(KERN_DEBUG
, &instance
->pdev
->dev
, "Out of DMA mem for reply queue\n");
5120 goto fail_reply_queue
;
5123 if (megasas_issue_init_mfi(instance
))
5126 if (megasas_get_ctrl_info(instance
)) {
5127 dev_err(&instance
->pdev
->dev
, "(%d): Could get controller info "
5128 "Fail from %s %d\n", instance
->unique_id
,
5129 __func__
, __LINE__
);
5133 instance
->fw_support_ieee
= 0;
5134 instance
->fw_support_ieee
=
5135 (instance
->instancet
->read_fw_status_reg(instance
) &
5138 dev_notice(&instance
->pdev
->dev
, "megasas_init_mfi: fw_support_ieee=%d",
5139 instance
->fw_support_ieee
);
5141 if (instance
->fw_support_ieee
)
5142 instance
->flag_ieee
= 1;
5148 dma_free_coherent(&instance
->pdev
->dev
, reply_q_sz
,
5149 instance
->reply_queue
, instance
->reply_queue_h
);
5151 megasas_free_cmds(instance
);
5158 * megasas_setup_irqs_ioapic - register legacy interrupts.
5159 * @instance: Adapter soft state
5161 * Do not enable interrupt, only setup ISRs.
5163 * Return 0 on success.
5166 megasas_setup_irqs_ioapic(struct megasas_instance
*instance
)
5168 struct pci_dev
*pdev
;
5170 pdev
= instance
->pdev
;
5171 instance
->irq_context
[0].instance
= instance
;
5172 instance
->irq_context
[0].MSIxIndex
= 0;
5173 if (request_irq(pci_irq_vector(pdev
, 0),
5174 instance
->instancet
->service_isr
, IRQF_SHARED
,
5175 "megasas", &instance
->irq_context
[0])) {
5176 dev_err(&instance
->pdev
->dev
,
5177 "Failed to register IRQ from %s %d\n",
5178 __func__
, __LINE__
);
5185 * megasas_setup_irqs_msix - register MSI-x interrupts.
5186 * @instance: Adapter soft state
5187 * @is_probe: Driver probe check
5189 * Do not enable interrupt, only setup ISRs.
5191 * Return 0 on success.
5194 megasas_setup_irqs_msix(struct megasas_instance
*instance
, u8 is_probe
)
5197 struct pci_dev
*pdev
;
5199 pdev
= instance
->pdev
;
5202 for (i
= 0; i
< instance
->msix_vectors
; i
++) {
5203 instance
->irq_context
[i
].instance
= instance
;
5204 instance
->irq_context
[i
].MSIxIndex
= i
;
5205 if (request_irq(pci_irq_vector(pdev
, i
),
5206 instance
->instancet
->service_isr
, 0, "megasas",
5207 &instance
->irq_context
[i
])) {
5208 dev_err(&instance
->pdev
->dev
,
5209 "Failed to register IRQ for vector %d.\n", i
);
5210 for (j
= 0; j
< i
; j
++)
5211 free_irq(pci_irq_vector(pdev
, j
),
5212 &instance
->irq_context
[j
]);
5213 /* Retry irq register for IO_APIC*/
5214 instance
->msix_vectors
= 0;
5216 pci_free_irq_vectors(instance
->pdev
);
5217 return megasas_setup_irqs_ioapic(instance
);
5227 * megasas_destroy_irqs- unregister interrupts.
5228 * @instance: Adapter soft state
5232 megasas_destroy_irqs(struct megasas_instance
*instance
) {
5236 if (instance
->msix_vectors
)
5237 for (i
= 0; i
< instance
->msix_vectors
; i
++) {
5238 free_irq(pci_irq_vector(instance
->pdev
, i
),
5239 &instance
->irq_context
[i
]);
5242 free_irq(pci_irq_vector(instance
->pdev
, 0),
5243 &instance
->irq_context
[0]);
5247 * megasas_setup_jbod_map - setup jbod map for FP seq_number.
5248 * @instance: Adapter soft state
5249 * @is_probe: Driver probe check
5251 * Return 0 on success.
5254 megasas_setup_jbod_map(struct megasas_instance
*instance
)
5257 struct fusion_context
*fusion
= instance
->ctrl_context
;
5260 pd_seq_map_sz
= sizeof(struct MR_PD_CFG_SEQ_NUM_SYNC
) +
5261 (sizeof(struct MR_PD_CFG_SEQ
) * (MAX_PHYSICAL_DEVICES
- 1));
5263 if (reset_devices
|| !fusion
||
5264 !instance
->ctrl_info_buf
->adapterOperations3
.useSeqNumJbodFP
) {
5265 dev_info(&instance
->pdev
->dev
,
5266 "Jbod map is not supported %s %d\n",
5267 __func__
, __LINE__
);
5268 instance
->use_seqnum_jbod_fp
= false;
5272 if (fusion
->pd_seq_sync
[0])
5275 for (i
= 0; i
< JBOD_MAPS_COUNT
; i
++) {
5276 fusion
->pd_seq_sync
[i
] = dma_alloc_coherent
5277 (&instance
->pdev
->dev
, pd_seq_map_sz
,
5278 &fusion
->pd_seq_phys
[i
], GFP_KERNEL
);
5279 if (!fusion
->pd_seq_sync
[i
]) {
5280 dev_err(&instance
->pdev
->dev
,
5281 "Failed to allocate memory from %s %d\n",
5282 __func__
, __LINE__
);
5284 dma_free_coherent(&instance
->pdev
->dev
,
5285 pd_seq_map_sz
, fusion
->pd_seq_sync
[0],
5286 fusion
->pd_seq_phys
[0]);
5287 fusion
->pd_seq_sync
[0] = NULL
;
5289 instance
->use_seqnum_jbod_fp
= false;
5295 if (!megasas_sync_pd_seq_num(instance
, false) &&
5296 !megasas_sync_pd_seq_num(instance
, true))
5297 instance
->use_seqnum_jbod_fp
= true;
5299 instance
->use_seqnum_jbod_fp
= false;
5302 static void megasas_setup_reply_map(struct megasas_instance
*instance
)
5304 const struct cpumask
*mask
;
5305 unsigned int queue
, cpu
;
5307 for (queue
= 0; queue
< instance
->msix_vectors
; queue
++) {
5308 mask
= pci_irq_get_affinity(instance
->pdev
, queue
);
5312 for_each_cpu(cpu
, mask
)
5313 instance
->reply_map
[cpu
] = queue
;
5318 for_each_possible_cpu(cpu
)
5319 instance
->reply_map
[cpu
] = cpu
% instance
->msix_vectors
;
5323 * megasas_init_fw - Initializes the FW
5324 * @instance: Adapter soft state
5326 * This is the main function for initializing firmware
5329 static int megasas_init_fw(struct megasas_instance
*instance
)
5332 u32 max_sectors_2
, tmp_sectors
, msix_enable
;
5333 u32 scratch_pad_1
, scratch_pad_2
, scratch_pad_3
, status_reg
;
5334 resource_size_t base_addr
;
5335 struct megasas_ctrl_info
*ctrl_info
= NULL
;
5336 unsigned long bar_list
;
5337 int i
, j
, loop
, fw_msix_count
= 0;
5338 struct IOV_111
*iovPtr
;
5339 struct fusion_context
*fusion
;
5340 bool do_adp_reset
= true;
5342 fusion
= instance
->ctrl_context
;
5344 /* Find first memory bar */
5345 bar_list
= pci_select_bars(instance
->pdev
, IORESOURCE_MEM
);
5346 instance
->bar
= find_first_bit(&bar_list
, BITS_PER_LONG
);
5347 if (pci_request_selected_regions(instance
->pdev
, 1<<instance
->bar
,
5349 dev_printk(KERN_DEBUG
, &instance
->pdev
->dev
, "IO memory region busy!\n");
5353 base_addr
= pci_resource_start(instance
->pdev
, instance
->bar
);
5354 instance
->reg_set
= ioremap_nocache(base_addr
, 8192);
5356 if (!instance
->reg_set
) {
5357 dev_printk(KERN_DEBUG
, &instance
->pdev
->dev
, "Failed to map IO mem\n");
5361 if (instance
->adapter_type
!= MFI_SERIES
)
5362 instance
->instancet
= &megasas_instance_template_fusion
;
5364 switch (instance
->pdev
->device
) {
5365 case PCI_DEVICE_ID_LSI_SAS1078R
:
5366 case PCI_DEVICE_ID_LSI_SAS1078DE
:
5367 instance
->instancet
= &megasas_instance_template_ppc
;
5369 case PCI_DEVICE_ID_LSI_SAS1078GEN2
:
5370 case PCI_DEVICE_ID_LSI_SAS0079GEN2
:
5371 instance
->instancet
= &megasas_instance_template_gen2
;
5373 case PCI_DEVICE_ID_LSI_SAS0073SKINNY
:
5374 case PCI_DEVICE_ID_LSI_SAS0071SKINNY
:
5375 instance
->instancet
= &megasas_instance_template_skinny
;
5377 case PCI_DEVICE_ID_LSI_SAS1064R
:
5378 case PCI_DEVICE_ID_DELL_PERC5
:
5380 instance
->instancet
= &megasas_instance_template_xscale
;
5381 instance
->pd_list_not_supported
= 1;
5386 if (megasas_transition_to_ready(instance
, 0)) {
5387 if (instance
->adapter_type
>= INVADER_SERIES
) {
5388 status_reg
= instance
->instancet
->read_fw_status_reg(
5390 do_adp_reset
= status_reg
& MFI_RESET_ADAPTER
;
5394 atomic_set(&instance
->fw_reset_no_pci_access
, 1);
5395 instance
->instancet
->adp_reset
5396 (instance
, instance
->reg_set
);
5397 atomic_set(&instance
->fw_reset_no_pci_access
, 0);
5398 dev_info(&instance
->pdev
->dev
,
5399 "FW restarted successfully from %s!\n",
5402 /*waiting for about 30 second before retry*/
5405 if (megasas_transition_to_ready(instance
, 0))
5406 goto fail_ready_state
;
5408 goto fail_ready_state
;
5412 megasas_init_ctrl_params(instance
);
5414 if (megasas_set_dma_mask(instance
))
5415 goto fail_ready_state
;
5417 if (megasas_alloc_ctrl_mem(instance
))
5418 goto fail_alloc_dma_buf
;
5420 if (megasas_alloc_ctrl_dma_buffers(instance
))
5421 goto fail_alloc_dma_buf
;
5423 fusion
= instance
->ctrl_context
;
5425 if (instance
->adapter_type
>= VENTURA_SERIES
) {
5427 megasas_readl(instance
,
5428 &instance
->reg_set
->outbound_scratch_pad_2
);
5429 instance
->max_raid_mapsize
= ((scratch_pad_2
>>
5430 MR_MAX_RAID_MAP_SIZE_OFFSET_SHIFT
) &
5431 MR_MAX_RAID_MAP_SIZE_MASK
);
5434 /* Check if MSI-X is supported while in ready state */
5435 msix_enable
= (instance
->instancet
->read_fw_status_reg(instance
) &
5437 if (msix_enable
&& !msix_disable
) {
5438 int irq_flags
= PCI_IRQ_MSIX
;
5440 scratch_pad_1
= megasas_readl
5441 (instance
, &instance
->reg_set
->outbound_scratch_pad_1
);
5442 /* Check max MSI-X vectors */
5444 if (instance
->adapter_type
== THUNDERBOLT_SERIES
) {
5445 /* Thunderbolt Series*/
5446 instance
->msix_vectors
= (scratch_pad_1
5447 & MR_MAX_REPLY_QUEUES_OFFSET
) + 1;
5448 fw_msix_count
= instance
->msix_vectors
;
5450 instance
->msix_vectors
= ((scratch_pad_1
5451 & MR_MAX_REPLY_QUEUES_EXT_OFFSET
)
5452 >> MR_MAX_REPLY_QUEUES_EXT_OFFSET_SHIFT
) + 1;
5455 * For Invader series, > 8 MSI-x vectors
5456 * supported by FW/HW implies combined
5457 * reply queue mode is enabled.
5458 * For Ventura series, > 16 MSI-x vectors
5459 * supported by FW/HW implies combined
5460 * reply queue mode is enabled.
5462 switch (instance
->adapter_type
) {
5463 case INVADER_SERIES
:
5464 if (instance
->msix_vectors
> 8)
5465 instance
->msix_combined
= true;
5468 case VENTURA_SERIES
:
5469 if (instance
->msix_vectors
> 16)
5470 instance
->msix_combined
= true;
5475 instance
->is_rdpq
= (scratch_pad_1
& MR_RDPQ_MODE_OFFSET
) ?
5477 fw_msix_count
= instance
->msix_vectors
;
5478 /* Save 1-15 reply post index address to local memory
5479 * Index 0 is already saved from reg offset
5480 * MPI2_REPLY_POST_HOST_INDEX_OFFSET
5482 for (loop
= 1; loop
< MR_MAX_MSIX_REG_ARRAY
; loop
++) {
5483 instance
->reply_post_host_index_addr
[loop
] =
5485 ((u8 __iomem
*)instance
->reg_set
+
5486 MPI2_SUP_REPLY_POST_HOST_INDEX_OFFSET
5491 instance
->msix_vectors
= min(msix_vectors
,
5492 instance
->msix_vectors
);
5493 } else /* MFI adapters */
5494 instance
->msix_vectors
= 1;
5495 /* Don't bother allocating more MSI-X vectors than cpus */
5496 instance
->msix_vectors
= min(instance
->msix_vectors
,
5497 (unsigned int)num_online_cpus());
5498 if (smp_affinity_enable
)
5499 irq_flags
|= PCI_IRQ_AFFINITY
;
5500 i
= pci_alloc_irq_vectors(instance
->pdev
, 1,
5501 instance
->msix_vectors
, irq_flags
);
5503 instance
->msix_vectors
= i
;
5505 instance
->msix_vectors
= 0;
5508 * MSI-X host index 0 is common for all adapter.
5509 * It is used for all MPT based Adapters.
5511 if (instance
->msix_combined
) {
5512 instance
->reply_post_host_index_addr
[0] =
5513 (u32
*)((u8
*)instance
->reg_set
+
5514 MPI2_SUP_REPLY_POST_HOST_INDEX_OFFSET
);
5516 instance
->reply_post_host_index_addr
[0] =
5517 (u32
*)((u8
*)instance
->reg_set
+
5518 MPI2_REPLY_POST_HOST_INDEX_OFFSET
);
5521 if (!instance
->msix_vectors
) {
5522 i
= pci_alloc_irq_vectors(instance
->pdev
, 1, 1, PCI_IRQ_LEGACY
);
5524 goto fail_init_adapter
;
5527 megasas_setup_reply_map(instance
);
5529 dev_info(&instance
->pdev
->dev
,
5530 "firmware supports msix\t: (%d)", fw_msix_count
);
5531 dev_info(&instance
->pdev
->dev
,
5532 "current msix/online cpus\t: (%d/%d)\n",
5533 instance
->msix_vectors
, (unsigned int)num_online_cpus());
5534 dev_info(&instance
->pdev
->dev
,
5535 "RDPQ mode\t: (%s)\n", instance
->is_rdpq
? "enabled" : "disabled");
5537 tasklet_init(&instance
->isr_tasklet
, instance
->instancet
->tasklet
,
5538 (unsigned long)instance
);
5541 * Below are default value for legacy Firmware.
5542 * non-fusion based controllers
5544 instance
->fw_supported_vd_count
= MAX_LOGICAL_DRIVES
;
5545 instance
->fw_supported_pd_count
= MAX_PHYSICAL_DEVICES
;
5546 /* Get operational params, sge flags, send init cmd to controller */
5547 if (instance
->instancet
->init_adapter(instance
))
5548 goto fail_init_adapter
;
5550 if (instance
->adapter_type
>= VENTURA_SERIES
) {
5552 megasas_readl(instance
,
5553 &instance
->reg_set
->outbound_scratch_pad_3
);
5554 if ((scratch_pad_3
& MR_NVME_PAGE_SIZE_MASK
) >=
5555 MR_DEFAULT_NVME_PAGE_SHIFT
)
5556 instance
->nvme_page_size
=
5557 (1 << (scratch_pad_3
& MR_NVME_PAGE_SIZE_MASK
));
5559 dev_info(&instance
->pdev
->dev
,
5560 "NVME page size\t: (%d)\n", instance
->nvme_page_size
);
5563 if (instance
->msix_vectors
?
5564 megasas_setup_irqs_msix(instance
, 1) :
5565 megasas_setup_irqs_ioapic(instance
))
5566 goto fail_init_adapter
;
5568 instance
->instancet
->enable_intr(instance
);
5570 dev_info(&instance
->pdev
->dev
, "INIT adapter done\n");
5572 megasas_setup_jbod_map(instance
);
5575 * the following function will get the PD LIST.
5577 memset(instance
->pd_list
, 0,
5578 (MEGASAS_MAX_PD
* sizeof(struct megasas_pd_list
)));
5579 if (megasas_get_pd_list(instance
) < 0) {
5580 dev_err(&instance
->pdev
->dev
, "failed to get PD list\n");
5581 goto fail_get_ld_pd_list
;
5584 memset(instance
->ld_ids
, 0xff, MEGASAS_MAX_LD_IDS
);
5586 /* stream detection initialization */
5587 if (instance
->adapter_type
>= VENTURA_SERIES
) {
5588 fusion
->stream_detect_by_ld
=
5589 kcalloc(MAX_LOGICAL_DRIVES_EXT
,
5590 sizeof(struct LD_STREAM_DETECT
*),
5592 if (!fusion
->stream_detect_by_ld
) {
5593 dev_err(&instance
->pdev
->dev
,
5594 "unable to allocate stream detection for pool of LDs\n");
5595 goto fail_get_ld_pd_list
;
5597 for (i
= 0; i
< MAX_LOGICAL_DRIVES_EXT
; ++i
) {
5598 fusion
->stream_detect_by_ld
[i
] =
5599 kzalloc(sizeof(struct LD_STREAM_DETECT
),
5601 if (!fusion
->stream_detect_by_ld
[i
]) {
5602 dev_err(&instance
->pdev
->dev
,
5603 "unable to allocate stream detect by LD\n ");
5604 for (j
= 0; j
< i
; ++j
)
5605 kfree(fusion
->stream_detect_by_ld
[j
]);
5606 kfree(fusion
->stream_detect_by_ld
);
5607 fusion
->stream_detect_by_ld
= NULL
;
5608 goto fail_get_ld_pd_list
;
5610 fusion
->stream_detect_by_ld
[i
]->mru_bit_map
5615 if (megasas_ld_list_query(instance
,
5616 MR_LD_QUERY_TYPE_EXPOSED_TO_HOST
))
5617 goto fail_get_ld_pd_list
;
5620 * Compute the max allowed sectors per IO: The controller info has two
5621 * limits on max sectors. Driver should use the minimum of these two.
5623 * 1 << stripe_sz_ops.min = max sectors per strip
5625 * Note that older firmwares ( < FW ver 30) didn't report information
5626 * to calculate max_sectors_1. So the number ended up as zero always.
5629 ctrl_info
= instance
->ctrl_info_buf
;
5631 max_sectors_1
= (1 << ctrl_info
->stripe_sz_ops
.min
) *
5632 le16_to_cpu(ctrl_info
->max_strips_per_io
);
5633 max_sectors_2
= le32_to_cpu(ctrl_info
->max_request_size
);
5635 tmp_sectors
= min_t(u32
, max_sectors_1
, max_sectors_2
);
5637 instance
->peerIsPresent
= ctrl_info
->cluster
.peerIsPresent
;
5638 instance
->passive
= ctrl_info
->cluster
.passive
;
5639 memcpy(instance
->clusterId
, ctrl_info
->clusterId
, sizeof(instance
->clusterId
));
5640 instance
->UnevenSpanSupport
=
5641 ctrl_info
->adapterOperations2
.supportUnevenSpans
;
5642 if (instance
->UnevenSpanSupport
) {
5643 struct fusion_context
*fusion
= instance
->ctrl_context
;
5644 if (MR_ValidateMapInfo(instance
, instance
->map_id
))
5645 fusion
->fast_path_io
= 1;
5647 fusion
->fast_path_io
= 0;
5650 if (ctrl_info
->host_interface
.SRIOV
) {
5651 instance
->requestorId
= ctrl_info
->iov
.requestorId
;
5652 if (instance
->pdev
->device
== PCI_DEVICE_ID_LSI_PLASMA
) {
5653 if (!ctrl_info
->adapterOperations2
.activePassive
)
5654 instance
->PlasmaFW111
= 1;
5656 dev_info(&instance
->pdev
->dev
, "SR-IOV: firmware type: %s\n",
5657 instance
->PlasmaFW111
? "1.11" : "new");
5659 if (instance
->PlasmaFW111
) {
5660 iovPtr
= (struct IOV_111
*)
5661 ((unsigned char *)ctrl_info
+ IOV_111_OFFSET
);
5662 instance
->requestorId
= iovPtr
->requestorId
;
5665 dev_info(&instance
->pdev
->dev
, "SRIOV: VF requestorId %d\n",
5666 instance
->requestorId
);
5669 instance
->crash_dump_fw_support
=
5670 ctrl_info
->adapterOperations3
.supportCrashDump
;
5671 instance
->crash_dump_drv_support
=
5672 (instance
->crash_dump_fw_support
&&
5673 instance
->crash_dump_buf
);
5674 if (instance
->crash_dump_drv_support
)
5675 megasas_set_crash_dump_params(instance
,
5676 MR_CRASH_BUF_TURN_OFF
);
5679 if (instance
->crash_dump_buf
)
5680 dma_free_coherent(&instance
->pdev
->dev
,
5682 instance
->crash_dump_buf
,
5683 instance
->crash_dump_h
);
5684 instance
->crash_dump_buf
= NULL
;
5687 if (instance
->snapdump_wait_time
) {
5688 megasas_get_snapdump_properties(instance
);
5689 dev_info(&instance
->pdev
->dev
, "Snap dump wait time\t: %d\n",
5690 instance
->snapdump_wait_time
);
5693 dev_info(&instance
->pdev
->dev
,
5694 "pci id\t\t: (0x%04x)/(0x%04x)/(0x%04x)/(0x%04x)\n",
5695 le16_to_cpu(ctrl_info
->pci
.vendor_id
),
5696 le16_to_cpu(ctrl_info
->pci
.device_id
),
5697 le16_to_cpu(ctrl_info
->pci
.sub_vendor_id
),
5698 le16_to_cpu(ctrl_info
->pci
.sub_device_id
));
5699 dev_info(&instance
->pdev
->dev
, "unevenspan support : %s\n",
5700 instance
->UnevenSpanSupport
? "yes" : "no");
5701 dev_info(&instance
->pdev
->dev
, "firmware crash dump : %s\n",
5702 instance
->crash_dump_drv_support
? "yes" : "no");
5703 dev_info(&instance
->pdev
->dev
, "jbod sync map : %s\n",
5704 instance
->use_seqnum_jbod_fp
? "yes" : "no");
5706 instance
->max_sectors_per_req
= instance
->max_num_sge
*
5707 SGE_BUFFER_SIZE
/ 512;
5708 if (tmp_sectors
&& (instance
->max_sectors_per_req
> tmp_sectors
))
5709 instance
->max_sectors_per_req
= tmp_sectors
;
5711 /* Check for valid throttlequeuedepth module parameter */
5712 if (throttlequeuedepth
&&
5713 throttlequeuedepth
<= instance
->max_scsi_cmds
)
5714 instance
->throttlequeuedepth
= throttlequeuedepth
;
5716 instance
->throttlequeuedepth
=
5717 MEGASAS_THROTTLE_QUEUE_DEPTH
;
5719 if ((resetwaittime
< 1) ||
5720 (resetwaittime
> MEGASAS_RESET_WAIT_TIME
))
5721 resetwaittime
= MEGASAS_RESET_WAIT_TIME
;
5723 if ((scmd_timeout
< 10) || (scmd_timeout
> MEGASAS_DEFAULT_CMD_TIMEOUT
))
5724 scmd_timeout
= MEGASAS_DEFAULT_CMD_TIMEOUT
;
5726 /* Launch SR-IOV heartbeat timer */
5727 if (instance
->requestorId
) {
5728 if (!megasas_sriov_start_heartbeat(instance
, 1)) {
5729 megasas_start_timer(instance
);
5731 instance
->skip_heartbeat_timer_del
= 1;
5732 goto fail_get_ld_pd_list
;
5737 * Create and start watchdog thread which will monitor
5738 * controller state every 1 sec and trigger OCR when
5739 * it enters fault state
5741 if (instance
->adapter_type
!= MFI_SERIES
)
5742 if (megasas_fusion_start_watchdog(instance
) != SUCCESS
)
5743 goto fail_start_watchdog
;
5747 fail_start_watchdog
:
5748 if (instance
->requestorId
&& !instance
->skip_heartbeat_timer_del
)
5749 del_timer_sync(&instance
->sriov_heartbeat_timer
);
5750 fail_get_ld_pd_list
:
5751 instance
->instancet
->disable_intr(instance
);
5752 megasas_destroy_irqs(instance
);
5754 if (instance
->msix_vectors
)
5755 pci_free_irq_vectors(instance
->pdev
);
5756 instance
->msix_vectors
= 0;
5758 megasas_free_ctrl_dma_buffers(instance
);
5759 megasas_free_ctrl_mem(instance
);
5761 iounmap(instance
->reg_set
);
5764 pci_release_selected_regions(instance
->pdev
, 1<<instance
->bar
);
5766 dev_err(&instance
->pdev
->dev
, "Failed from %s %d\n",
5767 __func__
, __LINE__
);
5772 * megasas_release_mfi - Reverses the FW initialization
5773 * @instance: Adapter soft state
5775 static void megasas_release_mfi(struct megasas_instance
*instance
)
5777 u32 reply_q_sz
= sizeof(u32
) *(instance
->max_mfi_cmds
+ 1);
5779 if (instance
->reply_queue
)
5780 dma_free_coherent(&instance
->pdev
->dev
, reply_q_sz
,
5781 instance
->reply_queue
, instance
->reply_queue_h
);
5783 megasas_free_cmds(instance
);
5785 iounmap(instance
->reg_set
);
5787 pci_release_selected_regions(instance
->pdev
, 1<<instance
->bar
);
5791 * megasas_get_seq_num - Gets latest event sequence numbers
5792 * @instance: Adapter soft state
5793 * @eli: FW event log sequence numbers information
5795 * FW maintains a log of all events in a non-volatile area. Upper layers would
5796 * usually find out the latest sequence number of the events, the seq number at
5797 * the boot etc. They would "read" all the events below the latest seq number
5798 * by issuing a direct fw cmd (DCMD). For the future events (beyond latest seq
5799 * number), they would subsribe to AEN (asynchronous event notification) and
5800 * wait for the events to happen.
5803 megasas_get_seq_num(struct megasas_instance
*instance
,
5804 struct megasas_evt_log_info
*eli
)
5806 struct megasas_cmd
*cmd
;
5807 struct megasas_dcmd_frame
*dcmd
;
5808 struct megasas_evt_log_info
*el_info
;
5809 dma_addr_t el_info_h
= 0;
5812 cmd
= megasas_get_cmd(instance
);
5818 dcmd
= &cmd
->frame
->dcmd
;
5819 el_info
= dma_alloc_coherent(&instance
->pdev
->dev
,
5820 sizeof(struct megasas_evt_log_info
),
5821 &el_info_h
, GFP_KERNEL
);
5823 megasas_return_cmd(instance
, cmd
);
5827 memset(dcmd
->mbox
.b
, 0, MFI_MBOX_SIZE
);
5829 dcmd
->cmd
= MFI_CMD_DCMD
;
5830 dcmd
->cmd_status
= 0x0;
5831 dcmd
->sge_count
= 1;
5832 dcmd
->flags
= MFI_FRAME_DIR_READ
;
5835 dcmd
->data_xfer_len
= cpu_to_le32(sizeof(struct megasas_evt_log_info
));
5836 dcmd
->opcode
= cpu_to_le32(MR_DCMD_CTRL_EVENT_GET_INFO
);
5838 megasas_set_dma_settings(instance
, dcmd
, el_info_h
,
5839 sizeof(struct megasas_evt_log_info
));
5841 ret
= megasas_issue_blocked_cmd(instance
, cmd
, MFI_IO_TIMEOUT_SECS
);
5842 if (ret
!= DCMD_SUCCESS
) {
5843 dev_err(&instance
->pdev
->dev
, "Failed from %s %d\n",
5844 __func__
, __LINE__
);
5849 * Copy the data back into callers buffer
5851 eli
->newest_seq_num
= el_info
->newest_seq_num
;
5852 eli
->oldest_seq_num
= el_info
->oldest_seq_num
;
5853 eli
->clear_seq_num
= el_info
->clear_seq_num
;
5854 eli
->shutdown_seq_num
= el_info
->shutdown_seq_num
;
5855 eli
->boot_seq_num
= el_info
->boot_seq_num
;
5858 dma_free_coherent(&instance
->pdev
->dev
,
5859 sizeof(struct megasas_evt_log_info
),
5860 el_info
, el_info_h
);
5862 megasas_return_cmd(instance
, cmd
);
5868 * megasas_register_aen - Registers for asynchronous event notification
5869 * @instance: Adapter soft state
5870 * @seq_num: The starting sequence number
5871 * @class_locale: Class of the event
5873 * This function subscribes for AEN for events beyond the @seq_num. It requests
5874 * to be notified if and only if the event is of type @class_locale
5877 megasas_register_aen(struct megasas_instance
*instance
, u32 seq_num
,
5878 u32 class_locale_word
)
5881 struct megasas_cmd
*cmd
;
5882 struct megasas_dcmd_frame
*dcmd
;
5883 union megasas_evt_class_locale curr_aen
;
5884 union megasas_evt_class_locale prev_aen
;
5887 * If there an AEN pending already (aen_cmd), check if the
5888 * class_locale of that pending AEN is inclusive of the new
5889 * AEN request we currently have. If it is, then we don't have
5890 * to do anything. In other words, whichever events the current
5891 * AEN request is subscribing to, have already been subscribed
5894 * If the old_cmd is _not_ inclusive, then we have to abort
5895 * that command, form a class_locale that is superset of both
5896 * old and current and re-issue to the FW
5899 curr_aen
.word
= class_locale_word
;
5901 if (instance
->aen_cmd
) {
5904 le32_to_cpu(instance
->aen_cmd
->frame
->dcmd
.mbox
.w
[1]);
5906 if ((curr_aen
.members
.class < MFI_EVT_CLASS_DEBUG
) ||
5907 (curr_aen
.members
.class > MFI_EVT_CLASS_DEAD
)) {
5908 dev_info(&instance
->pdev
->dev
,
5909 "%s %d out of range class %d send by application\n",
5910 __func__
, __LINE__
, curr_aen
.members
.class);
5915 * A class whose enum value is smaller is inclusive of all
5916 * higher values. If a PROGRESS (= -1) was previously
5917 * registered, then a new registration requests for higher
5918 * classes need not be sent to FW. They are automatically
5921 * Locale numbers don't have such hierarchy. They are bitmap
5924 if ((prev_aen
.members
.class <= curr_aen
.members
.class) &&
5925 !((prev_aen
.members
.locale
& curr_aen
.members
.locale
) ^
5926 curr_aen
.members
.locale
)) {
5928 * Previously issued event registration includes
5929 * current request. Nothing to do.
5933 curr_aen
.members
.locale
|= prev_aen
.members
.locale
;
5935 if (prev_aen
.members
.class < curr_aen
.members
.class)
5936 curr_aen
.members
.class = prev_aen
.members
.class;
5938 instance
->aen_cmd
->abort_aen
= 1;
5939 ret_val
= megasas_issue_blocked_abort_cmd(instance
,
5944 dev_printk(KERN_DEBUG
, &instance
->pdev
->dev
, "Failed to abort "
5945 "previous AEN command\n");
5951 cmd
= megasas_get_cmd(instance
);
5956 dcmd
= &cmd
->frame
->dcmd
;
5958 memset(instance
->evt_detail
, 0, sizeof(struct megasas_evt_detail
));
5961 * Prepare DCMD for aen registration
5963 memset(dcmd
->mbox
.b
, 0, MFI_MBOX_SIZE
);
5965 dcmd
->cmd
= MFI_CMD_DCMD
;
5966 dcmd
->cmd_status
= 0x0;
5967 dcmd
->sge_count
= 1;
5968 dcmd
->flags
= MFI_FRAME_DIR_READ
;
5971 dcmd
->data_xfer_len
= cpu_to_le32(sizeof(struct megasas_evt_detail
));
5972 dcmd
->opcode
= cpu_to_le32(MR_DCMD_CTRL_EVENT_WAIT
);
5973 dcmd
->mbox
.w
[0] = cpu_to_le32(seq_num
);
5974 instance
->last_seq_num
= seq_num
;
5975 dcmd
->mbox
.w
[1] = cpu_to_le32(curr_aen
.word
);
5977 megasas_set_dma_settings(instance
, dcmd
, instance
->evt_detail_h
,
5978 sizeof(struct megasas_evt_detail
));
5980 if (instance
->aen_cmd
!= NULL
) {
5981 megasas_return_cmd(instance
, cmd
);
5986 * Store reference to the cmd used to register for AEN. When an
5987 * application wants us to register for AEN, we have to abort this
5988 * cmd and re-register with a new EVENT LOCALE supplied by that app
5990 instance
->aen_cmd
= cmd
;
5993 * Issue the aen registration frame
5995 instance
->instancet
->issue_dcmd(instance
, cmd
);
6000 /* megasas_get_target_prop - Send DCMD with below details to firmware.
6002 * This DCMD will fetch few properties of LD/system PD defined
6003 * in MR_TARGET_DEV_PROPERTIES. eg. Queue Depth, MDTS value.
6005 * DCMD send by drivers whenever new target is added to the OS.
6007 * dcmd.opcode - MR_DCMD_DEV_GET_TARGET_PROP
6008 * dcmd.mbox.b[0] - DCMD is to be fired for LD or system PD.
6009 * 0 = system PD, 1 = LD.
6010 * dcmd.mbox.s[1] - TargetID for LD/system PD.
6011 * dcmd.sge IN - Pointer to return MR_TARGET_DEV_PROPERTIES.
6013 * @instance: Adapter soft state
6014 * @sdev: OS provided scsi device
6016 * Returns 0 on success non-zero on failure.
6019 megasas_get_target_prop(struct megasas_instance
*instance
,
6020 struct scsi_device
*sdev
)
6023 struct megasas_cmd
*cmd
;
6024 struct megasas_dcmd_frame
*dcmd
;
6025 u16 targetId
= (sdev
->channel
% 2) + sdev
->id
;
6027 cmd
= megasas_get_cmd(instance
);
6030 dev_err(&instance
->pdev
->dev
,
6031 "Failed to get cmd %s\n", __func__
);
6035 dcmd
= &cmd
->frame
->dcmd
;
6037 memset(instance
->tgt_prop
, 0, sizeof(*instance
->tgt_prop
));
6038 memset(dcmd
->mbox
.b
, 0, MFI_MBOX_SIZE
);
6039 dcmd
->mbox
.b
[0] = MEGASAS_IS_LOGICAL(sdev
);
6041 dcmd
->mbox
.s
[1] = cpu_to_le16(targetId
);
6042 dcmd
->cmd
= MFI_CMD_DCMD
;
6043 dcmd
->cmd_status
= 0xFF;
6044 dcmd
->sge_count
= 1;
6045 dcmd
->flags
= MFI_FRAME_DIR_READ
;
6048 dcmd
->data_xfer_len
=
6049 cpu_to_le32(sizeof(struct MR_TARGET_PROPERTIES
));
6050 dcmd
->opcode
= cpu_to_le32(MR_DCMD_DRV_GET_TARGET_PROP
);
6052 megasas_set_dma_settings(instance
, dcmd
, instance
->tgt_prop_h
,
6053 sizeof(struct MR_TARGET_PROPERTIES
));
6055 if ((instance
->adapter_type
!= MFI_SERIES
) &&
6056 !instance
->mask_interrupts
)
6057 ret
= megasas_issue_blocked_cmd(instance
,
6058 cmd
, MFI_IO_TIMEOUT_SECS
);
6060 ret
= megasas_issue_polled(instance
, cmd
);
6064 switch (dcmd_timeout_ocr_possible(instance
)) {
6066 cmd
->flags
|= DRV_DCMD_SKIP_REFIRE
;
6067 megasas_reset_fusion(instance
->host
,
6068 MFI_IO_TIMEOUT_OCR
);
6071 megaraid_sas_kill_hba(instance
);
6073 case IGNORE_TIMEOUT
:
6074 dev_info(&instance
->pdev
->dev
,
6075 "Ignore DCMD timeout: %s %d\n",
6076 __func__
, __LINE__
);
6082 megasas_return_cmd(instance
, cmd
);
6084 if (ret
!= DCMD_SUCCESS
)
6085 dev_err(&instance
->pdev
->dev
,
6086 "return from %s %d return value %d\n",
6087 __func__
, __LINE__
, ret
);
6093 * megasas_start_aen - Subscribes to AEN during driver load time
6094 * @instance: Adapter soft state
6096 static int megasas_start_aen(struct megasas_instance
*instance
)
6098 struct megasas_evt_log_info eli
;
6099 union megasas_evt_class_locale class_locale
;
6102 * Get the latest sequence number from FW
6104 memset(&eli
, 0, sizeof(eli
));
6106 if (megasas_get_seq_num(instance
, &eli
))
6110 * Register AEN with FW for latest sequence number plus 1
6112 class_locale
.members
.reserved
= 0;
6113 class_locale
.members
.locale
= MR_EVT_LOCALE_ALL
;
6114 class_locale
.members
.class = MR_EVT_CLASS_DEBUG
;
6116 return megasas_register_aen(instance
,
6117 le32_to_cpu(eli
.newest_seq_num
) + 1,
6122 * megasas_io_attach - Attaches this driver to SCSI mid-layer
6123 * @instance: Adapter soft state
6125 static int megasas_io_attach(struct megasas_instance
*instance
)
6127 struct Scsi_Host
*host
= instance
->host
;
6130 * Export parameters required by SCSI mid-layer
6132 host
->unique_id
= instance
->unique_id
;
6133 host
->can_queue
= instance
->max_scsi_cmds
;
6134 host
->this_id
= instance
->init_id
;
6135 host
->sg_tablesize
= instance
->max_num_sge
;
6137 if (instance
->fw_support_ieee
)
6138 instance
->max_sectors_per_req
= MEGASAS_MAX_SECTORS_IEEE
;
6141 * Check if the module parameter value for max_sectors can be used
6143 if (max_sectors
&& max_sectors
< instance
->max_sectors_per_req
)
6144 instance
->max_sectors_per_req
= max_sectors
;
6147 if (((instance
->pdev
->device
==
6148 PCI_DEVICE_ID_LSI_SAS1078GEN2
) ||
6149 (instance
->pdev
->device
==
6150 PCI_DEVICE_ID_LSI_SAS0079GEN2
)) &&
6151 (max_sectors
<= MEGASAS_MAX_SECTORS
)) {
6152 instance
->max_sectors_per_req
= max_sectors
;
6154 dev_info(&instance
->pdev
->dev
, "max_sectors should be > 0"
6155 "and <= %d (or < 1MB for GEN2 controller)\n",
6156 instance
->max_sectors_per_req
);
6161 host
->max_sectors
= instance
->max_sectors_per_req
;
6162 host
->cmd_per_lun
= MEGASAS_DEFAULT_CMD_PER_LUN
;
6163 host
->max_channel
= MEGASAS_MAX_CHANNELS
- 1;
6164 host
->max_id
= MEGASAS_MAX_DEV_PER_CHANNEL
;
6165 host
->max_lun
= MEGASAS_MAX_LUN
;
6166 host
->max_cmd_len
= 16;
6169 * Notify the mid-layer about the new controller
6171 if (scsi_add_host(host
, &instance
->pdev
->dev
)) {
6172 dev_err(&instance
->pdev
->dev
,
6173 "Failed to add host from %s %d\n",
6174 __func__
, __LINE__
);
6182 * megasas_set_dma_mask - Set DMA mask for supported controllers
6184 * @instance: Adapter soft state
6187 * For Ventura, driver/FW will operate in 63bit DMA addresses.
6190 * By default, driver/FW will operate in 32bit DMA addresses
6191 * for consistent DMA mapping but if 32 bit consistent
6192 * DMA mask fails, driver will try with 63 bit consistent
6193 * mask provided FW is true 63bit DMA capable
6195 * For older controllers(Thunderbolt and MFI based adapters)-
6196 * driver/FW will operate in 32 bit consistent DMA addresses.
6199 megasas_set_dma_mask(struct megasas_instance
*instance
)
6201 u64 consistent_mask
;
6202 struct pci_dev
*pdev
;
6205 pdev
= instance
->pdev
;
6206 consistent_mask
= (instance
->adapter_type
>= VENTURA_SERIES
) ?
6207 DMA_BIT_MASK(63) : DMA_BIT_MASK(32);
6210 if (dma_set_mask(&pdev
->dev
, DMA_BIT_MASK(63)) &&
6211 dma_set_mask_and_coherent(&pdev
->dev
, DMA_BIT_MASK(32)))
6212 goto fail_set_dma_mask
;
6214 if ((*pdev
->dev
.dma_mask
== DMA_BIT_MASK(63)) &&
6215 (dma_set_coherent_mask(&pdev
->dev
, consistent_mask
) &&
6216 dma_set_mask_and_coherent(&pdev
->dev
, DMA_BIT_MASK(32)))) {
6218 * If 32 bit DMA mask fails, then try for 64 bit mask
6219 * for FW capable of handling 64 bit DMA.
6221 scratch_pad_1
= megasas_readl
6222 (instance
, &instance
->reg_set
->outbound_scratch_pad_1
);
6224 if (!(scratch_pad_1
& MR_CAN_HANDLE_64_BIT_DMA_OFFSET
))
6225 goto fail_set_dma_mask
;
6226 else if (dma_set_mask_and_coherent(&pdev
->dev
,
6228 goto fail_set_dma_mask
;
6230 } else if (dma_set_mask_and_coherent(&pdev
->dev
, DMA_BIT_MASK(32)))
6231 goto fail_set_dma_mask
;
6233 if (pdev
->dev
.coherent_dma_mask
== DMA_BIT_MASK(32))
6234 instance
->consistent_mask_64bit
= false;
6236 instance
->consistent_mask_64bit
= true;
6238 dev_info(&pdev
->dev
, "%s bit DMA mask and %s bit consistent mask\n",
6239 ((*pdev
->dev
.dma_mask
== DMA_BIT_MASK(63)) ? "63" : "32"),
6240 (instance
->consistent_mask_64bit
? "63" : "32"));
6245 dev_err(&pdev
->dev
, "Failed to set DMA mask\n");
6251 * megasas_set_adapter_type - Set adapter type.
6252 * Supported controllers can be divided in
6253 * different categories-
6254 * enum MR_ADAPTER_TYPE {
6256 * THUNDERBOLT_SERIES = 2,
6257 * INVADER_SERIES = 3,
6258 * VENTURA_SERIES = 4,
6261 * @instance: Adapter soft state
6264 static inline void megasas_set_adapter_type(struct megasas_instance
*instance
)
6266 if ((instance
->pdev
->vendor
== PCI_VENDOR_ID_DELL
) &&
6267 (instance
->pdev
->device
== PCI_DEVICE_ID_DELL_PERC5
)) {
6268 instance
->adapter_type
= MFI_SERIES
;
6270 switch (instance
->pdev
->device
) {
6271 case PCI_DEVICE_ID_LSI_AERO_10E1
:
6272 case PCI_DEVICE_ID_LSI_AERO_10E2
:
6273 case PCI_DEVICE_ID_LSI_AERO_10E5
:
6274 case PCI_DEVICE_ID_LSI_AERO_10E6
:
6275 instance
->adapter_type
= AERO_SERIES
;
6277 case PCI_DEVICE_ID_LSI_VENTURA
:
6278 case PCI_DEVICE_ID_LSI_CRUSADER
:
6279 case PCI_DEVICE_ID_LSI_HARPOON
:
6280 case PCI_DEVICE_ID_LSI_TOMCAT
:
6281 case PCI_DEVICE_ID_LSI_VENTURA_4PORT
:
6282 case PCI_DEVICE_ID_LSI_CRUSADER_4PORT
:
6283 instance
->adapter_type
= VENTURA_SERIES
;
6285 case PCI_DEVICE_ID_LSI_FUSION
:
6286 case PCI_DEVICE_ID_LSI_PLASMA
:
6287 instance
->adapter_type
= THUNDERBOLT_SERIES
;
6289 case PCI_DEVICE_ID_LSI_INVADER
:
6290 case PCI_DEVICE_ID_LSI_INTRUDER
:
6291 case PCI_DEVICE_ID_LSI_INTRUDER_24
:
6292 case PCI_DEVICE_ID_LSI_CUTLASS_52
:
6293 case PCI_DEVICE_ID_LSI_CUTLASS_53
:
6294 case PCI_DEVICE_ID_LSI_FURY
:
6295 instance
->adapter_type
= INVADER_SERIES
;
6297 default: /* For all other supported controllers */
6298 instance
->adapter_type
= MFI_SERIES
;
6304 static inline int megasas_alloc_mfi_ctrl_mem(struct megasas_instance
*instance
)
6306 instance
->producer
= dma_alloc_coherent(&instance
->pdev
->dev
,
6307 sizeof(u32
), &instance
->producer_h
, GFP_KERNEL
);
6308 instance
->consumer
= dma_alloc_coherent(&instance
->pdev
->dev
,
6309 sizeof(u32
), &instance
->consumer_h
, GFP_KERNEL
);
6311 if (!instance
->producer
|| !instance
->consumer
) {
6312 dev_err(&instance
->pdev
->dev
,
6313 "Failed to allocate memory for producer, consumer\n");
6317 *instance
->producer
= 0;
6318 *instance
->consumer
= 0;
6323 * megasas_alloc_ctrl_mem - Allocate per controller memory for core data
6324 * structures which are not common across MFI
6325 * adapters and fusion adapters.
6326 * For MFI based adapters, allocate producer and
6327 * consumer buffers. For fusion adapters, allocate
6328 * memory for fusion context.
6329 * @instance: Adapter soft state
6330 * return: 0 for SUCCESS
6332 static int megasas_alloc_ctrl_mem(struct megasas_instance
*instance
)
6334 instance
->reply_map
= kcalloc(nr_cpu_ids
, sizeof(unsigned int),
6336 if (!instance
->reply_map
)
6339 switch (instance
->adapter_type
) {
6341 if (megasas_alloc_mfi_ctrl_mem(instance
))
6345 case VENTURA_SERIES
:
6346 case THUNDERBOLT_SERIES
:
6347 case INVADER_SERIES
:
6348 if (megasas_alloc_fusion_context(instance
))
6355 kfree(instance
->reply_map
);
6356 instance
->reply_map
= NULL
;
6361 * megasas_free_ctrl_mem - Free fusion context for fusion adapters and
6362 * producer, consumer buffers for MFI adapters
6364 * @instance - Adapter soft instance
6367 static inline void megasas_free_ctrl_mem(struct megasas_instance
*instance
)
6369 kfree(instance
->reply_map
);
6370 if (instance
->adapter_type
== MFI_SERIES
) {
6371 if (instance
->producer
)
6372 dma_free_coherent(&instance
->pdev
->dev
, sizeof(u32
),
6374 instance
->producer_h
);
6375 if (instance
->consumer
)
6376 dma_free_coherent(&instance
->pdev
->dev
, sizeof(u32
),
6378 instance
->consumer_h
);
6380 megasas_free_fusion_context(instance
);
6385 * megasas_alloc_ctrl_dma_buffers - Allocate consistent DMA buffers during
6388 * @instance- Adapter soft instance
6389 * @return- O for SUCCESS
6392 int megasas_alloc_ctrl_dma_buffers(struct megasas_instance
*instance
)
6394 struct pci_dev
*pdev
= instance
->pdev
;
6395 struct fusion_context
*fusion
= instance
->ctrl_context
;
6397 instance
->evt_detail
= dma_alloc_coherent(&pdev
->dev
,
6398 sizeof(struct megasas_evt_detail
),
6399 &instance
->evt_detail_h
, GFP_KERNEL
);
6401 if (!instance
->evt_detail
) {
6402 dev_err(&instance
->pdev
->dev
,
6403 "Failed to allocate event detail buffer\n");
6408 fusion
->ioc_init_request
=
6409 dma_alloc_coherent(&pdev
->dev
,
6410 sizeof(struct MPI2_IOC_INIT_REQUEST
),
6411 &fusion
->ioc_init_request_phys
,
6414 if (!fusion
->ioc_init_request
) {
6416 "Failed to allocate PD list buffer\n");
6420 instance
->snapdump_prop
= dma_alloc_coherent(&pdev
->dev
,
6421 sizeof(struct MR_SNAPDUMP_PROPERTIES
),
6422 &instance
->snapdump_prop_h
, GFP_KERNEL
);
6424 if (!instance
->snapdump_prop
)
6426 "Failed to allocate snapdump properties buffer\n");
6429 instance
->pd_list_buf
=
6430 dma_alloc_coherent(&pdev
->dev
,
6431 MEGASAS_MAX_PD
* sizeof(struct MR_PD_LIST
),
6432 &instance
->pd_list_buf_h
, GFP_KERNEL
);
6434 if (!instance
->pd_list_buf
) {
6435 dev_err(&pdev
->dev
, "Failed to allocate PD list buffer\n");
6439 instance
->ctrl_info_buf
=
6440 dma_alloc_coherent(&pdev
->dev
,
6441 sizeof(struct megasas_ctrl_info
),
6442 &instance
->ctrl_info_buf_h
, GFP_KERNEL
);
6444 if (!instance
->ctrl_info_buf
) {
6446 "Failed to allocate controller info buffer\n");
6450 instance
->ld_list_buf
=
6451 dma_alloc_coherent(&pdev
->dev
,
6452 sizeof(struct MR_LD_LIST
),
6453 &instance
->ld_list_buf_h
, GFP_KERNEL
);
6455 if (!instance
->ld_list_buf
) {
6456 dev_err(&pdev
->dev
, "Failed to allocate LD list buffer\n");
6460 instance
->ld_targetid_list_buf
=
6461 dma_alloc_coherent(&pdev
->dev
,
6462 sizeof(struct MR_LD_TARGETID_LIST
),
6463 &instance
->ld_targetid_list_buf_h
, GFP_KERNEL
);
6465 if (!instance
->ld_targetid_list_buf
) {
6467 "Failed to allocate LD targetid list buffer\n");
6471 if (!reset_devices
) {
6472 instance
->system_info_buf
=
6473 dma_alloc_coherent(&pdev
->dev
,
6474 sizeof(struct MR_DRV_SYSTEM_INFO
),
6475 &instance
->system_info_h
, GFP_KERNEL
);
6477 dma_alloc_coherent(&pdev
->dev
,
6478 sizeof(struct MR_PD_INFO
),
6479 &instance
->pd_info_h
, GFP_KERNEL
);
6480 instance
->tgt_prop
=
6481 dma_alloc_coherent(&pdev
->dev
,
6482 sizeof(struct MR_TARGET_PROPERTIES
),
6483 &instance
->tgt_prop_h
, GFP_KERNEL
);
6484 instance
->crash_dump_buf
=
6485 dma_alloc_coherent(&pdev
->dev
, CRASH_DMA_BUF_SIZE
,
6486 &instance
->crash_dump_h
, GFP_KERNEL
);
6488 if (!instance
->system_info_buf
)
6489 dev_err(&instance
->pdev
->dev
,
6490 "Failed to allocate system info buffer\n");
6492 if (!instance
->pd_info
)
6493 dev_err(&instance
->pdev
->dev
,
6494 "Failed to allocate pd_info buffer\n");
6496 if (!instance
->tgt_prop
)
6497 dev_err(&instance
->pdev
->dev
,
6498 "Failed to allocate tgt_prop buffer\n");
6500 if (!instance
->crash_dump_buf
)
6501 dev_err(&instance
->pdev
->dev
,
6502 "Failed to allocate crash dump buffer\n");
6509 * megasas_free_ctrl_dma_buffers - Free consistent DMA buffers allocated
6510 * during driver load time
6512 * @instance- Adapter soft instance
6516 void megasas_free_ctrl_dma_buffers(struct megasas_instance
*instance
)
6518 struct pci_dev
*pdev
= instance
->pdev
;
6519 struct fusion_context
*fusion
= instance
->ctrl_context
;
6521 if (instance
->evt_detail
)
6522 dma_free_coherent(&pdev
->dev
, sizeof(struct megasas_evt_detail
),
6523 instance
->evt_detail
,
6524 instance
->evt_detail_h
);
6526 if (fusion
&& fusion
->ioc_init_request
)
6527 dma_free_coherent(&pdev
->dev
,
6528 sizeof(struct MPI2_IOC_INIT_REQUEST
),
6529 fusion
->ioc_init_request
,
6530 fusion
->ioc_init_request_phys
);
6532 if (instance
->pd_list_buf
)
6533 dma_free_coherent(&pdev
->dev
,
6534 MEGASAS_MAX_PD
* sizeof(struct MR_PD_LIST
),
6535 instance
->pd_list_buf
,
6536 instance
->pd_list_buf_h
);
6538 if (instance
->ld_list_buf
)
6539 dma_free_coherent(&pdev
->dev
, sizeof(struct MR_LD_LIST
),
6540 instance
->ld_list_buf
,
6541 instance
->ld_list_buf_h
);
6543 if (instance
->ld_targetid_list_buf
)
6544 dma_free_coherent(&pdev
->dev
, sizeof(struct MR_LD_TARGETID_LIST
),
6545 instance
->ld_targetid_list_buf
,
6546 instance
->ld_targetid_list_buf_h
);
6548 if (instance
->ctrl_info_buf
)
6549 dma_free_coherent(&pdev
->dev
, sizeof(struct megasas_ctrl_info
),
6550 instance
->ctrl_info_buf
,
6551 instance
->ctrl_info_buf_h
);
6553 if (instance
->system_info_buf
)
6554 dma_free_coherent(&pdev
->dev
, sizeof(struct MR_DRV_SYSTEM_INFO
),
6555 instance
->system_info_buf
,
6556 instance
->system_info_h
);
6558 if (instance
->pd_info
)
6559 dma_free_coherent(&pdev
->dev
, sizeof(struct MR_PD_INFO
),
6560 instance
->pd_info
, instance
->pd_info_h
);
6562 if (instance
->tgt_prop
)
6563 dma_free_coherent(&pdev
->dev
, sizeof(struct MR_TARGET_PROPERTIES
),
6564 instance
->tgt_prop
, instance
->tgt_prop_h
);
6566 if (instance
->crash_dump_buf
)
6567 dma_free_coherent(&pdev
->dev
, CRASH_DMA_BUF_SIZE
,
6568 instance
->crash_dump_buf
,
6569 instance
->crash_dump_h
);
6571 if (instance
->snapdump_prop
)
6572 dma_free_coherent(&pdev
->dev
,
6573 sizeof(struct MR_SNAPDUMP_PROPERTIES
),
6574 instance
->snapdump_prop
,
6575 instance
->snapdump_prop_h
);
6579 * megasas_init_ctrl_params - Initialize controller's instance
6580 * parameters before FW init
6581 * @instance - Adapter soft instance
6584 static inline void megasas_init_ctrl_params(struct megasas_instance
*instance
)
6586 instance
->fw_crash_state
= UNAVAILABLE
;
6588 megasas_poll_wait_aen
= 0;
6589 instance
->issuepend_done
= 1;
6590 atomic_set(&instance
->adprecovery
, MEGASAS_HBA_OPERATIONAL
);
6593 * Initialize locks and queues
6595 INIT_LIST_HEAD(&instance
->cmd_pool
);
6596 INIT_LIST_HEAD(&instance
->internal_reset_pending_q
);
6598 atomic_set(&instance
->fw_outstanding
, 0);
6600 init_waitqueue_head(&instance
->int_cmd_wait_q
);
6601 init_waitqueue_head(&instance
->abort_cmd_wait_q
);
6603 spin_lock_init(&instance
->crashdump_lock
);
6604 spin_lock_init(&instance
->mfi_pool_lock
);
6605 spin_lock_init(&instance
->hba_lock
);
6606 spin_lock_init(&instance
->stream_lock
);
6607 spin_lock_init(&instance
->completion_lock
);
6609 mutex_init(&instance
->reset_mutex
);
6611 if ((instance
->pdev
->device
== PCI_DEVICE_ID_LSI_SAS0073SKINNY
) ||
6612 (instance
->pdev
->device
== PCI_DEVICE_ID_LSI_SAS0071SKINNY
))
6613 instance
->flag_ieee
= 1;
6615 megasas_dbg_lvl
= 0;
6617 instance
->unload
= 1;
6618 instance
->last_time
= 0;
6619 instance
->disableOnlineCtrlReset
= 1;
6620 instance
->UnevenSpanSupport
= 0;
6622 if (instance
->adapter_type
!= MFI_SERIES
)
6623 INIT_WORK(&instance
->work_init
, megasas_fusion_ocr_wq
);
6625 INIT_WORK(&instance
->work_init
, process_fw_state_change_wq
);
6629 * megasas_probe_one - PCI hotplug entry point
6630 * @pdev: PCI device structure
6631 * @id: PCI ids of supported hotplugged adapter
6633 static int megasas_probe_one(struct pci_dev
*pdev
,
6634 const struct pci_device_id
*id
)
6637 struct Scsi_Host
*host
;
6638 struct megasas_instance
*instance
;
6641 switch (pdev
->device
) {
6642 case PCI_DEVICE_ID_LSI_AERO_10E1
:
6643 case PCI_DEVICE_ID_LSI_AERO_10E5
:
6644 dev_info(&pdev
->dev
, "Adapter is in configurable secure mode\n");
6648 /* Reset MSI-X in the kdump kernel */
6649 if (reset_devices
) {
6650 pos
= pci_find_capability(pdev
, PCI_CAP_ID_MSIX
);
6652 pci_read_config_word(pdev
, pos
+ PCI_MSIX_FLAGS
,
6654 if (control
& PCI_MSIX_FLAGS_ENABLE
) {
6655 dev_info(&pdev
->dev
, "resetting MSI-X\n");
6656 pci_write_config_word(pdev
,
6657 pos
+ PCI_MSIX_FLAGS
,
6659 ~PCI_MSIX_FLAGS_ENABLE
);
6665 * PCI prepping: enable device set bus mastering and dma mask
6667 rval
= pci_enable_device_mem(pdev
);
6673 pci_set_master(pdev
);
6675 host
= scsi_host_alloc(&megasas_template
,
6676 sizeof(struct megasas_instance
));
6679 dev_printk(KERN_DEBUG
, &pdev
->dev
, "scsi_host_alloc failed\n");
6680 goto fail_alloc_instance
;
6683 instance
= (struct megasas_instance
*)host
->hostdata
;
6684 memset(instance
, 0, sizeof(*instance
));
6685 atomic_set(&instance
->fw_reset_no_pci_access
, 0);
6688 * Initialize PCI related and misc parameters
6690 instance
->pdev
= pdev
;
6691 instance
->host
= host
;
6692 instance
->unique_id
= pdev
->bus
->number
<< 8 | pdev
->devfn
;
6693 instance
->init_id
= MEGASAS_DEFAULT_INIT_ID
;
6695 megasas_set_adapter_type(instance
);
6698 * Initialize MFI Firmware
6700 if (megasas_init_fw(instance
))
6703 if (instance
->requestorId
) {
6704 if (instance
->PlasmaFW111
) {
6705 instance
->vf_affiliation_111
=
6706 dma_alloc_coherent(&pdev
->dev
,
6707 sizeof(struct MR_LD_VF_AFFILIATION_111
),
6708 &instance
->vf_affiliation_111_h
,
6710 if (!instance
->vf_affiliation_111
)
6711 dev_warn(&pdev
->dev
, "Can't allocate "
6712 "memory for VF affiliation buffer\n");
6714 instance
->vf_affiliation
=
6715 dma_alloc_coherent(&pdev
->dev
,
6716 (MAX_LOGICAL_DRIVES
+ 1) *
6717 sizeof(struct MR_LD_VF_AFFILIATION
),
6718 &instance
->vf_affiliation_h
,
6720 if (!instance
->vf_affiliation
)
6721 dev_warn(&pdev
->dev
, "Can't allocate "
6722 "memory for VF affiliation buffer\n");
6727 * Store instance in PCI softstate
6729 pci_set_drvdata(pdev
, instance
);
6732 * Add this controller to megasas_mgmt_info structure so that it
6733 * can be exported to management applications
6735 megasas_mgmt_info
.count
++;
6736 megasas_mgmt_info
.instance
[megasas_mgmt_info
.max_index
] = instance
;
6737 megasas_mgmt_info
.max_index
++;
6740 * Register with SCSI mid-layer
6742 if (megasas_io_attach(instance
))
6743 goto fail_io_attach
;
6745 instance
->unload
= 0;
6747 * Trigger SCSI to scan our drives
6749 scsi_scan_host(host
);
6752 * Initiate AEN (Asynchronous Event Notification)
6754 if (megasas_start_aen(instance
)) {
6755 dev_printk(KERN_DEBUG
, &pdev
->dev
, "start aen failed\n");
6756 goto fail_start_aen
;
6759 /* Get current SR-IOV LD/VF affiliation */
6760 if (instance
->requestorId
)
6761 megasas_get_ld_vf_affiliation(instance
, 1);
6767 megasas_mgmt_info
.count
--;
6768 megasas_mgmt_info
.max_index
--;
6769 megasas_mgmt_info
.instance
[megasas_mgmt_info
.max_index
] = NULL
;
6771 instance
->instancet
->disable_intr(instance
);
6772 megasas_destroy_irqs(instance
);
6774 if (instance
->adapter_type
!= MFI_SERIES
)
6775 megasas_release_fusion(instance
);
6777 megasas_release_mfi(instance
);
6778 if (instance
->msix_vectors
)
6779 pci_free_irq_vectors(instance
->pdev
);
6781 scsi_host_put(host
);
6782 fail_alloc_instance
:
6783 pci_disable_device(pdev
);
6789 * megasas_flush_cache - Requests FW to flush all its caches
6790 * @instance: Adapter soft state
6792 static void megasas_flush_cache(struct megasas_instance
*instance
)
6794 struct megasas_cmd
*cmd
;
6795 struct megasas_dcmd_frame
*dcmd
;
6797 if (atomic_read(&instance
->adprecovery
) == MEGASAS_HW_CRITICAL_ERROR
)
6800 cmd
= megasas_get_cmd(instance
);
6805 dcmd
= &cmd
->frame
->dcmd
;
6807 memset(dcmd
->mbox
.b
, 0, MFI_MBOX_SIZE
);
6809 dcmd
->cmd
= MFI_CMD_DCMD
;
6810 dcmd
->cmd_status
= 0x0;
6811 dcmd
->sge_count
= 0;
6812 dcmd
->flags
= cpu_to_le16(MFI_FRAME_DIR_NONE
);
6815 dcmd
->data_xfer_len
= 0;
6816 dcmd
->opcode
= cpu_to_le32(MR_DCMD_CTRL_CACHE_FLUSH
);
6817 dcmd
->mbox
.b
[0] = MR_FLUSH_CTRL_CACHE
| MR_FLUSH_DISK_CACHE
;
6819 if (megasas_issue_blocked_cmd(instance
, cmd
, MFI_IO_TIMEOUT_SECS
)
6821 dev_err(&instance
->pdev
->dev
,
6822 "return from %s %d\n", __func__
, __LINE__
);
6826 megasas_return_cmd(instance
, cmd
);
6830 * megasas_shutdown_controller - Instructs FW to shutdown the controller
6831 * @instance: Adapter soft state
6832 * @opcode: Shutdown/Hibernate
6834 static void megasas_shutdown_controller(struct megasas_instance
*instance
,
6837 struct megasas_cmd
*cmd
;
6838 struct megasas_dcmd_frame
*dcmd
;
6840 if (atomic_read(&instance
->adprecovery
) == MEGASAS_HW_CRITICAL_ERROR
)
6843 cmd
= megasas_get_cmd(instance
);
6848 if (instance
->aen_cmd
)
6849 megasas_issue_blocked_abort_cmd(instance
,
6850 instance
->aen_cmd
, MFI_IO_TIMEOUT_SECS
);
6851 if (instance
->map_update_cmd
)
6852 megasas_issue_blocked_abort_cmd(instance
,
6853 instance
->map_update_cmd
, MFI_IO_TIMEOUT_SECS
);
6854 if (instance
->jbod_seq_cmd
)
6855 megasas_issue_blocked_abort_cmd(instance
,
6856 instance
->jbod_seq_cmd
, MFI_IO_TIMEOUT_SECS
);
6858 dcmd
= &cmd
->frame
->dcmd
;
6860 memset(dcmd
->mbox
.b
, 0, MFI_MBOX_SIZE
);
6862 dcmd
->cmd
= MFI_CMD_DCMD
;
6863 dcmd
->cmd_status
= 0x0;
6864 dcmd
->sge_count
= 0;
6865 dcmd
->flags
= cpu_to_le16(MFI_FRAME_DIR_NONE
);
6868 dcmd
->data_xfer_len
= 0;
6869 dcmd
->opcode
= cpu_to_le32(opcode
);
6871 if (megasas_issue_blocked_cmd(instance
, cmd
, MFI_IO_TIMEOUT_SECS
)
6873 dev_err(&instance
->pdev
->dev
,
6874 "return from %s %d\n", __func__
, __LINE__
);
6878 megasas_return_cmd(instance
, cmd
);
6883 * megasas_suspend - driver suspend entry point
6884 * @pdev: PCI device structure
6885 * @state: PCI power state to suspend routine
6888 megasas_suspend(struct pci_dev
*pdev
, pm_message_t state
)
6890 struct Scsi_Host
*host
;
6891 struct megasas_instance
*instance
;
6893 instance
= pci_get_drvdata(pdev
);
6894 host
= instance
->host
;
6895 instance
->unload
= 1;
6897 /* Shutdown SR-IOV heartbeat timer */
6898 if (instance
->requestorId
&& !instance
->skip_heartbeat_timer_del
)
6899 del_timer_sync(&instance
->sriov_heartbeat_timer
);
6901 /* Stop the FW fault detection watchdog */
6902 if (instance
->adapter_type
!= MFI_SERIES
)
6903 megasas_fusion_stop_watchdog(instance
);
6905 megasas_flush_cache(instance
);
6906 megasas_shutdown_controller(instance
, MR_DCMD_HIBERNATE_SHUTDOWN
);
6908 /* cancel the delayed work if this work still in queue */
6909 if (instance
->ev
!= NULL
) {
6910 struct megasas_aen_event
*ev
= instance
->ev
;
6911 cancel_delayed_work_sync(&ev
->hotplug_work
);
6912 instance
->ev
= NULL
;
6915 tasklet_kill(&instance
->isr_tasklet
);
6917 pci_set_drvdata(instance
->pdev
, instance
);
6918 instance
->instancet
->disable_intr(instance
);
6920 megasas_destroy_irqs(instance
);
6922 if (instance
->msix_vectors
)
6923 pci_free_irq_vectors(instance
->pdev
);
6925 pci_save_state(pdev
);
6926 pci_disable_device(pdev
);
6928 pci_set_power_state(pdev
, pci_choose_state(pdev
, state
));
6934 * megasas_resume- driver resume entry point
6935 * @pdev: PCI device structure
6938 megasas_resume(struct pci_dev
*pdev
)
6941 struct Scsi_Host
*host
;
6942 struct megasas_instance
*instance
;
6943 int irq_flags
= PCI_IRQ_LEGACY
;
6945 instance
= pci_get_drvdata(pdev
);
6946 host
= instance
->host
;
6947 pci_set_power_state(pdev
, PCI_D0
);
6948 pci_enable_wake(pdev
, PCI_D0
, 0);
6949 pci_restore_state(pdev
);
6952 * PCI prepping: enable device set bus mastering and dma mask
6954 rval
= pci_enable_device_mem(pdev
);
6957 dev_err(&pdev
->dev
, "Enable device failed\n");
6961 pci_set_master(pdev
);
6964 * We expect the FW state to be READY
6966 if (megasas_transition_to_ready(instance
, 0))
6967 goto fail_ready_state
;
6969 if (megasas_set_dma_mask(instance
))
6970 goto fail_set_dma_mask
;
6973 * Initialize MFI Firmware
6976 atomic_set(&instance
->fw_outstanding
, 0);
6977 atomic_set(&instance
->ldio_outstanding
, 0);
6979 /* Now re-enable MSI-X */
6980 if (instance
->msix_vectors
) {
6981 irq_flags
= PCI_IRQ_MSIX
;
6982 if (smp_affinity_enable
)
6983 irq_flags
|= PCI_IRQ_AFFINITY
;
6985 rval
= pci_alloc_irq_vectors(instance
->pdev
, 1,
6986 instance
->msix_vectors
?
6987 instance
->msix_vectors
: 1, irq_flags
);
6989 goto fail_reenable_msix
;
6991 megasas_setup_reply_map(instance
);
6993 if (instance
->adapter_type
!= MFI_SERIES
) {
6994 megasas_reset_reply_desc(instance
);
6995 if (megasas_ioc_init_fusion(instance
)) {
6996 megasas_free_cmds(instance
);
6997 megasas_free_cmds_fusion(instance
);
7000 if (!megasas_get_map_info(instance
))
7001 megasas_sync_map_info(instance
);
7003 *instance
->producer
= 0;
7004 *instance
->consumer
= 0;
7005 if (megasas_issue_init_mfi(instance
))
7009 if (megasas_get_ctrl_info(instance
) != DCMD_SUCCESS
)
7012 tasklet_init(&instance
->isr_tasklet
, instance
->instancet
->tasklet
,
7013 (unsigned long)instance
);
7015 if (instance
->msix_vectors
?
7016 megasas_setup_irqs_msix(instance
, 0) :
7017 megasas_setup_irqs_ioapic(instance
))
7020 /* Re-launch SR-IOV heartbeat timer */
7021 if (instance
->requestorId
) {
7022 if (!megasas_sriov_start_heartbeat(instance
, 0))
7023 megasas_start_timer(instance
);
7025 instance
->skip_heartbeat_timer_del
= 1;
7030 instance
->instancet
->enable_intr(instance
);
7031 megasas_setup_jbod_map(instance
);
7032 instance
->unload
= 0;
7035 * Initiate AEN (Asynchronous Event Notification)
7037 if (megasas_start_aen(instance
))
7038 dev_err(&instance
->pdev
->dev
, "Start AEN failed\n");
7040 /* Re-launch FW fault watchdog */
7041 if (instance
->adapter_type
!= MFI_SERIES
)
7042 if (megasas_fusion_start_watchdog(instance
) != SUCCESS
)
7043 goto fail_start_watchdog
;
7047 fail_start_watchdog
:
7048 if (instance
->requestorId
&& !instance
->skip_heartbeat_timer_del
)
7049 del_timer_sync(&instance
->sriov_heartbeat_timer
);
7051 megasas_free_ctrl_dma_buffers(instance
);
7052 megasas_free_ctrl_mem(instance
);
7053 scsi_host_put(host
);
7059 pci_disable_device(pdev
);
7064 #define megasas_suspend NULL
7065 #define megasas_resume NULL
7069 megasas_wait_for_adapter_operational(struct megasas_instance
*instance
)
7071 int wait_time
= MEGASAS_RESET_WAIT_TIME
* 2;
7075 for (i
= 0; i
< wait_time
; i
++) {
7076 adp_state
= atomic_read(&instance
->adprecovery
);
7077 if ((adp_state
== MEGASAS_HBA_OPERATIONAL
) ||
7078 (adp_state
== MEGASAS_HW_CRITICAL_ERROR
))
7081 if (!(i
% MEGASAS_RESET_NOTICE_INTERVAL
))
7082 dev_notice(&instance
->pdev
->dev
, "waiting for controller reset to finish\n");
7087 if (adp_state
!= MEGASAS_HBA_OPERATIONAL
) {
7088 dev_info(&instance
->pdev
->dev
,
7089 "%s HBA failed to become operational, adp_state %d\n",
7090 __func__
, adp_state
);
7098 * megasas_detach_one - PCI hot"un"plug entry point
7099 * @pdev: PCI device structure
7101 static void megasas_detach_one(struct pci_dev
*pdev
)
7104 struct Scsi_Host
*host
;
7105 struct megasas_instance
*instance
;
7106 struct fusion_context
*fusion
;
7109 instance
= pci_get_drvdata(pdev
);
7110 host
= instance
->host
;
7111 fusion
= instance
->ctrl_context
;
7113 /* Shutdown SR-IOV heartbeat timer */
7114 if (instance
->requestorId
&& !instance
->skip_heartbeat_timer_del
)
7115 del_timer_sync(&instance
->sriov_heartbeat_timer
);
7117 /* Stop the FW fault detection watchdog */
7118 if (instance
->adapter_type
!= MFI_SERIES
)
7119 megasas_fusion_stop_watchdog(instance
);
7121 if (instance
->fw_crash_state
!= UNAVAILABLE
)
7122 megasas_free_host_crash_buffer(instance
);
7123 scsi_remove_host(instance
->host
);
7124 instance
->unload
= 1;
7126 if (megasas_wait_for_adapter_operational(instance
))
7127 goto skip_firing_dcmds
;
7129 megasas_flush_cache(instance
);
7130 megasas_shutdown_controller(instance
, MR_DCMD_CTRL_SHUTDOWN
);
7133 /* cancel the delayed work if this work still in queue*/
7134 if (instance
->ev
!= NULL
) {
7135 struct megasas_aen_event
*ev
= instance
->ev
;
7136 cancel_delayed_work_sync(&ev
->hotplug_work
);
7137 instance
->ev
= NULL
;
7140 /* cancel all wait events */
7141 wake_up_all(&instance
->int_cmd_wait_q
);
7143 tasklet_kill(&instance
->isr_tasklet
);
7146 * Take the instance off the instance array. Note that we will not
7147 * decrement the max_index. We let this array be sparse array
7149 for (i
= 0; i
< megasas_mgmt_info
.max_index
; i
++) {
7150 if (megasas_mgmt_info
.instance
[i
] == instance
) {
7151 megasas_mgmt_info
.count
--;
7152 megasas_mgmt_info
.instance
[i
] = NULL
;
7158 instance
->instancet
->disable_intr(instance
);
7160 megasas_destroy_irqs(instance
);
7162 if (instance
->msix_vectors
)
7163 pci_free_irq_vectors(instance
->pdev
);
7165 if (instance
->adapter_type
>= VENTURA_SERIES
) {
7166 for (i
= 0; i
< MAX_LOGICAL_DRIVES_EXT
; ++i
)
7167 kfree(fusion
->stream_detect_by_ld
[i
]);
7168 kfree(fusion
->stream_detect_by_ld
);
7169 fusion
->stream_detect_by_ld
= NULL
;
7173 if (instance
->adapter_type
!= MFI_SERIES
) {
7174 megasas_release_fusion(instance
);
7175 pd_seq_map_sz
= sizeof(struct MR_PD_CFG_SEQ_NUM_SYNC
) +
7176 (sizeof(struct MR_PD_CFG_SEQ
) *
7177 (MAX_PHYSICAL_DEVICES
- 1));
7178 for (i
= 0; i
< 2 ; i
++) {
7179 if (fusion
->ld_map
[i
])
7180 dma_free_coherent(&instance
->pdev
->dev
,
7183 fusion
->ld_map_phys
[i
]);
7184 if (fusion
->ld_drv_map
[i
]) {
7185 if (is_vmalloc_addr(fusion
->ld_drv_map
[i
]))
7186 vfree(fusion
->ld_drv_map
[i
]);
7188 free_pages((ulong
)fusion
->ld_drv_map
[i
],
7189 fusion
->drv_map_pages
);
7192 if (fusion
->pd_seq_sync
[i
])
7193 dma_free_coherent(&instance
->pdev
->dev
,
7195 fusion
->pd_seq_sync
[i
],
7196 fusion
->pd_seq_phys
[i
]);
7199 megasas_release_mfi(instance
);
7202 if (instance
->vf_affiliation
)
7203 dma_free_coherent(&pdev
->dev
, (MAX_LOGICAL_DRIVES
+ 1) *
7204 sizeof(struct MR_LD_VF_AFFILIATION
),
7205 instance
->vf_affiliation
,
7206 instance
->vf_affiliation_h
);
7208 if (instance
->vf_affiliation_111
)
7209 dma_free_coherent(&pdev
->dev
,
7210 sizeof(struct MR_LD_VF_AFFILIATION_111
),
7211 instance
->vf_affiliation_111
,
7212 instance
->vf_affiliation_111_h
);
7214 if (instance
->hb_host_mem
)
7215 dma_free_coherent(&pdev
->dev
, sizeof(struct MR_CTRL_HB_HOST_MEM
),
7216 instance
->hb_host_mem
,
7217 instance
->hb_host_mem_h
);
7219 megasas_free_ctrl_dma_buffers(instance
);
7221 megasas_free_ctrl_mem(instance
);
7223 scsi_host_put(host
);
7225 pci_disable_device(pdev
);
7229 * megasas_shutdown - Shutdown entry point
7230 * @device: Generic device structure
7232 static void megasas_shutdown(struct pci_dev
*pdev
)
7234 struct megasas_instance
*instance
= pci_get_drvdata(pdev
);
7236 instance
->unload
= 1;
7238 if (megasas_wait_for_adapter_operational(instance
))
7239 goto skip_firing_dcmds
;
7241 megasas_flush_cache(instance
);
7242 megasas_shutdown_controller(instance
, MR_DCMD_CTRL_SHUTDOWN
);
7245 instance
->instancet
->disable_intr(instance
);
7246 megasas_destroy_irqs(instance
);
7248 if (instance
->msix_vectors
)
7249 pci_free_irq_vectors(instance
->pdev
);
7253 * megasas_mgmt_open - char node "open" entry point
7255 static int megasas_mgmt_open(struct inode
*inode
, struct file
*filep
)
7258 * Allow only those users with admin rights
7260 if (!capable(CAP_SYS_ADMIN
))
7267 * megasas_mgmt_fasync - Async notifier registration from applications
7269 * This function adds the calling process to a driver global queue. When an
7270 * event occurs, SIGIO will be sent to all processes in this queue.
7272 static int megasas_mgmt_fasync(int fd
, struct file
*filep
, int mode
)
7276 mutex_lock(&megasas_async_queue_mutex
);
7278 rc
= fasync_helper(fd
, filep
, mode
, &megasas_async_queue
);
7280 mutex_unlock(&megasas_async_queue_mutex
);
7283 /* For sanity check when we get ioctl */
7284 filep
->private_data
= filep
;
7288 printk(KERN_DEBUG
"megasas: fasync_helper failed [%d]\n", rc
);
7294 * megasas_mgmt_poll - char node "poll" entry point
7296 static __poll_t
megasas_mgmt_poll(struct file
*file
, poll_table
*wait
)
7299 unsigned long flags
;
7301 poll_wait(file
, &megasas_poll_wait
, wait
);
7302 spin_lock_irqsave(&poll_aen_lock
, flags
);
7303 if (megasas_poll_wait_aen
)
7304 mask
= (EPOLLIN
| EPOLLRDNORM
);
7307 megasas_poll_wait_aen
= 0;
7308 spin_unlock_irqrestore(&poll_aen_lock
, flags
);
7313 * megasas_set_crash_dump_params_ioctl:
7314 * Send CRASH_DUMP_MODE DCMD to all controllers
7315 * @cmd: MFI command frame
7318 static int megasas_set_crash_dump_params_ioctl(struct megasas_cmd
*cmd
)
7320 struct megasas_instance
*local_instance
;
7324 crash_support
= cmd
->frame
->dcmd
.mbox
.w
[0];
7326 for (i
= 0; i
< megasas_mgmt_info
.max_index
; i
++) {
7327 local_instance
= megasas_mgmt_info
.instance
[i
];
7328 if (local_instance
&& local_instance
->crash_dump_drv_support
) {
7329 if ((atomic_read(&local_instance
->adprecovery
) ==
7330 MEGASAS_HBA_OPERATIONAL
) &&
7331 !megasas_set_crash_dump_params(local_instance
,
7333 local_instance
->crash_dump_app_support
=
7335 dev_info(&local_instance
->pdev
->dev
,
7336 "Application firmware crash "
7337 "dump mode set success\n");
7340 dev_info(&local_instance
->pdev
->dev
,
7341 "Application firmware crash "
7342 "dump mode set failed\n");
7351 * megasas_mgmt_fw_ioctl - Issues management ioctls to FW
7352 * @instance: Adapter soft state
7353 * @argp: User's ioctl packet
7356 megasas_mgmt_fw_ioctl(struct megasas_instance
*instance
,
7357 struct megasas_iocpacket __user
* user_ioc
,
7358 struct megasas_iocpacket
*ioc
)
7360 struct megasas_sge64
*kern_sge64
= NULL
;
7361 struct megasas_sge32
*kern_sge32
= NULL
;
7362 struct megasas_cmd
*cmd
;
7363 void *kbuff_arr
[MAX_IOCTL_SGE
];
7364 dma_addr_t buf_handle
= 0;
7367 dma_addr_t sense_handle
;
7368 unsigned long *sense_ptr
;
7371 memset(kbuff_arr
, 0, sizeof(kbuff_arr
));
7373 if (ioc
->sge_count
> MAX_IOCTL_SGE
) {
7374 dev_printk(KERN_DEBUG
, &instance
->pdev
->dev
, "SGE count [%d] > max limit [%d]\n",
7375 ioc
->sge_count
, MAX_IOCTL_SGE
);
7379 if ((ioc
->frame
.hdr
.cmd
>= MFI_CMD_OP_COUNT
) ||
7380 ((ioc
->frame
.hdr
.cmd
== MFI_CMD_NVME
) &&
7381 !instance
->support_nvme_passthru
)) {
7382 dev_err(&instance
->pdev
->dev
,
7383 "Received invalid ioctl command 0x%x\n",
7384 ioc
->frame
.hdr
.cmd
);
7388 cmd
= megasas_get_cmd(instance
);
7390 dev_printk(KERN_DEBUG
, &instance
->pdev
->dev
, "Failed to get a cmd packet\n");
7395 * User's IOCTL packet has 2 frames (maximum). Copy those two
7396 * frames into our cmd's frames. cmd->frame's context will get
7397 * overwritten when we copy from user's frames. So set that value
7400 memcpy(cmd
->frame
, ioc
->frame
.raw
, 2 * MEGAMFI_FRAME_SIZE
);
7401 cmd
->frame
->hdr
.context
= cpu_to_le32(cmd
->index
);
7402 cmd
->frame
->hdr
.pad_0
= 0;
7404 cmd
->frame
->hdr
.flags
&= (~MFI_FRAME_IEEE
);
7406 if (instance
->consistent_mask_64bit
)
7407 cmd
->frame
->hdr
.flags
|= cpu_to_le16((MFI_FRAME_SGL64
|
7408 MFI_FRAME_SENSE64
));
7410 cmd
->frame
->hdr
.flags
&= cpu_to_le16(~(MFI_FRAME_SGL64
|
7411 MFI_FRAME_SENSE64
));
7413 if (cmd
->frame
->hdr
.cmd
== MFI_CMD_DCMD
)
7414 opcode
= le32_to_cpu(cmd
->frame
->dcmd
.opcode
);
7416 if (opcode
== MR_DCMD_CTRL_SHUTDOWN
) {
7417 if (megasas_get_ctrl_info(instance
) != DCMD_SUCCESS
) {
7418 megasas_return_cmd(instance
, cmd
);
7423 if (opcode
== MR_DRIVER_SET_APP_CRASHDUMP_MODE
) {
7424 error
= megasas_set_crash_dump_params_ioctl(cmd
);
7425 megasas_return_cmd(instance
, cmd
);
7430 * The management interface between applications and the fw uses
7431 * MFI frames. E.g, RAID configuration changes, LD property changes
7432 * etc are accomplishes through different kinds of MFI frames. The
7433 * driver needs to care only about substituting user buffers with
7434 * kernel buffers in SGLs. The location of SGL is embedded in the
7435 * struct iocpacket itself.
7437 if (instance
->consistent_mask_64bit
)
7438 kern_sge64
= (struct megasas_sge64
*)
7439 ((unsigned long)cmd
->frame
+ ioc
->sgl_off
);
7441 kern_sge32
= (struct megasas_sge32
*)
7442 ((unsigned long)cmd
->frame
+ ioc
->sgl_off
);
7445 * For each user buffer, create a mirror buffer and copy in
7447 for (i
= 0; i
< ioc
->sge_count
; i
++) {
7448 if (!ioc
->sgl
[i
].iov_len
)
7451 kbuff_arr
[i
] = dma_alloc_coherent(&instance
->pdev
->dev
,
7452 ioc
->sgl
[i
].iov_len
,
7453 &buf_handle
, GFP_KERNEL
);
7454 if (!kbuff_arr
[i
]) {
7455 dev_printk(KERN_DEBUG
, &instance
->pdev
->dev
, "Failed to alloc "
7456 "kernel SGL buffer for IOCTL\n");
7462 * We don't change the dma_coherent_mask, so
7463 * dma_alloc_coherent only returns 32bit addresses
7465 if (instance
->consistent_mask_64bit
) {
7466 kern_sge64
[i
].phys_addr
= cpu_to_le64(buf_handle
);
7467 kern_sge64
[i
].length
= cpu_to_le32(ioc
->sgl
[i
].iov_len
);
7469 kern_sge32
[i
].phys_addr
= cpu_to_le32(buf_handle
);
7470 kern_sge32
[i
].length
= cpu_to_le32(ioc
->sgl
[i
].iov_len
);
7474 * We created a kernel buffer corresponding to the
7475 * user buffer. Now copy in from the user buffer
7477 if (copy_from_user(kbuff_arr
[i
], ioc
->sgl
[i
].iov_base
,
7478 (u32
) (ioc
->sgl
[i
].iov_len
))) {
7484 if (ioc
->sense_len
) {
7485 sense
= dma_alloc_coherent(&instance
->pdev
->dev
, ioc
->sense_len
,
7486 &sense_handle
, GFP_KERNEL
);
7493 (unsigned long *) ((unsigned long)cmd
->frame
+ ioc
->sense_off
);
7494 if (instance
->consistent_mask_64bit
)
7495 *sense_ptr
= cpu_to_le64(sense_handle
);
7497 *sense_ptr
= cpu_to_le32(sense_handle
);
7501 * Set the sync_cmd flag so that the ISR knows not to complete this
7502 * cmd to the SCSI mid-layer
7505 if (megasas_issue_blocked_cmd(instance
, cmd
, 0) == DCMD_NOT_FIRED
) {
7507 dev_err(&instance
->pdev
->dev
,
7508 "return -EBUSY from %s %d cmd 0x%x opcode 0x%x cmd->cmd_status_drv 0x%x\n",
7509 __func__
, __LINE__
, cmd
->frame
->hdr
.cmd
, opcode
,
7510 cmd
->cmd_status_drv
);
7516 if (instance
->unload
== 1) {
7517 dev_info(&instance
->pdev
->dev
, "Driver unload is in progress "
7518 "don't submit data to application\n");
7522 * copy out the kernel buffers to user buffers
7524 for (i
= 0; i
< ioc
->sge_count
; i
++) {
7525 if (copy_to_user(ioc
->sgl
[i
].iov_base
, kbuff_arr
[i
],
7526 ioc
->sgl
[i
].iov_len
)) {
7533 * copy out the sense
7535 if (ioc
->sense_len
) {
7537 * sense_ptr points to the location that has the user
7538 * sense buffer address
7540 sense_ptr
= (unsigned long *) ((unsigned long)ioc
->frame
.raw
+
7543 if (copy_to_user((void __user
*)((unsigned long)
7544 get_unaligned((unsigned long *)sense_ptr
)),
7545 sense
, ioc
->sense_len
)) {
7546 dev_err(&instance
->pdev
->dev
, "Failed to copy out to user "
7554 * copy the status codes returned by the fw
7556 if (copy_to_user(&user_ioc
->frame
.hdr
.cmd_status
,
7557 &cmd
->frame
->hdr
.cmd_status
, sizeof(u8
))) {
7558 dev_printk(KERN_DEBUG
, &instance
->pdev
->dev
, "Error copying out cmd_status\n");
7564 dma_free_coherent(&instance
->pdev
->dev
, ioc
->sense_len
,
7565 sense
, sense_handle
);
7568 for (i
= 0; i
< ioc
->sge_count
; i
++) {
7570 if (instance
->consistent_mask_64bit
)
7571 dma_free_coherent(&instance
->pdev
->dev
,
7572 le32_to_cpu(kern_sge64
[i
].length
),
7574 le64_to_cpu(kern_sge64
[i
].phys_addr
));
7576 dma_free_coherent(&instance
->pdev
->dev
,
7577 le32_to_cpu(kern_sge32
[i
].length
),
7579 le32_to_cpu(kern_sge32
[i
].phys_addr
));
7580 kbuff_arr
[i
] = NULL
;
7584 megasas_return_cmd(instance
, cmd
);
7588 static int megasas_mgmt_ioctl_fw(struct file
*file
, unsigned long arg
)
7590 struct megasas_iocpacket __user
*user_ioc
=
7591 (struct megasas_iocpacket __user
*)arg
;
7592 struct megasas_iocpacket
*ioc
;
7593 struct megasas_instance
*instance
;
7596 ioc
= memdup_user(user_ioc
, sizeof(*ioc
));
7598 return PTR_ERR(ioc
);
7600 instance
= megasas_lookup_instance(ioc
->host_no
);
7606 /* Block ioctls in VF mode */
7607 if (instance
->requestorId
&& !allow_vf_ioctls
) {
7612 if (atomic_read(&instance
->adprecovery
) == MEGASAS_HW_CRITICAL_ERROR
) {
7613 dev_err(&instance
->pdev
->dev
, "Controller in crit error\n");
7618 if (instance
->unload
== 1) {
7623 if (down_interruptible(&instance
->ioctl_sem
)) {
7624 error
= -ERESTARTSYS
;
7628 if (megasas_wait_for_adapter_operational(instance
)) {
7633 error
= megasas_mgmt_fw_ioctl(instance
, user_ioc
, ioc
);
7635 up(&instance
->ioctl_sem
);
7642 static int megasas_mgmt_ioctl_aen(struct file
*file
, unsigned long arg
)
7644 struct megasas_instance
*instance
;
7645 struct megasas_aen aen
;
7648 if (file
->private_data
!= file
) {
7649 printk(KERN_DEBUG
"megasas: fasync_helper was not "
7654 if (copy_from_user(&aen
, (void __user
*)arg
, sizeof(aen
)))
7657 instance
= megasas_lookup_instance(aen
.host_no
);
7662 if (atomic_read(&instance
->adprecovery
) == MEGASAS_HW_CRITICAL_ERROR
) {
7666 if (instance
->unload
== 1) {
7670 if (megasas_wait_for_adapter_operational(instance
))
7673 mutex_lock(&instance
->reset_mutex
);
7674 error
= megasas_register_aen(instance
, aen
.seq_num
,
7675 aen
.class_locale_word
);
7676 mutex_unlock(&instance
->reset_mutex
);
7681 * megasas_mgmt_ioctl - char node ioctl entry point
7684 megasas_mgmt_ioctl(struct file
*file
, unsigned int cmd
, unsigned long arg
)
7687 case MEGASAS_IOC_FIRMWARE
:
7688 return megasas_mgmt_ioctl_fw(file
, arg
);
7690 case MEGASAS_IOC_GET_AEN
:
7691 return megasas_mgmt_ioctl_aen(file
, arg
);
7697 #ifdef CONFIG_COMPAT
7698 static int megasas_mgmt_compat_ioctl_fw(struct file
*file
, unsigned long arg
)
7700 struct compat_megasas_iocpacket __user
*cioc
=
7701 (struct compat_megasas_iocpacket __user
*)arg
;
7702 struct megasas_iocpacket __user
*ioc
=
7703 compat_alloc_user_space(sizeof(struct megasas_iocpacket
));
7707 u32 local_sense_off
;
7708 u32 local_sense_len
;
7711 if (clear_user(ioc
, sizeof(*ioc
)))
7714 if (copy_in_user(&ioc
->host_no
, &cioc
->host_no
, sizeof(u16
)) ||
7715 copy_in_user(&ioc
->sgl_off
, &cioc
->sgl_off
, sizeof(u32
)) ||
7716 copy_in_user(&ioc
->sense_off
, &cioc
->sense_off
, sizeof(u32
)) ||
7717 copy_in_user(&ioc
->sense_len
, &cioc
->sense_len
, sizeof(u32
)) ||
7718 copy_in_user(ioc
->frame
.raw
, cioc
->frame
.raw
, 128) ||
7719 copy_in_user(&ioc
->sge_count
, &cioc
->sge_count
, sizeof(u32
)))
7723 * The sense_ptr is used in megasas_mgmt_fw_ioctl only when
7724 * sense_len is not null, so prepare the 64bit value under
7725 * the same condition.
7727 if (get_user(local_sense_off
, &ioc
->sense_off
) ||
7728 get_user(local_sense_len
, &ioc
->sense_len
) ||
7729 get_user(user_sense_off
, &cioc
->sense_off
))
7732 if (local_sense_off
!= user_sense_off
)
7735 if (local_sense_len
) {
7736 void __user
**sense_ioc_ptr
=
7737 (void __user
**)((u8
*)((unsigned long)&ioc
->frame
.raw
) + local_sense_off
);
7738 compat_uptr_t
*sense_cioc_ptr
=
7739 (compat_uptr_t
*)(((unsigned long)&cioc
->frame
.raw
) + user_sense_off
);
7740 if (get_user(ptr
, sense_cioc_ptr
) ||
7741 put_user(compat_ptr(ptr
), sense_ioc_ptr
))
7745 for (i
= 0; i
< MAX_IOCTL_SGE
; i
++) {
7746 if (get_user(ptr
, &cioc
->sgl
[i
].iov_base
) ||
7747 put_user(compat_ptr(ptr
), &ioc
->sgl
[i
].iov_base
) ||
7748 copy_in_user(&ioc
->sgl
[i
].iov_len
,
7749 &cioc
->sgl
[i
].iov_len
, sizeof(compat_size_t
)))
7753 error
= megasas_mgmt_ioctl_fw(file
, (unsigned long)ioc
);
7755 if (copy_in_user(&cioc
->frame
.hdr
.cmd_status
,
7756 &ioc
->frame
.hdr
.cmd_status
, sizeof(u8
))) {
7757 printk(KERN_DEBUG
"megasas: error copy_in_user cmd_status\n");
7764 megasas_mgmt_compat_ioctl(struct file
*file
, unsigned int cmd
,
7768 case MEGASAS_IOC_FIRMWARE32
:
7769 return megasas_mgmt_compat_ioctl_fw(file
, arg
);
7770 case MEGASAS_IOC_GET_AEN
:
7771 return megasas_mgmt_ioctl_aen(file
, arg
);
7779 * File operations structure for management interface
7781 static const struct file_operations megasas_mgmt_fops
= {
7782 .owner
= THIS_MODULE
,
7783 .open
= megasas_mgmt_open
,
7784 .fasync
= megasas_mgmt_fasync
,
7785 .unlocked_ioctl
= megasas_mgmt_ioctl
,
7786 .poll
= megasas_mgmt_poll
,
7787 #ifdef CONFIG_COMPAT
7788 .compat_ioctl
= megasas_mgmt_compat_ioctl
,
7790 .llseek
= noop_llseek
,
7794 * PCI hotplug support registration structure
7796 static struct pci_driver megasas_pci_driver
= {
7798 .name
= "megaraid_sas",
7799 .id_table
= megasas_pci_table
,
7800 .probe
= megasas_probe_one
,
7801 .remove
= megasas_detach_one
,
7802 .suspend
= megasas_suspend
,
7803 .resume
= megasas_resume
,
7804 .shutdown
= megasas_shutdown
,
7808 * Sysfs driver attributes
7810 static ssize_t
version_show(struct device_driver
*dd
, char *buf
)
7812 return snprintf(buf
, strlen(MEGASAS_VERSION
) + 2, "%s\n",
7815 static DRIVER_ATTR_RO(version
);
7817 static ssize_t
release_date_show(struct device_driver
*dd
, char *buf
)
7819 return snprintf(buf
, strlen(MEGASAS_RELDATE
) + 2, "%s\n",
7822 static DRIVER_ATTR_RO(release_date
);
7824 static ssize_t
support_poll_for_event_show(struct device_driver
*dd
, char *buf
)
7826 return sprintf(buf
, "%u\n", support_poll_for_event
);
7828 static DRIVER_ATTR_RO(support_poll_for_event
);
7830 static ssize_t
support_device_change_show(struct device_driver
*dd
, char *buf
)
7832 return sprintf(buf
, "%u\n", support_device_change
);
7834 static DRIVER_ATTR_RO(support_device_change
);
7836 static ssize_t
dbg_lvl_show(struct device_driver
*dd
, char *buf
)
7838 return sprintf(buf
, "%u\n", megasas_dbg_lvl
);
7841 static ssize_t
dbg_lvl_store(struct device_driver
*dd
, const char *buf
,
7846 if (sscanf(buf
, "%u", &megasas_dbg_lvl
) < 1) {
7847 printk(KERN_ERR
"megasas: could not set dbg_lvl\n");
7852 static DRIVER_ATTR_RW(dbg_lvl
);
7855 support_nvme_encapsulation_show(struct device_driver
*dd
, char *buf
)
7857 return sprintf(buf
, "%u\n", support_nvme_encapsulation
);
7860 static DRIVER_ATTR_RO(support_nvme_encapsulation
);
7862 static inline void megasas_remove_scsi_device(struct scsi_device
*sdev
)
7864 sdev_printk(KERN_INFO
, sdev
, "SCSI device is removed\n");
7865 scsi_remove_device(sdev
);
7866 scsi_device_put(sdev
);
7870 megasas_aen_polling(struct work_struct
*work
)
7872 struct megasas_aen_event
*ev
=
7873 container_of(work
, struct megasas_aen_event
, hotplug_work
.work
);
7874 struct megasas_instance
*instance
= ev
->instance
;
7875 union megasas_evt_class_locale class_locale
;
7876 struct Scsi_Host
*host
;
7877 struct scsi_device
*sdev1
;
7880 int i
, j
, doscan
= 0;
7881 u32 seq_num
, wait_time
= MEGASAS_RESET_WAIT_TIME
;
7883 u8 dcmd_ret
= DCMD_SUCCESS
;
7886 printk(KERN_ERR
"invalid instance!\n");
7891 /* Adjust event workqueue thread wait time for VF mode */
7892 if (instance
->requestorId
)
7893 wait_time
= MEGASAS_ROUTINE_WAIT_TIME_VF
;
7895 /* Don't run the event workqueue thread if OCR is running */
7896 mutex_lock(&instance
->reset_mutex
);
7898 instance
->ev
= NULL
;
7899 host
= instance
->host
;
7900 if (instance
->evt_detail
) {
7901 megasas_decode_evt(instance
);
7903 switch (le32_to_cpu(instance
->evt_detail
->code
)) {
7905 case MR_EVT_PD_INSERTED
:
7906 case MR_EVT_PD_REMOVED
:
7907 dcmd_ret
= megasas_get_pd_list(instance
);
7908 if (dcmd_ret
== DCMD_SUCCESS
)
7909 doscan
= SCAN_PD_CHANNEL
;
7912 case MR_EVT_LD_OFFLINE
:
7913 case MR_EVT_CFG_CLEARED
:
7914 case MR_EVT_LD_DELETED
:
7915 case MR_EVT_LD_CREATED
:
7916 if (!instance
->requestorId
||
7917 (instance
->requestorId
&& megasas_get_ld_vf_affiliation(instance
, 0)))
7918 dcmd_ret
= megasas_ld_list_query(instance
, MR_LD_QUERY_TYPE_EXPOSED_TO_HOST
);
7920 if (dcmd_ret
== DCMD_SUCCESS
)
7921 doscan
= SCAN_VD_CHANNEL
;
7925 case MR_EVT_CTRL_HOST_BUS_SCAN_REQUESTED
:
7926 case MR_EVT_FOREIGN_CFG_IMPORTED
:
7927 case MR_EVT_LD_STATE_CHANGE
:
7928 dcmd_ret
= megasas_get_pd_list(instance
);
7930 if (dcmd_ret
!= DCMD_SUCCESS
)
7933 if (!instance
->requestorId
||
7934 (instance
->requestorId
&& megasas_get_ld_vf_affiliation(instance
, 0)))
7935 dcmd_ret
= megasas_ld_list_query(instance
, MR_LD_QUERY_TYPE_EXPOSED_TO_HOST
);
7937 if (dcmd_ret
!= DCMD_SUCCESS
)
7940 doscan
= SCAN_VD_CHANNEL
| SCAN_PD_CHANNEL
;
7941 dev_info(&instance
->pdev
->dev
, "scanning for scsi%d...\n",
7942 instance
->host
->host_no
);
7945 case MR_EVT_CTRL_PROP_CHANGED
:
7946 dcmd_ret
= megasas_get_ctrl_info(instance
);
7947 if (dcmd_ret
== DCMD_SUCCESS
&&
7948 instance
->snapdump_wait_time
) {
7949 megasas_get_snapdump_properties(instance
);
7950 dev_info(&instance
->pdev
->dev
,
7951 "Snap dump wait time\t: %d\n",
7952 instance
->snapdump_wait_time
);
7960 dev_err(&instance
->pdev
->dev
, "invalid evt_detail!\n");
7961 mutex_unlock(&instance
->reset_mutex
);
7966 mutex_unlock(&instance
->reset_mutex
);
7968 if (doscan
& SCAN_PD_CHANNEL
) {
7969 for (i
= 0; i
< MEGASAS_MAX_PD_CHANNELS
; i
++) {
7970 for (j
= 0; j
< MEGASAS_MAX_DEV_PER_CHANNEL
; j
++) {
7971 pd_index
= i
*MEGASAS_MAX_DEV_PER_CHANNEL
+ j
;
7972 sdev1
= scsi_device_lookup(host
, i
, j
, 0);
7973 if (instance
->pd_list
[pd_index
].driveState
==
7974 MR_PD_STATE_SYSTEM
) {
7976 scsi_add_device(host
, i
, j
, 0);
7978 scsi_device_put(sdev1
);
7981 megasas_remove_scsi_device(sdev1
);
7987 if (doscan
& SCAN_VD_CHANNEL
) {
7988 for (i
= 0; i
< MEGASAS_MAX_LD_CHANNELS
; i
++) {
7989 for (j
= 0; j
< MEGASAS_MAX_DEV_PER_CHANNEL
; j
++) {
7990 ld_index
= (i
* MEGASAS_MAX_DEV_PER_CHANNEL
) + j
;
7991 sdev1
= scsi_device_lookup(host
, MEGASAS_MAX_PD_CHANNELS
+ i
, j
, 0);
7992 if (instance
->ld_ids
[ld_index
] != 0xff) {
7994 scsi_add_device(host
, MEGASAS_MAX_PD_CHANNELS
+ i
, j
, 0);
7996 scsi_device_put(sdev1
);
7999 megasas_remove_scsi_device(sdev1
);
8005 if (dcmd_ret
== DCMD_SUCCESS
)
8006 seq_num
= le32_to_cpu(instance
->evt_detail
->seq_num
) + 1;
8008 seq_num
= instance
->last_seq_num
;
8010 /* Register AEN with FW for latest sequence number plus 1 */
8011 class_locale
.members
.reserved
= 0;
8012 class_locale
.members
.locale
= MR_EVT_LOCALE_ALL
;
8013 class_locale
.members
.class = MR_EVT_CLASS_DEBUG
;
8015 if (instance
->aen_cmd
!= NULL
) {
8020 mutex_lock(&instance
->reset_mutex
);
8021 error
= megasas_register_aen(instance
, seq_num
,
8024 dev_err(&instance
->pdev
->dev
,
8025 "register aen failed error %x\n", error
);
8027 mutex_unlock(&instance
->reset_mutex
);
8032 * megasas_init - Driver load entry point
8034 static int __init
megasas_init(void)
8039 * Booted in kdump kernel, minimize memory footprints by
8040 * disabling few features
8042 if (reset_devices
) {
8045 dual_qdepth_disable
= 1;
8049 * Announce driver version and other information
8051 pr_info("megasas: %s\n", MEGASAS_VERSION
);
8053 spin_lock_init(&poll_aen_lock
);
8055 support_poll_for_event
= 2;
8056 support_device_change
= 1;
8057 support_nvme_encapsulation
= true;
8059 memset(&megasas_mgmt_info
, 0, sizeof(megasas_mgmt_info
));
8062 * Register character device node
8064 rval
= register_chrdev(0, "megaraid_sas_ioctl", &megasas_mgmt_fops
);
8067 printk(KERN_DEBUG
"megasas: failed to open device node\n");
8071 megasas_mgmt_majorno
= rval
;
8074 * Register ourselves as PCI hotplug module
8076 rval
= pci_register_driver(&megasas_pci_driver
);
8079 printk(KERN_DEBUG
"megasas: PCI hotplug registration failed \n");
8083 rval
= driver_create_file(&megasas_pci_driver
.driver
,
8084 &driver_attr_version
);
8086 goto err_dcf_attr_ver
;
8088 rval
= driver_create_file(&megasas_pci_driver
.driver
,
8089 &driver_attr_release_date
);
8091 goto err_dcf_rel_date
;
8093 rval
= driver_create_file(&megasas_pci_driver
.driver
,
8094 &driver_attr_support_poll_for_event
);
8096 goto err_dcf_support_poll_for_event
;
8098 rval
= driver_create_file(&megasas_pci_driver
.driver
,
8099 &driver_attr_dbg_lvl
);
8101 goto err_dcf_dbg_lvl
;
8102 rval
= driver_create_file(&megasas_pci_driver
.driver
,
8103 &driver_attr_support_device_change
);
8105 goto err_dcf_support_device_change
;
8107 rval
= driver_create_file(&megasas_pci_driver
.driver
,
8108 &driver_attr_support_nvme_encapsulation
);
8110 goto err_dcf_support_nvme_encapsulation
;
8114 err_dcf_support_nvme_encapsulation
:
8115 driver_remove_file(&megasas_pci_driver
.driver
,
8116 &driver_attr_support_device_change
);
8118 err_dcf_support_device_change
:
8119 driver_remove_file(&megasas_pci_driver
.driver
,
8120 &driver_attr_dbg_lvl
);
8122 driver_remove_file(&megasas_pci_driver
.driver
,
8123 &driver_attr_support_poll_for_event
);
8124 err_dcf_support_poll_for_event
:
8125 driver_remove_file(&megasas_pci_driver
.driver
,
8126 &driver_attr_release_date
);
8128 driver_remove_file(&megasas_pci_driver
.driver
, &driver_attr_version
);
8130 pci_unregister_driver(&megasas_pci_driver
);
8132 unregister_chrdev(megasas_mgmt_majorno
, "megaraid_sas_ioctl");
8137 * megasas_exit - Driver unload entry point
8139 static void __exit
megasas_exit(void)
8141 driver_remove_file(&megasas_pci_driver
.driver
,
8142 &driver_attr_dbg_lvl
);
8143 driver_remove_file(&megasas_pci_driver
.driver
,
8144 &driver_attr_support_poll_for_event
);
8145 driver_remove_file(&megasas_pci_driver
.driver
,
8146 &driver_attr_support_device_change
);
8147 driver_remove_file(&megasas_pci_driver
.driver
,
8148 &driver_attr_release_date
);
8149 driver_remove_file(&megasas_pci_driver
.driver
, &driver_attr_version
);
8150 driver_remove_file(&megasas_pci_driver
.driver
,
8151 &driver_attr_support_nvme_encapsulation
);
8153 pci_unregister_driver(&megasas_pci_driver
);
8154 unregister_chrdev(megasas_mgmt_majorno
, "megaraid_sas_ioctl");
8157 module_init(megasas_init
);
8158 module_exit(megasas_exit
);