18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * Linux MegaRAID driver for SAS based RAID controllers 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Copyright (c) 2003-2018 LSI Corporation. 58c2ecf20Sopenharmony_ci * Copyright (c) 2003-2018 Avago Technologies. 68c2ecf20Sopenharmony_ci * Copyright (c) 2003-2018 Broadcom Inc. 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci * This program is free software; you can redistribute it and/or 98c2ecf20Sopenharmony_ci * modify it under the terms of the GNU General Public License 108c2ecf20Sopenharmony_ci * as published by the Free Software Foundation; either version 2 118c2ecf20Sopenharmony_ci * of the License, or (at your option) any later version. 128c2ecf20Sopenharmony_ci * 138c2ecf20Sopenharmony_ci * This program is distributed in the hope that it will be useful, 148c2ecf20Sopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 158c2ecf20Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 168c2ecf20Sopenharmony_ci * GNU General Public License for more details. 178c2ecf20Sopenharmony_ci * 188c2ecf20Sopenharmony_ci * You should have received a copy of the GNU General Public License 198c2ecf20Sopenharmony_ci * along with this program. If not, see <http://www.gnu.org/licenses/>. 208c2ecf20Sopenharmony_ci * 218c2ecf20Sopenharmony_ci * Authors: Broadcom Inc. 228c2ecf20Sopenharmony_ci * Kashyap Desai <kashyap.desai@broadcom.com> 238c2ecf20Sopenharmony_ci * Sumit Saxena <sumit.saxena@broadcom.com> 248c2ecf20Sopenharmony_ci * Shivasharan S <shivasharan.srikanteshwara@broadcom.com> 258c2ecf20Sopenharmony_ci * 268c2ecf20Sopenharmony_ci * Send feedback to: megaraidlinux.pdl@broadcom.com 278c2ecf20Sopenharmony_ci */ 288c2ecf20Sopenharmony_ci#include <linux/kernel.h> 298c2ecf20Sopenharmony_ci#include <linux/types.h> 308c2ecf20Sopenharmony_ci#include <linux/pci.h> 318c2ecf20Sopenharmony_ci#include <linux/interrupt.h> 328c2ecf20Sopenharmony_ci#include <linux/compat.h> 338c2ecf20Sopenharmony_ci#include <linux/irq_poll.h> 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci#include <scsi/scsi.h> 368c2ecf20Sopenharmony_ci#include <scsi/scsi_device.h> 378c2ecf20Sopenharmony_ci#include <scsi/scsi_host.h> 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci#include "megaraid_sas_fusion.h" 408c2ecf20Sopenharmony_ci#include "megaraid_sas.h" 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci#ifdef CONFIG_DEBUG_FS 438c2ecf20Sopenharmony_ci#include <linux/debugfs.h> 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_cistruct dentry *megasas_debugfs_root; 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_cistatic ssize_t 488c2ecf20Sopenharmony_cimegasas_debugfs_read(struct file *filp, char __user *ubuf, size_t cnt, 498c2ecf20Sopenharmony_ci loff_t *ppos) 508c2ecf20Sopenharmony_ci{ 518c2ecf20Sopenharmony_ci struct megasas_debugfs_buffer *debug = filp->private_data; 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci if (!debug || !debug->buf) 548c2ecf20Sopenharmony_ci return 0; 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci return simple_read_from_buffer(ubuf, cnt, ppos, debug->buf, debug->len); 578c2ecf20Sopenharmony_ci} 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_cistatic int 608c2ecf20Sopenharmony_cimegasas_debugfs_raidmap_open(struct inode *inode, struct file *file) 618c2ecf20Sopenharmony_ci{ 628c2ecf20Sopenharmony_ci struct megasas_instance *instance = inode->i_private; 638c2ecf20Sopenharmony_ci struct megasas_debugfs_buffer *debug; 648c2ecf20Sopenharmony_ci struct fusion_context *fusion; 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ci fusion = instance->ctrl_context; 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci debug = kzalloc(sizeof(struct megasas_debugfs_buffer), GFP_KERNEL); 698c2ecf20Sopenharmony_ci if (!debug) 708c2ecf20Sopenharmony_ci return -ENOMEM; 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci debug->buf = (void *)fusion->ld_drv_map[(instance->map_id & 1)]; 738c2ecf20Sopenharmony_ci debug->len = fusion->drv_map_sz; 748c2ecf20Sopenharmony_ci file->private_data = debug; 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci return 0; 778c2ecf20Sopenharmony_ci} 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_cistatic int 808c2ecf20Sopenharmony_cimegasas_debugfs_release(struct inode *inode, struct file *file) 818c2ecf20Sopenharmony_ci{ 828c2ecf20Sopenharmony_ci struct megasas_debug_buffer *debug = file->private_data; 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci if (!debug) 858c2ecf20Sopenharmony_ci return 0; 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ci file->private_data = NULL; 888c2ecf20Sopenharmony_ci kfree(debug); 898c2ecf20Sopenharmony_ci return 0; 908c2ecf20Sopenharmony_ci} 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_cistatic const struct file_operations megasas_debugfs_raidmap_fops = { 938c2ecf20Sopenharmony_ci .owner = THIS_MODULE, 948c2ecf20Sopenharmony_ci .open = megasas_debugfs_raidmap_open, 958c2ecf20Sopenharmony_ci .read = megasas_debugfs_read, 968c2ecf20Sopenharmony_ci .release = megasas_debugfs_release, 978c2ecf20Sopenharmony_ci}; 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci/* 1008c2ecf20Sopenharmony_ci * megasas_init_debugfs : Create debugfs root for megaraid_sas driver 1018c2ecf20Sopenharmony_ci */ 1028c2ecf20Sopenharmony_civoid megasas_init_debugfs(void) 1038c2ecf20Sopenharmony_ci{ 1048c2ecf20Sopenharmony_ci megasas_debugfs_root = debugfs_create_dir("megaraid_sas", NULL); 1058c2ecf20Sopenharmony_ci if (!megasas_debugfs_root) 1068c2ecf20Sopenharmony_ci pr_info("Cannot create debugfs root\n"); 1078c2ecf20Sopenharmony_ci} 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_ci/* 1108c2ecf20Sopenharmony_ci * megasas_exit_debugfs : Remove debugfs root for megaraid_sas driver 1118c2ecf20Sopenharmony_ci */ 1128c2ecf20Sopenharmony_civoid megasas_exit_debugfs(void) 1138c2ecf20Sopenharmony_ci{ 1148c2ecf20Sopenharmony_ci debugfs_remove_recursive(megasas_debugfs_root); 1158c2ecf20Sopenharmony_ci} 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_ci/* 1188c2ecf20Sopenharmony_ci * megasas_setup_debugfs : Setup debugfs per Fusion adapter 1198c2ecf20Sopenharmony_ci * instance: Soft instance of adapter 1208c2ecf20Sopenharmony_ci */ 1218c2ecf20Sopenharmony_civoid 1228c2ecf20Sopenharmony_cimegasas_setup_debugfs(struct megasas_instance *instance) 1238c2ecf20Sopenharmony_ci{ 1248c2ecf20Sopenharmony_ci char name[64]; 1258c2ecf20Sopenharmony_ci struct fusion_context *fusion; 1268c2ecf20Sopenharmony_ci 1278c2ecf20Sopenharmony_ci fusion = instance->ctrl_context; 1288c2ecf20Sopenharmony_ci 1298c2ecf20Sopenharmony_ci if (fusion) { 1308c2ecf20Sopenharmony_ci snprintf(name, sizeof(name), 1318c2ecf20Sopenharmony_ci "scsi_host%d", instance->host->host_no); 1328c2ecf20Sopenharmony_ci if (!instance->debugfs_root) { 1338c2ecf20Sopenharmony_ci instance->debugfs_root = 1348c2ecf20Sopenharmony_ci debugfs_create_dir(name, megasas_debugfs_root); 1358c2ecf20Sopenharmony_ci if (!instance->debugfs_root) { 1368c2ecf20Sopenharmony_ci dev_err(&instance->pdev->dev, 1378c2ecf20Sopenharmony_ci "Cannot create per adapter debugfs directory\n"); 1388c2ecf20Sopenharmony_ci return; 1398c2ecf20Sopenharmony_ci } 1408c2ecf20Sopenharmony_ci } 1418c2ecf20Sopenharmony_ci 1428c2ecf20Sopenharmony_ci snprintf(name, sizeof(name), "raidmap_dump"); 1438c2ecf20Sopenharmony_ci instance->raidmap_dump = 1448c2ecf20Sopenharmony_ci debugfs_create_file(name, S_IRUGO, 1458c2ecf20Sopenharmony_ci instance->debugfs_root, instance, 1468c2ecf20Sopenharmony_ci &megasas_debugfs_raidmap_fops); 1478c2ecf20Sopenharmony_ci if (!instance->raidmap_dump) { 1488c2ecf20Sopenharmony_ci dev_err(&instance->pdev->dev, 1498c2ecf20Sopenharmony_ci "Cannot create raidmap debugfs file\n"); 1508c2ecf20Sopenharmony_ci debugfs_remove(instance->debugfs_root); 1518c2ecf20Sopenharmony_ci return; 1528c2ecf20Sopenharmony_ci } 1538c2ecf20Sopenharmony_ci } 1548c2ecf20Sopenharmony_ci 1558c2ecf20Sopenharmony_ci} 1568c2ecf20Sopenharmony_ci 1578c2ecf20Sopenharmony_ci/* 1588c2ecf20Sopenharmony_ci * megasas_destroy_debugfs : Destroy debugfs per Fusion adapter 1598c2ecf20Sopenharmony_ci * instance: Soft instance of adapter 1608c2ecf20Sopenharmony_ci */ 1618c2ecf20Sopenharmony_civoid megasas_destroy_debugfs(struct megasas_instance *instance) 1628c2ecf20Sopenharmony_ci{ 1638c2ecf20Sopenharmony_ci debugfs_remove_recursive(instance->debugfs_root); 1648c2ecf20Sopenharmony_ci} 1658c2ecf20Sopenharmony_ci 1668c2ecf20Sopenharmony_ci#else 1678c2ecf20Sopenharmony_civoid megasas_init_debugfs(void) 1688c2ecf20Sopenharmony_ci{ 1698c2ecf20Sopenharmony_ci} 1708c2ecf20Sopenharmony_civoid megasas_exit_debugfs(void) 1718c2ecf20Sopenharmony_ci{ 1728c2ecf20Sopenharmony_ci} 1738c2ecf20Sopenharmony_civoid megasas_setup_debugfs(struct megasas_instance *instance) 1748c2ecf20Sopenharmony_ci{ 1758c2ecf20Sopenharmony_ci} 1768c2ecf20Sopenharmony_civoid megasas_destroy_debugfs(struct megasas_instance *instance) 1778c2ecf20Sopenharmony_ci{ 1788c2ecf20Sopenharmony_ci} 1798c2ecf20Sopenharmony_ci#endif /*CONFIG_DEBUG_FS*/ 180