Commit 8bf6845b authored by Jeff Garzik's avatar Jeff Garzik

[libata] add per-driver port init/shutdown hooks, with helper defaults

parent af4c0be5
...@@ -117,6 +117,9 @@ static struct ata_port_operations piix_pata_ops = { ...@@ -117,6 +117,9 @@ static struct ata_port_operations piix_pata_ops = {
.eng_timeout = ata_eng_timeout, .eng_timeout = ata_eng_timeout,
.irq_handler = ata_interrupt, .irq_handler = ata_interrupt,
.port_start = ata_port_start,
.port_stop = ata_port_stop,
}; };
static struct ata_port_operations piix_sata_ops = { static struct ata_port_operations piix_sata_ops = {
...@@ -137,6 +140,9 @@ static struct ata_port_operations piix_sata_ops = { ...@@ -137,6 +140,9 @@ static struct ata_port_operations piix_sata_ops = {
.eng_timeout = ata_eng_timeout, .eng_timeout = ata_eng_timeout,
.irq_handler = ata_interrupt, .irq_handler = ata_interrupt,
.port_start = ata_port_start,
.port_stop = ata_port_stop,
}; };
static struct ata_port_info piix_port_info[] = { static struct ata_port_info piix_port_info[] = {
......
...@@ -2666,6 +2666,26 @@ static void atapi_cdb_send(struct ata_port *ap) ...@@ -2666,6 +2666,26 @@ static void atapi_cdb_send(struct ata_port *ap)
goto out; goto out;
} }
int ata_port_start (struct ata_port *ap)
{
struct pci_dev *pdev = ap->host_set->pdev;
ap->prd = pci_alloc_consistent(pdev, ATA_PRD_TBL_SZ, &ap->prd_dma);
if (!ap->prd)
return -ENOMEM;
DPRINTK("prd alloc, virt %p, dma %x\n", ap->prd, ap->prd_dma);
return 0;
}
void ata_port_stop (struct ata_port *ap)
{
struct pci_dev *pdev = ap->host_set->pdev;
pci_free_consistent(pdev, ATA_PRD_TBL_SZ, ap->prd, ap->prd_dma);
}
/** /**
* ata_host_remove - * ata_host_remove -
* @ap: * @ap:
...@@ -2685,7 +2705,7 @@ static void ata_host_remove(struct ata_port *ap, unsigned int do_unregister) ...@@ -2685,7 +2705,7 @@ static void ata_host_remove(struct ata_port *ap, unsigned int do_unregister)
ata_thread_kill(ap); /* FIXME: check return val */ ata_thread_kill(ap); /* FIXME: check return val */
pci_free_consistent(ap->host_set->pdev, ATA_PRD_TBL_SZ, ap->prd, ap->prd_dma); ap->ops->port_stop(ap);
} }
/** /**
...@@ -2766,9 +2786,9 @@ static struct ata_port * ata_host_add(struct ata_probe_ent *ent, ...@@ -2766,9 +2786,9 @@ static struct ata_port * ata_host_add(struct ata_probe_ent *ent,
struct ata_host_set *host_set, struct ata_host_set *host_set,
unsigned int port_no) unsigned int port_no)
{ {
struct pci_dev *pdev = ent->pdev;
struct Scsi_Host *host; struct Scsi_Host *host;
struct ata_port *ap; struct ata_port *ap;
int rc;
DPRINTK("ENTER\n"); DPRINTK("ENTER\n");
host = scsi_host_alloc(ent->sht, sizeof(struct ata_port)); host = scsi_host_alloc(ent->sht, sizeof(struct ata_port));
...@@ -2779,10 +2799,9 @@ static struct ata_port * ata_host_add(struct ata_probe_ent *ent, ...@@ -2779,10 +2799,9 @@ static struct ata_port * ata_host_add(struct ata_probe_ent *ent,
ata_host_init(ap, host, host_set, ent, port_no); ata_host_init(ap, host, host_set, ent, port_no);
ap->prd = pci_alloc_consistent(pdev, ATA_PRD_TBL_SZ, &ap->prd_dma); rc = ap->ops->port_start(ap);
if (!ap->prd) if (rc)
goto err_out; goto err_out;
DPRINTK("prd alloc, virt %p, dma %x\n", ap->prd, ap->prd_dma);
ap->thr_pid = kernel_thread(ata_thread, ap, CLONE_FS | CLONE_FILES); ap->thr_pid = kernel_thread(ata_thread, ap, CLONE_FS | CLONE_FILES);
if (ap->thr_pid < 0) { if (ap->thr_pid < 0) {
...@@ -2794,7 +2813,7 @@ static struct ata_port * ata_host_add(struct ata_probe_ent *ent, ...@@ -2794,7 +2813,7 @@ static struct ata_port * ata_host_add(struct ata_probe_ent *ent,
return ap; return ap;
err_out_free: err_out_free:
pci_free_consistent(ap->host_set->pdev, ATA_PRD_TBL_SZ, ap->prd, ap->prd_dma); ap->ops->port_stop(ap);
err_out: err_out:
scsi_host_put(host); scsi_host_put(host);
...@@ -3276,6 +3295,8 @@ EXPORT_SYMBOL_GPL(ata_check_status_pio); ...@@ -3276,6 +3295,8 @@ EXPORT_SYMBOL_GPL(ata_check_status_pio);
EXPORT_SYMBOL_GPL(ata_check_status_mmio); EXPORT_SYMBOL_GPL(ata_check_status_mmio);
EXPORT_SYMBOL_GPL(ata_exec_command_pio); EXPORT_SYMBOL_GPL(ata_exec_command_pio);
EXPORT_SYMBOL_GPL(ata_exec_command_mmio); EXPORT_SYMBOL_GPL(ata_exec_command_mmio);
EXPORT_SYMBOL_GPL(ata_port_start);
EXPORT_SYMBOL_GPL(ata_port_stop);
EXPORT_SYMBOL_GPL(ata_interrupt); EXPORT_SYMBOL_GPL(ata_interrupt);
EXPORT_SYMBOL_GPL(ata_fill_sg); EXPORT_SYMBOL_GPL(ata_fill_sg);
EXPORT_SYMBOL_GPL(ata_bmdma_start_pio); EXPORT_SYMBOL_GPL(ata_bmdma_start_pio);
......
...@@ -105,6 +105,8 @@ static struct ata_port_operations pdc_sata_ops = { ...@@ -105,6 +105,8 @@ static struct ata_port_operations pdc_sata_ops = {
.irq_handler = pdc_interrupt, .irq_handler = pdc_interrupt,
.scr_read = pdc_sata_scr_read, .scr_read = pdc_sata_scr_read,
.scr_write = pdc_sata_scr_write, .scr_write = pdc_sata_scr_write,
.port_start = ata_port_start,
.port_stop = ata_port_stop,
}; };
static struct ata_port_operations pdc_20621_ops = { static struct ata_port_operations pdc_20621_ops = {
...@@ -121,6 +123,8 @@ static struct ata_port_operations pdc_20621_ops = { ...@@ -121,6 +123,8 @@ static struct ata_port_operations pdc_20621_ops = {
.fill_sg = ata_fill_sg, .fill_sg = ata_fill_sg,
.eng_timeout = pdc_eng_timeout, .eng_timeout = pdc_eng_timeout,
.irq_handler = pdc_interrupt, .irq_handler = pdc_interrupt,
.port_start = ata_port_start,
.port_stop = ata_port_stop,
}; };
static struct ata_port_info pdc_port_info[] = { static struct ata_port_info pdc_port_info[] = {
......
...@@ -106,6 +106,8 @@ static struct ata_port_operations sil_ops = { ...@@ -106,6 +106,8 @@ static struct ata_port_operations sil_ops = {
.irq_handler = ata_interrupt, .irq_handler = ata_interrupt,
.scr_read = sil_scr_read, .scr_read = sil_scr_read,
.scr_write = sil_scr_write, .scr_write = sil_scr_write,
.port_start = ata_port_start,
.port_stop = ata_port_stop,
}; };
static struct ata_port_info sil_port_info[] = { static struct ata_port_info sil_port_info[] = {
......
...@@ -235,6 +235,8 @@ static struct ata_port_operations k2_sata_ops = { ...@@ -235,6 +235,8 @@ static struct ata_port_operations k2_sata_ops = {
.irq_handler = ata_interrupt, .irq_handler = ata_interrupt,
.scr_read = k2_sata_scr_read, .scr_read = k2_sata_scr_read,
.scr_write = k2_sata_scr_write, .scr_write = k2_sata_scr_write,
.port_start = ata_port_start,
.port_stop = ata_port_stop,
}; };
......
...@@ -98,6 +98,9 @@ static struct ata_port_operations svia_sata_ops = { ...@@ -98,6 +98,9 @@ static struct ata_port_operations svia_sata_ops = {
.eng_timeout = ata_eng_timeout, .eng_timeout = ata_eng_timeout,
.irq_handler = ata_interrupt, .irq_handler = ata_interrupt,
.port_start = ata_port_start,
.port_stop = ata_port_stop,
}; };
static struct ata_port_info svia_port_info[] = { static struct ata_port_info svia_port_info[] = {
......
...@@ -215,6 +215,7 @@ struct ata_host_set { ...@@ -215,6 +215,7 @@ struct ata_host_set {
unsigned long irq; unsigned long irq;
void *mmio_base; void *mmio_base;
unsigned int n_ports; unsigned int n_ports;
void *private_data;
struct ata_port * ports[0]; struct ata_port * ports[0];
}; };
...@@ -264,6 +265,8 @@ struct ata_queued_cmd { ...@@ -264,6 +265,8 @@ struct ata_queued_cmd {
ata_qc_cb_t callback; ata_qc_cb_t callback;
struct semaphore sem; struct semaphore sem;
void *private_data;
}; };
struct ata_host_stats { struct ata_host_stats {
...@@ -333,6 +336,8 @@ struct ata_port { ...@@ -333,6 +336,8 @@ struct ata_port {
struct semaphore thr_sem; struct semaphore thr_sem;
struct timer_list thr_timer; struct timer_list thr_timer;
unsigned long thr_timeout; unsigned long thr_timeout;
void *private_data;
}; };
struct ata_port_operations { struct ata_port_operations {
...@@ -363,6 +368,9 @@ struct ata_port_operations { ...@@ -363,6 +368,9 @@ struct ata_port_operations {
u32 (*scr_read) (struct ata_port *ap, unsigned int sc_reg); u32 (*scr_read) (struct ata_port *ap, unsigned int sc_reg);
void (*scr_write) (struct ata_port *ap, unsigned int sc_reg, void (*scr_write) (struct ata_port *ap, unsigned int sc_reg,
u32 val); u32 val);
int (*port_start) (struct ata_port *ap);
void (*port_stop) (struct ata_port *ap);
}; };
struct ata_port_info { struct ata_port_info {
...@@ -406,6 +414,8 @@ extern u8 ata_check_status_pio(struct ata_port *ap); ...@@ -406,6 +414,8 @@ extern u8 ata_check_status_pio(struct ata_port *ap);
extern u8 ata_check_status_mmio(struct ata_port *ap); extern u8 ata_check_status_mmio(struct ata_port *ap);
extern void ata_exec_command_pio(struct ata_port *ap, struct ata_taskfile *tf); extern void ata_exec_command_pio(struct ata_port *ap, struct ata_taskfile *tf);
extern void ata_exec_command_mmio(struct ata_port *ap, struct ata_taskfile *tf); extern void ata_exec_command_mmio(struct ata_port *ap, struct ata_taskfile *tf);
extern int ata_port_start (struct ata_port *ap);
extern void ata_port_stop (struct ata_port *ap);
extern irqreturn_t ata_interrupt (int irq, void *dev_instance, struct pt_regs *regs); extern irqreturn_t ata_interrupt (int irq, void *dev_instance, struct pt_regs *regs);
extern void ata_fill_sg(struct ata_queued_cmd *qc); extern void ata_fill_sg(struct ata_queued_cmd *qc);
extern void ata_bmdma_start_mmio (struct ata_queued_cmd *qc); extern void ata_bmdma_start_mmio (struct ata_queued_cmd *qc);
......
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