1 /* $Id: cosa.c,v 1.31 2000/03/08 17:47:16 kas Exp $ */ 4 * Copyright (C) 1995-1997 Jan "Yenya" Kasprzak <kas@fi.muni.cz> 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 22 * The driver for the SRP and COSA synchronous serial cards. 26 * Both cards are developed at the Institute of Computer Science, 27 * Masaryk University (http://www.ics.muni.cz/). The hardware is 28 * developed by Jiri Novotny <novotny@ics.muni.cz>. More information 29 * and the photo of both cards is available at 30 * http://www.pavoucek.cz/cosa.html. The card documentation, firmwares 31 * and other goods can be downloaded from ftp://ftp.ics.muni.cz/pub/cosa/. 32 * For Linux-specific utilities, see below in the "Software info" section. 33 * If you want to order the card, contact Jiri Novotny. 35 * The SRP (serial port?, the Czech word "srp" means "sickle") card 36 * is a 2-port intelligent (with its own 8-bit CPU) synchronous serial card 37 * with V.24 interfaces up to 80kb/s each. 39 * The COSA (communication serial adapter?, the Czech word "kosa" means 40 * "scythe") is a next-generation sync/async board with two interfaces 41 * - currently any of V.24, X.21, V.35 and V.36 can be selected. 42 * It has a 16-bit SAB80166 CPU and can do up to 10 Mb/s per channel. 43 * The 8-channels version is in development. 45 * Both types have downloadable firmware and communicate via ISA DMA. 46 * COSA can be also a bus-mastering device. 50 * The homepage of the Linux driver is at http://www.fi.muni.cz/~kas/cosa/. 51 * The CVS tree of Linux driver can be viewed there, as well as the 52 * firmware binaries and user-space utilities for downloading the firmware 53 * into the card and setting up the card. 55 * The Linux driver (unlike the present *BSD drivers :-) can work even 56 * for the COSA and SRP in one computer and allows each channel to work 57 * in one of the three modes (character device, Cisco HDLC, Sync PPP). 61 * The Linux driver was written by Jan "Yenya" Kasprzak <kas@fi.muni.cz>. 63 * You can mail me bugfixes and even success reports. I am especially 64 * interested in the SMP and/or muliti-channel success/failure reports 65 * (I wonder if I did the locking properly :-). 67 * THE AUTHOR USED THE FOLLOWING SOURCES WHEN PROGRAMMING THE DRIVER 69 * The COSA/SRP NetBSD driver by Zdenek Salvet and Ivos Cernohlavek 70 * The skeleton.c by Donald Becker 71 * The SDL Riscom/N2 driver by Mike Natale 72 * The Comtrol Hostess SV11 driver by Alan Cox 73 * The Sync PPP/Cisco HDLC layer (syncppp.c) ported to Linux by Alan Cox 76 * 5/25/1999 : Marcelo Tosatti <marcelo@conectiva.com.br> 77 * fixed a deadlock in cosa_sppp_open 80 /* ---------- Headers, macros, data structures ---------- */ 82 #include <linux/config.h> 83 #include <linux/module.h> 84 #include <linux/kernel.h> 85 #include <linux/malloc.h> 86 #include <linux/poll.h> 88 #include <linux/devfs_fs_kernel.h> 89 #include <linux/sched.h> 90 #include <linux/interrupt.h> 91 #include <linux/delay.h> 92 #include <linux/errno.h> 93 #include <linux/ioport.h> 94 #include <linux/netdevice.h> 95 #include <linux/spinlock.h> 96 #include <linux/smp_lock.h> 98 #undef COSA_SLOW_IO/* for testing purposes only */ 103 #include <asm/byteorder.h> 108 /* Linux version stuff */ 109 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,1) 110 typedefstruct wait_queue
*wait_queue_head_t
; 111 #define DECLARE_WAITQUEUE(wait, current) \ 112 struct wait_queue wait = { current, NULL } 115 /* Maximum length of the identification string. */ 116 #define COSA_MAX_ID_STRING 128 118 /* Maximum length of the channel name */ 119 #define COSA_MAX_NAME (sizeof("cosaXXXcXXX")+1) 121 /* Per-channel data structure */ 123 struct channel_data
{ 124 void*if_ptr
;/* General purpose pointer (used by SPPP) */ 125 int usage
;/* Usage count; >0 for chrdev, -1 for netdev */ 126 int num
;/* Number of the channel */ 127 struct cosa_data
*cosa
;/* Pointer to the per-card structure */ 128 int txsize
;/* Size of transmitted data */ 129 char*txbuf
;/* Transmit buffer */ 130 char name
[COSA_MAX_NAME
];/* channel name */ 132 /* The HW layer interface */ 133 /* routine called from the RX interrupt */ 134 char*(*setup_rx
)(struct channel_data
*channel
,int size
); 135 /* routine called when the RX is done (from the EOT interrupt) */ 136 int(*rx_done
)(struct channel_data
*channel
); 137 /* routine called when the TX is done (from the EOT interrupt) */ 138 int(*tx_done
)(struct channel_data
*channel
,int size
); 140 /* Character device parts */ 141 struct semaphore rsem
, wsem
; 144 wait_queue_head_t txwaitq
, rxwaitq
; 145 int tx_status
, rx_status
; 147 /* SPPP/HDLC device parts */ 148 struct ppp_device pppdev
; 149 struct sk_buff
*rx_skb
, *tx_skb
; 150 struct net_device_stats stats
; 153 /* cosa->firmware_status bits */ 154 #define COSA_FW_RESET (1<<0)/* Is the ROM monitor active? */ 155 #define COSA_FW_DOWNLOAD (1<<1)/* Is the microcode downloaded? */ 156 #define COSA_FW_START (1<<2)/* Is the microcode running? */ 159 int num
;/* Card number */ 160 char name
[COSA_MAX_NAME
];/* Card name - e.g "cosa0" */ 161 unsigned int datareg
, statusreg
;/* I/O ports */ 162 unsigned short irq
, dma
;/* IRQ and DMA number */ 163 unsigned short startaddr
;/* Firmware start address */ 164 unsigned short busmaster
;/* Use busmastering? */ 165 int nchannels
;/* # of channels on this card */ 166 int driver_status
;/* For communicating with firware */ 167 int firmware_status
;/* Downloaded, reseted, etc. */ 168 long int rxbitmap
, txbitmap
;/* Bitmap of channels who are willing to send/receive data */ 169 long int rxtx
;/* RX or TX in progress? */ 171 int usage
;/* usage count */ 172 int txchan
, txsize
, rxsize
; 173 struct channel_data
*rxchan
; 176 struct channel_data
*chan
; 177 spinlock_t lock
;/* For exclusive operations on this structure */ 178 char id_string
[COSA_MAX_ID_STRING
];/* ROM monitor ID string */ 179 char*type
;/* card type */ 183 * Define this if you want all the possible ports to be autoprobed. 184 * It is here but it probably is not a good idea to use this. 186 /* #define COSA_ISA_AUTOPROBE 1 */ 189 * Character device major number. 117 was allocated for us. 190 * The value of 0 means to allocate a first free one. 192 static int cosa_major
=117; 195 * Encoding of the minor numbers: 196 * The lowest CARD_MINOR_BITS bits means the channel on the single card, 197 * the highest bits means the card number. 199 #define CARD_MINOR_BITS 4/* How many bits in minor number are reserved 200 * for the single card */ 202 * The following depends on CARD_MINOR_BITS. Unfortunately, the "MODULE_STRING" 203 * macro doesn't like anything other than the raw number as an argument :-( 206 /* #define MAX_CARDS (1 << (8-CARD_MINOR_BITS)) */ 208 #define DRIVER_RX_READY 0x0001 209 #define DRIVER_TX_READY 0x0002 210 #define DRIVER_TXMAP_SHIFT 2 211 #define DRIVER_TXMAP_MASK 0x0c/* FIXME: 0xfc for 8-channel version */ 214 * for cosa->rxtx - indicates whether either transmit or receive is 215 * in progress. These values are mean number of the bit. 221 #define COSA_MTU 2000/* FIXME: I don't know this exactly */ 223 #undef DEBUG_DATA 1/* Dump the data read or written to the channel */ 224 #undef DEBUG_IRQS 1/* Print the message when the IRQ is received */ 225 #undef DEBUG_IO 1/* Dump the I/O traffic */ 227 #define TX_TIMEOUT (5*HZ) 229 /* Maybe the following should be allocated dynamically */ 230 static struct cosa_data cosa_cards
[MAX_CARDS
]; 233 #ifdef COSA_ISA_AUTOPROBE 234 static int io
[MAX_CARDS
+1] = {0x220,0x228,0x210,0x218,0, }; 235 /* NOTE: DMA is not autoprobed!!! */ 236 static int dma
[MAX_CARDS
+1] = {1,7,1,7,1,7,1,7,0, }; 238 int io
[MAX_CARDS
+1] = {0, }; 239 int dma
[MAX_CARDS
+1] = {0, }; 241 /* IRQ can be safely autoprobed */ 242 static int irq
[MAX_CARDS
+1] = { -1, -1, -1, -1, -1, -1,0, }; 245 MODULE_PARM(io
,"1-"__MODULE_STRING(MAX_CARDS
)"i"); 246 MODULE_PARM_DESC(io
,"The I/O bases of the COSA or SRP cards"); 247 MODULE_PARM(irq
,"1-"__MODULE_STRING(MAX_CARDS
)"i"); 248 MODULE_PARM_DESC(irq
,"The IRQ lines of the COSA or SRP cards"); 249 MODULE_PARM(dma
,"1-"__MODULE_STRING(MAX_CARDS
)"i"); 250 MODULE_PARM_DESC(dma
,"The DMA channels of the COSA or SRP cards"); 252 MODULE_AUTHOR("Jan\"Yenya\"Kasprzak, <kas@fi.muni.cz>"); 253 MODULE_DESCRIPTION("Modular driver for the COSA or SRP synchronous card"); 256 /* I use this mainly for testing purposes */ 258 #define cosa_outb outb_p 259 #define cosa_outw outw_p 260 #define cosa_inb inb_p 261 #define cosa_inw inw_p 263 #define cosa_outb outb 264 #define cosa_outw outw 269 #define is_8bit(cosa) (!(cosa->datareg & 0x08)) 271 #define cosa_getstatus(cosa) (cosa_inb(cosa->statusreg)) 272 #define cosa_putstatus(cosa, stat) (cosa_outb(stat, cosa->statusreg)) 273 #define cosa_getdata16(cosa) (cosa_inw(cosa->datareg)) 274 #define cosa_getdata8(cosa) (cosa_inb(cosa->datareg)) 275 #define cosa_putdata16(cosa, dt) (cosa_outw(dt, cosa->datareg)) 276 #define cosa_putdata8(cosa, dt) (cosa_outb(dt, cosa->datareg)) 278 /* Initialization stuff */ 279 static intcosa_probe(int ioaddr
,int irq
,int dma
); 282 static voidcosa_enable_rx(struct channel_data
*chan
); 283 static voidcosa_disable_rx(struct channel_data
*chan
); 284 static intcosa_start_tx(struct channel_data
*channel
,char*buf
,int size
); 285 static voidcosa_kick(struct cosa_data
*cosa
); 286 static intcosa_dma_able(struct channel_data
*chan
,char*buf
,int data
); 288 /* SPPP/HDLC stuff */ 289 static voidsppp_channel_init(struct channel_data
*chan
); 290 static voidsppp_channel_delete(struct channel_data
*chan
); 291 static intcosa_sppp_open(struct net_device
*d
); 292 static intcosa_sppp_close(struct net_device
*d
); 293 static voidcosa_sppp_timeout(struct net_device
*d
); 294 static intcosa_sppp_tx(struct sk_buff
*skb
,struct net_device
*d
); 295 static char*sppp_setup_rx(struct channel_data
*channel
,int size
); 296 static intsppp_rx_done(struct channel_data
*channel
); 297 static intsppp_tx_done(struct channel_data
*channel
,int size
); 298 static intcosa_sppp_ioctl(struct net_device
*dev
,struct ifreq
*ifr
,int cmd
); 299 static struct net_device_stats
*cosa_net_stats(struct net_device
*dev
); 301 /* Character device */ 302 static voidchardev_channel_init(struct channel_data
*chan
); 303 static char*chrdev_setup_rx(struct channel_data
*channel
,int size
); 304 static intchrdev_rx_done(struct channel_data
*channel
); 305 static intchrdev_tx_done(struct channel_data
*channel
,int size
); 306 static loff_t
cosa_lseek(struct file
*file
, loff_t offset
,int origin
); 307 static ssize_t
cosa_read(struct file
*file
, 308 char*buf
,size_t count
, loff_t
*ppos
); 309 static ssize_t
cosa_write(struct file
*file
, 310 const char*buf
,size_t count
, loff_t
*ppos
); 311 static unsigned intcosa_poll(struct file
*file
, poll_table
*poll
); 312 static intcosa_open(struct inode
*inode
,struct file
*file
); 313 static intcosa_release(struct inode
*inode
,struct file
*file
); 314 static intcosa_chardev_ioctl(struct inode
*inode
,struct file
*file
, 315 unsigned int cmd
,unsigned long arg
); 316 #ifdef COSA_FASYNC_WORKING 317 static intcosa_fasync(struct inode
*inode
,struct file
*file
,int on
); 320 static struct file_operations cosa_fops
= { 326 ioctl
: cosa_chardev_ioctl
, 328 release
: cosa_release
, 329 #ifdef COSA_FASYNC_WORKING 335 static intcosa_start(struct cosa_data
*cosa
,int address
); 336 static intcosa_reset(struct cosa_data
*cosa
); 337 static intcosa_download(struct cosa_data
*cosa
,struct cosa_download
*d
); 338 static intcosa_readmem(struct cosa_data
*cosa
,struct cosa_download
*d
); 340 /* COSA/SRP ROM monitor */ 341 static intdownload(struct cosa_data
*cosa
,char*data
,int addr
,int len
); 342 static intstartmicrocode(struct cosa_data
*cosa
,int address
); 343 static intreadmem(struct cosa_data
*cosa
,char*data
,int addr
,int len
); 344 static intcosa_reset_and_read_id(struct cosa_data
*cosa
,char*id
); 346 /* Auxilliary functions */ 347 static intget_wait_data(struct cosa_data
*cosa
); 348 static intput_wait_data(struct cosa_data
*cosa
,int data
); 349 static intputhexnumber(struct cosa_data
*cosa
,int number
); 350 static voidput_driver_status(struct cosa_data
*cosa
); 351 static voidput_driver_status_nolock(struct cosa_data
*cosa
); 353 /* Interrupt handling */ 354 static voidcosa_interrupt(int irq
,void*cosa
,struct pt_regs
*regs
); 356 /* I/O ops debugging */ 358 static voiddebug_data_in(struct cosa_data
*cosa
,int data
); 359 static voiddebug_data_out(struct cosa_data
*cosa
,int data
); 360 static voiddebug_data_cmd(struct cosa_data
*cosa
,int data
); 361 static voiddebug_status_in(struct cosa_data
*cosa
,int status
); 362 static voiddebug_status_out(struct cosa_data
*cosa
,int status
); 366 /* ---------- Initialization stuff ---------- */ 368 static devfs_handle_t devfs_handle
; 373 static int __init
cosa_init(void) 378 printk(KERN_INFO
"cosa v1.08 (c) 1997-2000 Jan Kasprzak <kas@fi.muni.cz>\n"); 380 printk(KERN_INFO
"cosa: SMP found. Please mail any success/failure reports to the author.\n"); 383 if(devfs_register_chrdev(cosa_major
,"cosa", &cosa_fops
)) { 384 printk(KERN_WARNING
"cosa: unable to get major %d\n", 389 if(!(cosa_major
=devfs_register_chrdev(0,"cosa", &cosa_fops
))) { 390 printk(KERN_WARNING
"cosa: unable to register chardev\n"); 394 for(i
=0; i
<MAX_CARDS
; i
++) 395 cosa_cards
[i
].num
= -1; 396 for(i
=0; io
[i
] !=0&& i
< MAX_CARDS
; i
++) 397 cosa_probe(io
[i
], irq
[i
], dma
[i
]); 398 devfs_handle
=devfs_mk_dir(NULL
,"cosa", NULL
); 399 devfs_register_series(devfs_handle
,"%u", nr_cards
, DEVFS_FL_DEFAULT
, 401 S_IFCHR
| S_IRUSR
| S_IWUSR
, 404 printk(KERN_WARNING
"cosa: no devices found.\n"); 405 devfs_unregister_chrdev(cosa_major
,"cosa"); 412 voidcleanup_module(void) 414 struct cosa_data
*cosa
; 415 printk(KERN_INFO
"Unloading the cosa module\n"); 417 devfs_unregister(devfs_handle
); 418 for(cosa
=cosa_cards
; nr_cards
--; cosa
++) { 420 /* Clean up the per-channel data */ 421 for(i
=0; i
<cosa
->nchannels
; i
++) { 422 /* Chardev driver has no alloc'd per-channel data */ 423 sppp_channel_delete(cosa
->chan
+i
); 425 /* Clean up the per-card data */ 427 kfree(cosa
->bouncebuf
); 428 free_irq(cosa
->irq
, cosa
); 430 release_region(cosa
->datareg
,is_8bit(cosa
)?2:4); 432 devfs_unregister_chrdev(cosa_major
,"cosa"); 437 * This function should register all the net devices needed for the 440 static __inline__
voidchannel_init(struct channel_data
*chan
) 442 sprintf(chan
->name
,"cosa%dc%d", chan
->cosa
->num
, chan
->num
); 444 /* Initialize the chardev data structures */ 445 chardev_channel_init(chan
); 447 /* Register the sppp interface */ 448 sppp_channel_init(chan
); 451 static intcosa_probe(int base
,int irq
,int dma
) 453 struct cosa_data
*cosa
= cosa_cards
+nr_cards
; 456 memset(cosa
,0,sizeof(struct cosa_data
)); 458 /* Checking validity of parameters: */ 459 /* IRQ should be 2-7 or 10-15; negative IRQ means autoprobe */ 460 if((irq
>=0&& irq
<2) || irq
>15|| (irq
<10&& irq
>7)) { 461 printk(KERN_INFO
"cosa_probe: invalid IRQ %d\n", irq
); 464 /* I/O address should be between 0x100 and 0x3ff and should be 466 if(base
<0x100|| base
>0x3ff|| base
&0x7) { 467 printk(KERN_INFO
"cosa_probe: invalid I/O address 0x%x\n", 471 /* DMA should be 0,1 or 3-7 */ 472 if(dma
<0|| dma
==4|| dma
>7) { 473 printk(KERN_INFO
"cosa_probe: invalid DMA %d\n", dma
); 476 /* and finally, on 16-bit COSA DMA should be 4-7 and 477 * I/O base should not be multiple of 0x10 */ 478 if(((base
&0x8) && dma
<4) || (!(base
&0x8) && dma
>3)) { 479 printk(KERN_INFO
"cosa_probe: 8/16 bit base and DMA mismatch" 480 " (base=0x%x, dma=%d)\n", base
, dma
); 485 cosa
->datareg
= base
; 486 cosa
->statusreg
=is_8bit(cosa
)?base
+1:base
+2; 487 spin_lock_init(&cosa
->lock
); 489 if(check_region(base
,is_8bit(cosa
)?2:4)) 492 if(cosa_reset_and_read_id(cosa
, cosa
->id_string
) <0) { 493 printk(KERN_DEBUG
"cosa: probe at 0x%x failed.\n", base
); 497 /* Test the validity of identification string */ 498 if(!strncmp(cosa
->id_string
,"SRP",3)) 500 else if(!strncmp(cosa
->id_string
,"COSA",4)) 501 cosa
->type
=is_8bit(cosa
)?"cosa8":"cosa16"; 503 /* Print a warning only if we are not autoprobing */ 504 #ifndef COSA_ISA_AUTOPROBE 505 printk(KERN_INFO
"cosa: valid signature not found at 0x%x.\n", 511 /* Now do IRQ autoprobe */ 514 /* printk(KERN_INFO "IRQ autoprobe\n"); */ 516 irqs
=probe_irq_on(); 518 * Enable interrupt on tx buffer empty (it sure is) 520 * FIXME: When this code is not used as module, we should 521 * probably call udelay() instead of the interruptible sleep. 523 current
->state
= TASK_INTERRUPTIBLE
; 524 cosa_putstatus(cosa
, SR_TX_INT_ENA
); 525 schedule_timeout(30); 526 current
->state
= TASK_RUNNING
; 527 irq
=probe_irq_off(irqs
); 528 /* Disable all IRQs from the card */ 529 cosa_putstatus(cosa
,0); 530 /* Empty the received data register */ 534 printk(KERN_INFO
"cosa IRQ autoprobe: multiple interrupts obtained (%d, board at 0x%x)\n", 539 printk(KERN_INFO
"cosa IRQ autoprobe: no interrupt obtained (board at 0x%x)\n", 546 cosa
->num
= nr_cards
; 548 cosa
->nchannels
=2;/* FIXME: how to determine this? */ 550 request_region(base
,is_8bit(cosa
)?2:4, cosa
->type
); 551 if(request_irq(cosa
->irq
, cosa_interrupt
,0, cosa
->type
, cosa
)) 553 if(request_dma(cosa
->dma
, cosa
->type
)) { 554 free_irq(cosa
->irq
, cosa
); 555 bad1
:release_region(cosa
->datareg
,is_8bit(cosa
)?2:4); 556 printk(KERN_NOTICE
"cosa%d: allocating resources failed\n", 561 cosa
->bouncebuf
=kmalloc(COSA_MTU
, GFP_KERNEL
|GFP_DMA
); 562 sprintf(cosa
->name
,"cosa%d", cosa
->num
); 564 /* Initialize the per-channel data */ 565 cosa
->chan
=kmalloc(sizeof(struct channel_data
)*cosa
->nchannels
, 567 memset(cosa
->chan
,0,sizeof(struct channel_data
)*cosa
->nchannels
); 568 for(i
=0; i
<cosa
->nchannels
; i
++) { 569 cosa
->chan
[i
].cosa
= cosa
; 570 cosa
->chan
[i
].num
= i
; 571 channel_init(cosa
->chan
+i
); 574 printk(KERN_INFO
"cosa%d: %s (%s at 0x%x irq %d dma %d), %d channels\n", 575 cosa
->num
, cosa
->id_string
, cosa
->type
, 576 cosa
->datareg
, cosa
->irq
, cosa
->dma
, cosa
->nchannels
); 582 /*---------- SPPP/HDLC netdevice ---------- */ 584 static voidsppp_channel_init(struct channel_data
*chan
) 586 struct net_device
*d
; 587 chan
->if_ptr
= &chan
->pppdev
; 588 chan
->pppdev
.dev
=kmalloc(sizeof(struct net_device
), GFP_KERNEL
); 589 memset(chan
->pppdev
.dev
,0,sizeof(struct net_device
)); 590 sppp_attach(&chan
->pppdev
); 592 strcpy(d
->name
, chan
->name
); 593 d
->base_addr
= chan
->cosa
->datareg
; 594 d
->irq
= chan
->cosa
->irq
; 595 d
->dma
= chan
->cosa
->dma
; 598 d
->open
= cosa_sppp_open
; 599 d
->stop
= cosa_sppp_close
; 600 d
->hard_start_xmit
= cosa_sppp_tx
; 601 d
->do_ioctl
= cosa_sppp_ioctl
; 602 d
->get_stats
= cosa_net_stats
; 603 d
->tx_timeout
= cosa_sppp_timeout
; 604 d
->watchdog_timeo
= TX_TIMEOUT
; 605 if(register_netdev(d
) == -1) { 606 printk(KERN_WARNING
"%s: register_netdev failed.\n", d
->name
); 607 sppp_detach(chan
->pppdev
.dev
); 612 static voidsppp_channel_delete(struct channel_data
*chan
) 614 sppp_detach(chan
->pppdev
.dev
); 615 unregister_netdev(chan
->pppdev
.dev
); 618 static intcosa_sppp_open(struct net_device
*d
) 620 struct channel_data
*chan
= d
->priv
; 623 if(!(chan
->cosa
->firmware_status
& COSA_FW_START
)) { 624 printk(KERN_NOTICE
"%s: start the firmware first (status %d)\n", 625 chan
->cosa
->name
, chan
->cosa
->firmware_status
); 628 spin_lock_irqsave(&chan
->cosa
->lock
, flags
); 629 if(chan
->usage
!=0) { 630 printk(KERN_WARNING
"%s: sppp_open called with usage count %d\n", 631 chan
->name
, chan
->usage
); 632 spin_unlock_irqrestore(&chan
->cosa
->lock
, flags
); 635 chan
->setup_rx
= sppp_setup_rx
; 636 chan
->tx_done
= sppp_tx_done
; 637 chan
->rx_done
= sppp_rx_done
; 641 spin_unlock_irqrestore(&chan
->cosa
->lock
, flags
); 645 spin_lock_irqsave(&chan
->cosa
->lock
, flags
); 650 spin_unlock_irqrestore(&chan
->cosa
->lock
, flags
); 654 netif_start_queue(d
); 655 cosa_enable_rx(chan
); 659 static intcosa_sppp_tx(struct sk_buff
*skb
,struct net_device
*dev
) 661 struct channel_data
*chan
= dev
->priv
; 663 netif_stop_queue(dev
); 666 cosa_start_tx(chan
, skb
->data
, skb
->len
); 670 static voidcosa_sppp_timeout(struct net_device
*dev
) 672 struct channel_data
*chan
= dev
->priv
; 674 if(test_bit(RXBIT
, &chan
->cosa
->rxtx
)) { 675 chan
->stats
.rx_errors
++; 676 chan
->stats
.rx_missed_errors
++; 678 chan
->stats
.tx_errors
++; 679 chan
->stats
.tx_aborted_errors
++; 681 cosa_kick(chan
->cosa
); 683 dev_kfree_skb(chan
->tx_skb
); 686 netif_wake_queue(dev
); 689 static intcosa_sppp_close(struct net_device
*d
) 691 struct channel_data
*chan
= d
->priv
; 696 cosa_disable_rx(chan
); 697 spin_lock_irqsave(&chan
->cosa
->lock
, flags
); 699 kfree_skb(chan
->rx_skb
); 703 kfree_skb(chan
->tx_skb
); 709 spin_unlock_irqrestore(&chan
->cosa
->lock
, flags
); 713 static char*sppp_setup_rx(struct channel_data
*chan
,int size
) 716 * We can safely fall back to non-dma-able memory, because we have 717 * the cosa->bouncebuf pre-allocated. 720 kfree_skb(chan
->rx_skb
); 721 chan
->rx_skb
=dev_alloc_skb(size
); 722 if(chan
->rx_skb
== NULL
) { 723 printk(KERN_NOTICE
"%s: Memory squeeze, dropping packet\n", 725 chan
->stats
.rx_dropped
++; 728 chan
->pppdev
.dev
->trans_start
= jiffies
; 729 returnskb_put(chan
->rx_skb
, size
); 732 static intsppp_rx_done(struct channel_data
*chan
) 735 printk(KERN_WARNING
"%s: rx_done with empty skb!\n", 737 chan
->stats
.rx_errors
++; 738 chan
->stats
.rx_frame_errors
++; 741 chan
->rx_skb
->protocol
=htons(ETH_P_WAN_PPP
); 742 chan
->rx_skb
->dev
= chan
->pppdev
.dev
; 743 chan
->rx_skb
->mac
.raw
= chan
->rx_skb
->data
; 744 chan
->stats
.rx_packets
++; 745 chan
->stats
.rx_bytes
+= chan
->cosa
->rxsize
; 746 netif_rx(chan
->rx_skb
); 748 chan
->pppdev
.dev
->trans_start
= jiffies
; 753 static intsppp_tx_done(struct channel_data
*chan
,int size
) 756 printk(KERN_WARNING
"%s: tx_done with empty skb!\n", 758 chan
->stats
.tx_errors
++; 759 chan
->stats
.tx_aborted_errors
++; 762 dev_kfree_skb_irq(chan
->tx_skb
); 764 chan
->stats
.tx_packets
++; 765 chan
->stats
.tx_bytes
+= size
; 766 netif_wake_queue(chan
->pppdev
.dev
); 770 static struct net_device_stats
*cosa_net_stats(struct net_device
*dev
) 772 struct channel_data
*chan
= dev
->priv
; 777 /*---------- Character device ---------- */ 779 static voidchardev_channel_init(struct channel_data
*chan
) 781 init_MUTEX(&chan
->rsem
); 782 init_MUTEX(&chan
->wsem
); 785 static loff_t
cosa_lseek(struct file
* file
, loff_t offset
,int origin
) 790 static ssize_t
cosa_read(struct file
*file
, 791 char*buf
,size_t count
, loff_t
*ppos
) 793 DECLARE_WAITQUEUE(wait
, current
); 795 struct channel_data
*chan
= (struct channel_data
*)file
->private_data
; 796 struct cosa_data
*cosa
= chan
->cosa
; 799 if(!(cosa
->firmware_status
& COSA_FW_START
)) { 800 printk(KERN_NOTICE
"%s: start the firmware first (status %d)\n", 801 cosa
->name
, cosa
->firmware_status
); 804 if(down_interruptible(&chan
->rsem
)) 807 if((chan
->rxdata
=kmalloc(COSA_MTU
, GFP_DMA
|GFP_KERNEL
)) == NULL
) { 808 printk(KERN_INFO
"%s: cosa_read() - OOM\n", cosa
->name
); 814 cosa_enable_rx(chan
); 815 spin_lock_irqsave(&cosa
->lock
, flags
); 816 add_wait_queue(&chan
->rxwaitq
, &wait
); 817 while(!chan
->rx_status
) { 818 current
->state
= TASK_INTERRUPTIBLE
; 819 spin_unlock_irqrestore(&cosa
->lock
, flags
); 821 spin_lock_irqsave(&cosa
->lock
, flags
); 822 if(signal_pending(current
) && chan
->rx_status
==0) { 824 remove_wait_queue(&chan
->rxwaitq
, &wait
); 825 current
->state
= TASK_RUNNING
; 826 spin_unlock_irqrestore(&cosa
->lock
, flags
); 831 remove_wait_queue(&chan
->rxwaitq
, &wait
); 832 current
->state
= TASK_RUNNING
; 834 count
= chan
->rxsize
; 835 spin_unlock_irqrestore(&cosa
->lock
, flags
); 838 if(copy_to_user(buf
, kbuf
, count
)) { 846 static char*chrdev_setup_rx(struct channel_data
*chan
,int size
) 848 /* Expect size <= COSA_MTU */ 853 static intchrdev_rx_done(struct channel_data
*chan
) 855 if(chan
->rx_status
) {/* Reader has died */ 860 wake_up_interruptible(&chan
->rxwaitq
); 865 static ssize_t
cosa_write(struct file
*file
, 866 const char*buf
,size_t count
, loff_t
*ppos
) 868 DECLARE_WAITQUEUE(wait
, current
); 869 struct channel_data
*chan
= (struct channel_data
*)file
->private_data
; 870 struct cosa_data
*cosa
= chan
->cosa
; 874 if(!(cosa
->firmware_status
& COSA_FW_START
)) { 875 printk(KERN_NOTICE
"%s: start the firmware first (status %d)\n", 876 cosa
->name
, cosa
->firmware_status
); 879 if(down_interruptible(&chan
->wsem
)) 885 /* Allocate the buffer */ 886 if((kbuf
=kmalloc(count
, GFP_KERNEL
|GFP_DMA
)) == NULL
) { 887 printk(KERN_NOTICE
"%s: cosa_write() OOM - dropping packet\n", 892 if(copy_from_user(kbuf
, buf
, count
)) { 898 cosa_start_tx(chan
, kbuf
, count
); 900 spin_lock_irqsave(&cosa
->lock
, flags
); 901 add_wait_queue(&chan
->txwaitq
, &wait
); 902 while(!chan
->tx_status
) { 903 current
->state
= TASK_INTERRUPTIBLE
; 904 spin_unlock_irqrestore(&cosa
->lock
, flags
); 906 spin_lock_irqsave(&cosa
->lock
, flags
); 907 if(signal_pending(current
) && chan
->tx_status
==0) { 909 remove_wait_queue(&chan
->txwaitq
, &wait
); 910 current
->state
= TASK_RUNNING
; 912 spin_unlock_irqrestore(&cosa
->lock
, flags
); 916 remove_wait_queue(&chan
->txwaitq
, &wait
); 917 current
->state
= TASK_RUNNING
; 919 spin_unlock_irqrestore(&cosa
->lock
, flags
); 924 static intchrdev_tx_done(struct channel_data
*chan
,int size
) 926 if(chan
->tx_status
) {/* Writer was interrupted */ 931 wake_up_interruptible(&chan
->txwaitq
); 935 static unsigned intcosa_poll(struct file
*file
, poll_table
*poll
) 937 printk(KERN_INFO
"cosa_poll is here\n"); 941 static intcosa_open(struct inode
*inode
,struct file
*file
) 943 struct cosa_data
*cosa
; 944 struct channel_data
*chan
; 948 if((n
=MINOR(file
->f_dentry
->d_inode
->i_rdev
)>>CARD_MINOR_BITS
) 953 if((n
=MINOR(file
->f_dentry
->d_inode
->i_rdev
) 954 & ((1<<CARD_MINOR_BITS
)-1)) >= cosa
->nchannels
) 956 chan
= cosa
->chan
+ n
; 958 file
->private_data
= chan
; 960 spin_lock_irqsave(&cosa
->lock
, flags
); 962 if(chan
->usage
<0) {/* in netdev mode */ 963 spin_unlock_irqrestore(&cosa
->lock
, flags
); 969 chan
->tx_done
= chrdev_tx_done
; 970 chan
->setup_rx
= chrdev_setup_rx
; 971 chan
->rx_done
= chrdev_rx_done
; 972 spin_unlock_irqrestore(&cosa
->lock
, flags
); 976 static intcosa_release(struct inode
*inode
,struct file
*file
) 978 struct channel_data
*channel
= (struct channel_data
*)file
->private_data
; 979 struct cosa_data
*cosa
; 983 cosa
= channel
->cosa
; 984 spin_lock_irqsave(&cosa
->lock
, flags
); 987 spin_unlock_irqrestore(&cosa
->lock
, flags
); 992 #ifdef COSA_FASYNC_WORKING 993 static struct fasync_struct
*fasync
[256] = { NULL
, }; 996 static intcosa_fasync(struct inode
*inode
,struct file
*file
,int on
) 998 int port
=MINOR(inode
->i_rdev
); 999 int rv
=fasync_helper(inode
, file
, on
, &fasync
[port
]); 1000 return rv
<0? rv
:0; 1005 /* ---------- Ioctls ---------- */ 1008 * Ioctl subroutines can safely be made inline, because they are called 1009 * only from cosa_ioctl(). 1011 staticinlineintcosa_reset(struct cosa_data
*cosa
) 1013 char idstring
[COSA_MAX_ID_STRING
]; 1015 printk(KERN_INFO
"cosa%d: WARNING: reset requested with cosa->usage > 1 (%d). Odd things may happen.\n", 1016 cosa
->num
, cosa
->usage
); 1017 cosa
->firmware_status
&= ~(COSA_FW_RESET
|COSA_FW_START
); 1018 if(cosa_reset_and_read_id(cosa
, idstring
) <0) { 1019 printk(KERN_NOTICE
"cosa%d: reset failed\n", cosa
->num
); 1022 printk(KERN_INFO
"cosa%d: resetting device: %s\n", cosa
->num
, 1024 cosa
->firmware_status
|= COSA_FW_RESET
; 1028 /* High-level function to download data into COSA memory. Calls download() */ 1029 staticinlineintcosa_download(struct cosa_data
*cosa
,struct cosa_download
*d
) 1036 printk(KERN_INFO
"%s: WARNING: download of microcode requested with cosa->usage > 1 (%d). Odd things may happen.\n", 1037 cosa
->name
, cosa
->usage
); 1038 if(!(cosa
->firmware_status
& COSA_FW_RESET
)) { 1039 printk(KERN_NOTICE
"%s: reset the card first (status %d).\n", 1040 cosa
->name
, cosa
->firmware_status
); 1044 if(get_user(addr
, &(d
->addr
)) || 1045 __get_user(len
, &(d
->len
)) || 1046 __get_user(code
, &(d
->code
))) 1049 if(d
->addr
<0|| d
->addr
> COSA_MAX_FIRMWARE_SIZE
) 1051 if(d
->len
<0|| d
->len
> COSA_MAX_FIRMWARE_SIZE
) 1054 /* If something fails, force the user to reset the card */ 1055 cosa
->firmware_status
&= ~(COSA_FW_RESET
|COSA_FW_DOWNLOAD
); 1057 if((i
=download(cosa
, d
->code
, len
, addr
)) <0) { 1058 printk(KERN_NOTICE
"cosa%d: microcode download failed: %d\n", 1062 printk(KERN_INFO
"cosa%d: downloading microcode - 0x%04x bytes at 0x%04x\n", 1063 cosa
->num
, len
, addr
); 1064 cosa
->firmware_status
|= COSA_FW_RESET
|COSA_FW_DOWNLOAD
; 1068 /* High-level function to read COSA memory. Calls readmem() */ 1069 staticinlineintcosa_readmem(struct cosa_data
*cosa
,struct cosa_download
*d
) 1076 printk(KERN_INFO
"cosa%d: WARNING: readmem requested with " 1077 "cosa->usage > 1 (%d). Odd things may happen.\n", 1078 cosa
->num
, cosa
->usage
); 1079 if(!(cosa
->firmware_status
& COSA_FW_RESET
)) { 1080 printk(KERN_NOTICE
"%s: reset the card first (status %d).\n", 1081 cosa
->name
, cosa
->firmware_status
); 1085 if(get_user(addr
, &(d
->addr
)) || 1086 __get_user(len
, &(d
->len
)) || 1087 __get_user(code
, &(d
->code
))) 1090 /* If something fails, force the user to reset the card */ 1091 cosa
->firmware_status
&= ~COSA_FW_RESET
; 1093 if((i
=readmem(cosa
, d
->code
, len
, addr
)) <0) { 1094 printk(KERN_NOTICE
"cosa%d: reading memory failed: %d\n", 1098 printk(KERN_INFO
"cosa%d: reading card memory - 0x%04x bytes at 0x%04x\n", 1099 cosa
->num
, len
, addr
); 1100 cosa
->firmware_status
|= COSA_FW_RESET
; 1104 /* High-level function to start microcode. Calls startmicrocode(). */ 1105 staticinlineintcosa_start(struct cosa_data
*cosa
,int address
) 1110 printk(KERN_INFO
"cosa%d: WARNING: start microcode requested with cosa->usage > 1 (%d). Odd things may happen.\n", 1111 cosa
->num
, cosa
->usage
); 1113 if((cosa
->firmware_status
& (COSA_FW_RESET
|COSA_FW_DOWNLOAD
)) 1114 != (COSA_FW_RESET
|COSA_FW_DOWNLOAD
)) { 1115 printk(KERN_NOTICE
"%s: download the microcode and/or reset the card first (status %d).\n", 1116 cosa
->name
, cosa
->firmware_status
); 1119 cosa
->firmware_status
&= ~COSA_FW_RESET
; 1120 if((i
=startmicrocode(cosa
, address
)) <0) { 1121 printk(KERN_NOTICE
"cosa%d: start microcode at 0x%04x failed: %d\n", 1122 cosa
->num
, address
, i
); 1125 printk(KERN_INFO
"cosa%d: starting microcode at 0x%04x\n", 1126 cosa
->num
, address
); 1127 cosa
->startaddr
= address
; 1128 cosa
->firmware_status
|= COSA_FW_START
; 1132 /* Buffer of size at least COSA_MAX_ID_STRING is expected */ 1133 staticinlineintcosa_getidstr(struct cosa_data
*cosa
,char*string
) 1135 int l
=strlen(cosa
->id_string
)+1; 1136 if(copy_to_user(string
, cosa
->id_string
, l
)) 1141 /* Buffer of size at least COSA_MAX_ID_STRING is expected */ 1142 staticinlineintcosa_gettype(struct cosa_data
*cosa
,char*string
) 1144 int l
=strlen(cosa
->type
)+1; 1145 if(copy_to_user(string
, cosa
->type
, l
)) 1150 static intcosa_ioctl_common(struct cosa_data
*cosa
, 1151 struct channel_data
*channel
,unsigned int cmd
,unsigned long arg
) 1154 case COSAIORSET
:/* Reset the device */ 1155 if(!capable(CAP_NET_ADMIN
)) 1157 returncosa_reset(cosa
); 1158 case COSAIOSTRT
:/* Start the firmware */ 1159 if(!capable(CAP_SYS_RAWIO
)) 1161 returncosa_start(cosa
, arg
); 1162 case COSAIODOWNLD
:/* Download the firmware */ 1163 if(!capable(CAP_SYS_RAWIO
)) 1165 returncosa_download(cosa
, (struct cosa_download
*)arg
); 1167 if(!capable(CAP_SYS_RAWIO
)) 1169 returncosa_readmem(cosa
, (struct cosa_download
*)arg
); 1171 returncosa_gettype(cosa
, (char*)arg
); 1173 returncosa_getidstr(cosa
, (char*)arg
); 1175 * These two are _very_ugly_hack_(tm). Don't even look at this. 1176 * Implementing this saved me few reboots after some process segfaulted 1177 * inside this module. 1192 return cosa
->nchannels
; 1194 if(!capable(CAP_SYS_RAWIO
)) 1198 if(arg
!= COSA_BM_OFF
&& arg
!= COSA_BM_ON
) 1200 cosa
->busmaster
= arg
; 1203 return cosa
->busmaster
; 1208 static intcosa_sppp_ioctl(struct net_device
*dev
,struct ifreq
*ifr
, 1212 struct channel_data
*chan
= (struct channel_data
*)dev
->priv
; 1213 rv
=cosa_ioctl_common(chan
->cosa
, chan
, cmd
, (unsigned long)ifr
->ifr_data
); 1214 if(rv
== -ENOIOCTLCMD
) { 1215 returnsppp_do_ioctl(dev
, ifr
, cmd
); 1220 static intcosa_chardev_ioctl(struct inode
*inode
,struct file
*file
, 1221 unsigned int cmd
,unsigned long arg
) 1223 struct channel_data
*channel
= (struct channel_data
*)file
->private_data
; 1224 struct cosa_data
*cosa
= channel
->cosa
; 1225 returncosa_ioctl_common(cosa
, channel
, cmd
, arg
); 1229 /*---------- HW layer interface ---------- */ 1232 * The higher layer can bind itself to the HW layer by setting the callbacks 1233 * in the channel_data structure and by using these routines. 1235 static voidcosa_enable_rx(struct channel_data
*chan
) 1237 struct cosa_data
*cosa
= chan
->cosa
; 1239 if(!test_and_set_bit(chan
->num
, &cosa
->rxbitmap
)) 1240 put_driver_status(cosa
); 1243 static voidcosa_disable_rx(struct channel_data
*chan
) 1245 struct cosa_data
*cosa
= chan
->cosa
; 1247 if(test_and_clear_bit(chan
->num
, &cosa
->rxbitmap
)) 1248 put_driver_status(cosa
); 1252 * FIXME: This routine probably should check for cosa_start_tx() called when 1253 * the previous transmit is still unfinished. In this case the non-zero 1254 * return value should indicate to the caller that the queuing(sp?) up 1255 * the transmit has failed. 1257 static intcosa_start_tx(struct channel_data
*chan
,char*buf
,int len
) 1259 struct cosa_data
*cosa
= chan
->cosa
; 1264 printk(KERN_INFO
"cosa%dc%d: starting tx(0x%x)", chan
->cosa
->num
, 1266 for(i
=0; i
<len
; i
++) 1267 printk(" %02x", buf
[i
]&0xff); 1270 spin_lock_irqsave(&cosa
->lock
, flags
); 1274 chan
->txsize
= COSA_MTU
; 1275 spin_unlock_irqrestore(&cosa
->lock
, flags
); 1277 /* Tell the firmware we are ready */ 1278 set_bit(chan
->num
, &cosa
->txbitmap
); 1279 put_driver_status(cosa
); 1284 static voidput_driver_status(struct cosa_data
*cosa
) 1289 spin_lock_irqsave(&cosa
->lock
, flags
); 1291 status
= (cosa
->rxbitmap
? DRIVER_RX_READY
:0) 1292 | (cosa
->txbitmap
? DRIVER_TX_READY
:0) 1293 | (cosa
->txbitmap
? ~(cosa
->txbitmap
<<DRIVER_TXMAP_SHIFT
) 1294 &DRIVER_TXMAP_MASK
:0); 1296 if(cosa
->rxbitmap
|cosa
->txbitmap
) { 1297 if(!cosa
->enabled
) { 1298 cosa_putstatus(cosa
, SR_RX_INT_ENA
); 1300 debug_status_out(cosa
, SR_RX_INT_ENA
); 1304 }else if(cosa
->enabled
) { 1306 cosa_putstatus(cosa
,0); 1308 debug_status_out(cosa
,0); 1311 cosa_putdata8(cosa
, status
); 1313 debug_data_cmd(cosa
, status
); 1316 spin_unlock_irqrestore(&cosa
->lock
, flags
); 1319 static voidput_driver_status_nolock(struct cosa_data
*cosa
) 1323 status
= (cosa
->rxbitmap
? DRIVER_RX_READY
:0) 1324 | (cosa
->txbitmap
? DRIVER_TX_READY
:0) 1325 | (cosa
->txbitmap
? ~(cosa
->txbitmap
<<DRIVER_TXMAP_SHIFT
) 1326 &DRIVER_TXMAP_MASK
:0); 1328 if(cosa
->rxbitmap
|cosa
->txbitmap
) { 1329 cosa_putstatus(cosa
, SR_RX_INT_ENA
); 1331 debug_status_out(cosa
, SR_RX_INT_ENA
); 1335 cosa_putstatus(cosa
,0); 1337 debug_status_out(cosa
,0); 1341 cosa_putdata8(cosa
, status
); 1343 debug_data_cmd(cosa
, status
); 1348 * The "kickme" function: When the DMA times out, this is called to 1349 * clean up the driver status. 1350 * FIXME: Preliminary support, the interface is probably wrong. 1352 static voidcosa_kick(struct cosa_data
*cosa
) 1354 unsigned flags
, flags1
; 1355 char*s
="(probably) IRQ"; 1357 if(test_bit(RXBIT
, &cosa
->rxtx
)) 1359 if(test_bit(TXBIT
, &cosa
->rxtx
)) 1362 printk(KERN_INFO
"%s: %s timeout - restarting.\n", cosa
->name
, s
); 1363 spin_lock_irqsave(&cosa
->lock
, flags
); 1366 flags1
=claim_dma_lock(); 1367 disable_dma(cosa
->dma
); 1368 clear_dma_ff(cosa
->dma
); 1369 release_dma_lock(flags1
); 1371 /* FIXME: Anything else? */ 1373 cosa_putstatus(cosa
,0); 1375 (void)cosa_getdata8(cosa
); 1377 cosa_putdata8(cosa
,0); 1379 put_driver_status_nolock(cosa
); 1380 spin_unlock_irqrestore(&cosa
->lock
, flags
); 1384 * Check if the whole buffer is DMA-able. It means it is below the 16M of 1385 * physical memory and doesn't span the 64k boundary. For now it seems 1386 * SKB's never do this, but we'll check this anyway. 1388 static intcosa_dma_able(struct channel_data
*chan
,char*buf
,int len
) 1391 unsigned long b
= (unsigned long)buf
; 1392 if(b
+len
>= MAX_DMA_ADDRESS
) 1394 if((b
^ (b
+len
)) &0x10000) { 1396 printk(KERN_INFO
"%s: packet spanning a 64k boundary\n", 1404 /* ---------- The SRP/COSA ROM monitor functions ---------- */ 1407 * Downloading SRP microcode: say "w" to SRP monitor, it answers by "w=", 1408 * drivers need to say 4-digit hex number meaning start address of the microcode 1409 * separated by a single space. Monitor replies by saying " =". Now driver 1410 * has to write 4-digit hex number meaning the last byte address ended 1411 * by a single space. Monitor has to reply with a space. Now the download 1412 * begins. After the download monitor replies with "\r\n." (CR LF dot). 1414 static intdownload(struct cosa_data
*cosa
,char*microcode
,int length
,int address
) 1418 if(put_wait_data(cosa
,'w') == -1)return-1; 1419 if((i
=get_wait_data(cosa
)) !='w') {printk("dnld: 0x%04x\n",i
);return-2;} 1420 if(get_wait_data(cosa
) !='=')return-3; 1422 if(puthexnumber(cosa
, address
) <0)return-4; 1423 if(put_wait_data(cosa
,' ') == -1)return-10; 1424 if(get_wait_data(cosa
) !=' ')return-11; 1425 if(get_wait_data(cosa
) !='=')return-12; 1427 if(puthexnumber(cosa
, address
+length
-1) <0)return-13; 1428 if(put_wait_data(cosa
,' ') == -1)return-18; 1429 if(get_wait_data(cosa
) !=' ')return-19; 1433 #ifndef SRP_DOWNLOAD_AT_BOOT 1434 if(get_user(c
, microcode
)) 1439 if(put_wait_data(cosa
, c
) == -1) 1444 if(get_wait_data(cosa
) !='\r')return-21; 1445 if(get_wait_data(cosa
) !='\n')return-22; 1446 if(get_wait_data(cosa
) !='.')return-23; 1448 printk(KERN_DEBUG
"cosa%d: download completed.\n", cosa
->num
); 1455 * Starting microcode is done via the "g" command of the SRP monitor. 1456 * The chat should be the following: "g" "g=" "<addr><CR>" 1457 * "<CR><CR><LF><CR><LF>". 1459 static intstartmicrocode(struct cosa_data
*cosa
,int address
) 1461 if(put_wait_data(cosa
,'g') == -1)return-1; 1462 if(get_wait_data(cosa
) !='g')return-2; 1463 if(get_wait_data(cosa
) !='=')return-3; 1465 if(puthexnumber(cosa
, address
) <0)return-4; 1466 if(put_wait_data(cosa
,'\r') == -1)return-5; 1468 if(get_wait_data(cosa
) !='\r')return-6; 1469 if(get_wait_data(cosa
) !='\r')return-7; 1470 if(get_wait_data(cosa
) !='\n')return-8; 1471 if(get_wait_data(cosa
) !='\r')return-9; 1472 if(get_wait_data(cosa
) !='\n')return-10; 1474 printk(KERN_DEBUG
"cosa%d: microcode started\n", cosa
->num
); 1480 * Reading memory is done via the "r" command of the SRP monitor. 1481 * The chat is the following "r" "r=" "<addr> " " =" "<last_byte> " " " 1482 * Then driver can read the data and the conversation is finished 1483 * by SRP monitor sending "<CR><LF>." (dot at the end). 1485 * This routine is not needed during the normal operation and serves 1486 * for debugging purposes only. 1488 static intreadmem(struct cosa_data
*cosa
,char*microcode
,int length
,int address
) 1490 if(put_wait_data(cosa
,'r') == -1)return-1; 1491 if((get_wait_data(cosa
)) !='r')return-2; 1492 if((get_wait_data(cosa
)) !='=')return-3; 1494 if(puthexnumber(cosa
, address
) <0)return-4; 1495 if(put_wait_data(cosa
,' ') == -1)return-5; 1496 if(get_wait_data(cosa
) !=' ')return-6; 1497 if(get_wait_data(cosa
) !='=')return-7; 1499 if(puthexnumber(cosa
, address
+length
-1) <0)return-8; 1500 if(put_wait_data(cosa
,' ') == -1)return-9; 1501 if(get_wait_data(cosa
) !=' ')return-10; 1506 if((i
=get_wait_data(cosa
)) == -1) { 1507 printk(KERN_INFO
"cosa: 0x%04x bytes remaining\n", 1513 if(put_user(c
, microcode
)) 1521 if(get_wait_data(cosa
) !='\r')return-21; 1522 if(get_wait_data(cosa
) !='\n')return-22; 1523 if(get_wait_data(cosa
) !='.')return-23; 1525 printk(KERN_DEBUG
"cosa%d: readmem completed.\n", cosa
->num
); 1531 * This function resets the device and reads the initial prompt 1532 * of the device's ROM monitor. 1534 static intcosa_reset_and_read_id(struct cosa_data
*cosa
,char*idstring
) 1536 int i
=0, id
=0, prev
=0, curr
=0; 1538 /* Reset the card ... */ 1539 cosa_putstatus(cosa
,0); 1540 cosa_getdata8(cosa
); 1541 cosa_putstatus(cosa
, SR_RST
); 1543 current
->state
= TASK_INTERRUPTIBLE
; 1544 schedule_timeout(HZ
/2); 1545 current
->state
= TASK_RUNNING
; 1549 /* Disable all IRQs from the card */ 1550 cosa_putstatus(cosa
,0); 1553 * Try to read the ID string. The card then prints out the 1554 * identification string ended by the "\n\x2e". 1556 * The following loop is indexed through i (instead of id) 1557 * to avoid looping forever when for any reason 1558 * the port returns '\r', '\n' or '\x2e' permanently. 1560 for(i
=0; i
<COSA_MAX_ID_STRING
-1; i
++, prev
=curr
) { 1561 if((curr
=get_wait_data(cosa
)) == -1) { 1565 if(curr
!='\r'&& curr
!='\n'&& curr
!=0x2e) 1566 idstring
[id
++] = curr
; 1567 if(curr
==0x2e&& prev
=='\n') 1570 /* Perhaps we should fail when i==COSA_MAX_ID_STRING-1 ? */ 1576 /* ---------- Auxiliary routines for COSA/SRP monitor ---------- */ 1579 * This routine gets the data byte from the card waiting for the SR_RX_RDY 1580 * bit to be set in a loop. It should be used in the exceptional cases 1581 * only (for example when resetting the card or downloading the firmware. 1583 static intget_wait_data(struct cosa_data
*cosa
) 1588 /* read data and return them */ 1589 if(cosa_getstatus(cosa
) & SR_RX_RDY
) { 1591 r
=cosa_getdata8(cosa
); 1593 printk(KERN_INFO
"cosa: get_wait_data returning after %d retries\n",999-retries
); 1597 /* sleep if not ready to read */ 1598 current
->state
= TASK_INTERRUPTIBLE
; 1599 schedule_timeout(1); 1601 printk(KERN_INFO
"cosa: timeout in get_wait_data (status 0x%x)\n", 1602 cosa_getstatus(cosa
)); 1607 * This routine puts the data byte to the card waiting for the SR_TX_RDY 1608 * bit to be set in a loop. It should be used in the exceptional cases 1609 * only (for example when resetting the card or downloading the firmware). 1611 static intput_wait_data(struct cosa_data
*cosa
,int data
) 1615 /* read data and return them */ 1616 if(cosa_getstatus(cosa
) & SR_TX_RDY
) { 1617 cosa_putdata8(cosa
, data
); 1619 printk(KERN_INFO
"Putdata: %d retries\n",999-retries
); 1624 /* sleep if not ready to read */ 1625 current
->state
= TASK_INTERRUPTIBLE
; 1626 schedule_timeout(1); 1629 printk(KERN_INFO
"cosa%d: timeout in put_wait_data (status 0x%x)\n", 1630 cosa
->num
,cosa_getstatus(cosa
)); 1635 * The following routine puts the hexadecimal number into the SRP monitor 1636 * and verifies the proper echo of the sent bytes. Returns 0 on success, 1637 * negative number on failure (-1,-3,-5,-7) means that put_wait_data() failed, 1638 * (-2,-4,-6,-8) means that reading echo failed. 1640 static intputhexnumber(struct cosa_data
*cosa
,int number
) 1645 /* Well, I should probably replace this by something faster. */ 1646 sprintf(temp
,"%04X", number
); 1647 for(i
=0; i
<4; i
++) { 1648 if(put_wait_data(cosa
, temp
[i
]) == -1) { 1649 printk(KERN_NOTICE
"cosa%d: puthexnumber failed to write byte %d\n", 1653 if(get_wait_data(cosa
) != temp
[i
]) { 1654 printk(KERN_NOTICE
"cosa%d: puthexhumber failed to read echo of byte %d\n", 1663 /* ---------- Interrupt routines ---------- */ 1666 * There are three types of interrupt: 1667 * At the beginning of transmit - this handled is in tx_interrupt(), 1668 * at the beginning of receive - it is in rx_interrupt() and 1669 * at the end of transmit/receive - it is the eot_interrupt() function. 1670 * These functions are multiplexed by cosa_interrupt() according to the 1671 * COSA status byte. I have moved the rx/tx/eot interrupt handling into 1672 * separate functions to make it more readable. These functions are inline, 1673 * so there should be no overhead of function call. 1675 * In the COSA bus-master mode, we need to tell the card the address of a 1676 * buffer. Unfortunately, COSA may be too slow for us, so we must busy-wait. 1677 * It's time to use the bottom half :-( 1681 * Transmit interrupt routine - called when COSA is willing to obtain 1682 * data from the OS. The most tricky part of the routine is selection 1683 * of channel we (OS) want to send packet for. For SRP we should probably 1684 * use the round-robin approach. The newer COSA firmwares have a simple 1685 * flow-control - in the status word has bits 2 and 3 set to 1 means that the 1686 * channel 0 or 1 doesn't want to receive data. 1688 * It seems there is a bug in COSA firmware (need to trace it further): 1689 * When the driver status says that the kernel has no more data for transmit 1690 * (e.g. at the end of TX DMA) and then the kernel changes its mind 1691 * (e.g. new packet is queued to hard_start_xmit()), the card issues 1692 * the TX interrupt but does not mark the channel as ready-to-transmit. 1693 * The fix seems to be to push the packet to COSA despite its request. 1694 * We first try to obey the card's opinion, and then fall back to forced TX. 1696 staticinlinevoidtx_interrupt(struct cosa_data
*cosa
,int status
) 1698 unsigned long flags
, flags1
; 1700 printk(KERN_INFO
"cosa%d: SR_DOWN_REQUEST status=0x%04x\n", 1703 spin_lock_irqsave(&cosa
->lock
, flags
); 1704 set_bit(TXBIT
, &cosa
->rxtx
); 1705 if(!test_bit(IRQBIT
, &cosa
->rxtx
)) { 1706 /* flow control, see the comment above */ 1708 if(!cosa
->txbitmap
) { 1709 printk(KERN_WARNING
"%s: No channel wants data " 1710 "in TX IRQ. Expect DMA timeout.", 1712 put_driver_status_nolock(cosa
); 1713 clear_bit(TXBIT
, &cosa
->rxtx
); 1714 spin_unlock_irqrestore(&cosa
->lock
, flags
); 1720 if(cosa
->txchan
>= cosa
->nchannels
) 1722 if(!(cosa
->txbitmap
& (1<<cosa
->txchan
))) 1724 if(~status
& (1<< (cosa
->txchan
+DRIVER_TXMAP_SHIFT
))) 1726 /* in second pass, accept first ready-to-TX channel */ 1727 if(i
> cosa
->nchannels
) { 1728 /* Can be safely ignored */ 1730 printk(KERN_DEBUG
"%s: Forcing TX " 1731 "to not-ready channel %d\n", 1732 cosa
->name
, cosa
->txchan
); 1738 cosa
->txsize
= cosa
->chan
[cosa
->txchan
].txsize
; 1739 if(cosa_dma_able(cosa
->chan
+cosa
->txchan
, 1740 cosa
->chan
[cosa
->txchan
].txbuf
, cosa
->txsize
)) { 1741 cosa
->txbuf
= cosa
->chan
[cosa
->txchan
].txbuf
; 1743 memcpy(cosa
->bouncebuf
, cosa
->chan
[cosa
->txchan
].txbuf
, 1745 cosa
->txbuf
= cosa
->bouncebuf
; 1750 if(!test_bit(IRQBIT
, &cosa
->rxtx
)) { 1751 cosa_putstatus(cosa
, SR_TX_INT_ENA
); 1752 cosa_putdata8(cosa
, ((cosa
->txchan
<<5) &0xe0)| 1753 ((cosa
->txsize
>>8) &0x1f)); 1755 debug_status_out(cosa
, SR_TX_INT_ENA
); 1756 debug_data_out(cosa
, ((cosa
->txchan
<<5) &0xe0)| 1757 ((cosa
->txsize
>>8) &0x1f)); 1758 debug_data_in(cosa
,cosa_getdata8(cosa
)); 1760 cosa_getdata8(cosa
); 1762 set_bit(IRQBIT
, &cosa
->rxtx
); 1763 spin_unlock_irqrestore(&cosa
->lock
, flags
); 1766 clear_bit(IRQBIT
, &cosa
->rxtx
); 1767 cosa_putstatus(cosa
,0); 1768 cosa_putdata8(cosa
, cosa
->txsize
&0xff); 1770 debug_status_out(cosa
,0); 1771 debug_data_out(cosa
, cosa
->txsize
&0xff); 1775 cosa_putstatus(cosa
, SR_TX_INT_ENA
); 1776 cosa_putdata16(cosa
, ((cosa
->txchan
<<13) &0xe000) 1777 | (cosa
->txsize
&0x1fff)); 1779 debug_status_out(cosa
, SR_TX_INT_ENA
); 1780 debug_data_out(cosa
, ((cosa
->txchan
<<13) &0xe000) 1781 | (cosa
->txsize
&0x1fff)); 1782 debug_data_in(cosa
,cosa_getdata8(cosa
)); 1783 debug_status_out(cosa
,0); 1785 cosa_getdata8(cosa
); 1787 cosa_putstatus(cosa
,0); 1790 if(cosa
->busmaster
) { 1791 unsigned long addr
=virt_to_bus(cosa
->txbuf
); 1793 printk(KERN_INFO
"busmaster IRQ\n"); 1794 while(!(cosa_getstatus(cosa
)&SR_TX_RDY
)) { 1797 if(count
>1000)break; 1799 printk(KERN_INFO
"status %x\n",cosa_getstatus(cosa
)); 1800 printk(KERN_INFO
"ready after %d loops\n", count
); 1801 cosa_putdata16(cosa
, (addr
>>16)&0xffff); 1804 while(!(cosa_getstatus(cosa
)&SR_TX_RDY
)) { 1806 if(count
>1000)break; 1809 printk(KERN_INFO
"ready after %d loops\n", count
); 1810 cosa_putdata16(cosa
, addr
&0xffff); 1811 flags1
=claim_dma_lock(); 1812 set_dma_mode(cosa
->dma
, DMA_MODE_CASCADE
); 1813 enable_dma(cosa
->dma
); 1814 release_dma_lock(flags1
); 1817 flags1
=claim_dma_lock(); 1818 disable_dma(cosa
->dma
); 1819 clear_dma_ff(cosa
->dma
); 1820 set_dma_mode(cosa
->dma
, DMA_MODE_WRITE
); 1821 set_dma_addr(cosa
->dma
,virt_to_bus(cosa
->txbuf
)); 1822 set_dma_count(cosa
->dma
, cosa
->txsize
); 1823 enable_dma(cosa
->dma
); 1824 release_dma_lock(flags1
); 1826 cosa_putstatus(cosa
, SR_TX_DMA_ENA
|SR_USR_INT_ENA
); 1828 debug_status_out(cosa
, SR_TX_DMA_ENA
|SR_USR_INT_ENA
); 1830 spin_unlock_irqrestore(&cosa
->lock
, flags
); 1833 staticinlinevoidrx_interrupt(struct cosa_data
*cosa
,int status
) 1835 unsigned long flags
; 1837 printk(KERN_INFO
"cosa%d: SR_UP_REQUEST\n", cosa
->num
); 1840 spin_lock_irqsave(&cosa
->lock
, flags
); 1841 set_bit(RXBIT
, &cosa
->rxtx
); 1844 if(!test_bit(IRQBIT
, &cosa
->rxtx
)) { 1845 set_bit(IRQBIT
, &cosa
->rxtx
); 1846 put_driver_status_nolock(cosa
); 1847 cosa
->rxsize
=cosa_getdata8(cosa
) <<8; 1849 debug_data_in(cosa
, cosa
->rxsize
>>8); 1851 spin_unlock_irqrestore(&cosa
->lock
, flags
); 1854 clear_bit(IRQBIT
, &cosa
->rxtx
); 1855 cosa
->rxsize
|=cosa_getdata8(cosa
) &0xff; 1857 debug_data_in(cosa
, cosa
->rxsize
&0xff); 1860 printk(KERN_INFO
"cosa%d: receive rxsize = (0x%04x).\n", 1861 cosa
->num
, cosa
->rxsize
); 1865 cosa
->rxsize
=cosa_getdata16(cosa
); 1867 debug_data_in(cosa
, cosa
->rxsize
); 1870 printk(KERN_INFO
"cosa%d: receive rxsize = (0x%04x).\n", 1871 cosa
->num
, cosa
->rxsize
); 1874 if(((cosa
->rxsize
&0xe000) >>13) >= cosa
->nchannels
) { 1875 printk(KERN_WARNING
"%s: rx for unknown channel (0x%04x)\n", 1876 cosa
->name
, cosa
->rxsize
); 1877 spin_unlock_irqrestore(&cosa
->lock
, flags
); 1880 cosa
->rxchan
= cosa
->chan
+ ((cosa
->rxsize
&0xe000) >>13); 1881 cosa
->rxsize
&=0x1fff; 1882 spin_unlock_irqrestore(&cosa
->lock
, flags
); 1885 if(cosa
->rxchan
->setup_rx
) 1886 cosa
->rxbuf
= cosa
->rxchan
->setup_rx(cosa
->rxchan
, cosa
->rxsize
); 1889 reject
:/* Reject the packet */ 1890 printk(KERN_INFO
"cosa%d: rejecting packet on channel %d\n", 1891 cosa
->num
, cosa
->rxchan
->num
); 1892 cosa
->rxbuf
= cosa
->bouncebuf
; 1896 flags
=claim_dma_lock(); 1897 disable_dma(cosa
->dma
); 1898 clear_dma_ff(cosa
->dma
); 1899 set_dma_mode(cosa
->dma
, DMA_MODE_READ
); 1900 if(cosa_dma_able(cosa
->rxchan
, cosa
->rxbuf
, cosa
->rxsize
&0x1fff)) { 1901 set_dma_addr(cosa
->dma
,virt_to_bus(cosa
->rxbuf
)); 1903 set_dma_addr(cosa
->dma
,virt_to_bus(cosa
->bouncebuf
)); 1905 set_dma_count(cosa
->dma
, (cosa
->rxsize
&0x1fff)); 1906 enable_dma(cosa
->dma
); 1907 release_dma_lock(flags
); 1908 spin_lock_irqsave(&cosa
->lock
, flags
); 1909 cosa_putstatus(cosa
, SR_RX_DMA_ENA
|SR_USR_INT_ENA
); 1910 if(!is_8bit(cosa
) && (status
& SR_TX_RDY
)) 1911 cosa_putdata8(cosa
, DRIVER_RX_READY
); 1913 debug_status_out(cosa
, SR_RX_DMA_ENA
|SR_USR_INT_ENA
); 1914 if(!is_8bit(cosa
) && (status
& SR_TX_RDY
)) 1915 debug_data_cmd(cosa
, DRIVER_RX_READY
); 1917 spin_unlock_irqrestore(&cosa
->lock
, flags
); 1920 static voidinlineeot_interrupt(struct cosa_data
*cosa
,int status
) 1922 unsigned long flags
, flags1
; 1923 spin_lock_irqsave(&cosa
->lock
, flags
); 1924 flags1
=claim_dma_lock(); 1925 disable_dma(cosa
->dma
); 1926 clear_dma_ff(cosa
->dma
); 1927 release_dma_lock(flags1
); 1928 if(test_bit(TXBIT
, &cosa
->rxtx
)) { 1929 struct channel_data
*chan
= cosa
->chan
+cosa
->txchan
; 1931 if(chan
->tx_done(chan
, cosa
->txsize
)) 1932 clear_bit(chan
->num
, &cosa
->txbitmap
); 1933 }else if(test_bit(RXBIT
, &cosa
->rxtx
)) { 1937 printk(KERN_INFO
"cosa%dc%d: done rx(0x%x)", cosa
->num
, 1938 cosa
->rxchan
->num
, cosa
->rxsize
); 1939 for(i
=0; i
<cosa
->rxsize
; i
++) 1940 printk(" %02x", cosa
->rxbuf
[i
]&0xff); 1944 /* Packet for unknown channel? */ 1945 if(cosa
->rxbuf
== cosa
->bouncebuf
) 1947 if(!cosa_dma_able(cosa
->rxchan
, cosa
->rxbuf
, cosa
->rxsize
)) 1948 memcpy(cosa
->rxbuf
, cosa
->bouncebuf
, cosa
->rxsize
); 1949 if(cosa
->rxchan
->rx_done
) 1950 if(cosa
->rxchan
->rx_done(cosa
->rxchan
)) 1951 clear_bit(cosa
->rxchan
->num
, &cosa
->rxbitmap
); 1953 printk(KERN_NOTICE
"cosa%d: unexpected EOT interrupt\n", 1957 * Clear the RXBIT, TXBIT and IRQBIT (the latest should be 1958 * cleared anyway). We should do it as soon as possible 1959 * so that we can tell the COSA we are done and to give it a time 1964 put_driver_status_nolock(cosa
); 1965 spin_unlock_irqrestore(&cosa
->lock
, flags
); 1968 static voidcosa_interrupt(int irq
,void*cosa_
,struct pt_regs
*regs
) 1972 struct cosa_data
*cosa
= cosa_
; 1974 status
=cosa_getstatus(cosa
); 1976 printk(KERN_INFO
"cosa%d: got IRQ, status 0x%02x\n", cosa
->num
, 1980 debug_status_in(cosa
, status
); 1982 switch(status
& SR_CMD_FROM_SRP_MASK
) { 1983 case SR_DOWN_REQUEST
: 1984 tx_interrupt(cosa
, status
); 1987 rx_interrupt(cosa
, status
); 1989 case SR_END_OF_TRANSFER
: 1990 eot_interrupt(cosa
, status
); 1993 /* We may be too fast for SRP. Try to wait a bit more. */ 1998 printk(KERN_INFO
"cosa%d: unknown status 0x%02x in IRQ after %d retries\n", 1999 cosa
->num
, status
&0xff, count
); 2003 printk(KERN_INFO
"%s: %d-times got unknown status in IRQ\n", 2006 printk(KERN_INFO
"%s: returning from IRQ\n", cosa
->name
); 2011 /* ---------- I/O debugging routines ---------- */ 2013 * These routines can be used to monitor COSA/SRP I/O and to printk() 2014 * the data being transfered on the data and status I/O port in a 2019 static voiddebug_status_in(struct cosa_data
*cosa
,int status
) 2022 switch(status
& SR_CMD_FROM_SRP_MASK
) { 2026 case SR_DOWN_REQUEST
: 2029 case SR_END_OF_TRANSFER
: 2036 printk(KERN_INFO
"%s: IO: status -> 0x%02x (%s%s%s%s)\n", 2039 status
& SR_USR_RQ
?"USR_RQ|":"", 2040 status
& SR_TX_RDY
?"TX_RDY|":"", 2041 status
& SR_RX_RDY
?"RX_RDY|":"", 2045 static voiddebug_status_out(struct cosa_data
*cosa
,int status
) 2047 printk(KERN_INFO
"%s: IO: status <- 0x%02x (%s%s%s%s%s%s)\n", 2050 status
& SR_RX_DMA_ENA
?"RXDMA|":"!rxdma|", 2051 status
& SR_TX_DMA_ENA
?"TXDMA|":"!txdma|", 2052 status
& SR_RST
?"RESET|":"", 2053 status
& SR_USR_INT_ENA
?"USRINT|":"!usrint|", 2054 status
& SR_TX_INT_ENA
?"TXINT|":"!txint|", 2055 status
& SR_RX_INT_ENA
?"RXINT":"!rxint"); 2058 static voiddebug_data_in(struct cosa_data
*cosa
,int data
) 2060 printk(KERN_INFO
"%s: IO: data -> 0x%04x\n", cosa
->name
, data
); 2063 static voiddebug_data_out(struct cosa_data
*cosa
,int data
) 2065 printk(KERN_INFO
"%s: IO: data <- 0x%04x\n", cosa
->name
, data
); 2068 static voiddebug_data_cmd(struct cosa_data
*cosa
,int data
) 2070 printk(KERN_INFO
"%s: IO: data <- 0x%04x (%s|%s)\n", 2072 data
& SR_RDY_RCV
?"RX_RDY":"!rx_rdy", 2073 data
& SR_RDY_SND
?"TX_RDY":"!tx_rdy"); 2077 /* EOF -- this file has not been truncated */