diff options
author | Philip Balister <philip@balister.org> | 2007-09-29 20:43:38 +0000 |
---|---|---|
committer | Philip Balister <philip@balister.org> | 2007-09-29 20:43:38 +0000 |
commit | ea52a2ce713343961a660f74efd5fbff95668f94 (patch) | |
tree | 4c83af5a077ed985c6ac4c73f04995c29e56ab5f /packages/wifistix/wifistix-modules/2.6.17-new-pcmcia-layer.patch | |
parent | 6feecb2942024a270c39b50d6892be3f421dcab6 (diff) |
wifistix : Add driver for Marvell cf8385 wireless interface driver for gumstix.
Diffstat (limited to 'packages/wifistix/wifistix-modules/2.6.17-new-pcmcia-layer.patch')
-rw-r--r-- | packages/wifistix/wifistix-modules/2.6.17-new-pcmcia-layer.patch | 484 |
1 files changed, 484 insertions, 0 deletions
diff --git a/packages/wifistix/wifistix-modules/2.6.17-new-pcmcia-layer.patch b/packages/wifistix/wifistix-modules/2.6.17-new-pcmcia-layer.patch new file mode 100644 index 0000000000..209df1b121 --- /dev/null +++ b/packages/wifistix/wifistix-modules/2.6.17-new-pcmcia-layer.patch @@ -0,0 +1,484 @@ +Index: src_cf8385/io/mcf/cf_io.c +=================================================================== +--- src_cf8385.orig/io/mcf/cf_io.c ++++ src_cf8385/io/mcf/cf_io.c +@@ -49,17 +49,15 @@ Change log: + + dev_info_t cfio_dev_info = "mcf25"; + +-dev_link_t *dev_list = NULL; +- +-MODULE_PARM(interrupt_steer, "1-4i"); +- +-INT_MODULE_PARM(irq_mask, CF_IRQMASK); +- + /* Module Variables */ + static int interrupt_steer[IRQINFO2_LEN] = { -1 }; ++static u_int irq_mask = CF_IRQMASK; ++ ++module_param_array(interrupt_steer, int, NULL, 0); ++module_param(irq_mask, int, 0); + + typedef struct _if_pcmcia_info_t { +- dev_link_t link; ++ struct pcmcia_device *p_dev; + dev_node_t node; + int stop; + struct bus_operations *bus; +@@ -81,22 +79,9 @@ struct cf_card_rec cardp; + * @param arg pointer to dev_link_t + * @return N/A + */ +-static void cf_release(ulong arg) ++static void mv8385_cf_release(struct pcmcia_device *arg) + { +- dev_link_t *link = (dev_link_t *) arg; +- +- link->dev = NULL; +- +- link->conf.Vcc = 0; +- pcmcia_release_configuration(link->handle); +- if (link->io.NumPorts1) +- pcmcia_release_io(link->handle, &link->io); +- +- if (link->irq.AssignedIRQ) +- pcmcia_release_irq(link->handle, &link->irq); +- +- link->state &= ~DEV_CONFIG; +- ++ pcmcia_disable_device(arg); + } /* cf_release */ + + +@@ -107,41 +92,9 @@ static void cf_release(ulong arg) + * @return N/A + */ + +-static void cf_detach(dev_link_t * link) ++static void mv8385_cf_detach(struct pcmcia_device * link) + { +- dev_link_t **p; +- +- for (p = &dev_list; *p; p = &(*p)->next) +- if (*p == link) +- break; +- +- if (*p == NULL) +- return; +- +-#ifdef LINUX_2_4 +- del_timer_sync(&link->release); +-#endif +- +- if (((if_pcmcia_info_t *) link->priv)->eth_dev) { +- printk("Before calling wlan_remove function\n"); +- cardp.remove(&cardp); +- printk("After calling wlan_remove function\n"); +- } +- +- if (link->state & DEV_CONFIG) { +- cf_release((u32) link); +- } +- +- ((if_pcmcia_info_t *) link->priv)->eth_dev = NULL; +- +- if (link->handle) { +-#ifdef LINUX_2_4 +- pcmcia_reset_card(link->handle, NULL); +-#endif +- pcmcia_deregister_client(link->handle); +- } +- +- *p = link->next; ++ mv8385_cf_release(link); + /* This points to the parent if_pcmcia_info_t struct */ + if (link->priv) + kfree(link->priv); +@@ -152,9 +105,8 @@ static void cf_detach(dev_link_t * link) + * @param link pointer to dev_link_t + * @return N/A + */ +-static void cf_config(dev_link_t * link) ++static int mv8385_cf_config(struct pcmcia_device * link) + { +- client_handle_t handle = link->handle; + if_pcmcia_info_t *dev = link->priv; + tuple_t tuple; + cisparse_t parse; +@@ -169,22 +121,14 @@ static void cf_config(dev_link_t * link) + tuple.TupleDataMax = sizeof(buf); + tuple.TupleOffset = 0; + +- if (pcmcia_get_first_tuple(handle, &tuple)) +- goto onerror; +- if (pcmcia_get_tuple_data(handle, &tuple)) +- goto onerror; +- if (pcmcia_parse_tuple(handle, &tuple, &parse)) +- goto onerror; ++ if(pcmcia_get_first_tuple(link, &tuple)) goto onerror; ++ if(pcmcia_get_tuple_data(link, &tuple)) goto onerror; ++ if(pcmcia_parse_tuple(link, &tuple, &parse)) goto onerror; + + link->conf.ConfigBase = parse.config.base; + link->conf.Present = parse.config.rmask[0]; + +- link->state |= DEV_CONFIG; +- +- if (pcmcia_get_configuration_info(handle, &conf)) +- goto onerror; +- +- link->conf.Vcc = conf.Vcc; ++ if(pcmcia_get_configuration_info(link, &conf)) goto onerror; + + /* + The Configuration table consists of a series of configuration table +@@ -194,15 +138,9 @@ static void cf_config(dev_link_t * link) + + tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; + +- if (pcmcia_get_first_tuple(handle, &tuple)) +- goto onerror; +- +- if (pcmcia_get_tuple_data(handle, &tuple) != CS_SUCCESS) +- goto onerror; +- +- if (pcmcia_parse_tuple(handle, &tuple, &parse) != CS_SUCCESS) +- goto onerror; +- ++ if(pcmcia_get_first_tuple(link, &tuple)) goto onerror; ++ if (pcmcia_get_tuple_data(link, &tuple) != CS_SUCCESS || ++ pcmcia_parse_tuple(link, &tuple, &parse) != CS_SUCCESS) goto onerror; + + link->conf.ConfigIndex = cfg->index; + +@@ -237,19 +175,18 @@ static void cf_config(dev_link_t * link) + link->io.NumPorts2 = io->win[1].len; + } + +- if (pcmcia_request_io(link->handle, &link->io) ++ if (pcmcia_request_io(link, &link->io) + != CS_SUCCESS) { +- pcmcia_release_io(link->handle, &link->io); + printk("Request IO Error !!\n"); + goto onerror; + } + } + + if (link->conf.Attributes & CONF_ENABLE_IRQ) +- if (pcmcia_request_irq(link->handle, &link->irq)) ++ if (pcmcia_request_irq(link, &link->irq)) + goto onerror; + +- if (pcmcia_request_configuration(link->handle, &link->conf)) ++ if (pcmcia_request_configuration(link, &link->conf)) + goto onerror; + + cardp.irq = link->irq.AssignedIRQ; +@@ -271,97 +208,40 @@ static void cf_config(dev_link_t * link) + + strcpy(dev->node.dev_name, cardp.eth_dev->name); + dev->node.major = dev->node.minor = 0; +- link->dev = &dev->node; ++ link->dev_node = &dev->node; + +- link->state &= ~DEV_CONFIG_PENDING; +- return; ++ return 0; + + onerror: + printk("card configuration failed...calling cf_release function\n"); +- cf_release((u32) link); +- link->state &= ~DEV_CONFIG_PENDING; ++ mv8385_cf_release(link); + cardp.flag = 1; ++ return -ENODEV; + + } /* cf_config */ + + + /** +- * @brief CF BUS driver Event handler +- * @param event event id +- * @param priority event priority +- * @param args pointer to event_callback_args_t +- * @return 0 +- */ +-static int cf_event(event_t event, int priority, event_callback_args_t *args) +-{ +- dev_link_t *link = args->client_data; +- if_pcmcia_info_t *dev = link->priv; +- +- switch (event) { +- case CS_EVENT_CARD_INSERTION: +- link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; +-#ifdef LINUX_2_4 +- dev->bus = args->bus; +-#endif +- cf_config(link); +- break; +- +- case CS_EVENT_CARD_REMOVAL: +- link->state &= ~DEV_PRESENT; +- printk("card removal event detected\n"); +- if (link->state & DEV_CONFIG) { +- ((if_pcmcia_info_t *) link->priv)->stop = 1; +- printk("Before calling release function\n"); +-#ifdef LINUX_2_4 +-#define REMOVE_TIMEOUT (HZ/20) +- mod_timer(&link->release, jiffies + REMOVE_TIMEOUT); +-#else +- cf_detach(link); +-#endif +- printk("After calling release function\n"); +- } +- break; +- case CS_EVENT_CARD_RESET: +- if (link->state & DEV_CONFIG) { +- pcmcia_request_configuration(link->handle, &link->conf); +- } +- dev->stop = 0; +- break; +- } +- +- return 0; +-} /* cf_event */ +- +-/** + * @brief attach CF BUS driver + * @return pointer to dev_link_t + */ + +-static dev_link_t *cf_attach(void) ++static int mv8385_cf_probe(struct pcmcia_device *link) + { + u8 i; +- int status; + if_pcmcia_info_t *ifinfo; +- dev_link_t *link; +- client_reg_t client_reg; + + printk("Entering cf_attach()\n"); + + /* Allocate space for PCMCIA information */ + if (!(ifinfo = kmalloc(sizeof(if_pcmcia_info_t), GFP_KERNEL))) { +- return NULL; ++ return -ENOMEM; + } + + memset(ifinfo, 0, sizeof(if_pcmcia_info_t)); +- link = &ifinfo->link; ++ ifinfo->p_dev = link; + link->priv = ifinfo; + +-#ifdef LINUX_2_4 +- init_timer(&link->release); +- link->release.function = &cf_release; +- link->release.data = (ulong) link; +-#endif +- + link->irq.Attributes = IRQ_TYPE_EXCLUSIVE; + link->irq.IRQInfo1 = IRQ_INFO2_VALID | IRQ_LEVEL_ID; + +@@ -380,38 +260,13 @@ static dev_link_t *cf_attach(void) + link->irq.Handler = NULL; + + link->conf.Attributes = 0; +-#define VCC_VALUE 50 +- link->conf.Vcc = VCC_VALUE; +- link->conf.Vpp1 = 0; +- link->conf.Vpp2 = 0; ++ link->conf.Vpp = 0; + link->conf.IntType = INT_MEMORY_AND_IO; + link->conf.ConfigIndex = 1; + link->conf.Present = PRESENT_OPTION; + +- link->next = dev_list; +- dev_list = link; +- client_reg.dev_info = &cfio_dev_info; +- client_reg.Attributes = INFO_IO_CLIENT | INFO_CARD_SHARE; +- client_reg.EventMask = CS_EVENT_CARD_INSERTION | +- CS_EVENT_CARD_REMOVAL | CS_EVENT_CARD_RESET; +- client_reg.event_handler = &cf_event; +- client_reg.event_callback_args.client_data = link; +- client_reg.Version = CF_VERSION; +- +- printk("Before registering the client\n"); +- +- if ((status = pcmcia_register_client(&link->handle, +- &client_reg)) != CS_SUCCESS) { +- printk("Registering the client failed\n"); +- CS_ERROR(link->handle, RegisterClient, status); +- cf_detach(link); +- return NULL; +- } +- +- printk("Leaving cf_attach()\n"); +- +- return link; +-} /* cf_attach */ ++ return mv8385_cf_config(link); ++} /* cf_probe */ + + + #ifndef LINUX_2_4 +@@ -428,9 +283,8 @@ static struct pcmcia_driver cfio_cs_driv + .drv = { + .name = "mcf25" + }, +- .attach = cf_attach, +- .detach = cf_detach, +- .event = cf_event, ++ .probe = mv8385_cf_probe, ++ .remove = mv8385_cf_detach, + .id_table = cfio_ids, + }; + #endif +@@ -449,28 +303,11 @@ static struct pcmcia_driver cfio_cs_driv + u32 *register_cf_driver(cf_notifier_fn_add add, + cf_notifier_fn_remove remove, void *arg) + { +-#ifdef LINUX_2_4 +- servinfo_t serv; +-#endif +- + cardp.add = add; + cardp.remove = remove; + cardp.host_int_mask = 0; +- +-#ifdef LINUX_2_4 +- pcmcia_get_card_services_info(&serv); +- +- if (serv.Revision != CS_RELEASE_CODE) { +- return NULL; +- } +-#endif +- + printk("Before register driver\n"); +-#ifdef LINUX_2_4 +- register_pccard_driver(&cfio_dev_info, &cf_attach, &cf_detach); +-#else + pcmcia_register_driver(&cfio_cs_driver); +-#endif + printk("After register driver\n"); + + return (u32 *) &cardp; +@@ -482,22 +319,7 @@ u32 *register_cf_driver(cf_notifier_fn_a + */ + void unregister_cf_driver( void ) + { +- +-#ifdef LINUX_2_4 +- unregister_pccard_driver(&cfio_dev_info); +-#else + pcmcia_unregister_driver(&cfio_cs_driver); +-#endif +- +- cf_detach(dev_list); +- +- while (dev_list != NULL) { +-#ifdef LINUX_2_4 +- del_timer(&dev_list->release); +-#endif +- if (dev_list->state & DEV_CONFIG) +- cf_release((u32) dev_list); +- } + } + + +@@ -508,6 +330,8 @@ void unregister_cf_driver( void ) + */ + s16 cfio_read_cfg_reg(void* priv) + { ++ if_pcmcia_info_t *ifinfo = (if_pcmcia_info_t *)priv; ++ + conf_reg_t reg; + + reg.Function = 0; +@@ -515,7 +339,7 @@ s16 cfio_read_cfg_reg(void* priv) + reg.Offset = 0; + reg.Value = 0; + +- pcmcia_access_configuration_register(dev_list->handle, ®); ++ pcmcia_access_configuration_register(ifinfo->p_dev, ®); + return 0; + } + +Index: src_cf8385/io/mcf/cfio_io.h +=================================================================== +--- src_cf8385.orig/io/mcf/cfio_io.h ++++ src_cf8385/io/mcf/cfio_io.h +@@ -82,7 +82,6 @@ typedef void * (*cf_notifier_fn_add) (s + typedef int (*cf_notifier_fn_remove) (struct cf_card_rec *); + + extern dev_info_t cfio_dev_info; +-extern dev_link_t *dev_list; + + extern struct cf_card_rec cardp; + s16 cfio_read_cfg_reg(void *priv); +Index: src_cf8385/if/if_mcf/if_cf.c +=================================================================== +--- src_cf8385.orig/if/if_mcf/if_cf.c ++++ src_cf8385/if/if_mcf/if_cf.c +@@ -32,11 +32,9 @@ Change log: + do { \ + tuple.DesiredTuple = X; \ + \ +- if (!handle) \ ++ if (pcmcia_get_first_tuple((&cisinfo), &tuple)) \ + goto error; \ +- if (pcmcia_get_first_tuple(handle, &tuple)) \ +- goto error; \ +- if (pcmcia_get_tuple_data(handle, &tuple)) \ ++ if (pcmcia_get_tuple_data((&cisinfo), &tuple)) \ + goto error; \ + \ + cisbuf[ofs++] = tuple.TupleCode; \ +@@ -48,7 +46,7 @@ Change log: + int *register_cf_driver(cf_notifier_fn_add ,cf_notifier_fn_remove , void *); + void unregister_cf_driver(void); + +-static dev_link_t cisinfo; ++static struct pcmcia_device cisinfo; + + static u16 int_cause = 0; + +@@ -771,7 +769,6 @@ int sbi_host_to_card(wlan_private *priv, + int sbi_get_cis_info(wlan_private *priv) + { + wlan_adapter *Adapter = priv->adapter; +- client_handle_t handle = cisinfo.handle; + tuple_t tuple; + char buf[64], cisbuf[512]; + int ofs=0, count=6; +@@ -793,9 +790,9 @@ int sbi_get_cis_info(wlan_private *priv) + + do + { +- if (pcmcia_get_next_tuple(handle, &tuple)) ++ if (pcmcia_get_next_tuple((&cisinfo), &tuple)) + goto error; +- if (pcmcia_get_tuple_data(handle, &tuple)) ++ if (pcmcia_get_tuple_data((&cisinfo), &tuple)) + goto error; + + cisbuf[ofs++] = tuple.TupleCode; +Index: src_cf8385/wlan/wlan_fw.c +=================================================================== +--- src_cf8385.orig/wlan/wlan_fw.c ++++ src_cf8385/wlan/wlan_fw.c +@@ -21,11 +21,11 @@ Change log: + ********************************************************/ + + +-u8 *helper_name=NULL; +-u8 *fw_name=NULL; ++static char *helper_name=NULL; ++static char *fw_name=NULL; + +-MODULE_PARM( helper_name, "s"); +-MODULE_PARM( fw_name, "s" ); ++module_param( helper_name, charp, 0); ++module_param( fw_name, charp, 0); + + + /******************************************************** |