Lines Matching +full:10 +full:base +full:- +full:te
1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (C) 2000-2008 Krzysztof Halasa <khc@pm.waw.pl>
10 * Hitachi HD64572 SCA-II User's Manual
44 #define MAX_TX_BUFFERS 10
59 * PLX PCI9050-1 local configuration and shared runtime registers.
63 u32 loc_addr_range[4]; /* 00-0Ch : Local Address Ranges */
64 u32 loc_rom_range; /* 10h : Local ROM Range */
65 u32 loc_addr_base[4]; /* 14-20h : Local Address Base Addrs */
66 u32 loc_rom_base; /* 24h : Local ROM Base */
67 u32 loc_bus_descr[4]; /* 28-34h : Local Bus Descriptors */
69 u32 cs_base[4]; /* 3C-48h : Chip Select Base Addrs */
90 u8 chan; /* physical port # - 0 or 1 */
98 u8 __iomem *rambase; /* buffer memory base (virtual) */
99 u8 __iomem *scabase; /* SCA memory base (virtual) */
100 plx9050 __iomem *plxbase; /* PLX registers memory base (virtual) */
101 u32 init_ctrl_value; /* Saved value - 9050 bug workaround */
111 #define get_port(card, port) ((port) < (card)->n_ports ? \
112 (&(card)->ports[port]) : (NULL))
119 card_t *card = port->card; in pc300_set_iface()
120 u32 __iomem * init_ctrl = &card->plxbase->init_ctrl; in pc300_set_iface()
122 u8 rxs = port->rxs & CLK_BRG_MASK; in pc300_set_iface()
123 u8 txs = port->txs & CLK_BRG_MASK; in pc300_set_iface()
125 sca_out(EXS_TES1, (port->chan ? MSCI1_OFFSET : MSCI0_OFFSET) + EXS, in pc300_set_iface()
126 port->card); in pc300_set_iface()
127 switch(port->settings.clock_type) { in pc300_set_iface()
149 port->rxs = rxs; in pc300_set_iface()
150 port->txs = txs; in pc300_set_iface()
155 if (port->card->type == PC300_RSV) { in pc300_set_iface()
156 if (port->iface == IF_IFACE_V35) in pc300_set_iface()
157 writel(card->init_ctrl_value | in pc300_set_iface()
158 PC300_CHMEDIA_MASK(port->chan), init_ctrl); 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()
195 sync_serial_settings __user *line = ifr->ifr_settings.ifs_ifsu.sync; in pc300_ioctl()
208 if (ifr->ifr_settings.type == IF_GET_IFACE) { in pc300_ioctl()
209 ifr->ifr_settings.type = port->iface; in pc300_ioctl()
210 if (ifr->ifr_settings.size < size) { in pc300_ioctl()
211 ifr->ifr_settings.size = size; /* data size wanted */ in pc300_ioctl()
212 return -ENOBUFS; in pc300_ioctl()
214 if (copy_to_user(line, &port->settings, size)) in pc300_ioctl()
215 return -EFAULT; in pc300_ioctl()
220 if (port->card->type == PC300_X21 && in pc300_ioctl()
221 (ifr->ifr_settings.type == IF_IFACE_SYNC_SERIAL || in pc300_ioctl()
222 ifr->ifr_settings.type == IF_IFACE_X21)) in pc300_ioctl()
225 else if (port->card->type == PC300_RSV && in pc300_ioctl()
226 (ifr->ifr_settings.type == IF_IFACE_SYNC_SERIAL || in pc300_ioctl()
227 ifr->ifr_settings.type == IF_IFACE_V35)) in pc300_ioctl()
230 else if (port->card->type == PC300_RSV && in pc300_ioctl()
231 ifr->ifr_settings.type == IF_IFACE_V24) in pc300_ioctl()
238 return -EPERM; in pc300_ioctl()
241 return -EFAULT; in pc300_ioctl()
247 return -EINVAL; /* No such clock setting */ in pc300_ioctl()
250 return -EINVAL; in pc300_ioctl()
252 memcpy(&port->settings, &new_line, size); /* Update settings */ in pc300_ioctl()
253 port->iface = new_type; in pc300_ioctl()
266 if (card->ports[i].card) in pc300_pci_remove_one()
267 unregister_hdlc_device(card->ports[i].netdev); in pc300_pci_remove_one()
269 if (card->irq) in pc300_pci_remove_one()
270 free_irq(card->irq, card); in pc300_pci_remove_one()
272 if (card->rambase) in pc300_pci_remove_one()
273 iounmap(card->rambase); in pc300_pci_remove_one()
274 if (card->scabase) in pc300_pci_remove_one()
275 iounmap(card->scabase); in pc300_pci_remove_one()
276 if (card->plxbase) in pc300_pci_remove_one()
277 iounmap(card->plxbase); in pc300_pci_remove_one()
281 if (card->ports[0].netdev) in pc300_pci_remove_one()
282 free_netdev(card->ports[0].netdev); in pc300_pci_remove_one()
283 if (card->ports[1].netdev) in pc300_pci_remove_one()
284 free_netdev(card->ports[1].netdev); in pc300_pci_remove_one()
302 u32 ramphys; /* buffer memory base */ in pc300_pci_init_one()
303 u32 scaphys; /* SCA memory base */ in pc300_pci_init_one()
304 u32 plxphys; /* PLX registers memory base */ in pc300_pci_init_one()
320 return -ENOBUFS; in pc300_pci_init_one()
329 return -EFAULT; in pc300_pci_init_one()
333 card->plxbase = ioremap(plxphys, PC300_PLX_SIZE); in pc300_pci_init_one()
336 card->scabase = ioremap(scaphys, PC300_SCA_SIZE); in pc300_pci_init_one()
339 card->rambase = pci_ioremap_bar(pdev, 3); in pc300_pci_init_one()
341 if (card->plxbase == NULL || in pc300_pci_init_one()
342 card->scabase == NULL || in pc300_pci_init_one()
343 card->rambase == NULL) { in pc300_pci_init_one()
346 return -ENOMEM; in pc300_pci_init_one()
351 card->init_ctrl_value = readl(&((plx9050 __iomem *)card->scabase)->init_ctrl); in pc300_pci_init_one()
354 if (pdev->device == PCI_DEVICE_ID_PC300_TE_1 || in pc300_pci_init_one()
355 pdev->device == PCI_DEVICE_ID_PC300_TE_2) in pc300_pci_init_one()
356 card->type = PC300_TE; /* not fully supported */ in pc300_pci_init_one()
357 else if (card->init_ctrl_value & PC300_CTYPE_MASK) in pc300_pci_init_one()
358 card->type = PC300_X21; in pc300_pci_init_one()
360 card->type = PC300_RSV; in pc300_pci_init_one()
362 if (pdev->device == PCI_DEVICE_ID_PC300_RX_1 || in pc300_pci_init_one()
363 pdev->device == PCI_DEVICE_ID_PC300_TE_1) in pc300_pci_init_one()
364 card->n_ports = 1; in pc300_pci_init_one()
366 card->n_ports = 2; in pc300_pci_init_one()
368 for (i = 0; i < card->n_ports; i++) in pc300_pci_init_one()
369 if (!(card->ports[i].netdev = alloc_hdlcdev(&card->ports[i]))) { in pc300_pci_init_one()
372 return -ENOMEM; in pc300_pci_init_one()
376 p = &card->plxbase->init_ctrl; in pc300_pci_init_one()
377 writel(card->init_ctrl_value | 0x40000000, p); in pc300_pci_init_one()
378 readl(p); /* Flush the write - do not use sca_flush */ in pc300_pci_init_one()
381 writel(card->init_ctrl_value, p); in pc300_pci_init_one()
382 readl(p); /* Flush the write - do not use sca_flush */ in pc300_pci_init_one()
386 writel(card->init_ctrl_value | 0x20000000, p); in pc300_pci_init_one()
387 readl(p); /* Flush the write - do not use sca_flush */ in pc300_pci_init_one()
390 writel(card->init_ctrl_value, p); in pc300_pci_init_one()
391 readl(p); /* Flush the write - do not use sca_flush */ in pc300_pci_init_one()
394 ramsize = sca_detect_ram(card, card->rambase, in pc300_pci_init_one()
398 card->init_ctrl_value &= ~PC300_CLKSEL_MASK; in pc300_pci_init_one()
400 card->init_ctrl_value |= PC300_CLKSEL_MASK; in pc300_pci_init_one()
402 writel(card->init_ctrl_value, &card->plxbase->init_ctrl); in pc300_pci_init_one()
404 i = ramsize / (card->n_ports * (sizeof(pkt_desc) + HDLC_MAX_MRU)); in pc300_pci_init_one()
405 card->tx_ring_buffers = min(i / 2, MAX_TX_BUFFERS); in pc300_pci_init_one()
406 card->rx_ring_buffers = i - card->tx_ring_buffers; in pc300_pci_init_one()
408 card->buff_offset = card->n_ports * sizeof(pkt_desc) * in pc300_pci_init_one()
409 (card->tx_ring_buffers + card->rx_ring_buffers); in pc300_pci_init_one()
412 card->type == PC300_X21 ? "X21" : in pc300_pci_init_one()
413 card->type == PC300_TE ? "TE" : "RSV", in pc300_pci_init_one()
414 ramsize / 1024, ramphys, pdev->irq, in pc300_pci_init_one()
415 card->tx_ring_buffers, card->rx_ring_buffers); in pc300_pci_init_one()
417 if (card->tx_ring_buffers < 1) { in pc300_pci_init_one()
420 return -EFAULT; in pc300_pci_init_one()
424 writew(0x0041, &card->plxbase->intr_ctrl_stat); in pc300_pci_init_one()
427 if (request_irq(pdev->irq, sca_intr, IRQF_SHARED, "pc300", card)) { in pc300_pci_init_one()
428 pr_warn("could not allocate IRQ%d\n", pdev->irq); in pc300_pci_init_one()
430 return -EBUSY; in pc300_pci_init_one()
432 card->irq = pdev->irq; in pc300_pci_init_one()
436 // COTE not set - allows better TX DMA settings in pc300_pci_init_one()
441 for (i = 0; i < card->n_ports; i++) { in pc300_pci_init_one()
442 port_t *port = &card->ports[i]; in pc300_pci_init_one()
443 struct net_device *dev = port->netdev; in pc300_pci_init_one()
445 port->chan = i; in pc300_pci_init_one()
447 spin_lock_init(&port->lock); in pc300_pci_init_one()
448 dev->irq = card->irq; in pc300_pci_init_one()
449 dev->mem_start = ramphys; in pc300_pci_init_one()
450 dev->mem_end = ramphys + ramsize - 1; in pc300_pci_init_one()
451 dev->tx_queue_len = 50; in pc300_pci_init_one()
452 dev->netdev_ops = &pc300_ops; in pc300_pci_init_one()
453 hdlc->attach = sca_attach; in pc300_pci_init_one()
454 hdlc->xmit = sca_xmit; in pc300_pci_init_one()
455 port->settings.clock_type = CLOCK_EXT; in pc300_pci_init_one()
456 port->card = card; in pc300_pci_init_one()
457 if (card->type == PC300_X21) in pc300_pci_init_one()
458 port->iface = IF_IFACE_X21; in pc300_pci_init_one()
460 port->iface = IF_IFACE_V35; in pc300_pci_init_one()
465 port->card = NULL; in pc300_pci_init_one()
467 return -ENOBUFS; in pc300_pci_init_one()
470 netdev_info(dev, "PC300 channel %d\n", port->chan); in pc300_pci_init_one()
502 return -EINVAL; in pc300_init_module()
506 return -EINVAL; in pc300_init_module()