Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v5.15 2052 lines 58 kB view raw
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* $Id: cosa.c,v 1.31 2000/03/08 17:47:16 kas Exp $ */ 3 4/* Copyright (C) 1995-1997 Jan "Yenya" Kasprzak <kas@fi.muni.cz> 5 * Generic HDLC port Copyright (C) 2008 Krzysztof Halasa <khc@pm.waw.pl> 6 */ 7 8/* The driver for the SRP and COSA synchronous serial cards. 9 * 10 * HARDWARE INFO 11 * 12 * Both cards are developed at the Institute of Computer Science, 13 * Masaryk University (https://www.ics.muni.cz/). The hardware is 14 * developed by Jiri Novotny <novotny@ics.muni.cz>. More information 15 * and the photo of both cards is available at 16 * http://www.pavoucek.cz/cosa.html. The card documentation, firmwares 17 * and other goods can be downloaded from ftp://ftp.ics.muni.cz/pub/cosa/. 18 * For Linux-specific utilities, see below in the "Software info" section. 19 * If you want to order the card, contact Jiri Novotny. 20 * 21 * The SRP (serial port?, the Czech word "srp" means "sickle") card 22 * is a 2-port intelligent (with its own 8-bit CPU) synchronous serial card 23 * with V.24 interfaces up to 80kb/s each. 24 * 25 * The COSA (communication serial adapter?, the Czech word "kosa" means 26 * "scythe") is a next-generation sync/async board with two interfaces 27 * - currently any of V.24, X.21, V.35 and V.36 can be selected. 28 * It has a 16-bit SAB80166 CPU and can do up to 10 Mb/s per channel. 29 * The 8-channels version is in development. 30 * 31 * Both types have downloadable firmware and communicate via ISA DMA. 32 * COSA can be also a bus-mastering device. 33 * 34 * SOFTWARE INFO 35 * 36 * The homepage of the Linux driver is at https://www.fi.muni.cz/~kas/cosa/. 37 * The CVS tree of Linux driver can be viewed there, as well as the 38 * firmware binaries and user-space utilities for downloading the firmware 39 * into the card and setting up the card. 40 * 41 * The Linux driver (unlike the present *BSD drivers :-) can work even 42 * for the COSA and SRP in one computer and allows each channel to work 43 * in one of the two modes (character or network device). 44 * 45 * AUTHOR 46 * 47 * The Linux driver was written by Jan "Yenya" Kasprzak <kas@fi.muni.cz>. 48 * 49 * You can mail me bugfixes and even success reports. I am especially 50 * interested in the SMP and/or muliti-channel success/failure reports 51 * (I wonder if I did the locking properly :-). 52 * 53 * THE AUTHOR USED THE FOLLOWING SOURCES WHEN PROGRAMMING THE DRIVER 54 * 55 * The COSA/SRP NetBSD driver by Zdenek Salvet and Ivos Cernohlavek 56 * The skeleton.c by Donald Becker 57 * The SDL Riscom/N2 driver by Mike Natale 58 * The Comtrol Hostess SV11 driver by Alan Cox 59 * The Sync PPP/Cisco HDLC layer (syncppp.c) ported to Linux by Alan Cox 60 */ 61 62#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 63 64#include <linux/module.h> 65#include <linux/kernel.h> 66#include <linux/sched/signal.h> 67#include <linux/slab.h> 68#include <linux/poll.h> 69#include <linux/fs.h> 70#include <linux/interrupt.h> 71#include <linux/delay.h> 72#include <linux/hdlc.h> 73#include <linux/errno.h> 74#include <linux/ioport.h> 75#include <linux/netdevice.h> 76#include <linux/spinlock.h> 77#include <linux/mutex.h> 78#include <linux/device.h> 79#include <asm/io.h> 80#include <asm/dma.h> 81#include <asm/byteorder.h> 82 83#undef COSA_SLOW_IO /* for testing purposes only */ 84 85#include "cosa.h" 86 87/* Maximum length of the identification string. */ 88#define COSA_MAX_ID_STRING 128 89 90/* Maximum length of the channel name */ 91#define COSA_MAX_NAME (sizeof("cosaXXXcXXX") + 1) 92 93/* Per-channel data structure */ 94 95struct channel_data { 96 int usage; /* Usage count; >0 for chrdev, -1 for netdev */ 97 int num; /* Number of the channel */ 98 struct cosa_data *cosa; /* Pointer to the per-card structure */ 99 int txsize; /* Size of transmitted data */ 100 char *txbuf; /* Transmit buffer */ 101 char name[COSA_MAX_NAME]; /* channel name */ 102 103 /* The HW layer interface */ 104 /* routine called from the RX interrupt */ 105 char *(*setup_rx)(struct channel_data *channel, int size); 106 /* routine called when the RX is done (from the EOT interrupt) */ 107 int (*rx_done)(struct channel_data *channel); 108 /* routine called when the TX is done (from the EOT interrupt) */ 109 int (*tx_done)(struct channel_data *channel, int size); 110 111 /* Character device parts */ 112 struct mutex rlock; 113 struct semaphore wsem; 114 char *rxdata; 115 int rxsize; 116 wait_queue_head_t txwaitq, rxwaitq; 117 int tx_status, rx_status; 118 119 /* generic HDLC device parts */ 120 struct net_device *netdev; 121 struct sk_buff *rx_skb, *tx_skb; 122}; 123 124/* cosa->firmware_status bits */ 125#define COSA_FW_RESET BIT(0) /* Is the ROM monitor active? */ 126#define COSA_FW_DOWNLOAD BIT(1) /* Is the microcode downloaded? */ 127#define COSA_FW_START BIT(2) /* Is the microcode running? */ 128 129struct cosa_data { 130 int num; /* Card number */ 131 char name[COSA_MAX_NAME]; /* Card name - e.g "cosa0" */ 132 unsigned int datareg, statusreg; /* I/O ports */ 133 unsigned short irq, dma; /* IRQ and DMA number */ 134 unsigned short startaddr; /* Firmware start address */ 135 unsigned short busmaster; /* Use busmastering? */ 136 int nchannels; /* # of channels on this card */ 137 int driver_status; /* For communicating with firmware */ 138 int firmware_status; /* Downloaded, reseted, etc. */ 139 unsigned long rxbitmap, txbitmap;/* Bitmap of channels who are willing to send/receive data */ 140 unsigned long rxtx; /* RX or TX in progress? */ 141 int enabled; 142 int usage; /* usage count */ 143 int txchan, txsize, rxsize; 144 struct channel_data *rxchan; 145 char *bouncebuf; 146 char *txbuf, *rxbuf; 147 struct channel_data *chan; 148 spinlock_t lock; /* For exclusive operations on this structure */ 149 char id_string[COSA_MAX_ID_STRING]; /* ROM monitor ID string */ 150 char *type; /* card type */ 151}; 152 153/* Define this if you want all the possible ports to be autoprobed. 154 * It is here but it probably is not a good idea to use this. 155 */ 156/* #define COSA_ISA_AUTOPROBE 1*/ 157 158/* Character device major number. 117 was allocated for us. 159 * The value of 0 means to allocate a first free one. 160 */ 161static DEFINE_MUTEX(cosa_chardev_mutex); 162static int cosa_major = 117; 163 164/* Encoding of the minor numbers: 165 * The lowest CARD_MINOR_BITS bits means the channel on the single card, 166 * the highest bits means the card number. 167 */ 168#define CARD_MINOR_BITS 4 /* How many bits in minor number are reserved 169 * for the single card 170 */ 171/* The following depends on CARD_MINOR_BITS. Unfortunately, the "MODULE_STRING" 172 * macro doesn't like anything other than the raw number as an argument :-( 173 */ 174#define MAX_CARDS 16 175/* #define MAX_CARDS (1 << (8-CARD_MINOR_BITS)) */ 176 177#define DRIVER_RX_READY 0x0001 178#define DRIVER_TX_READY 0x0002 179#define DRIVER_TXMAP_SHIFT 2 180#define DRIVER_TXMAP_MASK 0x0c /* FIXME: 0xfc for 8-channel version */ 181 182/* for cosa->rxtx - indicates whether either transmit or receive is 183 * in progress. These values are mean number of the bit. 184 */ 185#define TXBIT 0 186#define RXBIT 1 187#define IRQBIT 2 188 189#define COSA_MTU 2000 /* FIXME: I don't know this exactly */ 190 191#undef DEBUG_DATA //1 /* Dump the data read or written to the channel */ 192#undef DEBUG_IRQS //1 /* Print the message when the IRQ is received */ 193#undef DEBUG_IO //1 /* Dump the I/O traffic */ 194 195#define TX_TIMEOUT (5 * HZ) 196 197/* Maybe the following should be allocated dynamically */ 198static struct cosa_data cosa_cards[MAX_CARDS]; 199static int nr_cards; 200 201#ifdef COSA_ISA_AUTOPROBE 202static int io[MAX_CARDS + 1] = {0x220, 0x228, 0x210, 0x218, 0,}; 203/* NOTE: DMA is not autoprobed!!! */ 204static int dma[MAX_CARDS + 1] = {1, 7, 1, 7, 1, 7, 1, 7, 0,}; 205#else 206static int io[MAX_CARDS + 1]; 207static int dma[MAX_CARDS + 1]; 208#endif 209/* IRQ can be safely autoprobed */ 210static int irq[MAX_CARDS + 1] = {-1, -1, -1, -1, -1, -1, 0,}; 211 212/* for class stuff*/ 213static struct class *cosa_class; 214 215#ifdef MODULE 216module_param_hw_array(io, int, ioport, NULL, 0); 217MODULE_PARM_DESC(io, "The I/O bases of the COSA or SRP cards"); 218module_param_hw_array(irq, int, irq, NULL, 0); 219MODULE_PARM_DESC(irq, "The IRQ lines of the COSA or SRP cards"); 220module_param_hw_array(dma, int, dma, NULL, 0); 221MODULE_PARM_DESC(dma, "The DMA channels of the COSA or SRP cards"); 222 223MODULE_AUTHOR("Jan \"Yenya\" Kasprzak, <kas@fi.muni.cz>"); 224MODULE_DESCRIPTION("Modular driver for the COSA or SRP synchronous card"); 225MODULE_LICENSE("GPL"); 226#endif 227 228/* I use this mainly for testing purposes */ 229#ifdef COSA_SLOW_IO 230#define cosa_outb outb_p 231#define cosa_outw outw_p 232#define cosa_inb inb_p 233#define cosa_inw inw_p 234#else 235#define cosa_outb outb 236#define cosa_outw outw 237#define cosa_inb inb 238#define cosa_inw inw 239#endif 240 241#define is_8bit(cosa) (!((cosa)->datareg & 0x08)) 242 243#define cosa_getstatus(cosa) (cosa_inb((cosa)->statusreg)) 244#define cosa_putstatus(cosa, stat) (cosa_outb(stat, (cosa)->statusreg)) 245#define cosa_getdata16(cosa) (cosa_inw((cosa)->datareg)) 246#define cosa_getdata8(cosa) (cosa_inb((cosa)->datareg)) 247#define cosa_putdata16(cosa, dt) (cosa_outw(dt, (cosa)->datareg)) 248#define cosa_putdata8(cosa, dt) (cosa_outb(dt, (cosa)->datareg)) 249 250/* Initialization stuff */ 251static int cosa_probe(int ioaddr, int irq, int dma); 252 253/* HW interface */ 254static void cosa_enable_rx(struct channel_data *chan); 255static void cosa_disable_rx(struct channel_data *chan); 256static int cosa_start_tx(struct channel_data *channel, char *buf, int size); 257static void cosa_kick(struct cosa_data *cosa); 258static int cosa_dma_able(struct channel_data *chan, char *buf, int data); 259 260/* Network device stuff */ 261static int cosa_net_attach(struct net_device *dev, unsigned short encoding, 262 unsigned short parity); 263static int cosa_net_open(struct net_device *d); 264static int cosa_net_close(struct net_device *d); 265static void cosa_net_timeout(struct net_device *d, unsigned int txqueue); 266static netdev_tx_t cosa_net_tx(struct sk_buff *skb, struct net_device *d); 267static char *cosa_net_setup_rx(struct channel_data *channel, int size); 268static int cosa_net_rx_done(struct channel_data *channel); 269static int cosa_net_tx_done(struct channel_data *channel, int size); 270 271/* Character device */ 272static char *chrdev_setup_rx(struct channel_data *channel, int size); 273static int chrdev_rx_done(struct channel_data *channel); 274static int chrdev_tx_done(struct channel_data *channel, int size); 275static ssize_t cosa_read(struct file *file, 276 char __user *buf, size_t count, loff_t *ppos); 277static ssize_t cosa_write(struct file *file, 278 const char __user *buf, size_t count, loff_t *ppos); 279static unsigned int cosa_poll(struct file *file, poll_table *poll); 280static int cosa_open(struct inode *inode, struct file *file); 281static int cosa_release(struct inode *inode, struct file *file); 282static long cosa_chardev_ioctl(struct file *file, unsigned int cmd, 283 unsigned long arg); 284#ifdef COSA_FASYNC_WORKING 285static int cosa_fasync(struct inode *inode, struct file *file, int on); 286#endif 287 288static const struct file_operations cosa_fops = { 289 .owner = THIS_MODULE, 290 .llseek = no_llseek, 291 .read = cosa_read, 292 .write = cosa_write, 293 .poll = cosa_poll, 294 .unlocked_ioctl = cosa_chardev_ioctl, 295 .open = cosa_open, 296 .release = cosa_release, 297#ifdef COSA_FASYNC_WORKING 298 .fasync = cosa_fasync, 299#endif 300}; 301 302/* Ioctls */ 303static int cosa_start(struct cosa_data *cosa, int address); 304static int cosa_reset(struct cosa_data *cosa); 305static int cosa_download(struct cosa_data *cosa, void __user *a); 306static int cosa_readmem(struct cosa_data *cosa, void __user *a); 307 308/* COSA/SRP ROM monitor */ 309static int download(struct cosa_data *cosa, const char __user *data, int addr, int len); 310static int startmicrocode(struct cosa_data *cosa, int address); 311static int readmem(struct cosa_data *cosa, char __user *data, int addr, int len); 312static int cosa_reset_and_read_id(struct cosa_data *cosa, char *id); 313 314/* Auxiliary functions */ 315static int get_wait_data(struct cosa_data *cosa); 316static int put_wait_data(struct cosa_data *cosa, int data); 317static int puthexnumber(struct cosa_data *cosa, int number); 318static void put_driver_status(struct cosa_data *cosa); 319static void put_driver_status_nolock(struct cosa_data *cosa); 320 321/* Interrupt handling */ 322static irqreturn_t cosa_interrupt(int irq, void *cosa); 323 324/* I/O ops debugging */ 325#ifdef DEBUG_IO 326static void debug_data_in(struct cosa_data *cosa, int data); 327static void debug_data_out(struct cosa_data *cosa, int data); 328static void debug_data_cmd(struct cosa_data *cosa, int data); 329static void debug_status_in(struct cosa_data *cosa, int status); 330static void debug_status_out(struct cosa_data *cosa, int status); 331#endif 332 333static inline struct channel_data *dev_to_chan(struct net_device *dev) 334{ 335 return (struct channel_data *)dev_to_hdlc(dev)->priv; 336} 337 338/* ---------- Initialization stuff ---------- */ 339 340static int __init cosa_init(void) 341{ 342 int i, err = 0; 343 344 if (cosa_major > 0) { 345 if (register_chrdev(cosa_major, "cosa", &cosa_fops)) { 346 pr_warn("unable to get major %d\n", cosa_major); 347 err = -EIO; 348 goto out; 349 } 350 } else { 351 cosa_major = register_chrdev(0, "cosa", &cosa_fops); 352 if (!cosa_major) { 353 pr_warn("unable to register chardev\n"); 354 err = -EIO; 355 goto out; 356 } 357 } 358 for (i = 0; i < MAX_CARDS; i++) 359 cosa_cards[i].num = -1; 360 for (i = 0; io[i] != 0 && i < MAX_CARDS; i++) 361 cosa_probe(io[i], irq[i], dma[i]); 362 if (!nr_cards) { 363 pr_warn("no devices found\n"); 364 unregister_chrdev(cosa_major, "cosa"); 365 err = -ENODEV; 366 goto out; 367 } 368 cosa_class = class_create(THIS_MODULE, "cosa"); 369 if (IS_ERR(cosa_class)) { 370 err = PTR_ERR(cosa_class); 371 goto out_chrdev; 372 } 373 for (i = 0; i < nr_cards; i++) 374 device_create(cosa_class, NULL, MKDEV(cosa_major, i), NULL, 375 "cosa%d", i); 376 err = 0; 377 goto out; 378 379out_chrdev: 380 unregister_chrdev(cosa_major, "cosa"); 381out: 382 return err; 383} 384module_init(cosa_init); 385 386static void __exit cosa_exit(void) 387{ 388 struct cosa_data *cosa; 389 int i; 390 391 for (i = 0; i < nr_cards; i++) 392 device_destroy(cosa_class, MKDEV(cosa_major, i)); 393 class_destroy(cosa_class); 394 395 for (cosa = cosa_cards; nr_cards--; cosa++) { 396 /* Clean up the per-channel data */ 397 for (i = 0; i < cosa->nchannels; i++) { 398 /* Chardev driver has no alloc'd per-channel data */ 399 unregister_hdlc_device(cosa->chan[i].netdev); 400 free_netdev(cosa->chan[i].netdev); 401 } 402 /* Clean up the per-card data */ 403 kfree(cosa->chan); 404 kfree(cosa->bouncebuf); 405 free_irq(cosa->irq, cosa); 406 free_dma(cosa->dma); 407 release_region(cosa->datareg, is_8bit(cosa) ? 2 : 4); 408 } 409 unregister_chrdev(cosa_major, "cosa"); 410} 411module_exit(cosa_exit); 412 413static const struct net_device_ops cosa_ops = { 414 .ndo_open = cosa_net_open, 415 .ndo_stop = cosa_net_close, 416 .ndo_start_xmit = hdlc_start_xmit, 417 .ndo_siocwandev = hdlc_ioctl, 418 .ndo_tx_timeout = cosa_net_timeout, 419}; 420 421static int cosa_probe(int base, int irq, int dma) 422{ 423 struct cosa_data *cosa = cosa_cards + nr_cards; 424 int i, err = 0; 425 426 memset(cosa, 0, sizeof(struct cosa_data)); 427 428 /* Checking validity of parameters: */ 429 /* IRQ should be 2-7 or 10-15; negative IRQ means autoprobe */ 430 if ((irq >= 0 && irq < 2) || irq > 15 || (irq < 10 && irq > 7)) { 431 pr_info("invalid IRQ %d\n", irq); 432 return -1; 433 } 434 /* I/O address should be between 0x100 and 0x3ff and should be 435 * multiple of 8. 436 */ 437 if (base < 0x100 || base > 0x3ff || base & 0x7) { 438 pr_info("invalid I/O address 0x%x\n", base); 439 return -1; 440 } 441 /* DMA should be 0,1 or 3-7 */ 442 if (dma < 0 || dma == 4 || dma > 7) { 443 pr_info("invalid DMA %d\n", dma); 444 return -1; 445 } 446 /* and finally, on 16-bit COSA DMA should be 4-7 and 447 * I/O base should not be multiple of 0x10 448 */ 449 if (((base & 0x8) && dma < 4) || (!(base & 0x8) && dma > 3)) { 450 pr_info("8/16 bit base and DMA mismatch (base=0x%x, dma=%d)\n", 451 base, dma); 452 return -1; 453 } 454 455 cosa->dma = dma; 456 cosa->datareg = base; 457 cosa->statusreg = is_8bit(cosa) ? base + 1 : base + 2; 458 spin_lock_init(&cosa->lock); 459 460 if (!request_region(base, is_8bit(cosa) ? 2 : 4, "cosa")) 461 return -1; 462 463 if (cosa_reset_and_read_id(cosa, cosa->id_string) < 0) { 464 printk(KERN_DEBUG "probe at 0x%x failed.\n", base); 465 err = -1; 466 goto err_out; 467 } 468 469 /* Test the validity of identification string */ 470 if (!strncmp(cosa->id_string, "SRP", 3)) { 471 cosa->type = "srp"; 472 } else if (!strncmp(cosa->id_string, "COSA", 4)) { 473 cosa->type = is_8bit(cosa) ? "cosa8" : "cosa16"; 474 } else { 475/* Print a warning only if we are not autoprobing */ 476#ifndef COSA_ISA_AUTOPROBE 477 pr_info("valid signature not found at 0x%x\n", base); 478#endif 479 err = -1; 480 goto err_out; 481 } 482 /* Update the name of the region now we know the type of card */ 483 release_region(base, is_8bit(cosa) ? 2 : 4); 484 if (!request_region(base, is_8bit(cosa) ? 2 : 4, cosa->type)) { 485 printk(KERN_DEBUG "changing name at 0x%x failed.\n", base); 486 return -1; 487 } 488 489 /* Now do IRQ autoprobe */ 490 if (irq < 0) { 491 unsigned long irqs; 492/* pr_info("IRQ autoprobe\n"); */ 493 irqs = probe_irq_on(); 494 /* Enable interrupt on tx buffer empty (it sure is) 495 * really sure ? 496 * FIXME: When this code is not used as module, we should 497 * probably call udelay() instead of the interruptible sleep. 498 */ 499 set_current_state(TASK_INTERRUPTIBLE); 500 cosa_putstatus(cosa, SR_TX_INT_ENA); 501 schedule_timeout(msecs_to_jiffies(300)); 502 irq = probe_irq_off(irqs); 503 /* Disable all IRQs from the card */ 504 cosa_putstatus(cosa, 0); 505 /* Empty the received data register */ 506 cosa_getdata8(cosa); 507 508 if (irq < 0) { 509 pr_info("multiple interrupts obtained (%d, board at 0x%x)\n", 510 irq, cosa->datareg); 511 err = -1; 512 goto err_out; 513 } 514 if (irq == 0) { 515 pr_info("no interrupt obtained (board at 0x%x)\n", 516 cosa->datareg); 517 /* return -1; */ 518 } 519 } 520 521 cosa->irq = irq; 522 cosa->num = nr_cards; 523 cosa->usage = 0; 524 cosa->nchannels = 2; /* FIXME: how to determine this? */ 525 526 if (request_irq(cosa->irq, cosa_interrupt, 0, cosa->type, cosa)) { 527 err = -1; 528 goto err_out; 529 } 530 if (request_dma(cosa->dma, cosa->type)) { 531 err = -1; 532 goto err_out1; 533 } 534 535 cosa->bouncebuf = kmalloc(COSA_MTU, GFP_KERNEL | GFP_DMA); 536 if (!cosa->bouncebuf) { 537 err = -ENOMEM; 538 goto err_out2; 539 } 540 sprintf(cosa->name, "cosa%d", cosa->num); 541 542 /* Initialize the per-channel data */ 543 cosa->chan = kcalloc(cosa->nchannels, sizeof(struct channel_data), GFP_KERNEL); 544 if (!cosa->chan) { 545 err = -ENOMEM; 546 goto err_out3; 547 } 548 549 for (i = 0; i < cosa->nchannels; i++) { 550 struct channel_data *chan = &cosa->chan[i]; 551 552 chan->cosa = cosa; 553 chan->num = i; 554 sprintf(chan->name, "cosa%dc%d", chan->cosa->num, i); 555 556 /* Initialize the chardev data structures */ 557 mutex_init(&chan->rlock); 558 sema_init(&chan->wsem, 1); 559 560 /* Register the network interface */ 561 chan->netdev = alloc_hdlcdev(chan); 562 if (!chan->netdev) { 563 pr_warn("%s: alloc_hdlcdev failed\n", chan->name); 564 err = -ENOMEM; 565 goto err_hdlcdev; 566 } 567 dev_to_hdlc(chan->netdev)->attach = cosa_net_attach; 568 dev_to_hdlc(chan->netdev)->xmit = cosa_net_tx; 569 chan->netdev->netdev_ops = &cosa_ops; 570 chan->netdev->watchdog_timeo = TX_TIMEOUT; 571 chan->netdev->base_addr = chan->cosa->datareg; 572 chan->netdev->irq = chan->cosa->irq; 573 chan->netdev->dma = chan->cosa->dma; 574 err = register_hdlc_device(chan->netdev); 575 if (err) { 576 netdev_warn(chan->netdev, 577 "register_hdlc_device() failed\n"); 578 free_netdev(chan->netdev); 579 goto err_hdlcdev; 580 } 581 } 582 583 pr_info("cosa%d: %s (%s at 0x%x irq %d dma %d), %d channels\n", 584 cosa->num, cosa->id_string, cosa->type, 585 cosa->datareg, cosa->irq, cosa->dma, cosa->nchannels); 586 587 return nr_cards++; 588 589err_hdlcdev: 590 while (i-- > 0) { 591 unregister_hdlc_device(cosa->chan[i].netdev); 592 free_netdev(cosa->chan[i].netdev); 593 } 594 kfree(cosa->chan); 595err_out3: 596 kfree(cosa->bouncebuf); 597err_out2: 598 free_dma(cosa->dma); 599err_out1: 600 free_irq(cosa->irq, cosa); 601err_out: 602 release_region(cosa->datareg, is_8bit(cosa) ? 2 : 4); 603 pr_notice("cosa%d: allocating resources failed\n", cosa->num); 604 return err; 605} 606 607/*---------- network device ---------- */ 608 609static int cosa_net_attach(struct net_device *dev, unsigned short encoding, 610 unsigned short parity) 611{ 612 if (encoding == ENCODING_NRZ && parity == PARITY_CRC16_PR1_CCITT) 613 return 0; 614 return -EINVAL; 615} 616 617static int cosa_net_open(struct net_device *dev) 618{ 619 struct channel_data *chan = dev_to_chan(dev); 620 int err; 621 unsigned long flags; 622 623 if (!(chan->cosa->firmware_status & COSA_FW_START)) { 624 pr_notice("%s: start the firmware first (status %d)\n", 625 chan->cosa->name, chan->cosa->firmware_status); 626 return -EPERM; 627 } 628 spin_lock_irqsave(&chan->cosa->lock, flags); 629 if (chan->usage != 0) { 630 pr_warn("%s: cosa_net_open called with usage count %d\n", 631 chan->name, chan->usage); 632 spin_unlock_irqrestore(&chan->cosa->lock, flags); 633 return -EBUSY; 634 } 635 chan->setup_rx = cosa_net_setup_rx; 636 chan->tx_done = cosa_net_tx_done; 637 chan->rx_done = cosa_net_rx_done; 638 chan->usage = -1; 639 chan->cosa->usage++; 640 spin_unlock_irqrestore(&chan->cosa->lock, flags); 641 642 err = hdlc_open(dev); 643 if (err) { 644 spin_lock_irqsave(&chan->cosa->lock, flags); 645 chan->usage = 0; 646 chan->cosa->usage--; 647 spin_unlock_irqrestore(&chan->cosa->lock, flags); 648 return err; 649 } 650 651 netif_start_queue(dev); 652 cosa_enable_rx(chan); 653 return 0; 654} 655 656static netdev_tx_t cosa_net_tx(struct sk_buff *skb, 657 struct net_device *dev) 658{ 659 struct channel_data *chan = dev_to_chan(dev); 660 661 netif_stop_queue(dev); 662 663 chan->tx_skb = skb; 664 cosa_start_tx(chan, skb->data, skb->len); 665 return NETDEV_TX_OK; 666} 667 668static void cosa_net_timeout(struct net_device *dev, unsigned int txqueue) 669{ 670 struct channel_data *chan = dev_to_chan(dev); 671 672 if (test_bit(RXBIT, &chan->cosa->rxtx)) { 673 chan->netdev->stats.rx_errors++; 674 chan->netdev->stats.rx_missed_errors++; 675 } else { 676 chan->netdev->stats.tx_errors++; 677 chan->netdev->stats.tx_aborted_errors++; 678 } 679 cosa_kick(chan->cosa); 680 if (chan->tx_skb) { 681 dev_kfree_skb(chan->tx_skb); 682 chan->tx_skb = NULL; 683 } 684 netif_wake_queue(dev); 685} 686 687static int cosa_net_close(struct net_device *dev) 688{ 689 struct channel_data *chan = dev_to_chan(dev); 690 unsigned long flags; 691 692 netif_stop_queue(dev); 693 hdlc_close(dev); 694 cosa_disable_rx(chan); 695 spin_lock_irqsave(&chan->cosa->lock, flags); 696 if (chan->rx_skb) { 697 kfree_skb(chan->rx_skb); 698 chan->rx_skb = NULL; 699 } 700 if (chan->tx_skb) { 701 kfree_skb(chan->tx_skb); 702 chan->tx_skb = NULL; 703 } 704 chan->usage = 0; 705 chan->cosa->usage--; 706 spin_unlock_irqrestore(&chan->cosa->lock, flags); 707 return 0; 708} 709 710static char *cosa_net_setup_rx(struct channel_data *chan, int size) 711{ 712 /* We can safely fall back to non-dma-able memory, because we have 713 * the cosa->bouncebuf pre-allocated. 714 */ 715 kfree_skb(chan->rx_skb); 716 chan->rx_skb = dev_alloc_skb(size); 717 if (!chan->rx_skb) { 718 pr_notice("%s: Memory squeeze, dropping packet\n", chan->name); 719 chan->netdev->stats.rx_dropped++; 720 return NULL; 721 } 722 netif_trans_update(chan->netdev); 723 return skb_put(chan->rx_skb, size); 724} 725 726static int cosa_net_rx_done(struct channel_data *chan) 727{ 728 if (!chan->rx_skb) { 729 pr_warn("%s: rx_done with empty skb!\n", chan->name); 730 chan->netdev->stats.rx_errors++; 731 chan->netdev->stats.rx_frame_errors++; 732 return 0; 733 } 734 chan->rx_skb->protocol = hdlc_type_trans(chan->rx_skb, chan->netdev); 735 chan->rx_skb->dev = chan->netdev; 736 skb_reset_mac_header(chan->rx_skb); 737 chan->netdev->stats.rx_packets++; 738 chan->netdev->stats.rx_bytes += chan->cosa->rxsize; 739 netif_rx(chan->rx_skb); 740 chan->rx_skb = NULL; 741 return 0; 742} 743 744/* ARGSUSED */ 745static int cosa_net_tx_done(struct channel_data *chan, int size) 746{ 747 if (!chan->tx_skb) { 748 pr_warn("%s: tx_done with empty skb!\n", chan->name); 749 chan->netdev->stats.tx_errors++; 750 chan->netdev->stats.tx_aborted_errors++; 751 return 1; 752 } 753 dev_consume_skb_irq(chan->tx_skb); 754 chan->tx_skb = NULL; 755 chan->netdev->stats.tx_packets++; 756 chan->netdev->stats.tx_bytes += size; 757 netif_wake_queue(chan->netdev); 758 return 1; 759} 760 761/*---------- Character device ---------- */ 762 763static ssize_t cosa_read(struct file *file, 764 char __user *buf, size_t count, loff_t *ppos) 765{ 766 DECLARE_WAITQUEUE(wait, current); 767 unsigned long flags; 768 struct channel_data *chan = file->private_data; 769 struct cosa_data *cosa = chan->cosa; 770 char *kbuf; 771 772 if (!(cosa->firmware_status & COSA_FW_START)) { 773 pr_notice("%s: start the firmware first (status %d)\n", 774 cosa->name, cosa->firmware_status); 775 return -EPERM; 776 } 777 if (mutex_lock_interruptible(&chan->rlock)) 778 return -ERESTARTSYS; 779 780 chan->rxdata = kmalloc(COSA_MTU, GFP_DMA | GFP_KERNEL); 781 if (!chan->rxdata) { 782 mutex_unlock(&chan->rlock); 783 return -ENOMEM; 784 } 785 786 chan->rx_status = 0; 787 cosa_enable_rx(chan); 788 spin_lock_irqsave(&cosa->lock, flags); 789 add_wait_queue(&chan->rxwaitq, &wait); 790 while (!chan->rx_status) { 791 set_current_state(TASK_INTERRUPTIBLE); 792 spin_unlock_irqrestore(&cosa->lock, flags); 793 schedule(); 794 spin_lock_irqsave(&cosa->lock, flags); 795 if (signal_pending(current) && chan->rx_status == 0) { 796 chan->rx_status = 1; 797 remove_wait_queue(&chan->rxwaitq, &wait); 798 __set_current_state(TASK_RUNNING); 799 spin_unlock_irqrestore(&cosa->lock, flags); 800 mutex_unlock(&chan->rlock); 801 return -ERESTARTSYS; 802 } 803 } 804 remove_wait_queue(&chan->rxwaitq, &wait); 805 __set_current_state(TASK_RUNNING); 806 kbuf = chan->rxdata; 807 count = chan->rxsize; 808 spin_unlock_irqrestore(&cosa->lock, flags); 809 mutex_unlock(&chan->rlock); 810 811 if (copy_to_user(buf, kbuf, count)) { 812 kfree(kbuf); 813 return -EFAULT; 814 } 815 kfree(kbuf); 816 return count; 817} 818 819static char *chrdev_setup_rx(struct channel_data *chan, int size) 820{ 821 /* Expect size <= COSA_MTU */ 822 chan->rxsize = size; 823 return chan->rxdata; 824} 825 826static int chrdev_rx_done(struct channel_data *chan) 827{ 828 if (chan->rx_status) { /* Reader has died */ 829 kfree(chan->rxdata); 830 up(&chan->wsem); 831 } 832 chan->rx_status = 1; 833 wake_up_interruptible(&chan->rxwaitq); 834 return 1; 835} 836 837static ssize_t cosa_write(struct file *file, 838 const char __user *buf, size_t count, loff_t *ppos) 839{ 840 DECLARE_WAITQUEUE(wait, current); 841 struct channel_data *chan = file->private_data; 842 struct cosa_data *cosa = chan->cosa; 843 unsigned long flags; 844 char *kbuf; 845 846 if (!(cosa->firmware_status & COSA_FW_START)) { 847 pr_notice("%s: start the firmware first (status %d)\n", 848 cosa->name, cosa->firmware_status); 849 return -EPERM; 850 } 851 if (down_interruptible(&chan->wsem)) 852 return -ERESTARTSYS; 853 854 if (count > COSA_MTU) 855 count = COSA_MTU; 856 857 /* Allocate the buffer */ 858 kbuf = kmalloc(count, GFP_KERNEL | GFP_DMA); 859 if (!kbuf) { 860 up(&chan->wsem); 861 return -ENOMEM; 862 } 863 if (copy_from_user(kbuf, buf, count)) { 864 up(&chan->wsem); 865 kfree(kbuf); 866 return -EFAULT; 867 } 868 chan->tx_status = 0; 869 cosa_start_tx(chan, kbuf, count); 870 871 spin_lock_irqsave(&cosa->lock, flags); 872 add_wait_queue(&chan->txwaitq, &wait); 873 while (!chan->tx_status) { 874 set_current_state(TASK_INTERRUPTIBLE); 875 spin_unlock_irqrestore(&cosa->lock, flags); 876 schedule(); 877 spin_lock_irqsave(&cosa->lock, flags); 878 if (signal_pending(current) && chan->tx_status == 0) { 879 chan->tx_status = 1; 880 remove_wait_queue(&chan->txwaitq, &wait); 881 __set_current_state(TASK_RUNNING); 882 chan->tx_status = 1; 883 spin_unlock_irqrestore(&cosa->lock, flags); 884 up(&chan->wsem); 885 kfree(kbuf); 886 return -ERESTARTSYS; 887 } 888 } 889 remove_wait_queue(&chan->txwaitq, &wait); 890 __set_current_state(TASK_RUNNING); 891 up(&chan->wsem); 892 spin_unlock_irqrestore(&cosa->lock, flags); 893 kfree(kbuf); 894 return count; 895} 896 897static int chrdev_tx_done(struct channel_data *chan, int size) 898{ 899 if (chan->tx_status) { /* Writer was interrupted */ 900 kfree(chan->txbuf); 901 up(&chan->wsem); 902 } 903 chan->tx_status = 1; 904 wake_up_interruptible(&chan->txwaitq); 905 return 1; 906} 907 908static __poll_t cosa_poll(struct file *file, poll_table *poll) 909{ 910 pr_info("cosa_poll is here\n"); 911 return 0; 912} 913 914static int cosa_open(struct inode *inode, struct file *file) 915{ 916 struct cosa_data *cosa; 917 struct channel_data *chan; 918 unsigned long flags; 919 int n; 920 int ret = 0; 921 922 mutex_lock(&cosa_chardev_mutex); 923 n = iminor(file_inode(file)) >> CARD_MINOR_BITS; 924 if (n >= nr_cards) { 925 ret = -ENODEV; 926 goto out; 927 } 928 cosa = cosa_cards + n; 929 930 n = iminor(file_inode(file)) & ((1 << CARD_MINOR_BITS) - 1); 931 if (n >= cosa->nchannels) { 932 ret = -ENODEV; 933 goto out; 934 } 935 chan = cosa->chan + n; 936 937 file->private_data = chan; 938 939 spin_lock_irqsave(&cosa->lock, flags); 940 941 if (chan->usage < 0) { /* in netdev mode */ 942 spin_unlock_irqrestore(&cosa->lock, flags); 943 ret = -EBUSY; 944 goto out; 945 } 946 cosa->usage++; 947 chan->usage++; 948 949 chan->tx_done = chrdev_tx_done; 950 chan->setup_rx = chrdev_setup_rx; 951 chan->rx_done = chrdev_rx_done; 952 spin_unlock_irqrestore(&cosa->lock, flags); 953out: 954 mutex_unlock(&cosa_chardev_mutex); 955 return ret; 956} 957 958static int cosa_release(struct inode *inode, struct file *file) 959{ 960 struct channel_data *channel = file->private_data; 961 struct cosa_data *cosa; 962 unsigned long flags; 963 964 cosa = channel->cosa; 965 spin_lock_irqsave(&cosa->lock, flags); 966 cosa->usage--; 967 channel->usage--; 968 spin_unlock_irqrestore(&cosa->lock, flags); 969 return 0; 970} 971 972#ifdef COSA_FASYNC_WORKING 973static struct fasync_struct *fasync[256] = { NULL, }; 974 975/* To be done ... */ 976static int cosa_fasync(struct inode *inode, struct file *file, int on) 977{ 978 int port = iminor(inode); 979 980 return fasync_helper(inode, file, on, &fasync[port]); 981} 982#endif 983 984/* ---------- Ioctls ---------- */ 985 986/* Ioctl subroutines can safely be made inline, because they are called 987 * only from cosa_ioctl(). 988 */ 989static inline int cosa_reset(struct cosa_data *cosa) 990{ 991 char idstring[COSA_MAX_ID_STRING]; 992 993 if (cosa->usage > 1) 994 pr_info("cosa%d: WARNING: reset requested with cosa->usage > 1 (%d). Odd things may happen.\n", 995 cosa->num, cosa->usage); 996 cosa->firmware_status &= ~(COSA_FW_RESET | COSA_FW_START); 997 if (cosa_reset_and_read_id(cosa, idstring) < 0) { 998 pr_notice("cosa%d: reset failed\n", cosa->num); 999 return -EIO; 1000 } 1001 pr_info("cosa%d: resetting device: %s\n", cosa->num, idstring); 1002 cosa->firmware_status |= COSA_FW_RESET; 1003 return 0; 1004} 1005 1006/* High-level function to download data into COSA memory. Calls download() */ 1007static inline int cosa_download(struct cosa_data *cosa, void __user *arg) 1008{ 1009 struct cosa_download d; 1010 int i; 1011 1012 if (cosa->usage > 1) 1013 pr_info("%s: WARNING: download of microcode requested with cosa->usage > 1 (%d). Odd things may happen.\n", 1014 cosa->name, cosa->usage); 1015 if (!(cosa->firmware_status & COSA_FW_RESET)) { 1016 pr_notice("%s: reset the card first (status %d)\n", 1017 cosa->name, cosa->firmware_status); 1018 return -EPERM; 1019 } 1020 1021 if (copy_from_user(&d, arg, sizeof(d))) 1022 return -EFAULT; 1023 1024 if (d.addr < 0 || d.addr > COSA_MAX_FIRMWARE_SIZE) 1025 return -EINVAL; 1026 if (d.len < 0 || d.len > COSA_MAX_FIRMWARE_SIZE) 1027 return -EINVAL; 1028 1029 /* If something fails, force the user to reset the card */ 1030 cosa->firmware_status &= ~(COSA_FW_RESET | COSA_FW_DOWNLOAD); 1031 1032 i = download(cosa, d.code, d.len, d.addr); 1033 if (i < 0) { 1034 pr_notice("cosa%d: microcode download failed: %d\n", 1035 cosa->num, i); 1036 return -EIO; 1037 } 1038 pr_info("cosa%d: downloading microcode - 0x%04x bytes at 0x%04x\n", 1039 cosa->num, d.len, d.addr); 1040 cosa->firmware_status |= COSA_FW_RESET | COSA_FW_DOWNLOAD; 1041 return 0; 1042} 1043 1044/* High-level function to read COSA memory. Calls readmem() */ 1045static inline int cosa_readmem(struct cosa_data *cosa, void __user *arg) 1046{ 1047 struct cosa_download d; 1048 int i; 1049 1050 if (cosa->usage > 1) 1051 pr_info("cosa%d: WARNING: readmem requested with cosa->usage > 1 (%d). Odd things may happen.\n", 1052 cosa->num, cosa->usage); 1053 if (!(cosa->firmware_status & COSA_FW_RESET)) { 1054 pr_notice("%s: reset the card first (status %d)\n", 1055 cosa->name, cosa->firmware_status); 1056 return -EPERM; 1057 } 1058 1059 if (copy_from_user(&d, arg, sizeof(d))) 1060 return -EFAULT; 1061 1062 /* If something fails, force the user to reset the card */ 1063 cosa->firmware_status &= ~COSA_FW_RESET; 1064 1065 i = readmem(cosa, d.code, d.len, d.addr); 1066 if (i < 0) { 1067 pr_notice("cosa%d: reading memory failed: %d\n", cosa->num, i); 1068 return -EIO; 1069 } 1070 pr_info("cosa%d: reading card memory - 0x%04x bytes at 0x%04x\n", 1071 cosa->num, d.len, d.addr); 1072 cosa->firmware_status |= COSA_FW_RESET; 1073 return 0; 1074} 1075 1076/* High-level function to start microcode. Calls startmicrocode(). */ 1077static inline int cosa_start(struct cosa_data *cosa, int address) 1078{ 1079 int i; 1080 1081 if (cosa->usage > 1) 1082 pr_info("cosa%d: WARNING: start microcode requested with cosa->usage > 1 (%d). Odd things may happen.\n", 1083 cosa->num, cosa->usage); 1084 1085 if ((cosa->firmware_status & (COSA_FW_RESET | COSA_FW_DOWNLOAD)) 1086 != (COSA_FW_RESET | COSA_FW_DOWNLOAD)) { 1087 pr_notice("%s: download the microcode and/or reset the card first (status %d)\n", 1088 cosa->name, cosa->firmware_status); 1089 return -EPERM; 1090 } 1091 cosa->firmware_status &= ~COSA_FW_RESET; 1092 i = startmicrocode(cosa, address); 1093 if (i < 0) { 1094 pr_notice("cosa%d: start microcode at 0x%04x failed: %d\n", 1095 cosa->num, address, i); 1096 return -EIO; 1097 } 1098 pr_info("cosa%d: starting microcode at 0x%04x\n", cosa->num, address); 1099 cosa->startaddr = address; 1100 cosa->firmware_status |= COSA_FW_START; 1101 return 0; 1102} 1103 1104/* Buffer of size at least COSA_MAX_ID_STRING is expected */ 1105static inline int cosa_getidstr(struct cosa_data *cosa, char __user *string) 1106{ 1107 int l = strlen(cosa->id_string) + 1; 1108 1109 if (copy_to_user(string, cosa->id_string, l)) 1110 return -EFAULT; 1111 return l; 1112} 1113 1114/* Buffer of size at least COSA_MAX_ID_STRING is expected */ 1115static inline int cosa_gettype(struct cosa_data *cosa, char __user *string) 1116{ 1117 int l = strlen(cosa->type) + 1; 1118 1119 if (copy_to_user(string, cosa->type, l)) 1120 return -EFAULT; 1121 return l; 1122} 1123 1124static int cosa_ioctl_common(struct cosa_data *cosa, 1125 struct channel_data *channel, unsigned int cmd, 1126 unsigned long arg) 1127{ 1128 void __user *argp = (void __user *)arg; 1129 1130 switch (cmd) { 1131 case COSAIORSET: /* Reset the device */ 1132 if (!capable(CAP_NET_ADMIN)) 1133 return -EACCES; 1134 return cosa_reset(cosa); 1135 case COSAIOSTRT: /* Start the firmware */ 1136 if (!capable(CAP_SYS_RAWIO)) 1137 return -EACCES; 1138 return cosa_start(cosa, arg); 1139 case COSAIODOWNLD: /* Download the firmware */ 1140 if (!capable(CAP_SYS_RAWIO)) 1141 return -EACCES; 1142 1143 return cosa_download(cosa, argp); 1144 case COSAIORMEM: 1145 if (!capable(CAP_SYS_RAWIO)) 1146 return -EACCES; 1147 return cosa_readmem(cosa, argp); 1148 case COSAIORTYPE: 1149 return cosa_gettype(cosa, argp); 1150 case COSAIORIDSTR: 1151 return cosa_getidstr(cosa, argp); 1152 case COSAIONRCARDS: 1153 return nr_cards; 1154 case COSAIONRCHANS: 1155 return cosa->nchannels; 1156 case COSAIOBMSET: 1157 if (!capable(CAP_SYS_RAWIO)) 1158 return -EACCES; 1159 if (is_8bit(cosa)) 1160 return -EINVAL; 1161 if (arg != COSA_BM_OFF && arg != COSA_BM_ON) 1162 return -EINVAL; 1163 cosa->busmaster = arg; 1164 return 0; 1165 case COSAIOBMGET: 1166 return cosa->busmaster; 1167 } 1168 return -ENOIOCTLCMD; 1169} 1170 1171static long cosa_chardev_ioctl(struct file *file, unsigned int cmd, 1172 unsigned long arg) 1173{ 1174 struct channel_data *channel = file->private_data; 1175 struct cosa_data *cosa; 1176 long ret; 1177 1178 mutex_lock(&cosa_chardev_mutex); 1179 cosa = channel->cosa; 1180 ret = cosa_ioctl_common(cosa, channel, cmd, arg); 1181 mutex_unlock(&cosa_chardev_mutex); 1182 return ret; 1183} 1184 1185/*---------- HW layer interface ---------- */ 1186 1187/* The higher layer can bind itself to the HW layer by setting the callbacks 1188 * in the channel_data structure and by using these routines. 1189 */ 1190static void cosa_enable_rx(struct channel_data *chan) 1191{ 1192 struct cosa_data *cosa = chan->cosa; 1193 1194 if (!test_and_set_bit(chan->num, &cosa->rxbitmap)) 1195 put_driver_status(cosa); 1196} 1197 1198static void cosa_disable_rx(struct channel_data *chan) 1199{ 1200 struct cosa_data *cosa = chan->cosa; 1201 1202 if (test_and_clear_bit(chan->num, &cosa->rxbitmap)) 1203 put_driver_status(cosa); 1204} 1205 1206/* FIXME: This routine probably should check for cosa_start_tx() called when 1207 * the previous transmit is still unfinished. In this case the non-zero 1208 * return value should indicate to the caller that the queuing(sp?) up 1209 * the transmit has failed. 1210 */ 1211static int cosa_start_tx(struct channel_data *chan, char *buf, int len) 1212{ 1213 struct cosa_data *cosa = chan->cosa; 1214 unsigned long flags; 1215#ifdef DEBUG_DATA 1216 int i; 1217 1218 pr_info("cosa%dc%d: starting tx(0x%x)", 1219 chan->cosa->num, chan->num, len); 1220 for (i = 0; i < len; i++) 1221 pr_cont(" %02x", buf[i]&0xff); 1222 pr_cont("\n"); 1223#endif 1224 spin_lock_irqsave(&cosa->lock, flags); 1225 chan->txbuf = buf; 1226 chan->txsize = len; 1227 if (len > COSA_MTU) 1228 chan->txsize = COSA_MTU; 1229 spin_unlock_irqrestore(&cosa->lock, flags); 1230 1231 /* Tell the firmware we are ready */ 1232 set_bit(chan->num, &cosa->txbitmap); 1233 put_driver_status(cosa); 1234 1235 return 0; 1236} 1237 1238static void put_driver_status(struct cosa_data *cosa) 1239{ 1240 unsigned long flags; 1241 int status; 1242 1243 spin_lock_irqsave(&cosa->lock, flags); 1244 1245 status = (cosa->rxbitmap ? DRIVER_RX_READY : 0) 1246 | (cosa->txbitmap ? DRIVER_TX_READY : 0) 1247 | (cosa->txbitmap ? ~(cosa->txbitmap << DRIVER_TXMAP_SHIFT) 1248 & DRIVER_TXMAP_MASK : 0); 1249 if (!cosa->rxtx) { 1250 if (cosa->rxbitmap | cosa->txbitmap) { 1251 if (!cosa->enabled) { 1252 cosa_putstatus(cosa, SR_RX_INT_ENA); 1253#ifdef DEBUG_IO 1254 debug_status_out(cosa, SR_RX_INT_ENA); 1255#endif 1256 cosa->enabled = 1; 1257 } 1258 } else if (cosa->enabled) { 1259 cosa->enabled = 0; 1260 cosa_putstatus(cosa, 0); 1261#ifdef DEBUG_IO 1262 debug_status_out(cosa, 0); 1263#endif 1264 } 1265 cosa_putdata8(cosa, status); 1266#ifdef DEBUG_IO 1267 debug_data_cmd(cosa, status); 1268#endif 1269 } 1270 spin_unlock_irqrestore(&cosa->lock, flags); 1271} 1272 1273static void put_driver_status_nolock(struct cosa_data *cosa) 1274{ 1275 int status; 1276 1277 status = (cosa->rxbitmap ? DRIVER_RX_READY : 0) 1278 | (cosa->txbitmap ? DRIVER_TX_READY : 0) 1279 | (cosa->txbitmap ? ~(cosa->txbitmap << DRIVER_TXMAP_SHIFT) 1280 & DRIVER_TXMAP_MASK : 0); 1281 1282 if (cosa->rxbitmap | cosa->txbitmap) { 1283 cosa_putstatus(cosa, SR_RX_INT_ENA); 1284#ifdef DEBUG_IO 1285 debug_status_out(cosa, SR_RX_INT_ENA); 1286#endif 1287 cosa->enabled = 1; 1288 } else { 1289 cosa_putstatus(cosa, 0); 1290#ifdef DEBUG_IO 1291 debug_status_out(cosa, 0); 1292#endif 1293 cosa->enabled = 0; 1294 } 1295 cosa_putdata8(cosa, status); 1296#ifdef DEBUG_IO 1297 debug_data_cmd(cosa, status); 1298#endif 1299} 1300 1301/* The "kickme" function: When the DMA times out, this is called to 1302 * clean up the driver status. 1303 * FIXME: Preliminary support, the interface is probably wrong. 1304 */ 1305static void cosa_kick(struct cosa_data *cosa) 1306{ 1307 unsigned long flags, flags1; 1308 char *s = "(probably) IRQ"; 1309 1310 if (test_bit(RXBIT, &cosa->rxtx)) 1311 s = "RX DMA"; 1312 if (test_bit(TXBIT, &cosa->rxtx)) 1313 s = "TX DMA"; 1314 1315 pr_info("%s: %s timeout - restarting\n", cosa->name, s); 1316 spin_lock_irqsave(&cosa->lock, flags); 1317 cosa->rxtx = 0; 1318 1319 flags1 = claim_dma_lock(); 1320 disable_dma(cosa->dma); 1321 clear_dma_ff(cosa->dma); 1322 release_dma_lock(flags1); 1323 1324 /* FIXME: Anything else? */ 1325 udelay(100); 1326 cosa_putstatus(cosa, 0); 1327 udelay(100); 1328 (void)cosa_getdata8(cosa); 1329 udelay(100); 1330 cosa_putdata8(cosa, 0); 1331 udelay(100); 1332 put_driver_status_nolock(cosa); 1333 spin_unlock_irqrestore(&cosa->lock, flags); 1334} 1335 1336/* Check if the whole buffer is DMA-able. It means it is below the 16M of 1337 * physical memory and doesn't span the 64k boundary. For now it seems 1338 * SKB's never do this, but we'll check this anyway. 1339 */ 1340static int cosa_dma_able(struct channel_data *chan, char *buf, int len) 1341{ 1342 static int count; 1343 unsigned long b = (unsigned long)buf; 1344 1345 if (b + len >= MAX_DMA_ADDRESS) 1346 return 0; 1347 if ((b ^ (b + len)) & 0x10000) { 1348 if (count++ < 5) 1349 pr_info("%s: packet spanning a 64k boundary\n", 1350 chan->name); 1351 return 0; 1352 } 1353 return 1; 1354} 1355 1356/* ---------- The SRP/COSA ROM monitor functions ---------- */ 1357 1358/* Downloading SRP microcode: say "w" to SRP monitor, it answers by "w=", 1359 * drivers need to say 4-digit hex number meaning start address of the microcode 1360 * separated by a single space. Monitor replies by saying " =". Now driver 1361 * has to write 4-digit hex number meaning the last byte address ended 1362 * by a single space. Monitor has to reply with a space. Now the download 1363 * begins. After the download monitor replies with "\r\n." (CR LF dot). 1364 */ 1365static int download(struct cosa_data *cosa, const char __user *microcode, int length, int address) 1366{ 1367 int i; 1368 1369 if (put_wait_data(cosa, 'w') == -1) 1370 return -1; 1371 if ((i=get_wait_data(cosa)) != 'w') { printk("dnld: 0x%04x\n",i); return -2;} 1372 if (get_wait_data(cosa) != '=') 1373 return -3; 1374 1375 if (puthexnumber(cosa, address) < 0) 1376 return -4; 1377 if (put_wait_data(cosa, ' ') == -1) 1378 return -10; 1379 if (get_wait_data(cosa) != ' ') 1380 return -11; 1381 if (get_wait_data(cosa) != '=') 1382 return -12; 1383 1384 if (puthexnumber(cosa, address + length - 1) < 0) 1385 return -13; 1386 if (put_wait_data(cosa, ' ') == -1) 1387 return -18; 1388 if (get_wait_data(cosa) != ' ') 1389 return -19; 1390 1391 while (length--) { 1392 char c; 1393#ifndef SRP_DOWNLOAD_AT_BOOT 1394 if (get_user(c, microcode)) 1395 return -23; /* ??? */ 1396#else 1397 c = *microcode; 1398#endif 1399 if (put_wait_data(cosa, c) == -1) 1400 return -20; 1401 microcode++; 1402 } 1403 1404 if (get_wait_data(cosa) != '\r') 1405 return -21; 1406 if (get_wait_data(cosa) != '\n') 1407 return -22; 1408 if (get_wait_data(cosa) != '.') 1409 return -23; 1410#if 0 1411 printk(KERN_DEBUG "cosa%d: download completed.\n", cosa->num); 1412#endif 1413 return 0; 1414} 1415 1416/* Starting microcode is done via the "g" command of the SRP monitor. 1417 * The chat should be the following: "g" "g=" "<addr><CR>" 1418 * "<CR><CR><LF><CR><LF>". 1419 */ 1420static int startmicrocode(struct cosa_data *cosa, int address) 1421{ 1422 if (put_wait_data(cosa, 'g') == -1) 1423 return -1; 1424 if (get_wait_data(cosa) != 'g') 1425 return -2; 1426 if (get_wait_data(cosa) != '=') 1427 return -3; 1428 1429 if (puthexnumber(cosa, address) < 0) 1430 return -4; 1431 if (put_wait_data(cosa, '\r') == -1) 1432 return -5; 1433 1434 if (get_wait_data(cosa) != '\r') 1435 return -6; 1436 if (get_wait_data(cosa) != '\r') 1437 return -7; 1438 if (get_wait_data(cosa) != '\n') 1439 return -8; 1440 if (get_wait_data(cosa) != '\r') 1441 return -9; 1442 if (get_wait_data(cosa) != '\n') 1443 return -10; 1444#if 0 1445 printk(KERN_DEBUG "cosa%d: microcode started\n", cosa->num); 1446#endif 1447 return 0; 1448} 1449 1450/* Reading memory is done via the "r" command of the SRP monitor. 1451 * The chat is the following "r" "r=" "<addr> " " =" "<last_byte> " " " 1452 * Then driver can read the data and the conversation is finished 1453 * by SRP monitor sending "<CR><LF>." (dot at the end). 1454 * 1455 * This routine is not needed during the normal operation and serves 1456 * for debugging purposes only. 1457 */ 1458static int readmem(struct cosa_data *cosa, char __user *microcode, int length, int address) 1459{ 1460 if (put_wait_data(cosa, 'r') == -1) 1461 return -1; 1462 if ((get_wait_data(cosa)) != 'r') 1463 return -2; 1464 if ((get_wait_data(cosa)) != '=') 1465 return -3; 1466 1467 if (puthexnumber(cosa, address) < 0) 1468 return -4; 1469 if (put_wait_data(cosa, ' ') == -1) 1470 return -5; 1471 if (get_wait_data(cosa) != ' ') 1472 return -6; 1473 if (get_wait_data(cosa) != '=') 1474 return -7; 1475 1476 if (puthexnumber(cosa, address + length - 1) < 0) 1477 return -8; 1478 if (put_wait_data(cosa, ' ') == -1) 1479 return -9; 1480 if (get_wait_data(cosa) != ' ') 1481 return -10; 1482 1483 while (length--) { 1484 char c; 1485 int i; 1486 1487 i = get_wait_data(cosa); 1488 if (i == -1) { 1489 pr_info("0x%04x bytes remaining\n", length); 1490 return -11; 1491 } 1492 c = i; 1493#if 1 1494 if (put_user(c, microcode)) 1495 return -23; /* ??? */ 1496#else 1497 *microcode = c; 1498#endif 1499 microcode++; 1500 } 1501 1502 if (get_wait_data(cosa) != '\r') 1503 return -21; 1504 if (get_wait_data(cosa) != '\n') 1505 return -22; 1506 if (get_wait_data(cosa) != '.') 1507 return -23; 1508#if 0 1509 printk(KERN_DEBUG "cosa%d: readmem completed.\n", cosa->num); 1510#endif 1511 return 0; 1512} 1513 1514/* This function resets the device and reads the initial prompt 1515 * of the device's ROM monitor. 1516 */ 1517static int cosa_reset_and_read_id(struct cosa_data *cosa, char *idstring) 1518{ 1519 int i = 0, id = 0, prev = 0, curr = 0; 1520 1521 /* Reset the card ... */ 1522 cosa_putstatus(cosa, 0); 1523 cosa_getdata8(cosa); 1524 cosa_putstatus(cosa, SR_RST); 1525 msleep(500); 1526 /* Disable all IRQs from the card */ 1527 cosa_putstatus(cosa, 0); 1528 1529 /* Try to read the ID string. The card then prints out the 1530 * identification string ended by the "\n\x2e". 1531 * 1532 * The following loop is indexed through i (instead of id) 1533 * to avoid looping forever when for any reason 1534 * the port returns '\r', '\n' or '\x2e' permanently. 1535 */ 1536 for (i = 0; i < COSA_MAX_ID_STRING - 1; i++, prev = curr) { 1537 curr = get_wait_data(cosa); 1538 if (curr == -1) 1539 return -1; 1540 1541 curr &= 0xff; 1542 if (curr != '\r' && curr != '\n' && curr != 0x2e) 1543 idstring[id++] = curr; 1544 if (curr == 0x2e && prev == '\n') 1545 break; 1546 } 1547 /* Perhaps we should fail when i==COSA_MAX_ID_STRING-1 ? */ 1548 idstring[id] = '\0'; 1549 return id; 1550} 1551 1552/* ---------- Auxiliary routines for COSA/SRP monitor ---------- */ 1553 1554/* This routine gets the data byte from the card waiting for the SR_RX_RDY 1555 * bit to be set in a loop. It should be used in the exceptional cases 1556 * only (for example when resetting the card or downloading the firmware. 1557 */ 1558static int get_wait_data(struct cosa_data *cosa) 1559{ 1560 int retries = 1000; 1561 1562 while (--retries) { 1563 /* read data and return them */ 1564 if (cosa_getstatus(cosa) & SR_RX_RDY) { 1565 short r; 1566 1567 r = cosa_getdata8(cosa); 1568#if 0 1569 pr_info("get_wait_data returning after %d retries\n", 1570 999 - retries); 1571#endif 1572 return r; 1573 } 1574 /* sleep if not ready to read */ 1575 schedule_timeout_interruptible(1); 1576 } 1577 pr_info("timeout in get_wait_data (status 0x%x)\n", 1578 cosa_getstatus(cosa)); 1579 return -1; 1580} 1581 1582/* This routine puts the data byte to the card waiting for the SR_TX_RDY 1583 * bit to be set in a loop. It should be used in the exceptional cases 1584 * only (for example when resetting the card or downloading the firmware). 1585 */ 1586static int put_wait_data(struct cosa_data *cosa, int data) 1587{ 1588 int retries = 1000; 1589 1590 while (--retries) { 1591 /* read data and return them */ 1592 if (cosa_getstatus(cosa) & SR_TX_RDY) { 1593 cosa_putdata8(cosa, data); 1594#if 0 1595 pr_info("Putdata: %d retries\n", 999 - retries); 1596#endif 1597 return 0; 1598 } 1599#if 0 1600 /* sleep if not ready to read */ 1601 schedule_timeout_interruptible(1); 1602#endif 1603 } 1604 pr_info("cosa%d: timeout in put_wait_data (status 0x%x)\n", 1605 cosa->num, cosa_getstatus(cosa)); 1606 return -1; 1607} 1608 1609/* The following routine puts the hexadecimal number into the SRP monitor 1610 * and verifies the proper echo of the sent bytes. Returns 0 on success, 1611 * negative number on failure (-1,-3,-5,-7) means that put_wait_data() failed, 1612 * (-2,-4,-6,-8) means that reading echo failed. 1613 */ 1614static int puthexnumber(struct cosa_data *cosa, int number) 1615{ 1616 char temp[5]; 1617 int i; 1618 1619 /* Well, I should probably replace this by something faster. */ 1620 sprintf(temp, "%04X", number); 1621 for (i = 0; i < 4; i++) { 1622 if (put_wait_data(cosa, temp[i]) == -1) { 1623 pr_notice("cosa%d: puthexnumber failed to write byte %d\n", 1624 cosa->num, i); 1625 return -1 - 2 * i; 1626 } 1627 if (get_wait_data(cosa) != temp[i]) { 1628 pr_notice("cosa%d: puthexhumber failed to read echo of byte %d\n", 1629 cosa->num, i); 1630 return -2 - 2 * i; 1631 } 1632 } 1633 return 0; 1634} 1635 1636/* ---------- Interrupt routines ---------- */ 1637 1638/* There are three types of interrupt: 1639 * At the beginning of transmit - this handled is in tx_interrupt(), 1640 * at the beginning of receive - it is in rx_interrupt() and 1641 * at the end of transmit/receive - it is the eot_interrupt() function. 1642 * These functions are multiplexed by cosa_interrupt() according to the 1643 * COSA status byte. I have moved the rx/tx/eot interrupt handling into 1644 * separate functions to make it more readable. These functions are inline, 1645 * so there should be no overhead of function call. 1646 * 1647 * In the COSA bus-master mode, we need to tell the card the address of a 1648 * buffer. Unfortunately, COSA may be too slow for us, so we must busy-wait. 1649 * It's time to use the bottom half :-( 1650 */ 1651 1652/* Transmit interrupt routine - called when COSA is willing to obtain 1653 * data from the OS. The most tricky part of the routine is selection 1654 * of channel we (OS) want to send packet for. For SRP we should probably 1655 * use the round-robin approach. The newer COSA firmwares have a simple 1656 * flow-control - in the status word has bits 2 and 3 set to 1 means that the 1657 * channel 0 or 1 doesn't want to receive data. 1658 * 1659 * It seems there is a bug in COSA firmware (need to trace it further): 1660 * When the driver status says that the kernel has no more data for transmit 1661 * (e.g. at the end of TX DMA) and then the kernel changes its mind 1662 * (e.g. new packet is queued to hard_start_xmit()), the card issues 1663 * the TX interrupt but does not mark the channel as ready-to-transmit. 1664 * The fix seems to be to push the packet to COSA despite its request. 1665 * We first try to obey the card's opinion, and then fall back to forced TX. 1666 */ 1667static inline void tx_interrupt(struct cosa_data *cosa, int status) 1668{ 1669 unsigned long flags, flags1; 1670#ifdef DEBUG_IRQS 1671 pr_info("cosa%d: SR_DOWN_REQUEST status=0x%04x\n", cosa->num, status); 1672#endif 1673 spin_lock_irqsave(&cosa->lock, flags); 1674 set_bit(TXBIT, &cosa->rxtx); 1675 if (!test_bit(IRQBIT, &cosa->rxtx)) { 1676 /* flow control, see the comment above */ 1677 int i = 0; 1678 1679 if (!cosa->txbitmap) { 1680 pr_warn("%s: No channel wants data in TX IRQ. Expect DMA timeout.\n", 1681 cosa->name); 1682 put_driver_status_nolock(cosa); 1683 clear_bit(TXBIT, &cosa->rxtx); 1684 spin_unlock_irqrestore(&cosa->lock, flags); 1685 return; 1686 } 1687 while (1) { 1688 cosa->txchan++; 1689 i++; 1690 if (cosa->txchan >= cosa->nchannels) 1691 cosa->txchan = 0; 1692 if (!(cosa->txbitmap & (1 << cosa->txchan))) 1693 continue; 1694 if (~status & 1695 (1 << (cosa->txchan + DRIVER_TXMAP_SHIFT))) 1696 break; 1697 /* in second pass, accept first ready-to-TX channel */ 1698 if (i > cosa->nchannels) { 1699 /* Can be safely ignored */ 1700#ifdef DEBUG_IRQS 1701 printk(KERN_DEBUG "%s: Forcing TX " 1702 "to not-ready channel %d\n", 1703 cosa->name, cosa->txchan); 1704#endif 1705 break; 1706 } 1707 } 1708 1709 cosa->txsize = cosa->chan[cosa->txchan].txsize; 1710 if (cosa_dma_able(cosa->chan + cosa->txchan, 1711 cosa->chan[cosa->txchan].txbuf, 1712 cosa->txsize)) { 1713 cosa->txbuf = cosa->chan[cosa->txchan].txbuf; 1714 } else { 1715 memcpy(cosa->bouncebuf, cosa->chan[cosa->txchan].txbuf, 1716 cosa->txsize); 1717 cosa->txbuf = cosa->bouncebuf; 1718 } 1719 } 1720 1721 if (is_8bit(cosa)) { 1722 if (!test_bit(IRQBIT, &cosa->rxtx)) { 1723 cosa_putstatus(cosa, SR_TX_INT_ENA); 1724 cosa_putdata8(cosa, ((cosa->txchan << 5) & 0xe0) | 1725 ((cosa->txsize >> 8) & 0x1f)); 1726#ifdef DEBUG_IO 1727 debug_status_out(cosa, SR_TX_INT_ENA); 1728 debug_data_out(cosa, ((cosa->txchan << 5) & 0xe0) | 1729 ((cosa->txsize >> 8) & 0x1f)); 1730 debug_data_in(cosa, cosa_getdata8(cosa)); 1731#else 1732 cosa_getdata8(cosa); 1733#endif 1734 set_bit(IRQBIT, &cosa->rxtx); 1735 spin_unlock_irqrestore(&cosa->lock, flags); 1736 return; 1737 } else { 1738 clear_bit(IRQBIT, &cosa->rxtx); 1739 cosa_putstatus(cosa, 0); 1740 cosa_putdata8(cosa, cosa->txsize & 0xff); 1741#ifdef DEBUG_IO 1742 debug_status_out(cosa, 0); 1743 debug_data_out(cosa, cosa->txsize & 0xff); 1744#endif 1745 } 1746 } else { 1747 cosa_putstatus(cosa, SR_TX_INT_ENA); 1748 cosa_putdata16(cosa, ((cosa->txchan << 13) & 0xe000) 1749 | (cosa->txsize & 0x1fff)); 1750#ifdef DEBUG_IO 1751 debug_status_out(cosa, SR_TX_INT_ENA); 1752 debug_data_out(cosa, ((cosa->txchan << 13) & 0xe000) | 1753 (cosa->txsize & 0x1fff)); 1754 debug_data_in(cosa, cosa_getdata8(cosa)); 1755 debug_status_out(cosa, 0); 1756#else 1757 cosa_getdata8(cosa); 1758#endif 1759 cosa_putstatus(cosa, 0); 1760 } 1761 1762 if (cosa->busmaster) { 1763 unsigned long addr = virt_to_bus(cosa->txbuf); 1764 int count = 0; 1765 1766 pr_info("busmaster IRQ\n"); 1767 while (!(cosa_getstatus(cosa) & SR_TX_RDY)) { 1768 count++; 1769 udelay(10); 1770 if (count > 1000) 1771 break; 1772 } 1773 pr_info("status %x\n", cosa_getstatus(cosa)); 1774 pr_info("ready after %d loops\n", count); 1775 cosa_putdata16(cosa, (addr >> 16) & 0xffff); 1776 1777 count = 0; 1778 while (!(cosa_getstatus(cosa) & SR_TX_RDY)) { 1779 count++; 1780 if (count > 1000) 1781 break; 1782 udelay(10); 1783 } 1784 pr_info("ready after %d loops\n", count); 1785 cosa_putdata16(cosa, addr & 0xffff); 1786 flags1 = claim_dma_lock(); 1787 set_dma_mode(cosa->dma, DMA_MODE_CASCADE); 1788 enable_dma(cosa->dma); 1789 release_dma_lock(flags1); 1790 } else { 1791 /* start the DMA */ 1792 flags1 = claim_dma_lock(); 1793 disable_dma(cosa->dma); 1794 clear_dma_ff(cosa->dma); 1795 set_dma_mode(cosa->dma, DMA_MODE_WRITE); 1796 set_dma_addr(cosa->dma, virt_to_bus(cosa->txbuf)); 1797 set_dma_count(cosa->dma, cosa->txsize); 1798 enable_dma(cosa->dma); 1799 release_dma_lock(flags1); 1800 } 1801 cosa_putstatus(cosa, SR_TX_DMA_ENA | SR_USR_INT_ENA); 1802#ifdef DEBUG_IO 1803 debug_status_out(cosa, SR_TX_DMA_ENA | SR_USR_INT_ENA); 1804#endif 1805 spin_unlock_irqrestore(&cosa->lock, flags); 1806} 1807 1808static inline void rx_interrupt(struct cosa_data *cosa, int status) 1809{ 1810 unsigned long flags; 1811#ifdef DEBUG_IRQS 1812 pr_info("cosa%d: SR_UP_REQUEST\n", cosa->num); 1813#endif 1814 1815 spin_lock_irqsave(&cosa->lock, flags); 1816 set_bit(RXBIT, &cosa->rxtx); 1817 1818 if (is_8bit(cosa)) { 1819 if (!test_bit(IRQBIT, &cosa->rxtx)) { 1820 set_bit(IRQBIT, &cosa->rxtx); 1821 put_driver_status_nolock(cosa); 1822 cosa->rxsize = cosa_getdata8(cosa) << 8; 1823#ifdef DEBUG_IO 1824 debug_data_in(cosa, cosa->rxsize >> 8); 1825#endif 1826 spin_unlock_irqrestore(&cosa->lock, flags); 1827 return; 1828 } else { 1829 clear_bit(IRQBIT, &cosa->rxtx); 1830 cosa->rxsize |= cosa_getdata8(cosa) & 0xff; 1831#ifdef DEBUG_IO 1832 debug_data_in(cosa, cosa->rxsize & 0xff); 1833#endif 1834#if 0 1835 pr_info("cosa%d: receive rxsize = (0x%04x)\n", 1836 cosa->num, cosa->rxsize); 1837#endif 1838 } 1839 } else { 1840 cosa->rxsize = cosa_getdata16(cosa); 1841#ifdef DEBUG_IO 1842 debug_data_in(cosa, cosa->rxsize); 1843#endif 1844#if 0 1845 pr_info("cosa%d: receive rxsize = (0x%04x)\n", 1846 cosa->num, cosa->rxsize); 1847#endif 1848 } 1849 if (((cosa->rxsize & 0xe000) >> 13) >= cosa->nchannels) { 1850 pr_warn("%s: rx for unknown channel (0x%04x)\n", 1851 cosa->name, cosa->rxsize); 1852 spin_unlock_irqrestore(&cosa->lock, flags); 1853 goto reject; 1854 } 1855 cosa->rxchan = cosa->chan + ((cosa->rxsize & 0xe000) >> 13); 1856 cosa->rxsize &= 0x1fff; 1857 spin_unlock_irqrestore(&cosa->lock, flags); 1858 1859 cosa->rxbuf = NULL; 1860 if (cosa->rxchan->setup_rx) 1861 cosa->rxbuf = cosa->rxchan->setup_rx(cosa->rxchan, cosa->rxsize); 1862 1863 if (!cosa->rxbuf) { 1864reject: /* Reject the packet */ 1865 pr_info("cosa%d: rejecting packet on channel %d\n", 1866 cosa->num, cosa->rxchan->num); 1867 cosa->rxbuf = cosa->bouncebuf; 1868 } 1869 1870 /* start the DMA */ 1871 flags = claim_dma_lock(); 1872 disable_dma(cosa->dma); 1873 clear_dma_ff(cosa->dma); 1874 set_dma_mode(cosa->dma, DMA_MODE_READ); 1875 if (cosa_dma_able(cosa->rxchan, cosa->rxbuf, cosa->rxsize & 0x1fff)) 1876 set_dma_addr(cosa->dma, virt_to_bus(cosa->rxbuf)); 1877 else 1878 set_dma_addr(cosa->dma, virt_to_bus(cosa->bouncebuf)); 1879 1880 set_dma_count(cosa->dma, (cosa->rxsize & 0x1fff)); 1881 enable_dma(cosa->dma); 1882 release_dma_lock(flags); 1883 spin_lock_irqsave(&cosa->lock, flags); 1884 cosa_putstatus(cosa, SR_RX_DMA_ENA | SR_USR_INT_ENA); 1885 if (!is_8bit(cosa) && (status & SR_TX_RDY)) 1886 cosa_putdata8(cosa, DRIVER_RX_READY); 1887#ifdef DEBUG_IO 1888 debug_status_out(cosa, SR_RX_DMA_ENA | SR_USR_INT_ENA); 1889 if (!is_8bit(cosa) && (status & SR_TX_RDY)) 1890 debug_data_cmd(cosa, DRIVER_RX_READY); 1891#endif 1892 spin_unlock_irqrestore(&cosa->lock, flags); 1893} 1894 1895static inline void eot_interrupt(struct cosa_data *cosa, int status) 1896{ 1897 unsigned long flags, flags1; 1898 1899 spin_lock_irqsave(&cosa->lock, flags); 1900 flags1 = claim_dma_lock(); 1901 disable_dma(cosa->dma); 1902 clear_dma_ff(cosa->dma); 1903 release_dma_lock(flags1); 1904 if (test_bit(TXBIT, &cosa->rxtx)) { 1905 struct channel_data *chan = cosa->chan + cosa->txchan; 1906 1907 if (chan->tx_done) 1908 if (chan->tx_done(chan, cosa->txsize)) 1909 clear_bit(chan->num, &cosa->txbitmap); 1910 } else if (test_bit(RXBIT, &cosa->rxtx)) { 1911#ifdef DEBUG_DATA 1912 { 1913 int i; 1914 1915 pr_info("cosa%dc%d: done rx(0x%x)", 1916 cosa->num, cosa->rxchan->num, cosa->rxsize); 1917 for (i = 0; i < cosa->rxsize; i++) 1918 pr_cont(" %02x", cosa->rxbuf[i]&0xff); 1919 pr_cont("\n"); 1920 } 1921#endif 1922 /* Packet for unknown channel? */ 1923 if (cosa->rxbuf == cosa->bouncebuf) 1924 goto out; 1925 if (!cosa_dma_able(cosa->rxchan, cosa->rxbuf, cosa->rxsize)) 1926 memcpy(cosa->rxbuf, cosa->bouncebuf, cosa->rxsize); 1927 if (cosa->rxchan->rx_done) 1928 if (cosa->rxchan->rx_done(cosa->rxchan)) 1929 clear_bit(cosa->rxchan->num, &cosa->rxbitmap); 1930 } else { 1931 pr_notice("cosa%d: unexpected EOT interrupt\n", cosa->num); 1932 } 1933 /* Clear the RXBIT, TXBIT and IRQBIT (the latest should be 1934 * cleared anyway). We should do it as soon as possible 1935 * so that we can tell the COSA we are done and to give it a time 1936 * for recovery. 1937 */ 1938out: 1939 cosa->rxtx = 0; 1940 put_driver_status_nolock(cosa); 1941 spin_unlock_irqrestore(&cosa->lock, flags); 1942} 1943 1944static irqreturn_t cosa_interrupt(int irq, void *cosa_) 1945{ 1946 unsigned status; 1947 int count = 0; 1948 struct cosa_data *cosa = cosa_; 1949again: 1950 status = cosa_getstatus(cosa); 1951#ifdef DEBUG_IRQS 1952 pr_info("cosa%d: got IRQ, status 0x%02x\n", cosa->num, status & 0xff); 1953#endif 1954#ifdef DEBUG_IO 1955 debug_status_in(cosa, status); 1956#endif 1957 switch (status & SR_CMD_FROM_SRP_MASK) { 1958 case SR_DOWN_REQUEST: 1959 tx_interrupt(cosa, status); 1960 break; 1961 case SR_UP_REQUEST: 1962 rx_interrupt(cosa, status); 1963 break; 1964 case SR_END_OF_TRANSFER: 1965 eot_interrupt(cosa, status); 1966 break; 1967 default: 1968 /* We may be too fast for SRP. Try to wait a bit more. */ 1969 if (count++ < 100) { 1970 udelay(100); 1971 goto again; 1972 } 1973 pr_info("cosa%d: unknown status 0x%02x in IRQ after %d retries\n", 1974 cosa->num, status & 0xff, count); 1975 } 1976#ifdef DEBUG_IRQS 1977 if (count) 1978 pr_info("%s: %d-times got unknown status in IRQ\n", 1979 cosa->name, count); 1980 else 1981 pr_info("%s: returning from IRQ\n", cosa->name); 1982#endif 1983 return IRQ_HANDLED; 1984} 1985 1986/* ---------- I/O debugging routines ---------- */ 1987/* These routines can be used to monitor COSA/SRP I/O and to printk() 1988 * the data being transferred on the data and status I/O port in a 1989 * readable way. 1990 */ 1991 1992#ifdef DEBUG_IO 1993static void debug_status_in(struct cosa_data *cosa, int status) 1994{ 1995 char *s; 1996 1997 switch (status & SR_CMD_FROM_SRP_MASK) { 1998 case SR_UP_REQUEST: 1999 s = "RX_REQ"; 2000 break; 2001 case SR_DOWN_REQUEST: 2002 s = "TX_REQ"; 2003 break; 2004 case SR_END_OF_TRANSFER: 2005 s = "ET_REQ"; 2006 break; 2007 default: 2008 s = "NO_REQ"; 2009 break; 2010 } 2011 pr_info("%s: IO: status -> 0x%02x (%s%s%s%s)\n", 2012 cosa->name, 2013 status, 2014 status & SR_USR_RQ ? "USR_RQ|" : "", 2015 status & SR_TX_RDY ? "TX_RDY|" : "", 2016 status & SR_RX_RDY ? "RX_RDY|" : "", 2017 s); 2018} 2019 2020static void debug_status_out(struct cosa_data *cosa, int status) 2021{ 2022 pr_info("%s: IO: status <- 0x%02x (%s%s%s%s%s%s)\n", 2023 cosa->name, 2024 status, 2025 status & SR_RX_DMA_ENA ? "RXDMA|" : "!rxdma|", 2026 status & SR_TX_DMA_ENA ? "TXDMA|" : "!txdma|", 2027 status & SR_RST ? "RESET|" : "", 2028 status & SR_USR_INT_ENA ? "USRINT|" : "!usrint|", 2029 status & SR_TX_INT_ENA ? "TXINT|" : "!txint|", 2030 status & SR_RX_INT_ENA ? "RXINT" : "!rxint"); 2031} 2032 2033static void debug_data_in(struct cosa_data *cosa, int data) 2034{ 2035 pr_info("%s: IO: data -> 0x%04x\n", cosa->name, data); 2036} 2037 2038static void debug_data_out(struct cosa_data *cosa, int data) 2039{ 2040 pr_info("%s: IO: data <- 0x%04x\n", cosa->name, data); 2041} 2042 2043static void debug_data_cmd(struct cosa_data *cosa, int data) 2044{ 2045 pr_info("%s: IO: data <- 0x%04x (%s|%s)\n", 2046 cosa->name, data, 2047 data & SR_RDY_RCV ? "RX_RDY" : "!rx_rdy", 2048 data & SR_RDY_SND ? "TX_RDY" : "!tx_rdy"); 2049} 2050#endif 2051 2052/* EOF -- this file has not been truncated */