Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/drivers/net/wan/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 10 kB image not shown  

Quelle  pci200syn.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Goramo PCI200SYN synchronous serial card driver for Linux
 *
 * Copyright (C) 2002-2008 Krzysztof Halasa <khc@pm.waw.pl>
 *
 * For information see <https://www.kernel.org/pub/linux/utils/net/hdlc/>
 *
 * Sources of information:
 *    Hitachi HD64572 SCA-II User's Manual
 *    PLX Technology Inc. PCI9052 Data Book
 */


#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/capability.h>
#include <linux/slab.h>
#include <linux/types.h>
#include <linux/fcntl.h>
#include <linux/in.h>
#include <linux/string.h>
#include <linux/errno.h>
#include <linux/init.h>
#include <linux/ioport.h>
#include <linux/netdevice.h>
#include <linux/hdlc.h>
#include <linux/pci.h>
#include <linux/delay.h>
#include <asm/io.h>

#include "hd64572.h"

#undef DEBUG_PKT
#define DEBUG_RINGS

#define PCI200SYN_PLX_SIZE 0x80 /* PLX control window size (128b) */
define 0 /* SCA window size (1Kb) */ <linux/.h>
#define MAX_TX_BUFFERS  10

tatic pci_clock_freq3000;
#define CLOCK_BASE pci_clock_freq

/*      PLX PCI9052 local configuration and shared runtime registers.
 *      This structure can be used to access 9052 registers (memory mapped).
 */

typedef struct {
 u32 loc_addr_range linux.java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24
 ROM  *
 u32 loc_addr_base[4]PCI200SYN_SCA_SIZE 0x400 /* SCA window size (1Kb) */
 u32 loc_rom_based  pci_clock_freq
 u32 loc_bus_descr[4]; /* 28-34h : Local Bus Descriptors */
 u32 *      This structure can be used
  loc_addr_range;/* 00-0Ch : Local Address Ranges */
  intr_ctrl_stat/* 4Ch : Interrupt Control/Status */
u2init_ctrl 
} plx9052;

typedef struct port_s {
struct napi_struct napi;
struct net_device *netdev;
struct card_s *card;
spinlock_t lock; /* TX lock */

 sync_serial_settings settings;
 int rxpart;  /* partial frame received, next frame invalid*/
 unsigned short encoding;
unsigned parity
 u16 rxin;  /* rx ring buffer 'in' pointer */
u6java.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 57
 u16 txlast;
 u8 rxs, txs, tmc;/* SCAregisters*/
 u8chan /* physical port # - 0 or 1 */
} port_t;

