Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 9283
b: refs/heads/master
c: 17b1445
h: refs/heads/master
i:
  9281: a5bfa7e
  9279: c80ef7c
v: v3
  • Loading branch information
Alan Cox authored and Jeff Garzik committed Sep 16, 2005
1 parent f42f33c commit 329f667
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 33 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 7a83e90b32a2b2500e0be6a5317ab411b39222c9
refs/heads/master: 17b14451fd2b187ddd6303726755a3af0a926b6c
81 changes: 49 additions & 32 deletions trunk/drivers/scsi/libata-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -4122,6 +4122,53 @@ int ata_device_add(struct ata_probe_ent *ent)
return 0;
}

/**
* ata_host_set_remove - PCI layer callback for device removal
* @host_set: ATA host set that was removed
*
* Unregister all objects associated with this host set. Free those
* objects.
*
* LOCKING:
* Inherited from calling layer (may sleep).
*/


void ata_host_set_remove(struct ata_host_set *host_set)
{
struct ata_port *ap;
unsigned int i;

for (i = 0; i < host_set->n_ports; i++) {
ap = host_set->ports[i];
scsi_remove_host(ap->host);
}

free_irq(host_set->irq, host_set);

for (i = 0; i < host_set->n_ports; i++) {
ap = host_set->ports[i];

ata_scsi_release(ap->host);

if ((ap->flags & ATA_FLAG_NO_LEGACY) == 0) {
struct ata_ioports *ioaddr = &ap->ioaddr;

if (ioaddr->cmd_addr == 0x1f0)
release_region(0x1f0, 8);
else if (ioaddr->cmd_addr == 0x170)
release_region(0x170, 8);
}

scsi_host_put(ap->host);
}

if (host_set->ops->host_stop)
host_set->ops->host_stop(host_set);

kfree(host_set);
}

/**
* ata_scsi_release - SCSI layer callback hook for host unload
* @host: libata host to be unloaded
Expand Down Expand Up @@ -4462,39 +4509,8 @@ void ata_pci_remove_one (struct pci_dev *pdev)
{
struct device *dev = pci_dev_to_dev(pdev);
struct ata_host_set *host_set = dev_get_drvdata(dev);
struct ata_port *ap;
unsigned int i;

for (i = 0; i < host_set->n_ports; i++) {
ap = host_set->ports[i];

scsi_remove_host(ap->host);
}

free_irq(host_set->irq, host_set);

for (i = 0; i < host_set->n_ports; i++) {
ap = host_set->ports[i];

ata_scsi_release(ap->host);

if ((ap->flags & ATA_FLAG_NO_LEGACY) == 0) {
struct ata_ioports *ioaddr = &ap->ioaddr;

if (ioaddr->cmd_addr == 0x1f0)
release_region(0x1f0, 8);
else if (ioaddr->cmd_addr == 0x170)
release_region(0x170, 8);
}

scsi_host_put(ap->host);
}

if (host_set->ops->host_stop)
host_set->ops->host_stop(host_set);

kfree(host_set);

ata_host_set_remove(host_set);
pci_release_regions(pdev);
pci_disable_device(pdev);
dev_set_drvdata(dev, NULL);
Expand Down Expand Up @@ -4564,6 +4580,7 @@ module_exit(ata_exit);
EXPORT_SYMBOL_GPL(ata_std_bios_param);
EXPORT_SYMBOL_GPL(ata_std_ports);
EXPORT_SYMBOL_GPL(ata_device_add);
EXPORT_SYMBOL_GPL(ata_host_set_remove);
EXPORT_SYMBOL_GPL(ata_sg_init);
EXPORT_SYMBOL_GPL(ata_sg_init_one);
EXPORT_SYMBOL_GPL(ata_qc_complete);
Expand Down
1 change: 1 addition & 0 deletions trunk/include/linux/libata.h
Original file line number Diff line number Diff line change
Expand Up @@ -393,6 +393,7 @@ extern int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_i
extern void ata_pci_remove_one (struct pci_dev *pdev);
#endif /* CONFIG_PCI */
extern int ata_device_add(struct ata_probe_ent *ent);
extern void ata_host_set_remove(struct ata_host_set *host_set);
extern int ata_scsi_detect(Scsi_Host_Template *sht);
extern int ata_scsi_ioctl(struct scsi_device *dev, int cmd, void __user *arg);
extern int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *));
Expand Down

0 comments on commit 329f667

Please sign in to comment.