Lines Matching refs:idd
40 static int nic_wait(struct ioc3_driver_data *idd) in nic_wait() argument
45 mcr = readl(&idd->vma->mcr); in nic_wait()
51 static int nic_reset(struct ioc3_driver_data *idd) in nic_reset() argument
57 writel(mcr_pack(500, 65), &idd->vma->mcr); in nic_reset()
58 presence = nic_wait(idd); in nic_reset()
66 static int nic_read_bit(struct ioc3_driver_data *idd) in nic_read_bit() argument
72 writel(mcr_pack(6, 13), &idd->vma->mcr); in nic_read_bit()
73 result = nic_wait(idd); in nic_read_bit()
81 static void nic_write_bit(struct ioc3_driver_data *idd, int bit) in nic_write_bit() argument
84 writel(mcr_pack(6, 110), &idd->vma->mcr); in nic_write_bit()
86 writel(mcr_pack(80, 30), &idd->vma->mcr); in nic_write_bit()
88 nic_wait(idd); in nic_write_bit()
91 static unsigned nic_read_byte(struct ioc3_driver_data *idd) in nic_read_byte() argument
97 result = (result >> 1) | (nic_read_bit(idd) << 7); in nic_read_byte()
102 static void nic_write_byte(struct ioc3_driver_data *idd, int byte) in nic_write_byte() argument
110 nic_write_bit(idd, bit); in nic_write_byte()
115 nic_find(struct ioc3_driver_data *idd, int *last, unsigned long addr) in nic_find() argument
119 nic_reset(idd); in nic_find()
122 nic_write_byte(idd, 0xF0); in nic_find()
126 a = nic_read_bit(idd); in nic_find()
127 b = nic_read_bit(idd); in nic_find()
143 nic_write_bit(idd, (addr>>index)&1); in nic_find()
150 nic_write_bit(idd, a); in nic_find()
158 static void nic_addr(struct ioc3_driver_data *idd, unsigned long addr) in nic_addr() argument
162 nic_reset(idd); in nic_addr()
163 nic_write_byte(idd, 0xF0); in nic_addr()
165 nic_read_bit(idd); in nic_addr()
166 nic_read_bit(idd); in nic_addr()
167 nic_write_bit(idd, (addr>>index)&1); in nic_addr()
216 read_redir_page(struct ioc3_driver_data *idd, unsigned long addr, int page, in read_redir_page() argument
231 nic_addr(idd, addr); in read_redir_page()
232 nic_write_byte(idd, 0xF0); in read_redir_page()
233 nic_write_byte(idd, (page << 5) & 0xE0); in read_redir_page()
234 nic_write_byte(idd, (page >> 3) & 0x1F); in read_redir_page()
236 data[i] = nic_read_byte(idd); in read_redir_page()
247 read_redir_map(struct ioc3_driver_data *idd, unsigned long addr, in read_redir_map() argument
255 nic_addr(idd, addr); in read_redir_map()
256 nic_write_byte(idd, 0xAA); in read_redir_map()
257 nic_write_byte(idd, 0x00); in read_redir_map()
258 nic_write_byte(idd, 0x01); in read_redir_map()
261 redir[i+j] = nic_read_byte(idd); in read_redir_map()
263 crc16_byte(&crc, nic_read_byte(idd)); in read_redir_map()
264 crc16_byte(&crc, nic_read_byte(idd)); in read_redir_map()
277 static void read_nic(struct ioc3_driver_data *idd, unsigned long addr) in read_nic() argument
284 read_redir_map(idd, addr, redir); in read_nic()
286 read_redir_page(idd, addr, 0, redir, data); in read_nic()
287 read_redir_page(idd, addr, 1, redir, data+32); in read_nic()
302 strcpy(idd->nic_part, part); in read_nic()
307 idd->nic_serial[j++] = data[i+1]; in read_nic()
308 idd->nic_serial[j] = 0; in read_nic()
311 static void read_mac(struct ioc3_driver_data *idd, unsigned long addr) in read_mac() argument
317 nic_addr(idd, addr); in read_mac()
318 nic_write_byte(idd, 0xF0); in read_mac()
319 nic_write_byte(idd, 0x00); in read_mac()
320 nic_write_byte(idd, 0x00); in read_mac()
321 nic_read_byte(idd); in read_mac()
323 data[i] = nic_read_byte(idd); in read_mac()
326 idd->nic_mac[10-i] = data[i]; in read_mac()
333 idd->nic_mac[i] = 0x00; in read_mac()
336 static void probe_nic(struct ioc3_driver_data *idd) in probe_nic() argument
341 writel(GPCR_MLAN_EN, &idd->vma->gpcr_s); in probe_nic()
344 idd->nic_part[0] = 0; in probe_nic()
345 idd->nic_serial[0] = 0; in probe_nic()
346 addr = first = nic_find(idd, &save, 0); in probe_nic()
355 read_nic(idd, addr); in probe_nic()
360 read_mac(idd, addr); in probe_nic()
364 addr = nic_find(idd, &save, addr); in probe_nic()
375 static void write_ireg(struct ioc3_driver_data *idd, uint32_t val, int which) in write_ireg() argument
379 spin_lock_irqsave(&idd->ir_lock, flags); in write_ireg()
382 writel(val, &idd->vma->sio_ies); in write_ireg()
385 writel(val, &idd->vma->sio_iec); in write_ireg()
388 spin_unlock_irqrestore(&idd->ir_lock, flags); in write_ireg()
390 static inline uint32_t get_pending_intrs(struct ioc3_driver_data *idd) in get_pending_intrs() argument
395 spin_lock_irqsave(&idd->ir_lock, flag); in get_pending_intrs()
396 intrs = readl(&idd->vma->sio_ir); in get_pending_intrs()
397 intrs &= readl(&idd->vma->sio_ies); in get_pending_intrs()
398 spin_unlock_irqrestore(&idd->ir_lock, flag); in get_pending_intrs()
405 struct ioc3_driver_data *idd = arg; in ioc3_intr_io() local
411 if(idd->dual_irq && readb(&idd->vma->eisr)) { in ioc3_intr_io()
413 if(ioc3_ethernet && idd->active[ioc3_ethernet->id] && in ioc3_intr_io()
416 idd, 0); in ioc3_intr_io()
419 pending = get_pending_intrs(idd); /* look at the IO IRQs */ in ioc3_intr_io()
422 if(idd->active[id] && ioc3_submodules[id] in ioc3_intr_io()
425 write_ireg(idd, ioc3_submodules[id]->irq_mask, in ioc3_intr_io()
428 idd, pending & ioc3_submodules[id]->irq_mask)) in ioc3_intr_io()
431 write_ireg(idd, ioc3_submodules[id]->irq_mask, in ioc3_intr_io()
439 write_ireg(idd, pending, IOC3_W_IEC); in ioc3_intr_io()
448 struct ioc3_driver_data *idd = (struct ioc3_driver_data *)arg; in ioc3_intr_eth() local
451 if(!idd->dual_irq) in ioc3_intr_eth()
454 if(ioc3_ethernet && idd->active[ioc3_ethernet->id] in ioc3_intr_eth()
456 handled = handled && !ioc3_ethernet->intr(ioc3_ethernet, idd, 0); in ioc3_intr_eth()
462 struct ioc3_driver_data *idd, unsigned int irqs) in ioc3_enable() argument
464 write_ireg(idd, irqs & is->irq_mask, IOC3_W_IES); in ioc3_enable()
467 void ioc3_ack(struct ioc3_submodule *is, struct ioc3_driver_data *idd, in ioc3_ack() argument
470 writel(irqs & is->irq_mask, &idd->vma->sio_ir); in ioc3_ack()
474 struct ioc3_driver_data *idd, unsigned int irqs) in ioc3_disable() argument
476 write_ireg(idd, irqs & is->irq_mask, IOC3_W_IEC); in ioc3_disable()
479 void ioc3_gpcr_set(struct ioc3_driver_data *idd, unsigned int val) in ioc3_gpcr_set() argument
482 spin_lock_irqsave(&idd->gpio_lock, flags); in ioc3_gpcr_set()
483 writel(val, &idd->vma->gpcr_s); in ioc3_gpcr_set()
484 spin_unlock_irqrestore(&idd->gpio_lock, flags); in ioc3_gpcr_set()
500 struct ioc3_driver_data *idd; in ioc3_register_submodule() local
530 list_for_each_entry(idd, &ioc3_devices, list) { in ioc3_register_submodule()
532 idd->active[alloc_id] = 1; in ioc3_register_submodule()
533 idd->active[alloc_id] = !is->probe(is, idd); in ioc3_register_submodule()
543 struct ioc3_driver_data *idd; in ioc3_unregister_submodule() local
558 list_for_each_entry(idd, &ioc3_devices, list) in ioc3_unregister_submodule()
559 if(idd->active[is->id]) { in ioc3_unregister_submodule()
561 if(is->remove(is, idd)) in ioc3_unregister_submodule()
566 pci_name(idd->pdev)); in ioc3_unregister_submodule()
567 idd->active[is->id] = 0; in ioc3_unregister_submodule()
569 write_ireg(idd, is->irq_mask, IOC3_W_IEC); in ioc3_unregister_submodule()
581 static int ioc3_class(struct ioc3_driver_data *idd) in ioc3_class() argument
585 if(!strncmp(idd->nic_part, "030-0891-", 9)) in ioc3_class()
587 if(!strncmp(idd->nic_part, "030-1155-", 9)) in ioc3_class()
589 if(!strncmp(idd->nic_part, "030-1657-", 9)) in ioc3_class()
591 if(!strncmp(idd->nic_part, "030-1664-", 9)) in ioc3_class()
595 if(!idd->nic_part[0]) in ioc3_class()
600 idd->nic_part, idd->nic_serial, ioc3_class_names[res]); in ioc3_class()
606 struct ioc3_driver_data *idd; in ioc3_probe() local
632 idd = kzalloc(sizeof(struct ioc3_driver_data), GFP_KERNEL); in ioc3_probe()
633 if (!idd) { in ioc3_probe()
640 spin_lock_init(&idd->ir_lock); in ioc3_probe()
641 spin_lock_init(&idd->gpio_lock); in ioc3_probe()
642 idd->pdev = pdev; in ioc3_probe()
647 idd->pma = pci_resource_start(pdev, 0); in ioc3_probe()
648 if (!idd->pma) { in ioc3_probe()
656 if (!request_mem_region(idd->pma, IOC3_PCI_SIZE, "ioc3")) { in ioc3_probe()
664 idd->vma = ioremap(idd->pma, IOC3_PCI_SIZE); in ioc3_probe()
665 if (!idd->vma) { in ioc3_probe()
675 pci_set_drvdata(pdev, idd); in ioc3_probe()
677 list_add_tail(&idd->list, &ioc3_devices); in ioc3_probe()
678 idd->id = ioc3_counter++; in ioc3_probe()
681 idd->gpdr_shadow = readl(&idd->vma->gpdr); in ioc3_probe()
684 probe_nic(idd); in ioc3_probe()
687 idd->class = ioc3_class(idd); in ioc3_probe()
696 write_ireg(idd, ~0, IOC3_W_IEC); in ioc3_probe()
697 writel(~0, &idd->vma->sio_ir); in ioc3_probe()
700 if(idd->class == IOC3_CLASS_BASE_IP30 in ioc3_probe()
701 || idd->class == IOC3_CLASS_BASE_IP27) { in ioc3_probe()
702 writel(0, &idd->vma->eier); in ioc3_probe()
703 writel(~0, &idd->vma->eisr); in ioc3_probe()
705 idd->dual_irq = 1; in ioc3_probe()
707 "ioc3-eth", (void *)idd)) { in ioc3_probe()
708 idd->irq_eth = pdev->irq; in ioc3_probe()
715 "ioc3-io", (void *)idd)) { in ioc3_probe()
716 idd->irq_io = pdev->irq+2; in ioc3_probe()
724 "ioc3", (void *)idd)) { in ioc3_probe()
725 idd->irq_io = pdev->irq; in ioc3_probe()
736 idd->active[id] = 1; in ioc3_probe()
737 idd->active[id] = !ioc3_submodules[id]->probe in ioc3_probe()
738 (ioc3_submodules[id], idd); in ioc3_probe()
746 release_mem_region(idd->pma, IOC3_PCI_SIZE); in ioc3_probe()
748 kfree(idd); in ioc3_probe()
759 struct ioc3_driver_data *idd; in ioc3_remove() local
761 idd = pci_get_drvdata(pdev); in ioc3_remove()
765 if(idd->active[id]) { in ioc3_remove()
768 idd)) in ioc3_remove()
775 idd->active[id] = 0; in ioc3_remove()
779 write_ireg(idd, ~0, IOC3_W_IEC); in ioc3_remove()
780 writel(~0, &idd->vma->sio_ir); in ioc3_remove()
783 free_irq(idd->irq_io, (void *)idd); in ioc3_remove()
784 if(idd->dual_irq) in ioc3_remove()
785 free_irq(idd->irq_eth, (void *)idd); in ioc3_remove()
786 iounmap(idd->vma); in ioc3_remove()
787 release_mem_region(idd->pma, IOC3_PCI_SIZE); in ioc3_remove()
794 list_del(&idd->list); in ioc3_remove()
796 kfree(idd); in ioc3_remove()