📄 rhel3-ga.patch
字号:
+static struct megasas_instance *megasas_lookup_instance(u16 host_no)+{+ int i;++ for (i = 0; i < megasas_mgmt_info.max_index; i++) {++ if ((megasas_mgmt_info.instance[i]) &&+ (megasas_mgmt_info.instance[i]->host->host_no == host_no))+ return megasas_mgmt_info.instance[i];+ }++ return NULL;+}+ static int megasas_mgmt_ioctl_fw(struct file *file, unsigned long arg) { struct megasas_iocpacket __user *user_ioc =@@ -3252,12 +3422,6 @@ static int megasas_mgmt_ioctl_aen(struct struct megasas_aen aen; int error; - if (file->private_data != file) {- printk(KERN_DEBUG "megasas: fasync_helper was not "- "called first\n");- return -EINVAL;- }- if (copy_from_user(&aen, (void __user *)arg, sizeof(aen))) return -EFAULT; @@ -3277,12 +3441,12 @@ static int megasas_mgmt_ioctl_aen(struct * megasas_mgmt_ioctl - char node ioctl entry point */ static long-megasas_mgmt_ioctl(struct file *file, unsigned int cmd, unsigned long arg)+megasas_mgmt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,+ unsigned long arg) { switch (cmd) { case MEGASAS_IOC_FIRMWARE: return megasas_mgmt_ioctl_fw(file, arg);- case MEGASAS_IOC_GET_AEN: return megasas_mgmt_ioctl_aen(file, arg); }@@ -3290,7 +3454,7 @@ megasas_mgmt_ioctl(struct file *file, un return -ENOTTY; } -#ifdef CONFIG_COMPAT+#ifdef __x86_64__ static int megasas_mgmt_compat_ioctl_fw(struct file *file, unsigned long arg) { struct compat_megasas_iocpacket __user *cioc =@@ -3349,72 +3513,14 @@ megasas_mgmt_compat_ioctl(struct file *f /* * File operations structure for management interface */-static const struct file_operations megasas_mgmt_fops = {+static struct file_operations megasas_mgmt_fops = { .owner = THIS_MODULE, .open = megasas_mgmt_open, .release = megasas_mgmt_release, .fasync = megasas_mgmt_fasync,- .unlocked_ioctl = megasas_mgmt_ioctl,-#ifdef CONFIG_COMPAT- .compat_ioctl = megasas_mgmt_compat_ioctl,-#endif-};--/*- * PCI hotplug support registration structure- */-static struct pci_driver megasas_pci_driver = {-- .name = "megaraid_sas",- .id_table = megasas_pci_table,- .probe = megasas_probe_one,- .remove = __devexit_p(megasas_detach_one),- .suspend = megasas_suspend,- .resume = megasas_resume,- .shutdown = megasas_shutdown,+ .ioctl = megasas_mgmt_ioctl, }; -/*- * Sysfs driver attributes- */-static ssize_t megasas_sysfs_show_version(struct device_driver *dd, char *buf)-{- return snprintf(buf, strlen(MEGASAS_VERSION) + 2, "%s\n",- MEGASAS_VERSION);-}--static DRIVER_ATTR(version, S_IRUGO, megasas_sysfs_show_version, NULL);--static ssize_t-megasas_sysfs_show_release_date(struct device_driver *dd, char *buf)-{- return snprintf(buf, strlen(MEGASAS_RELDATE) + 2, "%s\n",- MEGASAS_RELDATE);-}--static DRIVER_ATTR(release_date, S_IRUGO, megasas_sysfs_show_release_date,- NULL);--static ssize_t-megasas_sysfs_show_dbg_lvl(struct device_driver *dd, char *buf)-{- return sprintf(buf,"%u",megasas_dbg_lvl);-}--static ssize_t-megasas_sysfs_set_dbg_lvl(struct device_driver *dd, const char *buf, size_t count)-{- int retval = count;- if(sscanf(buf,"%u",&megasas_dbg_lvl)<1){- printk(KERN_ERR "megasas: could not set dbg_lvl\n");- retval = -EINVAL;- }- return retval;-}--static DRIVER_ATTR(dbg_lvl, S_IRUGO|S_IWUGO, megasas_sysfs_show_dbg_lvl,- megasas_sysfs_set_dbg_lvl);- /** * megasas_init - Driver load entry point */@@ -3442,40 +3548,41 @@ static int __init megasas_init(void) megasas_mgmt_majorno = rval; - /*- * Register ourselves as PCI hotplug module- */- rval = pci_register_driver(&megasas_pci_driver);+#ifdef CONFIG_PROC_FS+ megasas_proc_root = proc_mkdir("megaraid_sas", proc_scsi);+ if (megasas_proc_root) {+ megasas_proc_version = create_proc_read_entry("version",+ S_IRUSR | S_IFREG,+ megasas_proc_root,+ megasas_proc_show_version,+ NULL);++ megasas_proc_release_date =+ create_proc_read_entry("release_date", S_IRUSR | S_IFREG,+ megasas_proc_root,+ megasas_proc_show_release_date,+ NULL);++ megasas_proc_dbg_lvl =+ create_proc_read_entry("dbg_lvl", S_IRUSR|S_IFREG|S_IWUSR,+ megasas_proc_root,+ megasas_proc_show_dbg_lvl,+ megasas_proc_get_dbg_lvl); - if (rval) {- printk(KERN_DEBUG "megasas: PCI hotplug regisration failed \n");- goto err_pcidrv;++ megasas_proc_hba_map = proc_mkdir("hba_map", megasas_proc_root);+ }+#endif+ + scsi_register_module(MODULE_SCSI_HA, &megasas_template);+#ifdef __x86_64__+ register_ioctl32_conversion(MEGASAS_IOCTL_CMD, megasas_compat_ioctl);+#endif+ if(register_reboot_notifier(&megasas_notifier)) {+ printk("megasas: reboot notify routine registration failed!!\n"); } - rval = driver_create_file(&megasas_pci_driver.driver,- &driver_attr_version);- if (rval)- goto err_dcf_attr_ver;- rval = driver_create_file(&megasas_pci_driver.driver,- &driver_attr_release_date);- if (rval)- goto err_dcf_rel_date;- rval = driver_create_file(&megasas_pci_driver.driver,- &driver_attr_dbg_lvl);- if (rval)- goto err_dcf_dbg_lvl;-- return rval;-err_dcf_dbg_lvl:- driver_remove_file(&megasas_pci_driver.driver,- &driver_attr_release_date);-err_dcf_rel_date:- driver_remove_file(&megasas_pci_driver.driver, &driver_attr_version);-err_dcf_attr_ver:- pci_unregister_driver(&megasas_pci_driver);-err_pcidrv:- unregister_chrdev(megasas_mgmt_majorno, "megaraid_sas_ioctl");- return rval;+ return 0; } /**@@ -3483,14 +3590,23 @@ err_pcidrv: */ static void __exit megasas_exit(void) {- driver_remove_file(&megasas_pci_driver.driver,- &driver_attr_dbg_lvl);- driver_remove_file(&megasas_pci_driver.driver,- &driver_attr_release_date);- driver_remove_file(&megasas_pci_driver.driver, &driver_attr_version);+#ifdef __x86_64__+ unregister_ioctl32_conversion(MEGASAS_IOCTL_CMD);+#endif++#ifdef CONFIG_PROC_FS+ if (megasas_proc_root) {+ remove_proc_entry("version", megasas_proc_root);+ remove_proc_entry("release_date", megasas_proc_root);+ remove_proc_entry("dbg_lvl", megasas_proc_root);+ remove_proc_entry("hba_map", megasas_proc_root);+ remove_proc_entry("megaraid_sas", proc_scsi);+ }+#endif - pci_unregister_driver(&megasas_pci_driver);+ scsi_unregister_module(MODULE_SCSI_HA, &megasas_template); unregister_chrdev(megasas_mgmt_majorno, "megaraid_sas_ioctl");+ unregister_reboot_notifier(&megasas_notifier); } module_init(megasas_init);diff -uprN base/megaraid_sas.h rhel3-ga/megaraid_sas.h--- base/megaraid_sas.h 2007-10-13 20:37:32.000000000 -0700+++ rhel3-ga/megaraid_sas.h 2007-10-13 20:41:22.000000000 -0700@@ -15,7 +15,7 @@ #ifndef LSI_MEGARAID_SAS_H #define LSI_MEGARAID_SAS_H -/*+/** * MegaRAID SAS Driver meta data */ #define MEGASAS_VERSION "00.00.03.16"@@ -24,9 +24,45 @@ /* * Device IDs+ * */ #define PCI_DEVICE_ID_LSI_SAS1078R 0x0060 #define PCI_DEVICE_ID_LSI_VERDE_ZCR 0x0413+#define PCI_DEVICE_ID_LSI_SAS1064R 0x0411+#define PCI_DEVICE_ID_DELL_PERC5 0x0015++#define __user+#define __iomem+#define dma_pool pci_pool++#ifndef READ_16+#define READ_16 0x88+#endif++#ifndef WRITE_16+#define WRITE_16 0x8a+#endif++#ifndef REPORT_LUNS+#define REPORT_LUNS 0xa0+#endif++#define DID_IMM_RETRY DID_SOFT_ERROR+#define SAM_STAT_CHECK_CONDITION 0x02++#define scsi_host_alloc scsi_register+#define scsi_host_put scsi_unregister+#define scsi_add_host(x,y) (0)+#define scsi_remove_host(x) do{}while(0)+#define scsi_scan_host(x) do{}while(0)++typedef void irqreturn_t;++#define IRQ_NONE+#define IRQ_HANDLED++#define DMA_32BIT_MASK 0xFFFFFFFF+#define DMA_64BIT_MASK 0xFFFFFFFFFFFFFFFF /* * =====================================@@ -40,7 +76,7 @@ * "message frames" */ -/*+/** * FW posts its state in upper 4 bits of outbound_msg_0 register */ #define MFI_STATE_MASK 0xF0000000@@ -58,7 +94,7 @@ #define MEGAMFI_FRAME_SIZE 64 -/*+/** * During FW init, clear pending cmds & reset state using inbound_msg_0 * * ABORT : Abort all pending cmds@@ -78,7 +114,7 @@ MFI_INIT_MFIMODE| \ MFI_INIT_ABORT -/*+/** * MFI frame flags */ #define MFI_FRAME_POST_IN_REPLY_QUEUE 0x0000@@ -92,12 +128,12 @@ #define MFI_FRAME_DIR_READ 0x0010 #define MFI_FRAME_DIR_BOTH 0x0018 -/*+/** * Definition for cmd_status */ #define MFI_CMD_STATUS_POLL_MODE 0xFF -/*+/** * MFI command opcodes */ #define MFI_CMD_INIT 0x00@@ -117,7 +153,6 @@ #define MR_FLUSH_DISK_CACHE 0x02 #define MR_DCMD_CTRL_SHUTDOWN 0x01050000-#define MR_DCMD_HIBERNATE_SHUTDOWN 0x01060000 #define MR_ENABLE_DRIVE_SPINDOWN 0x01 #define MR_DCMD_CTRL_EVENT_GET_INFO 0x01040100@@ -129,7 +164,7 @@ #define MR_DCMD_CLUSTER_RESET_ALL 0x08010100 #define MR_DCMD_CLUSTER_RESET_LD 0x08010200 -/*+/** * MFI command completion codes */ enum MFI_STAT {@@ -507,6 +542,7 @@ struct megasas_ctrl_info { /* * Define ECC single-bit-error bucket information */+ u8 ecc_bucket_count; u8 reserved_2[11]; @@ -539,9 +575,18 @@ struct megasas_ctrl_info { #define MEGASAS_MAX_LD 64 #define MEGASAS_DEFAULT_CMD_PER_LUN 128 - #define MEGASAS_DBG_LVL 1-#define MEGASAS_FW_BUSY 1++/* + * For ioctl memory manager+ */++#define MAX_IOCTL_MEM_POOL 3+#define MEGASAS_INIT_IOCTL_MEM_SIZE 4096+#define MAX_IOCTL_MEM_BLOCK 16+#define MAX_4K_BUFF 8+#define MAX_8K_BUFF 4+#define MAX_64K_BUFF 1 /* * When SCSI mid-layer calls driver's reset routine, driver waits for@@ -556,8 +601,6 @@ struct megasas_ctrl_info { #define MEGASAS_IOCTL_CMD 0 -#define MEGASAS_DEFAULT_CMD_TIMEOUT 90- /* * FW reports the maximum of number of commands that it can accept (maximum * commands that can be outstanding) at any time. The driver must report a@@ -1064,7 +1107,11 @@ struct megasas_evt_detail { u32 (*read_fw_status_reg)(struct megasas_register_set __iomem *); };-+struct megasas_ioctl_mm {+ void *vaddr;+ dma_addr_t buf_handle;+ struct list_head list;+}; struct megasas_instance { u32 *producer;@@ -1079,6 +1126,7 @@ struct megasas_instance { struct megasas_register_set __iomem *reg_set; s8 init_id;+ u8 reserved[3]; u16 max_num_sge; u16 max_fw_cmds;@@ -1092,6 +1140,15 @@ struct megasas_instance { struct dma_pool *frame_dma_pool; struct dma_pool *sense_dma_pool; + /* for the ioctl memory */+ struct list_head ioctl_memory_pool[MAX_IOCTL_MEM_POOL];+ spinlock_t ioctl_memory_pool_lock;+ u8 mem_pool_empty;+ /* end of ioctl memory */++ struct list_head pending_list;+ spinlock_t pending_lock;+ struct megasas_evt_detail *evt_detail; dma_addr_t evt_detail_h; struct megasas_cmd *aen_cmd;@@ -1099,6 +1156,7 @@ struct megasas_instance { struct semaphore ioctl_sem; struct Scsi_Host *host;+ spinlock_t host_lock; wait_queue_head_t int_cmd_wait_q; wait_queue_head_t abort_cmd_wait_q;@@ -1108,20 +1166,25 @@ struct megasas_instance { atomic_t fw_outstanding; u32 hw_crit_error;- - struct megasas_instance_template *instancet;- struct tasklet_struct isr_tasklet;+#if CONFIG_PROC_FS+ struct proc_dir_entry *hba_proc_dir;+#endif - u8 flag;+ u8 is_busy; unsigned long last_time;++ struct megasas_instance_template *instancet; }; #define MEGASAS_IS_LOGICAL(scp) \- (scp->device->channel < MEGASAS_MAX_PD_CHANNELS) ? 0 : 1+ (scp->channel < MEGASAS_MAX_PD_CHANNELS) ? 0 : 1 #define MEGASAS_DEV_INDEX(inst, scp) \- ((scp->device->channel % 2) * MEGASAS_MAX_DEV_PER_CHANNEL) + \- scp->device->id+ ((scp->channel % 2) * MEGASAS_MAX_DEV_PER_CHANNEL) + \+ scp->target++#define MAX_MGMT_ADAPTERS 1024+#define MAX_IOCTL_SGE 16 struct megasas_cmd { @@ -1139,11 +1202,10 @@ struct megasas_cmd { struct scsi_cmnd *scmd; struct megasas_instance *instance; u32 frame_count;+ u8 ioctl_mem_pool_index[MAX_IOCTL_SGE]; /*0xff for no use*/+ struct megasas_ioctl_mm *ioctl_mem[MAX_IOCTL_SGE]; }; -#define MAX_MGMT_ADAPTERS 1024-#define MAX_IOCTL_SGE 16- struct megasas_iocpacket { u16 host_no;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -