GIT d77cf4bdc222b70873e44975828fd96f44a3df37 git+ssh://master.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6.git commit d77cf4bdc222b70873e44975828fd96f44a3df37 Author: Ralf Baechle Date: Thu Feb 9 11:16:38 2006 -0500 [SCSI] Delete duplicate driver template. Stuborn as compilers are they don't like duplicate definitions. Signed-off-by: Ralf Baechle Signed-off-by: James Bottomley commit 593b2fb1d6604635ddca591063eb98252c9d430b Author: Jürgen E. Fischer Date: Sun Feb 19 00:31:51 2006 +0100 [SCSI] aha152x: fix variable use before initialisation and other bugs - change interface of the reset functions from Scsi_Cmnd to Scsi_Host. - add functions with the original interface and rename the new functions to reflect the new interface. - call these from the pcmcia driver, thereby avoiding the need to construct a (broken) Scsi_Cmnd from a Scsi_Host. - just run the bh if the interrupt is from the controller and if so ensure that it's only called once per interrupt. Signed-off-by: Juergen E. Fischer Signed-off-by: James Bottomley commit 8884efab1516613215816d48132dd724508970bf Author: Brian King Date: Fri Feb 24 17:10:04 2006 -0600 [SCSI] scsi: scsi command retries off by one fix Fix up an off by one error in calculating retries for scsi commands. This bug was discovered when an SG_IO request was sent to scsi core with retries = 0, causing the overall timeout check to go off in scsi_softirq_done. Signed-off-by: Brian King Signed-off-by: James Bottomley commit 147aab6aa22ce7775be944f8fb9932aa000dda61 Author: Christoph Hellwig Date: Fri Feb 17 12:13:48 2006 +0100 [SCSI] megaraid_sas: fix physical disk handling This patch hides the devices completely from the midlayer instead. It requires the patch to handle the slave_configure failure I posted earlier. Signed-off-by: Christoph Hellwig Signed-off-by: James Bottomley commit 938050916f57f08e20595b1fa1c1e57c2fbf7243 Author: Christoph Hellwig Date: Fri Feb 17 12:11:29 2006 +0100 [SCSI] scsi: handle ->slave_configure return value When ­>slave_configure fails the scsi midlayer should handle it. Signed-off-by: James Bottomley commit 8b097a67264ba3e10620b268979de3be6fe5e3cd Author: Andrew Vasquez Date: Tue Feb 14 14:22:14 2006 -0800 [SCSI] fc_transport: stop creating duplicate rport entries. Current fc_transport consumers initially register rports with an UNKNOWN role-state and follow-up with a call to fc_remote_port_rolechg(). Modify code in fc_remote_port_add() to scan the fc_host_rport_bindings() array for consistent bindings regardless of role-type. Original code would only scan bindings array for targets, causing duplicate fc_remote_ports/rport-X:Y-Z entries to be created for the yet-to-be-role-changed rports. Signed-off-by: Andrew Vasquez Signed-off-by: James Bottomley commit eca7be5e1899626db01ae42b0123458d6fb34930 Author: Brian King Date: Tue Feb 14 12:42:24 2006 -0600 [SCSI] sg: Remove aha1542 hack Remove a hack in the sg driver that alters the total buffer length for SG_IO commands to ensure buffers are not odd byte lengths. This breaks on the ipr driver since it requires the request_bufflen to equal the length specified in the cdb. The block layer SG_IO code does not appear to have this hack. Signed-off-by: Douglas Gilbert Signed-off-by: Brian King Signed-off-by: James Bottomley --- Signed-off-by: Andrew Morton --- drivers/scsi/aha152x.c | 85 +++++++++++++++---------- drivers/scsi/aha152x.h | 2 drivers/scsi/jazz_esp.c | 21 ------ drivers/scsi/megaraid/megaraid_sas.c | 29 ++++---- drivers/scsi/scsi_error.c | 4 - drivers/scsi/scsi_lib.c | 2 drivers/scsi/scsi_scan.c | 16 ++++ drivers/scsi/scsi_transport_fc.c | 3 drivers/scsi/sg.c | 2 scsi/pcmcia/aha152x_stub.c | 0 10 files changed, 87 insertions(+), 77 deletions(-) diff -puN drivers/scsi/aha152x.c~git-scsi-rc-fixes drivers/scsi/aha152x.c --- devel/drivers/scsi/aha152x.c~git-scsi-rc-fixes 2006-02-27 22:42:41.000000000 -0800 +++ devel-akpm/drivers/scsi/aha152x.c 2006-02-27 22:42:41.000000000 -0800 @@ -1260,16 +1260,15 @@ static void free_hard_reset_SCs(struct S * Reset the bus * */ -static int aha152x_bus_reset(Scsi_Cmnd *SCpnt) +static int aha152x_bus_reset_host(struct Scsi_Host *shpnt) { - struct Scsi_Host *shpnt = SCpnt->device->host; unsigned long flags; DO_LOCK(flags); #if defined(AHA152X_DEBUG) if(HOSTDATA(shpnt)->debug & debug_eh) { - printk(DEBUG_LEAD "aha152x_bus_reset(%p)", CMDINFO(SCpnt), SCpnt); + printk(KERN_DEBUG "scsi%d: bus reset", shpnt->host_no); show_queues(shpnt); } #endif @@ -1277,14 +1276,14 @@ static int aha152x_bus_reset(Scsi_Cmnd * free_hard_reset_SCs(shpnt, &ISSUE_SC); free_hard_reset_SCs(shpnt, &DISCONNECTED_SC); - DPRINTK(debug_eh, DEBUG_LEAD "resetting bus\n", CMDINFO(SCpnt)); + DPRINTK(debug_eh, KERN_DEBUG "scsi%d: resetting bus\n", shpnt->host_no); SETPORT(SCSISEQ, SCSIRSTO); mdelay(256); SETPORT(SCSISEQ, 0); mdelay(DELAY); - DPRINTK(debug_eh, DEBUG_LEAD "bus resetted\n", CMDINFO(SCpnt)); + DPRINTK(debug_eh, KERN_DEBUG "scsi%d: bus resetted\n", shpnt->host_no); setup_expected_interrupts(shpnt); if(HOSTDATA(shpnt)->commands==0) @@ -1295,6 +1294,14 @@ static int aha152x_bus_reset(Scsi_Cmnd * return SUCCESS; } +/* + * Reset the bus + * + */ +static int aha152x_bus_reset(Scsi_Cmnd *SCpnt) +{ + return aha152x_bus_reset_host(SCpnt->device->host); +} /* * Restore default values to the AIC-6260 registers and reset the fifos @@ -1337,23 +1344,28 @@ static void reset_ports(struct Scsi_Host * Reset the host (bus and controller) * */ -int aha152x_host_reset(Scsi_Cmnd * SCpnt) +int aha152x_host_reset_host(struct Scsi_Host *shpnt) { -#if defined(AHA152X_DEBUG) - struct Scsi_Host *shpnt = SCpnt->device->host; -#endif - - DPRINTK(debug_eh, DEBUG_LEAD "aha152x_host_reset(%p)\n", CMDINFO(SCpnt), SCpnt); + DPRINTK(debug_eh, KERN_DEBUG "scsi%d: host reset\n", shpnt->host_no); - aha152x_bus_reset(SCpnt); + aha152x_bus_reset_host(shpnt); - DPRINTK(debug_eh, DEBUG_LEAD "resetting ports\n", CMDINFO(SCpnt)); - reset_ports(SCpnt->device->host); + DPRINTK(debug_eh, KERN_DEBUG "scsi%d: resetting ports\n", shpnt->host_no); + reset_ports(shpnt); return SUCCESS; } /* + * Reset the host (bus and controller) + * + */ +static int aha152x_host_reset(Scsi_Cmnd *SCpnt) +{ + return aha152x_host_reset_host(SCpnt->device->host); +} + +/* * Return the "logical geometry" * */ @@ -1431,22 +1443,18 @@ static void run(void) { int i; for (i = 0; iservice) { - HOSTDATA(shpnt)->service=0; - is_complete(shpnt); - } + is_complete(aha152x_host[i]); } } /* - * Interrupts handler + * Interrupt handler * */ - static irqreturn_t intr(int irqno, void *dev_id, struct pt_regs *regs) { struct Scsi_Host *shpnt = lookup_irq(irqno); + unsigned long flags; unsigned char rev, dmacntrl0; if (!shpnt) { @@ -1472,23 +1480,23 @@ static irqreturn_t intr(int irqno, void if ((rev == 0xFF) && (dmacntrl0 == 0xFF)) return IRQ_NONE; + if( TESTLO(DMASTAT, INTSTAT) ) + return IRQ_NONE; + /* no more interrupts from the controller, while we're busy. INTEN is restored by the BH handler */ CLRBITS(DMACNTRL0, INTEN); -#if 0 - /* check if there is already something to be - serviced; should not happen */ - if(HOSTDATA(shpnt)->service) { - printk(KERN_ERR "aha152x%d: lost interrupt (%d)\n", HOSTNO, HOSTDATA(shpnt)->service); - show_queues(shpnt); + DO_LOCK(flags); + if( HOSTDATA(shpnt)->service==0 ) { + HOSTDATA(shpnt)->service=1; + + /* Poke the BH handler */ + INIT_WORK(&aha152x_tq, (void *) run, NULL); + schedule_work(&aha152x_tq); } -#endif - - /* Poke the BH handler */ - HOSTDATA(shpnt)->service++; - INIT_WORK(&aha152x_tq, (void *) run, NULL); - schedule_work(&aha152x_tq); + DO_UNLOCK(flags); + return IRQ_HANDLED; } @@ -2527,7 +2535,18 @@ static void is_complete(struct Scsi_Host unsigned long flags; int pending; + if(!shpnt) + return; + DO_LOCK(flags); + + if( HOSTDATA(shpnt)->service==0 ) { + DO_UNLOCK(flags); + return; + } + + HOSTDATA(shpnt)->service = 0; + if(HOSTDATA(shpnt)->in_intr) { DO_UNLOCK(flags); /* aha152x_error never returns.. */ diff -puN drivers/scsi/aha152x.h~git-scsi-rc-fixes drivers/scsi/aha152x.h --- devel/drivers/scsi/aha152x.h~git-scsi-rc-fixes 2006-02-27 22:42:41.000000000 -0800 +++ devel-akpm/drivers/scsi/aha152x.h 2006-02-27 22:42:41.000000000 -0800 @@ -332,6 +332,6 @@ struct aha152x_setup { struct Scsi_Host *aha152x_probe_one(struct aha152x_setup *); void aha152x_release(struct Scsi_Host *); -int aha152x_host_reset(Scsi_Cmnd *); +int aha152x_host_reset_host(struct Scsi_Host *); #endif /* _AHA152X_H */ diff -puN drivers/scsi/jazz_esp.c~git-scsi-rc-fixes drivers/scsi/jazz_esp.c --- devel/drivers/scsi/jazz_esp.c~git-scsi-rc-fixes 2006-02-27 22:42:41.000000000 -0800 +++ devel-akpm/drivers/scsi/jazz_esp.c 2006-02-27 22:42:41.000000000 -0800 @@ -65,27 +65,6 @@ static int jazz_esp_release(struct Scsi_ return 0; } -static struct scsi_host_template driver_template = { - .proc_name = "jazz_esp", - .proc_info = &esp_proc_info, - .name = "ESP 100/100a/200", - .detect = jazz_esp_detect, - .slave_alloc = esp_slave_alloc, - .slave_destroy = esp_slave_destroy, - .release = jazz_esp_release, - .info = esp_info, - .queuecommand = esp_queue, - .eh_abort_handler = esp_abort, - .eh_bus_reset_handler = esp_reset, - .can_queue = 7, - .this_id = 7, - .sg_tablesize = SG_ALL, - .cmd_per_lun = 1, - .use_clustering = DISABLE_CLUSTERING, -}; - -#include "scsi_module.c" - /***************************************************************** Detection */ static int jazz_esp_detect(struct scsi_host_template *tpnt) { diff -puN drivers/scsi/megaraid/megaraid_sas.c~git-scsi-rc-fixes drivers/scsi/megaraid/megaraid_sas.c --- devel/drivers/scsi/megaraid/megaraid_sas.c~git-scsi-rc-fixes 2006-02-27 22:42:41.000000000 -0800 +++ devel-akpm/drivers/scsi/megaraid/megaraid_sas.c 2006-02-27 22:42:41.000000000 -0800 @@ -793,6 +793,20 @@ megasas_queue_command(struct scsi_cmnd * return 0; } +static int megasas_slave_configure(struct scsi_device *sdev) +{ + /* + * Don't export physical disk devices to the disk driver. + * + * FIXME: Currently we don't export them to the midlayer at all. + * That will be fixed once LSI engineers have audited the + * firmware for possible issues. + */ + if (sdev->channel < MEGASAS_MAX_PD_CHANNELS && sdev->type == TYPE_DISK) + return -ENXIO; + return 0; +} + /** * megasas_wait_for_outstanding - Wait for all outstanding cmds * @instance: Adapter soft state @@ -943,6 +957,7 @@ static struct scsi_host_template megasas .module = THIS_MODULE, .name = "LSI Logic SAS based MegaRAID driver", .proc_name = "megaraid_sas", + .slave_configure = megasas_slave_configure, .queuecommand = megasas_queue_command, .eh_device_reset_handler = megasas_reset_device, .eh_bus_reset_handler = megasas_reset_bus_host, @@ -1071,20 +1086,6 @@ megasas_complete_cmd(struct megasas_inst break; } - /* - * Don't export physical disk devices to mid-layer. - */ - if (!MEGASAS_IS_LOGICAL(cmd->scmd) && - (hdr->cmd_status == MFI_STAT_OK) && - (cmd->scmd->cmnd[0] == INQUIRY)) { - - if (((*(u8 *) cmd->scmd->request_buffer) & 0x1F) == - TYPE_DISK) { - cmd->scmd->result = DID_BAD_TARGET << 16; - exception = 1; - } - } - case MFI_CMD_LD_READ: case MFI_CMD_LD_WRITE: diff -puN drivers/scsi/pcmcia/aha152x_stub.c~git-scsi-rc-fixes drivers/scsi/pcmcia/aha152x_stub.c diff -puN drivers/scsi/scsi_error.c~git-scsi-rc-fixes drivers/scsi/scsi_error.c --- devel/drivers/scsi/scsi_error.c~git-scsi-rc-fixes 2006-02-27 22:42:41.000000000 -0800 +++ devel-akpm/drivers/scsi/scsi_error.c 2006-02-27 22:42:41.000000000 -0800 @@ -1308,7 +1308,7 @@ int scsi_decide_disposition(struct scsi_ * the request was not marked fast fail. Note that above, * even if the request is marked fast fail, we still requeue * for queue congestion conditions (QUEUE_FULL or BUSY) */ - if ((++scmd->retries) < scmd->allowed + if ((++scmd->retries) <= scmd->allowed && !blk_noretry_request(scmd->request)) { return NEEDS_RETRY; } else { @@ -1433,7 +1433,7 @@ void scsi_eh_flush_done_q(struct list_he list_del_init(&scmd->eh_entry); if (scsi_device_online(scmd->device) && !blk_noretry_request(scmd->request) && - (++scmd->retries < scmd->allowed)) { + (++scmd->retries <= scmd->allowed)) { SCSI_LOG_ERROR_RECOVERY(3, printk("%s: flush" " retry cmd: %p\n", current->comm, diff -puN drivers/scsi/scsi_lib.c~git-scsi-rc-fixes drivers/scsi/scsi_lib.c --- devel/drivers/scsi/scsi_lib.c~git-scsi-rc-fixes 2006-02-27 22:42:41.000000000 -0800 +++ devel-akpm/drivers/scsi/scsi_lib.c 2006-02-27 22:42:41.000000000 -0800 @@ -1498,7 +1498,7 @@ static void scsi_kill_request(struct req static void scsi_softirq_done(struct request *rq) { struct scsi_cmnd *cmd = rq->completion_data; - unsigned long wait_for = cmd->allowed * cmd->timeout_per_command; + unsigned long wait_for = (cmd->allowed + 1) * cmd->timeout_per_command; int disposition; INIT_LIST_HEAD(&cmd->eh_entry); diff -puN drivers/scsi/scsi_scan.c~git-scsi-rc-fixes drivers/scsi/scsi_scan.c --- devel/drivers/scsi/scsi_scan.c~git-scsi-rc-fixes 2006-02-27 22:42:41.000000000 -0800 +++ devel-akpm/drivers/scsi/scsi_scan.c 2006-02-27 22:42:41.000000000 -0800 @@ -752,8 +752,20 @@ static int scsi_add_lun(struct scsi_devi transport_configure_device(&sdev->sdev_gendev); - if (sdev->host->hostt->slave_configure) - sdev->host->hostt->slave_configure(sdev); + if (sdev->host->hostt->slave_configure) { + int ret = sdev->host->hostt->slave_configure(sdev); + if (ret) { + /* + * if LLDD reports slave not present, don't clutter + * console with alloc failure messages + */ + if (ret != -ENXIO) { + sdev_printk(KERN_ERR, sdev, + "failed to configure device\n"); + } + return SCSI_SCAN_NO_RESPONSE; + } + } /* * Ok, the device is now all set up, we can diff -puN drivers/scsi/scsi_transport_fc.c~git-scsi-rc-fixes drivers/scsi/scsi_transport_fc.c --- devel/drivers/scsi/scsi_transport_fc.c~git-scsi-rc-fixes 2006-02-27 22:42:41.000000000 -0800 +++ devel-akpm/drivers/scsi/scsi_transport_fc.c 2006-02-27 22:42:41.000000000 -0800 @@ -1498,8 +1498,7 @@ fc_remote_port_add(struct Scsi_Host *sho } /* Search the bindings array */ - if (likely((ids->roles & FC_RPORT_ROLE_FCP_TARGET) && - (fc_host_tgtid_bind_type(shost) != FC_TGTID_BIND_NONE))) { + if (fc_host_tgtid_bind_type(shost) != FC_TGTID_BIND_NONE) { /* search for a matching consistent binding */ diff -puN drivers/scsi/sg.c~git-scsi-rc-fixes drivers/scsi/sg.c --- devel/drivers/scsi/sg.c~git-scsi-rc-fixes 2006-02-27 22:42:41.000000000 -0800 +++ devel-akpm/drivers/scsi/sg.c 2006-02-27 22:42:41.000000000 -0800 @@ -2163,7 +2163,7 @@ sg_link_reserve(Sg_fd * sfp, Sg_request srp->res_used = 1; SCSI_LOG_TIMEOUT(4, printk("sg_link_reserve: size=%d\n", size)); - rem = size = (size + 1) & (~1); /* round to even for aha1542 */ + rem = size; for (k = 0; k < rsv_schp->k_use_sg; ++k, ++sg) { num = sg->length; _