Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752559Ab0FRVIO (ORCPT ); Fri, 18 Jun 2010 17:08:14 -0400 Received: from na3sys009aog102.obsmtp.com ([74.125.149.69]:47901 "EHLO na3sys009aog102.obsmtp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752245Ab0FRVIN convert rfc822-to-8bit (ORCPT ); Fri, 18 Jun 2010 17:08:13 -0400 From: "Yang, Bo" To: "Yang, Bo" , "'James.Bottomley@HansenPartnership.com'" , "'James.Bottomley@suse.de'" CC: "'linux-scsi@vger.kernel.org'" , "'akpm@osdl.org'" , "'linux-kernel@vger.kernel.org'" Date: Fri, 18 Jun 2010 15:07:59 -0600 Subject: [PATCH 10/12] scsi: megaraid_sas - Add input parameter for max_sectors Thread-Topic: [PATCH 10/12] scsi: megaraid_sas - Add input parameter for max_sectors Thread-Index: AcsIVC3Rc9Jg0oxHQFaCp6By1ck5EgG1cnvA Message-ID: <4B6A08C587958942AA3002690DD4F8C3D09274AC@cosmail02.lsi.com> References: <4B6A08C587958942AA3002690DD4F8C3D080455E@cosmail02.lsi.com> In-Reply-To: <4B6A08C587958942AA3002690DD4F8C3D080455E@cosmail02.lsi.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 8BIT MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4492 Lines: 143 RESUBMIT: Driver add the input parameters support for max_sectors for our gen2 chip. Customer can Set the max_sectors support to 1MB for gen2 chip during the driver load. Signed-off-by Bo Yang --- drivers/scsi/megaraid/megaraid_sas.c | 74 +++++++++++++++++++++++++++++++++++ drivers/scsi/megaraid/megaraid_sas.h | 1 2 files changed, 75 insertions(+) diff -rupN old/drivers/scsi/megaraid/megaraid_sas.c new/drivers/scsi/megaraid/megaraid_sas.c --- old/drivers/scsi/megaraid/megaraid_sas.c 2010-06-08 09:04:38.000000000 -0400 +++ new/drivers/scsi/megaraid/megaraid_sas.c 2010-06-08 09:51:56.000000000 -0400 @@ -57,6 +57,15 @@ module_param_named(poll_mode_io, poll_mo MODULE_PARM_DESC(poll_mode_io, "Complete cmds from IO path, (default=0)"); +/* + * Number of sectors per IO command + * Will be set in megasas_init_mfi if user does not provide + */ +static unsigned int max_sectors; +module_param_named(max_sectors, max_sectors, int, 0); +MODULE_PARM_DESC(max_sectors, + "Maximum number of sectors per IO command"); + MODULE_LICENSE("GPL"); MODULE_VERSION(MEGASAS_VERSION); MODULE_AUTHOR("megaraidlinux@lsi.com"); @@ -3566,6 +3575,32 @@ static int megasas_start_aen(struct mega class_locale.word); } +static ssize_t +sysfs_max_sectors_read(struct kobject *kobj, struct bin_attribute *bin_attr, + char *buf, loff_t off, size_t count) +{ + struct device *dev = container_of(kobj, struct device, kobj); + + struct Scsi_Host *host = class_to_shost(dev); + + struct megasas_instance *instance = + (struct megasas_instance *)host->hostdata; + + count = sprintf(buf, "%u\n", instance->max_sectors_per_req); + + return count+1; +} + +static struct bin_attribute sysfs_max_sectors_attr = { + .attr = { + .name = "max_sectors", + .mode = S_IRUSR|S_IRGRP|S_IROTH, + .owner = THIS_MODULE, + }, + .size = 7, + .read = sysfs_max_sectors_read, +}; + /** * megasas_io_attach - Attaches this driver to SCSI mid-layer * @instance: Adapter soft state @@ -3573,6 +3608,7 @@ static int megasas_start_aen(struct mega static int megasas_io_attach(struct megasas_instance *instance) { struct Scsi_Host *host = instance->host; + u32 error; /* * Export parameters required by SCSI mid-layer @@ -3588,6 +3624,27 @@ static int megasas_io_attach(struct mega instance->max_fw_cmds - MEGASAS_INT_CMDS; host->this_id = instance->init_id; host->sg_tablesize = instance->max_num_sge; + /* + * Check if the module parameter value for max_sectors can be used + */ + if (max_sectors && max_sectors < instance->max_sectors_per_req) + instance->max_sectors_per_req = max_sectors; + else { + if (max_sectors) { + if (((instance->pdev->device == + PCI_DEVICE_ID_LSI_SAS1078GEN2) || + (instance->pdev->device == + PCI_DEVICE_ID_LSI_SAS0079GEN2)) && + (max_sectors <= MEGASAS_MAX_SECTORS)) { + instance->max_sectors_per_req = max_sectors; + } else { + printk(KERN_INFO "megasas: max_sectors should be > 0" + "and <= %d (or < 1MB for GEN2 controller)\n", + instance->max_sectors_per_req); + } + } + } + host->max_sectors = instance->max_sectors_per_req; host->cmd_per_lun = 128; host->max_channel = MEGASAS_MAX_CHANNELS - 1; @@ -3604,10 +3661,27 @@ static int megasas_io_attach(struct mega } /* + * Create sysfs entries for module paramaters + */ + error = sysfs_create_bin_file(&instance->host->shost_dev.kobj, + &sysfs_max_sectors_attr); + + if (error) { + printk(KERN_INFO "megasas: Error in creating the sysfs entry" + " max_sectors.\n"); + goto out_remove_host; + } + + /* * Trigger SCSI to scan our drives */ scsi_scan_host(host); return 0; + +out_remove_host: + scsi_remove_host(host); + return error; + } static int diff -rupN old/drivers/scsi/megaraid/megaraid_sas.h new/drivers/scsi/megaraid/megaraid_sas.h --- old/drivers/scsi/megaraid/megaraid_sas.h 2010-06-08 09:04:38.000000000 -0400 +++ new/drivers/scsi/megaraid/megaraid_sas.h 2010-06-08 09:04:38.000000000 -0400 @@ -706,6 +706,7 @@ struct megasas_ctrl_info { #define MEGASAS_MAX_LD_IDS (MEGASAS_MAX_LD_CHANNELS * \ MEGASAS_MAX_DEV_PER_CHANNEL) +#define MEGASAS_MAX_SECTORS (2*1024) #define MEGASAS_DBG_LVL 1 #define MEGASAS_FW_BUSY 1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/