--- linux-2.4-ac.orig/include/linux/if.h 2003-03-30 23:38:21.000000000 +0200 +++ linux-2.4/include/linux/if.h 2003-04-07 00:27:45.000000000 +0200 @@ -61,7 +61,7 @@ #define IF_IFACE_X21 0x1002 /* X.21 serial interface */ #define IF_IFACE_T1 0x1003 /* T1 telco serial interface */ #define IF_IFACE_E1 0x1004 /* E1 telco serial interface */ -#define IF_IFACE_SYNC_SERIAL 0x1005 /* cant'b be set by software */ +#define IF_IFACE_SYNC_SERIAL 0x1005 /* can't be set by software */ /* For definitions see hdlc.h */ #define IF_PROTO_HDLC 0x2000 /* raw HDLC protocol */ --- linux-2.4-ac.orig/drivers/net/wan/hdlc_cisco.c 2003-03-30 23:38:20.000000000 +0200 +++ linux-2.4/drivers/net/wan/hdlc_cisco.c 2003-04-07 00:25:09.000000000 +0200 @@ -79,7 +79,8 @@ data->par1 = htonl(par1); data->par2 = htonl(par2); data->rel = 0xFFFF; - data->time = htonl(jiffies * 1000 / HZ); + /* we will need do_div here if 1000 % HZ != 0 */ + data->time = htonl(jiffies * (1000 / HZ)); skb_put(skb, sizeof(cisco_packet)); skb->priority = TC_PRIO_CONTROL; --- linux-2.4-ac.orig/drivers/net/wan/hdlc_fr.c 2003-03-30 23:38:20.000000000 +0200 +++ linux-2.4/drivers/net/wan/hdlc_fr.c 2003-04-07 00:25:09.000000000 +0200 @@ -65,7 +65,7 @@ pvc_p = &(*pvc_p)->next; } - pvc = kmalloc(sizeof(pvc_device), GFP_KERNEL); + pvc = kmalloc(sizeof(pvc_device), GFP_ATOMIC); if (!pvc) return NULL; --- linux-2.4-ac.orig/drivers/net/wan/hdlc_generic.c 2003-03-30 23:38:20.000000000 +0200 +++ linux-2.4/drivers/net/wan/hdlc_generic.c 2003-04-07 15:06:13.000000000 +0200 @@ -33,7 +33,7 @@ #include -static const char* version = "HDLC support module revision 1.12"; +static const char* version = "HDLC support module revision 1.14"; static int hdlc_change_mtu(struct net_device *dev, int new_mtu) @@ -160,9 +160,10 @@ void unregister_hdlc_device(hdlc_device *hdlc) { + rtnl_lock(); hdlc_proto_detach(hdlc); - - unregister_netdev(hdlc_to_dev(hdlc)); + unregister_netdevice(hdlc_to_dev(hdlc)); + rtnl_unlock(); MOD_DEC_USE_COUNT; } @@ -170,7 +171,7 @@ MODULE_AUTHOR("Krzysztof Halasa "); MODULE_DESCRIPTION("HDLC support module"); -MODULE_LICENSE("GPL"); +MODULE_LICENSE("GPL v2"); EXPORT_SYMBOL(hdlc_ioctl); EXPORT_SYMBOL(register_hdlc_device); --- linux-2.4-ac.orig/drivers/net/wan/hd6457x.c 2003-03-30 23:38:20.000000000 +0200 +++ linux-2.4/drivers/net/wan/hd6457x.c 2003-04-07 00:25:13.000000000 +0200 @@ -10,6 +10,20 @@ * Sources of information: * Hitachi HD64570 SCA User's Manual * Hitachi HD64572 SCA-II User's Manual + * + * We use the following SCA memory map: + * + * Packet buffer descriptor rings - starting from winbase or win0base: + * rx_ring_buffers * sizeof(pkt_desc) = logical channel #0 RX ring + * tx_ring_buffers * sizeof(pkt_desc) = logical channel #0 TX ring + * rx_ring_buffers * sizeof(pkt_desc) = logical channel #1 RX ring (if used) + * tx_ring_buffers * sizeof(pkt_desc) = logical channel #1 TX ring (if used) + * + * Packet data buffers - starting from winbase + buff_offset: + * rx_ring_buffers * HDLC_MAX_MRU = logical channel #0 RX buffers + * tx_ring_buffers * HDLC_MAX_MRU = logical channel #0 TX buffers + * rx_ring_buffers * HDLC_MAX_MRU = logical channel #0 RX buffers (if used) + * tx_ring_buffers * HDLC_MAX_MRU = logical channel #0 TX buffers (if used) */ #include @@ -41,8 +55,6 @@ #error Either hd64570.h or hd64572.h must be included #endif -static char sca_version[]="1.12"; - #define get_msci(port) (phy_node(port) ? MSCI1_OFFSET : MSCI0_OFFSET) #define get_dmac_rx(port) (phy_node(port) ? DMAC1RX_OFFSET : DMAC0RX_OFFSET) #define get_dmac_tx(port) (phy_node(port) ? DMAC1TX_OFFSET : DMAC0TX_OFFSET) @@ -115,24 +127,35 @@ -static inline u8 next_desc(port_t *port, u8 desc) +static inline u16 next_desc(port_t *port, u16 desc, int transmit) { - return (desc + 1) % port_to_card(port)->ring_buffers; + return (desc + 1) % (transmit ? port_to_card(port)->tx_ring_buffers + : port_to_card(port)->rx_ring_buffers); } -static inline u16 desc_offset(port_t *port, u8 desc, u8 transmit) +static inline u16 desc_abs_number(port_t *port, u16 desc, int transmit) +{ + u16 rx_buffs = port_to_card(port)->rx_ring_buffers; + u16 tx_buffs = port_to_card(port)->tx_ring_buffers; + + desc %= (transmit ? tx_buffs : rx_buffs); // called with "X + 1" etc. + return log_node(port) * (rx_buffs + tx_buffs) + + transmit * rx_buffs + desc; +} + + + +static inline u16 desc_offset(port_t *port, u16 desc, int transmit) { /* Descriptor offset always fits in 16 bytes */ - u8 buffs = port_to_card(port)->ring_buffers; - return ((log_node(port) * 2 + transmit) * buffs + (desc % buffs)) * - sizeof(pkt_desc); + return desc_abs_number(port, desc, transmit) * sizeof(pkt_desc); } -static inline pkt_desc* desc_address(port_t *port, u8 desc, u8 transmit) +static inline pkt_desc* desc_address(port_t *port, u16 desc, int transmit) { #ifdef PAGE0_ALWAYS_MAPPED return (pkt_desc*)(win0base(port_to_card(port)) @@ -145,12 +168,10 @@ -static inline u32 buffer_offset(port_t *port, u8 desc, u8 transmit) +static inline u32 buffer_offset(port_t *port, u16 desc, int transmit) { - u8 buffs = port_to_card(port)->ring_buffers; return port_to_card(port)->buff_offset + - ((log_node(port) * 2 + transmit) * buffs + (desc % buffs)) * - (u32)HDLC_MAX_MRU; + desc_abs_number(port, desc, transmit) * (u32)HDLC_MAX_MRU; } @@ -158,8 +179,7 @@ static void sca_init_sync_port(port_t *port) { card_t *card = port_to_card(port); - u8 transmit, i; - u16 dmac, buffs = card->ring_buffers; + int transmit, i; port->rxin = 0; port->txin = 0; @@ -170,6 +190,10 @@ #endif for (transmit = 0; transmit < 2; transmit++) { + u16 dmac = transmit ? get_dmac_tx(port) : get_dmac_rx(port); + u16 buffs = transmit ? card->tx_ring_buffers + : card->rx_ring_buffers; + for (i = 0; i < buffs; i++) { pkt_desc* desc = desc_address(port, i, transmit); u16 chain_off = desc_offset(port, i + 1, transmit); @@ -181,7 +205,6 @@ writeb(0, &desc->stat); } - dmac = transmit ? get_dmac_tx(port) : get_dmac_rx(port); /* DMA disable - to halt state */ sca_out(0, transmit ? DSR_TX(phy_node(port)) : DSR_RX(phy_node(port)), card); @@ -246,7 +269,7 @@ -static inline void sca_rx(card_t *card, port_t *port, pkt_desc *desc, u8 rxin) +static inline void sca_rx(card_t *card, port_t *port, pkt_desc *desc, u16 rxin) { struct sk_buff *skb; u16 len; @@ -340,7 +363,7 @@ /* Set new error descriptor address */ sca_outa(desc_off, dmac + EDAL, card); - port->rxin = next_desc(port, port->rxin); + port->rxin = next_desc(port, port->rxin, 0); } /* make sure RX DMA is enabled */ @@ -376,8 +399,7 @@ port->hdlc.stats.tx_packets++; port->hdlc.stats.tx_bytes += readw(&desc->len); writeb(0, &desc->stat); /* Free descriptor */ - port->txlast = (port->txlast + 1) % - port_to_card(port)->ring_buffers; + port->txlast = next_desc(port, port->txlast, 1); } netif_wake_queue(hdlc_to_dev(&port->hdlc)); @@ -389,8 +411,6 @@ static void sca_intr(int irq, void* dev_id, struct pt_regs *regs) { card_t *card = dev_id; -/* Maximum events to handle at each interrupt - should I increase it? */ - int boguscnt = 4; int i; u8 stat; @@ -411,23 +431,12 @@ if (stat & SCA_INTR_DMAC_TX(i)) sca_tx_intr(port); } - - if (--boguscnt < 0) { -#if 0 - printk(KERN_ERR "%s: too much work at " - "interrupt\n", - hdlc_to_name(&port->hdlc)); -#endif - goto exit; - } } } - exit: #ifndef ALL_PAGES_ALWAYS_MAPPED openwin(card, page); /* Restore original page */ #endif - return; } @@ -435,7 +444,7 @@ static void sca_set_port(port_t *port) { card_t* card = port_to_card(port); - u8 msci = get_msci(port); + u16 msci = get_msci(port); u8 md2 = sca_in(msci + MD2, card); unsigned int tmc, br = 10, brv = 1024; @@ -495,7 +504,7 @@ { port_t *port = hdlc_to_port(hdlc); card_t* card = port_to_card(port); - u8 msci = get_msci(port); + u16 msci = get_msci(port); u8 md0, md2; switch(port->encoding) { @@ -516,7 +525,7 @@ case PARITY_CRC16_PR0_CCITT: md0 = MD0_HDLC | MD0_CRC_ITU_0; break; #else case PARITY_CRC32_PR1_CCITT: md0 = MD0_HDLC | MD0_CRC_ITU32; break; -#endif +#endif case PARITY_CRC16_PR1_CCITT: md0 = MD0_HDLC | MD0_CRC_ITU; break; default: md0 = MD0_HDLC | MD0_CRC_NONE; } @@ -613,7 +622,7 @@ parity != PARITY_CRC16_PR0_CCITT && #else parity != PARITY_CRC32_PR1_CCITT && -#endif +#endif parity != PARITY_CRC16_PR1_CCITT) return -EINVAL; @@ -639,14 +648,13 @@ openwin(card, 0); #endif - printk(KERN_ERR "RX ring: CDA=%u EDA=%u DSR=%02X in=%u " - "%sactive", + printk(KERN_ERR "RX ring: CDA=%u EDA=%u DSR=%02X in=%u %sactive", sca_ina(get_dmac_rx(port) + CDAL, card), sca_ina(get_dmac_rx(port) + EDAL, card), sca_in(DSR_RX(phy_node(port)), card), port->rxin, sca_in(DSR_RX(phy_node(port)), card) & DSR_DE?"":"in"); - for (cnt = 0; cntring_buffers; cnt++) + for (cnt = 0; cnt < port_to_card(port)->rx_ring_buffers; cnt++) printk(" %02X", readb(&(desc_address(port, cnt, 0)->stat))); @@ -658,7 +666,7 @@ port->txlast, sca_in(DSR_TX(phy_node(port)), card) & DSR_DE ? "" : "in"); - for (cnt = 0; cntring_buffers; cnt++) + for (cnt = 0; cnt < port_to_card(port)->tx_ring_buffers; cnt++) printk(" %02X", readb(&(desc_address(port, cnt, 1)->stat))); printk("\n"); @@ -750,7 +758,7 @@ writeb(ST_TX_EOM, &desc->stat); dev->trans_start = jiffies; - port->txin = next_desc(port, port->txin); + port->txin = next_desc(port, port->txin, 1); sca_outa(desc_offset(port, port->txin, 1), get_dmac_tx(port) + EDAL, card); @@ -767,7 +775,49 @@ } -static void sca_init(card_t *card, int wait_states) + +#ifdef NEED_DETECT_RAM +static u32 __devinit sca_detect_ram(card_t *card, u8 *rambase, u32 ramsize) +{ + /* Round RAM size to 32 bits, fill from end to start */ + u32 i = ramsize &= ~3; + +#ifndef ALL_PAGES_ALWAYS_MAPPED + u32 size = winsize(card); + + openwin(card, (i - 4) / size); /* select last window */ +#endif + do { + i -= 4; +#ifndef ALL_PAGES_ALWAYS_MAPPED + if ((i + 4) % size == 0) + openwin(card, i / size); + writel(i ^ 0x12345678, rambase + i % size); +#else + writel(i ^ 0x12345678, rambase + i); +#endif + }while (i > 0); + + for (i = 0; i < ramsize ; i += 4) { +#ifndef ALL_PAGES_ALWAYS_MAPPED + if (i % size == 0) + openwin(card, i / size); + + if (readl(rambase + i % size) != (i ^ 0x12345678)) + break; +#else + if (readl(rambase + i) != (i ^ 0x12345678)) + break; +#endif + } + + return i; +} +#endif /* NEED_DETECT_RAM */ + + + +static void __devinit sca_init(card_t *card, int wait_states) { sca_out(wait_states, WCRL, card); /* Wait Control */ sca_out(wait_states, WCRM, card); --- linux-2.4-ac.orig/drivers/net/wan/n2.c 2003-03-30 23:38:02.000000000 +0200 +++ linux-2.4/drivers/net/wan/n2.c 2003-04-07 00:25:13.000000000 +0200 @@ -1,12 +1,11 @@ /* * SDL Inc. RISCom/N2 synchronous serial card driver for Linux * - * Copyright (C) 1998-2002 Krzysztof Halasa + * Copyright (C) 1998-2003 Krzysztof Halasa * * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * under the terms of version 2 of the GNU General Public License + * as published by the Free Software Foundation. * * For information see http://hq.pm.waw.pl/hdlc/ * @@ -34,14 +33,21 @@ #include "hd64570.h" -static const char* version = "SDL RISCom/N2 driver version: 1.10"; +static const char* version = "SDL RISCom/N2 driver version: 1.14"; static const char* devname = "RISCom/N2"; #define USE_WINDOWSIZE 16384 #define USE_BUS16BITS 1 #define CLOCK_BASE 9830400 /* 9.8304 MHz */ - +#define MAX_PAGES 16 /* 16 RAM pages at max */ +#define MAX_RAM_SIZE 0x80000 /* 512 KB */ +#if MAX_RAM_SIZE > MAX_PAGES * USE_WINDOWSIZE +#undef MAX_RAM_SIZE +#define MAX_RAM_SIZE (MAX_PAGES * USE_WINDOWSIZE) +#endif #define N2_IOPORTS 0x10 +#define NEED_DETECT_RAM +#define MAX_TX_BUFFERS 10 static char *hw = NULL; /* pointer to hw=xxx command line string */ @@ -86,16 +92,16 @@ struct card_s *card; spinlock_t lock; /* TX lock */ sync_serial_settings settings; + int valid; /* port enabled */ + int rxpart; /* partial frame received, next frame invalid*/ unsigned short encoding; unsigned short parity; + u16 rxin; /* rx ring buffer 'in' pointer */ + u16 txin; /* tx ring buffer 'in' and 'last' pointers */ + u16 txlast; u8 rxs, txs, tmc; /* SCA registers */ - u8 valid; /* port enabled */ u8 phy_node; /* physical port # - 0 or 1 */ u8 log_node; /* logical port # */ - u8 rxin; /* rx ring buffer 'in' pointer */ - u8 txin; /* tx ring buffer 'in' and 'last' pointers */ - u8 txlast; - u8 rxpart; /* partial frame received, next frame invalid*/ }port_t; @@ -106,8 +112,9 @@ u32 ram_size; /* number of bytes */ u16 io; /* IO Base address */ u16 buff_offset; /* offset of first buffer of first channel */ + u16 rx_ring_buffers; /* number of buffers in a ring */ + u16 tx_ring_buffers; u8 irq; /* IRQ (3-15) */ - u8 ring_buffers; /* number of buffers in a ring */ port_t ports[2]; struct card_s *next_card; @@ -216,7 +223,7 @@ MOD_INC_USE_COUNT; mcr &= port->phy_node ? ~DTR_PORT1 : ~DTR_PORT0; /* set DTR ON */ outb(mcr, io + N2_MCR); - + outb(inb(io + N2_PCR) | PCR_ENWIN, io + N2_PCR); /* open window */ outb(inb(io + N2_PSR) | PSR_DMAEN, io + N2_PSR); /* enable dma */ sca_open(hdlc); @@ -297,62 +304,6 @@ -static u8 n2_count_page(card_t *card) -{ - u8 page; - int i, bcount = USE_WINDOWSIZE, wcount = USE_WINDOWSIZE/2; - u16 *dp = (u16*)card->winbase; - u8 *bp = (u8*)card->winbase; - u8 psr = inb(card->io + N2_PSR) & PSR_WINBITS; - - - for (page = 0; page < 16; page++) { - outb(psr | page, card->io + N2_PSR); /* select a page */ - writeb(page, dp); - if (readb(dp) != page) - break; /* If can't read back, no good memory */ - - outb(psr, card->io + N2_PSR); /* goto page 0 */ - if (readb(dp)) - break; /* If page 0 changed, then wrapped around */ - - outb(psr | page, card->io + N2_PSR); /* select page again */ - - /* first do byte tests */ - for (i = 0; i < bcount; i++) - writeb(i, bp + i); - for (i = 0; i < bcount; i++) - if (readb(bp + i) != (i & 0xff)) - return 0; - - for (i = 0; i < bcount; i++) - writeb(~i, bp + i); - for (i = 0; i < bcount; i++) - if (readb(bp + i) != (~i & 0xff)) - return 0; - - /* next do 16-bit tests */ - for (i = 0; i < wcount; i++) - writew(0x55AA, dp + i); - for (i = 0; i < wcount; i++) - if (readw(dp + i) != 0x55AA) - return 0; - - for (i = 0; i < wcount; i++) - writew(0xAA55, dp + i); - for (i = 0; i < wcount; i++) - if (readw(dp + i) != 0xAA55) - return 0; - - for (i = 0; i < wcount; i++) - writew(page, dp + i); - } - - return page; -} - - - static void n2_destroy_card(card_t *card) { int cnt; @@ -376,11 +327,12 @@ -static int n2_run(unsigned long io, unsigned long irq, unsigned long winbase, - long valid0, long valid1) +static int __init n2_run(unsigned long io, unsigned long irq, + unsigned long winbase, long valid0, long valid1) { card_t *card; u8 cnt, pcr; + int i; if (io < 0x200 || io > 0x3FF || (io % N2_IOPORTS) != 0) { printk(KERN_ERR "n2: invalid I/O port value\n"); @@ -391,7 +343,7 @@ printk(KERN_ERR "n2: invalid IRQ value\n"); return -ENODEV; } - + if (winbase < 0xA0000 || winbase > 0xFFFFF || (winbase & 0xFFF) != 0) { printk(KERN_ERR "n2: invalid RAM value\n"); return -ENODEV; @@ -451,25 +403,27 @@ pcr = PCR_ENWIN | PCR_VPM | (USE_BUS16BITS ? PCR_BUS16 : 0); outb(pcr, io + N2_PCR); - cnt = n2_count_page(card); - if (!cnt) { - printk(KERN_ERR "n2: memory test failed.\n"); - n2_destroy_card(card); - return -EIO; - } + card->ram_size = sca_detect_ram(card, card->winbase, MAX_RAM_SIZE); - card->ram_size = cnt * USE_WINDOWSIZE; + /* number of TX + RX buffers for one port */ + i = card->ram_size / ((valid0 + valid1) * (sizeof(pkt_desc) + + HDLC_MAX_MRU)); - /* 4 rings required for 2 ports, 2 rings for one port */ - card->ring_buffers = card->ram_size / - ((valid0 + valid1) * 2 * (sizeof(pkt_desc) + HDLC_MAX_MRU)); + card->tx_ring_buffers = min(i / 2, MAX_TX_BUFFERS); + card->rx_ring_buffers = i - card->tx_ring_buffers; - card->buff_offset = (valid0 + valid1) * 2 * (sizeof(pkt_desc)) - * card->ring_buffers; + card->buff_offset = (valid0 + valid1) * sizeof(pkt_desc) * + (card->tx_ring_buffers + card->rx_ring_buffers); printk(KERN_DEBUG "n2: RISCom/N2 %u KB RAM, IRQ%u, " - "using %u packets rings\n", card->ram_size / 1024, card->irq, - card->ring_buffers); + "using %u TX + %u RX packets rings\n", card->ram_size / 1024, + card->irq, card->tx_ring_buffers, card->rx_ring_buffers); + + if (card->tx_ring_buffers < 1) { + printk(KERN_ERR "n2: RAM test failed\n"); + n2_destroy_card(card); + return -EIO; + } pcr |= PCR_RUNSCA; /* run SCA */ outb(pcr, io + N2_PCR); @@ -531,7 +485,7 @@ return -ENOSYS; /* no parameters specified, abort */ } - printk(KERN_INFO "%s (SCA-%s)\n", version, sca_version); + printk(KERN_INFO "%s\n", version); do { unsigned long io, irq, ram; @@ -558,7 +512,7 @@ break; hw++; } - + if (!valid[0] && !valid[1]) break; /* at least one port must be used */ @@ -566,7 +520,7 @@ n2_run(io, irq, ram, valid[0], valid[1]); if (*hw == '\x0') - return 0; + return first_card ? 0 : -ENOSYS; }while(*hw++ == ':'); printk(KERN_ERR "n2: invalid hardware parameters\n"); @@ -602,6 +556,6 @@ MODULE_AUTHOR("Krzysztof Halasa "); MODULE_DESCRIPTION("RISCom/N2 serial port driver"); -MODULE_LICENSE("GPL"); +MODULE_LICENSE("GPL v2"); MODULE_PARM(hw, "s"); /* hw=io,irq,ram,ports:io,irq,... */ EXPORT_NO_SYMBOLS; --- linux-2.4-ac.orig/drivers/net/wan/c101.c 2003-03-30 23:38:20.000000000 +0200 +++ linux-2.4/drivers/net/wan/c101.c 2003-04-07 13:46:18.000000000 +0200 @@ -30,7 +30,7 @@ #include "hd64570.h" -static const char* version = "Moxa C101 driver version: 1.12"; +static const char* version = "Moxa C101 driver version: 1.14"; static const char* devname = "C101"; #define C101_PAGE 0x1D00 @@ -40,6 +40,10 @@ #define C101_MAPPED_RAM_SIZE 0x4000 #define RAM_SIZE (256 * 1024) +#define TX_RING_BUFFERS 10 +#define RX_RING_BUFFERS ((RAM_SIZE - C101_WINDOW_SIZE) / \ + (sizeof(pkt_desc) + HDLC_MAX_MRU) - TX_RING_BUFFERS) + #define CLOCK_BASE 9830400 /* 9.8304 MHz */ #define PAGE0_ALWAYS_MAPPED @@ -51,20 +55,20 @@ spinlock_t lock; /* TX lock */ u8 *win0base; /* ISA window base address */ u32 phy_winbase; /* ISA physical base address */ - u16 buff_offset; /* offset of first buffer of first channel */ sync_serial_settings settings; + int rxpart; /* partial frame received, next frame invalid*/ unsigned short encoding; unsigned short parity; + u16 rx_ring_buffers; /* number of buffers in a ring */ + u16 tx_ring_buffers; + u16 buff_offset; /* offset of first buffer of first channel */ + u16 rxin; /* rx ring buffer 'in' pointer */ + u16 txin; /* tx ring buffer 'in' and 'last' pointers */ + u16 txlast; u8 rxs, txs, tmc; /* SCA registers */ u8 irq; /* IRQ (3-15) */ - u8 ring_buffers; /* number of buffers in a ring */ u8 page; - u8 rxin; /* rx ring buffer 'in' pointer */ - u8 txin; /* tx ring buffer 'in' and 'last' pointers */ - u8 txlast; - u8 rxpart; /* partial frame received, next frame invalid*/ - struct card_s *next_card; }card_t; @@ -233,6 +237,8 @@ static void c101_destroy_card(card_t *card) { + readb(card->win0base + C101_PAGE); /* Resets SCA? */ + if (card->irq) free_irq(card->irq, card); @@ -246,7 +252,7 @@ -static int c101_run(unsigned long irq, unsigned long winbase) +static int __init c101_run(unsigned long irq, unsigned long winbase) { struct net_device *dev; card_t *card; @@ -289,9 +295,10 @@ return -EBUSY; } - /* 2 rings required for 1 port */ - card->ring_buffers = (RAM_SIZE -C101_WINDOW_SIZE) / (2 * HDLC_MAX_MRU); - printk(KERN_DEBUG "c101: using %u packets rings\n",card->ring_buffers); + card->tx_ring_buffers = TX_RING_BUFFERS; + card->rx_ring_buffers = RX_RING_BUFFERS; + printk(KERN_DEBUG "c101: using %u TX + %u RX packets rings\n", + card->tx_ring_buffers, card->rx_ring_buffers); card->buff_offset = C101_WINDOW_SIZE; /* Bytes 1D00-1FFF reserved */ @@ -341,7 +348,7 @@ return -ENOSYS; /* no parameters specified, abort */ } - printk(KERN_INFO "%s (SCA-%s)\n", version, sca_version); + printk(KERN_INFO "%s\n", version); do { unsigned long irq, ram; @@ -393,6 +400,6 @@ MODULE_AUTHOR("Krzysztof Halasa "); MODULE_DESCRIPTION("Moxa C101 serial port driver"); -MODULE_LICENSE("GPL"); +MODULE_LICENSE("GPL v2"); MODULE_PARM(hw, "s"); /* hw=irq,ram:irq,... */ EXPORT_NO_SYMBOLS; --- linux-2.4-ac.orig/Documentation/Configure.help 2003-03-30 23:38:19.000000000 +0200 +++ linux-2.4/Documentation/Configure.help 2003-04-07 14:22:20.000000000 +0200 @@ -9671,14 +9649,15 @@ This driver supports the FarSync T-Series X.21 (and V.35/V.24) cards from FarSite Communications Ltd. Synchronous communication is supported on all ports at speeds up to - 8Mb/s (128K on V.24) using synchronous PPP or Cisco HDLC. + 8Mb/s (128K on V.24) using synchronous PPP, Cisco HDLC, raw HDLC, + Frame Relay or X.25/LAPB. If you want to compile this driver as a module ( = code which can be inserted in and removed from the running kernel whenever you want) say M here and read . The module will be called farsync.o and if you want the module to be automatically loaded when the interface is referenced then you - should add "alias syncX farsync" to /etc/modules.conf for each + should add "alias hdlcX farsync" to /etc/modules.conf for each interface, where X is 0, 1, 2, ... Frame Relay (DLCI) support @@ -10618,6 +10597,25 @@ If unsure, say N here. +CONFIG_HDLC_DEBUG_PKT + This option is for developers only - do NOT use on production + systems. + +CONFIG_HDLC_DEBUG_HARD_HEADER + This option is for developers only - do NOT use on production + systems. + +CONFIG_HDLC_DEBUG_ECN + This option is for developers only - do NOT use on production + systems. + +CONFIG_HDLC_DEBUG_RINGS + If you answer Y here you will be able to get a diagnostic dump of + port's TX and RX packet rings, using "sethdlc hdlcX private" + command. It does not affect normal operations. + + If unsure, say Y here. + Ethernet (10 or 100Mbit) CONFIG_NET_ETHERNET Ethernet (also called IEEE 802.3 or ISO 8802-2) is the most common