Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.35-rc1 202 lines 4.0 kB view raw
1#include "ixj-ver.h" 2 3#include <linux/module.h> 4 5#include <linux/init.h> 6#include <linux/kernel.h> /* printk() */ 7#include <linux/fs.h> /* everything... */ 8#include <linux/errno.h> /* error codes */ 9#include <linux/slab.h> 10 11#include <pcmcia/cs_types.h> 12#include <pcmcia/cs.h> 13#include <pcmcia/cistpl.h> 14#include <pcmcia/ds.h> 15 16#include "ixj.h" 17 18/* 19 * PCMCIA service support for Quicknet cards 20 */ 21 22 23typedef struct ixj_info_t { 24 int ndev; 25 struct ixj *port; 26} ixj_info_t; 27 28static void ixj_detach(struct pcmcia_device *p_dev); 29static int ixj_config(struct pcmcia_device * link); 30static void ixj_cs_release(struct pcmcia_device * link); 31 32static int ixj_probe(struct pcmcia_device *p_dev) 33{ 34 dev_dbg(&p_dev->dev, "ixj_attach()\n"); 35 /* Create new ixj device */ 36 p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; 37 p_dev->io.Attributes2 = IO_DATA_PATH_WIDTH_8; 38 p_dev->io.IOAddrLines = 3; 39 p_dev->conf.IntType = INT_MEMORY_AND_IO; 40 p_dev->priv = kzalloc(sizeof(struct ixj_info_t), GFP_KERNEL); 41 if (!p_dev->priv) { 42 return -ENOMEM; 43 } 44 45 return ixj_config(p_dev); 46} 47 48static void ixj_detach(struct pcmcia_device *link) 49{ 50 dev_dbg(&link->dev, "ixj_detach\n"); 51 52 ixj_cs_release(link); 53 54 kfree(link->priv); 55} 56 57static void ixj_get_serial(struct pcmcia_device * link, IXJ * j) 58{ 59 char *str; 60 int i, place; 61 dev_dbg(&link->dev, "ixj_get_serial\n"); 62 63 str = link->prod_id[0]; 64 if (!str) 65 goto failed; 66 printk("%s", str); 67 str = link->prod_id[1]; 68 if (!str) 69 goto failed; 70 printk(" %s", str); 71 str = link->prod_id[2]; 72 if (!str) 73 goto failed; 74 place = 1; 75 for (i = strlen(str) - 1; i >= 0; i--) { 76 switch (str[i]) { 77 case '0': 78 case '1': 79 case '2': 80 case '3': 81 case '4': 82 case '5': 83 case '6': 84 case '7': 85 case '8': 86 case '9': 87 j->serial += (str[i] - 48) * place; 88 break; 89 case 'A': 90 case 'B': 91 case 'C': 92 case 'D': 93 case 'E': 94 case 'F': 95 j->serial += (str[i] - 55) * place; 96 break; 97 case 'a': 98 case 'b': 99 case 'c': 100 case 'd': 101 case 'e': 102 case 'f': 103 j->serial += (str[i] - 87) * place; 104 break; 105 } 106 place = place * 0x10; 107 } 108 str = link->prod_id[3]; 109 if (!str) 110 goto failed; 111 printk(" version %s\n", str); 112failed: 113 return; 114} 115 116static int ixj_config_check(struct pcmcia_device *p_dev, 117 cistpl_cftable_entry_t *cfg, 118 cistpl_cftable_entry_t *dflt, 119 unsigned int vcc, 120 void *priv_data) 121{ 122 if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { 123 cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; 124 p_dev->io.BasePort1 = io->win[0].base; 125 p_dev->io.NumPorts1 = io->win[0].len; 126 if (io->nwin == 2) { 127 p_dev->io.BasePort2 = io->win[1].base; 128 p_dev->io.NumPorts2 = io->win[1].len; 129 } 130 if (!pcmcia_request_io(p_dev, &p_dev->io)) 131 return 0; 132 } 133 return -ENODEV; 134} 135 136static int ixj_config(struct pcmcia_device * link) 137{ 138 IXJ *j; 139 ixj_info_t *info; 140 cistpl_cftable_entry_t dflt = { 0 }; 141 142 info = link->priv; 143 dev_dbg(&link->dev, "ixj_config\n"); 144 145 if (pcmcia_loop_config(link, ixj_config_check, &dflt)) 146 goto failed; 147 148 if (pcmcia_request_configuration(link, &link->conf)) 149 goto failed; 150 151 /* 152 * Register the card with the core. 153 */ 154 j = ixj_pcmcia_probe(link->io.BasePort1, link->io.BasePort1 + 0x10); 155 156 info->ndev = 1; 157 ixj_get_serial(link, j); 158 return 0; 159 160failed: 161 ixj_cs_release(link); 162 return -ENODEV; 163} 164 165static void ixj_cs_release(struct pcmcia_device *link) 166{ 167 ixj_info_t *info = link->priv; 168 dev_dbg(&link->dev, "ixj_cs_release\n"); 169 info->ndev = 0; 170 pcmcia_disable_device(link); 171} 172 173static struct pcmcia_device_id ixj_ids[] = { 174 PCMCIA_DEVICE_MANF_CARD(0x0257, 0x0600), 175 PCMCIA_DEVICE_NULL 176}; 177MODULE_DEVICE_TABLE(pcmcia, ixj_ids); 178 179static struct pcmcia_driver ixj_driver = { 180 .owner = THIS_MODULE, 181 .drv = { 182 .name = "ixj_cs", 183 }, 184 .probe = ixj_probe, 185 .remove = ixj_detach, 186 .id_table = ixj_ids, 187}; 188 189static int __init ixj_pcmcia_init(void) 190{ 191 return pcmcia_register_driver(&ixj_driver); 192} 193 194static void ixj_pcmcia_exit(void) 195{ 196 pcmcia_unregister_driver(&ixj_driver); 197} 198 199module_init(ixj_pcmcia_init); 200module_exit(ixj_pcmcia_exit); 201 202MODULE_LICENSE("GPL");