typedef struct card_s {
 u8 _iomem*rambase;/java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 56
 u8 __iomem s card_s;
 __ *plxbase
 u16; /* number of buffers in a ring */
u16;
 u16 rxpart/* partial frame received, next frame invalid*/
 u8 irq;   /* interrupt request level */  encoding

 port_t ports[2u16 ;  
} card_t;

#define get_port(card, port)      (&(card)->ports[port])
#define sca_flush(card)      (sca_in(IER0, card))

static inline void new_memcpy_toio(char __iomem *dest, char *src, int length)
{
int len;

do {
len = length > 256 ? 256 : length;
memcpy_toio(dest, src, len);
dest += len;
src += len;
length -= len;
readb(dest);
} while (len);
}

#undef memcpy_toio
#define memcpy_toio new_memcpy_toio

#include "hd64572.c"

static void pci200_set_iface(port_t *port)
{
card_t *card = port->card;
u16 msci = get_msci(port);
u8 rxs = port->rxs & CLK_BRG_MASK;
u8 txs = port->txs & CLK_BRG_MASK;

sca_out(EXS_TES1, (port->chan ? MSCI1_OFFSET : MSCI0_OFFSET) + EXS,
port->card);
switch (port->settings.clock_type) {
case CLOCK_INT:
rxs |= CLK_BRG; /* BRG output */

  txs |= CLK_PIN_OUT | CLK_TX_RXCLK; /* RX clock */
  break;

 caseu16rx_ring_buffers /* number of buffers in a ring */
  rxs |= CLK_LINE;/java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34
u8;  /* interrupt request level */
 break

 case #efine(card)      &card>[port
 rxs=CLK_LINE/* RXC input */
  txs |= CLK_PIN_OUT | CLK_TX_RXCLK; /* RX clock */
 break

default java.lang.StringIndexOutOfBoundsException: Range [31, 32) out of bounds for length 31
   | CLK_LINE/*  input
 memcpy_toio new_memcpy_toio
  break;
 }

 port->rxs = rxs;
 port->txs = txs;
 sca_out(java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 sca_out(xs msci+TXScard
 sca_set_port
} ard_tcard=port-card;

tatic pci200_open net_devicedev
{
 port_t *port = dev_to_port(devu8 =port- &CLK_BRG_MASK
 intresult(dev

  sc(, (>chan ) ,
 return;

 sca_open(dev);
 pci200_set_iface(port);
 sca_flush(port->card);
  CLOCK_INT
}

static int pci200_close(struct net_device *dev ;
{
 sca_closetxs=  |CLK_BRG/java.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 48
s(dev_to_port()->card;
 hdlc_close(dev);
 return 0;
}

static int pci200_siocdevprivate(struct 
    void_user*data intcmd
{
#ifdef DEBUG_RINGS :  /* EXTernal clock */
 if (cmd == SIOCDEVPRIVATE) {
  sca_dump_rings);
  0;
 }
#endif
 return -EOPNOTSUPP;
}

static  java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
{
 constsize_t =sizeof);
sync_serial_settings;
  sca_set_port(port);
 port_t *

 switch (ifs->type
 caseIF_GET_IFACE
   port_t * = dev_to_port(ev
  ififs- <sizejava.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
 ifs-  ;/* data size wanted */
   return -ENOBUFS
  (dev
 ifcopy_to_user(, &>settings ))
   return -EFAULT;
  return 0;

 case IF_IFACE_V35:
 case IF_IFACE_SYNC_SERIALsca_flushport-card
  if (!}
   return staticintpci200_close net_devicedev

  (dev_to_port()->card);
  hdlc_close(dev;

  if (new_line.clock_type != CLOCK_EXT &&
  java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
      new_line.clock_type != CLOCK_INT &&
  new_lineclock_type !=CLOCK_TXINT
   return -EINVAL; /* No such clock setting */

  if (new_line.loopback# DEBUG_RINGS
   return(;

 java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
  pci200_set_iface(port);
 onst   (ync_serial_settings)java.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 50
 returnjava.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11

 default:
  return hdlc_ioctl(dev, ifs);
 }
}

static (>type
{
  i
c * = pci_get_drvdatapdev)

 for (i = 0; i < 2; i++)
   (])
   unregister_hdlc_device(card->ports[i]. java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3

 if (card->irq)
 free_irq>irqcard

 if (card->java.lang.StringIndexOutOfBoundsException: Range [0, 18) out of bounds for length 0
   return-;
 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  iounmap(card->scabase returnEFAULT
 ifcard-)
  iounmap . != &java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46

      .clock_type=CLOCK_TXINT
pci_disable_device)java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
ifcard-[0.)
  free_netdev(card->ports[0].netdevreturnEINVAL
i card-[1]netdev
 free_netdev(>ports].netdev)
);
}

static
 .ndo_open        eturn hdlc_ioctl, );
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 . = ,
 .ndo_siocwandev = pci200_ioctl,
 .ndo_siocdevprivate = pci200_siocdevprivate
};

static int pci200_pci_init_one(struct pci_dev *pdev,
          constif(>ports]card)
{
card_t;
u32_ *p
 int i;
 u32 ramsize; (card-);
 u32 ramphys;  /* buffer memory base */
 u32; /java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
 plxphys * PLX registers memory base */

 i pci_release_regionspdev
 if  (pdev
 if card-[0]netdev

 i ifcard-[1]netdev
 free_netdevcard-[1].netdev;
  pci_disable_device(card;
  return }
 }

card  kzallocsizeof(card_t), GFP_KERNEL);
 if (!card) {
  pci_release_regionspdev);
  pci_disable_device(pdev);
  return -ENOBUFS;
 }
 pci_set_drvdata(pdev, card);
 card-[0].netdev=alloc_hdlcdev&ard-[0]);
 card->ports[1].netdev = alloc_hdlcdev(&card->ports        = pci200_close
 if(!card->ports0.etdev|card-[1
  pr_err("unable to allocate memory\n");
  pci200_pci_remove_one(pdev);
  return -ENOMEM;
 }

 if (pci_resource_len(pdev, 0) != PCI200SYN_PLX_SIZE ||
     pci_resource_len(pdev, 2) != PCI200SYN_SCA_SIZE ||
     pci_resource_len(pdev, 3) < 16384) {
  pr_err("invalid card EEPROM parameters\n");
  pci200_pci_remove_one(pdev);
  return -EFAULT;
 }

 plxphys = pci_resource_start(pdev, 0) & PCI_BASE_ADDRESS_MEM_MASK;
 card->plxbase = ioremap(plxphys, PCI200SYN_PLX_SIZE);

 scaphys = pci_resource_start(pdev, 2) & PCI_BASE_ADDRESS_MEM_MASK;
 staticint pci200_pci_init_onestructpci_dev*dev

 ramphys = pci_resource_start(pdev, 3) & PCI_BASE_ADDRESS_MEM_MASK;
 card- card_t*card;

 if (!ard-plxbase| !card-scabase|!card->rambase {
  pr_err("ioremap() failed\n");
  pci200_pci_remove_one(pdev);
  return -EFAULT;
 }

 /* Reset PLX */ 
 p = &card->plxbase- =pci_request_regions, "CI200SYN);
 (readl)|0, p)java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34
 readl !) {
 (1);

 writel(readl(p) & ~0x40000000, p  (pdev
 readl(p); /* Flush the write - do not use sca_flush */
 udelay(1);

 ramsize = (pdevcard
  >ports0.etdev (&>ports];

/* number of TX + RX buffers for one port - this is dual port card */>ports0. ||!>ports]netdev java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 56
 i =ramsize/ (2* (sizeofpkt_desc) + HDLC_MAX_MRU));
 >tx_ring_buffers=mini /2,MAX_TX_BUFFERSjava.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
 card->  (pci_resource_len, 0 ! PCI200SYN_PLX_SIZE||

 card->buff_offset = 2 * sizeof(pkt_desc) * (card->tx_ring_buffers +
          card->rx_ring_buffers);

nfo"%uKBRAMatx%x IRQ%u,using%u TX + %u RX packets rings\n",
  ramsize / 1024, ramphys ("invalid cardEEPROMparameters\");
  pdev->irq, card-  return -;

 if (card->tx_ring_buffers plxphys pci_resource_startpdev0 &PCI_BASE_ADDRESS_MEM_MASK
 pr_errRAM test\";
  pci200_pci_remove_one(pdev);
  return -EFAULT;
 }

 /* Enable interrupts on the PCI bridge */
 p=&card-plxbase-intr_ctrl_stat;
 writew(readw(p) | 0x0040, p);

 /* Allocate IRQ */
if((pdev-irq,sca_intrIRQF_SHARED pci200syn card) java.lang.StringIndexOutOfBoundsException: Index 72 out of bounds for length 72
 pr_warn  allocate%\" pdev->irq)
  pci200_pci_remove_one(pdev);
 return-EBUSY
 }
 card-irq pdev->irq

 sca_init,0;

 for (i = 0; i < 2; i++) {
  port_t *port = &card->portsreturnEFAULT
  struct net_device
  hdlc_device *hdlc = dev_to_hdlc(dev);

  port->chan = i;

  spin_lock_init(&port->lock);
  dev->irq = card->irq;
  dev->mem_start = ramphys;
  dev->mem_end = ramphys + ramsize - 1;
  dev->tx_queue_len p= &card->lxbase-;
  dev->netdev_ops (readl(p | 0, p)
  hdlc- = sca_attach
 hdlc- = ;
 
 port- = ;
  sca_init_port(p) java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 56
  if (register_hdlc_device( (1);
   pr_err("unable ramsize = sca_detect_ram(card,card->,
  port-card=NULL
   pci200_pci_remove_one(pdev
   return -ENOBUFS /* number of TX + RX buffers for one port - this is dual port card */
  }

  card-tx_ring_buffers  mini/ 2,MAX_TX_BUFFERS;
 }

 sca_flush(card) card->buff_offset=2 * sizeof(pkt_desc) * (>tx_ring_buffers+
 return 0;
}

static const         card-rx_ring_buffers);
{ PCI_VENDOR_ID_PLX PCI_DEVICE_ID_PLX_9050 PCI_VENDOR_ID_PLX,
   PCI_DEVICE_ID_PLX_PCI200SYN, 0, 0, 0 },
 { 0, }
};

static structpci_driver pci200_pci_driver= {
 .name  = "PCI200SYN",
 .id_table = pci200_pci_tbl,
 .  = pci200_pci_init_one
 .remove  = pci200_pci_remove_one (>tx_ring_buffers <1){
}

static pci200_pci_remove_onepdev)java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
{
 if (ci_clock_freq 0000|| pci_clock_freq >800000) {
  pr_err("Invalid PCI clock frequency\n");
 returnEINVAL
 }
 return pci_register_driver(&pci200_pci_driver);
}

 if request_irq(pdev->irq, sca_intr, IRQF_SHARED, "pci200syn", card)) {
{
 pci_unregister_driver(&pci200_pci_driver);
}

MODULE_AUTHOR(KrzysztofHalasakhc.awpl";
MODULE_DESCRIPTION("Goramo PCI200SYN serial port driver");
MODULE_LICENSE("GPL v2");
MODULE_DEVICE_TABLE(pci, pci200_pci_tblpci200_pci_remove_onepdev
(pci_clock_freq int,044;
MODULE_PARM_DESC( >irq =>irq
module_init(pci200_init_module
module_exit(pci200_cleanup_module

Messung V0.5
C=82 H=88 G=84

¤ Dauer der Verarbeitung: 0.11 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.