162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Linux MegaRAID driver for SAS based RAID controllers 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (c) 2003-2018 LSI Corporation. 562306a36Sopenharmony_ci * Copyright (c) 2003-2018 Avago Technologies. 662306a36Sopenharmony_ci * Copyright (c) 2003-2018 Broadcom Inc. 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * This program is free software; you can redistribute it and/or 962306a36Sopenharmony_ci * modify it under the terms of the GNU General Public License 1062306a36Sopenharmony_ci * as published by the Free Software Foundation; either version 2 1162306a36Sopenharmony_ci * of the License, or (at your option) any later version. 1262306a36Sopenharmony_ci * 1362306a36Sopenharmony_ci * This program is distributed in the hope that it will be useful, 1462306a36Sopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 1562306a36Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1662306a36Sopenharmony_ci * GNU General Public License for more details. 1762306a36Sopenharmony_ci * 1862306a36Sopenharmony_ci * You should have received a copy of the GNU General Public License 1962306a36Sopenharmony_ci * along with this program. If not, see <http://www.gnu.org/licenses/>. 2062306a36Sopenharmony_ci * 2162306a36Sopenharmony_ci * Authors: Broadcom Inc. 2262306a36Sopenharmony_ci * Kashyap Desai <kashyap.desai@broadcom.com> 2362306a36Sopenharmony_ci * Sumit Saxena <sumit.saxena@broadcom.com> 2462306a36Sopenharmony_ci * Shivasharan S <shivasharan.srikanteshwara@broadcom.com> 2562306a36Sopenharmony_ci * 2662306a36Sopenharmony_ci * Send feedback to: megaraidlinux.pdl@broadcom.com 2762306a36Sopenharmony_ci */ 2862306a36Sopenharmony_ci#include <linux/kernel.h> 2962306a36Sopenharmony_ci#include <linux/types.h> 3062306a36Sopenharmony_ci#include <linux/pci.h> 3162306a36Sopenharmony_ci#include <linux/interrupt.h> 3262306a36Sopenharmony_ci#include <linux/compat.h> 3362306a36Sopenharmony_ci#include <linux/irq_poll.h> 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci#include <scsi/scsi.h> 3662306a36Sopenharmony_ci#include <scsi/scsi_device.h> 3762306a36Sopenharmony_ci#include <scsi/scsi_host.h> 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci#include "megaraid_sas_fusion.h" 4062306a36Sopenharmony_ci#include "megaraid_sas.h" 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci#ifdef CONFIG_DEBUG_FS 4362306a36Sopenharmony_ci#include <linux/debugfs.h> 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cistruct dentry *megasas_debugfs_root; 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_cistatic ssize_t 4862306a36Sopenharmony_cimegasas_debugfs_read(struct file *filp, char __user *ubuf, size_t cnt, 4962306a36Sopenharmony_ci loff_t *ppos) 5062306a36Sopenharmony_ci{ 5162306a36Sopenharmony_ci struct megasas_debugfs_buffer *debug = filp->private_data; 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci if (!debug || !debug->buf) 5462306a36Sopenharmony_ci return 0; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci return simple_read_from_buffer(ubuf, cnt, ppos, debug->buf, debug->len); 5762306a36Sopenharmony_ci} 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_cistatic int 6062306a36Sopenharmony_cimegasas_debugfs_raidmap_open(struct inode *inode, struct file *file) 6162306a36Sopenharmony_ci{ 6262306a36Sopenharmony_ci struct megasas_instance *instance = inode->i_private; 6362306a36Sopenharmony_ci struct megasas_debugfs_buffer *debug; 6462306a36Sopenharmony_ci struct fusion_context *fusion; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci fusion = instance->ctrl_context; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci debug = kzalloc(sizeof(struct megasas_debugfs_buffer), GFP_KERNEL); 6962306a36Sopenharmony_ci if (!debug) 7062306a36Sopenharmony_ci return -ENOMEM; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci debug->buf = (void *)fusion->ld_drv_map[(instance->map_id & 1)]; 7362306a36Sopenharmony_ci debug->len = fusion->drv_map_sz; 7462306a36Sopenharmony_ci file->private_data = debug; 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci return 0; 7762306a36Sopenharmony_ci} 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_cistatic int 8062306a36Sopenharmony_cimegasas_debugfs_release(struct inode *inode, struct file *file) 8162306a36Sopenharmony_ci{ 8262306a36Sopenharmony_ci struct megasas_debug_buffer *debug = file->private_data; 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci if (!debug) 8562306a36Sopenharmony_ci return 0; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci file->private_data = NULL; 8862306a36Sopenharmony_ci kfree(debug); 8962306a36Sopenharmony_ci return 0; 9062306a36Sopenharmony_ci} 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_cistatic const struct file_operations megasas_debugfs_raidmap_fops = { 9362306a36Sopenharmony_ci .owner = THIS_MODULE, 9462306a36Sopenharmony_ci .open = megasas_debugfs_raidmap_open, 9562306a36Sopenharmony_ci .read = megasas_debugfs_read, 9662306a36Sopenharmony_ci .release = megasas_debugfs_release, 9762306a36Sopenharmony_ci}; 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci/* 10062306a36Sopenharmony_ci * megasas_init_debugfs : Create debugfs root for megaraid_sas driver 10162306a36Sopenharmony_ci */ 10262306a36Sopenharmony_civoid megasas_init_debugfs(void) 10362306a36Sopenharmony_ci{ 10462306a36Sopenharmony_ci megasas_debugfs_root = debugfs_create_dir("megaraid_sas", NULL); 10562306a36Sopenharmony_ci if (!megasas_debugfs_root) 10662306a36Sopenharmony_ci pr_info("Cannot create debugfs root\n"); 10762306a36Sopenharmony_ci} 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci/* 11062306a36Sopenharmony_ci * megasas_exit_debugfs : Remove debugfs root for megaraid_sas driver 11162306a36Sopenharmony_ci */ 11262306a36Sopenharmony_civoid megasas_exit_debugfs(void) 11362306a36Sopenharmony_ci{ 11462306a36Sopenharmony_ci debugfs_remove_recursive(megasas_debugfs_root); 11562306a36Sopenharmony_ci} 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci/* 11862306a36Sopenharmony_ci * megasas_setup_debugfs : Setup debugfs per Fusion adapter 11962306a36Sopenharmony_ci * instance: Soft instance of adapter 12062306a36Sopenharmony_ci */ 12162306a36Sopenharmony_civoid 12262306a36Sopenharmony_cimegasas_setup_debugfs(struct megasas_instance *instance) 12362306a36Sopenharmony_ci{ 12462306a36Sopenharmony_ci char name[64]; 12562306a36Sopenharmony_ci struct fusion_context *fusion; 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci fusion = instance->ctrl_context; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci if (fusion) { 13062306a36Sopenharmony_ci snprintf(name, sizeof(name), 13162306a36Sopenharmony_ci "scsi_host%d", instance->host->host_no); 13262306a36Sopenharmony_ci if (!instance->debugfs_root) { 13362306a36Sopenharmony_ci instance->debugfs_root = 13462306a36Sopenharmony_ci debugfs_create_dir(name, megasas_debugfs_root); 13562306a36Sopenharmony_ci if (!instance->debugfs_root) { 13662306a36Sopenharmony_ci dev_err(&instance->pdev->dev, 13762306a36Sopenharmony_ci "Cannot create per adapter debugfs directory\n"); 13862306a36Sopenharmony_ci return; 13962306a36Sopenharmony_ci } 14062306a36Sopenharmony_ci } 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci snprintf(name, sizeof(name), "raidmap_dump"); 14362306a36Sopenharmony_ci instance->raidmap_dump = 14462306a36Sopenharmony_ci debugfs_create_file(name, S_IRUGO, 14562306a36Sopenharmony_ci instance->debugfs_root, instance, 14662306a36Sopenharmony_ci &megasas_debugfs_raidmap_fops); 14762306a36Sopenharmony_ci if (!instance->raidmap_dump) { 14862306a36Sopenharmony_ci dev_err(&instance->pdev->dev, 14962306a36Sopenharmony_ci "Cannot create raidmap debugfs file\n"); 15062306a36Sopenharmony_ci debugfs_remove(instance->debugfs_root); 15162306a36Sopenharmony_ci return; 15262306a36Sopenharmony_ci } 15362306a36Sopenharmony_ci } 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci} 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ci/* 15862306a36Sopenharmony_ci * megasas_destroy_debugfs : Destroy debugfs per Fusion adapter 15962306a36Sopenharmony_ci * instance: Soft instance of adapter 16062306a36Sopenharmony_ci */ 16162306a36Sopenharmony_civoid megasas_destroy_debugfs(struct megasas_instance *instance) 16262306a36Sopenharmony_ci{ 16362306a36Sopenharmony_ci debugfs_remove_recursive(instance->debugfs_root); 16462306a36Sopenharmony_ci} 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci#else 16762306a36Sopenharmony_civoid megasas_init_debugfs(void) 16862306a36Sopenharmony_ci{ 16962306a36Sopenharmony_ci} 17062306a36Sopenharmony_civoid megasas_exit_debugfs(void) 17162306a36Sopenharmony_ci{ 17262306a36Sopenharmony_ci} 17362306a36Sopenharmony_civoid megasas_setup_debugfs(struct megasas_instance *instance) 17462306a36Sopenharmony_ci{ 17562306a36Sopenharmony_ci} 17662306a36Sopenharmony_civoid megasas_destroy_debugfs(struct megasas_instance *instance) 17762306a36Sopenharmony_ci{ 17862306a36Sopenharmony_ci} 17962306a36Sopenharmony_ci#endif /*CONFIG_DEBUG_FS*/ 180