From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from e31.co.us.ibm.com (e31.co.us.ibm.com [32.97.110.149]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "e31.co.us.ibm.com", Issuer "Equifax" (verified OK)) by ozlabs.org (Postfix) with ESMTPS id 6B334DE19C for ; Sat, 14 Jun 2008 04:31:45 +1000 (EST) Received: from d03relay02.boulder.ibm.com (d03relay02.boulder.ibm.com [9.17.195.227]) by e31.co.us.ibm.com (8.13.8/8.13.8) with ESMTP id m5DIVeU1029866 for ; Fri, 13 Jun 2008 14:31:40 -0400 Received: from d03av03.boulder.ibm.com (d03av03.boulder.ibm.com [9.17.195.169]) by d03relay02.boulder.ibm.com (8.13.8/8.13.8/NCO v9.0) with ESMTP id m5DIVewn164404 for ; Fri, 13 Jun 2008 12:31:40 -0600 Received: from d03av03.boulder.ibm.com (loopback [127.0.0.1]) by d03av03.boulder.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id m5DIVd9T020746 for ; Fri, 13 Jun 2008 12:31:40 -0600 Message-ID: <4852BCDF.80404@linux.vnet.ibm.com> Date: Fri, 13 Jun 2008 13:30:55 -0500 From: Brian King MIME-Version: 1.0 To: Robert Jennings Subject: Re: [PATCH 18/19] ibmvscsi: driver enablement for CMO References: <20080612222427.GZ30916@linux.vnet.ibm.com> In-Reply-To: <20080612222427.GZ30916@linux.vnet.ibm.com> Content-Type: text/plain; charset=ISO-8859-1 Cc: linuxppc-dev@ozlabs.org, paulus@samba.org, linux-scsi , David Darrington List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , CC'ing linux-scsi, although we'd like to take this through the powerpc tree since it is part of a patch set to enable a Power platform feature. -Brian Robert Jennings wrote: > From: Robert Jennings > > Enable the driver to function in a Cooperative Memory Overcommitment (CMO) > environment. > > The following changes are made to enable the driver for CMO: > * DMA mapping errors will not result in error messages if entitlement has > been exceeded and resources were not available. > * The driver has a get_io_entitlement function defined to function > in a CMO environment. It will indicate how much IO memory it would like > to function. > > Signed-off-by: Robert Jennings > > --- > drivers/scsi/ibmvscsi/ibmvscsi.c | 46 +++++++++++++++++++++++++++++++++------ > drivers/scsi/ibmvscsi/ibmvscsi.h | 2 ++ > 2 files changed, 41 insertions(+), 7 deletions(-) > > Index: b/drivers/scsi/ibmvscsi/ibmvscsi.c > =================================================================== > --- a/drivers/scsi/ibmvscsi/ibmvscsi.c > +++ b/drivers/scsi/ibmvscsi/ibmvscsi.c > @@ -72,6 +72,8 @@ > #include > #include > #include > +#include > +#include > #include > #include > #include > @@ -426,8 +428,10 @@ static int map_sg_data(struct scsi_cmnd > SG_ALL * sizeof(struct srp_direct_buf), > &evt_struct->ext_list_token, 0); > if (!evt_struct->ext_list) { > - sdev_printk(KERN_ERR, cmd->device, > - "Can't allocate memory for indirect table\n"); > + if (!firmware_has_feature(FW_FEATURE_CMO)) > + sdev_printk(KERN_ERR, cmd->device, > + "Can't allocate memory " > + "for indirect table\n"); > return 0; > } > } > @@ -743,7 +747,9 @@ static int ibmvscsi_queuecommand(struct > srp_cmd->lun = ((u64) lun) << 48; > > if (!map_data_for_srp_cmd(cmnd, evt_struct, srp_cmd, hostdata->dev)) { > - sdev_printk(KERN_ERR, cmnd->device, "couldn't convert cmd to srp_cmd\n"); > + if (!firmware_has_feature(FW_FEATURE_CMO)) > + sdev_printk(KERN_ERR, cmnd->device, > + "couldn't convert cmd to srp_cmd\n"); > free_event_struct(&hostdata->pool, evt_struct); > return SCSI_MLQUEUE_HOST_BUSY; > } > @@ -855,7 +861,10 @@ static void send_mad_adapter_info(struct > DMA_BIDIRECTIONAL); > > if (dma_mapping_error(req->buffer)) { > - dev_err(hostdata->dev, "Unable to map request_buffer for adapter_info!\n"); > + if (!firmware_has_feature(FW_FEATURE_CMO)) > + dev_err(hostdata->dev, > + "Unable to map request_buffer for " > + "adapter_info!\n"); > free_event_struct(&hostdata->pool, evt_struct); > return; > } > @@ -1400,7 +1409,9 @@ static int ibmvscsi_do_host_config(struc > DMA_BIDIRECTIONAL); > > if (dma_mapping_error(host_config->buffer)) { > - dev_err(hostdata->dev, "dma_mapping error getting host config\n"); > + if (!firmware_has_feature(FW_FEATURE_CMO)) > + dev_err(hostdata->dev, > + "dma_mapping error getting host config\n"); > free_event_struct(&hostdata->pool, evt_struct); > return -1; > } > @@ -1604,7 +1615,7 @@ static struct scsi_host_template driver_ > .eh_host_reset_handler = ibmvscsi_eh_host_reset_handler, > .slave_configure = ibmvscsi_slave_configure, > .change_queue_depth = ibmvscsi_change_queue_depth, > - .cmd_per_lun = 16, > + .cmd_per_lun = IBMVSCSI_CMDS_PER_LUN_DEFAULT, > .can_queue = IBMVSCSI_MAX_REQUESTS_DEFAULT, > .this_id = -1, > .sg_tablesize = SG_ALL, > @@ -1613,6 +1624,26 @@ static struct scsi_host_template driver_ > }; > > /** > + * ibmvscsi_get_io_entitlement - Calculate IO entitlement needed by the driver > + * > + * @vdev: struct vio_dev for the device whose entitlement is to be returned > + * > + * Return value: > + * Number of bytes of IO data the driver will need to perform well. > + */ > +static unsigned long ibmvscsi_get_io_entitlement(struct vio_dev *vdev) > +{ > + /* iu_storage data allocated in initialize_event_pool */ > + unsigned long io_entitlement = max_requests * sizeof(union viosrp_iu); > + > + /* add io space for sg data */ > + io_entitlement += (IBMVSCSI_MAX_SECTORS_DEFAULT * > + IBMVSCSI_CMDS_PER_LUN_DEFAULT); > + > + return IOMMU_PAGE_ALIGN(io_entitlement); > +} > + > +/** > * Called by bus code for each adapter > */ > static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id *id) > @@ -1641,7 +1672,7 @@ static int ibmvscsi_probe(struct vio_dev > hostdata->host = host; > hostdata->dev = dev; > atomic_set(&hostdata->request_limit, -1); > - hostdata->host->max_sectors = 32 * 8; /* default max I/O 32 pages */ > + hostdata->host->max_sectors = IBMVSCSI_MAX_SECTORS_DEFAULT; > > rc = ibmvscsi_ops->init_crq_queue(&hostdata->queue, hostdata, max_requests); > if (rc != 0 && rc != H_RESOURCE) { > @@ -1735,6 +1766,7 @@ static struct vio_driver ibmvscsi_driver > .id_table = ibmvscsi_device_table, > .probe = ibmvscsi_probe, > .remove = ibmvscsi_remove, > + .get_io_entitlement = ibmvscsi_get_io_entitlement, > .driver = { > .name = "ibmvscsi", > .owner = THIS_MODULE, > Index: b/drivers/scsi/ibmvscsi/ibmvscsi.h > =================================================================== > --- a/drivers/scsi/ibmvscsi/ibmvscsi.h > +++ b/drivers/scsi/ibmvscsi/ibmvscsi.h > @@ -45,6 +45,8 @@ struct Scsi_Host; > #define MAX_INDIRECT_BUFS 10 > > #define IBMVSCSI_MAX_REQUESTS_DEFAULT 100 > +#define IBMVSCSI_CMDS_PER_LUN_DEFAULT 16 > +#define IBMVSCSI_MAX_SECTORS_DEFAULT 256 /* 32 * 8 = default max I/O 32 pages */ > #define IBMVSCSI_MAX_CMDS_PER_LUN 64 > > /* ------------------------------------------------------------ > _______________________________________________ > Linuxppc-dev mailing list > Linuxppc-dev@ozlabs.org > https://ozlabs.org/mailman/listinfo/linuxppc-dev -- Brian King Linux on Power Virtualization IBM Linux Technology Center