Lines Matching +full:10 +full:base +full:- +full:te
4 * Copyright (C) 2000-2008 Krzysztof Halasa <khc@pm.waw.pl>
13 * Hitachi HD64572 SCA-II User's Manual
47 #define MAX_TX_BUFFERS 10
62 * PLX PCI9050-1 local configuration and shared runtime registers.
66 u32 loc_addr_range[4]; /* 00-0Ch : Local Address Ranges */
67 u32 loc_rom_range; /* 10h : Local ROM Range */
68 u32 loc_addr_base[4]; /* 14-20h : Local Address Base Addrs */
69 u32 loc_rom_base; /* 24h : Local ROM Base */
70 u32 loc_bus_descr[4]; /* 28-34h : Local Bus Descriptors */
72 u32 cs_base[4]; /* 3C-48h : Chip Select Base Addrs */
93 u8 chan; /* physical port # - 0 or 1 */
101 u8 __iomem *rambase; /* buffer memory base (virtual) */
102 u8 __iomem *scabase; /* SCA memory base (virtual) */
103 plx9050 __iomem *plxbase; /* PLX registers memory base (virtual) */
104 u32 init_ctrl_value; /* Saved value - 9050 bug workaround */
114 #define get_port(card, port) ((port) < (card)->n_ports ? \
115 (&(card)->ports[port]) : (NULL))
122 card_t *card = port->card; in pc300_set_iface()
123 u32 __iomem * init_ctrl = &card->plxbase->init_ctrl; in pc300_set_iface()
125 u8 rxs = port->rxs & CLK_BRG_MASK; in pc300_set_iface()
126 u8 txs = port->txs & CLK_BRG_MASK; in pc300_set_iface()
128 sca_out(EXS_TES1, (port->chan ? MSCI1_OFFSET : MSCI0_OFFSET) + EXS, in pc300_set_iface()
129 port->card); in pc300_set_iface()
130 switch(port->settings.clock_type) { in pc300_set_iface()
152 port->rxs = rxs; in pc300_set_iface()
153 port->txs = txs; in pc300_set_iface()
158 if (port->card->type == PC300_RSV) { in pc300_set_iface()
159 if (port->iface == IF_IFACE_V35) in pc300_set_iface()
160 writel(card->init_ctrl_value | in pc300_set_iface()
161 PC300_CHMEDIA_MASK(port->chan), init_ctrl); in pc300_set_iface()
163 writel(card->init_ctrl_value & in pc300_set_iface()
164 ~PC300_CHMEDIA_MASK(port->chan), init_ctrl); in pc300_set_iface()
198 sync_serial_settings __user *line = ifr->ifr_settings.ifs_ifsu.sync; in pc300_ioctl()
211 if (ifr->ifr_settings.type == IF_GET_IFACE) { in pc300_ioctl()
212 ifr->ifr_settings.type = port->iface; in pc300_ioctl()
213 if (ifr->ifr_settings.size < size) { in pc300_ioctl()
214 ifr->ifr_settings.size = size; /* data size wanted */ in pc300_ioctl()
215 return -ENOBUFS; in pc300_ioctl()
217 if (copy_to_user(line, &port->settings, size)) in pc300_ioctl()
218 return -EFAULT; in pc300_ioctl()
223 if (port->card->type == PC300_X21 && in pc300_ioctl()
224 (ifr->ifr_settings.type == IF_IFACE_SYNC_SERIAL || in pc300_ioctl()
225 ifr->ifr_settings.type == IF_IFACE_X21)) in pc300_ioctl()
228 else if (port->card->type == PC300_RSV && in pc300_ioctl()
229 (ifr->ifr_settings.type == IF_IFACE_SYNC_SERIAL || in pc300_ioctl()
230 ifr->ifr_settings.type == IF_IFACE_V35)) in pc300_ioctl()
233 else if (port->card->type == PC300_RSV && in pc300_ioctl()
234 ifr->ifr_settings.type == IF_IFACE_V24) in pc300_ioctl()
241 return -EPERM; in pc300_ioctl()
244 return -EFAULT; in pc300_ioctl()
250 return -EINVAL; /* No such clock setting */ in pc300_ioctl()
253 return -EINVAL; in pc300_ioctl()
255 memcpy(&port->settings, &new_line, size); /* Update settings */ in pc300_ioctl()
256 port->iface = new_type; in pc300_ioctl()
269 if (card->ports[i].card) in pc300_pci_remove_one()
270 unregister_hdlc_device(card->ports[i].netdev); in pc300_pci_remove_one()
272 if (card->irq) in pc300_pci_remove_one()
273 free_irq(card->irq, card); in pc300_pci_remove_one()
275 if (card->rambase) in pc300_pci_remove_one()
276 iounmap(card->rambase); in pc300_pci_remove_one()
277 if (card->scabase) in pc300_pci_remove_one()
278 iounmap(card->scabase); in pc300_pci_remove_one()
279 if (card->plxbase) in pc300_pci_remove_one()
280 iounmap(card->plxbase); in pc300_pci_remove_one()
284 if (card->ports[0].netdev) in pc300_pci_remove_one()
285 free_netdev(card->ports[0].netdev); in pc300_pci_remove_one()
286 if (card->ports[1].netdev) in pc300_pci_remove_one()
287 free_netdev(card->ports[1].netdev); in pc300_pci_remove_one()
305 u32 ramphys; /* buffer memory base */ in pc300_pci_init_one()
306 u32 scaphys; /* SCA memory base */ in pc300_pci_init_one()
307 u32 plxphys; /* PLX registers memory base */ in pc300_pci_init_one()
323 return -ENOBUFS; in pc300_pci_init_one()
332 return -EFAULT; in pc300_pci_init_one()
336 card->plxbase = ioremap(plxphys, PC300_PLX_SIZE); in pc300_pci_init_one()
339 card->scabase = ioremap(scaphys, PC300_SCA_SIZE); in pc300_pci_init_one()
342 card->rambase = pci_ioremap_bar(pdev, 3); in pc300_pci_init_one()
344 if (card->plxbase == NULL || in pc300_pci_init_one()
345 card->scabase == NULL || in pc300_pci_init_one()
346 card->rambase == NULL) { in pc300_pci_init_one()
349 return -ENOMEM; in pc300_pci_init_one()
354 card->init_ctrl_value = readl(&((plx9050 __iomem *)card->scabase)->init_ctrl); in pc300_pci_init_one()
357 if (pdev->device == PCI_DEVICE_ID_PC300_TE_1 || in pc300_pci_init_one()
358 pdev->device == PCI_DEVICE_ID_PC300_TE_2) in pc300_pci_init_one()
359 card->type = PC300_TE; /* not fully supported */ in pc300_pci_init_one()
360 else if (card->init_ctrl_value & PC300_CTYPE_MASK) in pc300_pci_init_one()
361 card->type = PC300_X21; in pc300_pci_init_one()
363 card->type = PC300_RSV; in pc300_pci_init_one()
365 if (pdev->device == PCI_DEVICE_ID_PC300_RX_1 || in pc300_pci_init_one()
366 pdev->device == PCI_DEVICE_ID_PC300_TE_1) in pc300_pci_init_one()
367 card->n_ports = 1; in pc300_pci_init_one()
369 card->n_ports = 2; in pc300_pci_init_one()
371 for (i = 0; i < card->n_ports; i++) in pc300_pci_init_one()
372 if (!(card->ports[i].netdev = alloc_hdlcdev(&card->ports[i]))) { in pc300_pci_init_one()
375 return -ENOMEM; in pc300_pci_init_one()
379 p = &card->plxbase->init_ctrl; in pc300_pci_init_one()
380 writel(card->init_ctrl_value | 0x40000000, p); in pc300_pci_init_one()
381 readl(p); /* Flush the write - do not use sca_flush */ in pc300_pci_init_one()
384 writel(card->init_ctrl_value, p); in pc300_pci_init_one()
385 readl(p); /* Flush the write - do not use sca_flush */ in pc300_pci_init_one()
389 writel(card->init_ctrl_value | 0x20000000, p); in pc300_pci_init_one()
390 readl(p); /* Flush the write - do not use sca_flush */ in pc300_pci_init_one()
393 writel(card->init_ctrl_value, p); in pc300_pci_init_one()
394 readl(p); /* Flush the write - do not use sca_flush */ in pc300_pci_init_one()
397 ramsize = sca_detect_ram(card, card->rambase, in pc300_pci_init_one()
401 card->init_ctrl_value &= ~PC300_CLKSEL_MASK; in pc300_pci_init_one()
403 card->init_ctrl_value |= PC300_CLKSEL_MASK; in pc300_pci_init_one()
405 writel(card->init_ctrl_value, &card->plxbase->init_ctrl); in pc300_pci_init_one()
407 i = ramsize / (card->n_ports * (sizeof(pkt_desc) + HDLC_MAX_MRU)); in pc300_pci_init_one()
408 card->tx_ring_buffers = min(i / 2, MAX_TX_BUFFERS); in pc300_pci_init_one()
409 card->rx_ring_buffers = i - card->tx_ring_buffers; in pc300_pci_init_one()
411 card->buff_offset = card->n_ports * sizeof(pkt_desc) * in pc300_pci_init_one()
412 (card->tx_ring_buffers + card->rx_ring_buffers); in pc300_pci_init_one()
415 card->type == PC300_X21 ? "X21" : in pc300_pci_init_one()
416 card->type == PC300_TE ? "TE" : "RSV", in pc300_pci_init_one()
417 ramsize / 1024, ramphys, pdev->irq, in pc300_pci_init_one()
418 card->tx_ring_buffers, card->rx_ring_buffers); in pc300_pci_init_one()
420 if (card->tx_ring_buffers < 1) { in pc300_pci_init_one()
423 return -EFAULT; in pc300_pci_init_one()
427 writew(0x0041, &card->plxbase->intr_ctrl_stat); in pc300_pci_init_one()
430 if (request_irq(pdev->irq, sca_intr, IRQF_SHARED, "pc300", card)) { in pc300_pci_init_one()
431 pr_warn("could not allocate IRQ%d\n", pdev->irq); in pc300_pci_init_one()
433 return -EBUSY; in pc300_pci_init_one()
435 card->irq = pdev->irq; in pc300_pci_init_one()
439 // COTE not set - allows better TX DMA settings in pc300_pci_init_one()
444 for (i = 0; i < card->n_ports; i++) { in pc300_pci_init_one()
445 port_t *port = &card->ports[i]; in pc300_pci_init_one()
446 struct net_device *dev = port->netdev; in pc300_pci_init_one()
448 port->chan = i; in pc300_pci_init_one()
450 spin_lock_init(&port->lock); in pc300_pci_init_one()
451 dev->irq = card->irq; in pc300_pci_init_one()
452 dev->mem_start = ramphys; in pc300_pci_init_one()
453 dev->mem_end = ramphys + ramsize - 1; in pc300_pci_init_one()
454 dev->tx_queue_len = 50; in pc300_pci_init_one()
455 dev->netdev_ops = &pc300_ops; in pc300_pci_init_one()
456 hdlc->attach = sca_attach; in pc300_pci_init_one()
457 hdlc->xmit = sca_xmit; in pc300_pci_init_one()
458 port->settings.clock_type = CLOCK_EXT; in pc300_pci_init_one()
459 port->card = card; in pc300_pci_init_one()
460 if (card->type == PC300_X21) in pc300_pci_init_one()
461 port->iface = IF_IFACE_X21; in pc300_pci_init_one()
463 port->iface = IF_IFACE_V35; in pc300_pci_init_one()
468 port->card = NULL; in pc300_pci_init_one()
470 return -ENOBUFS; in pc300_pci_init_one()
473 netdev_info(dev, "PC300 channel %d\n", port->chan); in pc300_pci_init_one()
505 return -EINVAL; in pc300_init_module()
509 return -EINVAL; in pc300_init_module()