aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/megaraid
diff options
context:
space:
mode:
authorSumant Patro <sumantp@lsil.com>2006-10-03 16:09:14 -0400
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>2006-10-04 13:52:15 -0400
commit658dcedb4e35d77f7f6552b5a640d7d82c372053 (patch)
tree9d86c5a80429716111498e6b1f4f948b00fc2c73 /drivers/scsi/megaraid
parentb274cab779219325fd480cc696a456d1c3893bd8 (diff)
[SCSI] megaraid_sas: prints pending cmds before setting hw_crit_error
This patch adds function to print the pending frame details before returning failure from the reset routine. It also exposes a new variable megasas_dbg_lvl that allows the user to set the debug level for logging. Signed-off-by: Sumant Patro <Sumant.Patro@lsil.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/megaraid')
-rw-r--r--drivers/scsi/megaraid/megaraid_sas.c92
-rw-r--r--drivers/scsi/megaraid/megaraid_sas.h2
2 files changed, 94 insertions, 0 deletions
diff --git a/drivers/scsi/megaraid/megaraid_sas.c b/drivers/scsi/megaraid/megaraid_sas.c
index c3b50b37579..0791d62b167 100644
--- a/drivers/scsi/megaraid/megaraid_sas.c
+++ b/drivers/scsi/megaraid/megaraid_sas.c
@@ -71,6 +71,8 @@ static struct megasas_mgmt_info megasas_mgmt_info;
71static struct fasync_struct *megasas_async_queue; 71static struct fasync_struct *megasas_async_queue;
72static DEFINE_MUTEX(megasas_async_queue_mutex); 72static DEFINE_MUTEX(megasas_async_queue_mutex);
73 73
74static u32 megasas_dbg_lvl;
75
74/** 76/**
75 * megasas_get_cmd - Get a command from the free pool 77 * megasas_get_cmd - Get a command from the free pool
76 * @instance: Adapter soft state 78 * @instance: Adapter soft state
@@ -758,6 +760,69 @@ static inline int megasas_is_ldio(struct scsi_cmnd *cmd)
758 } 760 }
759} 761}
760 762
763 /**
764 * megasas_dump_pending_frames - Dumps the frame address of all pending cmds
765 * in FW
766 * @instance: Adapter soft state
767 */
768static inline void
769megasas_dump_pending_frames(struct megasas_instance *instance)
770{
771 struct megasas_cmd *cmd;
772 int i,n;
773 union megasas_sgl *mfi_sgl;
774 struct megasas_io_frame *ldio;
775 struct megasas_pthru_frame *pthru;
776 u32 sgcount;
777 u32 max_cmd = instance->max_fw_cmds;
778
779 printk(KERN_ERR "\nmegasas[%d]: Dumping Frame Phys Address of all pending cmds in FW\n",instance->host->host_no);
780 printk(KERN_ERR "megasas[%d]: Total OS Pending cmds : %d\n",instance->host->host_no,atomic_read(&instance->fw_outstanding));
781 if (IS_DMA64)
782 printk(KERN_ERR "\nmegasas[%d]: 64 bit SGLs were sent to FW\n",instance->host->host_no);
783 else
784 printk(KERN_ERR "\nmegasas[%d]: 32 bit SGLs were sent to FW\n",instance->host->host_no);
785
786 printk(KERN_ERR "megasas[%d]: Pending OS cmds in FW : \n",instance->host->host_no);
787 for (i = 0; i < max_cmd; i++) {
788 cmd = instance->cmd_list[i];
789 if(!cmd->scmd)
790 continue;
791 printk(KERN_ERR "megasas[%d]: Frame addr :0x%08lx : ",instance->host->host_no,(unsigned long)cmd->frame_phys_addr);
792 if (megasas_is_ldio(cmd->scmd)){
793 ldio = (struct megasas_io_frame *)cmd->frame;
794 mfi_sgl = &ldio->sgl;
795 sgcount = ldio->sge_count;
796 printk(KERN_ERR "megasas[%d]: frame count : 0x%x, Cmd : 0x%x, Tgt id : 0x%x, lba lo : 0x%x, lba_hi : 0x%x, sense_buf addr : 0x%x,sge count : 0x%x\n",instance->host->host_no, cmd->frame_count,ldio->cmd,ldio->target_id, ldio->start_lba_lo,ldio->start_lba_hi,ldio->sense_buf_phys_addr_lo,sgcount);
797 }
798 else {
799 pthru = (struct megasas_pthru_frame *) cmd->frame;
800 mfi_sgl = &pthru->sgl;
801 sgcount = pthru->sge_count;
802 printk(KERN_ERR "megasas[%d]: frame count : 0x%x, Cmd : 0x%x, Tgt id : 0x%x, lun : 0x%x, cdb_len : 0x%x, data xfer len : 0x%x, sense_buf addr : 0x%x,sge count : 0x%x\n",instance->host->host_no,cmd->frame_count,pthru->cmd,pthru->target_id,pthru->lun,pthru->cdb_len , pthru->data_xfer_len,pthru->sense_buf_phys_addr_lo,sgcount);
803 }
804 if(megasas_dbg_lvl & MEGASAS_DBG_LVL){
805 for (n = 0; n < sgcount; n++){
806 if (IS_DMA64)
807 printk(KERN_ERR "megasas: sgl len : 0x%x, sgl addr : 0x%08lx ",mfi_sgl->sge64[n].length , (unsigned long)mfi_sgl->sge64[n].phys_addr) ;
808 else
809 printk(KERN_ERR "megasas: sgl len : 0x%x, sgl addr : 0x%x ",mfi_sgl->sge32[n].length , mfi_sgl->sge32[n].phys_addr) ;
810 }
811 }
812 printk(KERN_ERR "\n");
813 } /*for max_cmd*/
814 printk(KERN_ERR "\nmegasas[%d]: Pending Internal cmds in FW : \n",instance->host->host_no);
815 for (i = 0; i < max_cmd; i++) {
816
817 cmd = instance->cmd_list[i];
818
819 if(cmd->sync_cmd == 1){
820 printk(KERN_ERR "0x%08lx : ", (unsigned long)cmd->frame_phys_addr);
821 }
822 }
823 printk(KERN_ERR "megasas[%d]: Dumping Done.\n\n",instance->host->host_no);
824}
825
761/** 826/**
762 * megasas_queue_command - Queue entry point 827 * megasas_queue_command - Queue entry point
763 * @scmd: SCSI command to be queued 828 * @scmd: SCSI command to be queued
@@ -869,6 +934,7 @@ static int megasas_wait_for_outstanding(struct megasas_instance *instance)
869 */ 934 */
870 writel(MFI_STOP_ADP, 935 writel(MFI_STOP_ADP,
871 &instance->reg_set->inbound_doorbell); 936 &instance->reg_set->inbound_doorbell);
937 megasas_dump_pending_frames(instance);
872 instance->hw_crit_error = 1; 938 instance->hw_crit_error = 1;
873 return FAILED; 939 return FAILED;
874 } 940 }
@@ -2236,6 +2302,8 @@ megasas_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
2236 instance->unique_id = pdev->bus->number << 8 | pdev->devfn; 2302 instance->unique_id = pdev->bus->number << 8 | pdev->devfn;
2237 instance->init_id = MEGASAS_DEFAULT_INIT_ID; 2303 instance->init_id = MEGASAS_DEFAULT_INIT_ID;
2238 2304
2305 megasas_dbg_lvl = 0;
2306
2239 /* 2307 /*
2240 * Initialize MFI Firmware 2308 * Initialize MFI Firmware
2241 */ 2309 */
@@ -2862,6 +2930,26 @@ megasas_sysfs_show_release_date(struct device_driver *dd, char *buf)
2862static DRIVER_ATTR(release_date, S_IRUGO, megasas_sysfs_show_release_date, 2930static DRIVER_ATTR(release_date, S_IRUGO, megasas_sysfs_show_release_date,
2863 NULL); 2931 NULL);
2864 2932
2933static ssize_t
2934megasas_sysfs_show_dbg_lvl(struct device_driver *dd, char *buf)
2935{
2936 return sprintf(buf,"%u",megasas_dbg_lvl);
2937}
2938
2939static ssize_t
2940megasas_sysfs_set_dbg_lvl(struct device_driver *dd, const char *buf, size_t count)
2941{
2942 int retval = count;
2943 if(sscanf(buf,"%u",&megasas_dbg_lvl)<1){
2944 printk(KERN_ERR "megasas: could not set dbg_lvl\n");
2945 retval = -EINVAL;
2946 }
2947 return retval;
2948}
2949
2950static DRIVER_ATTR(dbg_lvl, S_IRUGO|S_IWUGO, megasas_sysfs_show_dbg_lvl,
2951 megasas_sysfs_set_dbg_lvl);
2952
2865/** 2953/**
2866 * megasas_init - Driver load entry point 2954 * megasas_init - Driver load entry point
2867 */ 2955 */
@@ -2902,6 +2990,8 @@ static int __init megasas_init(void)
2902 driver_create_file(&megasas_pci_driver.driver, &driver_attr_version); 2990 driver_create_file(&megasas_pci_driver.driver, &driver_attr_version);
2903 driver_create_file(&megasas_pci_driver.driver, 2991 driver_create_file(&megasas_pci_driver.driver,
2904 &driver_attr_release_date); 2992 &driver_attr_release_date);
2993 driver_create_file(&megasas_pci_driver.driver,
2994 &driver_attr_dbg_lvl);
2905 2995
2906 return rval; 2996 return rval;
2907} 2997}
@@ -2914,6 +3004,8 @@ static void __exit megasas_exit(void)
2914 driver_remove_file(&megasas_pci_driver.driver, &driver_attr_version); 3004 driver_remove_file(&megasas_pci_driver.driver, &driver_attr_version);
2915 driver_remove_file(&megasas_pci_driver.driver, 3005 driver_remove_file(&megasas_pci_driver.driver,
2916 &driver_attr_release_date); 3006 &driver_attr_release_date);
3007 driver_remove_file(&megasas_pci_driver.driver,
3008 &driver_attr_dbg_lvl);
2917 3009
2918 pci_unregister_driver(&megasas_pci_driver); 3010 pci_unregister_driver(&megasas_pci_driver);
2919 unregister_chrdev(megasas_mgmt_majorno, "megaraid_sas_ioctl"); 3011 unregister_chrdev(megasas_mgmt_majorno, "megaraid_sas_ioctl");
diff --git a/drivers/scsi/megaraid/megaraid_sas.h b/drivers/scsi/megaraid/megaraid_sas.h
index 74feffe2fff..ad7ef744406 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -537,6 +537,8 @@ struct megasas_ctrl_info {
537#define MEGASAS_MAX_LUN 8 537#define MEGASAS_MAX_LUN 8
538#define MEGASAS_MAX_LD 64 538#define MEGASAS_MAX_LD 64
539 539
540#define MEGASAS_DBG_LVL 1
541
540/* 542/*
541 * When SCSI mid-layer calls driver's reset routine, driver waits for 543 * When SCSI mid-layer calls driver's reset routine, driver waits for
542 * MEGASAS_RESET_WAIT_TIME seconds for all outstanding IO to complete. Note 544 * MEGASAS_RESET_WAIT_TIME seconds for all outstanding IO to complete. Note