mirror of https://gitee.com/openkylin/linux.git
Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6
This commit is contained in:
commit
71efa38c0e
|
@ -1260,16 +1260,15 @@ static void free_hard_reset_SCs(struct Scsi_Host *shpnt, Scsi_Cmnd **SCs)
|
|||
* 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 *SCpnt)
|
|||
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 *SCpnt)
|
|||
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,22 +1344,27 @@ static void reset_ports(struct Scsi_Host *shpnt)
|
|||
* 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, KERN_DEBUG "scsi%d: host reset\n", shpnt->host_no);
|
||||
|
||||
DPRINTK(debug_eh, DEBUG_LEAD "aha152x_host_reset(%p)\n", CMDINFO(SCpnt), SCpnt);
|
||||
aha152x_bus_reset_host(shpnt);
|
||||
|
||||
aha152x_bus_reset(SCpnt);
|
||||
|
||||
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; i<ARRAY_SIZE(aha152x_host); i++) {
|
||||
struct Scsi_Host *shpnt = aha152x_host[i];
|
||||
if (shpnt && HOSTDATA(shpnt)->service) {
|
||||
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 *dev_id, struct pt_regs *regs)
|
|||
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 *shpnt)
|
|||
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.. */
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -65,27 +65,6 @@ static int jazz_esp_release(struct Scsi_Host *shost)
|
|||
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)
|
||||
{
|
||||
|
|
|
@ -793,6 +793,20 @@ megasas_queue_command(struct scsi_cmnd *scmd, void (*done) (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_template = {
|
|||
.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_instance *instance, struct megasas_cmd *cmd,
|
|||
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:
|
||||
|
||||
|
|
|
@ -275,10 +275,8 @@ static int aha152x_resume(struct pcmcia_device *dev)
|
|||
|
||||
link->state &= ~DEV_SUSPEND;
|
||||
if (link->state & DEV_CONFIG) {
|
||||
Scsi_Cmnd tmp;
|
||||
pcmcia_request_configuration(link->handle, &link->conf);
|
||||
tmp.device->host = info->host;
|
||||
aha152x_host_reset(&tmp);
|
||||
aha152x_host_reset_host(info->host);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -1308,7 +1308,7 @@ int scsi_decide_disposition(struct scsi_cmnd *scmd)
|
|||
* 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 @@ static void scsi_eh_flush_done_q(struct list_head *done_q)
|
|||
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,
|
||||
|
|
|
@ -1498,7 +1498,7 @@ static void scsi_kill_request(struct request *req, request_queue_t *q)
|
|||
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);
|
||||
|
|
|
@ -752,8 +752,20 @@ static int scsi_add_lun(struct scsi_device *sdev, char *inq_result, int *bflags)
|
|||
|
||||
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
|
||||
|
|
|
@ -1498,8 +1498,7 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel,
|
|||
}
|
||||
|
||||
/* 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 */
|
||||
|
||||
|
|
|
@ -2162,7 +2162,7 @@ sg_link_reserve(Sg_fd * sfp, Sg_request * srp, int size)
|
|||
|
||||
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;
|
||||
|
|
|
@ -919,6 +919,8 @@ static int sym_prepare_setting(struct Scsi_Host *shost, struct sym_hcb *np, stru
|
|||
|
||||
tp->usrflags |= (SYM_DISC_ENABLED | SYM_TAGS_ENABLED);
|
||||
tp->usrtags = SYM_SETUP_MAX_TAG;
|
||||
tp->usr_width = np->maxwide;
|
||||
tp->usr_period = 9;
|
||||
|
||||
sym_nvram_setup_target(tp, i, nvram);
|
||||
|
||||
|
|
Loading…
Reference in New Issue