Merge branch 'upstream-greg' of gregkh@master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev
This commit is contained in:
@@ -567,8 +567,8 @@ static int piix_sata_prereset(struct ata_port *ap)
|
|||||||
present = 1;
|
present = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
DPRINTK("ata%u: LEAVE, pcs=0x%x present_mask=0x%x\n",
|
DPRINTK("ata%u: LEAVE, pcs=0x%x present=0x%x\n",
|
||||||
ap->id, pcs, present_mask);
|
ap->id, pcs, present);
|
||||||
|
|
||||||
if (!present) {
|
if (!present) {
|
||||||
ata_port_printk(ap, KERN_INFO, "SATA port has no device.\n");
|
ata_port_printk(ap, KERN_INFO, "SATA port has no device.\n");
|
||||||
@@ -828,6 +828,7 @@ static void __devinit piix_init_sata_map(struct pci_dev *pdev,
|
|||||||
case IDE:
|
case IDE:
|
||||||
WARN_ON((i & 1) || map[i + 1] != IDE);
|
WARN_ON((i & 1) || map[i + 1] != IDE);
|
||||||
pinfo[i / 2] = piix_port_info[ich5_pata];
|
pinfo[i / 2] = piix_port_info[ich5_pata];
|
||||||
|
pinfo[i / 2].private_data = hpriv;
|
||||||
i++;
|
i++;
|
||||||
printk(" IDE IDE");
|
printk(" IDE IDE");
|
||||||
break;
|
break;
|
||||||
|
@@ -5185,28 +5185,6 @@ void ata_host_stop (struct ata_host_set *host_set)
|
|||||||
iounmap(host_set->mmio_base);
|
iounmap(host_set->mmio_base);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ata_host_remove - Unregister SCSI host structure with upper layers
|
|
||||||
* @ap: Port to unregister
|
|
||||||
* @do_unregister: 1 if we fully unregister, 0 to just stop the port
|
|
||||||
*
|
|
||||||
* LOCKING:
|
|
||||||
* Inherited from caller.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void ata_host_remove(struct ata_port *ap, unsigned int do_unregister)
|
|
||||||
{
|
|
||||||
struct Scsi_Host *sh = ap->host;
|
|
||||||
|
|
||||||
DPRINTK("ENTER\n");
|
|
||||||
|
|
||||||
if (do_unregister)
|
|
||||||
scsi_remove_host(sh);
|
|
||||||
|
|
||||||
ap->ops->port_stop(ap);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ata_dev_init - Initialize an ata_device structure
|
* ata_dev_init - Initialize an ata_device structure
|
||||||
* @dev: Device structure to initialize
|
* @dev: Device structure to initialize
|
||||||
@@ -5532,8 +5510,11 @@ int ata_device_add(const struct ata_probe_ent *ent)
|
|||||||
|
|
||||||
err_out:
|
err_out:
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
ata_host_remove(host_set->ports[i], 1);
|
struct ata_port *ap = host_set->ports[i];
|
||||||
scsi_host_put(host_set->ports[i]->host);
|
if (ap) {
|
||||||
|
ap->ops->port_stop(ap);
|
||||||
|
scsi_host_put(ap->host);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
err_free_ret:
|
err_free_ret:
|
||||||
kfree(host_set);
|
kfree(host_set);
|
||||||
@@ -5558,7 +5539,7 @@ void ata_port_detach(struct ata_port *ap)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!ap->ops->error_handler)
|
if (!ap->ops->error_handler)
|
||||||
return;
|
goto skip_eh;
|
||||||
|
|
||||||
/* tell EH we're leaving & flush EH */
|
/* tell EH we're leaving & flush EH */
|
||||||
spin_lock_irqsave(ap->lock, flags);
|
spin_lock_irqsave(ap->lock, flags);
|
||||||
@@ -5594,6 +5575,7 @@ void ata_port_detach(struct ata_port *ap)
|
|||||||
cancel_delayed_work(&ap->hotplug_task);
|
cancel_delayed_work(&ap->hotplug_task);
|
||||||
flush_workqueue(ata_aux_wq);
|
flush_workqueue(ata_aux_wq);
|
||||||
|
|
||||||
|
skip_eh:
|
||||||
/* remove the associated SCSI host */
|
/* remove the associated SCSI host */
|
||||||
scsi_remove_host(ap->host);
|
scsi_remove_host(ap->host);
|
||||||
}
|
}
|
||||||
@@ -5662,7 +5644,7 @@ int ata_scsi_release(struct Scsi_Host *host)
|
|||||||
DPRINTK("ENTER\n");
|
DPRINTK("ENTER\n");
|
||||||
|
|
||||||
ap->ops->port_disable(ap);
|
ap->ops->port_disable(ap);
|
||||||
ata_host_remove(ap, 0);
|
ap->ops->port_stop(ap);
|
||||||
|
|
||||||
DPRINTK("EXIT\n");
|
DPRINTK("EXIT\n");
|
||||||
return 1;
|
return 1;
|
||||||
|
@@ -2353,6 +2353,19 @@ static void atapi_qc_complete(struct ata_queued_cmd *qc)
|
|||||||
ata_gen_ata_desc_sense(qc);
|
ata_gen_ata_desc_sense(qc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* SCSI EH automatically locks door if sdev->locked is
|
||||||
|
* set. Sometimes door lock request continues to
|
||||||
|
* fail, for example, when no media is present. This
|
||||||
|
* creates a loop - SCSI EH issues door lock which
|
||||||
|
* fails and gets invoked again to acquire sense data
|
||||||
|
* for the failed command.
|
||||||
|
*
|
||||||
|
* If door lock fails, always clear sdev->locked to
|
||||||
|
* avoid this infinite loop.
|
||||||
|
*/
|
||||||
|
if (qc->cdb[0] == ALLOW_MEDIUM_REMOVAL)
|
||||||
|
qc->dev->sdev->locked = 0;
|
||||||
|
|
||||||
qc->scsicmd->result = SAM_STAT_CHECK_CONDITION;
|
qc->scsicmd->result = SAM_STAT_CHECK_CONDITION;
|
||||||
qc->scsidone(cmd);
|
qc->scsidone(cmd);
|
||||||
ata_qc_free(qc);
|
ata_qc_free(qc);
|
||||||
|
@@ -1106,7 +1106,6 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||||||
|
|
||||||
probe_ent->irq = pdev->irq;
|
probe_ent->irq = pdev->irq;
|
||||||
probe_ent->irq_flags = IRQF_SHARED;
|
probe_ent->irq_flags = IRQF_SHARED;
|
||||||
probe_ent->mmio_base = port_base;
|
|
||||||
probe_ent->private_data = hpriv;
|
probe_ent->private_data = hpriv;
|
||||||
|
|
||||||
hpriv->host_base = host_base;
|
hpriv->host_base = host_base;
|
||||||
|
Reference in New Issue
Block a user