Lines Matching +full:rom +full:- +full:14 +full:h
1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (C) 2002-2008 Krzysztof Halasa <khc@pm.waw.pl>
10 * Hitachi HD64572 SCA-II User's Manual
16 #include <linux/module.h>
17 #include <linux/kernel.h>
18 #include <linux/capability.h>
19 #include <linux/slab.h>
20 #include <linux/types.h>
21 #include <linux/fcntl.h>
22 #include <linux/in.h>
23 #include <linux/string.h>
24 #include <linux/errno.h>
25 #include <linux/init.h>
26 #include <linux/ioport.h>
27 #include <linux/netdevice.h>
28 #include <linux/hdlc.h>
29 #include <linux/pci.h>
30 #include <linux/delay.h>
31 #include <asm/io.h>
33 #include "hd64572.h"
49 u32 loc_addr_range[4]; /* 00-0Ch : Local Address Ranges */
50 u32 loc_rom_range; /* 10h : Local ROM Range */
51 u32 loc_addr_base[4]; /* 14-20h : Local Address Base Addrs */
52 u32 loc_rom_base; /* 24h : Local ROM Base */
53 u32 loc_bus_descr[4]; /* 28-34h : Local Bus Descriptors */
54 u32 rom_bus_descr; /* 38h : ROM Bus Descriptor */
55 u32 cs_base[4]; /* 3C-48h : Chip Select Base Addrs */
57 u32 init_ctrl; /* 50h : EEPROM ctrl, Init Ctrl, etc */
73 u8 chan; /* physical port # - 0 or 1 */
88 #define get_port(card, port) (&(card)->ports[port])
100 length -= len; in new_memcpy_toio()
112 card_t *card = port->card; in pci200_set_iface()
114 u8 rxs = port->rxs & CLK_BRG_MASK; in pci200_set_iface()
115 u8 txs = port->txs & CLK_BRG_MASK; in pci200_set_iface()
117 sca_out(EXS_TES1, (port->chan ? MSCI1_OFFSET : MSCI0_OFFSET) + EXS, in pci200_set_iface()
118 port->card); in pci200_set_iface()
119 switch (port->settings.clock_type) { in pci200_set_iface()
141 port->rxs = rxs; in pci200_set_iface()
142 port->txs = txs; in pci200_set_iface()
158 sca_flush(port->card); in pci200_open()
165 sca_flush(dev_to_port(dev)->card); in pci200_close()
179 return -EOPNOTSUPP; in pci200_siocdevprivate()
186 sync_serial_settings __user *line = ifs->ifs_ifsu.sync; in pci200_ioctl()
189 switch (ifs->type) { in pci200_ioctl()
191 ifs->type = IF_IFACE_V35; in pci200_ioctl()
192 if (ifs->size < size) { in pci200_ioctl()
193 ifs->size = size; /* data size wanted */ in pci200_ioctl()
194 return -ENOBUFS; in pci200_ioctl()
196 if (copy_to_user(line, &port->settings, size)) in pci200_ioctl()
197 return -EFAULT; in pci200_ioctl()
203 return -EPERM; in pci200_ioctl()
206 return -EFAULT; in pci200_ioctl()
212 return -EINVAL; /* No such clock setting */ in pci200_ioctl()
215 return -EINVAL; in pci200_ioctl()
217 memcpy(&port->settings, &new_line, size); /* Update settings */ in pci200_ioctl()
219 sca_flush(port->card); in pci200_ioctl()
233 if (card->ports[i].card) in pci200_pci_remove_one()
234 unregister_hdlc_device(card->ports[i].netdev); in pci200_pci_remove_one()
236 if (card->irq) in pci200_pci_remove_one()
237 free_irq(card->irq, card); in pci200_pci_remove_one()
239 if (card->rambase) in pci200_pci_remove_one()
240 iounmap(card->rambase); in pci200_pci_remove_one()
241 if (card->scabase) in pci200_pci_remove_one()
242 iounmap(card->scabase); in pci200_pci_remove_one()
243 if (card->plxbase) in pci200_pci_remove_one()
244 iounmap(card->plxbase); in pci200_pci_remove_one()
248 if (card->ports[0].netdev) in pci200_pci_remove_one()
249 free_netdev(card->ports[0].netdev); in pci200_pci_remove_one()
250 if (card->ports[1].netdev) in pci200_pci_remove_one()
251 free_netdev(card->ports[1].netdev); in pci200_pci_remove_one()
288 return -ENOBUFS; in pci200_pci_init_one()
291 card->ports[0].netdev = alloc_hdlcdev(&card->ports[0]); in pci200_pci_init_one()
292 card->ports[1].netdev = alloc_hdlcdev(&card->ports[1]); in pci200_pci_init_one()
293 if (!card->ports[0].netdev || !card->ports[1].netdev) { in pci200_pci_init_one()
296 return -ENOMEM; in pci200_pci_init_one()
304 return -EFAULT; in pci200_pci_init_one()
308 card->plxbase = ioremap(plxphys, PCI200SYN_PLX_SIZE); in pci200_pci_init_one()
311 card->scabase = ioremap(scaphys, PCI200SYN_SCA_SIZE); in pci200_pci_init_one()
314 card->rambase = pci_ioremap_bar(pdev, 3); in pci200_pci_init_one()
316 if (!card->plxbase || !card->scabase || !card->rambase) { in pci200_pci_init_one()
319 return -EFAULT; in pci200_pci_init_one()
323 p = &card->plxbase->init_ctrl; in pci200_pci_init_one()
325 readl(p); /* Flush the write - do not use sca_flush */ in pci200_pci_init_one()
329 readl(p); /* Flush the write - do not use sca_flush */ in pci200_pci_init_one()
332 ramsize = sca_detect_ram(card, card->rambase, in pci200_pci_init_one()
335 /* number of TX + RX buffers for one port - this is dual port card */ in pci200_pci_init_one()
337 card->tx_ring_buffers = min(i / 2, MAX_TX_BUFFERS); in pci200_pci_init_one()
338 card->rx_ring_buffers = i - card->tx_ring_buffers; in pci200_pci_init_one()
340 card->buff_offset = 2 * sizeof(pkt_desc) * (card->tx_ring_buffers + in pci200_pci_init_one()
341 card->rx_ring_buffers); in pci200_pci_init_one()
345 pdev->irq, card->tx_ring_buffers, card->rx_ring_buffers); in pci200_pci_init_one()
347 if (card->tx_ring_buffers < 1) { in pci200_pci_init_one()
350 return -EFAULT; in pci200_pci_init_one()
354 p = &card->plxbase->intr_ctrl_stat; in pci200_pci_init_one()
358 if (request_irq(pdev->irq, sca_intr, IRQF_SHARED, "pci200syn", card)) { in pci200_pci_init_one()
359 pr_warn("could not allocate IRQ%d\n", pdev->irq); in pci200_pci_init_one()
361 return -EBUSY; in pci200_pci_init_one()
363 card->irq = pdev->irq; in pci200_pci_init_one()
368 port_t *port = &card->ports[i]; in pci200_pci_init_one()
369 struct net_device *dev = port->netdev; in pci200_pci_init_one()
372 port->chan = i; in pci200_pci_init_one()
374 spin_lock_init(&port->lock); in pci200_pci_init_one()
375 dev->irq = card->irq; in pci200_pci_init_one()
376 dev->mem_start = ramphys; in pci200_pci_init_one()
377 dev->mem_end = ramphys + ramsize - 1; in pci200_pci_init_one()
378 dev->tx_queue_len = 50; in pci200_pci_init_one()
379 dev->netdev_ops = &pci200_ops; in pci200_pci_init_one()
380 hdlc->attach = sca_attach; in pci200_pci_init_one()
381 hdlc->xmit = sca_xmit; in pci200_pci_init_one()
382 port->settings.clock_type = CLOCK_EXT; in pci200_pci_init_one()
383 port->card = card; in pci200_pci_init_one()
387 port->card = NULL; in pci200_pci_init_one()
389 return -ENOBUFS; in pci200_pci_init_one()
392 netdev_info(dev, "PCI200SYN channel %d\n", port->chan); in pci200_pci_init_one()
416 return -EINVAL; in pci200_init_module()