0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024 #include <linux/bitops.h>
0025 #include <linux/errno.h>
0026 #include <linux/fcntl.h>
0027 #include <linux/hdlc.h>
0028 #include <linux/in.h>
0029 #include <linux/interrupt.h>
0030 #include <linux/ioport.h>
0031 #include <linux/jiffies.h>
0032 #include <linux/kernel.h>
0033 #include <linux/module.h>
0034 #include <linux/netdevice.h>
0035 #include <linux/skbuff.h>
0036 #include <linux/string.h>
0037 #include <linux/types.h>
0038 #include <asm/io.h>
0039 #include <linux/uaccess.h>
0040 #include "hd64572.h"
0041
0042 #define NAPI_WEIGHT 16
0043
0044 #define get_msci(port) ((port)->chan ? MSCI1_OFFSET : MSCI0_OFFSET)
0045 #define get_dmac_rx(port) ((port)->chan ? DMAC1RX_OFFSET : DMAC0RX_OFFSET)
0046 #define get_dmac_tx(port) ((port)->chan ? DMAC1TX_OFFSET : DMAC0TX_OFFSET)
0047
0048 #define sca_in(reg, card) readb((card)->scabase + (reg))
0049 #define sca_out(value, reg, card) writeb(value, (card)->scabase + (reg))
0050 #define sca_inw(reg, card) readw((card)->scabase + (reg))
0051 #define sca_outw(value, reg, card) writew(value, (card)->scabase + (reg))
0052 #define sca_inl(reg, card) readl((card)->scabase + (reg))
0053 #define sca_outl(value, reg, card) writel(value, (card)->scabase + (reg))
0054
0055 static int sca_poll(struct napi_struct *napi, int budget);
0056
0057 static inline port_t *dev_to_port(struct net_device *dev)
0058 {
0059 return dev_to_hdlc(dev)->priv;
0060 }
0061
0062 static inline void enable_intr(port_t *port)
0063 {
0064
0065 sca_outl(sca_inl(IER0, port->card) |
0066 (port->chan ? 0x08002200 : 0x00080022), IER0, port->card);
0067 }
0068
0069 static inline void disable_intr(port_t *port)
0070 {
0071 sca_outl(sca_inl(IER0, port->card) &
0072 (port->chan ? 0x00FF00FF : 0xFF00FF00), IER0, port->card);
0073 }
0074
0075 static inline u16 desc_abs_number(port_t *port, u16 desc, int transmit)
0076 {
0077 u16 rx_buffs = port->card->rx_ring_buffers;
0078 u16 tx_buffs = port->card->tx_ring_buffers;
0079
0080 desc %= (transmit ? tx_buffs : rx_buffs);
0081 return port->chan * (rx_buffs + tx_buffs) + transmit * rx_buffs + desc;
0082 }
0083
0084 static inline u16 desc_offset(port_t *port, u16 desc, int transmit)
0085 {
0086
0087 return desc_abs_number(port, desc, transmit) * sizeof(pkt_desc);
0088 }
0089
0090 static inline pkt_desc __iomem *desc_address(port_t *port, u16 desc,
0091 int transmit)
0092 {
0093 return (pkt_desc __iomem *)(port->card->rambase +
0094 desc_offset(port, desc, transmit));
0095 }
0096
0097 static inline u32 buffer_offset(port_t *port, u16 desc, int transmit)
0098 {
0099 return port->card->buff_offset +
0100 desc_abs_number(port, desc, transmit) * (u32)HDLC_MAX_MRU;
0101 }
0102
0103 static inline void sca_set_carrier(port_t *port)
0104 {
0105 if (!(sca_in(get_msci(port) + ST3, port->card) & ST3_DCD)) {
0106 #ifdef DEBUG_LINK
0107 printk(KERN_DEBUG "%s: sca_set_carrier on\n",
0108 port->netdev.name);
0109 #endif
0110 netif_carrier_on(port->netdev);
0111 } else {
0112 #ifdef DEBUG_LINK
0113 printk(KERN_DEBUG "%s: sca_set_carrier off\n",
0114 port->netdev.name);
0115 #endif
0116 netif_carrier_off(port->netdev);
0117 }
0118 }
0119
0120 static void sca_init_port(port_t *port)
0121 {
0122 card_t *card = port->card;
0123 u16 dmac_rx = get_dmac_rx(port), dmac_tx = get_dmac_tx(port);
0124 int transmit, i;
0125
0126 port->rxin = 0;
0127 port->txin = 0;
0128 port->txlast = 0;
0129
0130 for (transmit = 0; transmit < 2; transmit++) {
0131 u16 buffs = transmit ? card->tx_ring_buffers
0132 : card->rx_ring_buffers;
0133
0134 for (i = 0; i < buffs; i++) {
0135 pkt_desc __iomem *desc = desc_address(port, i, transmit);
0136 u16 chain_off = desc_offset(port, i + 1, transmit);
0137 u32 buff_off = buffer_offset(port, i, transmit);
0138
0139 writel(chain_off, &desc->cp);
0140 writel(buff_off, &desc->bp);
0141 writew(0, &desc->len);
0142 writeb(0, &desc->stat);
0143 }
0144 }
0145
0146
0147 sca_out(0, DSR_RX(port->chan), card);
0148 sca_out(0, DSR_TX(port->chan), card);
0149
0150
0151 sca_out(DCR_ABORT, DCR_RX(port->chan), card);
0152 sca_out(DCR_ABORT, DCR_TX(port->chan), card);
0153
0154
0155 sca_outl(desc_offset(port, 0, 0), dmac_rx + CDAL, card);
0156 sca_outl(desc_offset(port, card->tx_ring_buffers - 1, 0),
0157 dmac_rx + EDAL, card);
0158 sca_outl(desc_offset(port, 0, 1), dmac_tx + CDAL, card);
0159 sca_outl(desc_offset(port, 0, 1), dmac_tx + EDAL, card);
0160
0161
0162 sca_out(DCR_CLEAR_EOF, DCR_RX(port->chan), card);
0163 sca_out(DCR_CLEAR_EOF, DCR_TX(port->chan), card);
0164
0165
0166 sca_outw(HDLC_MAX_MRU, dmac_rx + BFLL, card);
0167 sca_out(0x14, DMR_RX(port->chan), card);
0168 sca_out(DIR_EOME, DIR_RX(port->chan), card);
0169 sca_out(DSR_DE, DSR_RX(port->chan), card);
0170
0171
0172 sca_out(0x14, DMR_TX(port->chan), card);
0173 sca_out(DIR_EOME, DIR_TX(port->chan), card);
0174
0175 sca_set_carrier(port);
0176 netif_napi_add_weight(port->netdev, &port->napi, sca_poll,
0177 NAPI_WEIGHT);
0178 }
0179
0180
0181 static inline void sca_msci_intr(port_t *port)
0182 {
0183 u16 msci = get_msci(port);
0184 card_t *card = port->card;
0185
0186 if (sca_in(msci + ST1, card) & ST1_CDCD) {
0187
0188 sca_out(ST1_CDCD, msci + ST1, card);
0189 sca_set_carrier(port);
0190 }
0191 }
0192
0193 static inline void sca_rx(card_t *card, port_t *port, pkt_desc __iomem *desc,
0194 u16 rxin)
0195 {
0196 struct net_device *dev = port->netdev;
0197 struct sk_buff *skb;
0198 u16 len;
0199 u32 buff;
0200
0201 len = readw(&desc->len);
0202 skb = dev_alloc_skb(len);
0203 if (!skb) {
0204 dev->stats.rx_dropped++;
0205 return;
0206 }
0207
0208 buff = buffer_offset(port, rxin, 0);
0209 memcpy_fromio(skb->data, card->rambase + buff, len);
0210
0211 skb_put(skb, len);
0212 #ifdef DEBUG_PKT
0213 printk(KERN_DEBUG "%s RX(%i):", dev->name, skb->len);
0214 debug_frame(skb);
0215 #endif
0216 dev->stats.rx_packets++;
0217 dev->stats.rx_bytes += skb->len;
0218 skb->protocol = hdlc_type_trans(skb, dev);
0219 netif_receive_skb(skb);
0220 }
0221
0222
0223 static inline int sca_rx_done(port_t *port, int budget)
0224 {
0225 struct net_device *dev = port->netdev;
0226 u16 dmac = get_dmac_rx(port);
0227 card_t *card = port->card;
0228 u8 stat = sca_in(DSR_RX(port->chan), card);
0229 int received = 0;
0230
0231
0232 sca_out((stat & (DSR_EOT | DSR_EOM | DSR_BOF | DSR_COF)) | DSR_DWE,
0233 DSR_RX(port->chan), card);
0234
0235 if (stat & DSR_BOF)
0236
0237 dev->stats.rx_over_errors++;
0238
0239 while (received < budget) {
0240 u32 desc_off = desc_offset(port, port->rxin, 0);
0241 pkt_desc __iomem *desc;
0242 u32 cda = sca_inl(dmac + CDAL, card);
0243
0244 if ((cda >= desc_off) && (cda < desc_off + sizeof(pkt_desc)))
0245 break;
0246
0247 desc = desc_address(port, port->rxin, 0);
0248 stat = readb(&desc->stat);
0249 if (!(stat & ST_RX_EOM))
0250 port->rxpart = 1;
0251 else if ((stat & ST_ERROR_MASK) || port->rxpart) {
0252 dev->stats.rx_errors++;
0253 if (stat & ST_RX_OVERRUN)
0254 dev->stats.rx_fifo_errors++;
0255 else if ((stat & (ST_RX_SHORT | ST_RX_ABORT |
0256 ST_RX_RESBIT)) || port->rxpart)
0257 dev->stats.rx_frame_errors++;
0258 else if (stat & ST_RX_CRC)
0259 dev->stats.rx_crc_errors++;
0260 if (stat & ST_RX_EOM)
0261 port->rxpart = 0;
0262 } else {
0263 sca_rx(card, port, desc, port->rxin);
0264 received++;
0265 }
0266
0267
0268 sca_outl(desc_off, dmac + EDAL, card);
0269 port->rxin = (port->rxin + 1) % card->rx_ring_buffers;
0270 }
0271
0272
0273 sca_out(DSR_DE, DSR_RX(port->chan), card);
0274 return received;
0275 }
0276
0277
0278 static inline void sca_tx_done(port_t *port)
0279 {
0280 struct net_device *dev = port->netdev;
0281 card_t *card = port->card;
0282 u8 stat;
0283 unsigned count = 0;
0284
0285 spin_lock(&port->lock);
0286
0287 stat = sca_in(DSR_TX(port->chan), card);
0288
0289
0290 sca_out((stat & (DSR_EOT | DSR_EOM | DSR_BOF | DSR_COF)) | DSR_DWE,
0291 DSR_TX(port->chan), card);
0292
0293 while (1) {
0294 pkt_desc __iomem *desc = desc_address(port, port->txlast, 1);
0295 u8 stat = readb(&desc->stat);
0296
0297 if (!(stat & ST_TX_OWNRSHP))
0298 break;
0299 if (stat & ST_TX_UNDRRUN) {
0300 dev->stats.tx_errors++;
0301 dev->stats.tx_fifo_errors++;
0302 } else {
0303 dev->stats.tx_packets++;
0304 dev->stats.tx_bytes += readw(&desc->len);
0305 }
0306 writeb(0, &desc->stat);
0307 count++;
0308 port->txlast = (port->txlast + 1) % card->tx_ring_buffers;
0309 }
0310
0311 if (count)
0312 netif_wake_queue(dev);
0313 spin_unlock(&port->lock);
0314 }
0315
0316 static int sca_poll(struct napi_struct *napi, int budget)
0317 {
0318 port_t *port = container_of(napi, port_t, napi);
0319 u32 isr0 = sca_inl(ISR0, port->card);
0320 int received = 0;
0321
0322 if (isr0 & (port->chan ? 0x08000000 : 0x00080000))
0323 sca_msci_intr(port);
0324
0325 if (isr0 & (port->chan ? 0x00002000 : 0x00000020))
0326 sca_tx_done(port);
0327
0328 if (isr0 & (port->chan ? 0x00000200 : 0x00000002))
0329 received = sca_rx_done(port, budget);
0330
0331 if (received < budget) {
0332 napi_complete_done(napi, received);
0333 enable_intr(port);
0334 }
0335
0336 return received;
0337 }
0338
0339 static irqreturn_t sca_intr(int irq, void *dev_id)
0340 {
0341 card_t *card = dev_id;
0342 u32 isr0 = sca_inl(ISR0, card);
0343 int i, handled = 0;
0344
0345 for (i = 0; i < 2; i++) {
0346 port_t *port = get_port(card, i);
0347 if (port && (isr0 & (i ? 0x08002200 : 0x00080022))) {
0348 handled = 1;
0349 disable_intr(port);
0350 napi_schedule(&port->napi);
0351 }
0352 }
0353
0354 return IRQ_RETVAL(handled);
0355 }
0356
0357 static void sca_set_port(port_t *port)
0358 {
0359 card_t *card = port->card;
0360 u16 msci = get_msci(port);
0361 u8 md2 = sca_in(msci + MD2, card);
0362 unsigned int tmc, br = 10, brv = 1024;
0363
0364 if (port->settings.clock_rate > 0) {
0365
0366 do {
0367 br--;
0368 brv >>= 1;
0369
0370
0371 tmc = CLOCK_BASE / brv / port->settings.clock_rate;
0372 } while (br > 1 && tmc <= 128);
0373
0374 if (tmc < 1) {
0375 tmc = 1;
0376 br = 0;
0377 brv = 1;
0378 } else if (tmc > 255) {
0379 tmc = 256;
0380 }
0381
0382 port->settings.clock_rate = CLOCK_BASE / brv / tmc;
0383 } else {
0384 br = 9;
0385 tmc = 256;
0386 port->settings.clock_rate = CLOCK_BASE / (256 * 512);
0387 }
0388
0389 port->rxs = (port->rxs & ~CLK_BRG_MASK) | br;
0390 port->txs = (port->txs & ~CLK_BRG_MASK) | br;
0391 port->tmc = tmc;
0392
0393
0394 sca_out(port->tmc, msci + TMCR, card);
0395 sca_out(port->tmc, msci + TMCT, card);
0396
0397
0398 sca_out(port->rxs, msci + RXS, card);
0399 sca_out(port->txs, msci + TXS, card);
0400
0401 if (port->settings.loopback)
0402 md2 |= MD2_LOOPBACK;
0403 else
0404 md2 &= ~MD2_LOOPBACK;
0405
0406 sca_out(md2, msci + MD2, card);
0407 }
0408
0409 static void sca_open(struct net_device *dev)
0410 {
0411 port_t *port = dev_to_port(dev);
0412 card_t *card = port->card;
0413 u16 msci = get_msci(port);
0414 u8 md0, md2;
0415
0416 switch (port->encoding) {
0417 case ENCODING_NRZ:
0418 md2 = MD2_NRZ;
0419 break;
0420 case ENCODING_NRZI:
0421 md2 = MD2_NRZI;
0422 break;
0423 case ENCODING_FM_MARK:
0424 md2 = MD2_FM_MARK;
0425 break;
0426 case ENCODING_FM_SPACE:
0427 md2 = MD2_FM_SPACE;
0428 break;
0429 default:
0430 md2 = MD2_MANCHESTER;
0431 }
0432
0433 if (port->settings.loopback)
0434 md2 |= MD2_LOOPBACK;
0435
0436 switch (port->parity) {
0437 case PARITY_CRC16_PR0:
0438 md0 = MD0_HDLC | MD0_CRC_16_0;
0439 break;
0440 case PARITY_CRC16_PR1:
0441 md0 = MD0_HDLC | MD0_CRC_16;
0442 break;
0443 case PARITY_CRC32_PR1_CCITT:
0444 md0 = MD0_HDLC | MD0_CRC_ITU32;
0445 break;
0446 case PARITY_CRC16_PR1_CCITT:
0447 md0 = MD0_HDLC | MD0_CRC_ITU;
0448 break;
0449 default:
0450 md0 = MD0_HDLC | MD0_CRC_NONE;
0451 }
0452
0453 sca_out(CMD_RESET, msci + CMD, card);
0454 sca_out(md0, msci + MD0, card);
0455 sca_out(0x00, msci + MD1, card);
0456 sca_out(md2, msci + MD2, card);
0457 sca_out(0x7E, msci + IDL, card);
0458
0459 sca_out(CTL_IDLE | CTL_URCT | CTL_URSKP, msci + CTL, card);
0460 sca_out(0x0F, msci + RNR, card);
0461 sca_out(0x3C, msci + TFS, card);
0462 sca_out(0x38, msci + TCR, card);
0463 sca_out(0x38, msci + TNR0, card);
0464 sca_out(0x3F, msci + TNR1, card);
0465
0466
0467
0468
0469
0470 sca_outl(IE0_RXINTA | IE0_CDCD, msci + IE0, card);
0471
0472 sca_out(port->tmc, msci + TMCR, card);
0473 sca_out(port->tmc, msci + TMCT, card);
0474 sca_out(port->rxs, msci + RXS, card);
0475 sca_out(port->txs, msci + TXS, card);
0476 sca_out(CMD_TX_ENABLE, msci + CMD, card);
0477 sca_out(CMD_RX_ENABLE, msci + CMD, card);
0478
0479 sca_set_carrier(port);
0480 enable_intr(port);
0481 napi_enable(&port->napi);
0482 netif_start_queue(dev);
0483 }
0484
0485 static void sca_close(struct net_device *dev)
0486 {
0487 port_t *port = dev_to_port(dev);
0488
0489
0490 sca_out(CMD_RESET, get_msci(port) + CMD, port->card);
0491 disable_intr(port);
0492 napi_disable(&port->napi);
0493 netif_stop_queue(dev);
0494 }
0495
0496 static int sca_attach(struct net_device *dev, unsigned short encoding,
0497 unsigned short parity)
0498 {
0499 if (encoding != ENCODING_NRZ &&
0500 encoding != ENCODING_NRZI &&
0501 encoding != ENCODING_FM_MARK &&
0502 encoding != ENCODING_FM_SPACE &&
0503 encoding != ENCODING_MANCHESTER)
0504 return -EINVAL;
0505
0506 if (parity != PARITY_NONE &&
0507 parity != PARITY_CRC16_PR0 &&
0508 parity != PARITY_CRC16_PR1 &&
0509 parity != PARITY_CRC32_PR1_CCITT &&
0510 parity != PARITY_CRC16_PR1_CCITT)
0511 return -EINVAL;
0512
0513 dev_to_port(dev)->encoding = encoding;
0514 dev_to_port(dev)->parity = parity;
0515 return 0;
0516 }
0517
0518 #ifdef DEBUG_RINGS
0519 static void sca_dump_rings(struct net_device *dev)
0520 {
0521 port_t *port = dev_to_port(dev);
0522 card_t *card = port->card;
0523 u16 cnt;
0524
0525 printk(KERN_DEBUG "RX ring: CDA=%u EDA=%u DSR=%02X in=%u %sactive",
0526 sca_inl(get_dmac_rx(port) + CDAL, card),
0527 sca_inl(get_dmac_rx(port) + EDAL, card),
0528 sca_in(DSR_RX(port->chan), card), port->rxin,
0529 sca_in(DSR_RX(port->chan), card) & DSR_DE ? "" : "in");
0530 for (cnt = 0; cnt < port->card->rx_ring_buffers; cnt++)
0531 pr_cont(" %02X", readb(&(desc_address(port, cnt, 0)->stat)));
0532 pr_cont("\n");
0533
0534 printk(KERN_DEBUG "TX ring: CDA=%u EDA=%u DSR=%02X in=%u "
0535 "last=%u %sactive",
0536 sca_inl(get_dmac_tx(port) + CDAL, card),
0537 sca_inl(get_dmac_tx(port) + EDAL, card),
0538 sca_in(DSR_TX(port->chan), card), port->txin, port->txlast,
0539 sca_in(DSR_TX(port->chan), card) & DSR_DE ? "" : "in");
0540
0541 for (cnt = 0; cnt < port->card->tx_ring_buffers; cnt++)
0542 pr_cont(" %02X", readb(&(desc_address(port, cnt, 1)->stat)));
0543 pr_cont("\n");
0544
0545 printk(KERN_DEBUG "MSCI: MD: %02x %02x %02x,"
0546 " ST: %02x %02x %02x %02x %02x, FST: %02x CST: %02x %02x\n",
0547 sca_in(get_msci(port) + MD0, card),
0548 sca_in(get_msci(port) + MD1, card),
0549 sca_in(get_msci(port) + MD2, card),
0550 sca_in(get_msci(port) + ST0, card),
0551 sca_in(get_msci(port) + ST1, card),
0552 sca_in(get_msci(port) + ST2, card),
0553 sca_in(get_msci(port) + ST3, card),
0554 sca_in(get_msci(port) + ST4, card),
0555 sca_in(get_msci(port) + FST, card),
0556 sca_in(get_msci(port) + CST0, card),
0557 sca_in(get_msci(port) + CST1, card));
0558
0559 printk(KERN_DEBUG "ILAR: %02x ISR: %08x %08x\n", sca_in(ILAR, card),
0560 sca_inl(ISR0, card), sca_inl(ISR1, card));
0561 }
0562 #endif
0563
0564 static netdev_tx_t sca_xmit(struct sk_buff *skb, struct net_device *dev)
0565 {
0566 port_t *port = dev_to_port(dev);
0567 card_t *card = port->card;
0568 pkt_desc __iomem *desc;
0569 u32 buff, len;
0570
0571 spin_lock_irq(&port->lock);
0572
0573 desc = desc_address(port, port->txin + 1, 1);
0574 BUG_ON(readb(&desc->stat));
0575
0576 #ifdef DEBUG_PKT
0577 printk(KERN_DEBUG "%s TX(%i):", dev->name, skb->len);
0578 debug_frame(skb);
0579 #endif
0580
0581 desc = desc_address(port, port->txin, 1);
0582 buff = buffer_offset(port, port->txin, 1);
0583 len = skb->len;
0584 memcpy_toio(card->rambase + buff, skb->data, len);
0585
0586 writew(len, &desc->len);
0587 writeb(ST_TX_EOM, &desc->stat);
0588
0589 port->txin = (port->txin + 1) % card->tx_ring_buffers;
0590 sca_outl(desc_offset(port, port->txin, 1),
0591 get_dmac_tx(port) + EDAL, card);
0592
0593 sca_out(DSR_DE, DSR_TX(port->chan), card);
0594
0595 desc = desc_address(port, port->txin + 1, 1);
0596 if (readb(&desc->stat))
0597 netif_stop_queue(dev);
0598
0599 spin_unlock_irq(&port->lock);
0600
0601 dev_kfree_skb(skb);
0602 return NETDEV_TX_OK;
0603 }
0604
0605 static u32 sca_detect_ram(card_t *card, u8 __iomem *rambase, u32 ramsize)
0606 {
0607
0608 u32 i = ramsize &= ~3;
0609
0610 do {
0611 i -= 4;
0612 writel(i ^ 0x12345678, rambase + i);
0613 } while (i > 0);
0614
0615 for (i = 0; i < ramsize ; i += 4) {
0616 if (readl(rambase + i) != (i ^ 0x12345678))
0617 break;
0618 }
0619
0620 return i;
0621 }
0622
0623 static void sca_init(card_t *card, int wait_states)
0624 {
0625 sca_out(wait_states, WCRL, card);
0626 sca_out(wait_states, WCRM, card);
0627 sca_out(wait_states, WCRH, card);
0628
0629 sca_out(0, DMER, card);
0630 sca_out(0x03, PCR, card);
0631 sca_out(0, DSR_RX(0), card);
0632 sca_out(0, DSR_TX(0), card);
0633 sca_out(0, DSR_RX(1), card);
0634 sca_out(0, DSR_TX(1), card);
0635 sca_out(DMER_DME, DMER, card);
0636 }