Commit e004aaa1 authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://bk.arm.linux.org.uk/linux-2.6-pcmcia

into ppc970.osdl.org:/home/torvalds/v2.5/linux
parents 92c06c66 b528e0d6
......@@ -26,6 +26,25 @@ config PCMCIA
To compile this driver as modules, choose M here: the
modules will be called pcmcia_core and ds.
config PCMCIA_DEBUG
bool "Enable PCMCIA debugging"
depends on PCMCIA != n
help
Say Y here to enable PCMCIA subsystem debugging. You
will need to choose the debugging level either via the
kernel command line, or module options depending whether
you build the PCMCIA as modules.
The kernel command line options are:
pcmcia_core.pc_debug=N
ds.pc_debug=N
sa11xx_core.pc_debug=N
The module option is called pc_debug=N
In all the above examples, N is the debugging verbosity
level.
config YENTA
tristate "CardBus yenta-compatible bridge support"
depends on PCMCIA && PCI
......
......@@ -2,6 +2,10 @@
# Makefile for the kernel pcmcia subsystem (c/o David Hinds)
#
ifeq ($(CONFIG_PCMCIA_DEBUG),y)
EXTRA_CFLAGS += -DDEBUG
endif
obj-$(CONFIG_PCMCIA) += pcmcia_core.o ds.o
obj-$(CONFIG_YENTA) += yenta_socket.o
......
......@@ -26,6 +26,7 @@
*
*/
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/config.h>
#include <linux/delay.h>
......@@ -54,8 +55,17 @@
#include <asm/au1000.h>
#include <asm/au1000_pcmcia.h>
#ifdef PCMCIA_DEBUG
#ifdef DEBUG
static int pc_debug;
module_param(pc_debug, int, 0644);
#define debug(lvl,fmt) do { \
if (pc_debug > (lvl)) \
printk(KERN_DEBUG fmt); \
} while (0)
#else
#define debug(lvl,fmt) do { } while (0)
#endif
MODULE_LICENSE("GPL");
......@@ -209,7 +219,7 @@ static int __init au1000_pcmcia_driver_init(void)
*/
au1000_pcmcia_poll_event(0);
DEBUG(1, "au1000: initialization complete\n");
debug(1, "au1000: initialization complete\n");
return 0;
} /* au1000_pcmcia_driver_init() */
......@@ -228,7 +238,7 @@ static void __exit au1000_pcmcia_driver_shutdown(void)
if (pcmcia_socket[i].virt_io)
iounmap((void *)pcmcia_socket[i].virt_io);
}
DEBUG(1, "au1000: shutdown complete\n");
debug(1, "au1000: shutdown complete\n");
}
module_exit(au1000_pcmcia_driver_shutdown);
......@@ -249,14 +259,14 @@ au1000_pcmcia_events(struct pcmcia_state *state,
unsigned int events=0;
if(state->detect!=prev_state->detect){
DEBUG(2, "%s(): card detect value %u\n",
debug(2, "%s(): card detect value %u\n",
__FUNCTION__, state->detect);
events |= mask&SS_DETECT;
}
if(state->ready!=prev_state->ready){
DEBUG(2, "%s(): card ready value %u\n",
debug(2, "%s(): card ready value %u\n",
__FUNCTION__, state->ready);
events |= mask&((flags&SS_IOCARD)?0:SS_READY);
}
......@@ -429,7 +439,7 @@ au1000_pcmcia_get_status(unsigned int sock, unsigned int *status)
*status|=state.vs_Xv?SS_XVCARD:0;
DEBUG(2, "\tstatus: %s%s%s%s%s%s%s%s\n",
debug(2, "\tstatus: %s%s%s%s%s%s%s%s\n",
(*status&SS_DETECT)?"DETECT ":"",
(*status&SS_READY)?"READY ":"",
(*status&SS_BATDEAD)?"BATDEAD ":"",
......@@ -457,7 +467,7 @@ au1000_pcmcia_set_socket(unsigned int sock, socket_state_t *state)
{
struct pcmcia_configure configure;
DEBUG(2, "\tmask: %s%s%s%s%s%s\n\tflags: %s%s%s%s%s%s\n"
debug(2, "\tmask: %s%s%s%s%s%s\n\tflags: %s%s%s%s%s%s\n"
"\tVcc %d Vpp %d irq %d\n",
(state->csc_mask==0)?"<NONE>":"",
(state->csc_mask&SS_DETECT)?"DETECT ":"",
......@@ -494,7 +504,7 @@ au1000_pcmcia_set_socket(unsigned int sock, socket_state_t *state)
static int
au1000_pcmcia_get_io_map(unsigned int sock, struct pccard_io_map *map)
{
DEBUG(1, "au1000_pcmcia_get_io_map: sock %d\n", sock);
debug(1, "au1000_pcmcia_get_io_map: sock %d\n", sock);
if(map->map>=MAX_IO_WIN){
printk(KERN_ERR "%s(): map (%d) out of range\n",
__FUNCTION__, map->map);
......@@ -531,7 +541,7 @@ au1000_pcmcia_set_io_map(unsigned int sock, struct pccard_io_map *map)
map->start=pcmcia_socket[sock].virt_io;
map->stop=map->start+(map->stop-start);
pcmcia_socket[sock].io_map[map->map]=*map;
DEBUG(3, "set_io_map %d start %x stop %x\n",
debug(3, "set_io_map %d start %x stop %x\n",
map->map, map->start, map->stop);
return 0;
......@@ -595,7 +605,7 @@ au1000_pcmcia_set_mem_map(unsigned int sock, struct pccard_mem_map *map)
map->sys_stop=map->sys_start+(map->sys_stop-start);
pcmcia_socket[sock].mem_map[map->map]=*map;
spin_unlock_irqrestore(&pcmcia_lock, flags);
DEBUG(3, "set_mem_map %d start %x stop %x card_start %x\n",
debug(3, "set_mem_map %d start %x stop %x card_start %x\n",
map->map, map->sys_start, map->sys_stop,
map->card_start);
return 0;
......
......@@ -48,6 +48,8 @@
#include <asm/au1000.h>
#include <asm/au1000_pcmcia.h>
#define debug(fmt, arg...) do { } while (0)
#ifdef CONFIG_MIPS_PB1000
#include <asm/pb1000.h>
#define PCMCIA_IRQ AU1000_GPIO_15
......@@ -213,7 +215,7 @@ pb1x00_pcmcia_configure_socket(const struct pcmcia_configure *configure)
}
pcr &= ~PCR_SLOT_0_RST;
DEBUG(KERN_INFO "Vcc %dV Vpp %dV, pcr %x\n",
debug("Vcc %dV Vpp %dV, pcr %x\n",
configure->vcc, configure->vpp, pcr);
switch(configure->vcc){
case 0: /* Vcc 0 */
......@@ -324,7 +326,7 @@ pb1x00_pcmcia_configure_socket(const struct pcmcia_configure *configure)
pcr = au_readw(PB1100_MEM_PCMCIA) & ~0xf;
DEBUG(KERN_INFO "Vcc %dV Vpp %dV, pcr %x, reset %d\n",
debug("Vcc %dV Vpp %dV, pcr %x, reset %d\n",
configure->vcc, configure->vpp, pcr, configure->reset);
......
......@@ -48,6 +48,8 @@
#include <pcmcia/cistpl.h>
#include "cs_internal.h"
static void retry_erase_list(erase_busy_t *list, u_int cause);
/*======================================================================
This function handles submitting an MTD request, and retrying
......@@ -108,18 +110,18 @@ static int do_mtd_request(memory_handle_t handle, mtd_request_t *req,
======================================================================*/
static void insert_queue(erase_busy_t *head, erase_busy_t *entry)
static void insert_queue(struct pcmcia_socket *s, erase_busy_t *head, erase_busy_t *entry)
{
DEBUG(2, "cs: adding 0x%p to queue 0x%p\n", entry, head);
cs_dbg(s, 2, "adding 0x%p to queue 0x%p\n", entry, head);
entry->next = head;
entry->prev = head->prev;
head->prev->next = entry;
head->prev = entry;
}
static void remove_queue(erase_busy_t *entry)
static void remove_queue(struct pcmcia_socket *s, erase_busy_t *entry)
{
DEBUG(2, "cs: unqueueing 0x%p\n", entry);
cs_dbg(s, 2, "unqueueing 0x%p\n", entry);
entry->next->prev = entry->prev;
entry->prev->next = entry->next;
}
......@@ -132,34 +134,35 @@ static void retry_erase(erase_busy_t *busy, u_int cause)
struct pcmcia_socket *s;
int ret;
DEBUG(2, "cs: trying erase request 0x%p...\n", busy);
mtd = erase->Handle->mtd;
s = SOCKET(mtd);
cs_dbg(s, 2, "trying erase request 0x%p...\n", busy);
if (busy->next)
remove_queue(busy);
remove_queue(s, busy);
req.Function = MTD_REQ_ERASE | cause;
req.TransferLength = erase->Size;
req.DestCardOffset = erase->Offset + erase->Handle->info.CardOffset;
req.MediaID = erase->Handle->MediaID;
mtd = erase->Handle->mtd;
s = SOCKET(mtd);
mtd->event_callback_args.mtdrequest = &req;
ret = EVENT(mtd, CS_EVENT_MTD_REQUEST, CS_EVENT_PRI_LOW);
if (ret == CS_BUSY) {
DEBUG(2, " Status = %d, requeueing.\n", req.Status);
cs_dbg(s, 2, " Status = %d, requeueing.\n", req.Status);
switch (req.Status) {
case MTD_WAITREQ:
case MTD_WAITPOWER:
insert_queue(&mtd->erase_busy, busy);
insert_queue(s, &mtd->erase_busy, busy);
break;
case MTD_WAITTIMER:
case MTD_WAITRDY:
if (req.Status == MTD_WAITRDY)
insert_queue(&s->erase_busy, busy);
insert_queue(s, &s->erase_busy, busy);
mod_timer(&busy->timeout, jiffies + req.Timeout*HZ/1000);
break;
}
} else {
/* update erase queue status */
DEBUG(2, " Ret = %d\n", ret);
cs_dbg(s, 2, " Ret = %d\n", ret);
switch (ret) {
case CS_SUCCESS:
erase->State = ERASE_PASSED; break;
......@@ -183,11 +186,11 @@ static void retry_erase(erase_busy_t *busy, u_int cause)
}
} /* retry_erase */
void retry_erase_list(erase_busy_t *list, u_int cause)
static void retry_erase_list(erase_busy_t *list, u_int cause)
{
erase_busy_t tmp = *list;
DEBUG(2, "cs: rescanning erase queue list 0x%p\n", list);
cs_dbg(SOCKET(list->client), 2, "rescanning erase queue list 0x%p\n", list);
if (list->next == list)
return;
/* First, truncate the original list */
......@@ -204,8 +207,9 @@ void retry_erase_list(erase_busy_t *list, u_int cause)
static void handle_erase_timeout(u_long arg)
{
DEBUG(0, "cs: erase timeout for entry 0x%lx\n", arg);
retry_erase((erase_busy_t *)arg, MTD_REQ_TIMEOUT);
erase_busy_t *busy = (erase_busy_t *)arg;
cs_dbg(SOCKET(busy->client), 0, "erase timeout for entry 0x%lx\n", arg);
retry_erase(busy, MTD_REQ_TIMEOUT);
}
static void setup_erase_request(client_handle_t handle, eraseq_entry_t *erase)
......@@ -333,7 +337,7 @@ static void setup_regions(client_handle_t handle, int attr,
cistpl_device_geo_t geo;
memory_handle_t r;
DEBUG(1, "cs: setup_regions(0x%p, %d, 0x%p)\n",
cs_dbg(SOCKET(handle), 1, "setup_regions(0x%p, %d, 0x%p)\n",
handle, attr, list);
code = (attr) ? CISTPL_DEVICE_A : CISTPL_DEVICE;
......@@ -342,17 +346,13 @@ static void setup_regions(client_handle_t handle, int attr,
code = (attr) ? CISTPL_JEDEC_A : CISTPL_JEDEC_C;
has_jedec = (read_tuple(handle, code, &jedec) == CS_SUCCESS);
if (has_jedec && (device.ndev != jedec.nid)) {
#ifdef PCMCIA_DEBUG
printk(KERN_DEBUG "cs: Device info does not match JEDEC info.\n");
#endif
cs_dbg(SOCKET(handle), 0, "Device info does not match JEDEC info.\n");
has_jedec = 0;
}
code = (attr) ? CISTPL_DEVICE_GEO_A : CISTPL_DEVICE_GEO;
has_geo = (read_tuple(handle, code, &geo) == CS_SUCCESS);
if (has_geo && (device.ndev != geo.ngeo)) {
#ifdef PCMCIA_DEBUG
printk(KERN_DEBUG "cs: Device info does not match geometry tuple.\n");
#endif
cs_dbg(SOCKET(handle), 0, "Device info does not match geometry tuple.\n");
has_geo = 0;
}
......@@ -458,7 +458,7 @@ int pcmcia_register_mtd(client_handle_t handle, mtd_reg_t *reg)
list = s->a_region;
else
list = s->c_region;
DEBUG(1, "cs: register_mtd(0x%p, '%s', 0x%x)\n",
cs_dbg(s, 1, "register_mtd(0x%p, '%s', 0x%x)\n",
handle, handle->dev_info, reg->Offset);
while (list) {
if (list->info.CardOffset == reg->Offset) break;
......@@ -548,7 +548,7 @@ int pcmcia_open_memory(client_handle_t *handle, open_mem_t *open, memory_handle_
}
if (region && region->mtd) {
*mh = region;
DEBUG(1, "cs: open_memory(0x%p, 0x%x) = 0x%p\n",
cs_dbg(s, 1, "open_memory(0x%p, 0x%x) = 0x%p\n",
handle, open->Offset, region);
return CS_SUCCESS;
} else
......@@ -565,7 +565,7 @@ int pcmcia_open_memory(client_handle_t *handle, open_mem_t *open, memory_handle_
int pcmcia_close_memory(memory_handle_t handle)
{
DEBUG(1, "cs: close_memory(0x%p)\n", handle);
cs_dbg(SOCKET(handle->mtd), 1, "cs: close_memory(0x%p)\n", handle);
if (CHECK_REGION(handle))
return CS_BAD_HANDLE;
return CS_SUCCESS;
......
......@@ -58,10 +58,6 @@
#include <pcmcia/cistpl.h>
#include "cs_internal.h"
#ifdef PCMCIA_DEBUG
static int pc_debug = PCMCIA_DEBUG;
#endif
/*====================================================================*/
#define FIND_FIRST_BIT(n) ((n) - ((n) & ((n)-1)))
......@@ -119,7 +115,7 @@ static u_int xlate_rom_addr(u_char * b, u_int addr)
static void cb_release_cis_mem(struct pcmcia_socket * s)
{
if (s->cb_cis_virt) {
DEBUG(1, "cs: cb_release_cis_mem()\n");
cs_dbg(s, 1, "cb_release_cis_mem()\n");
iounmap(s->cb_cis_virt);
s->cb_cis_virt = NULL;
s->cb_cis_res = 0;
......@@ -160,7 +156,7 @@ int read_cb_mem(struct pcmcia_socket * s, int space, u_int addr, u_int len, void
struct pci_dev *dev;
struct resource *res;
DEBUG(3, "cs: read_cb_mem(%d, %#x, %u)\n", space, addr, len);
cs_dbg(s, 3, "read_cb_mem(%d, %#x, %u)\n", space, addr, len);
dev = pci_find_slot(s->cb_dev->subordinate->number, 0);
if (!dev)
......
......@@ -143,7 +143,7 @@ int read_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
{
u_char *sys, *end, *buf = ptr;
DEBUG(3, "cs: read_cis_mem(%d, %#x, %u)\n", attr, addr, len);
cs_dbg(s, 3, "read_cis_mem(%d, %#x, %u)\n", attr, addr, len);
if (attr & IS_INDIRECT) {
/* Indirect accesses use a bunch of special registers at fixed
......@@ -195,7 +195,7 @@ int read_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
addr = 0;
}
}
DEBUG(3, "cs: %#2.2x %#2.2x %#2.2x %#2.2x ...\n",
cs_dbg(s, 3, " %#2.2x %#2.2x %#2.2x %#2.2x ...\n",
*(u_char *)(ptr+0), *(u_char *)(ptr+1),
*(u_char *)(ptr+2), *(u_char *)(ptr+3));
return 0;
......@@ -206,7 +206,7 @@ void write_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
{
u_char *sys, *end, *buf = ptr;
DEBUG(3, "cs: write_cis_mem(%d, %#x, %u)\n", attr, addr, len);
cs_dbg(s, 3, "write_cis_mem(%d, %#x, %u)\n", attr, addr, len);
if (attr & IS_INDIRECT) {
/* Indirect accesses use a bunch of special registers at fixed
......@@ -578,8 +578,7 @@ int pcmcia_get_next_tuple(client_handle_t handle, tuple_t *tuple)
ofs += link[1] + 2;
}
if (i == MAX_TUPLES) {
DEBUG(1, "cs: overrun in pcmcia_get_next_tuple for socket %d\n",
handle->Socket);
cs_dbg(s, 1, "cs: overrun in pcmcia_get_next_tuple\n");
return CS_NO_MORE_ITEMS;
}
......
......@@ -32,6 +32,7 @@
======================================================================*/
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/config.h>
......@@ -110,10 +111,15 @@ INT_MODULE_PARM(cis_speed, 300); /* ns */
/* Access speed for IO windows */
INT_MODULE_PARM(io_speed, 0); /* ns */
#ifdef PCMCIA_DEBUG
INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);
static const char *version =
"cs.c 1.279 2001/10/13 00:08:28 (David Hinds)";
#ifdef DEBUG
static int pc_debug;
module_param(pc_debug, int, 0644);
int cs_debug_level(int level)
{
return pc_debug > level;
}
#endif
/*====================================================================*/
......@@ -127,103 +133,6 @@ socket_state_t dead_socket = {
LIST_HEAD(pcmcia_socket_list);
DECLARE_RWSEM(pcmcia_socket_list_rwsem);
/*====================================================================*/
/* String tables for error messages */
typedef struct lookup_t {
int key;
char *msg;
} lookup_t;
static const lookup_t error_table[] = {
{ CS_SUCCESS, "Operation succeeded" },
{ CS_BAD_ADAPTER, "Bad adapter" },
{ CS_BAD_ATTRIBUTE, "Bad attribute", },
{ CS_BAD_BASE, "Bad base address" },
{ CS_BAD_EDC, "Bad EDC" },
{ CS_BAD_IRQ, "Bad IRQ" },
{ CS_BAD_OFFSET, "Bad offset" },
{ CS_BAD_PAGE, "Bad page number" },
{ CS_READ_FAILURE, "Read failure" },
{ CS_BAD_SIZE, "Bad size" },
{ CS_BAD_SOCKET, "Bad socket" },
{ CS_BAD_TYPE, "Bad type" },
{ CS_BAD_VCC, "Bad Vcc" },
{ CS_BAD_VPP, "Bad Vpp" },
{ CS_BAD_WINDOW, "Bad window" },
{ CS_WRITE_FAILURE, "Write failure" },
{ CS_NO_CARD, "No card present" },
{ CS_UNSUPPORTED_FUNCTION, "Usupported function" },
{ CS_UNSUPPORTED_MODE, "Unsupported mode" },
{ CS_BAD_SPEED, "Bad speed" },
{ CS_BUSY, "Resource busy" },
{ CS_GENERAL_FAILURE, "General failure" },
{ CS_WRITE_PROTECTED, "Write protected" },
{ CS_BAD_ARG_LENGTH, "Bad argument length" },
{ CS_BAD_ARGS, "Bad arguments" },
{ CS_CONFIGURATION_LOCKED, "Configuration locked" },
{ CS_IN_USE, "Resource in use" },
{ CS_NO_MORE_ITEMS, "No more items" },
{ CS_OUT_OF_RESOURCE, "Out of resource" },
{ CS_BAD_HANDLE, "Bad handle" },
{ CS_BAD_TUPLE, "Bad CIS tuple" }
};
#define ERROR_COUNT (sizeof(error_table)/sizeof(lookup_t))
static const lookup_t service_table[] = {
{ AccessConfigurationRegister, "AccessConfigurationRegister" },
{ AddSocketServices, "AddSocketServices" },
{ AdjustResourceInfo, "AdjustResourceInfo" },
{ CheckEraseQueue, "CheckEraseQueue" },
{ CloseMemory, "CloseMemory" },
{ DeregisterClient, "DeregisterClient" },
{ DeregisterEraseQueue, "DeregisterEraseQueue" },
{ GetCardServicesInfo, "GetCardServicesInfo" },
{ GetClientInfo, "GetClientInfo" },
{ GetConfigurationInfo, "GetConfigurationInfo" },
{ GetEventMask, "GetEventMask" },
{ GetFirstClient, "GetFirstClient" },
{ GetFirstRegion, "GetFirstRegion" },
{ GetFirstTuple, "GetFirstTuple" },
{ GetNextClient, "GetNextClient" },
{ GetNextRegion, "GetNextRegion" },
{ GetNextTuple, "GetNextTuple" },
{ GetStatus, "GetStatus" },
{ GetTupleData, "GetTupleData" },
{ MapMemPage, "MapMemPage" },
{ ModifyConfiguration, "ModifyConfiguration" },
{ ModifyWindow, "ModifyWindow" },
{ OpenMemory, "OpenMemory" },
{ ParseTuple, "ParseTuple" },
{ ReadMemory, "ReadMemory" },
{ RegisterClient, "RegisterClient" },
{ RegisterEraseQueue, "RegisterEraseQueue" },
{ RegisterMTD, "RegisterMTD" },
{ ReleaseConfiguration, "ReleaseConfiguration" },
{ ReleaseIO, "ReleaseIO" },
{ ReleaseIRQ, "ReleaseIRQ" },
{ ReleaseWindow, "ReleaseWindow" },
{ RequestConfiguration, "RequestConfiguration" },
{ RequestIO, "RequestIO" },
{ RequestIRQ, "RequestIRQ" },
{ RequestSocketMask, "RequestSocketMask" },
{ RequestWindow, "RequestWindow" },
{ ResetCard, "ResetCard" },
{ SetEventMask, "SetEventMask" },
{ ValidateCIS, "ValidateCIS" },
{ WriteMemory, "WriteMemory" },
{ BindDevice, "BindDevice" },
{ BindMTD, "BindMTD" },
{ ReportError, "ReportError" },
{ SuspendCard, "SuspendCard" },
{ ResumeCard, "ResumeCard" },
{ EjectCard, "EjectCard" },
{ InsertCard, "InsertCard" },
{ ReplaceCIS, "ReplaceCIS" }
};
#define SERVICE_COUNT (sizeof(service_table)/sizeof(lookup_t))
/*====================================================================
......@@ -306,7 +215,7 @@ int pcmcia_register_socket(struct pcmcia_socket *socket)
if (!socket || !socket->ops || !socket->dev.dev)
return -EINVAL;
DEBUG(0, "cs: pcmcia_register_socket(0x%p)\n", socket->ops);
cs_dbg(socket, 0, "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
......@@ -377,7 +286,7 @@ void pcmcia_unregister_socket(struct pcmcia_socket *socket)
if (!socket)
return;
DEBUG(0, "cs: pcmcia_unregister_socket(0x%p)\n", socket->ops);
cs_dbg(socket, 0, "pcmcia_unregister_socket(0x%p)\n", socket->ops);
if (socket->thread) {
init_completion(&socket->thread_done);
......@@ -443,10 +352,9 @@ static void shutdown_socket(struct pcmcia_socket *s)
{
client_t **c;
DEBUG(1, "cs: shutdown_socket(%p)\n", s);
cs_dbg(s, 1, "shutdown_socket\n");
/* Blank out the socket state */
s->state &= SOCKET_PRESENT|SOCKET_INUSE;
s->socket = dead_socket;
s->ops->init(s);
s->ops->set_socket(s, &s->socket);
......@@ -499,8 +407,8 @@ static int send_event(struct pcmcia_socket *s, event_t event, int priority)
{
client_t *client = s->clients;
int ret;
DEBUG(1, "cs: send_event(sock %d, event %d, pri %d)\n",
s->sock, event, priority);
cs_dbg(s, 1, "send_event(event %d, pri %d)\n",
event, priority);
ret = 0;
if (s->state & SOCKET_CARDBUS)
return 0;
......@@ -516,26 +424,14 @@ static int send_event(struct pcmcia_socket *s, event_t event, int priority)
return ret;
} /* send_event */
static void pcmcia_error(struct pcmcia_socket *skt, const char *fmt, ...)
{
static char buf[128];
va_list ap;
int len;
va_start(ap, fmt);
len = vsnprintf(buf, sizeof(buf), fmt, ap);
va_end(ap);
buf[len] = '\0';
printk(KERN_ERR "PCMCIA: socket %p: %s", skt, buf);
}
#define cs_to_timeout(cs) (((cs) * HZ + 99) / 100)
static void socket_remove_drivers(struct pcmcia_socket *skt)
{
client_t *client;
cs_dbg(skt, 4, "remove_drivers\n");
send_event(skt, CS_EVENT_CARD_REMOVAL, CS_EVENT_PRI_HIGH);
for (client = skt->clients; client; client = client->next)
......@@ -545,10 +441,13 @@ static void socket_remove_drivers(struct pcmcia_socket *skt)
static void socket_shutdown(struct pcmcia_socket *skt)
{
cs_dbg(skt, 4, "shutdown\n");
socket_remove_drivers(skt);
skt->state &= SOCKET_INUSE|SOCKET_PRESENT;
set_current_state(TASK_UNINTERRUPTIBLE);
schedule_timeout(cs_to_timeout(shutdown_delay));
skt->state &= ~SOCKET_PRESENT;
skt->state &= SOCKET_INUSE;
shutdown_socket(skt);
}
......@@ -556,6 +455,8 @@ static int socket_reset(struct pcmcia_socket *skt)
{
int status, i;
cs_dbg(skt, 4, "reset\n");
skt->socket.flags |= SS_OUTPUT_ENA | SS_RESET;
skt->ops->set_socket(skt, &skt->socket);
udelay((long)reset_time);
......@@ -578,7 +479,7 @@ static int socket_reset(struct pcmcia_socket *skt)
schedule_timeout(cs_to_timeout(unreset_check));
}
pcmcia_error(skt, "time out after reset.\n");
cs_err(skt, "time out after reset.\n");
return CS_GENERAL_FAILURE;
}
......@@ -586,6 +487,8 @@ static int socket_setup(struct pcmcia_socket *skt, int initial_delay)
{
int status, i;
cs_dbg(skt, 4, "setup\n");
skt->ops->get_status(skt, &status);
if (!(status & SS_DETECT))
return CS_NO_CARD;
......@@ -606,14 +509,14 @@ static int socket_setup(struct pcmcia_socket *skt, int initial_delay)
}
if (status & SS_PENDING) {
pcmcia_error(skt, "voltage interrogation timed out.\n");
cs_err(skt, "voltage interrogation timed out.\n");
return CS_GENERAL_FAILURE;
}
if (status & SS_CARDBUS) {
skt->state |= SOCKET_CARDBUS;
#ifndef CONFIG_CARDBUS
pcmcia_error(skt, "cardbus cards are not supported.\n");
cs_err(skt, "cardbus cards are not supported.\n");
return CS_BAD_TYPE;
#endif
}
......@@ -626,7 +529,7 @@ static int socket_setup(struct pcmcia_socket *skt, int initial_delay)
else if (!(status & SS_XVCARD))
skt->socket.Vcc = skt->socket.Vpp = 50;
else {
pcmcia_error(skt, "unsupported voltage key.\n");
cs_err(skt, "unsupported voltage key.\n");
return CS_BAD_TYPE;
}
skt->socket.flags = 0;
......@@ -640,7 +543,7 @@ static int socket_setup(struct pcmcia_socket *skt, int initial_delay)
skt->ops->get_status(skt, &status);
if (!(status & SS_POWERON)) {
pcmcia_error(skt, "unable to apply power.\n");
cs_err(skt, "unable to apply power.\n");
return CS_BAD_TYPE;
}
......@@ -655,6 +558,8 @@ static int socket_insert(struct pcmcia_socket *skt)
{
int ret;
cs_dbg(skt, 4, "insert\n");
if (!cs_socket_get(skt))
return CS_NO_CARD;
......@@ -667,6 +572,8 @@ static int socket_insert(struct pcmcia_socket *skt)
skt->state |= SOCKET_CARDBUS_CONFIG;
}
#endif
cs_dbg(skt, 4, "insert done\n");
send_event(skt, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW);
} else {
socket_shutdown(skt);
......@@ -832,6 +739,7 @@ static int pccardd(void *__skt)
*/
void pcmcia_parse_events(struct pcmcia_socket *s, u_int events)
{
cs_dbg(s, 4, "parse_events: events %08x\n", events);
if (s->thread) {
spin_lock(&s->thread_lock);
s->thread_events |= events;
......@@ -857,14 +765,14 @@ static int alloc_io_space(struct pcmcia_socket *s, u_int attr, ioaddr_t *base,
align = (*base) ? (lines ? 1<<lines : 0) : 1;
if (align && (align < num)) {
if (*base) {
DEBUG(0, "odd IO request: num %04x align %04x\n",
cs_dbg(s, 0, "odd IO request: num %04x align %04x\n",
num, align);
align = 0;
} else
while (align && (align < num)) align <<= 1;
}
if (*base & ~(align-1)) {
DEBUG(0, "odd IO request: base %04x align %04x\n",
cs_dbg(s, 0, "odd IO request: base %04x align %04x\n",
*base, align);
align = 0;
}
......@@ -979,77 +887,6 @@ int pcmcia_access_configuration_register(client_handle_t handle,
return CS_SUCCESS;
} /* access_configuration_register */
/*======================================================================
Bind_device() associates a device driver with a particular socket.
It is normally called by Driver Services after it has identified
a newly inserted card. An instance of that driver will then be
eligible to register as a client of this socket.
======================================================================*/
int pcmcia_bind_device(bind_req_t *req)
{
client_t *client;
struct pcmcia_socket *s;
s = req->Socket;
if (!s)
return CS_BAD_SOCKET;
client = (client_t *)kmalloc(sizeof(client_t), GFP_KERNEL);
if (!client) return CS_OUT_OF_RESOURCE;
memset(client, '\0', sizeof(client_t));
client->client_magic = CLIENT_MAGIC;
strlcpy(client->dev_info, (char *)req->dev_info, DEV_NAME_LEN);
client->Socket = s;
client->Function = req->Function;
client->state = CLIENT_UNBOUND;
client->erase_busy.next = &client->erase_busy;
client->erase_busy.prev = &client->erase_busy;
init_waitqueue_head(&client->mtd_req);
client->next = s->clients;
s->clients = client;
DEBUG(1, "cs: bind_device(): client 0x%p, sock %p, dev %s\n",
client, client->Socket, client->dev_info);
return CS_SUCCESS;
} /* bind_device */
/*======================================================================
Bind_mtd() associates a device driver with a particular memory
region. It is normally called by Driver Services after it has
identified a memory device type. An instance of the corresponding
driver will then be able to register to control this region.
======================================================================*/
int pcmcia_bind_mtd(mtd_bind_t *req)
{
struct pcmcia_socket *s;
memory_handle_t region;
s = req->Socket;
if (!s)
return CS_BAD_SOCKET;
if (req->Attributes & REGION_TYPE_AM)
region = s->a_region;
else
region = s->c_region;
while (region) {
if (region->info.CardOffset == req->CardOffset) break;
region = region->info.next;
}
if (!region || (region->mtd != NULL))
return CS_BAD_OFFSET;
strlcpy(region->dev_info, (char *)req->dev_info, DEV_NAME_LEN);
DEBUG(1, "cs: bind_mtd(): attr 0x%x, offset 0x%x, dev %s\n",
req->Attributes, req->CardOffset, (char *)req->dev_info);
return CS_SUCCESS;
} /* bind_mtd */
/*====================================================================*/
......@@ -1061,9 +898,12 @@ int pcmcia_deregister_client(client_handle_t handle)
u_long flags;
int i;
DEBUG(1, "cs: deregister_client(%p)\n", handle);
if (CHECK_HANDLE(handle))
return CS_BAD_HANDLE;
s = SOCKET(handle);
cs_dbg(s, 1, "deregister_client(%p)\n", handle);
if (handle->state &
(CLIENT_IRQ_REQ|CLIENT_IO_REQ|CLIENT_CONFIG_LOCKED))
return CS_IN_USE;
......@@ -1072,7 +912,6 @@ int pcmcia_deregister_client(client_handle_t handle)
return CS_IN_USE;
/* Disconnect all MTD links */
s = SOCKET(handle);
if (handle->mtd_count) {
for (region = s->a_region; region; region = region->info.next)
if (region->mtd == handle) region->mtd = NULL;
......@@ -1543,8 +1382,8 @@ int pcmcia_register_client(client_handle_t *handle, client_reg_t *req)
memset(s->config, 0, sizeof(config_t) * s->functions);
}
DEBUG(1, "cs: register_client(): client 0x%p, sock %p, dev %s\n",
client, client->Socket, client->dev_info);
cs_dbg(s, 1, "register_client(): client 0x%p, dev %s\n",
client, client->dev_info);
if (client->EventMask & CS_EVENT_REGISTRATION_COMPLETE)
EVENT(client, CS_EVENT_REGISTRATION_COMPLETE, CS_EVENT_PRI_LOW);
......@@ -2077,8 +1916,8 @@ int pcmcia_reset_card(client_handle_t handle, client_req_t *req)
if (CHECK_HANDLE(handle))
return CS_BAD_HANDLE;
DEBUG(1, "cs: resetting socket %p\n", handle->Socket);
skt = SOCKET(handle);
cs_dbg(skt, 1, "resetting socket\n");
down(&skt->skt_sem);
do {
......@@ -2119,15 +1958,11 @@ int pcmcia_reset_card(client_handle_t handle, client_req_t *req)
======================================================================*/
int pcmcia_suspend_card(client_handle_t handle, client_req_t *req)
int pcmcia_suspend_card(struct pcmcia_socket *skt)
{
struct pcmcia_socket *skt;
int ret;
if (CHECK_HANDLE(handle))
return CS_BAD_HANDLE;
DEBUG(1, "cs: suspending socket %p\n", handle->Socket);
skt = SOCKET(handle);
cs_dbg(skt, 1, "suspending socket\n");
down(&skt->skt_sem);
do {
......@@ -2146,15 +1981,11 @@ int pcmcia_suspend_card(client_handle_t handle, client_req_t *req)
return ret;
} /* suspend_card */
int pcmcia_resume_card(client_handle_t handle, client_req_t *req)
int pcmcia_resume_card(struct pcmcia_socket *skt)
{
struct pcmcia_socket *skt;
int ret;
if (CHECK_HANDLE(handle))
return CS_BAD_HANDLE;
DEBUG(1, "cs: waking up socket %p\n", handle->Socket);
skt = SOCKET(handle);
cs_dbg(skt, 1, "waking up socket\n");
down(&skt->skt_sem);
do {
......@@ -2179,15 +2010,11 @@ int pcmcia_resume_card(client_handle_t handle, client_req_t *req)
======================================================================*/
int pcmcia_eject_card(client_handle_t handle, client_req_t *req)
int pcmcia_eject_card(struct pcmcia_socket *skt)
{
struct pcmcia_socket *skt;
int ret;
if (CHECK_HANDLE(handle))
return CS_BAD_HANDLE;
DEBUG(1, "cs: user eject request on socket %p\n", handle->Socket);
skt = SOCKET(handle);
cs_dbg(skt, 1, "user eject request\n");
down(&skt->skt_sem);
do {
......@@ -2208,15 +2035,11 @@ int pcmcia_eject_card(client_handle_t handle, client_req_t *req)
return ret;
} /* eject_card */
int pcmcia_insert_card(client_handle_t handle, client_req_t *req)
int pcmcia_insert_card(struct pcmcia_socket *skt)
{
struct pcmcia_socket *skt;
int ret;
if (CHECK_HANDLE(handle))
return CS_BAD_HANDLE;
DEBUG(1, "cs: user insert request on socket %p\n", handle->Socket);
skt = SOCKET(handle);
cs_dbg(skt, 1, "user insert request\n");
down(&skt->skt_sem);
do {
......@@ -2260,35 +2083,6 @@ int pcmcia_set_event_mask(client_handle_t handle, eventmask_t *mask)
return CS_SUCCESS;
} /* set_event_mask */
/*====================================================================*/
int pcmcia_report_error(client_handle_t handle, error_info_t *err)
{
int i;
char *serv;
if (CHECK_HANDLE(handle))
printk(KERN_NOTICE);
else
printk(KERN_NOTICE "%s: ", handle->dev_info);
for (i = 0; i < SERVICE_COUNT; i++)
if (service_table[i].key == err->func) break;
if (i < SERVICE_COUNT)
serv = service_table[i].msg;
else
serv = "Unknown service number";
for (i = 0; i < ERROR_COUNT; i++)
if (error_table[i].key == err->retcode) break;
if (i < ERROR_COUNT)
printk("%s: %s\n", serv, error_table[i].msg);
else
printk("%s: Unknown error code %#x\n", serv, err->retcode);
return CS_SUCCESS;
} /* report_error */
/*======================================================================
OS-specific module glue goes here
......@@ -2297,8 +2091,6 @@ int pcmcia_report_error(client_handle_t handle, error_info_t *err)
/* in alpha order */
EXPORT_SYMBOL(pcmcia_access_configuration_register);
EXPORT_SYMBOL(pcmcia_adjust_resource_info);
EXPORT_SYMBOL(pcmcia_bind_device);
EXPORT_SYMBOL(pcmcia_bind_mtd);
EXPORT_SYMBOL(pcmcia_check_erase_queue);
EXPORT_SYMBOL(pcmcia_close_memory);
EXPORT_SYMBOL(pcmcia_copy_memory);
......@@ -2333,7 +2125,6 @@ EXPORT_SYMBOL(pcmcia_release_io);
EXPORT_SYMBOL(pcmcia_release_irq);
EXPORT_SYMBOL(pcmcia_release_window);
EXPORT_SYMBOL(pcmcia_replace_cis);
EXPORT_SYMBOL(pcmcia_report_error);
EXPORT_SYMBOL(pcmcia_request_configuration);
EXPORT_SYMBOL(pcmcia_request_io);
EXPORT_SYMBOL(pcmcia_request_irq);
......@@ -2360,7 +2151,6 @@ static int __init init_pcmcia_cs(void)
{
printk(KERN_INFO "%s\n", release);
printk(KERN_INFO " %s\n", options);
DEBUG(0, "%s\n", version);
class_register(&pcmcia_socket_class);
return 0;
......
......@@ -167,7 +167,6 @@ int replace_cis(client_handle_t handle, cisdump_t *cis);
int read_tuple(client_handle_t handle, cisdata_t code, void *parse);
/* In bulkmem.c */
void retry_erase_list(struct erase_busy_t *list, u_int cause);
int get_first_region(client_handle_t handle, region_info_t *rgn);
int get_next_region(client_handle_t handle, region_info_t *rgn);
int register_mtd(client_handle_t handle, mtd_reg_t *reg);
......@@ -194,11 +193,22 @@ void release_resource_db(void);
extern struct rw_semaphore pcmcia_socket_list_rwsem;
extern struct list_head pcmcia_socket_list;
#ifdef PCMCIA_DEBUG
extern int pc_debug;
#define DEBUG(n, args...) do { if (pc_debug>(n)) printk(KERN_DEBUG args); } while (0)
#define cs_socket_name(skt) ((skt)->dev.class_id)
#ifdef DEBUG
extern int cs_debug_level(int);
#define cs_dbg(skt, lvl, fmt, arg...) do { \
if (cs_debug_level(lvl)) \
printk(KERN_DEBUG "cs: %s: " fmt, \
cs_socket_name(skt) , ## arg); \
} while (0)
#else
#define DEBUG(n, args...) do { } while (0)
#define cs_dbg(skt, lvl, fmt, arg...) do { } while (0)
#endif
#define cs_err(skt, fmt, arg...) \
printk(KERN_ERR "cs: %s: " fmt, (skt)->dev.class_id , ## arg)
#endif /* _LINUX_CS_INTERNAL_H */
......@@ -33,6 +33,7 @@
#include <linux/config.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/major.h>
......@@ -53,6 +54,7 @@
#include <asm/atomic.h>
#define IN_CARD_SERVICES
#include <pcmcia/version.h>
#include <pcmcia/cs_types.h>
#include <pcmcia/cs.h>
......@@ -61,6 +63,8 @@
#include <pcmcia/ds.h>
#include <pcmcia/ss.h>
#include "cs_internal.h"
/*====================================================================*/
/* Module parameters */
......@@ -69,13 +73,17 @@ MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
MODULE_DESCRIPTION("PCMCIA Driver Services");
MODULE_LICENSE("Dual MPL/GPL");
#define INT_MODULE_PARM(n, v) static int n = v; MODULE_PARM(n, "i")
#ifdef DEBUG
static int pc_debug;
module_param(pc_debug, int, 0644);
#ifdef PCMCIA_DEBUG
INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);
#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
#define ds_dbg(lvl, fmt, arg...) do { \
if (pc_debug > (lvl)) \
printk(KERN_DEBUG "ds: " fmt , ## arg); \
} while (0)
#else
#define DEBUG(n, args...)
#define ds_dbg(lvl, fmt, arg...) do { } while (0)
#endif
/*====================================================================*/
......@@ -113,10 +121,10 @@ struct pcmcia_bus_socket {
struct pcmcia_socket *parent;
};
#define SOCKET_PRESENT 0x01
#define SOCKET_BUSY 0x02
#define SOCKET_REMOVAL_PENDING 0x10
#define SOCKET_DEAD 0x80
#define DS_SOCKET_PRESENT 0x01
#define DS_SOCKET_BUSY 0x02
#define DS_SOCKET_REMOVAL_PENDING 0x10
#define DS_SOCKET_DEAD 0x80
/*====================================================================*/
......@@ -129,6 +137,214 @@ extern struct proc_dir_entry *proc_pccard;
/*====================================================================*/
/* code which was in cs.c before */
/*======================================================================
Bind_device() associates a device driver with a particular socket.
It is normally called by Driver Services after it has identified
a newly inserted card. An instance of that driver will then be
eligible to register as a client of this socket.
======================================================================*/
static int pcmcia_bind_device(bind_req_t *req)
{
client_t *client;
struct pcmcia_socket *s;
s = req->Socket;
if (!s)
return CS_BAD_SOCKET;
client = (client_t *) kmalloc(sizeof(client_t), GFP_KERNEL);
if (!client)
return CS_OUT_OF_RESOURCE;
memset(client, '\0', sizeof(client_t));
client->client_magic = CLIENT_MAGIC;
strlcpy(client->dev_info, (char *)req->dev_info, DEV_NAME_LEN);
client->Socket = s;
client->Function = req->Function;
client->state = CLIENT_UNBOUND;
client->erase_busy.next = &client->erase_busy;
client->erase_busy.prev = &client->erase_busy;
init_waitqueue_head(&client->mtd_req);
client->next = s->clients;
s->clients = client;
ds_dbg(1, "%s: bind_device(): client 0x%p, dev %s\n",
cs_socket_name(client->Socket), client, client->dev_info);
return CS_SUCCESS;
} /* bind_device */
/*======================================================================
Bind_mtd() associates a device driver with a particular memory
region. It is normally called by Driver Services after it has
identified a memory device type. An instance of the corresponding
driver will then be able to register to control this region.
======================================================================*/
static int pcmcia_bind_mtd(mtd_bind_t *req)
{
struct pcmcia_socket *s;
memory_handle_t region;
s = req->Socket;
if (!s)
return CS_BAD_SOCKET;
if (req->Attributes & REGION_TYPE_AM)
region = s->a_region;
else
region = s->c_region;
while (region) {
if (region->info.CardOffset == req->CardOffset)
break;
region = region->info.next;
}
if (!region || (region->mtd != NULL))
return CS_BAD_OFFSET;
strlcpy(region->dev_info, (char *)req->dev_info, DEV_NAME_LEN);
ds_dbg(1, "%s: bind_mtd: attr 0x%x, offset 0x%x, dev %s\n",
cs_socket_name(s), req->Attributes, req->CardOffset,
(char *)req->dev_info);
return CS_SUCCESS;
} /* bind_mtd */
/* String tables for error messages */
typedef struct lookup_t {
int key;
char *msg;
} lookup_t;
static const lookup_t error_table[] = {
{ CS_SUCCESS, "Operation succeeded" },
{ CS_BAD_ADAPTER, "Bad adapter" },
{ CS_BAD_ATTRIBUTE, "Bad attribute", },
{ CS_BAD_BASE, "Bad base address" },
{ CS_BAD_EDC, "Bad EDC" },
{ CS_BAD_IRQ, "Bad IRQ" },
{ CS_BAD_OFFSET, "Bad offset" },
{ CS_BAD_PAGE, "Bad page number" },
{ CS_READ_FAILURE, "Read failure" },
{ CS_BAD_SIZE, "Bad size" },
{ CS_BAD_SOCKET, "Bad socket" },
{ CS_BAD_TYPE, "Bad type" },
{ CS_BAD_VCC, "Bad Vcc" },
{ CS_BAD_VPP, "Bad Vpp" },
{ CS_BAD_WINDOW, "Bad window" },
{ CS_WRITE_FAILURE, "Write failure" },
{ CS_NO_CARD, "No card present" },
{ CS_UNSUPPORTED_FUNCTION, "Usupported function" },
{ CS_UNSUPPORTED_MODE, "Unsupported mode" },
{ CS_BAD_SPEED, "Bad speed" },
{ CS_BUSY, "Resource busy" },
{ CS_GENERAL_FAILURE, "General failure" },
{ CS_WRITE_PROTECTED, "Write protected" },
{ CS_BAD_ARG_LENGTH, "Bad argument length" },
{ CS_BAD_ARGS, "Bad arguments" },
{ CS_CONFIGURATION_LOCKED, "Configuration locked" },
{ CS_IN_USE, "Resource in use" },
{ CS_NO_MORE_ITEMS, "No more items" },
{ CS_OUT_OF_RESOURCE, "Out of resource" },
{ CS_BAD_HANDLE, "Bad handle" },
{ CS_BAD_TUPLE, "Bad CIS tuple" }
};
static const lookup_t service_table[] = {
{ AccessConfigurationRegister, "AccessConfigurationRegister" },
{ AddSocketServices, "AddSocketServices" },
{ AdjustResourceInfo, "AdjustResourceInfo" },
{ CheckEraseQueue, "CheckEraseQueue" },
{ CloseMemory, "CloseMemory" },
{ DeregisterClient, "DeregisterClient" },
{ DeregisterEraseQueue, "DeregisterEraseQueue" },
{ GetCardServicesInfo, "GetCardServicesInfo" },
{ GetClientInfo, "GetClientInfo" },
{ GetConfigurationInfo, "GetConfigurationInfo" },
{ GetEventMask, "GetEventMask" },
{ GetFirstClient, "GetFirstClient" },
{ GetFirstRegion, "GetFirstRegion" },
{ GetFirstTuple, "GetFirstTuple" },
{ GetNextClient, "GetNextClient" },
{ GetNextRegion, "GetNextRegion" },
{ GetNextTuple, "GetNextTuple" },
{ GetStatus, "GetStatus" },
{ GetTupleData, "GetTupleData" },
{ MapMemPage, "MapMemPage" },
{ ModifyConfiguration, "ModifyConfiguration" },
{ ModifyWindow, "ModifyWindow" },
{ OpenMemory, "OpenMemory" },
{ ParseTuple, "ParseTuple" },
{ ReadMemory, "ReadMemory" },
{ RegisterClient, "RegisterClient" },
{ RegisterEraseQueue, "RegisterEraseQueue" },
{ RegisterMTD, "RegisterMTD" },
{ ReleaseConfiguration, "ReleaseConfiguration" },
{ ReleaseIO, "ReleaseIO" },
{ ReleaseIRQ, "ReleaseIRQ" },
{ ReleaseWindow, "ReleaseWindow" },
{ RequestConfiguration, "RequestConfiguration" },
{ RequestIO, "RequestIO" },
{ RequestIRQ, "RequestIRQ" },
{ RequestSocketMask, "RequestSocketMask" },
{ RequestWindow, "RequestWindow" },
{ ResetCard, "ResetCard" },
{ SetEventMask, "SetEventMask" },
{ ValidateCIS, "ValidateCIS" },
{ WriteMemory, "WriteMemory" },
{ BindDevice, "BindDevice" },
{ BindMTD, "BindMTD" },
{ ReportError, "ReportError" },
{ SuspendCard, "SuspendCard" },
{ ResumeCard, "ResumeCard" },
{ EjectCard, "EjectCard" },
{ InsertCard, "InsertCard" },
{ ReplaceCIS, "ReplaceCIS" }
};
int pcmcia_report_error(client_handle_t handle, error_info_t *err)
{
int i;
char *serv;
if (CHECK_HANDLE(handle))
printk(KERN_NOTICE);
else
printk(KERN_NOTICE "%s: ", handle->dev_info);
for (i = 0; i < ARRAY_SIZE(service_table); i++)
if (service_table[i].key == err->func)
break;
if (i < ARRAY_SIZE(service_table))
serv = service_table[i].msg;
else
serv = "Unknown service number";
for (i = 0; i < ARRAY_SIZE(error_table); i++)
if (error_table[i].key == err->retcode)
break;
if (i < ARRAY_SIZE(error_table))
printk("%s: %s\n", serv, error_table[i].msg);
else
printk("%s: Unknown error code %#x\n", serv, err->retcode);
return CS_SUCCESS;
} /* report_error */
EXPORT_SYMBOL(pcmcia_report_error);
/* end of code which was in cs.c before */
/*======================================================================*/
void cs_error(client_handle_t handle, int func, int ret)
{
error_info_t err = { func, ret };
......@@ -249,12 +465,12 @@ static int handle_request(struct pcmcia_bus_socket *s, event_t event)
{
if (s->req_pending != 0)
return CS_IN_USE;
if (s->state & SOCKET_BUSY)
if (s->state & DS_SOCKET_BUSY)
s->req_pending = 1;
handle_event(s, event);
if (wait_event_interruptible(s->request, s->req_pending <= 0))
return CS_IN_USE;
if (s->state & SOCKET_BUSY)
if (s->state & DS_SOCKET_BUSY)
return s->req_result;
return CS_SUCCESS;
}
......@@ -263,7 +479,7 @@ static void handle_removal(void *data)
{
struct pcmcia_bus_socket *s = data;
handle_event(s, CS_EVENT_CARD_REMOVAL);
s->state &= ~SOCKET_REMOVAL_PENDING;
s->state &= ~DS_SOCKET_REMOVAL_PENDING;
}
/*======================================================================
......@@ -277,22 +493,22 @@ static int ds_event(event_t event, int priority,
{
struct pcmcia_bus_socket *s;
DEBUG(1, "ds: ds_event(0x%06x, %d, 0x%p)\n",
ds_dbg(1, "ds_event(0x%06x, %d, 0x%p)\n",
event, priority, args->client_handle);
s = args->client_data;
switch (event) {
case CS_EVENT_CARD_REMOVAL:
s->state &= ~SOCKET_PRESENT;
if (!(s->state & SOCKET_REMOVAL_PENDING)) {
s->state |= SOCKET_REMOVAL_PENDING;
s->state &= ~DS_SOCKET_PRESENT;
if (!(s->state & DS_SOCKET_REMOVAL_PENDING)) {
s->state |= DS_SOCKET_REMOVAL_PENDING;
schedule_delayed_work(&s->removal, HZ/10);
}
break;
case CS_EVENT_CARD_INSERTION:
s->state |= SOCKET_PRESENT;
s->state |= DS_SOCKET_PRESENT;
handle_event(s, event);
break;
......@@ -353,7 +569,7 @@ static int bind_request(struct pcmcia_bus_socket *s, bind_info_t *bind_info)
if (!s)
return -EINVAL;
DEBUG(2, "bind_request(%d, '%s')\n", s->parent->sock,
ds_dbg(2, "bind_request(%d, '%s')\n", s->parent->sock,
(char *)bind_info->dev_info);
driver = get_pcmcia_driver(&bind_info->dev_info);
if (!driver)
......@@ -484,7 +700,7 @@ static int unbind_request(struct pcmcia_bus_socket *s, bind_info_t *bind_info)
{
socket_bind_t **b, *c;
DEBUG(2, "unbind_request(%d, '%s')\n", s->parent->sock,
ds_dbg(2, "unbind_request(%d, '%s')\n", s->parent->sock,
(char *)bind_info->dev_info);
for (b = &s->bind; *b; b = &(*b)->next)
if ((strcmp((char *)(*b)->driver->drv.name,
......@@ -518,17 +734,17 @@ static int ds_open(struct inode *inode, struct file *file)
struct pcmcia_bus_socket *s;
user_info_t *user;
DEBUG(0, "ds_open(socket %d)\n", i);
ds_dbg(0, "ds_open(socket %d)\n", i);
s = pcmcia_get_bus_socket(i);
if (!s)
return -ENODEV;
if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
if (s->state & SOCKET_BUSY)
if (s->state & DS_SOCKET_BUSY)
return -EBUSY;
else
s->state |= SOCKET_BUSY;
s->state |= DS_SOCKET_BUSY;
}
user = kmalloc(sizeof(user_info_t), GFP_KERNEL);
......@@ -540,7 +756,7 @@ static int ds_open(struct inode *inode, struct file *file)
s->user = user;
file->private_data = user;
if (s->state & SOCKET_PRESENT)
if (s->state & DS_SOCKET_PRESENT)
queue_event(user, CS_EVENT_CARD_INSERTION);
return 0;
} /* ds_open */
......@@ -552,7 +768,7 @@ static int ds_release(struct inode *inode, struct file *file)
struct pcmcia_bus_socket *s;
user_info_t *user, **link;
DEBUG(0, "ds_release(socket %d)\n", iminor(inode));
ds_dbg(0, "ds_release(socket %d)\n", iminor(inode));
user = file->private_data;
if (CHECK_USER(user))
......@@ -562,7 +778,7 @@ static int ds_release(struct inode *inode, struct file *file)
/* Unlink user data structure */
if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
s->state &= ~SOCKET_BUSY;
s->state &= ~DS_SOCKET_BUSY;
s->req_pending = 0;
wake_up_interruptible(&s->request);
}
......@@ -588,7 +804,7 @@ static ssize_t ds_read(struct file *file, char *buf,
user_info_t *user;
int ret;
DEBUG(2, "ds_read(socket %d)\n", iminor(inode));
ds_dbg(2, "ds_read(socket %d)\n", iminor(file->f_dentry->d_inode));
if (count < 4)
return -EINVAL;
......@@ -598,7 +814,7 @@ static ssize_t ds_read(struct file *file, char *buf,
return -EIO;
s = user->socket;
if (s->state & SOCKET_DEAD)
if (s->state & DS_SOCKET_DEAD)
return -EIO;
ret = wait_event_interruptible(s->queue, !queue_empty(user));
......@@ -616,7 +832,7 @@ static ssize_t ds_write(struct file *file, const char *buf,
struct pcmcia_bus_socket *s;
user_info_t *user;
DEBUG(2, "ds_write(socket %d)\n", iminor(inode));
ds_dbg(2, "ds_write(socket %d)\n", iminor(file->f_dentry->d_inode));
if (count != 4)
return -EINVAL;
......@@ -628,7 +844,7 @@ static ssize_t ds_write(struct file *file, const char *buf,
return -EIO;
s = user->socket;
if (s->state & SOCKET_DEAD)
if (s->state & DS_SOCKET_DEAD)
return -EIO;
if (s->req_pending) {
......@@ -650,7 +866,7 @@ static u_int ds_poll(struct file *file, poll_table *wait)
struct pcmcia_bus_socket *s;
user_info_t *user;
DEBUG(2, "ds_poll(socket %d)\n", iminor(inode));
ds_dbg(2, "ds_poll(socket %d)\n", iminor(file->f_dentry->d_inode));
user = file->private_data;
if (CHECK_USER(user))
......@@ -677,14 +893,14 @@ static int ds_ioctl(struct inode * inode, struct file * file,
ds_ioctl_arg_t buf;
user_info_t *user;
DEBUG(2, "ds_ioctl(socket %d, %#x, %#lx)\n", iminor(inode), cmd, arg);
ds_dbg(2, "ds_ioctl(socket %d, %#x, %#lx)\n", iminor(inode), cmd, arg);
user = file->private_data;
if (CHECK_USER(user))
return -EIO;
s = user->socket;
if (s->state & SOCKET_DEAD)
if (s->state & DS_SOCKET_DEAD)
return -EIO;
size = (cmd & IOCSIZE_MASK) >> IOCSIZE_SHIFT;
......@@ -697,14 +913,14 @@ static int ds_ioctl(struct inode * inode, struct file * file,
if (cmd & IOC_IN) {
err = verify_area(VERIFY_READ, (char *)arg, size);
if (err) {
DEBUG(3, "ds_ioctl(): verify_read = %d\n", err);
ds_dbg(3, "ds_ioctl(): verify_read = %d\n", err);
return err;
}
}
if (cmd & IOC_OUT) {
err = verify_area(VERIFY_WRITE, (char *)arg, size);
if (err) {
DEBUG(3, "ds_ioctl(): verify_write = %d\n", err);
ds_dbg(3, "ds_ioctl(): verify_write = %d\n", err);
return err;
}
}
......@@ -748,16 +964,16 @@ static int ds_ioctl(struct inode * inode, struct file * file,
ret = pcmcia_validate_cis(s->handle, &buf.cisinfo);
break;
case DS_SUSPEND_CARD:
ret = pcmcia_suspend_card(s->handle, NULL);
ret = pcmcia_suspend_card(s->parent);
break;
case DS_RESUME_CARD:
ret = pcmcia_resume_card(s->handle, NULL);
ret = pcmcia_resume_card(s->parent);
break;
case DS_EJECT_CARD:
ret = pcmcia_eject_card(s->handle, NULL);
ret = pcmcia_eject_card(s->parent);
break;
case DS_INSERT_CARD:
ret = pcmcia_insert_card(s->handle, NULL);
ret = pcmcia_insert_card(s->parent);
break;
case DS_ACCESS_CONFIGURATION_REGISTER:
if ((buf.conf_reg.Action == CS_WRITE) && !capable(CAP_SYS_ADMIN))
......@@ -806,7 +1022,7 @@ static int ds_ioctl(struct inode * inode, struct file * file,
}
if ((err == 0) && (ret != CS_SUCCESS)) {
DEBUG(2, "ds_ioctl: ret = %d\n", ret);
ds_dbg(2, "ds_ioctl: ret = %d\n", ret);
switch (ret) {
case CS_BAD_SOCKET: case CS_NO_CARD:
err = -ENODEV; break;
......@@ -916,7 +1132,7 @@ static void pcmcia_bus_remove_socket(struct class_device *class_dev)
pcmcia_deregister_client(socket->pcmcia->handle);
socket->pcmcia->state |= SOCKET_DEAD;
socket->pcmcia->state |= DS_SOCKET_DEAD;
pcmcia_put_bus_socket(socket->pcmcia);
socket->pcmcia = NULL;
......
......@@ -32,6 +32,7 @@
======================================================================*/
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/config.h>
#include <linux/types.h>
......@@ -66,14 +67,20 @@
#include "ricoh.h"
#include "o2micro.h"
#ifdef PCMCIA_DEBUG
static int pc_debug = PCMCIA_DEBUG;
MODULE_PARM(pc_debug, "i");
#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
#ifdef DEBUG
static const char *version =
"i82365.c 1.265 1999/11/10 18:36:21 (David Hinds)";
static int pc_debug;
module_param(pc_debug, int, 0644);
#define debug(lvl, fmt, arg...) do { \
if (pc_debug > (lvl)) \
printk(KERN_DEBUG "i82365: " fmt , ## arg); \
} while (0)
#else
#define DEBUG(n, args...) do { } while (0)
#define debug(lvl, fmt, arg...) do { } while (0)
#endif
static irqreturn_t i365_count_irq(int, void *, struct pt_regs *);
......@@ -496,13 +503,13 @@ static irqreturn_t i365_count_irq(int irq, void *dev, struct pt_regs *regs)
{
i365_get(irq_sock, I365_CSC);
irq_hits++;
DEBUG(2, "-> hit on irq %d\n", irq);
debug(2, "-> hit on irq %d\n", irq);
return IRQ_HANDLED;
}
static u_int __init test_irq(u_short sock, int irq)
{
DEBUG(2, " testing ISA irq %d\n", irq);
debug(2, " testing ISA irq %d\n", irq);
if (request_irq(irq, i365_count_irq, 0, "scan", i365_count_irq) != 0)
return 1;
irq_hits = 0; irq_sock = sock;
......@@ -510,7 +517,7 @@ static u_int __init test_irq(u_short sock, int irq)
schedule_timeout(HZ/100);
if (irq_hits) {
free_irq(irq, i365_count_irq);
DEBUG(2, " spurious hit!\n");
debug(2, " spurious hit!\n");
return 1;
}
......@@ -523,7 +530,7 @@ static u_int __init test_irq(u_short sock, int irq)
/* mask all interrupts */
i365_set(sock, I365_CSCINT, 0);
DEBUG(2, " hits = %d\n", irq_hits);
debug(2, " hits = %d\n", irq_hits);
return (irq_hits != 1);
}
......@@ -850,7 +857,7 @@ static irqreturn_t pcic_interrupt(int irq, void *dev,
u_long flags = 0;
int handled = 0;
DEBUG(4, "i82365: pcic_interrupt(%d)\n", irq);
debug(4, "pcic_interrupt(%d)\n", irq);
for (j = 0; j < 20; j++) {
active = 0;
......@@ -874,7 +881,7 @@ static irqreturn_t pcic_interrupt(int irq, void *dev,
events |= (csc & I365_CSC_READY) ? SS_READY : 0;
}
ISA_UNLOCK(i, flags);
DEBUG(2, "i82365: socket %d event 0x%02x\n", i, events);
debug(2, "socket %d event 0x%02x\n", i, events);
if (events)
pcmcia_parse_events(&socket[i].socket, events);
......@@ -886,7 +893,7 @@ static irqreturn_t pcic_interrupt(int irq, void *dev,
if (j == 20)
printk(KERN_NOTICE "i82365: infinite loop in interrupt handler\n");
DEBUG(4, "i82365: interrupt done\n");
debug(4, "interrupt done\n");
return IRQ_RETVAL(handled);
} /* pcic_interrupt */
......@@ -928,7 +935,7 @@ static int i365_get_status(u_short sock, u_int *value)
}
}
DEBUG(1, "i82365: GetStatus(%d) = %#4.4x\n", sock, *value);
debug(1, "GetStatus(%d) = %#4.4x\n", sock, *value);
return 0;
} /* i365_get_status */
......@@ -998,7 +1005,7 @@ static int i365_get_socket(u_short sock, socket_state_t *state)
state->csc_mask |= (reg & I365_CSC_READY) ? SS_READY : 0;
}
DEBUG(1, "i82365: GetSocket(%d) = flags %#3.3x, Vcc %d, Vpp %d, "
debug(1, "GetSocket(%d) = flags %#3.3x, Vcc %d, Vpp %d, "
"io_irq %d, csc_mask %#2.2x\n", sock, state->flags,
state->Vcc, state->Vpp, state->io_irq, state->csc_mask);
return 0;
......@@ -1011,7 +1018,7 @@ static int i365_set_socket(u_short sock, socket_state_t *state)
struct i82365_socket *t = &socket[sock];
u_char reg;
DEBUG(1, "i82365: SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
debug(1, "SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
"io_irq %d, csc_mask %#2.2x)\n", sock, state->flags,
state->Vcc, state->Vpp, state->io_irq, state->csc_mask);
......@@ -1120,7 +1127,7 @@ static int i365_set_io_map(u_short sock, struct pccard_io_map *io)
{
u_char map, ioctl;
DEBUG(1, "i82365: SetIOMap(%d, %d, %#2.2x, %d ns, "
debug(1, "SetIOMap(%d, %d, %#2.2x, %d ns, "
"%#4.4x-%#4.4x)\n", sock, io->map, io->flags,
io->speed, io->start, io->stop);
map = io->map;
......@@ -1150,7 +1157,7 @@ static int i365_set_mem_map(u_short sock, struct pccard_mem_map *mem)
u_short base, i;
u_char map;
DEBUG(1, "i82365: SetMemMap(%d, %d, %#2.2x, %d ns, %#5.5lx-%#5.5"
debug(1, "SetMemMap(%d, %d, %#2.2x, %d ns, %#5.5lx-%#5.5"
"lx, %#5.5x)\n", sock, mem->map, mem->flags, mem->speed,
mem->sys_start, mem->sys_stop, mem->card_start);
......
......@@ -35,6 +35,7 @@
*/
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/config.h>
#include <linux/cpufreq.h>
......@@ -54,8 +55,19 @@
#include "sa11xx_core.h"
#include "sa1100.h"
#ifdef PCMCIA_DEBUG
#ifdef DEBUG
static int pc_debug;
module_param(pc_debug, int, 0644);
#define debug(skt, lvl, fmt, arg...) do { \
if (pc_debug > (lvl)) \
printk(KERN_DEBUG "skt%u: %s: " fmt, \
(skt)->nr, __func__ , ## arg); \
} while (0)
#else
#define debug(skt, lvl, fmt, arg...) do { } while (0)
#endif
#define to_sa1100_socket(x) container_of(x, struct sa1100_pcmcia_socket, socket)
......@@ -133,8 +145,8 @@ sa1100_pcmcia_set_mecr(struct sa1100_pcmcia_socket *skt, unsigned int cpu_clock)
local_irq_restore(flags);
DEBUG(4, "%s(): sock %u FAST %X BSM %X BSA %X BSIO %X\n",
__FUNCTION__, skt->nr, MECR_FAST_GET(mecr, skt->nr),
debug(skt, 2, "FAST %X BSM %X BSA %X BSIO %X\n",
MECR_FAST_GET(mecr, skt->nr),
MECR_BSM_GET(mecr, skt->nr), MECR_BSA_GET(mecr, skt->nr),
MECR_BSIO_GET(mecr, skt->nr));
......@@ -221,7 +233,7 @@ static int sa1100_pcmcia_sock_init(struct pcmcia_socket *sock)
{
struct sa1100_pcmcia_socket *skt = to_sa1100_socket(sock);
DEBUG(2, "%s(): initializing socket %u\n", __FUNCTION__, skt->nr);
debug(skt, 2, "initializing socket\n");
skt->ops->socket_init(skt);
return 0;
......@@ -242,7 +254,7 @@ static int sa1100_pcmcia_suspend(struct pcmcia_socket *sock)
struct sa1100_pcmcia_socket *skt = to_sa1100_socket(sock);
int ret;
DEBUG(2, "%s(): suspending socket %u\n", __FUNCTION__, skt->nr);
debug(skt, 2, "suspending socket\n");
ret = sa1100_pcmcia_config_skt(skt, &dead_socket);
if (ret == 0)
......@@ -260,7 +272,7 @@ static void sa1100_check_status(struct sa1100_pcmcia_socket *skt)
{
unsigned int events;
DEBUG(4, "%s(): entering PCMCIA monitoring thread\n", __FUNCTION__);
debug(skt, 4, "entering PCMCIA monitoring thread\n");
do {
unsigned int status;
......@@ -273,7 +285,7 @@ static void sa1100_check_status(struct sa1100_pcmcia_socket *skt)
skt->status = status;
spin_unlock_irqrestore(&status_lock, flags);
DEBUG(2, "events: %s%s%s%s%s%s\n",
debug(skt, 4, "events: %s%s%s%s%s%s\n",
events == 0 ? "<NONE>" : "",
events & SS_DETECT ? "DETECT " : "",
events & SS_READY ? "READY " : "",
......@@ -293,7 +305,7 @@ static void sa1100_check_status(struct sa1100_pcmcia_socket *skt)
static void sa1100_pcmcia_poll_event(unsigned long dummy)
{
struct sa1100_pcmcia_socket *skt = (struct sa1100_pcmcia_socket *)dummy;
DEBUG(4, "%s(): polling for events\n", __FUNCTION__);
debug(skt, 4, "polling for events\n");
mod_timer(&skt->poll_timer, jiffies + SA1100_PCMCIA_POLL_PERIOD);
......@@ -314,7 +326,7 @@ static irqreturn_t sa1100_pcmcia_interrupt(int irq, void *dev, struct pt_regs *r
{
struct sa1100_pcmcia_socket *skt = dev;
DEBUG(3, "%s(): servicing IRQ %d\n", __FUNCTION__, irq);
debug(skt, 3, "servicing IRQ %d\n", irq);
sa1100_check_status(skt);
......@@ -363,7 +375,7 @@ sa1100_pcmcia_get_socket(struct pcmcia_socket *sock, socket_state_t *state)
{
struct sa1100_pcmcia_socket *skt = to_sa1100_socket(sock);
DEBUG(2, "%s() for sock %u\n", __FUNCTION__, skt->nr);
debug(skt, 2, "\n");
*state = skt->cs_state;
......@@ -385,22 +397,19 @@ sa1100_pcmcia_set_socket(struct pcmcia_socket *sock, socket_state_t *state)
{
struct sa1100_pcmcia_socket *skt = to_sa1100_socket(sock);
DEBUG(2, "%s() for sock %u\n", __FUNCTION__, skt->nr);
DEBUG(3, "\tmask: %s%s%s%s%s%s\n\tflags: %s%s%s%s%s%s\n",
(state->csc_mask==0)?"<NONE>":"",
debug(skt, 2, "mask: %s%s%s%s%s%sflags: %s%s%s%s%s%sVcc %d Vpp %d irq %d\n",
(state->csc_mask==0)?"<NONE> ":"",
(state->csc_mask&SS_DETECT)?"DETECT ":"",
(state->csc_mask&SS_READY)?"READY ":"",
(state->csc_mask&SS_BATDEAD)?"BATDEAD ":"",
(state->csc_mask&SS_BATWARN)?"BATWARN ":"",
(state->csc_mask&SS_STSCHG)?"STSCHG ":"",
(state->flags==0)?"<NONE>":"",
(state->flags==0)?"<NONE> ":"",
(state->flags&SS_PWR_AUTO)?"PWR_AUTO ":"",
(state->flags&SS_IOCARD)?"IOCARD ":"",
(state->flags&SS_RESET)?"RESET ":"",
(state->flags&SS_SPKR_ENA)?"SPKR_ENA ":"",
(state->flags&SS_OUTPUT_ENA)?"OUTPUT_ENA ":"");
DEBUG(3, "\tVcc %d Vpp %d irq %d\n",
(state->flags&SS_OUTPUT_ENA)?"OUTPUT_ENA ":"",
state->Vcc, state->Vpp, state->io_irq);
return sa1100_pcmcia_config_skt(skt, state);
......@@ -422,11 +431,9 @@ sa1100_pcmcia_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *map)
struct sa1100_pcmcia_socket *skt = to_sa1100_socket(sock);
unsigned short speed = map->speed;
DEBUG(2, "%s() for sock %u\n", __FUNCTION__, skt->nr);
DEBUG(3, "\tmap %u speed %u\n\tstart 0x%08x stop 0x%08x\n",
debug(skt, 2, "map %u speed %u start 0x%08x stop 0x%08x\n",
map->map, map->speed, map->start, map->stop);
DEBUG(3, "\tflags: %s%s%s%s%s%s%s%s\n",
debug(skt, 2, "flags: %s%s%s%s%s%s%s%s\n",
(map->flags==0)?"<NONE>":"",
(map->flags&MAP_ACTIVE)?"ACTIVE ":"",
(map->flags&MAP_16BIT)?"16BIT ":"",
......@@ -479,11 +486,9 @@ sa1100_pcmcia_set_mem_map(struct pcmcia_socket *sock, struct pccard_mem_map *map
struct resource *res;
unsigned short speed = map->speed;
DEBUG(2, "%s() for sock %u\n", __FUNCTION__, skt->nr);
DEBUG(3, "\tmap %u speed %u card_start %08x\n",
debug(skt, 2, "map %u speed %u card_start %08x\n",
map->map, map->speed, map->card_start);
DEBUG(3, "\tflags: %s%s%s%s%s%s%s%s\n",
debug(skt, 2, "flags: %s%s%s%s%s%s%s%s\n",
(map->flags==0)?"<NONE>":"",
(map->flags&MAP_ACTIVE)?"ACTIVE ":"",
(map->flags&MAP_16BIT)?"16BIT ":"",
......@@ -920,23 +925,13 @@ sa1100_pcmcia_notifier(struct notifier_block *nb, unsigned long val,
switch (val) {
case CPUFREQ_PRECHANGE:
if (freqs->new > freqs->old) {
DEBUG(2, "%s(): new frequency %u.%uMHz > %u.%uMHz, "
"pre-updating\n", __FUNCTION__,
freqs->new / 1000, (freqs->new / 100) % 10,
freqs->old / 1000, (freqs->old / 100) % 10);
if (freqs->new > freqs->old)
sa1100_pcmcia_update_mecr(freqs->new);
}
break;
case CPUFREQ_POSTCHANGE:
if (freqs->new < freqs->old) {
DEBUG(2, "%s(): new frequency %u.%uMHz < %u.%uMHz, "
"post-updating\n", __FUNCTION__,
freqs->new / 1000, (freqs->new / 100) % 10,
freqs->old / 1000, (freqs->old / 100) % 10);
if (freqs->new < freqs->old)
sa1100_pcmcia_update_mecr(freqs->new);
}
break;
}
......
......@@ -32,6 +32,7 @@
======================================================================*/
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/fcntl.h>
......@@ -55,14 +56,20 @@
#include <pcmcia/ss.h>
#include "tcic.h"
#ifdef PCMCIA_DEBUG
static int pc_debug = PCMCIA_DEBUG;
#ifdef DEBUG
static int pc_debug;
module_param(pc_debug, int, 0644);
MODULE_PARM(pc_debug, "i");
static const char *version =
"tcic.c 1.111 2000/02/15 04:13:12 (David Hinds)";
#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
#define debug(lvl, fmt, arg...) do { \
if (pc_debug > (lvl)) \
printk(KERN_DEBUG "tcic: " fmt , ## arg); \
} while (0)
#else
#define DEBUG(n, args...)
#define debug(lvl, fmt, arg...) do { } while (0)
#endif
MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
......@@ -133,7 +140,7 @@ static struct tcic_socket socket_table[2];
to map to irq 11, but is coded as 0 or 1 in the irq registers. */
#define TCIC_IRQ(x) ((x) ? (((x) == 11) ? 1 : (x)) : 15)
#ifdef PCMCIA_DEBUG_X
#ifdef DEBUG_X
static u_char tcic_getb(u_char reg)
{
u_char val = inb(tcic_base+reg);
......@@ -168,7 +175,7 @@ static void tcic_setw(u_char reg, u_short data)
static void tcic_setl(u_char reg, u_int data)
{
#ifdef PCMCIA_DEBUG_X
#ifdef DEBUG_X
printk(KERN_DEBUG "tcic_setl(%#x, %#lx)\n", tcic_base+reg, data);
#endif
outw(data & 0xffff, tcic_base+reg);
......@@ -573,7 +580,7 @@ static irqreturn_t tcic_interrupt(int irq, void *dev, struct pt_regs *regs)
} else
active = 1;
DEBUG(2, "tcic: tcic_interrupt()\n");
debug(2, "tcic_interrupt()\n");
for (i = 0; i < sockets; i++) {
psock = socket_table[i].psock;
......@@ -610,13 +617,13 @@ static irqreturn_t tcic_interrupt(int irq, void *dev, struct pt_regs *regs)
}
active = 0;
DEBUG(2, "tcic: interrupt done\n");
debug(2, "interrupt done\n");
return IRQ_HANDLED;
} /* tcic_interrupt */
static void tcic_timer(u_long data)
{
DEBUG(2, "tcic: tcic_timer()\n");
debug(2, "tcic_timer()\n");
tcic_timer_pending = 0;
tcic_interrupt(0, NULL, NULL);
} /* tcic_timer */
......@@ -643,7 +650,7 @@ static int tcic_get_status(struct pcmcia_socket *sock, u_int *value)
reg = tcic_getb(TCIC_PWR);
if (reg & (TCIC_PWR_VCC(psock)|TCIC_PWR_VPP(psock)))
*value |= SS_POWERON;
DEBUG(1, "tcic: GetStatus(%d) = %#2.2x\n", psock, *value);
debug(1, "GetStatus(%d) = %#2.2x\n", psock, *value);
return 0;
} /* tcic_get_status */
......@@ -694,7 +701,7 @@ static int tcic_get_socket(struct pcmcia_socket *sock, socket_state_t *state)
state->csc_mask |= (scf2 & TCIC_SCF2_MRDY) ? 0 : SS_READY;
}
DEBUG(1, "tcic: GetSocket(%d) = flags %#3.3x, Vcc %d, Vpp %d, "
debug(1, "GetSocket(%d) = flags %#3.3x, Vcc %d, Vpp %d, "
"io_irq %d, csc_mask %#2.2x\n", psock, state->flags,
state->Vcc, state->Vpp, state->io_irq, state->csc_mask);
return 0;
......@@ -708,7 +715,7 @@ static int tcic_set_socket(struct pcmcia_socket *sock, socket_state_t *state)
u_char reg;
u_short scf1, scf2;
DEBUG(1, "tcic: SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
debug(1, "SetSocket(%d, flags %#3.3x, Vcc %d, Vpp %d, "
"io_irq %d, csc_mask %#2.2x)\n", psock, state->flags,
state->Vcc, state->Vpp, state->io_irq, state->csc_mask);
tcic_setw(TCIC_ADDR+2, (psock << TCIC_SS_SHFT) | TCIC_ADR2_INDREG);
......@@ -783,7 +790,7 @@ static int tcic_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *io)
u_int addr;
u_short base, len, ioctl;
DEBUG(1, "tcic: SetIOMap(%d, %d, %#2.2x, %d ns, "
debug(1, "SetIOMap(%d, %d, %#2.2x, %d ns, "
"%#4.4x-%#4.4x)\n", psock, io->map, io->flags,
io->speed, io->start, io->stop);
if ((io->map > 1) || (io->start > 0xffff) || (io->stop > 0xffff) ||
......@@ -820,7 +827,7 @@ static int tcic_set_mem_map(struct pcmcia_socket *sock, struct pccard_mem_map *m
u_short addr, ctl;
u_long base, len, mmap;
DEBUG(1, "tcic: SetMemMap(%d, %d, %#2.2x, %d ns, "
debug(1, "SetMemMap(%d, %d, %#2.2x, %d ns, "
"%#5.5lx-%#5.5lx, %#5.5x)\n", psock, mem->map, mem->flags,
mem->speed, mem->sys_start, mem->sys_stop, mem->card_start);
if ((mem->map > 3) || (mem->card_start > 0x3ffffff) ||
......
......@@ -30,9 +30,9 @@
#if 0
#define DEBUG(x,args...) printk(KERN_DEBUG "%s: " x, __FUNCTION__, ##args)
#define debug(x,args...) printk(KERN_DEBUG "%s: " x, __func__ , ##args)
#else
#define DEBUG(x,args...)
#define debug(x,args...)
#endif
/* Don't ask.. */
......@@ -47,13 +47,13 @@
static inline u32 cb_readl(struct yenta_socket *socket, unsigned reg)
{
u32 val = readl(socket->base + reg);
DEBUG("%p %04x %08x\n", socket, reg, val);
debug("%p %04x %08x\n", socket, reg, val);
return val;
}
static inline void cb_writel(struct yenta_socket *socket, unsigned reg, u32 val)
{
DEBUG("%p %04x %08x\n", socket, reg, val);
debug("%p %04x %08x\n", socket, reg, val);
writel(val, socket->base + reg);
}
......@@ -61,7 +61,7 @@ static inline u8 config_readb(struct yenta_socket *socket, unsigned offset)
{
u8 val;
pci_read_config_byte(socket->dev, offset, &val);
DEBUG("%p %04x %02x\n", socket, offset, val);
debug("%p %04x %02x\n", socket, offset, val);
return val;
}
......@@ -69,7 +69,7 @@ static inline u16 config_readw(struct yenta_socket *socket, unsigned offset)
{
u16 val;
pci_read_config_word(socket->dev, offset, &val);
DEBUG("%p %04x %04x\n", socket, offset, val);
debug("%p %04x %04x\n", socket, offset, val);
return val;
}
......@@ -77,32 +77,32 @@ static inline u32 config_readl(struct yenta_socket *socket, unsigned offset)
{
u32 val;
pci_read_config_dword(socket->dev, offset, &val);
DEBUG("%p %04x %08x\n", socket, offset, val);
debug("%p %04x %08x\n", socket, offset, val);
return val;
}
static inline void config_writeb(struct yenta_socket *socket, unsigned offset, u8 val)
{
DEBUG("%p %04x %02x\n", socket, offset, val);
debug("%p %04x %02x\n", socket, offset, val);
pci_write_config_byte(socket->dev, offset, val);
}
static inline void config_writew(struct yenta_socket *socket, unsigned offset, u16 val)
{
DEBUG("%p %04x %04x\n", socket, offset, val);
debug("%p %04x %04x\n", socket, offset, val);
pci_write_config_word(socket->dev, offset, val);
}
static inline void config_writel(struct yenta_socket *socket, unsigned offset, u32 val)
{
DEBUG("%p %04x %08x\n", socket, offset, val);
debug("%p %04x %08x\n", socket, offset, val);
pci_write_config_dword(socket->dev, offset, val);
}
static inline u8 exca_readb(struct yenta_socket *socket, unsigned reg)
{
u8 val = readb(socket->base + 0x800 + reg);
DEBUG("%p %04x %02x\n", socket, reg, val);
debug("%p %04x %02x\n", socket, reg, val);
return val;
}
......@@ -111,19 +111,19 @@ static inline u8 exca_readw(struct yenta_socket *socket, unsigned reg)
u16 val;
val = readb(socket->base + 0x800 + reg);
val |= readb(socket->base + 0x800 + reg + 1) << 8;
DEBUG("%p %04x %04x\n", socket, reg, val);
debug("%p %04x %04x\n", socket, reg, val);
return val;
}
static inline void exca_writeb(struct yenta_socket *socket, unsigned reg, u8 val)
{
DEBUG("%p %04x %02x\n", socket, reg, val);
debug("%p %04x %02x\n", socket, reg, val);
writeb(val, socket->base + 0x800 + reg);
}
static void exca_writew(struct yenta_socket *socket, unsigned reg, u16 val)
{
DEBUG("%p %04x %04x\n", socket, reg, val);
debug("%p %04x %04x\n", socket, reg, val);
writeb(val, socket->base + 0x800 + reg);
writeb(val >> 8, socket->base + 0x800 + reg + 1);
}
......
......@@ -422,8 +422,6 @@ enum service {
};
int pcmcia_access_configuration_register(client_handle_t handle, conf_reg_t *reg);
int pcmcia_bind_device(bind_req_t *req);
int pcmcia_bind_mtd(mtd_bind_t *req);
int pcmcia_deregister_client(client_handle_t handle);
int pcmcia_get_configuration_info(client_handle_t handle, config_info_t *config);
int pcmcia_get_card_services_info(servinfo_t *info);
......@@ -447,10 +445,10 @@ int pcmcia_request_io(client_handle_t handle, io_req_t *req);
int pcmcia_request_irq(client_handle_t handle, irq_req_t *req);
int pcmcia_request_window(client_handle_t *handle, win_req_t *req, window_handle_t *wh);
int pcmcia_reset_card(client_handle_t handle, client_req_t *req);
int pcmcia_suspend_card(client_handle_t handle, client_req_t *req);
int pcmcia_resume_card(client_handle_t handle, client_req_t *req);
int pcmcia_eject_card(client_handle_t handle, client_req_t *req);
int pcmcia_insert_card(client_handle_t handle, client_req_t *req);
int pcmcia_suspend_card(struct pcmcia_socket *skt);
int pcmcia_resume_card(struct pcmcia_socket *skt);
int pcmcia_eject_card(struct pcmcia_socket *skt);
int pcmcia_insert_card(struct pcmcia_socket *skt);
int pcmcia_set_event_mask(client_handle_t handle, eventmask_t *mask);
int pcmcia_report_error(client_handle_t handle, error_info_t *err);
struct pci_bus *pcmcia_lookup_bus(client_handle_t handle);
......
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