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
|
* 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;
|
unsigned long flags;
|
||||||
|
|
||||||
DO_LOCK(flags);
|
DO_LOCK(flags);
|
||||||
|
|
||||||
#if defined(AHA152X_DEBUG)
|
#if defined(AHA152X_DEBUG)
|
||||||
if(HOSTDATA(shpnt)->debug & debug_eh) {
|
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);
|
show_queues(shpnt);
|
||||||
}
|
}
|
||||||
#endif
|
#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, &ISSUE_SC);
|
||||||
free_hard_reset_SCs(shpnt, &DISCONNECTED_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);
|
SETPORT(SCSISEQ, SCSIRSTO);
|
||||||
mdelay(256);
|
mdelay(256);
|
||||||
SETPORT(SCSISEQ, 0);
|
SETPORT(SCSISEQ, 0);
|
||||||
mdelay(DELAY);
|
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);
|
setup_expected_interrupts(shpnt);
|
||||||
if(HOSTDATA(shpnt)->commands==0)
|
if(HOSTDATA(shpnt)->commands==0)
|
||||||
|
@ -1295,6 +1294,14 @@ static int aha152x_bus_reset(Scsi_Cmnd *SCpnt)
|
||||||
return SUCCESS;
|
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
|
* 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)
|
* 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)
|
DPRINTK(debug_eh, KERN_DEBUG "scsi%d: host reset\n", shpnt->host_no);
|
||||||
struct Scsi_Host *shpnt = SCpnt->device->host;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
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, KERN_DEBUG "scsi%d: resetting ports\n", shpnt->host_no);
|
||||||
|
reset_ports(shpnt);
|
||||||
DPRINTK(debug_eh, DEBUG_LEAD "resetting ports\n", CMDINFO(SCpnt));
|
|
||||||
reset_ports(SCpnt->device->host);
|
|
||||||
|
|
||||||
return SUCCESS;
|
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"
|
* Return the "logical geometry"
|
||||||
*
|
*
|
||||||
|
@ -1431,22 +1443,18 @@ static void run(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i<ARRAY_SIZE(aha152x_host); i++) {
|
for (i = 0; i<ARRAY_SIZE(aha152x_host); i++) {
|
||||||
struct Scsi_Host *shpnt = aha152x_host[i];
|
is_complete(aha152x_host[i]);
|
||||||
if (shpnt && HOSTDATA(shpnt)->service) {
|
|
||||||
HOSTDATA(shpnt)->service=0;
|
|
||||||
is_complete(shpnt);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Interrupts handler
|
* Interrupt handler
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static irqreturn_t intr(int irqno, void *dev_id, struct pt_regs *regs)
|
static irqreturn_t intr(int irqno, void *dev_id, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct Scsi_Host *shpnt = lookup_irq(irqno);
|
struct Scsi_Host *shpnt = lookup_irq(irqno);
|
||||||
|
unsigned long flags;
|
||||||
unsigned char rev, dmacntrl0;
|
unsigned char rev, dmacntrl0;
|
||||||
|
|
||||||
if (!shpnt) {
|
if (!shpnt) {
|
||||||
|
@ -1472,23 +1480,23 @@ static irqreturn_t intr(int irqno, void *dev_id, struct pt_regs *regs)
|
||||||
if ((rev == 0xFF) && (dmacntrl0 == 0xFF))
|
if ((rev == 0xFF) && (dmacntrl0 == 0xFF))
|
||||||
return IRQ_NONE;
|
return IRQ_NONE;
|
||||||
|
|
||||||
|
if( TESTLO(DMASTAT, INTSTAT) )
|
||||||
|
return IRQ_NONE;
|
||||||
|
|
||||||
/* no more interrupts from the controller, while we're busy.
|
/* no more interrupts from the controller, while we're busy.
|
||||||
INTEN is restored by the BH handler */
|
INTEN is restored by the BH handler */
|
||||||
CLRBITS(DMACNTRL0, INTEN);
|
CLRBITS(DMACNTRL0, INTEN);
|
||||||
|
|
||||||
#if 0
|
DO_LOCK(flags);
|
||||||
/* check if there is already something to be
|
if( HOSTDATA(shpnt)->service==0 ) {
|
||||||
serviced; should not happen */
|
HOSTDATA(shpnt)->service=1;
|
||||||
if(HOSTDATA(shpnt)->service) {
|
|
||||||
printk(KERN_ERR "aha152x%d: lost interrupt (%d)\n", HOSTNO, HOSTDATA(shpnt)->service);
|
|
||||||
show_queues(shpnt);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Poke the BH handler */
|
/* Poke the BH handler */
|
||||||
HOSTDATA(shpnt)->service++;
|
|
||||||
INIT_WORK(&aha152x_tq, (void *) run, NULL);
|
INIT_WORK(&aha152x_tq, (void *) run, NULL);
|
||||||
schedule_work(&aha152x_tq);
|
schedule_work(&aha152x_tq);
|
||||||
|
}
|
||||||
|
DO_UNLOCK(flags);
|
||||||
|
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2527,7 +2535,18 @@ static void is_complete(struct Scsi_Host *shpnt)
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int pending;
|
int pending;
|
||||||
|
|
||||||
|
if(!shpnt)
|
||||||
|
return;
|
||||||
|
|
||||||
DO_LOCK(flags);
|
DO_LOCK(flags);
|
||||||
|
|
||||||
|
if( HOSTDATA(shpnt)->service==0 ) {
|
||||||
|
DO_UNLOCK(flags);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
HOSTDATA(shpnt)->service = 0;
|
||||||
|
|
||||||
if(HOSTDATA(shpnt)->in_intr) {
|
if(HOSTDATA(shpnt)->in_intr) {
|
||||||
DO_UNLOCK(flags);
|
DO_UNLOCK(flags);
|
||||||
/* aha152x_error never returns.. */
|
/* aha152x_error never returns.. */
|
||||||
|
|
|
@ -332,6 +332,6 @@ struct aha152x_setup {
|
||||||
|
|
||||||
struct Scsi_Host *aha152x_probe_one(struct aha152x_setup *);
|
struct Scsi_Host *aha152x_probe_one(struct aha152x_setup *);
|
||||||
void aha152x_release(struct Scsi_Host *);
|
void aha152x_release(struct Scsi_Host *);
|
||||||
int aha152x_host_reset(Scsi_Cmnd *);
|
int aha152x_host_reset_host(struct Scsi_Host *);
|
||||||
|
|
||||||
#endif /* _AHA152X_H */
|
#endif /* _AHA152X_H */
|
||||||
|
|
|
@ -65,27 +65,6 @@ static int jazz_esp_release(struct Scsi_Host *shost)
|
||||||
return 0;
|
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 */
|
/***************************************************************** Detection */
|
||||||
static int jazz_esp_detect(struct scsi_host_template *tpnt)
|
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;
|
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
|
* megasas_wait_for_outstanding - Wait for all outstanding cmds
|
||||||
* @instance: Adapter soft state
|
* @instance: Adapter soft state
|
||||||
|
@ -943,6 +957,7 @@ static struct scsi_host_template megasas_template = {
|
||||||
.module = THIS_MODULE,
|
.module = THIS_MODULE,
|
||||||
.name = "LSI Logic SAS based MegaRAID driver",
|
.name = "LSI Logic SAS based MegaRAID driver",
|
||||||
.proc_name = "megaraid_sas",
|
.proc_name = "megaraid_sas",
|
||||||
|
.slave_configure = megasas_slave_configure,
|
||||||
.queuecommand = megasas_queue_command,
|
.queuecommand = megasas_queue_command,
|
||||||
.eh_device_reset_handler = megasas_reset_device,
|
.eh_device_reset_handler = megasas_reset_device,
|
||||||
.eh_bus_reset_handler = megasas_reset_bus_host,
|
.eh_bus_reset_handler = megasas_reset_bus_host,
|
||||||
|
@ -1071,20 +1086,6 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd,
|
||||||
break;
|
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_READ:
|
||||||
case MFI_CMD_LD_WRITE:
|
case MFI_CMD_LD_WRITE:
|
||||||
|
|
||||||
|
|
|
@ -275,10 +275,8 @@ static int aha152x_resume(struct pcmcia_device *dev)
|
||||||
|
|
||||||
link->state &= ~DEV_SUSPEND;
|
link->state &= ~DEV_SUSPEND;
|
||||||
if (link->state & DEV_CONFIG) {
|
if (link->state & DEV_CONFIG) {
|
||||||
Scsi_Cmnd tmp;
|
|
||||||
pcmcia_request_configuration(link->handle, &link->conf);
|
pcmcia_request_configuration(link->handle, &link->conf);
|
||||||
tmp.device->host = info->host;
|
aha152x_host_reset_host(info->host);
|
||||||
aha152x_host_reset(&tmp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -1308,7 +1308,7 @@ int scsi_decide_disposition(struct scsi_cmnd *scmd)
|
||||||
* the request was not marked fast fail. Note that above,
|
* the request was not marked fast fail. Note that above,
|
||||||
* even if the request is marked fast fail, we still requeue
|
* even if the request is marked fast fail, we still requeue
|
||||||
* for queue congestion conditions (QUEUE_FULL or BUSY) */
|
* for queue congestion conditions (QUEUE_FULL or BUSY) */
|
||||||
if ((++scmd->retries) < scmd->allowed
|
if ((++scmd->retries) <= scmd->allowed
|
||||||
&& !blk_noretry_request(scmd->request)) {
|
&& !blk_noretry_request(scmd->request)) {
|
||||||
return NEEDS_RETRY;
|
return NEEDS_RETRY;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1433,7 +1433,7 @@ static void scsi_eh_flush_done_q(struct list_head *done_q)
|
||||||
list_del_init(&scmd->eh_entry);
|
list_del_init(&scmd->eh_entry);
|
||||||
if (scsi_device_online(scmd->device) &&
|
if (scsi_device_online(scmd->device) &&
|
||||||
!blk_noretry_request(scmd->request) &&
|
!blk_noretry_request(scmd->request) &&
|
||||||
(++scmd->retries < scmd->allowed)) {
|
(++scmd->retries <= scmd->allowed)) {
|
||||||
SCSI_LOG_ERROR_RECOVERY(3, printk("%s: flush"
|
SCSI_LOG_ERROR_RECOVERY(3, printk("%s: flush"
|
||||||
" retry cmd: %p\n",
|
" retry cmd: %p\n",
|
||||||
current->comm,
|
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)
|
static void scsi_softirq_done(struct request *rq)
|
||||||
{
|
{
|
||||||
struct scsi_cmnd *cmd = rq->completion_data;
|
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;
|
int disposition;
|
||||||
|
|
||||||
INIT_LIST_HEAD(&cmd->eh_entry);
|
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);
|
transport_configure_device(&sdev->sdev_gendev);
|
||||||
|
|
||||||
if (sdev->host->hostt->slave_configure)
|
if (sdev->host->hostt->slave_configure) {
|
||||||
sdev->host->hostt->slave_configure(sdev);
|
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
|
* 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 */
|
/* Search the bindings array */
|
||||||
if (likely((ids->roles & FC_RPORT_ROLE_FCP_TARGET) &&
|
if (fc_host_tgtid_bind_type(shost) != FC_TGTID_BIND_NONE) {
|
||||||
(fc_host_tgtid_bind_type(shost) != FC_TGTID_BIND_NONE))) {
|
|
||||||
|
|
||||||
/* search for a matching consistent binding */
|
/* 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;
|
srp->res_used = 1;
|
||||||
SCSI_LOG_TIMEOUT(4, printk("sg_link_reserve: size=%d\n", size));
|
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) {
|
for (k = 0; k < rsv_schp->k_use_sg; ++k, ++sg) {
|
||||||
num = sg->length;
|
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->usrflags |= (SYM_DISC_ENABLED | SYM_TAGS_ENABLED);
|
||||||
tp->usrtags = SYM_SETUP_MAX_TAG;
|
tp->usrtags = SYM_SETUP_MAX_TAG;
|
||||||
|
tp->usr_width = np->maxwide;
|
||||||
|
tp->usr_period = 9;
|
||||||
|
|
||||||
sym_nvram_setup_target(tp, i, nvram);
|
sym_nvram_setup_target(tp, i, nvram);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue