socket->erase_busy.next = socket->erase_busy.prev = &socket->erase_busy;
INIT_LIST_HEAD(&socket->cis_cache);
spin_lock_init(&socket->lock);
- socket->socket = dead_socket;
- socket->ops->init(socket);
-
+
init_completion(&socket->thread_done);
init_waitqueue_head(&socket->thread_wait);
init_MUTEX(&socket->skt_sem);
spin_lock_init(&socket->thread_lock);
- init_socket(socket);
+
++ socket->socket = dead_socket;
++ socket->ops->init(socket);
+
ret = kernel_thread(pccardd, socket, CLONE_KERNEL);
if (ret < 0)
return ret;
/*
* If ISA interrupts don't work, then fall back to routing card
* interrupts to the PCI interrupt of the socket.
+ *
+ * Tweaking this when we are using serial PCI IRQs causes hangs
+ * --rmk
*/
if (!socket->socket.irq_mask) {
- int irqmux, devctl;
-
- printk (KERN_INFO "ti113x: Routing card interrupts to PCI\n");
+ u8 irqmux, devctl;
devctl = config_readb(socket, TI113X_DEVICE_CONTROL);
- devctl &= ~TI113X_DCR_IMODE_MASK;
+ if (devctl & TI113X_DCR_IMODE_MASK != TI12XX_DCR_IMODE_ALL_SERIAL) {
+ printk (KERN_INFO "ti113x: Routing card interrupts to PCI\n");
+
+ devctl &= ~TI113X_DCR_IMODE_MASK;
- irqmux = config_readl(socket, TI122X_IRQMUX);
- irqmux = (irqmux & ~0x0f) | 0x02; /* route INTA */
- irqmux = (irqmux & ~0xf0) | 0x20; /* route INTB */
+ irqmux = config_readl(socket, TI122X_IRQMUX);
+ irqmux = (irqmux & ~0x0f) | 0x02; /* route INTA */
+ irqmux = (irqmux & ~0xf0) | 0x20; /* route INTB */
- config_writel(socket, TI122X_IRQMUX, irqmux);
- config_writeb(socket, TI113X_DEVICE_CONTROL, devctl);
+ config_writel(socket, TI122X_IRQMUX, irqmux);
+ config_writeb(socket, TI113X_DEVICE_CONTROL, devctl);
+ }
}
+#endif
- socket->socket.ss_entry->init = ti_init;
+ socket->socket.ops->init = ti_init;
return 0;
}