📄 sles10-ga.patch
字号:
diff -uprN base/megaraid_sas.c sles10-ga/megaraid_sas.c--- base/megaraid_sas.c 2007-10-13 20:49:29.000000000 -0700+++ sles10-ga/megaraid_sas.c 2007-10-13 20:45:43.000000000 -0700@@ -107,10 +107,10 @@ static struct fasync_struct *megasas_asy static DEFINE_MUTEX(megasas_async_queue_mutex); static u32 megasas_dbg_lvl;- static void megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd, u8 alt_status);+ /** * megasas_get_cmd - Get a command from the free pool * @instance: Adapter soft state@@ -876,6 +876,7 @@ megasas_queue_command(struct scsi_cmnd * u32 frame_count; struct megasas_cmd *cmd; struct megasas_instance *instance;+ unsigned long sec; instance = (struct megasas_instance *) scmd->device->host->hostdata;@@ -903,6 +904,22 @@ megasas_queue_command(struct scsi_cmnd * goto out_done; } + /* If FW is busy donot accept any more cmds */+ if(instance->is_busy){+ sec = (jiffies - instance->last_time) / HZ;+ if(sec<10) + return SCSI_MLQUEUE_HOST_BUSY;+ else{+ instance->is_busy=0;+ instance->last_time=0;+ }+ }++ if(scmd->retries>1){+ instance->is_busy=1;+ instance->last_time=jiffies;+ }+ cmd = megasas_get_cmd(instance); if (!cmd) return SCSI_MLQUEUE_HOST_BUSY;@@ -919,7 +936,6 @@ megasas_queue_command(struct scsi_cmnd * goto out_return_cmd; cmd->scmd = scmd;- scmd->SCp.ptr = (char *)cmd; /* * Issue the command to the FW@@ -953,7 +969,7 @@ static int megasas_slave_configure(struc * The RAID firmware may require extended timeouts. */ if (sdev->channel >= MEGASAS_MAX_PD_CHANNELS)- sdev->timeout = MEGASAS_DEFAULT_CMD_TIMEOUT * HZ;+ sdev->timeout = 90 * HZ; return 0; } @@ -1080,38 +1096,6 @@ static int megasas_generic_reset(struct return ret_val; } - /**- * 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@@ -1261,7 +1245,6 @@ 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, };@@ -1364,10 +1347,7 @@ megasas_complete_cmd(struct megasas_inst { int exception = 0; struct megasas_header *hdr = &cmd->frame->hdr;- unsigned long flags;-- if (cmd->scmd)- cmd->scmd->SCp.ptr = NULL;+ int outstanding; switch (hdr->cmd) { @@ -1478,19 +1458,10 @@ megasas_complete_cmd(struct megasas_inst break; } - /*- * 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);+ if(instance->is_busy){+ outstanding = atomic_read(&instance->fw_outstanding);+ if(outstanding<17)+ instance->is_busy=0; } }@@ -1525,7 +1496,7 @@ out_done: /** * megasas_isr - isr entry point */-static irqreturn_t megasas_isr(int irq, void *devp)+static irqreturn_t megasas_isr(int irq, void *devp, struct pt_regs *regs) { return megasas_deplete_reply_queue((struct megasas_instance *)devp, DID_OK);@@ -2153,7 +2124,7 @@ static int megasas_init_mfi(struct megas } instance->max_sectors_per_req = instance->max_num_sge *- PAGE_SIZE / 512;+ PAGE_SIZE / 512; if (tmp_sectors && (instance->max_sectors_per_req > tmp_sectors)) instance->max_sectors_per_req = tmp_sectors; @@ -2635,8 +2606,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;+ instance->is_busy=0;+ instance->last_time=0; /* * Initialize MFI Firmware@@ -2647,7 +2618,7 @@ megasas_probe_one(struct pci_dev *pdev, /* * Register IRQ */- if (request_irq(pdev->irq, megasas_isr, IRQF_SHARED, "megasas", instance)) {+ if (request_irq(pdev->irq, megasas_isr, SA_SHIRQ, "megasas", instance)) { printk(KERN_DEBUG "megasas: Failed to register IRQ\n"); goto fail_irq; }@@ -2877,8 +2848,7 @@ megasas_resume(struct pci_dev *pdev) /* * Register IRQ */- if (request_irq(pdev->irq, megasas_isr, IRQF_SHARED,- "megasas",instance)) {+ if (request_irq(pdev->irq, megasas_isr, SA_SHIRQ, "megasas", instance)) { printk(KERN_DEBUG "megasas: Failed to register IRQ\n"); goto fail_irq; }@@ -3166,6 +3136,7 @@ megasas_mgmt_fw_ioctl(struct megasas_ins * sense_buff points to the location that has the user * sense buffer address */+ sense_buff = (unsigned long *) ((unsigned long)ioc->frame.raw + ioc->sense_off); sense_ptr = (u32 *) ((unsigned long)ioc->frame.raw +diff -uprN base/megaraid_sas.h sles10-ga/megaraid_sas.h--- base/megaraid_sas.h 2007-10-13 20:37:32.000000000 -0700+++ sles10-ga/megaraid_sas.h 2007-10-13 20:43:08.000000000 -0700@@ -541,6 +541,7 @@ struct megasas_ctrl_info { #define MEGASAS_DBG_LVL 1+ #define MEGASAS_FW_BUSY 1 /*@@ -556,8 +557,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@@ -1079,6 +1078,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;@@ -1109,11 +1109,12 @@ struct megasas_instance { atomic_t fw_outstanding; u32 hw_crit_error; + u8 is_busy;+ unsigned long last_time;+ struct megasas_instance_template *instancet; struct tasklet_struct isr_tasklet; - u8 flag;- unsigned long last_time; }; #define MEGASAS_IS_LOGICAL(scp) \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -