From: Andy P. <at...@us...> - 2002-04-09 17:08:31
|
Update of /cvsroot/linux-vax/kernel-2.4/drivers/telephony In directory usw-pr-cvs1:/tmp/cvs-serv6177/telephony Modified Files: Config.in Makefile ixj.c ixj.h phonedev.c Added Files: ixj-ver.h ixj_pcmcia.c Log Message: synch 2.4.15 commit 27 --- NEW FILE --- /* configuration management identifiers */ #define IXJ_VER_MAJOR 1 #define IXJ_VER_MINOR 0 #define IXJ_BLD_VER 1 --- NEW FILE --- #include "ixj-ver.h" #include <linux/module.h> #include <linux/init.h> #include <linux/sched.h> #include <linux/kernel.h> /* printk() */ #include <linux/fs.h> /* everything... */ #include <linux/errno.h> /* error codes */ #include <linux/slab.h> #include <pcmcia/version.h> #include <pcmcia/cs_types.h> #include <pcmcia/cs.h> #include <pcmcia/cistpl.h> #include <pcmcia/ds.h> #include "ixj.h" /* * PCMCIA service support for Quicknet cards */ #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) #else #define DEBUG(n, args...) #endif typedef struct ixj_info_t { int ndev; dev_node_t node; struct ixj *port; } ixj_info_t; static dev_link_t *ixj_attach(void); static void ixj_detach(dev_link_t *); static void ixj_config(dev_link_t * link); static void ixj_cs_release(u_long arg); static int ixj_event(event_t event, int priority, event_callback_args_t * args); static dev_info_t dev_info = "ixj_cs"; static dev_link_t *dev_list = NULL; static void cs_error(client_handle_t handle, int func, int ret) { error_info_t err = { func, ret }; CardServices(ReportError, handle, &err); } static dev_link_t *ixj_attach(void) { client_reg_t client_reg; dev_link_t *link; int ret; DEBUG(0, "ixj_attach()\n"); /* Create new ixj device */ link = kmalloc(sizeof(struct dev_link_t), GFP_KERNEL); if (!link) return NULL; memset(link, 0, sizeof(struct dev_link_t)); link->release.function = &ixj_cs_release; link->release.data = (u_long) link; link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; link->io.Attributes2 = IO_DATA_PATH_WIDTH_8; link->io.IOAddrLines = 3; link->conf.Vcc = 50; link->conf.IntType = INT_MEMORY_AND_IO; link->priv = kmalloc(sizeof(struct ixj_info_t), GFP_KERNEL); if (!link->priv) return NULL; memset(link->priv, 0, sizeof(struct ixj_info_t)); /* Register with Card Services */ link->next = dev_list; dev_list = link; client_reg.dev_info = &dev_info; client_reg.Attributes = INFO_IO_CLIENT | INFO_CARD_SHARE; client_reg.EventMask = CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL | CS_EVENT_RESET_PHYSICAL | CS_EVENT_CARD_RESET | CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME; client_reg.event_handler = &ixj_event; client_reg.Version = 0x0210; client_reg.event_callback_args.client_data = link; ret = CardServices(RegisterClient, &link->handle, &client_reg); if (ret != CS_SUCCESS) { cs_error(link->handle, RegisterClient, ret); ixj_detach(link); return NULL; } return link; } static void ixj_detach(dev_link_t * link) { dev_link_t **linkp; long flags; int ret; DEBUG(0, "ixj_detach(0x%p)\n", link); for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) if (*linkp == link) break; if (*linkp == NULL) return; save_flags(flags); cli(); if (link->state & DEV_RELEASE_PENDING) { del_timer(&link->release); link->state &= ~DEV_RELEASE_PENDING; } restore_flags(flags); if (link->state & DEV_CONFIG) ixj_cs_release((u_long) link); if (link->handle) { ret = CardServices(DeregisterClient, link->handle); if (ret != CS_SUCCESS) cs_error(link->handle, DeregisterClient, ret); } /* Unlink device structure, free bits */ *linkp = link->next; kfree(link->priv); kfree(link); } #define CS_CHECK(fn, args...) \ while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed #define CFG_CHECK(fn, args...) \ if (CardServices(fn, args) != 0) goto next_entry static void ixj_get_serial(dev_link_t * link, IXJ * j) { client_handle_t handle; tuple_t tuple; u_short buf[128]; char *str; int last_ret, last_fn, i, place; handle = link->handle; DEBUG(0, "ixj_get_serial(0x%p)\n", link); tuple.TupleData = (cisdata_t *) buf; tuple.TupleOffset = 0; tuple.TupleDataMax = 80; tuple.Attributes = 0; tuple.DesiredTuple = CISTPL_VERS_1; CS_CHECK(GetFirstTuple, handle, &tuple); CS_CHECK(GetTupleData, handle, &tuple); str = (char *) buf; printk("PCMCIA Version %d.%d\n", str[0], str[1]); str += 2; printk("%s", str); str = str + strlen(str) + 1; printk(" %s", str); str = str + strlen(str) + 1; place = 1; for (i = strlen(str) - 1; i >= 0; i--) { switch (str[i]) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': j->serial += (str[i] - 48) * place; break; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': j->serial += (str[i] - 55) * place; break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': j->serial += (str[i] - 87) * place; break; } place = place * 0x10; } str = str + strlen(str) + 1; printk(" version %s\n", str); cs_failed: return; } static void ixj_config(dev_link_t * link) { IXJ *j; client_handle_t handle; ixj_info_t *info; tuple_t tuple; u_short buf[128]; cisparse_t parse; config_info_t conf; cistpl_cftable_entry_t *cfg = &parse.cftable_entry; cistpl_cftable_entry_t dflt = { 0 }; int last_ret, last_fn; handle = link->handle; info = link->priv; DEBUG(0, "ixj_config(0x%p)\n", link); tuple.TupleData = (cisdata_t *) buf; tuple.TupleOffset = 0; tuple.TupleDataMax = 255; tuple.Attributes = 0; tuple.DesiredTuple = CISTPL_CONFIG; CS_CHECK(GetFirstTuple, handle, &tuple); CS_CHECK(GetTupleData, handle, &tuple); CS_CHECK(ParseTuple, handle, &tuple, &parse); link->conf.ConfigBase = parse.config.base; link->conf.Present = parse.config.rmask[0]; link->state |= DEV_CONFIG; CS_CHECK(GetConfigurationInfo, handle, &conf); tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; tuple.Attributes = 0; CS_CHECK(GetFirstTuple, handle, &tuple); while (1) { CFG_CHECK(GetTupleData, handle, &tuple); CFG_CHECK(ParseTuple, handle, &tuple, &parse); if ((cfg->io.nwin > 0) || (dflt.io.nwin > 0)) { cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt.io; link->conf.ConfigIndex = cfg->index; link->io.BasePort1 = io->win[0].base; link->io.NumPorts1 = io->win[0].len; if (io->nwin == 2) { link->io.BasePort2 = io->win[1].base; link->io.NumPorts2 = io->win[1].len; } CFG_CHECK(RequestIO, link->handle, &link->io); /* If we've got this far, we're done */ break; } next_entry: if (cfg->flags & CISTPL_CFTABLE_DEFAULT) dflt = *cfg; CS_CHECK(GetNextTuple, handle, &tuple); } CS_CHECK(RequestConfiguration, handle, &link->conf); /* * Register the card with the core. */ j=ixj_pcmcia_probe(link->io.BasePort1,link->io.BasePort1 + 0x10); info->ndev = 1; info->node.major = PHONE_MAJOR; link->dev = &info->node; ixj_get_serial(link, j); link->state &= ~DEV_CONFIG_PENDING; return; cs_failed: cs_error(link->handle, last_fn, last_ret); ixj_cs_release((u_long) link); } static void ixj_cs_release(u_long arg) { dev_link_t *link = (dev_link_t *) arg; ixj_info_t *info = link->priv; DEBUG(0, "ixj_cs_release(0x%p)\n", link); info->ndev = 0; link->dev = NULL; CardServices(ReleaseConfiguration, link->handle); CardServices(ReleaseIO, link->handle, &link->io); link->state &= ~DEV_CONFIG; } static int ixj_event(event_t event, int priority, event_callback_args_t * args) { dev_link_t *link = args->client_data; DEBUG(1, "ixj_event(0x%06x)\n", event); switch (event) { case CS_EVENT_CARD_REMOVAL: link->state &= ~DEV_PRESENT; if (link->state & DEV_CONFIG) { link->release.expires = jiffies + (HZ / 20); link->state |= DEV_RELEASE_PENDING; add_timer(&link->release); } break; case CS_EVENT_CARD_INSERTION: link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; ixj_config(link); break; case CS_EVENT_PM_SUSPEND: link->state |= DEV_SUSPEND; /* Fall through... */ case CS_EVENT_RESET_PHYSICAL: if (link->state & DEV_CONFIG) CardServices(ReleaseConfiguration, link->handle); break; case CS_EVENT_PM_RESUME: link->state &= ~DEV_SUSPEND; /* Fall through... */ case CS_EVENT_CARD_RESET: if (DEV_OK(link)) CardServices(RequestConfiguration, link->handle, &link->conf); break; } return 0; } int __init ixj_register_pcmcia(void) { servinfo_t serv; DEBUG(0, "%s\n", version); CardServices(GetCardServicesInfo, &serv); if (serv.Revision != CS_RELEASE_CODE) { printk(KERN_NOTICE "ixj_cs: Card Services release does not match!\n"); return -EINVAL; } register_pcmcia_driver(&dev_info, &ixj_attach, &ixj_detach); return 0; } static void ixj_pcmcia_unload(void) { DEBUG(0, "ixj_cs: unloading\n"); unregister_pcmcia_driver(&dev_info); while (dev_list != NULL) ixj_detach(dev_list); } module_init(ixj_register_pcmcia); module_exit(ixj_pcmcia_unload); MODULE_LICENSE("GPL"); Index: Config.in =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/drivers/telephony/Config.in,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -r1.1.1.1 -r1.2 --- Config.in 14 Jan 2001 19:10:06 -0000 1.1.1.1 +++ Config.in 9 Apr 2002 16:45:53 -0000 1.2 @@ -6,4 +6,5 @@ tristate 'Linux telephony support' CONFIG_PHONE dep_tristate 'QuickNet Internet LineJack/PhoneJack support' CONFIG_PHONE_IXJ $CONFIG_PHONE +dep_tristate 'QuickNet Internet LineJack/PhoneJack PCMCIA support' CONFIG_PHONE_IXJ_PCMCIA $CONFIG_PHONE_IXJ endmenu Index: Makefile =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/drivers/telephony/Makefile,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -r1.1.1.1 -r1.2 --- Makefile 14 Jan 2001 19:10:06 -0000 1.1.1.1 +++ Makefile 9 Apr 2002 16:45:53 -0000 1.2 @@ -10,10 +10,11 @@ obj-n := obj-m := obj- := -export-objs := phonedev.o +export-objs := phonedev.o ixj.o obj-$(CONFIG_PHONE) += phonedev.o obj-$(CONFIG_PHONE_IXJ) += ixj.o +obj-$(CONFIG_PHONE_IXJ_PCMCIA) += ixj_pcmcia.o O_TARGET := telephony.o Index: ixj.c =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/drivers/telephony/ixj.c,v retrieving revision 1.1.1.2 retrieving revision 1.2 diff -u -r1.1.1.2 -r1.2 --- ixj.c 25 Feb 2001 23:15:14 -0000 1.1.1.2 +++ ixj.c 9 Apr 2002 16:45:53 -0000 1.2 @@ -1,10 +1,12 @@ /**************************************************************************** * ixj.c * - * Device Driver for the Internet PhoneJACK and - * Internet LineJACK Telephony Cards. + * Device Driver for Quicknet Technologies, Inc.'s Telephony cards + * including the Internet PhoneJACK, Internet PhoneJACK Lite, + * Internet PhoneJACK PCI, Internet LineJACK, Internet PhoneCARD and + * SmartCABLE * - * (c) Copyright 1999-2000 Quicknet Technologies, Inc. [...11308 lines suppressed...] + return 0; +} + static int ixj_init_tone(IXJ *j, IXJ_TONE * ti) { int freq0, freq1; @@ -9230,7 +10674,7 @@ { if (ixj_WriteDSPCommand(0x6800 + ti->tone_index, j)) return -1; - if (ixj_WriteDSPCommand(0x6000 + (ti->gain0 << 4) + ti->gain1, j)) + if (ixj_WriteDSPCommand(0x6000 + (ti->gain1 << 4) + ti->gain0, j)) return -1; data = freq0; if (ixj_WriteDSPCommand(data, j)) @@ -9241,3 +10685,4 @@ } return freq0; } + Index: ixj.h =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/drivers/telephony/ixj.h,v retrieving revision 1.1.1.2 retrieving revision 1.2 diff -u -r1.1.1.2 -r1.2 --- ixj.h 25 Feb 2001 23:15:14 -0000 1.1.1.2 +++ ixj.h 9 Apr 2002 16:45:53 -0000 1.2 @@ -1,10 +1,13 @@ /****************************************************************************** * ixj.h * - * Device Driver for the Internet PhoneJACK and - * Internet LineJACK Telephony Cards. * - * (c) Copyright 1999 Quicknet Technologies, Inc. + * Device Driver for Quicknet Technologies, Inc.'s Telephony cards + * including the Internet PhoneJACK, Internet PhoneJACK Lite, + * Internet PhoneJACK PCI, Internet LineJACK, Internet PhoneCARD and + * SmartCABLE [...1116 lines suppressed...] + unsigned long iscontrolready; + unsigned long iscontrolreadyfail; + unsigned long pstnstatecheck; +#ifdef IXJ_DYN_ALLOC + short *fskdata; +#else short fskdata[8000]; +#endif + int fsksize; int fskdcnt; } IXJ; -int ixj_WriteDSPCommand(unsigned short, IXJ *); - typedef int (*IXJ_REGFUNC) (IXJ * j, unsigned long arg); -int ixj_register(int index, IXJ_REGFUNC regfunc); -int ixj_unregister(int index); +extern IXJ *ixj_pcmcia_probe(unsigned long, unsigned long); + Index: phonedev.c =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/drivers/telephony/phonedev.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -r1.1.1.1 -r1.2 --- phonedev.c 14 Jan 2001 19:10:46 -0000 1.1.1.1 +++ phonedev.c 9 Apr 2002 16:45:53 -0000 1.2 @@ -167,5 +167,7 @@ module_init(telephony_init); module_exit(telephony_exit); +MODULE_LICENSE("GPL"); + EXPORT_SYMBOL(phone_register_device); EXPORT_SYMBOL(phone_unregister_device); |