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 */
58 int node; /* physical port #0 - 3 */
81 struct port ports[]; /* 1 - 4 port structures follow */
88 return (struct port *)dev_to_hdlc(dev)->priv; in dev_to_port()
94 return &port->card->status->port_status[port->node]; in get_status()
102 dma_addr_t addr = dma_map_single(&pdev->dev, ptr, size, direction); in pci_map_single_debug()
117 u32 value = get_status(port)->cable; in wanxl_cable_intr()
148 netdev_info(port->dev, "%s%s module, %s cable%s%s\n", in wanxl_cable_intr()
152 netif_carrier_on(port->dev); in wanxl_cable_intr()
154 netif_carrier_off(port->dev); in wanxl_cable_intr()
162 struct net_device *dev = port->dev; in wanxl_tx_intr()
164 desc_t *desc = &get_status(port)->tx_descs[port->tx_in]; in wanxl_tx_intr() local
165 struct sk_buff *skb = port->tx_skbs[port->tx_in]; in wanxl_tx_intr()
167 switch (desc->stat) { in wanxl_tx_intr()
174 dev->stats.tx_errors++; in wanxl_tx_intr()
175 dev->stats.tx_fifo_errors++; in wanxl_tx_intr()
179 dev->stats.tx_packets++; in wanxl_tx_intr()
180 dev->stats.tx_bytes += skb->len; in wanxl_tx_intr()
182 desc->stat = PACKET_EMPTY; /* Free descriptor */ in wanxl_tx_intr()
183 dma_unmap_single(&port->card->pdev->dev, desc->address, in wanxl_tx_intr()
184 skb->len, DMA_TO_DEVICE); in wanxl_tx_intr()
186 port->tx_in = (port->tx_in + 1) % TX_BUFFERS; in wanxl_tx_intr()
195 desc_t *desc; in wanxl_rx_intr() local
196 while (desc = &card->status->rx_descs[card->rx_in], in wanxl_rx_intr()
197 desc->stat != PACKET_EMPTY) { in wanxl_rx_intr()
198 if ((desc->stat & PACKET_PORT_MASK) > card->n_ports) in wanxl_rx_intr()
200 pci_name(card->pdev)); in wanxl_rx_intr()
202 struct sk_buff *skb = card->rx_skbs[card->rx_in]; in wanxl_rx_intr()
203 struct port *port = &card->ports[desc->stat & in wanxl_rx_intr()
205 struct net_device *dev = port->dev; in wanxl_rx_intr()
208 dev->stats.rx_dropped++; in wanxl_rx_intr()
210 dma_unmap_single(&card->pdev->dev, in wanxl_rx_intr()
211 desc->address, BUFFER_LENGTH, in wanxl_rx_intr()
213 skb_put(skb, desc->length); in wanxl_rx_intr()
216 printk(KERN_DEBUG "%s RX(%i):", dev->name, in wanxl_rx_intr()
217 skb->len); in wanxl_rx_intr()
220 dev->stats.rx_packets++; in wanxl_rx_intr()
221 dev->stats.rx_bytes += skb->len; in wanxl_rx_intr()
222 skb->protocol = hdlc_type_trans(skb, dev); in wanxl_rx_intr()
229 desc->address = skb ? in wanxl_rx_intr()
230 dma_map_single(&card->pdev->dev, in wanxl_rx_intr()
231 skb->data, in wanxl_rx_intr()
234 card->rx_skbs[card->rx_in] = skb; in wanxl_rx_intr()
237 desc->stat = PACKET_EMPTY; /* Free descriptor */ in wanxl_rx_intr()
238 card->rx_in = (card->rx_in + 1) % RX_QUEUE_LENGTH; in wanxl_rx_intr()
252 while((stat = readl(card->plx + PLX_DOORBELL_FROM_CARD)) != 0) { in wanxl_intr()
254 writel(stat, card->plx + PLX_DOORBELL_FROM_CARD); in wanxl_intr()
256 for (i = 0; i < card->n_ports; i++) { in wanxl_intr()
258 wanxl_tx_intr(&card->ports[i]); in wanxl_intr()
260 wanxl_cable_intr(&card->ports[i]); in wanxl_intr()
274 desc_t *desc; in wanxl_xmit() local
276 spin_lock(&port->lock); in wanxl_xmit()
278 desc = &get_status(port)->tx_descs[port->tx_out]; in wanxl_xmit()
279 if (desc->stat != PACKET_EMPTY) { in wanxl_xmit()
280 /* should never happen - previous xmit should stop queue */ in wanxl_xmit()
282 printk(KERN_DEBUG "%s: transmitter buffer full\n", dev->name); in wanxl_xmit()
285 spin_unlock(&port->lock); in wanxl_xmit()
290 printk(KERN_DEBUG "%s TX(%i):", dev->name, skb->len); in wanxl_xmit()
294 port->tx_skbs[port->tx_out] = skb; in wanxl_xmit()
295 desc->address = dma_map_single(&port->card->pdev->dev, skb->data, in wanxl_xmit()
296 skb->len, DMA_TO_DEVICE); in wanxl_xmit()
297 desc->length = skb->len; in wanxl_xmit()
298 desc->stat = PACKET_FULL; in wanxl_xmit()
299 writel(1 << (DOORBELL_TO_CARD_TX_0 + port->node), in wanxl_xmit()
300 port->card->plx + PLX_DOORBELL_TO_CARD); in wanxl_xmit()
302 port->tx_out = (port->tx_out + 1) % TX_BUFFERS; in wanxl_xmit()
304 if (get_status(port)->tx_descs[port->tx_out].stat != PACKET_EMPTY) { in wanxl_xmit()
307 printk(KERN_DEBUG "%s: transmitter buffer full\n", dev->name); in wanxl_xmit()
311 spin_unlock(&port->lock); in wanxl_xmit()
324 return -EINVAL; in wanxl_attach()
331 return -EINVAL; in wanxl_attach()
333 get_status(port)->encoding = encoding; in wanxl_attach()
334 get_status(port)->parity = parity; in wanxl_attach()
349 switch (ifr->ifr_settings.type) { in wanxl_ioctl()
351 ifr->ifr_settings.type = IF_IFACE_SYNC_SERIAL; in wanxl_ioctl()
352 if (ifr->ifr_settings.size < size) { in wanxl_ioctl()
353 ifr->ifr_settings.size = size; /* data size wanted */ in wanxl_ioctl()
354 return -ENOBUFS; in wanxl_ioctl()
357 line.clock_type = get_status(port)->clocking; in wanxl_ioctl()
361 if (copy_to_user(ifr->ifr_settings.ifs_ifsu.sync, &line, size)) in wanxl_ioctl()
362 return -EFAULT; in wanxl_ioctl()
367 return -EPERM; in wanxl_ioctl()
368 if (dev->flags & IFF_UP) in wanxl_ioctl()
369 return -EBUSY; in wanxl_ioctl()
371 if (copy_from_user(&line, ifr->ifr_settings.ifs_ifsu.sync, in wanxl_ioctl()
373 return -EFAULT; in wanxl_ioctl()
377 return -EINVAL; /* No such clock setting */ in wanxl_ioctl()
380 return -EINVAL; in wanxl_ioctl()
382 get_status(port)->clocking = line.clock_type; in wanxl_ioctl()
395 u8 __iomem *dbr = port->card->plx + PLX_DOORBELL_TO_CARD; in wanxl_open()
399 if (get_status(port)->open) { in wanxl_open()
401 return -EIO; in wanxl_open()
406 port->tx_in = port->tx_out = 0; in wanxl_open()
408 get_status(port)->tx_descs[i].stat = PACKET_EMPTY; in wanxl_open()
410 writel(1 << (DOORBELL_TO_CARD_OPEN_0 + port->node), dbr); in wanxl_open()
414 if (get_status(port)->open) { in wanxl_open()
422 writel(1 << (DOORBELL_TO_CARD_CLOSE_0 + port->node), dbr); in wanxl_open()
423 return -EFAULT; in wanxl_open()
436 writel(1 << (DOORBELL_TO_CARD_CLOSE_0 + port->node), in wanxl_close()
437 port->card->plx + PLX_DOORBELL_TO_CARD); in wanxl_close()
441 if (!get_status(port)->open) in wanxl_close()
445 if (get_status(port)->open) in wanxl_close()
451 desc_t *desc = &get_status(port)->tx_descs[i]; in wanxl_close() local
453 if (desc->stat != PACKET_EMPTY) { in wanxl_close()
454 desc->stat = PACKET_EMPTY; in wanxl_close()
455 dma_unmap_single(&port->card->pdev->dev, in wanxl_close()
456 desc->address, port->tx_skbs[i]->len, in wanxl_close()
458 dev_kfree_skb(port->tx_skbs[i]); in wanxl_close()
470 dev->stats.rx_over_errors = get_status(port)->rx_overruns; in wanxl_get_stats()
471 dev->stats.rx_frame_errors = get_status(port)->rx_frame_errors; in wanxl_get_stats()
472 dev->stats.rx_errors = dev->stats.rx_over_errors + in wanxl_get_stats()
473 dev->stats.rx_frame_errors; in wanxl_get_stats()
474 return &dev->stats; in wanxl_get_stats()
483 writel(cmd, card->plx + PLX_MAILBOX_1); in wanxl_puts_command()
485 if (readl(card->plx + PLX_MAILBOX_1) == 0) in wanxl_puts_command()
491 return -1; in wanxl_puts_command()
498 u32 old_value = readl(card->plx + PLX_CONTROL) & ~PLX_CTL_RESET; in wanxl_reset()
500 writel(0x80, card->plx + PLX_MAILBOX_0); in wanxl_reset()
501 writel(old_value | PLX_CTL_RESET, card->plx + PLX_CONTROL); in wanxl_reset()
502 readl(card->plx + PLX_CONTROL); /* wait for posted write */ in wanxl_reset()
504 writel(old_value, card->plx + PLX_CONTROL); in wanxl_reset()
505 readl(card->plx + PLX_CONTROL); /* wait for posted write */ in wanxl_reset()
515 for (i = 0; i < card->n_ports; i++) { in wanxl_pci_remove_one()
516 unregister_hdlc_device(card->ports[i].dev); in wanxl_pci_remove_one()
517 free_netdev(card->ports[i].dev); in wanxl_pci_remove_one()
521 if (card->irq) in wanxl_pci_remove_one()
522 free_irq(card->irq, card); in wanxl_pci_remove_one()
527 if (card->rx_skbs[i]) { in wanxl_pci_remove_one()
528 dma_unmap_single(&card->pdev->dev, in wanxl_pci_remove_one()
529 card->status->rx_descs[i].address, in wanxl_pci_remove_one()
531 dev_kfree_skb(card->rx_skbs[i]); in wanxl_pci_remove_one()
534 if (card->plx) in wanxl_pci_remove_one()
535 iounmap(card->plx); in wanxl_pci_remove_one()
537 if (card->status) in wanxl_pci_remove_one()
538 dma_free_coherent(&pdev->dev, sizeof(struct card_status), in wanxl_pci_remove_one()
539 card->status, card->status_address); in wanxl_pci_remove_one()
577 but PLX9060 DMA does 32-bits for actual packet data transfers */ in wanxl_pci_init_one()
583 if (dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(28)) || in wanxl_pci_init_one()
584 dma_set_mask(&pdev->dev, DMA_BIT_MASK(28))) { in wanxl_pci_init_one()
587 return -EIO; in wanxl_pci_init_one()
596 switch (pdev->device) { in wanxl_pci_init_one()
606 return -ENOBUFS; in wanxl_pci_init_one()
610 card->pdev = pdev; in wanxl_pci_init_one()
612 card->status = dma_alloc_coherent(&pdev->dev, in wanxl_pci_init_one()
614 &card->status_address, GFP_KERNEL); in wanxl_pci_init_one()
615 if (card->status == NULL) { in wanxl_pci_init_one()
617 return -ENOBUFS; in wanxl_pci_init_one()
623 (unsigned long long)card->status_address); in wanxl_pci_init_one()
628 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()
684 pr_warn("%s: no enough on-board RAM (%u bytes detected, %u bytes required)\n", in wanxl_pci_init_one()
689 return -ENODEV; in wanxl_pci_init_one()
695 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 if ((stat = readl(card->plx + PLX_MAILBOX_5)) != 0) in wanxl_pci_init_one()
744 return -ENODEV; in wanxl_pci_init_one()
752 pci_name(pdev), plx_phy, ramsize / 1024, mem_phy, pdev->irq); in wanxl_pci_init_one()
755 if (request_irq(pdev->irq, wanxl_intr, IRQF_SHARED, "wanXL", card)) { in wanxl_pci_init_one()
757 pci_name(pdev), pdev->irq); in wanxl_pci_init_one()
759 return -EBUSY; in wanxl_pci_init_one()
761 card->irq = pdev->irq; in wanxl_pci_init_one()
765 struct port *port = &card->ports[i]; in wanxl_pci_init_one()
771 return -ENOMEM; in wanxl_pci_init_one()
774 port->dev = dev; in wanxl_pci_init_one()
776 spin_lock_init(&port->lock); in wanxl_pci_init_one()
777 dev->tx_queue_len = 50; in wanxl_pci_init_one()
778 dev->netdev_ops = &wanxl_ops; in wanxl_pci_init_one()
779 hdlc->attach = wanxl_attach; in wanxl_pci_init_one()
780 hdlc->xmit = wanxl_xmit; in wanxl_pci_init_one()
781 port->card = card; in wanxl_pci_init_one()
782 port->node = i; in wanxl_pci_init_one()
783 get_status(port)->clocking = CLOCK_EXT; in wanxl_pci_init_one()
789 return -ENOBUFS; in wanxl_pci_init_one()
791 card->n_ports++; in wanxl_pci_init_one()
797 i ? "," : "", i, card->ports[i].dev->name); in wanxl_pci_init_one()
801 wanxl_cable_intr(&card->ports[i]); /* get carrier status etc.*/ in wanxl_pci_init_one()