* [PATCH 1/2] cciss: Adds simple mode functionality
@ 2011-07-27 21:38 Joe Handzik
2011-07-27 21:38 ` [PATCH 2/2] cciss: add transport mode attribute to sys Joe Handzik
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Joe Handzik @ 2011-07-27 21:38 UTC (permalink / raw)
To: axboe; +Cc: linux-kernel, stephenmcameron, scameron, akpm, mikem, thenzl
From: Joseph Handzik <joseph.t.handzik@beardog.cce.hp.com>
Signed-off-by: Joseph Handzik <joseph.t.handzik@beardog.cce.hp.com>
---
Documentation/blockdev/cciss.txt | 10 +++++++
drivers/block/cciss.c | 56 +++++++++++++++++++++++++++++++-------
drivers/block/cciss.h | 1 +
3 files changed, 56 insertions(+), 11 deletions(-)
diff --git a/Documentation/blockdev/cciss.txt b/Documentation/blockdev/cciss.txt
index c00c6a5..71464e0 100644
--- a/Documentation/blockdev/cciss.txt
+++ b/Documentation/blockdev/cciss.txt
@@ -78,6 +78,16 @@ The device naming scheme is:
/dev/cciss/c1d1p2 Controller 1, disk 1, partition 2
/dev/cciss/c1d1p3 Controller 1, disk 1, partition 3
+CCISS simple mode support
+-------------------------
+
+The "cciss_simple_mode=1" boot parameter may be used to prevent the driver
+from putting the controller into "performant" mode. The difference is that
+with simple mode, each command completion requires an interrupt, while with
+"performant mode" (the default, and ordinarily better performing) it is
+possible to have multiple command completions indicated by a single
+interrupt.
+
SCSI tape drive and medium changer support
------------------------------------------
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c
index 8f4ef65..61f0b5b 100644
--- a/drivers/block/cciss.c
+++ b/drivers/block/cciss.c
@@ -68,6 +68,10 @@ static int cciss_tape_cmds = 6;
module_param(cciss_tape_cmds, int, 0644);
MODULE_PARM_DESC(cciss_tape_cmds,
"number of commands to allocate for tape devices (default: 6)");
+static int cciss_simple_mode;
+module_param(cciss_simple_mode, int, S_IRUGO|S_IWUSR);
+MODULE_PARM_DESC(cciss_simple_mode,
+ "Use 'simple mode' rather than 'performant mode'");
static DEFINE_MUTEX(cciss_mutex);
static struct proc_dir_entry *proc_cciss;
@@ -176,6 +180,7 @@ static void cciss_geometry_inquiry(ctlr_info_t *h, int logvol,
unsigned int block_size, InquiryData_struct *inq_buff,
drive_info_struct *drv);
static void __devinit cciss_interrupt_mode(ctlr_info_t *);
+static int __devinit cciss_enter_simple_mode(struct ctlr_info *h);
static void start_io(ctlr_info_t *h);
static int sendcmd_withirq(ctlr_info_t *h, __u8 cmd, void *buff, size_t size,
__u8 page_code, unsigned char scsi3addr[],
@@ -388,7 +393,7 @@ static void cciss_seq_show_header(struct seq_file *seq)
h->product_name,
(unsigned long)h->board_id,
h->firm_ver[0], h->firm_ver[1], h->firm_ver[2],
- h->firm_ver[3], (unsigned int)h->intr[PERF_MODE_INT],
+ h->firm_ver[3], (unsigned int)h->intr[h->intr_mode],
h->num_luns,
h->Qdepth, h->commands_outstanding,
h->maxQsinceinit, h->max_outstanding, h->maxSG);
@@ -3984,6 +3989,9 @@ static void __devinit cciss_put_controller_into_performant_mode(ctlr_info_t *h)
{
__u32 trans_support;
+ if (cciss_simple_mode)
+ return;
+
dev_dbg(&h->pdev->dev, "Trying to put board into Performant mode\n");
/* Attempt to put controller into performant mode if supported */
/* Does board support performant mode? */
@@ -4081,7 +4089,7 @@ static void __devinit cciss_interrupt_mode(ctlr_info_t *h)
default_int_mode:
#endif /* CONFIG_PCI_MSI */
/* if we get here we're going to use the default interrupt mode */
- h->intr[PERF_MODE_INT] = h->pdev->irq;
+ h->intr[h->intr_mode] = h->pdev->irq;
return;
}
@@ -4341,6 +4349,9 @@ static int __devinit cciss_pci_init(ctlr_info_t *h)
}
cciss_enable_scsi_prefetch(h);
cciss_p600_dma_prefetch_quirk(h);
+ err = cciss_enter_simple_mode(h);
+ if (err)
+ goto err_out_free_res;
cciss_put_controller_into_performant_mode(h);
return 0;
@@ -4843,20 +4854,20 @@ static int cciss_request_irq(ctlr_info_t *h,
irqreturn_t (*intxhandler)(int, void *))
{
if (h->msix_vector || h->msi_vector) {
- if (!request_irq(h->intr[PERF_MODE_INT], msixhandler,
+ if (!request_irq(h->intr[h->intr_mode], msixhandler,
IRQF_DISABLED, h->devname, h))
return 0;
dev_err(&h->pdev->dev, "Unable to get msi irq %d"
- " for %s\n", h->intr[PERF_MODE_INT],
+ " for %s\n", h->intr[h->intr_mode],
h->devname);
return -1;
}
- if (!request_irq(h->intr[PERF_MODE_INT], intxhandler,
+ if (!request_irq(h->intr[h->intr_mode], intxhandler,
IRQF_DISABLED, h->devname, h))
return 0;
dev_err(&h->pdev->dev, "Unable to get irq %d for %s\n",
- h->intr[PERF_MODE_INT], h->devname);
+ h->intr[h->intr_mode], h->devname);
return -1;
}
@@ -4887,7 +4898,7 @@ static void cciss_undo_allocations_after_kdump_soft_reset(ctlr_info_t *h)
{
int ctlr = h->ctlr;
- free_irq(h->intr[PERF_MODE_INT], h);
+ free_irq(h->intr[h->intr_mode], h);
#ifdef CONFIG_PCI_MSI
if (h->msix_vector)
pci_disable_msix(h->pdev);
@@ -4953,6 +4964,7 @@ reinit_after_soft_reset:
h = hba[i];
h->pdev = pdev;
h->busy_initializing = 1;
+ h->intr_mode = cciss_simple_mode ? SIMPLE_MODE_INT : PERF_MODE_INT;
INIT_LIST_HEAD(&h->cmpQ);
INIT_LIST_HEAD(&h->reqQ);
mutex_init(&h->busy_shutting_down);
@@ -5009,7 +5021,7 @@ reinit_after_soft_reset:
dev_info(&h->pdev->dev, "%s: <0x%x> at PCI %s IRQ %d%s using DAC\n",
h->devname, pdev->device, pci_name(pdev),
- h->intr[PERF_MODE_INT], dac ? "" : " not");
+ h->intr[h->intr_mode], dac ? "" : " not");
if (cciss_allocate_cmd_pool(h))
goto clean4;
@@ -5056,7 +5068,7 @@ reinit_after_soft_reset:
spin_lock_irqsave(&h->lock, flags);
h->access.set_intr_mask(h, CCISS_INTR_OFF);
spin_unlock_irqrestore(&h->lock, flags);
- free_irq(h->intr[PERF_MODE_INT], h);
+ free_irq(h->intr[h->intr_mode], h);
rc = cciss_request_irq(h, cciss_msix_discard_completions,
cciss_intx_discard_completions);
if (rc) {
@@ -5133,7 +5145,7 @@ clean4:
cciss_free_cmd_pool(h);
cciss_free_scatterlists(h);
cciss_free_sg_chain_blocks(h->cmd_sg_list, h->nr_cmds);
- free_irq(h->intr[PERF_MODE_INT], h);
+ free_irq(h->intr[h->intr_mode], h);
clean2:
unregister_blkdev(h->major, h->devname);
clean1:
@@ -5172,9 +5184,31 @@ static void cciss_shutdown(struct pci_dev *pdev)
if (return_code != IO_OK)
dev_warn(&h->pdev->dev, "Error flushing cache\n");
h->access.set_intr_mask(h, CCISS_INTR_OFF);
- free_irq(h->intr[PERF_MODE_INT], h);
+ free_irq(h->intr[h->intr_mode], h);
}
+static int __devinit cciss_enter_simple_mode(struct ctlr_info *h)
+{
+ u32 trans_support;
+
+ trans_support = readl(&(h->cfgtable->TransportSupport));
+ if (!(trans_support & SIMPLE_MODE))
+ return -ENOTSUPP;
+
+ h->max_commands = readl(&(h->cfgtable->CmdsOutMax));
+ writel(CFGTBL_Trans_Simple, &(h->cfgtable->HostWrite.TransportRequest));
+ writel(CFGTBL_ChangeReq, h->vaddr + SA5_DOORBELL);
+ cciss_wait_for_mode_change_ack(h);
+ print_cfg_table(h);
+ if (!(readl(&(h->cfgtable->TransportActive)) & CFGTBL_Trans_Simple)) {
+ dev_warn(&h->pdev->dev, "unable to get board into simple mode\n");
+ return -ENODEV;
+ }
+ h->transMethod = CFGTBL_Trans_Simple;
+ return 0;
+}
+
+
static void __devexit cciss_remove_one(struct pci_dev *pdev)
{
ctlr_info_t *h;
diff --git a/drivers/block/cciss.h b/drivers/block/cciss.h
index 16b4d58..166fcd0 100644
--- a/drivers/block/cciss.h
+++ b/drivers/block/cciss.h
@@ -92,6 +92,7 @@ struct ctlr_info
unsigned int intr[4];
unsigned int msix_vector;
unsigned int msi_vector;
+ int intr_mode;
int cciss_max_sectors;
BYTE cciss_read;
BYTE cciss_write;
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH 2/2] cciss: add transport mode attribute to sys
2011-07-27 21:38 [PATCH 1/2] cciss: Adds simple mode functionality Joe Handzik
@ 2011-07-27 21:38 ` Joe Handzik
2011-08-02 19:19 ` scameron
2011-08-02 19:19 ` [PATCH 1/2] cciss: Adds simple mode functionality scameron
2011-08-03 18:32 ` Jens Axboe
2 siblings, 1 reply; 5+ messages in thread
From: Joe Handzik @ 2011-07-27 21:38 UTC (permalink / raw)
To: axboe; +Cc: linux-kernel, stephenmcameron, scameron, akpm, mikem, thenzl
From: Joseph Handzik <joseph.t.handzik@beardog.cce.hp.com>
Signed-off-by: Joseph Handzik <joseph.t.handzik@beardog.cce.hp.com>
---
.../ABI/testing/sysfs-bus-pci-devices-cciss | 7 +++++++
drivers/block/cciss.c | 13 +++++++++++++
2 files changed, 20 insertions(+), 0 deletions(-)
diff --git a/Documentation/ABI/testing/sysfs-bus-pci-devices-cciss b/Documentation/ABI/testing/sysfs-bus-pci-devices-cciss
index f5bb0a3..53d99ed 100644
--- a/Documentation/ABI/testing/sysfs-bus-pci-devices-cciss
+++ b/Documentation/ABI/testing/sysfs-bus-pci-devices-cciss
@@ -71,3 +71,10 @@ Description: Value of 1 indicates the controller can honor the reset_devices
a dump device, as kdump requires resetting the device in order
to work reliably.
+Where: /sys/bus/pci/devices/<dev>/ccissX/transport_mode
+Date: July 2011
+Kernel Version: 3.0
+Contact: iss_storagedev@hp.com
+Description: Value of "simple" indicates that the controller has been placed
+ in "simple mode". Value of "performant" indicates that the
+ controller has been placed in "performant mode".
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c
index 61f0b5b..6da7ede 100644
--- a/drivers/block/cciss.c
+++ b/drivers/block/cciss.c
@@ -641,6 +641,18 @@ static ssize_t host_store_rescan(struct device *dev,
}
static DEVICE_ATTR(rescan, S_IWUSR, NULL, host_store_rescan);
+static ssize_t host_show_transport_mode(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
+{
+ struct ctlr_info *h = to_hba(dev);
+
+ return snprintf(buf, 20, "%s\n",
+ h->transMethod & CFGTBL_Trans_Performant ?
+ "performant" : "simple");
+}
+static DEVICE_ATTR(transport_mode, S_IRUGO, host_show_transport_mode, NULL);
+
static ssize_t dev_show_unique_id(struct device *dev,
struct device_attribute *attr,
char *buf)
@@ -813,6 +825,7 @@ static DEVICE_ATTR(usage_count, S_IRUGO, cciss_show_usage_count, NULL);
static struct attribute *cciss_host_attrs[] = {
&dev_attr_rescan.attr,
&dev_attr_resettable.attr,
+ &dev_attr_transport_mode.attr,
NULL
};
^ permalink raw reply related [flat|nested] 5+ messages in thread* Re: [PATCH 2/2] cciss: add transport mode attribute to sys
2011-07-27 21:38 ` [PATCH 2/2] cciss: add transport mode attribute to sys Joe Handzik
@ 2011-08-02 19:19 ` scameron
0 siblings, 0 replies; 5+ messages in thread
From: scameron @ 2011-08-02 19:19 UTC (permalink / raw)
To: Joe Handzik; +Cc: axboe, linux-kernel, stephenmcameron, akpm, mikem, thenzl
On Wed, Jul 27, 2011 at 04:38:36PM -0500, Joe Handzik wrote:
> From: Joseph Handzik <joseph.t.handzik@beardog.cce.hp.com>
>
> Signed-off-by: Joseph Handzik <joseph.t.handzik@beardog.cce.hp.com>
looks ok to me. Ack.
-- steve
> ---
> .../ABI/testing/sysfs-bus-pci-devices-cciss | 7 +++++++
> drivers/block/cciss.c | 13 +++++++++++++
> 2 files changed, 20 insertions(+), 0 deletions(-)
>
> diff --git a/Documentation/ABI/testing/sysfs-bus-pci-devices-cciss b/Documentation/ABI/testing/sysfs-bus-pci-devices-cciss
> index f5bb0a3..53d99ed 100644
> --- a/Documentation/ABI/testing/sysfs-bus-pci-devices-cciss
> +++ b/Documentation/ABI/testing/sysfs-bus-pci-devices-cciss
> @@ -71,3 +71,10 @@ Description: Value of 1 indicates the controller can honor the reset_devices
> a dump device, as kdump requires resetting the device in order
> to work reliably.
>
> +Where: /sys/bus/pci/devices/<dev>/ccissX/transport_mode
> +Date: July 2011
> +Kernel Version: 3.0
> +Contact: iss_storagedev@hp.com
> +Description: Value of "simple" indicates that the controller has been placed
> + in "simple mode". Value of "performant" indicates that the
> + controller has been placed in "performant mode".
> diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c
> index 61f0b5b..6da7ede 100644
> --- a/drivers/block/cciss.c
> +++ b/drivers/block/cciss.c
> @@ -641,6 +641,18 @@ static ssize_t host_store_rescan(struct device *dev,
> }
> static DEVICE_ATTR(rescan, S_IWUSR, NULL, host_store_rescan);
>
> +static ssize_t host_show_transport_mode(struct device *dev,
> + struct device_attribute *attr,
> + char *buf)
> +{
> + struct ctlr_info *h = to_hba(dev);
> +
> + return snprintf(buf, 20, "%s\n",
> + h->transMethod & CFGTBL_Trans_Performant ?
> + "performant" : "simple");
> +}
> +static DEVICE_ATTR(transport_mode, S_IRUGO, host_show_transport_mode, NULL);
> +
> static ssize_t dev_show_unique_id(struct device *dev,
> struct device_attribute *attr,
> char *buf)
> @@ -813,6 +825,7 @@ static DEVICE_ATTR(usage_count, S_IRUGO, cciss_show_usage_count, NULL);
> static struct attribute *cciss_host_attrs[] = {
> &dev_attr_rescan.attr,
> &dev_attr_resettable.attr,
> + &dev_attr_transport_mode.attr,
> NULL
> };
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] cciss: Adds simple mode functionality
2011-07-27 21:38 [PATCH 1/2] cciss: Adds simple mode functionality Joe Handzik
2011-07-27 21:38 ` [PATCH 2/2] cciss: add transport mode attribute to sys Joe Handzik
@ 2011-08-02 19:19 ` scameron
2011-08-03 18:32 ` Jens Axboe
2 siblings, 0 replies; 5+ messages in thread
From: scameron @ 2011-08-02 19:19 UTC (permalink / raw)
To: Joe Handzik; +Cc: axboe, linux-kernel, stephenmcameron, akpm, mikem, thenzl
On Wed, Jul 27, 2011 at 04:38:30PM -0500, Joe Handzik wrote:
> From: Joseph Handzik <joseph.t.handzik@beardog.cce.hp.com>
>
> Signed-off-by: Joseph Handzik <joseph.t.handzik@beardog.cce.hp.com>
Looks ok to me. Ack.
-- steve
> ---
> Documentation/blockdev/cciss.txt | 10 +++++++
> drivers/block/cciss.c | 56 +++++++++++++++++++++++++++++++-------
> drivers/block/cciss.h | 1 +
> 3 files changed, 56 insertions(+), 11 deletions(-)
>
> diff --git a/Documentation/blockdev/cciss.txt b/Documentation/blockdev/cciss.txt
> index c00c6a5..71464e0 100644
> --- a/Documentation/blockdev/cciss.txt
> +++ b/Documentation/blockdev/cciss.txt
> @@ -78,6 +78,16 @@ The device naming scheme is:
> /dev/cciss/c1d1p2 Controller 1, disk 1, partition 2
> /dev/cciss/c1d1p3 Controller 1, disk 1, partition 3
>
> +CCISS simple mode support
> +-------------------------
> +
> +The "cciss_simple_mode=1" boot parameter may be used to prevent the driver
> +from putting the controller into "performant" mode. The difference is that
> +with simple mode, each command completion requires an interrupt, while with
> +"performant mode" (the default, and ordinarily better performing) it is
> +possible to have multiple command completions indicated by a single
> +interrupt.
> +
> SCSI tape drive and medium changer support
> ------------------------------------------
>
> diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c
> index 8f4ef65..61f0b5b 100644
> --- a/drivers/block/cciss.c
> +++ b/drivers/block/cciss.c
> @@ -68,6 +68,10 @@ static int cciss_tape_cmds = 6;
> module_param(cciss_tape_cmds, int, 0644);
> MODULE_PARM_DESC(cciss_tape_cmds,
> "number of commands to allocate for tape devices (default: 6)");
> +static int cciss_simple_mode;
> +module_param(cciss_simple_mode, int, S_IRUGO|S_IWUSR);
> +MODULE_PARM_DESC(cciss_simple_mode,
> + "Use 'simple mode' rather than 'performant mode'");
>
> static DEFINE_MUTEX(cciss_mutex);
> static struct proc_dir_entry *proc_cciss;
> @@ -176,6 +180,7 @@ static void cciss_geometry_inquiry(ctlr_info_t *h, int logvol,
> unsigned int block_size, InquiryData_struct *inq_buff,
> drive_info_struct *drv);
> static void __devinit cciss_interrupt_mode(ctlr_info_t *);
> +static int __devinit cciss_enter_simple_mode(struct ctlr_info *h);
> static void start_io(ctlr_info_t *h);
> static int sendcmd_withirq(ctlr_info_t *h, __u8 cmd, void *buff, size_t size,
> __u8 page_code, unsigned char scsi3addr[],
> @@ -388,7 +393,7 @@ static void cciss_seq_show_header(struct seq_file *seq)
> h->product_name,
> (unsigned long)h->board_id,
> h->firm_ver[0], h->firm_ver[1], h->firm_ver[2],
> - h->firm_ver[3], (unsigned int)h->intr[PERF_MODE_INT],
> + h->firm_ver[3], (unsigned int)h->intr[h->intr_mode],
> h->num_luns,
> h->Qdepth, h->commands_outstanding,
> h->maxQsinceinit, h->max_outstanding, h->maxSG);
> @@ -3984,6 +3989,9 @@ static void __devinit cciss_put_controller_into_performant_mode(ctlr_info_t *h)
> {
> __u32 trans_support;
>
> + if (cciss_simple_mode)
> + return;
> +
> dev_dbg(&h->pdev->dev, "Trying to put board into Performant mode\n");
> /* Attempt to put controller into performant mode if supported */
> /* Does board support performant mode? */
> @@ -4081,7 +4089,7 @@ static void __devinit cciss_interrupt_mode(ctlr_info_t *h)
> default_int_mode:
> #endif /* CONFIG_PCI_MSI */
> /* if we get here we're going to use the default interrupt mode */
> - h->intr[PERF_MODE_INT] = h->pdev->irq;
> + h->intr[h->intr_mode] = h->pdev->irq;
> return;
> }
>
> @@ -4341,6 +4349,9 @@ static int __devinit cciss_pci_init(ctlr_info_t *h)
> }
> cciss_enable_scsi_prefetch(h);
> cciss_p600_dma_prefetch_quirk(h);
> + err = cciss_enter_simple_mode(h);
> + if (err)
> + goto err_out_free_res;
> cciss_put_controller_into_performant_mode(h);
> return 0;
>
> @@ -4843,20 +4854,20 @@ static int cciss_request_irq(ctlr_info_t *h,
> irqreturn_t (*intxhandler)(int, void *))
> {
> if (h->msix_vector || h->msi_vector) {
> - if (!request_irq(h->intr[PERF_MODE_INT], msixhandler,
> + if (!request_irq(h->intr[h->intr_mode], msixhandler,
> IRQF_DISABLED, h->devname, h))
> return 0;
> dev_err(&h->pdev->dev, "Unable to get msi irq %d"
> - " for %s\n", h->intr[PERF_MODE_INT],
> + " for %s\n", h->intr[h->intr_mode],
> h->devname);
> return -1;
> }
>
> - if (!request_irq(h->intr[PERF_MODE_INT], intxhandler,
> + if (!request_irq(h->intr[h->intr_mode], intxhandler,
> IRQF_DISABLED, h->devname, h))
> return 0;
> dev_err(&h->pdev->dev, "Unable to get irq %d for %s\n",
> - h->intr[PERF_MODE_INT], h->devname);
> + h->intr[h->intr_mode], h->devname);
> return -1;
> }
>
> @@ -4887,7 +4898,7 @@ static void cciss_undo_allocations_after_kdump_soft_reset(ctlr_info_t *h)
> {
> int ctlr = h->ctlr;
>
> - free_irq(h->intr[PERF_MODE_INT], h);
> + free_irq(h->intr[h->intr_mode], h);
> #ifdef CONFIG_PCI_MSI
> if (h->msix_vector)
> pci_disable_msix(h->pdev);
> @@ -4953,6 +4964,7 @@ reinit_after_soft_reset:
> h = hba[i];
> h->pdev = pdev;
> h->busy_initializing = 1;
> + h->intr_mode = cciss_simple_mode ? SIMPLE_MODE_INT : PERF_MODE_INT;
> INIT_LIST_HEAD(&h->cmpQ);
> INIT_LIST_HEAD(&h->reqQ);
> mutex_init(&h->busy_shutting_down);
> @@ -5009,7 +5021,7 @@ reinit_after_soft_reset:
>
> dev_info(&h->pdev->dev, "%s: <0x%x> at PCI %s IRQ %d%s using DAC\n",
> h->devname, pdev->device, pci_name(pdev),
> - h->intr[PERF_MODE_INT], dac ? "" : " not");
> + h->intr[h->intr_mode], dac ? "" : " not");
>
> if (cciss_allocate_cmd_pool(h))
> goto clean4;
> @@ -5056,7 +5068,7 @@ reinit_after_soft_reset:
> spin_lock_irqsave(&h->lock, flags);
> h->access.set_intr_mask(h, CCISS_INTR_OFF);
> spin_unlock_irqrestore(&h->lock, flags);
> - free_irq(h->intr[PERF_MODE_INT], h);
> + free_irq(h->intr[h->intr_mode], h);
> rc = cciss_request_irq(h, cciss_msix_discard_completions,
> cciss_intx_discard_completions);
> if (rc) {
> @@ -5133,7 +5145,7 @@ clean4:
> cciss_free_cmd_pool(h);
> cciss_free_scatterlists(h);
> cciss_free_sg_chain_blocks(h->cmd_sg_list, h->nr_cmds);
> - free_irq(h->intr[PERF_MODE_INT], h);
> + free_irq(h->intr[h->intr_mode], h);
> clean2:
> unregister_blkdev(h->major, h->devname);
> clean1:
> @@ -5172,9 +5184,31 @@ static void cciss_shutdown(struct pci_dev *pdev)
> if (return_code != IO_OK)
> dev_warn(&h->pdev->dev, "Error flushing cache\n");
> h->access.set_intr_mask(h, CCISS_INTR_OFF);
> - free_irq(h->intr[PERF_MODE_INT], h);
> + free_irq(h->intr[h->intr_mode], h);
> }
>
> +static int __devinit cciss_enter_simple_mode(struct ctlr_info *h)
> +{
> + u32 trans_support;
> +
> + trans_support = readl(&(h->cfgtable->TransportSupport));
> + if (!(trans_support & SIMPLE_MODE))
> + return -ENOTSUPP;
> +
> + h->max_commands = readl(&(h->cfgtable->CmdsOutMax));
> + writel(CFGTBL_Trans_Simple, &(h->cfgtable->HostWrite.TransportRequest));
> + writel(CFGTBL_ChangeReq, h->vaddr + SA5_DOORBELL);
> + cciss_wait_for_mode_change_ack(h);
> + print_cfg_table(h);
> + if (!(readl(&(h->cfgtable->TransportActive)) & CFGTBL_Trans_Simple)) {
> + dev_warn(&h->pdev->dev, "unable to get board into simple mode\n");
> + return -ENODEV;
> + }
> + h->transMethod = CFGTBL_Trans_Simple;
> + return 0;
> +}
> +
> +
> static void __devexit cciss_remove_one(struct pci_dev *pdev)
> {
> ctlr_info_t *h;
> diff --git a/drivers/block/cciss.h b/drivers/block/cciss.h
> index 16b4d58..166fcd0 100644
> --- a/drivers/block/cciss.h
> +++ b/drivers/block/cciss.h
> @@ -92,6 +92,7 @@ struct ctlr_info
> unsigned int intr[4];
> unsigned int msix_vector;
> unsigned int msi_vector;
> + int intr_mode;
> int cciss_max_sectors;
> BYTE cciss_read;
> BYTE cciss_write;
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: [PATCH 1/2] cciss: Adds simple mode functionality
2011-07-27 21:38 [PATCH 1/2] cciss: Adds simple mode functionality Joe Handzik
2011-07-27 21:38 ` [PATCH 2/2] cciss: add transport mode attribute to sys Joe Handzik
2011-08-02 19:19 ` [PATCH 1/2] cciss: Adds simple mode functionality scameron
@ 2011-08-03 18:32 ` Jens Axboe
2 siblings, 0 replies; 5+ messages in thread
From: Jens Axboe @ 2011-08-03 18:32 UTC (permalink / raw)
To: Joe Handzik; +Cc: linux-kernel, stephenmcameron, scameron, akpm, mikem, thenzl
On 2011-07-27 23:38, Joe Handzik wrote:
> From: Joseph Handzik <joseph.t.handzik@beardog.cce.hp.com>
I'll add these for 3.2 with Stephens ack.
--
Jens Axboe
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2011-08-03 18:32 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-07-27 21:38 [PATCH 1/2] cciss: Adds simple mode functionality Joe Handzik
2011-07-27 21:38 ` [PATCH 2/2] cciss: add transport mode attribute to sys Joe Handzik
2011-08-02 19:19 ` scameron
2011-08-02 19:19 ` [PATCH 1/2] cciss: Adds simple mode functionality scameron
2011-08-03 18:32 ` Jens Axboe
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox