diff options
Diffstat (limited to 'drivers/ide/legacy/ide-cs.c')
| -rw-r--r-- | drivers/ide/legacy/ide-cs.c | 41 |
1 files changed, 20 insertions, 21 deletions
diff --git a/drivers/ide/legacy/ide-cs.c b/drivers/ide/legacy/ide-cs.c index aa2ea3deac85..f633b6b3c7f3 100644 --- a/drivers/ide/legacy/ide-cs.c +++ b/drivers/ide/legacy/ide-cs.c | |||
| @@ -135,13 +135,17 @@ static void ide_detach(struct pcmcia_device *link) | |||
| 135 | { | 135 | { |
| 136 | ide_info_t *info = link->priv; | 136 | ide_info_t *info = link->priv; |
| 137 | ide_hwif_t *hwif = info->hwif; | 137 | ide_hwif_t *hwif = info->hwif; |
| 138 | unsigned long data_addr, ctl_addr; | ||
| 138 | 139 | ||
| 139 | DEBUG(0, "ide_detach(0x%p)\n", link); | 140 | DEBUG(0, "ide_detach(0x%p)\n", link); |
| 140 | 141 | ||
| 142 | data_addr = hwif->io_ports.data_addr; | ||
| 143 | ctl_addr = hwif->io_ports.ctl_addr; | ||
| 144 | |||
| 141 | ide_release(link); | 145 | ide_release(link); |
| 142 | 146 | ||
| 143 | release_region(hwif->io_ports.ctl_addr, 1); | 147 | release_region(ctl_addr, 1); |
| 144 | release_region(hwif->io_ports.data_addr, 8); | 148 | release_region(data_addr, 8); |
| 145 | 149 | ||
| 146 | kfree(info); | 150 | kfree(info); |
| 147 | } /* ide_detach */ | 151 | } /* ide_detach */ |
| @@ -194,6 +198,16 @@ static ide_hwif_t *idecs_register(unsigned long io, unsigned long ctl, | |||
| 194 | if (hwif->present) | 198 | if (hwif->present) |
| 195 | return hwif; | 199 | return hwif; |
| 196 | 200 | ||
| 201 | /* retry registration in case device is still spinning up */ | ||
| 202 | for (i = 0; i < 10; i++) { | ||
| 203 | msleep(100); | ||
| 204 | ide_port_scan(hwif); | ||
| 205 | if (hwif->present) | ||
| 206 | return hwif; | ||
| 207 | } | ||
| 208 | |||
| 209 | return hwif; | ||
| 210 | |||
| 197 | out_release: | 211 | out_release: |
| 198 | release_region(ctl, 1); | 212 | release_region(ctl, 1); |
| 199 | release_region(io, 8); | 213 | release_region(io, 8); |
| @@ -222,7 +236,7 @@ static int ide_config(struct pcmcia_device *link) | |||
| 222 | cistpl_cftable_entry_t dflt; | 236 | cistpl_cftable_entry_t dflt; |
| 223 | } *stk = NULL; | 237 | } *stk = NULL; |
| 224 | cistpl_cftable_entry_t *cfg; | 238 | cistpl_cftable_entry_t *cfg; |
| 225 | int i, pass, last_ret = 0, last_fn = 0, is_kme = 0; | 239 | int pass, last_ret = 0, last_fn = 0, is_kme = 0; |
| 226 | unsigned long io_base, ctl_base; | 240 | unsigned long io_base, ctl_base; |
| 227 | ide_hwif_t *hwif; | 241 | ide_hwif_t *hwif; |
| 228 | 242 | ||
| @@ -319,30 +333,15 @@ static int ide_config(struct pcmcia_device *link) | |||
| 319 | if (is_kme) | 333 | if (is_kme) |
| 320 | outb(0x81, ctl_base+1); | 334 | outb(0x81, ctl_base+1); |
| 321 | 335 | ||
| 322 | /* retry registration in case device is still spinning up */ | 336 | hwif = idecs_register(io_base, ctl_base, link->irq.AssignedIRQ, link); |
| 323 | for (i = 0; i < 10; i++) { | 337 | if (hwif == NULL && link->io.NumPorts1 == 0x20) { |
| 324 | hwif = idecs_register(io_base, ctl_base, link->irq.AssignedIRQ, link); | ||
| 325 | if (hwif) | ||
| 326 | break; | ||
| 327 | if (link->io.NumPorts1 == 0x20) { | ||
| 328 | outb(0x02, ctl_base + 0x10); | 338 | outb(0x02, ctl_base + 0x10); |
| 329 | hwif = idecs_register(io_base + 0x10, ctl_base + 0x10, | 339 | hwif = idecs_register(io_base + 0x10, ctl_base + 0x10, |
| 330 | link->irq.AssignedIRQ, link); | 340 | link->irq.AssignedIRQ, link); |
| 331 | if (hwif) { | ||
| 332 | io_base += 0x10; | ||
| 333 | ctl_base += 0x10; | ||
| 334 | break; | ||
| 335 | } | ||
| 336 | } | ||
| 337 | msleep(100); | ||
| 338 | } | 341 | } |
| 339 | 342 | ||
| 340 | if (hwif == NULL) { | 343 | if (hwif == NULL) |
| 341 | printk(KERN_NOTICE "ide-cs: ide_register() at 0x%3lx & 0x%3lx" | ||
| 342 | ", irq %u failed\n", io_base, ctl_base, | ||
| 343 | link->irq.AssignedIRQ); | ||
| 344 | goto failed; | 344 | goto failed; |
| 345 | } | ||
| 346 | 345 | ||
| 347 | info->ndev = 1; | 346 | info->ndev = 1; |
| 348 | sprintf(info->node.dev_name, "hd%c", 'a' + hwif->index * 2); | 347 | sprintf(info->node.dev_name, "hd%c", 'a' + hwif->index * 2); |
