diff options
-rw-r--r-- | drivers/isdn/hisax/nj_s.c | 194 |
1 files changed, 108 insertions, 86 deletions
diff --git a/drivers/isdn/hisax/nj_s.c b/drivers/isdn/hisax/nj_s.c index c09ffb135330..fa2db87667c8 100644 --- a/drivers/isdn/hisax/nj_s.c +++ b/drivers/isdn/hisax/nj_s.c | |||
@@ -148,107 +148,87 @@ NETjet_S_card_msg(struct IsdnCardState *cs, int mt, void *arg) | |||
148 | return(0); | 148 | return(0); |
149 | } | 149 | } |
150 | 150 | ||
151 | static struct pci_dev *dev_netjet __devinitdata = NULL; | 151 | static int __devinit njs_pci_probe(struct pci_dev *dev_netjet, |
152 | 152 | struct IsdnCardState *cs) | |
153 | int __devinit | ||
154 | setup_netjet_s(struct IsdnCard *card) | ||
155 | { | 153 | { |
156 | int bytecnt,cfg; | 154 | int cfg; |
157 | struct IsdnCardState *cs = card->cs; | ||
158 | char tmp[64]; | ||
159 | 155 | ||
160 | #ifdef __BIG_ENDIAN | 156 | if (pci_enable_device(dev_netjet)) |
161 | #error "not running on big endian machines now" | ||
162 | #endif | ||
163 | strcpy(tmp, NETjet_S_revision); | ||
164 | printk(KERN_INFO "HiSax: Traverse Tech. NETjet-S driver Rev. %s\n", HiSax_getrev(tmp)); | ||
165 | if (cs->typ != ISDN_CTYPE_NETJET_S) | ||
166 | return(0); | 157 | return(0); |
167 | test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags); | 158 | pci_set_master(dev_netjet); |
159 | cs->irq = dev_netjet->irq; | ||
160 | if (!cs->irq) { | ||
161 | printk(KERN_WARNING "NETjet-S: No IRQ for PCI card found\n"); | ||
162 | return(0); | ||
163 | } | ||
164 | cs->hw.njet.base = pci_resource_start(dev_netjet, 0); | ||
165 | if (!cs->hw.njet.base) { | ||
166 | printk(KERN_WARNING "NETjet-S: No IO-Adr for PCI card found\n"); | ||
167 | return(0); | ||
168 | } | ||
169 | /* the TJ300 and TJ320 must be detected, the IRQ handling is different | ||
170 | * unfortunatly the chips use the same device ID, but the TJ320 has | ||
171 | * the bit20 in status PCI cfg register set | ||
172 | */ | ||
173 | pci_read_config_dword(dev_netjet, 0x04, &cfg); | ||
174 | if (cfg & 0x00100000) | ||
175 | cs->subtyp = 1; /* TJ320 */ | ||
176 | else | ||
177 | cs->subtyp = 0; /* TJ300 */ | ||
178 | /* 2001/10/04 Christoph Ersfeld, Formula-n Europe AG www.formula-n.com */ | ||
179 | if ((dev_netjet->subsystem_vendor == 0x55) && | ||
180 | (dev_netjet->subsystem_device == 0x02)) { | ||
181 | printk(KERN_WARNING "Netjet: You tried to load this driver with an incompatible TigerJet-card\n"); | ||
182 | printk(KERN_WARNING "Use type=41 for Formula-n enter:now ISDN PCI and compatible\n"); | ||
183 | return(0); | ||
184 | } | ||
185 | /* end new code */ | ||
168 | 186 | ||
169 | #ifdef CONFIG_PCI | 187 | return(1); |
188 | } | ||
170 | 189 | ||
171 | for ( ;; ) | 190 | static int __devinit njs_cs_init(struct IsdnCard *card, |
172 | { | 191 | struct IsdnCardState *cs) |
173 | if ((dev_netjet = pci_find_device(PCI_VENDOR_ID_TIGERJET, | 192 | { |
174 | PCI_DEVICE_ID_TIGERJET_300, dev_netjet))) { | ||
175 | if (pci_enable_device(dev_netjet)) | ||
176 | return(0); | ||
177 | pci_set_master(dev_netjet); | ||
178 | cs->irq = dev_netjet->irq; | ||
179 | if (!cs->irq) { | ||
180 | printk(KERN_WARNING "NETjet-S: No IRQ for PCI card found\n"); | ||
181 | return(0); | ||
182 | } | ||
183 | cs->hw.njet.base = pci_resource_start(dev_netjet, 0); | ||
184 | if (!cs->hw.njet.base) { | ||
185 | printk(KERN_WARNING "NETjet-S: No IO-Adr for PCI card found\n"); | ||
186 | return(0); | ||
187 | } | ||
188 | /* the TJ300 and TJ320 must be detected, the IRQ handling is different | ||
189 | * unfortunatly the chips use the same device ID, but the TJ320 has | ||
190 | * the bit20 in status PCI cfg register set | ||
191 | */ | ||
192 | pci_read_config_dword(dev_netjet, 0x04, &cfg); | ||
193 | if (cfg & 0x00100000) | ||
194 | cs->subtyp = 1; /* TJ320 */ | ||
195 | else | ||
196 | cs->subtyp = 0; /* TJ300 */ | ||
197 | /* 2001/10/04 Christoph Ersfeld, Formula-n Europe AG www.formula-n.com */ | ||
198 | if ((dev_netjet->subsystem_vendor == 0x55) && | ||
199 | (dev_netjet->subsystem_device == 0x02)) { | ||
200 | printk(KERN_WARNING "Netjet: You tried to load this driver with an incompatible TigerJet-card\n"); | ||
201 | printk(KERN_WARNING "Use type=41 for Formula-n enter:now ISDN PCI and compatible\n"); | ||
202 | return(0); | ||
203 | } | ||
204 | /* end new code */ | ||
205 | } else { | ||
206 | printk(KERN_WARNING "NETjet-S: No PCI card found\n"); | ||
207 | return(0); | ||
208 | } | ||
209 | 193 | ||
210 | cs->hw.njet.auxa = cs->hw.njet.base + NETJET_AUXDATA; | 194 | cs->hw.njet.auxa = cs->hw.njet.base + NETJET_AUXDATA; |
211 | cs->hw.njet.isac = cs->hw.njet.base | NETJET_ISAC_OFF; | 195 | cs->hw.njet.isac = cs->hw.njet.base | NETJET_ISAC_OFF; |
212 | 196 | ||
213 | cs->hw.njet.ctrl_reg = 0xff; /* Reset On */ | 197 | cs->hw.njet.ctrl_reg = 0xff; /* Reset On */ |
214 | byteout(cs->hw.njet.base + NETJET_CTRL, cs->hw.njet.ctrl_reg); | 198 | byteout(cs->hw.njet.base + NETJET_CTRL, cs->hw.njet.ctrl_reg); |
215 | mdelay(10); | 199 | mdelay(10); |
216 | 200 | ||
217 | cs->hw.njet.ctrl_reg = 0x00; /* Reset Off and status read clear */ | 201 | cs->hw.njet.ctrl_reg = 0x00; /* Reset Off and status read clear */ |
218 | byteout(cs->hw.njet.base + NETJET_CTRL, cs->hw.njet.ctrl_reg); | 202 | byteout(cs->hw.njet.base + NETJET_CTRL, cs->hw.njet.ctrl_reg); |
219 | mdelay(10); | 203 | mdelay(10); |
220 | 204 | ||
221 | cs->hw.njet.auxd = 0xC0; | 205 | cs->hw.njet.auxd = 0xC0; |
222 | cs->hw.njet.dmactrl = 0; | 206 | cs->hw.njet.dmactrl = 0; |
223 | 207 | ||
224 | byteout(cs->hw.njet.base + NETJET_AUXCTRL, ~NETJET_ISACIRQ); | 208 | byteout(cs->hw.njet.base + NETJET_AUXCTRL, ~NETJET_ISACIRQ); |
225 | byteout(cs->hw.njet.base + NETJET_IRQMASK1, NETJET_ISACIRQ); | 209 | byteout(cs->hw.njet.base + NETJET_IRQMASK1, NETJET_ISACIRQ); |
226 | byteout(cs->hw.njet.auxa, cs->hw.njet.auxd); | 210 | byteout(cs->hw.njet.auxa, cs->hw.njet.auxd); |
227 | 211 | ||
228 | switch ( ( ( NETjet_ReadIC( cs, ISAC_RBCH ) >> 5 ) & 3 ) ) | 212 | switch ( ( ( NETjet_ReadIC( cs, ISAC_RBCH ) >> 5 ) & 3 ) ) |
229 | { | 213 | { |
230 | case 0 : | 214 | case 0 : |
231 | break; | 215 | return 1; /* end loop */ |
232 | 216 | ||
233 | case 3 : | 217 | case 3 : |
234 | printk( KERN_WARNING "NETjet-S: NETspider-U PCI card found\n" ); | 218 | printk( KERN_WARNING "NETjet-S: NETspider-U PCI card found\n" ); |
235 | continue; | 219 | return -1; /* continue looping */ |
236 | 220 | ||
237 | default : | 221 | default : |
238 | printk( KERN_WARNING "NETjet-S: No PCI card found\n" ); | 222 | printk( KERN_WARNING "NETjet-S: No PCI card found\n" ); |
239 | return 0; | 223 | return 0; /* end loop & function */ |
240 | } | ||
241 | break; | ||
242 | } | 224 | } |
243 | #else | 225 | return 1; /* end loop */ |
244 | 226 | } | |
245 | printk(KERN_WARNING "NETjet-S: NO_PCI_BIOS\n"); | ||
246 | printk(KERN_WARNING "NETjet-S: unable to config NETJET-S PCI\n"); | ||
247 | return (0); | ||
248 | |||
249 | #endif /* CONFIG_PCI */ | ||
250 | 227 | ||
251 | bytecnt = 256; | 228 | static int __devinit njs_cs_init_rest(struct IsdnCard *card, |
229 | struct IsdnCardState *cs) | ||
230 | { | ||
231 | const int bytecnt = 256; | ||
252 | 232 | ||
253 | printk(KERN_INFO | 233 | printk(KERN_INFO |
254 | "NETjet-S: %s card configured at %#lx IRQ %d\n", | 234 | "NETjet-S: %s card configured at %#lx IRQ %d\n", |
@@ -273,5 +253,47 @@ setup_netjet_s(struct IsdnCard *card) | |||
273 | cs->irq_func = &netjet_s_interrupt; | 253 | cs->irq_func = &netjet_s_interrupt; |
274 | cs->irq_flags |= IRQF_SHARED; | 254 | cs->irq_flags |= IRQF_SHARED; |
275 | ISACVersion(cs, "NETjet-S:"); | 255 | ISACVersion(cs, "NETjet-S:"); |
256 | |||
276 | return (1); | 257 | return (1); |
277 | } | 258 | } |
259 | |||
260 | static struct pci_dev *dev_netjet __devinitdata = NULL; | ||
261 | |||
262 | int __devinit | ||
263 | setup_netjet_s(struct IsdnCard *card) | ||
264 | { | ||
265 | int ret; | ||
266 | struct IsdnCardState *cs = card->cs; | ||
267 | char tmp[64]; | ||
268 | |||
269 | #ifdef __BIG_ENDIAN | ||
270 | #error "not running on big endian machines now" | ||
271 | #endif | ||
272 | strcpy(tmp, NETjet_S_revision); | ||
273 | printk(KERN_INFO "HiSax: Traverse Tech. NETjet-S driver Rev. %s\n", HiSax_getrev(tmp)); | ||
274 | if (cs->typ != ISDN_CTYPE_NETJET_S) | ||
275 | return(0); | ||
276 | test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags); | ||
277 | |||
278 | for ( ;; ) | ||
279 | { | ||
280 | if ((dev_netjet = pci_find_device(PCI_VENDOR_ID_TIGERJET, | ||
281 | PCI_DEVICE_ID_TIGERJET_300, dev_netjet))) { | ||
282 | ret = njs_pci_probe(dev_netjet, cs); | ||
283 | if (!ret) | ||
284 | return(0); | ||
285 | } else { | ||
286 | printk(KERN_WARNING "NETjet-S: No PCI card found\n"); | ||
287 | return(0); | ||
288 | } | ||
289 | |||
290 | ret = njs_cs_init(card, cs); | ||
291 | if (!ret) | ||
292 | return(0); | ||
293 | if (ret > 0) | ||
294 | break; | ||
295 | /* otherwise, ret < 0, continue looping */ | ||
296 | } | ||
297 | |||
298 | return njs_cs_init_rest(card, cs); | ||
299 | } | ||