diff options
| author | Russell King <rmk@flint.arm.linux.org.uk> | 2003-07-14 02:47:01 +0100 |
|---|---|---|
| committer | Russell King <rmk@flint.arm.linux.org.uk> | 2003-07-14 02:47:01 +0100 |
| commit | 2e2cede4451f3a767c6c0125a9d2322686f87f7f (patch) | |
| tree | 53b2995db7a789c47fbbd7e686d98ee4096e58d9 | |
| parent | 3139853cca4fd784d5c54a6167abba5ba6ed9e69 (diff) | |
| parent | 4e9470d653d7d4b3d482fadaecfd2909a1df2043 (diff) | |
Merge Linus' tree into PCMCIA tree.
| -rw-r--r-- | drivers/pcmcia/bulkmem.c | 6 | ||||
| -rw-r--r-- | drivers/pcmcia/cistpl.c | 4 | ||||
| -rw-r--r-- | drivers/pcmcia/cs.c | 98 | ||||
| -rw-r--r-- | drivers/pcmcia/cs_internal.h | 2 | ||||
| -rw-r--r-- | drivers/pcmcia/i82092.c | 2 | ||||
| -rw-r--r-- | drivers/pcmcia/i82365.c | 2 | ||||
| -rw-r--r-- | drivers/pcmcia/ricoh.h | 2 | ||||
| -rw-r--r-- | drivers/pcmcia/rsrc_mgr.c | 4 | ||||
| -rw-r--r-- | drivers/pcmcia/sa11xx_core.c | 2 | ||||
| -rw-r--r-- | drivers/pcmcia/tcic.c | 2 | ||||
| -rw-r--r-- | drivers/pcmcia/ti113x.h | 29 | ||||
| -rw-r--r-- | drivers/pcmcia/yenta_socket.c | 2 | ||||
| -rw-r--r-- | include/pcmcia/ss.h | 4 |
13 files changed, 67 insertions, 92 deletions
diff --git a/drivers/pcmcia/bulkmem.c b/drivers/pcmcia/bulkmem.c index 2433140a2dbf..4759c521694b 100644 --- a/drivers/pcmcia/bulkmem.c +++ b/drivers/pcmcia/bulkmem.c @@ -258,7 +258,7 @@ static int mtd_modify_window(window_handle_t win, mtd_mod_win_t *req) win->ctl.flags |= MAP_ATTRIB; win->ctl.speed = req->AccessSpeed; win->ctl.card_start = req->CardOffset; - win->sock->ss_entry->set_mem_map(win->sock, &win->ctl); + win->sock->ops->set_mem_map(win->sock, &win->ctl); return CS_SUCCESS; } @@ -271,7 +271,7 @@ static int mtd_set_vpp(client_handle_t handle, mtd_vpp_req_t *req) return CS_BAD_VPP; s = SOCKET(handle); s->socket.Vpp = req->Vpp1; - if (s->ss_entry->set_socket(s, &s->socket)) + if (s->ops->set_socket(s, &s->socket)) return CS_BAD_VPP; return CS_SUCCESS; } @@ -286,7 +286,7 @@ static int mtd_rdy_mask(client_handle_t handle, mtd_rdy_req_t *req) s->socket.csc_mask |= SS_READY; else s->socket.csc_mask &= ~SS_READY; - if (s->ss_entry->set_socket(s, &s->socket)) + if (s->ops->set_socket(s, &s->socket)) return CS_GENERAL_FAILURE; return CS_SUCCESS; } diff --git a/drivers/pcmcia/cistpl.c b/drivers/pcmcia/cistpl.c index 3dfaa5bb5882..c505a28fcf12 100644 --- a/drivers/pcmcia/cistpl.c +++ b/drivers/pcmcia/cistpl.c @@ -86,7 +86,7 @@ void release_cis_mem(struct pcmcia_socket *s) { if (s->cis_mem.sys_start != 0) { s->cis_mem.flags &= ~MAP_ACTIVE; - s->ss_entry->set_mem_map(s, &s->cis_mem); + s->ops->set_mem_map(s, &s->cis_mem); if (!(s->features & SS_CAP_STATIC_MAP)) release_mem_region(s->cis_mem.sys_start, s->map_size); iounmap(s->cis_virt); @@ -118,7 +118,7 @@ set_cis_map(struct pcmcia_socket *s, unsigned int card_offset, unsigned int flag } mem->card_start = card_offset; mem->flags = flags; - s->ss_entry->set_mem_map(s, mem); + s->ops->set_mem_map(s, mem); if (s->features & SS_CAP_STATIC_MAP) { if (s->cis_virt) iounmap(s->cis_virt); diff --git a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c index 91078d5fff0c..3dd5702c48b7 100644 --- a/drivers/pcmcia/cs.c +++ b/drivers/pcmcia/cs.c @@ -225,43 +225,6 @@ static const lookup_t service_table[] = { }; #define SERVICE_COUNT (sizeof(service_table)/sizeof(lookup_t)) -/*====================================================================== - - These functions are just shorthand for the actual low-level drivers - -======================================================================*/ - -static int get_socket_status(struct pcmcia_socket *s, int *val) -{ - return s->ss_entry->get_status(s, val); -} - -static int set_socket(struct pcmcia_socket *s, socket_state_t *state) -{ - return s->ss_entry->set_socket(s, state); -} - -static int set_io_map(struct pcmcia_socket *s, struct pccard_io_map *io) -{ - return s->ss_entry->set_io_map(s, io); -} - -static int set_mem_map(struct pcmcia_socket *s, struct pccard_mem_map *mem) -{ - return s->ss_entry->set_mem_map(s, mem); -} - -static int suspend_socket(struct pcmcia_socket *s) -{ - s->socket = dead_socket; - return s->ss_entry->suspend(s); -} - -static int init_socket(struct pcmcia_socket *s) -{ - s->socket = dead_socket; - return s->ss_entry->init(s); -} /*==================================================================== @@ -338,12 +301,14 @@ static int pcmcia_add_socket(struct class_device *class_dev) socket->erase_busy.next = socket->erase_busy.prev = &socket->erase_busy; INIT_LIST_HEAD(&socket->cis_cache); spin_lock_init(&socket->lock); + 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) @@ -373,7 +338,7 @@ static void pcmcia_remove_socket(struct class_device *class_dev) socket->clients = socket->clients->next; kfree(client); } - socket->ss_entry = NULL; + socket->ops = NULL; } static void pcmcia_release_socket(struct class_device *class_dev) @@ -388,10 +353,10 @@ static void pcmcia_release_socket(struct class_device *class_dev) */ int pcmcia_register_socket(struct pcmcia_socket *socket) { - if (!socket || !socket->ss_entry || !socket->dev.dev) + if (!socket || !socket->ops || !socket->dev.dev) return -EINVAL; - DEBUG(0, "cs: pcmcia_register_socket(0x%p)\n", socket->ss_entry); + DEBUG(0, "cs: pcmcia_register_socket(0x%p)\n", socket->ops); /* try to obtain a socket number [yes, it gets ugly if we * register more than 2^sizeof(unsigned int) pcmcia @@ -443,7 +408,7 @@ void pcmcia_unregister_socket(struct pcmcia_socket *socket) if (!socket) return; - DEBUG(0, "cs: pcmcia_unregister_socket(0x%p)\n", socket->ss_entry); + DEBUG(0, "cs: pcmcia_unregister_socket(0x%p)\n", socket->ops); init_completion(&socket->socket_released); @@ -510,7 +475,8 @@ static void shutdown_socket(struct pcmcia_socket *s) /* Blank out the socket state */ s->state &= SOCKET_PRESENT|SOCKET_SETUP_PENDING; - init_socket(s); + s->socket = dead_socket; + s->ops->init(s); s->irq.AssignedIRQ = s->irq.Config = 0; s->lock_count = 0; destroy_cis_cache(s); @@ -525,7 +491,7 @@ static void shutdown_socket(struct pcmcia_socket *s) s->socket.Vpp = 0; s->socket.Vcc = 0; s->socket.io_irq = 0; - set_socket(s, &s->socket); + s->ops->set_socket(s, &s->socket); /* */ #ifdef CONFIG_CARDBUS cb_free(s); @@ -619,16 +585,16 @@ static int socket_reset(struct pcmcia_socket *skt) int status, i; skt->socket.flags |= SS_OUTPUT_ENA | SS_RESET; - set_socket(skt, &skt->socket); + skt->ops->set_socket(skt, &skt->socket); udelay((long)reset_time); skt->socket.flags &= ~SS_RESET; - set_socket(skt, &skt->socket); + skt->ops->set_socket(skt, &skt->socket); set_current_state(TASK_UNINTERRUPTIBLE); schedule_timeout(cs_to_timeout(unreset_delay)); for (i = 0; i < unreset_limit; i++) { - get_socket_status(skt, &status); + skt->ops->get_status(skt, &status); if (!(status & SS_DETECT)) return CS_NO_CARD; @@ -648,7 +614,7 @@ static int socket_setup(struct pcmcia_socket *skt, int initial_delay) { int status, i; - get_socket_status(skt, &status); + skt->ops->get_status(skt, &status); if (!(status & SS_DETECT)) return CS_NO_CARD; @@ -656,7 +622,7 @@ static int socket_setup(struct pcmcia_socket *skt, int initial_delay) schedule_timeout(cs_to_timeout(initial_delay)); for (i = 0; i < 100; i++) { - get_socket_status(skt, &status); + skt->ops->get_status(skt, &status); if (!(status & SS_DETECT)) return CS_NO_CARD; @@ -693,7 +659,7 @@ static int socket_setup(struct pcmcia_socket *skt, int initial_delay) } skt->state |= SOCKET_PRESENT; skt->socket.flags = SS_DEBOUNCED; - set_socket(skt, &skt->socket); + skt->ops->set_socket(skt, &skt->socket); /* * Wait "vcc_settle" for the supply to stabilise. @@ -739,7 +705,8 @@ static int socket_suspend(struct pcmcia_socket *skt) return CS_IN_USE; send_event(skt, CS_EVENT_PM_SUSPEND, CS_EVENT_PRI_LOW); - suspend_socket(skt); + skt->socket = dead_socket; + skt->ops->suspend(skt); skt->state |= SOCKET_SUSPEND; return CS_SUCCESS; @@ -757,7 +724,8 @@ static int socket_resume(struct pcmcia_socket *skt) if (!(skt->state & SOCKET_SUSPEND)) return CS_IN_USE; - init_socket(skt); + skt->socket = dead_socket; + skt->ops->init(skt); ret = socket_setup(skt, resume_delay); if (ret == CS_SUCCESS) { @@ -811,7 +779,7 @@ static void socket_detect_change(struct pcmcia_socket *skt) schedule_timeout(cs_to_timeout(2)); } - get_socket_status(skt, &status); + skt->ops->get_status(skt, &status); if ((skt->state & SOCKET_PRESENT) && !(status & SS_DETECT)) socket_remove(skt); @@ -1368,7 +1336,7 @@ int pcmcia_get_status(client_handle_t handle, cs_status_t *status) if (CHECK_HANDLE(handle)) return CS_BAD_HANDLE; s = SOCKET(handle); - get_socket_status(s, &val); + s->ops->get_status(s, &val); status->CardState = status->SocketState = 0; status->CardState |= (val & SS_DETECT) ? CS_EVENT_CARD_DETECT : 0; status->CardState |= (val & SS_CARDBUS) ? CS_EVENT_CB_DETECT : 0; @@ -1447,7 +1415,7 @@ int pcmcia_map_mem_page(window_handle_t win, memreq_t *req) return CS_BAD_PAGE; s = win->sock; win->ctl.card_start = req->CardOffset; - if (set_mem_map(s, &win->ctl) != 0) + if (s->ops->set_mem_map(s, &win->ctl) != 0) return CS_BAD_OFFSET; return CS_SUCCESS; } /* map_mem_page */ @@ -1480,7 +1448,7 @@ int pcmcia_modify_configuration(client_handle_t handle, c->Attributes &= ~CONF_ENABLE_IRQ; s->socket.io_irq = 0; } - set_socket(s, &s->socket); + s->ops->set_socket(s, &s->socket); } if (mod->Attributes & CONF_VCC_CHANGE_VALID) @@ -1492,7 +1460,7 @@ int pcmcia_modify_configuration(client_handle_t handle, if (mod->Vpp1 != mod->Vpp2) return CS_BAD_VPP; c->Vpp1 = c->Vpp2 = s->socket.Vpp = mod->Vpp1; - if (set_socket(s, &s->socket)) + if (s->ops->set_socket(s, &s->socket)) return CS_BAD_VPP; } else if ((mod->Attributes & CONF_VPP1_CHANGE_VALID) || (mod->Attributes & CONF_VPP2_CHANGE_VALID)) @@ -1522,7 +1490,7 @@ int pcmcia_modify_window(window_handle_t win, modwin_t *req) if (req->Attributes & WIN_USE_WAIT) win->ctl.flags |= MAP_USE_WAIT; win->ctl.speed = req->AccessSpeed; - set_mem_map(win->sock, &win->ctl); + win->sock->ops->set_mem_map(win->sock, &win->ctl); return CS_SUCCESS; } /* modify_window */ @@ -1622,7 +1590,7 @@ int pcmcia_release_configuration(client_handle_t handle) s->socket.flags = SS_OUTPUT_ENA; /* Is this correct? */ s->socket.Vpp = 0; s->socket.io_irq = 0; - set_socket(s, &s->socket); + s->ops->set_socket(s, &s->socket); } if (c->state & CONFIG_IO_REQ) for (i = 0; i < MAX_IO_WIN; i++) { @@ -1632,7 +1600,7 @@ int pcmcia_release_configuration(client_handle_t handle) if (s->io[i].Config != 0) continue; io.map = i; - set_io_map(s, &io); + s->ops->set_io_map(s, &io); } c->state &= ~CONFIG_LOCKED; } @@ -1733,7 +1701,7 @@ int pcmcia_release_window(window_handle_t win) /* Shut down memory window */ win->ctl.flags &= ~MAP_ACTIVE; - set_mem_map(s, &win->ctl); + s->ops->set_mem_map(s, &win->ctl); s->state &= ~SOCKET_WIN_REQ(win->index); /* Release system memory */ @@ -1780,7 +1748,7 @@ int pcmcia_request_configuration(client_handle_t handle, if (req->Vpp1 != req->Vpp2) return CS_BAD_VPP; s->socket.Vpp = req->Vpp1; - if (set_socket(s, &s->socket)) + if (s->ops->set_socket(s, &s->socket)) return CS_BAD_VPP; c->Vcc = req->Vcc; c->Vpp1 = c->Vpp2 = req->Vpp1; @@ -1798,7 +1766,7 @@ int pcmcia_request_configuration(client_handle_t handle, s->socket.io_irq = s->irq.AssignedIRQ; else s->socket.io_irq = 0; - set_socket(s, &s->socket); + s->ops->set_socket(s, &s->socket); s->lock_count++; /* Set up CIS configuration registers */ @@ -1863,7 +1831,7 @@ int pcmcia_request_configuration(client_handle_t handle, } iomap.start = s->io[i].BasePort; iomap.stop = iomap.start + s->io[i].NumPorts - 1; - set_io_map(s, &iomap); + s->ops->set_io_map(s, &iomap); s->io[i].Config++; } } @@ -2084,7 +2052,7 @@ int pcmcia_request_window(client_handle_t *handle, win_req_t *req, window_handle win->ctl.sys_start = win->base; win->ctl.sys_stop = win->base + win->size-1; win->ctl.card_start = 0; - if (set_mem_map(s, &win->ctl) != 0) + if (s->ops->set_mem_map(s, &win->ctl) != 0) return CS_BAD_ARGS; s->state |= SOCKET_WIN_REQ(w); diff --git a/drivers/pcmcia/cs_internal.h b/drivers/pcmcia/cs_internal.h index 55049c5d1825..ae857307a979 100644 --- a/drivers/pcmcia/cs_internal.h +++ b/drivers/pcmcia/cs_internal.h @@ -113,7 +113,7 @@ struct cis_cache_entry { (((h) == NULL) || ((h)->client_magic != CLIENT_MAGIC)) #define CHECK_SOCKET(s) \ - (((s) >= sockets) || (socket_table[s]->ss_entry == NULL)) + (((s) >= sockets) || (socket_table[s]->ops == NULL)) #define SOCKET(h) (h->Socket) #define CONFIG(h) (&SOCKET(h)->config[(h)->Function]) diff --git a/drivers/pcmcia/i82092.c b/drivers/pcmcia/i82092.c index 3da463cb8e59..1a07132f86cc 100644 --- a/drivers/pcmcia/i82092.c +++ b/drivers/pcmcia/i82092.c @@ -161,7 +161,7 @@ static int __init i82092aa_pci_probe(struct pci_dev *dev, const struct pci_devic for (i = 0; i<socket_count; i++) { sockets[i].socket.dev.dev = &dev->dev; - sockets[i].socket.ss_entry = &i82092aa_operations; + sockets[i].socket.ops = &i82092aa_operations; ret = pcmcia_register_socket(&sockets[i].socket); if (ret) { goto err_out_free_sockets; diff --git a/drivers/pcmcia/i82365.c b/drivers/pcmcia/i82365.c index 7814e207f1af..fa6ec7749998 100644 --- a/drivers/pcmcia/i82365.c +++ b/drivers/pcmcia/i82365.c @@ -1403,7 +1403,7 @@ static int __init init_i82365(void) /* register sockets with the pcmcia core */ for (i = 0; i < sockets; i++) { socket[i].socket.dev.dev = &i82365_device.dev; - socket[i].socket.ss_entry = &pcic_operations; + socket[i].socket.ops = &pcic_operations; socket[i].socket.owner = THIS_MODULE; socket[i].number = i; ret = pcmcia_register_socket(&socket[i].socket); diff --git a/drivers/pcmcia/ricoh.h b/drivers/pcmcia/ricoh.h index a36f2f339d42..dcfcbd4328b3 100644 --- a/drivers/pcmcia/ricoh.h +++ b/drivers/pcmcia/ricoh.h @@ -161,7 +161,7 @@ static int ricoh_override(struct yenta_socket *socket) rl_config(socket) |= RL5C4XX_CONFIG_PREFETCH; } - socket->socket.ss_entry->init = ricoh_init; + socket->socket.ops->init = ricoh_init; return 0; } diff --git a/drivers/pcmcia/rsrc_mgr.c b/drivers/pcmcia/rsrc_mgr.c index 9dd5e03e92ff..979f1e84217d 100644 --- a/drivers/pcmcia/rsrc_mgr.c +++ b/drivers/pcmcia/rsrc_mgr.c @@ -360,7 +360,7 @@ static int checksum(struct pcmcia_socket *s, struct resource *res) map.sys_start = res->start; map.sys_stop = res->end; map.card_start = 0; - s->ss_entry->set_mem_map(s, &map); + s->ops->set_mem_map(s, &map); /* Don't bother checking every word... */ for (i = 0; i < s->map_size; i += 44) { @@ -370,7 +370,7 @@ static int checksum(struct pcmcia_socket *s, struct resource *res) } map.flags = 0; - s->ss_entry->set_mem_map(s, &map); + s->ops->set_mem_map(s, &map); iounmap(virt); } diff --git a/drivers/pcmcia/sa11xx_core.c b/drivers/pcmcia/sa11xx_core.c index c4a1239092c2..253938655dd2 100644 --- a/drivers/pcmcia/sa11xx_core.c +++ b/drivers/pcmcia/sa11xx_core.c @@ -725,7 +725,7 @@ int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops, in struct sa1100_pcmcia_socket *skt = PCMCIA_SOCKET(i); memset(skt, 0, sizeof(*skt)); - skt->socket.ss_entry = &sa11xx_pcmcia_operations; + skt->socket.ops = &sa11xx_pcmcia_operations; skt->socket.owner = ops->owner; skt->socket.dev.dev = dev; diff --git a/drivers/pcmcia/tcic.c b/drivers/pcmcia/tcic.c index 408d6a501cb4..762da4e3715b 100644 --- a/drivers/pcmcia/tcic.c +++ b/drivers/pcmcia/tcic.c @@ -519,7 +519,7 @@ static int __init init_tcic(void) platform_device_register(&tcic_device); for (i = 0; i < sockets; i++) { - socket_table[i].socket.ss_entry = &tcic_operations; + socket_table[i].socket.ops = &tcic_operations; socket_table[i].socket.dev.dev = &tcic_device.dev; ret = pcmcia_register_socket(&socket_table[i].socket); if (ret && i) diff --git a/drivers/pcmcia/ti113x.h b/drivers/pcmcia/ti113x.h index e92158516f13..2cdb46d4eb3c 100644 --- a/drivers/pcmcia/ti113x.h +++ b/drivers/pcmcia/ti113x.h @@ -182,25 +182,30 @@ static int ti_override(struct yenta_socket *socket) /* * 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; } @@ -233,7 +238,7 @@ static int ti113x_override(struct yenta_socket *socket) if (socket->cb_irq) ti_cardctl(socket) |= TI113X_CCR_PCI_IRQ_ENA | TI113X_CCR_PCI_CSC | TI113X_CCR_PCI_IREQ; ti_override(socket); - socket->socket.ss_entry->init = ti113x_init; + socket->socket.ops->init = ti113x_init; return 0; } @@ -262,7 +267,7 @@ static int ti1250_override(struct yenta_socket *socket) if (socket->cb_irq) ti_diag(socket) |= TI1250_DIAG_PCI_CSC | TI1250_DIAG_PCI_IREQ; ti113x_override(socket); - socket->socket.ss_entry->init = ti1250_init; + socket->socket.ops->init = ti1250_init; return 0; } diff --git a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c index 2b34cc49165b..707cb7297fc5 100644 --- a/drivers/pcmcia/yenta_socket.c +++ b/drivers/pcmcia/yenta_socket.c @@ -828,7 +828,7 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i memset(socket, 0, sizeof(*socket)); /* prepare pcmcia_socket */ - socket->socket.ss_entry = ¥ta_socket_operations; + socket->socket.ops = ¥ta_socket_operations; socket->socket.dev.dev = &dev->dev; socket->socket.driver_data = socket; socket->socket.owner = THIS_MODULE; diff --git a/include/pcmcia/ss.h b/include/pcmcia/ss.h index c0891855a0b1..24cb380be518 100644 --- a/include/pcmcia/ss.h +++ b/include/pcmcia/ss.h @@ -170,7 +170,6 @@ struct region_t; struct pcmcia_socket { struct module *owner; spinlock_t lock; - struct pccard_operations * ss_entry; socket_state_t socket; u_int state; u_short functions; @@ -207,6 +206,9 @@ struct pcmcia_socket { u_char pci_irq; struct pci_dev * cb_dev; + /* socket operations */ + struct pccard_operations * ops; + /* state thread */ struct semaphore skt_sem; /* protects socket h/w state */ |
