• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6.36/drivers/sn/
1/*
2 * SGI IOC3 master driver and IRQ demuxer
3 *
4 * Copyright (c) 2005 Stanislaw Skowronek <skylark@linux-mips.org>
5 * Heavily based on similar work by:
6 *   Brent Casavant <bcasavan@sgi.com> - IOC4 master driver
7 *   Pat Gefre <pfg@sgi.com> - IOC3 serial port IRQ demuxer
8 */
9
10#include <linux/errno.h>
11#include <linux/module.h>
12#include <linux/pci.h>
13#include <linux/dma-mapping.h>
14#include <linux/interrupt.h>
15#include <linux/spinlock.h>
16#include <linux/delay.h>
17#include <linux/ioc3.h>
18#include <linux/rwsem.h>
19#include <linux/slab.h>
20
21#define IOC3_PCI_SIZE 0x100000
22
23static LIST_HEAD(ioc3_devices);
24static int ioc3_counter;
25static DECLARE_RWSEM(ioc3_devices_rwsem);
26
27static struct ioc3_submodule *ioc3_submodules[IOC3_MAX_SUBMODULES];
28static struct ioc3_submodule *ioc3_ethernet;
29static DEFINE_RWLOCK(ioc3_submodules_lock);
30
31/* NIC probing code */
32
33#define GPCR_MLAN_EN    0x00200000      /* enable MCR to pin 8 */
34
35static inline unsigned mcr_pack(unsigned pulse, unsigned sample)
36{
37	return (pulse << 10) | (sample << 2);
38}
39
40static int nic_wait(struct ioc3_driver_data *idd)
41{
42	unsigned mcr;
43
44        do {
45                mcr = readl(&idd->vma->mcr);
46        } while (!(mcr & 2));
47
48        return mcr & 1;
49}
50
51static int nic_reset(struct ioc3_driver_data *idd)
52{
53        int presence;
54	unsigned long flags;
55
56	local_irq_save(flags);
57	writel(mcr_pack(500, 65), &idd->vma->mcr);
58	presence = nic_wait(idd);
59	local_irq_restore(flags);
60
61	udelay(500);
62
63        return presence;
64}
65
66static int nic_read_bit(struct ioc3_driver_data *idd)
67{
68	int result;
69	unsigned long flags;
70
71	local_irq_save(flags);
72	writel(mcr_pack(6, 13), &idd->vma->mcr);
73	result = nic_wait(idd);
74	local_irq_restore(flags);
75
76	udelay(500);
77
78	return result;
79}
80
81static void nic_write_bit(struct ioc3_driver_data *idd, int bit)
82{
83	if (bit)
84		writel(mcr_pack(6, 110), &idd->vma->mcr);
85	else
86		writel(mcr_pack(80, 30), &idd->vma->mcr);
87
88	nic_wait(idd);
89}
90
91static unsigned nic_read_byte(struct ioc3_driver_data *idd)
92{
93	unsigned result = 0;
94	int i;
95
96	for (i = 0; i < 8; i++)
97		result = (result >> 1) | (nic_read_bit(idd) << 7);
98
99	return result;
100}
101
102static void nic_write_byte(struct ioc3_driver_data *idd, int byte)
103{
104	int i, bit;
105
106	for (i = 8; i; i--) {
107		bit = byte & 1;
108		byte >>= 1;
109
110		nic_write_bit(idd, bit);
111	}
112}
113
114static unsigned long
115nic_find(struct ioc3_driver_data *idd, int *last, unsigned long addr)
116{
117	int a, b, index, disc;
118
119	nic_reset(idd);
120
121	/* Search ROM.  */
122	nic_write_byte(idd, 0xF0);
123
124	/* Algorithm from ``Book of iButton Standards''.  */
125	for (index = 0, disc = 0; index < 64; index++) {
126		a = nic_read_bit(idd);
127		b = nic_read_bit(idd);
128
129		if (a && b) {
130			printk(KERN_WARNING "IOC3 NIC search failed.\n");
131			*last = 0;
132			return 0;
133		}
134
135		if (!a && !b) {
136			if (index == *last) {
137				addr |= 1UL << index;
138			} else if (index > *last) {
139				addr &= ~(1UL << index);
140				disc = index;
141			} else if ((addr & (1UL << index)) == 0)
142				disc = index;
143			nic_write_bit(idd, (addr>>index)&1);
144			continue;
145		} else {
146			if (a)
147				addr |= 1UL << index;
148			else
149				addr &= ~(1UL << index);
150			nic_write_bit(idd, a);
151			continue;
152		}
153	}
154	*last = disc;
155	return addr;
156}
157
158static void nic_addr(struct ioc3_driver_data *idd, unsigned long addr)
159{
160	int index;
161
162	nic_reset(idd);
163	nic_write_byte(idd, 0xF0);
164	for (index = 0; index < 64; index++) {
165		nic_read_bit(idd);
166		nic_read_bit(idd);
167		nic_write_bit(idd, (addr>>index)&1);
168	}
169}
170
171static void crc16_byte(unsigned int *crc, unsigned char db)
172{
173	int i;
174
175	for(i=0;i<8;i++) {
176		*crc <<= 1;
177		if((db^(*crc>>16)) & 1)
178			*crc ^= 0x8005;
179		db >>= 1;
180	}
181	*crc &= 0xFFFF;
182}
183
184static unsigned int crc16_area(unsigned char *dbs, int size, unsigned int crc)
185{
186	while(size--)
187		crc16_byte(&crc, *(dbs++));
188	return crc;
189}
190
191static void crc8_byte(unsigned int *crc, unsigned char db)
192{
193	int i,f;
194
195	for(i=0;i<8;i++) {
196		f = (*crc ^ db) & 1;
197		*crc >>= 1;
198		db >>= 1;
199		if(f)
200			*crc ^= 0x8c;
201	}
202	*crc &= 0xff;
203}
204
205static unsigned int crc8_addr(unsigned long addr)
206{
207	int i;
208	unsigned int crc = 0x00;
209
210	for(i=0;i<8;i++)
211		crc8_byte(&crc, addr>>(i<<3));
212	return crc;
213}
214
215static void
216read_redir_page(struct ioc3_driver_data *idd, unsigned long addr, int page,
217			unsigned char *redir, unsigned char *data)
218{
219	int loops = 16, i;
220
221	while(redir[page] != 0xFF) {
222		page = redir[page]^0xFF;
223		loops--;
224		if(loops<0) {
225			printk(KERN_ERR "IOC3: NIC circular redirection\n");
226			return;
227		}
228	}
229	loops = 3;
230	while(loops>0) {
231		nic_addr(idd, addr);
232		nic_write_byte(idd, 0xF0);
233		nic_write_byte(idd, (page << 5) & 0xE0);
234		nic_write_byte(idd, (page >> 3) & 0x1F);
235		for(i=0;i<0x20;i++)
236			data[i] = nic_read_byte(idd);
237		if(crc16_area(data, 0x20, 0x0000) == 0x800d)
238			return;
239		loops--;
240	}
241	printk(KERN_ERR "IOC3: CRC error in data page\n");
242	for(i=0;i<0x20;i++)
243		data[i] = 0x00;
244}
245
246static void
247read_redir_map(struct ioc3_driver_data *idd, unsigned long addr,
248					 unsigned char *redir)
249{
250	int i,j,loops = 3,crc_ok;
251	unsigned int crc;
252
253	while(loops>0) {
254		crc_ok = 1;
255		nic_addr(idd, addr);
256		nic_write_byte(idd, 0xAA);
257		nic_write_byte(idd, 0x00);
258		nic_write_byte(idd, 0x01);
259		for(i=0;i<64;i+=8) {
260			for(j=0;j<8;j++)
261				redir[i+j] = nic_read_byte(idd);
262			crc = crc16_area(redir+i, 8, (i==0)?0x8707:0x0000);
263			crc16_byte(&crc, nic_read_byte(idd));
264			crc16_byte(&crc, nic_read_byte(idd));
265			if(crc != 0x800d)
266				crc_ok = 0;
267		}
268		if(crc_ok)
269			return;
270		loops--;
271	}
272	printk(KERN_ERR "IOC3: CRC error in redirection page\n");
273	for(i=0;i<64;i++)
274		redir[i] = 0xFF;
275}
276
277static void read_nic(struct ioc3_driver_data *idd, unsigned long addr)
278{
279	unsigned char redir[64];
280	unsigned char data[64],part[32];
281	int i,j;
282
283	/* read redirections */
284	read_redir_map(idd, addr, redir);
285	/* read data pages */
286	read_redir_page(idd, addr, 0, redir, data);
287	read_redir_page(idd, addr, 1, redir, data+32);
288	/* assemble the part # */
289	j=0;
290	for(i=0;i<19;i++)
291		if(data[i+11] != ' ')
292			part[j++] = data[i+11];
293	for(i=0;i<6;i++)
294		if(data[i+32] != ' ')
295			part[j++] = data[i+32];
296	part[j] = 0;
297	/* skip Octane power supplies */
298	if(!strncmp(part, "060-0035-", 9))
299		return;
300	if(!strncmp(part, "060-0038-", 9))
301		return;
302	strcpy(idd->nic_part, part);
303	/* assemble the serial # */
304	j=0;
305	for(i=0;i<10;i++)
306		if(data[i+1] != ' ')
307			idd->nic_serial[j++] = data[i+1];
308	idd->nic_serial[j] = 0;
309}
310
311static void read_mac(struct ioc3_driver_data *idd, unsigned long addr)
312{
313	int i, loops = 3;
314	unsigned char data[13];
315
316	while(loops>0) {
317		nic_addr(idd, addr);
318		nic_write_byte(idd, 0xF0);
319		nic_write_byte(idd, 0x00);
320		nic_write_byte(idd, 0x00);
321		nic_read_byte(idd);
322		for(i=0;i<13;i++)
323			data[i] = nic_read_byte(idd);
324		if(crc16_area(data, 13, 0x0000) == 0x800d) {
325			for(i=10;i>4;i--)
326				idd->nic_mac[10-i] = data[i];
327			return;
328		}
329		loops--;
330	}
331	printk(KERN_ERR "IOC3: CRC error in MAC address\n");
332	for(i=0;i<6;i++)
333		idd->nic_mac[i] = 0x00;
334}
335
336static void probe_nic(struct ioc3_driver_data *idd)
337{
338        int save = 0, loops = 3;
339        unsigned long first, addr;
340
341        writel(GPCR_MLAN_EN, &idd->vma->gpcr_s);
342
343        while(loops>0) {
344                idd->nic_part[0] = 0;
345                idd->nic_serial[0] = 0;
346                addr = first = nic_find(idd, &save, 0);
347                if(!first)
348                        return;
349                while(1) {
350                        if(crc8_addr(addr))
351                                break;
352                        else {
353                                switch(addr & 0xFF) {
354                                case 0x0B:
355                                        read_nic(idd, addr);
356                                        break;
357                                case 0x09:
358                                case 0x89:
359                                case 0x91:
360                                        read_mac(idd, addr);
361                                        break;
362                                }
363                        }
364                        addr = nic_find(idd, &save, addr);
365                        if(addr == first)
366                                return;
367                }
368                loops--;
369        }
370        printk(KERN_ERR "IOC3: CRC error in NIC address\n");
371}
372
373/* Interrupts */
374
375static void write_ireg(struct ioc3_driver_data *idd, uint32_t val, int which)
376{
377	unsigned long flags;
378
379	spin_lock_irqsave(&idd->ir_lock, flags);
380	switch (which) {
381	case IOC3_W_IES:
382		writel(val, &idd->vma->sio_ies);
383		break;
384	case IOC3_W_IEC:
385		writel(val, &idd->vma->sio_iec);
386		break;
387	}
388	spin_unlock_irqrestore(&idd->ir_lock, flags);
389}
390static inline uint32_t get_pending_intrs(struct ioc3_driver_data *idd)
391{
392	unsigned long flag;
393	uint32_t intrs = 0;
394
395	spin_lock_irqsave(&idd->ir_lock, flag);
396	intrs = readl(&idd->vma->sio_ir);
397	intrs &= readl(&idd->vma->sio_ies);
398	spin_unlock_irqrestore(&idd->ir_lock, flag);
399	return intrs;
400}
401
402static irqreturn_t ioc3_intr_io(int irq, void *arg)
403{
404	unsigned long flags;
405	struct ioc3_driver_data *idd = arg;
406	int handled = 1, id;
407	unsigned int pending;
408
409	read_lock_irqsave(&ioc3_submodules_lock, flags);
410
411	if(idd->dual_irq && readb(&idd->vma->eisr)) {
412		/* send Ethernet IRQ to the driver */
413		if(ioc3_ethernet && idd->active[ioc3_ethernet->id] &&
414						ioc3_ethernet->intr) {
415			handled = handled && !ioc3_ethernet->intr(ioc3_ethernet,
416							idd, 0);
417		}
418	}
419	pending = get_pending_intrs(idd);	/* look at the IO IRQs */
420
421	for(id=0;id<IOC3_MAX_SUBMODULES;id++) {
422		if(idd->active[id] && ioc3_submodules[id]
423				&& (pending & ioc3_submodules[id]->irq_mask)
424				&& ioc3_submodules[id]->intr) {
425			write_ireg(idd, ioc3_submodules[id]->irq_mask,
426							IOC3_W_IEC);
427			if(!ioc3_submodules[id]->intr(ioc3_submodules[id],
428				   idd, pending & ioc3_submodules[id]->irq_mask))
429				pending &= ~ioc3_submodules[id]->irq_mask;
430			if (ioc3_submodules[id]->reset_mask)
431				write_ireg(idd, ioc3_submodules[id]->irq_mask,
432							IOC3_W_IES);
433		}
434	}
435	read_unlock_irqrestore(&ioc3_submodules_lock, flags);
436	if(pending) {
437		printk(KERN_WARNING
438		  "IOC3: Pending IRQs 0x%08x discarded and disabled\n",pending);
439		write_ireg(idd, pending, IOC3_W_IEC);
440		handled = 1;
441	}
442	return handled?IRQ_HANDLED:IRQ_NONE;
443}
444
445static irqreturn_t ioc3_intr_eth(int irq, void *arg)
446{
447	unsigned long flags;
448	struct ioc3_driver_data *idd = (struct ioc3_driver_data *)arg;
449	int handled = 1;
450
451	if(!idd->dual_irq)
452		return IRQ_NONE;
453	read_lock_irqsave(&ioc3_submodules_lock, flags);
454	if(ioc3_ethernet && idd->active[ioc3_ethernet->id]
455				&& ioc3_ethernet->intr)
456		handled = handled && !ioc3_ethernet->intr(ioc3_ethernet, idd, 0);
457	read_unlock_irqrestore(&ioc3_submodules_lock, flags);
458	return handled?IRQ_HANDLED:IRQ_NONE;
459}
460
461void ioc3_enable(struct ioc3_submodule *is,
462				struct ioc3_driver_data *idd, unsigned int irqs)
463{
464	write_ireg(idd, irqs & is->irq_mask, IOC3_W_IES);
465}
466
467void ioc3_ack(struct ioc3_submodule *is, struct ioc3_driver_data *idd,
468				unsigned int irqs)
469{
470	writel(irqs & is->irq_mask, &idd->vma->sio_ir);
471}
472
473void ioc3_disable(struct ioc3_submodule *is,
474				struct ioc3_driver_data *idd, unsigned int irqs)
475{
476	write_ireg(idd, irqs & is->irq_mask, IOC3_W_IEC);
477}
478
479void ioc3_gpcr_set(struct ioc3_driver_data *idd, unsigned int val)
480{
481	unsigned long flags;
482	spin_lock_irqsave(&idd->gpio_lock, flags);
483	writel(val, &idd->vma->gpcr_s);
484	spin_unlock_irqrestore(&idd->gpio_lock, flags);
485}
486
487/* Keep it simple, stupid! */
488static int find_slot(void **tab, int max)
489{
490	int i;
491	for(i=0;i<max;i++)
492		if(!(tab[i]))
493			return i;
494	return -1;
495}
496
497/* Register an IOC3 submodule */
498int ioc3_register_submodule(struct ioc3_submodule *is)
499{
500	struct ioc3_driver_data *idd;
501	int alloc_id;
502	unsigned long flags;
503
504	write_lock_irqsave(&ioc3_submodules_lock, flags);
505	alloc_id = find_slot((void **)ioc3_submodules, IOC3_MAX_SUBMODULES);
506	if(alloc_id != -1) {
507		ioc3_submodules[alloc_id] = is;
508		if(is->ethernet) {
509			if(ioc3_ethernet==NULL)
510				ioc3_ethernet=is;
511			else
512				printk(KERN_WARNING
513				  "IOC3 Ethernet module already registered!\n");
514		}
515	}
516	write_unlock_irqrestore(&ioc3_submodules_lock, flags);
517
518	if(alloc_id == -1) {
519		printk(KERN_WARNING "Increase IOC3_MAX_SUBMODULES!\n");
520		return -ENOMEM;
521	}
522
523	is->id=alloc_id;
524
525	/* Initialize submodule for each IOC3 */
526	if (!is->probe)
527		return 0;
528
529	down_read(&ioc3_devices_rwsem);
530	list_for_each_entry(idd, &ioc3_devices, list) {
531		/* set to 1 for IRQs in probe */
532		idd->active[alloc_id] = 1;
533		idd->active[alloc_id] = !is->probe(is, idd);
534	}
535	up_read(&ioc3_devices_rwsem);
536
537	return 0;
538}
539
540/* Unregister an IOC3 submodule */
541void ioc3_unregister_submodule(struct ioc3_submodule *is)
542{
543	struct ioc3_driver_data *idd;
544	unsigned long flags;
545
546	write_lock_irqsave(&ioc3_submodules_lock, flags);
547	if(ioc3_submodules[is->id]==is)
548		ioc3_submodules[is->id]=NULL;
549	else
550		printk(KERN_WARNING
551			"IOC3 submodule %s has wrong ID.\n",is->name);
552	if(ioc3_ethernet==is)
553		ioc3_ethernet = NULL;
554	write_unlock_irqrestore(&ioc3_submodules_lock, flags);
555
556	/* Remove submodule for each IOC3 */
557	down_read(&ioc3_devices_rwsem);
558	list_for_each_entry(idd, &ioc3_devices, list)
559		if(idd->active[is->id]) {
560			if(is->remove)
561				if(is->remove(is, idd))
562					printk(KERN_WARNING
563					       "%s: IOC3 submodule %s remove failed "
564					       "for pci_dev %s.\n",
565					       __func__, module_name(is->owner),
566					       pci_name(idd->pdev));
567			idd->active[is->id] = 0;
568			if(is->irq_mask)
569				write_ireg(idd, is->irq_mask, IOC3_W_IEC);
570		}
571	up_read(&ioc3_devices_rwsem);
572}
573
574/*********************
575 * Device management *
576 *********************/
577
578static char * __devinitdata
579ioc3_class_names[]={"unknown", "IP27 BaseIO", "IP30 system", "MENET 1/2/3",
580			"MENET 4", "CADduo", "Altix Serial"};
581
582static int __devinit ioc3_class(struct ioc3_driver_data *idd)
583{
584	int res = IOC3_CLASS_NONE;
585	/* NIC-based logic */
586	if(!strncmp(idd->nic_part, "030-0891-", 9))
587		res = IOC3_CLASS_BASE_IP30;
588	if(!strncmp(idd->nic_part, "030-1155-", 9))
589		res = IOC3_CLASS_CADDUO;
590	if(!strncmp(idd->nic_part, "030-1657-", 9))
591		res = IOC3_CLASS_SERIAL;
592	if(!strncmp(idd->nic_part, "030-1664-", 9))
593		res = IOC3_CLASS_SERIAL;
594	/* total random heuristics */
595#ifdef CONFIG_SGI_IP27
596	if(!idd->nic_part[0])
597		res = IOC3_CLASS_BASE_IP27;
598#endif
599	/* print educational message */
600	printk(KERN_INFO "IOC3 part: [%s], serial: [%s] => class %s\n",
601			idd->nic_part, idd->nic_serial, ioc3_class_names[res]);
602	return res;
603}
604/* Adds a new instance of an IOC3 card */
605static int __devinit
606ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id)
607{
608	struct ioc3_driver_data *idd;
609	uint32_t pcmd;
610	int ret, id;
611
612	/* Enable IOC3 and take ownership of it */
613	if ((ret = pci_enable_device(pdev))) {
614		printk(KERN_WARNING
615		       "%s: Failed to enable IOC3 device for pci_dev %s.\n",
616		       __func__, pci_name(pdev));
617		goto out;
618	}
619	pci_set_master(pdev);
620
621#ifdef USE_64BIT_DMA
622        ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
623        if (!ret) {
624                ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
625                if (ret < 0) {
626                        printk(KERN_WARNING "%s: Unable to obtain 64 bit DMA "
627                               "for consistent allocations\n",
628				__func__);
629                }
630	}
631#endif
632
633	/* Set up per-IOC3 data */
634	idd = kzalloc(sizeof(struct ioc3_driver_data), GFP_KERNEL);
635	if (!idd) {
636		printk(KERN_WARNING
637		       "%s: Failed to allocate IOC3 data for pci_dev %s.\n",
638		       __func__, pci_name(pdev));
639		ret = -ENODEV;
640		goto out_idd;
641	}
642	spin_lock_init(&idd->ir_lock);
643	spin_lock_init(&idd->gpio_lock);
644	idd->pdev = pdev;
645
646	/* Map all IOC3 registers.  These are shared between subdevices
647	 * so the main IOC3 module manages them.
648	 */
649	idd->pma = pci_resource_start(pdev, 0);
650	if (!idd->pma) {
651		printk(KERN_WARNING
652		       "%s: Unable to find IOC3 resource "
653		       "for pci_dev %s.\n",
654		       __func__, pci_name(pdev));
655		ret = -ENODEV;
656		goto out_pci;
657	}
658	if (!request_mem_region(idd->pma, IOC3_PCI_SIZE, "ioc3")) {
659		printk(KERN_WARNING
660		       "%s: Unable to request IOC3 region "
661		       "for pci_dev %s.\n",
662		       __func__, pci_name(pdev));
663		ret = -ENODEV;
664		goto out_pci;
665	}
666	idd->vma = ioremap(idd->pma, IOC3_PCI_SIZE);
667	if (!idd->vma) {
668		printk(KERN_WARNING
669		       "%s: Unable to remap IOC3 region "
670		       "for pci_dev %s.\n",
671		       __func__, pci_name(pdev));
672		ret = -ENODEV;
673		goto out_misc_region;
674	}
675
676	/* Track PCI-device specific data */
677	pci_set_drvdata(pdev, idd);
678	down_write(&ioc3_devices_rwsem);
679	list_add_tail(&idd->list, &ioc3_devices);
680	idd->id = ioc3_counter++;
681	up_write(&ioc3_devices_rwsem);
682
683	idd->gpdr_shadow = readl(&idd->vma->gpdr);
684
685	/* Read IOC3 NIC contents */
686	probe_nic(idd);
687
688	/* Detect IOC3 class */
689	idd->class = ioc3_class(idd);
690
691	/* Initialize IOC3 */
692       pci_read_config_dword(pdev, PCI_COMMAND, &pcmd);
693       pci_write_config_dword(pdev, PCI_COMMAND,
694                               pcmd | PCI_COMMAND_MEMORY |
695                               PCI_COMMAND_PARITY | PCI_COMMAND_SERR |
696                               PCI_SCR_DROP_MODE_EN);
697
698	write_ireg(idd, ~0, IOC3_W_IEC);
699	writel(~0, &idd->vma->sio_ir);
700
701	/* Set up IRQs */
702	if(idd->class == IOC3_CLASS_BASE_IP30
703				|| idd->class == IOC3_CLASS_BASE_IP27) {
704		writel(0, &idd->vma->eier);
705		writel(~0, &idd->vma->eisr);
706
707		idd->dual_irq = 1;
708		if (!request_irq(pdev->irq, ioc3_intr_eth, IRQF_SHARED,
709				 "ioc3-eth", (void *)idd)) {
710			idd->irq_eth = pdev->irq;
711		} else {
712			printk(KERN_WARNING
713			       "%s : request_irq fails for IRQ 0x%x\n ",
714			       __func__, pdev->irq);
715		}
716		if (!request_irq(pdev->irq+2, ioc3_intr_io, IRQF_SHARED,
717				 "ioc3-io", (void *)idd)) {
718			idd->irq_io = pdev->irq+2;
719		} else {
720			printk(KERN_WARNING
721			       "%s : request_irq fails for IRQ 0x%x\n ",
722			       __func__, pdev->irq+2);
723		}
724	} else {
725		if (!request_irq(pdev->irq, ioc3_intr_io, IRQF_SHARED,
726				 "ioc3", (void *)idd)) {
727			idd->irq_io = pdev->irq;
728		} else {
729			printk(KERN_WARNING
730			       "%s : request_irq fails for IRQ 0x%x\n ",
731			       __func__, pdev->irq);
732		}
733	}
734
735	/* Add this IOC3 to all submodules */
736	for(id=0;id<IOC3_MAX_SUBMODULES;id++)
737		if(ioc3_submodules[id] && ioc3_submodules[id]->probe) {
738			idd->active[id] = 1;
739			idd->active[id] = !ioc3_submodules[id]->probe
740						(ioc3_submodules[id], idd);
741		}
742
743	printk(KERN_INFO "IOC3 Master Driver loaded for %s\n", pci_name(pdev));
744
745	return 0;
746
747out_misc_region:
748	release_mem_region(idd->pma, IOC3_PCI_SIZE);
749out_pci:
750	kfree(idd);
751out_idd:
752	pci_disable_device(pdev);
753out:
754	return ret;
755}
756
757/* Removes a particular instance of an IOC3 card. */
758static void __devexit ioc3_remove(struct pci_dev *pdev)
759{
760	int id;
761	struct ioc3_driver_data *idd;
762
763	idd = pci_get_drvdata(pdev);
764
765	/* Remove this IOC3 from all submodules */
766	for(id=0;id<IOC3_MAX_SUBMODULES;id++)
767		if(idd->active[id]) {
768			if(ioc3_submodules[id] && ioc3_submodules[id]->remove)
769				if(ioc3_submodules[id]->remove(ioc3_submodules[id],
770								idd))
771					printk(KERN_WARNING
772					       "%s: IOC3 submodule 0x%s remove failed "
773					       "for pci_dev %s.\n",
774						__func__,
775						module_name(ioc3_submodules[id]->owner),
776					        pci_name(pdev));
777			idd->active[id] = 0;
778		}
779
780	/* Clear and disable all IRQs */
781	write_ireg(idd, ~0, IOC3_W_IEC);
782	writel(~0, &idd->vma->sio_ir);
783
784	/* Release resources */
785	free_irq(idd->irq_io, (void *)idd);
786	if(idd->dual_irq)
787		free_irq(idd->irq_eth, (void *)idd);
788	iounmap(idd->vma);
789	release_mem_region(idd->pma, IOC3_PCI_SIZE);
790
791	/* Disable IOC3 and relinquish */
792	pci_disable_device(pdev);
793
794	/* Remove and free driver data */
795	down_write(&ioc3_devices_rwsem);
796	list_del(&idd->list);
797	up_write(&ioc3_devices_rwsem);
798	kfree(idd);
799}
800
801static struct pci_device_id ioc3_id_table[] = {
802	{PCI_VENDOR_ID_SGI, PCI_DEVICE_ID_SGI_IOC3, PCI_ANY_ID, PCI_ANY_ID},
803	{0}
804};
805
806static struct pci_driver ioc3_driver = {
807	.name = "IOC3",
808	.id_table = ioc3_id_table,
809	.probe = ioc3_probe,
810	.remove = __devexit_p(ioc3_remove),
811};
812
813MODULE_DEVICE_TABLE(pci, ioc3_id_table);
814
815/*********************
816 * Module management *
817 *********************/
818
819/* Module load */
820static int __init ioc3_init(void)
821{
822	if (ia64_platform_is("sn2"))
823		return pci_register_driver(&ioc3_driver);
824	return -ENODEV;
825}
826
827/* Module unload */
828static void __exit ioc3_exit(void)
829{
830	pci_unregister_driver(&ioc3_driver);
831}
832
833module_init(ioc3_init);
834module_exit(ioc3_exit);
835
836MODULE_AUTHOR("Stanislaw Skowronek <skylark@linux-mips.org>");
837MODULE_DESCRIPTION("PCI driver for SGI IOC3");
838MODULE_LICENSE("GPL");
839
840EXPORT_SYMBOL_GPL(ioc3_register_submodule);
841EXPORT_SYMBOL_GPL(ioc3_unregister_submodule);
842EXPORT_SYMBOL_GPL(ioc3_ack);
843EXPORT_SYMBOL_GPL(ioc3_gpcr_set);
844EXPORT_SYMBOL_GPL(ioc3_disable);
845EXPORT_SYMBOL_GPL(ioc3_enable);
846