Lines Matching +full:big +full:- +full:endian +full:- +full:desc
1 // SPDX-License-Identifier: GPL-2.0-only
9 * - Only DTE (external clock) support with NRZ and NRZI encodings
10 * - wanXL100 will require minor driver modifications, no access to hw
29 #include <linux/dma-mapping.h>
42 /* MAILBOX #1 - PUTS COMMANDS */
45 #define MBX1_CMD_BSWAP 0x8C000001 /* little-endian Byte Swap Mode */
47 #define MBX1_CMD_BSWAP 0x8C000000 /* big-endian Byte Swap Mode */
50 /* MAILBOX #2 - DRAM SIZE */
57 int node; /* physical port #0 - 3 */
78 struct port ports[]; /* 1 - 4 port structures follow */
83 return (struct port *)dev_to_hdlc(dev)->priv; in dev_to_port()
88 return &port->card->status->port_status[port->node]; in get_status()
95 dma_addr_t addr = dma_map_single(&pdev->dev, ptr, size, direction); in pci_map_single_debug()
110 u32 value = get_status(port)->cable; in wanxl_cable_intr()
165 netdev_info(port->dev, "%s%s module, %s cable%s%s\n", in wanxl_cable_intr()
169 netif_carrier_on(port->dev); in wanxl_cable_intr()
171 netif_carrier_off(port->dev); in wanxl_cable_intr()
177 struct net_device *dev = port->dev; in wanxl_tx_intr()
180 desc_t *desc = &get_status(port)->tx_descs[port->tx_in]; in wanxl_tx_intr() local
181 struct sk_buff *skb = port->tx_skbs[port->tx_in]; in wanxl_tx_intr()
183 switch (desc->stat) { in wanxl_tx_intr()
190 dev->stats.tx_errors++; in wanxl_tx_intr()
191 dev->stats.tx_fifo_errors++; in wanxl_tx_intr()
195 dev->stats.tx_packets++; in wanxl_tx_intr()
196 dev->stats.tx_bytes += skb->len; in wanxl_tx_intr()
198 desc->stat = PACKET_EMPTY; /* Free descriptor */ in wanxl_tx_intr()
199 dma_unmap_single(&port->card->pdev->dev, desc->address, in wanxl_tx_intr()
200 skb->len, DMA_TO_DEVICE); in wanxl_tx_intr()
202 port->tx_in = (port->tx_in + 1) % TX_BUFFERS; in wanxl_tx_intr()
209 desc_t *desc; in wanxl_rx_intr() local
211 while (desc = &card->status->rx_descs[card->rx_in], in wanxl_rx_intr()
212 desc->stat != PACKET_EMPTY) { in wanxl_rx_intr()
213 if ((desc->stat & PACKET_PORT_MASK) > card->n_ports) { in wanxl_rx_intr()
215 pci_name(card->pdev)); in wanxl_rx_intr()
217 struct sk_buff *skb = card->rx_skbs[card->rx_in]; in wanxl_rx_intr()
218 struct port *port = &card->ports[desc->stat & in wanxl_rx_intr()
220 struct net_device *dev = port->dev; in wanxl_rx_intr()
223 dev->stats.rx_dropped++; in wanxl_rx_intr()
225 dma_unmap_single(&card->pdev->dev, in wanxl_rx_intr()
226 desc->address, BUFFER_LENGTH, in wanxl_rx_intr()
228 skb_put(skb, desc->length); in wanxl_rx_intr()
231 printk(KERN_DEBUG "%s RX(%i):", dev->name, in wanxl_rx_intr()
232 skb->len); in wanxl_rx_intr()
235 dev->stats.rx_packets++; in wanxl_rx_intr()
236 dev->stats.rx_bytes += skb->len; in wanxl_rx_intr()
237 skb->protocol = hdlc_type_trans(skb, dev); in wanxl_rx_intr()
244 desc->address = skb ? in wanxl_rx_intr()
245 dma_map_single(&card->pdev->dev, in wanxl_rx_intr()
246 skb->data, in wanxl_rx_intr()
249 card->rx_skbs[card->rx_in] = skb; in wanxl_rx_intr()
252 desc->stat = PACKET_EMPTY; /* Free descriptor */ in wanxl_rx_intr()
253 card->rx_in = (card->rx_in + 1) % RX_QUEUE_LENGTH; in wanxl_rx_intr()
264 while ((stat = readl(card->plx + PLX_DOORBELL_FROM_CARD)) != 0) { in wanxl_intr()
266 writel(stat, card->plx + PLX_DOORBELL_FROM_CARD); in wanxl_intr()
268 for (i = 0; i < card->n_ports; i++) { in wanxl_intr()
270 wanxl_tx_intr(&card->ports[i]); in wanxl_intr()
272 wanxl_cable_intr(&card->ports[i]); in wanxl_intr()
284 desc_t *desc; in wanxl_xmit() local
286 spin_lock(&port->lock); in wanxl_xmit()
288 desc = &get_status(port)->tx_descs[port->tx_out]; in wanxl_xmit()
289 if (desc->stat != PACKET_EMPTY) { in wanxl_xmit()
290 /* should never happen - previous xmit should stop queue */ in wanxl_xmit()
292 printk(KERN_DEBUG "%s: transmitter buffer full\n", dev->name); in wanxl_xmit()
295 spin_unlock(&port->lock); in wanxl_xmit()
300 printk(KERN_DEBUG "%s TX(%i):", dev->name, skb->len); in wanxl_xmit()
304 port->tx_skbs[port->tx_out] = skb; in wanxl_xmit()
305 desc->address = dma_map_single(&port->card->pdev->dev, skb->data, in wanxl_xmit()
306 skb->len, DMA_TO_DEVICE); in wanxl_xmit()
307 desc->length = skb->len; in wanxl_xmit()
308 desc->stat = PACKET_FULL; in wanxl_xmit()
309 writel(1 << (DOORBELL_TO_CARD_TX_0 + port->node), in wanxl_xmit()
310 port->card->plx + PLX_DOORBELL_TO_CARD); in wanxl_xmit()
312 port->tx_out = (port->tx_out + 1) % TX_BUFFERS; in wanxl_xmit()
314 if (get_status(port)->tx_descs[port->tx_out].stat != PACKET_EMPTY) { in wanxl_xmit()
317 printk(KERN_DEBUG "%s: transmitter buffer full\n", dev->name); in wanxl_xmit()
321 spin_unlock(&port->lock); in wanxl_xmit()
332 return -EINVAL; in wanxl_attach()
339 return -EINVAL; in wanxl_attach()
341 get_status(port)->encoding = encoding; in wanxl_attach()
342 get_status(port)->parity = parity; in wanxl_attach()
352 switch (ifs->type) { in wanxl_ioctl()
354 ifs->type = IF_IFACE_SYNC_SERIAL; in wanxl_ioctl()
355 if (ifs->size < size) { in wanxl_ioctl()
356 ifs->size = size; /* data size wanted */ in wanxl_ioctl()
357 return -ENOBUFS; in wanxl_ioctl()
360 line.clock_type = get_status(port)->clocking; in wanxl_ioctl()
364 if (copy_to_user(ifs->ifs_ifsu.sync, &line, size)) in wanxl_ioctl()
365 return -EFAULT; in wanxl_ioctl()
370 return -EPERM; in wanxl_ioctl()
371 if (dev->flags & IFF_UP) in wanxl_ioctl()
372 return -EBUSY; in wanxl_ioctl()
374 if (copy_from_user(&line, ifs->ifs_ifsu.sync, in wanxl_ioctl()
376 return -EFAULT; in wanxl_ioctl()
380 return -EINVAL; /* No such clock setting */ in wanxl_ioctl()
383 return -EINVAL; in wanxl_ioctl()
385 get_status(port)->clocking = line.clock_type; in wanxl_ioctl()
396 u8 __iomem *dbr = port->card->plx + PLX_DOORBELL_TO_CARD; in wanxl_open()
400 if (get_status(port)->open) { in wanxl_open()
402 return -EIO; in wanxl_open()
409 port->tx_in = port->tx_out = 0; in wanxl_open()
411 get_status(port)->tx_descs[i].stat = PACKET_EMPTY; in wanxl_open()
413 writel(1 << (DOORBELL_TO_CARD_OPEN_0 + port->node), dbr); in wanxl_open()
417 if (get_status(port)->open) { in wanxl_open()
425 writel(1 << (DOORBELL_TO_CARD_CLOSE_0 + port->node), dbr); in wanxl_open()
426 return -EFAULT; in wanxl_open()
437 writel(1 << (DOORBELL_TO_CARD_CLOSE_0 + port->node), in wanxl_close()
438 port->card->plx + PLX_DOORBELL_TO_CARD); in wanxl_close()
442 if (!get_status(port)->open) in wanxl_close()
446 if (get_status(port)->open) in wanxl_close()
452 desc_t *desc = &get_status(port)->tx_descs[i]; in wanxl_close() local
454 if (desc->stat != PACKET_EMPTY) { in wanxl_close()
455 desc->stat = PACKET_EMPTY; in wanxl_close()
456 dma_unmap_single(&port->card->pdev->dev, in wanxl_close()
457 desc->address, port->tx_skbs[i]->len, in wanxl_close()
459 dev_kfree_skb(port->tx_skbs[i]); in wanxl_close()
469 dev->stats.rx_over_errors = get_status(port)->rx_overruns; in wanxl_get_stats()
470 dev->stats.rx_frame_errors = get_status(port)->rx_frame_errors; in wanxl_get_stats()
471 dev->stats.rx_errors = dev->stats.rx_over_errors + in wanxl_get_stats()
472 dev->stats.rx_frame_errors; in wanxl_get_stats()
473 return &dev->stats; in wanxl_get_stats()
480 writel(cmd, card->plx + PLX_MAILBOX_1); in wanxl_puts_command()
482 if (readl(card->plx + PLX_MAILBOX_1) == 0) in wanxl_puts_command()
488 return -1; in wanxl_puts_command()
493 u32 old_value = readl(card->plx + PLX_CONTROL) & ~PLX_CTL_RESET; in wanxl_reset()
495 writel(0x80, card->plx + PLX_MAILBOX_0); in wanxl_reset()
496 writel(old_value | PLX_CTL_RESET, card->plx + PLX_CONTROL); in wanxl_reset()
497 readl(card->plx + PLX_CONTROL); /* wait for posted write */ in wanxl_reset()
499 writel(old_value, card->plx + PLX_CONTROL); in wanxl_reset()
500 readl(card->plx + PLX_CONTROL); /* wait for posted write */ in wanxl_reset()
508 for (i = 0; i < card->n_ports; i++) { in wanxl_pci_remove_one()
509 unregister_hdlc_device(card->ports[i].dev); in wanxl_pci_remove_one()
510 free_netdev(card->ports[i].dev); in wanxl_pci_remove_one()
514 if (card->irq) in wanxl_pci_remove_one()
515 free_irq(card->irq, card); in wanxl_pci_remove_one()
520 if (card->rx_skbs[i]) { in wanxl_pci_remove_one()
521 dma_unmap_single(&card->pdev->dev, in wanxl_pci_remove_one()
522 card->status->rx_descs[i].address, in wanxl_pci_remove_one()
524 dev_kfree_skb(card->rx_skbs[i]); in wanxl_pci_remove_one()
527 if (card->plx) in wanxl_pci_remove_one()
528 iounmap(card->plx); in wanxl_pci_remove_one()
530 if (card->status) in wanxl_pci_remove_one()
531 dma_free_coherent(&pdev->dev, sizeof(struct card_status), in wanxl_pci_remove_one()
532 card->status, card->status_address); in wanxl_pci_remove_one()
569 * but PLX9060 DMA does 32-bits for actual packet data transfers in wanxl_pci_init_one()
577 if (dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(28)) || in wanxl_pci_init_one()
578 dma_set_mask(&pdev->dev, DMA_BIT_MASK(28))) { in wanxl_pci_init_one()
581 return -EIO; in wanxl_pci_init_one()
590 switch (pdev->device) { in wanxl_pci_init_one()
605 return -ENOBUFS; in wanxl_pci_init_one()
609 card->pdev = pdev; in wanxl_pci_init_one()
611 card->status = dma_alloc_coherent(&pdev->dev, in wanxl_pci_init_one()
613 &card->status_address, GFP_KERNEL); in wanxl_pci_init_one()
614 if (!card->status) { in wanxl_pci_init_one()
616 return -ENOBUFS; in wanxl_pci_init_one()
622 (unsigned long long)card->status_address); in wanxl_pci_init_one()
627 * to indicate the card can do 32-bit DMA addressing in wanxl_pci_init_one()
629 if (dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)) || in wanxl_pci_init_one()
630 dma_set_mask(&pdev->dev, DMA_BIT_MASK(32))) { in wanxl_pci_init_one()
633 return -EIO; in wanxl_pci_init_one()
639 card->plx = ioremap(plx_phy, 0x70); in wanxl_pci_init_one()
640 if (!card->plx) { in wanxl_pci_init_one()
643 return -EFAULT; in wanxl_pci_init_one()
651 while ((stat = readl(card->plx + PLX_MAILBOX_0)) != 0) { in wanxl_pci_init_one()
656 return -ENODEV; in wanxl_pci_init_one()
660 case 0x00: /* hmm - PUTS completed with non-zero code? */ in wanxl_pci_init_one()
668 return -ENODEV; in wanxl_pci_init_one()
674 /* get on-board memory size (PUTS detects no more than 4 MB) */ in wanxl_pci_init_one()
675 ramsize = readl(card->plx + PLX_MAILBOX_2) & MBX2_MEMSZ_MASK; in wanxl_pci_init_one()
677 /* set up on-board RAM mapping */ in wanxl_pci_init_one()
683 pr_warn("%s: no enough on-board RAM (%u bytes detected, %u bytes required)\n", in wanxl_pci_init_one()
688 return -ENODEV; in wanxl_pci_init_one()
694 return -ENODEV; in wanxl_pci_init_one()
700 card->rx_skbs[i] = skb; in wanxl_pci_init_one()
702 card->status->rx_descs[i].address = in wanxl_pci_init_one()
703 dma_map_single(&card->pdev->dev, skb->data, in wanxl_pci_init_one()
711 return -EFAULT; in wanxl_pci_init_one()
718 writel(card->status_address + in wanxl_pci_init_one()
719 (void *)&card->status->port_status[i] - in wanxl_pci_init_one()
720 (void *)card->status, mem + PDM_OFFSET + 4 + i * 4); in wanxl_pci_init_one()
721 writel(card->status_address, mem + PDM_OFFSET + 20); in wanxl_pci_init_one()
725 writel(0, card->plx + PLX_MAILBOX_5); in wanxl_pci_init_one()
730 return -ENODEV; in wanxl_pci_init_one()
735 stat = readl(card->plx + PLX_MAILBOX_5); in wanxl_pci_init_one()
745 return -ENODEV; in wanxl_pci_init_one()
753 pci_name(pdev), plx_phy, ramsize / 1024, mem_phy, pdev->irq); in wanxl_pci_init_one()
756 if (request_irq(pdev->irq, wanxl_intr, IRQF_SHARED, "wanXL", card)) { in wanxl_pci_init_one()
758 pci_name(pdev), pdev->irq); in wanxl_pci_init_one()
760 return -EBUSY; in wanxl_pci_init_one()
762 card->irq = pdev->irq; in wanxl_pci_init_one()
766 struct port *port = &card->ports[i]; in wanxl_pci_init_one()
773 return -ENOMEM; in wanxl_pci_init_one()
776 port->dev = dev; in wanxl_pci_init_one()
778 spin_lock_init(&port->lock); in wanxl_pci_init_one()
779 dev->tx_queue_len = 50; in wanxl_pci_init_one()
780 dev->netdev_ops = &wanxl_ops; in wanxl_pci_init_one()
781 hdlc->attach = wanxl_attach; in wanxl_pci_init_one()
782 hdlc->xmit = wanxl_xmit; in wanxl_pci_init_one()
783 port->card = card; in wanxl_pci_init_one()
784 port->node = i; in wanxl_pci_init_one()
785 get_status(port)->clocking = CLOCK_EXT; in wanxl_pci_init_one()
791 return -ENOBUFS; in wanxl_pci_init_one()
793 card->n_ports++; in wanxl_pci_init_one()
799 i ? "," : "", i, card->ports[i].dev->name); in wanxl_pci_init_one()
803 wanxl_cable_intr(&card->ports[i]); /* get carrier status etc.*/ in wanxl_pci_init_one()