Commit 897e11a4 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Merge branch 'upstream-greg' of...

Merge branch 'upstream-greg' of gregkh@master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev
parents ad552692 22aac089
...@@ -567,8 +567,8 @@ static int piix_sata_prereset(struct ata_port *ap) ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment