Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 156842 Details for
Bug 243959
sync cache of shutdown processing fails in a megaraid_sas driver of EL5
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
[patch]
[PATCH2/2] megaraid sas driver update patch
linux-2.6.18-scsi-megaraid_sas-3.10-rc5.patch (text/plain), 11.60 KB, created by
Haruo Tomita
on 2007-06-13 02:35:36 UTC
(
hide
)
Description:
[PATCH2/2] megaraid sas driver update patch
Filename:
MIME Type:
Creator:
Haruo Tomita
Created:
2007-06-13 02:35:36 UTC
Size:
11.60 KB
patch
obsolete
>diff -urpN linux-2.6.18-8.1.4.el5.orig/drivers/scsi/megaraid/megaraid_sas.c linux-2.6.18-8.1.4.el5/drivers/scsi/megaraid/megaraid_sas.c >--- linux-2.6.18-8.1.4.el5.orig/drivers/scsi/megaraid/megaraid_sas.c 2007-06-12 14:50:03.000000000 +0900 >+++ linux-2.6.18-8.1.4.el5/drivers/scsi/megaraid/megaraid_sas.c 2007-06-12 14:57:42.000000000 +0900 >@@ -10,11 +10,13 @@ > * 2 of the License, or (at your option) any later version. > * > * FILE : megaraid_sas.c >- * Version : v00.00.03.05 >+ * Version : v00.00.03.10-rc5 > * > * Authors: >- * Sreenivas Bagalkote <Sreenivas.Bagalkote@lsil.com> >- * Sumant Patro <Sumant.Patro@lsil.com> >+ * (email-id : megaraidlinux@lsi.com) >+ * Sreenivas Bagalkote >+ * Sumant Patro >+ * Bo Yang > * > * List of supported controllers > * >@@ -35,6 +37,7 @@ > #include <asm/uaccess.h> > #include <linux/fs.h> > #include <linux/compat.h> >+#include <linux/blkdev.h> > #include <linux/mutex.h> > > #include <scsi/scsi.h> >@@ -45,7 +48,7 @@ > > MODULE_LICENSE("GPL"); > MODULE_VERSION(MEGASAS_VERSION); >-MODULE_AUTHOR("sreenivas.bagalkote@lsil.com"); >+MODULE_AUTHOR("megaraidlinux@lsi.com"); > MODULE_DESCRIPTION("LSI Logic MegaRAID SAS Driver"); > > /* >@@ -517,7 +520,7 @@ megasas_make_sgl64(struct megasas_instan > * Returns the number of frames required for numnber of sge's (sge_count) > */ > >-u32 megasas_get_frame_count(u8 sge_count) >+static u32 megasas_get_frame_count(u8 sge_count) > { > int num_cnt; > int sge_bytes; >@@ -841,6 +844,11 @@ megasas_queue_command(struct scsi_cmnd * > > instance = (struct megasas_instance *) > scmd->device->host->hostdata; >+ >+ /* Don't process if we have already declared adapter dead */ >+ if (instance->hw_crit_error) >+ return SCSI_MLQUEUE_HOST_BUSY; >+ > scmd->scsi_done = done; > scmd->result = 0; > >@@ -850,6 +858,18 @@ megasas_queue_command(struct scsi_cmnd * > goto out_done; > } > >+ switch (scmd->cmnd[0]) { >+ case SYNCHRONIZE_CACHE: >+ /* >+ * FW takes care of flush cache on its own >+ * No need to send it down >+ */ >+ scmd->result = DID_OK << 16; >+ goto out_done; >+ default: >+ break; >+ } >+ > cmd = megasas_get_cmd(instance); > if (!cmd) > return SCSI_MLQUEUE_HOST_BUSY; >@@ -866,6 +886,7 @@ megasas_queue_command(struct scsi_cmnd * > goto out_return_cmd; > > cmd->scmd = scmd; >+ scmd->SCp.ptr = (char *)cmd; > > /* > * Issue the command to the FW >@@ -899,7 +920,7 @@ static int megasas_slave_configure(struc > * The RAID firmware may require extended timeouts. > */ > if (sdev->channel >= MEGASAS_MAX_PD_CHANNELS) >- sdev->timeout = 90 * HZ; >+ sdev->timeout = MEGASAS_DEFAULT_CMD_TIMEOUT * HZ; > return 0; > } > >@@ -961,8 +982,8 @@ static int megasas_generic_reset(struct > > instance = (struct megasas_instance *)scmd->device->host->hostdata; > >- scmd_printk(KERN_NOTICE, scmd, "megasas: RESET -%ld cmd=%x\n", >- scmd->serial_number, scmd->cmnd[0]); >+ scmd_printk(KERN_NOTICE, scmd, "megasas: RESET -%ld cmd=%x retries=%x\n", >+ scmd->serial_number, scmd->cmnd[0], scmd->retries); > > if (instance->hw_crit_error) { > printk(KERN_ERR "megasas: cannot recover from previous reset " >@@ -980,6 +1001,39 @@ static int megasas_generic_reset(struct > } > > /** >+ * megasas_reset_timer - quiesce the adapter if required >+ * @scmd: scsi cmnd >+ * >+ * Sets the FW busy flag and reduces the host->can_queue if the >+ * cmd has not been completed within the timeout period. >+ */ >+static enum >+scsi_eh_timer_return megasas_reset_timer(struct scsi_cmnd *scmd) >+{ >+ struct megasas_cmd *cmd = (struct megasas_cmd *)scmd->SCp.ptr; >+ struct megasas_instance *instance; >+ unsigned long flags; >+ >+ if (time_after(jiffies, scmd->jiffies_at_alloc + >+ (MEGASAS_DEFAULT_CMD_TIMEOUT * 2) * HZ)) { >+ return EH_NOT_HANDLED; >+ } >+ >+ instance = cmd->instance; >+ if (!(instance->flag & MEGASAS_FW_BUSY)) { >+ /* FW is busy, throttle IO */ >+ spin_lock_irqsave(instance->host->host_lock, flags); >+ >+ instance->host->can_queue = 16; >+ instance->last_time = jiffies; >+ instance->flag |= MEGASAS_FW_BUSY; >+ >+ spin_unlock_irqrestore(instance->host->host_lock, flags); >+ } >+ return EH_RESET_TIMER; >+} >+ >+/** > * megasas_reset_device - Device reset handler entry point > */ > static int megasas_reset_device(struct scsi_cmnd *scmd) >@@ -1010,6 +1064,49 @@ static int megasas_reset_bus_host(struct > } > > /** >+ * megasas_bios_param - Returns disk geometry for a disk >+ * @sdev: device handle >+ * @bdev: block device >+ * @capacity: drive capacity >+ * @geom: geometry parameters >+ */ >+static int >+megasas_bios_param(struct scsi_device *sdev, struct block_device *bdev, >+ sector_t capacity, int geom[]) >+{ >+ int heads; >+ int sectors; >+ sector_t cylinders; >+ unsigned long tmp; >+ /* Default heads (64) & sectors (32) */ >+ heads = 64; >+ sectors = 32; >+ >+ tmp = heads * sectors; >+ cylinders = capacity; >+ >+ sector_div(cylinders, tmp); >+ >+ /* >+ * Handle extended translation size for logical drives > 1Gb >+ */ >+ >+ if (capacity >= 0x200000) { >+ heads = 255; >+ sectors = 63; >+ tmp = heads*sectors; >+ cylinders = capacity; >+ sector_div(cylinders, tmp); >+ } >+ >+ geom[0] = heads; >+ geom[1] = sectors; >+ geom[2] = cylinders; >+ >+ return 0; >+} >+ >+/** > * megasas_service_aen - Processes an event notification > * @instance: Adapter soft state > * @cmd: AEN command completed by the ISR >@@ -1049,6 +1146,8 @@ static struct scsi_host_template megasas > .eh_device_reset_handler = megasas_reset_device, > .eh_bus_reset_handler = megasas_reset_bus_host, > .eh_host_reset_handler = megasas_reset_bus_host, >+ .eh_timed_out = megasas_reset_timer, >+ .bios_param = megasas_bios_param, > .use_clustering = ENABLE_CLUSTERING, > }; > >@@ -1151,9 +1250,8 @@ megasas_complete_cmd(struct megasas_inst > int exception = 0; > struct megasas_header *hdr = &cmd->frame->hdr; > >- if (cmd->scmd) { >- cmd->scmd->SCp.ptr = (char *)0; >- } >+ if (cmd->scmd) >+ cmd->scmd->SCp.ptr = NULL; > > switch (hdr->cmd) { > >@@ -1282,11 +1380,13 @@ megasas_deplete_reply_queue(struct megas > if(instance->instancet->clear_intr(instance->reg_set)) > return IRQ_NONE; > >+ if (instance->hw_crit_error) >+ goto out_done; > /* > * Schedule the tasklet for cmd completion > */ > tasklet_schedule(&instance->isr_tasklet); >- >+out_done: > return IRQ_HANDLED; > } > >@@ -1733,13 +1833,18 @@ megasas_get_ctrl_info(struct megasas_ins > * > * Tasklet to complete cmds > */ >-void megasas_complete_cmd_dpc(unsigned long instance_addr) >+static void megasas_complete_cmd_dpc(unsigned long instance_addr) > { > u32 producer; > u32 consumer; > u32 context; > struct megasas_cmd *cmd; > struct megasas_instance *instance = (struct megasas_instance *)instance_addr; >+ unsigned long flags; >+ >+ /* If we have already declared adapter dead, donot complete cmds */ >+ if (instance->hw_crit_error) >+ return; > > producer = *instance->producer; > consumer = *instance->consumer; >@@ -1758,6 +1863,22 @@ void megasas_complete_cmd_dpc(unsigned l > } > > *instance->consumer = producer; >+ >+ /* >+ * Check if we can restore can_queue >+ */ >+ if (instance->flag & MEGASAS_FW_BUSY >+ && time_after(jiffies, instance->last_time + 5 * HZ) >+ && atomic_read(&instance->fw_outstanding) < 17) { >+ >+ spin_lock_irqsave(instance->host->host_lock, flags); >+ instance->flag &= ~MEGASAS_FW_BUSY; >+ instance->host->can_queue = >+ instance->max_fw_cmds - MEGASAS_INT_CMDS; >+ >+ spin_unlock_irqrestore(instance->host->host_lock, flags); >+ } >+ > } > > /** >@@ -2328,6 +2449,8 @@ megasas_probe_one(struct pci_dev *pdev, > instance->init_id = MEGASAS_DEFAULT_INIT_ID; > > megasas_dbg_lvl = 0; >+ instance->flag = 0; >+ instance->last_time = 0; > > /* > * Initialize MFI Firmware >@@ -2655,9 +2778,9 @@ megasas_mgmt_fw_ioctl(struct megasas_ins > * For each user buffer, create a mirror buffer and copy in > */ > for (i = 0; i < ioc->sge_count; i++) { >- kbuff_arr[i] = pci_alloc_consistent(instance->pdev, >+ kbuff_arr[i] = dma_alloc_coherent(&instance->pdev->dev, > ioc->sgl[i].iov_len, >- &buf_handle); >+ &buf_handle, GFP_KERNEL); > if (!kbuff_arr[i]) { > printk(KERN_DEBUG "megasas: Failed to alloc " > "kernel SGL buffer for IOCTL \n"); >@@ -2684,8 +2807,8 @@ megasas_mgmt_fw_ioctl(struct megasas_ins > } > > if (ioc->sense_len) { >- sense = pci_alloc_consistent(instance->pdev, ioc->sense_len, >- &sense_handle); >+ sense = dma_alloc_coherent(&instance->pdev->dev, ioc->sense_len, >+ &sense_handle, GFP_KERNEL); > if (!sense) { > error = -ENOMEM; > goto out; >@@ -2744,12 +2867,12 @@ megasas_mgmt_fw_ioctl(struct megasas_ins > > out: > if (sense) { >- pci_free_consistent(instance->pdev, ioc->sense_len, >+ dma_free_coherent(&instance->pdev->dev, ioc->sense_len, > sense, sense_handle); > } > > for (i = 0; i < ioc->sge_count && kbuff_arr[i]; i++) { >- pci_free_consistent(instance->pdev, >+ dma_free_coherent(&instance->pdev->dev, > kern_sge32[i].length, > kbuff_arr[i], kern_sge32[i].phys_addr); > } >@@ -2913,7 +3036,7 @@ megasas_mgmt_compat_ioctl(struct file *f > /* > * File operations structure for management interface > */ >-static struct file_operations megasas_mgmt_fops = { >+static const struct file_operations megasas_mgmt_fops = { > .owner = THIS_MODULE, > .open = megasas_mgmt_open, > .release = megasas_mgmt_release, >diff -urpN linux-2.6.18-8.1.4.el5.orig/drivers/scsi/megaraid/megaraid_sas.h linux-2.6.18-8.1.4.el5/drivers/scsi/megaraid/megaraid_sas.h >--- linux-2.6.18-8.1.4.el5.orig/drivers/scsi/megaraid/megaraid_sas.h 2007-06-12 14:50:03.000000000 +0900 >+++ linux-2.6.18-8.1.4.el5/drivers/scsi/megaraid/megaraid_sas.h 2007-06-12 14:57:43.000000000 +0900 >@@ -15,12 +15,12 @@ > #ifndef LSI_MEGARAID_SAS_H > #define LSI_MEGARAID_SAS_H > >-/** >+/* > * MegaRAID SAS Driver meta data > */ >-#define MEGASAS_VERSION "00.00.03.05" >-#define MEGASAS_RELDATE "Oct 02, 2006" >-#define MEGASAS_EXT_VERSION "Mon Oct 02 11:21:32 PDT 2006" >+#define MEGASAS_VERSION "00.00.03.10-rc5" >+#define MEGASAS_RELDATE "May 17, 2007" >+#define MEGASAS_EXT_VERSION "Thu May 17 10:09:32 PDT 2007" > > /* > * Device IDs >@@ -40,7 +40,7 @@ > * "message frames" > */ > >-/** >+/* > * FW posts its state in upper 4 bits of outbound_msg_0 register > */ > #define MFI_STATE_MASK 0xF0000000 >@@ -58,7 +58,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 +78,7 @@ > MFI_INIT_MFIMODE| \ > MFI_INIT_ABORT > >-/** >+/* > * MFI frame flags > */ > #define MFI_FRAME_POST_IN_REPLY_QUEUE 0x0000 >@@ -92,12 +92,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 >@@ -128,7 +128,7 @@ > #define MR_DCMD_CLUSTER_RESET_ALL 0x08010100 > #define MR_DCMD_CLUSTER_RESET_LD 0x08010200 > >-/** >+/* > * MFI command completion codes > */ > enum MFI_STAT { >@@ -539,6 +539,8 @@ struct megasas_ctrl_info { > > #define MEGASAS_DBG_LVL 1 > >+#define MEGASAS_FW_BUSY 1 >+ > /* > * When SCSI mid-layer calls driver's reset routine, driver waits for > * MEGASAS_RESET_WAIT_TIME seconds for all outstanding IO to complete. Note >@@ -549,8 +551,8 @@ struct megasas_ctrl_info { > #define MEGASAS_RESET_WAIT_TIME 180 > #define MEGASAS_INTERNAL_CMD_WAIT_TIME 180 > #define MEGASAS_RESET_NOTICE_INTERVAL 5 >- > #define MEGASAS_IOCTL_CMD 0 >+#define MEGASAS_DEFAULT_CMD_TIMEOUT 90 > > /* > * FW reports the maximum of number of commands that it can accept (maximum >@@ -1073,7 +1075,6 @@ struct megasas_instance { > struct megasas_register_set __iomem *reg_set; > > s8 init_id; >- u8 reserved[3]; > > u16 max_num_sge; > u16 max_fw_cmds; >@@ -1104,6 +1105,9 @@ struct megasas_instance { > > struct megasas_instance_template *instancet; > struct tasklet_struct isr_tasklet; >+ >+ u8 flag; >+ unsigned long last_time; > }; > > #define MEGASAS_IS_LOGICAL(scp) \
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 243959
:
156841
| 156842