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.2-rc4 1654 lines 38 kB view raw
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * SDLA An implementation of a driver for the Sangoma S502/S508 series 4 * multi-protocol PC interface card. Initial offering is with 5 * the DLCI driver, providing Frame Relay support for linux. 6 * 7 * Global definitions for the Frame relay interface. 8 * 9 * Version: @(#)sdla.c 0.30 12 Sep 1996 10 * 11 * Credits: Sangoma Technologies, for the use of 2 cards for an extended 12 * period of time. 13 * David Mandelstam <dm@sangoma.com> for getting me started on 14 * this project, and incentive to complete it. 15 * Gene Kozen <74604.152@compuserve.com> for providing me with 16 * important information about the cards. 17 * 18 * Author: Mike McLagan <mike.mclagan@linux.org> 19 * 20 * Changes: 21 * 0.15 Mike McLagan Improved error handling, packet dropping 22 * 0.20 Mike McLagan New transmit/receive flags for config 23 * If in FR mode, don't accept packets from 24 * non DLCI devices. 25 * 0.25 Mike McLagan Fixed problem with rejecting packets 26 * from non DLCI devices. 27 * 0.30 Mike McLagan Fixed kernel panic when used with modified 28 * ifconfig 29 */ 30 31#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 32 33#include <linux/module.h> 34#include <linux/kernel.h> 35#include <linux/types.h> 36#include <linux/fcntl.h> 37#include <linux/interrupt.h> 38#include <linux/ptrace.h> 39#include <linux/ioport.h> 40#include <linux/in.h> 41#include <linux/slab.h> 42#include <linux/string.h> 43#include <linux/timer.h> 44#include <linux/errno.h> 45#include <linux/init.h> 46#include <linux/netdevice.h> 47#include <linux/skbuff.h> 48#include <linux/if_arp.h> 49#include <linux/if_frad.h> 50#include <linux/sdla.h> 51#include <linux/bitops.h> 52 53#include <asm/io.h> 54#include <asm/dma.h> 55#include <linux/uaccess.h> 56 57static const char* version = "SDLA driver v0.30, 12 Sep 1996, mike.mclagan@linux.org"; 58 59static unsigned int valid_port[] = { 0x250, 0x270, 0x280, 0x300, 0x350, 0x360, 0x380, 0x390}; 60 61static unsigned int valid_mem[] = { 62 0xA0000, 0xA2000, 0xA4000, 0xA6000, 0xA8000, 0xAA000, 0xAC000, 0xAE000, 63 0xB0000, 0xB2000, 0xB4000, 0xB6000, 0xB8000, 0xBA000, 0xBC000, 0xBE000, 64 0xC0000, 0xC2000, 0xC4000, 0xC6000, 0xC8000, 0xCA000, 0xCC000, 0xCE000, 65 0xD0000, 0xD2000, 0xD4000, 0xD6000, 0xD8000, 0xDA000, 0xDC000, 0xDE000, 66 0xE0000, 0xE2000, 0xE4000, 0xE6000, 0xE8000, 0xEA000, 0xEC000, 0xEE000}; 67 68static DEFINE_SPINLOCK(sdla_lock); 69 70/********************************************************* 71 * 72 * these are the core routines that access the card itself 73 * 74 *********************************************************/ 75 76#define SDLA_WINDOW(dev,addr) outb((((addr) >> 13) & 0x1F), (dev)->base_addr + SDLA_REG_Z80_WINDOW) 77 78static void __sdla_read(struct net_device *dev, int addr, void *buf, short len) 79{ 80 char *temp; 81 const void *base; 82 int offset, bytes; 83 84 temp = buf; 85 while(len) 86 { 87 offset = addr & SDLA_ADDR_MASK; 88 bytes = offset + len > SDLA_WINDOW_SIZE ? SDLA_WINDOW_SIZE - offset : len; 89 base = (const void *) (dev->mem_start + offset); 90 91 SDLA_WINDOW(dev, addr); 92 memcpy(temp, base, bytes); 93 94 addr += bytes; 95 temp += bytes; 96 len -= bytes; 97 } 98} 99 100static void sdla_read(struct net_device *dev, int addr, void *buf, short len) 101{ 102 unsigned long flags; 103 spin_lock_irqsave(&sdla_lock, flags); 104 __sdla_read(dev, addr, buf, len); 105 spin_unlock_irqrestore(&sdla_lock, flags); 106} 107 108static void __sdla_write(struct net_device *dev, int addr, 109 const void *buf, short len) 110{ 111 const char *temp; 112 void *base; 113 int offset, bytes; 114 115 temp = buf; 116 while(len) 117 { 118 offset = addr & SDLA_ADDR_MASK; 119 bytes = offset + len > SDLA_WINDOW_SIZE ? SDLA_WINDOW_SIZE - offset : len; 120 base = (void *) (dev->mem_start + offset); 121 122 SDLA_WINDOW(dev, addr); 123 memcpy(base, temp, bytes); 124 125 addr += bytes; 126 temp += bytes; 127 len -= bytes; 128 } 129} 130 131static void sdla_write(struct net_device *dev, int addr, 132 const void *buf, short len) 133{ 134 unsigned long flags; 135 136 spin_lock_irqsave(&sdla_lock, flags); 137 __sdla_write(dev, addr, buf, len); 138 spin_unlock_irqrestore(&sdla_lock, flags); 139} 140 141 142static void sdla_clear(struct net_device *dev) 143{ 144 unsigned long flags; 145 char *base; 146 int len, addr, bytes; 147 148 len = 65536; 149 addr = 0; 150 bytes = SDLA_WINDOW_SIZE; 151 base = (void *) dev->mem_start; 152 153 spin_lock_irqsave(&sdla_lock, flags); 154 while(len) 155 { 156 SDLA_WINDOW(dev, addr); 157 memset(base, 0, bytes); 158 159 addr += bytes; 160 len -= bytes; 161 } 162 spin_unlock_irqrestore(&sdla_lock, flags); 163 164} 165 166static char sdla_byte(struct net_device *dev, int addr) 167{ 168 unsigned long flags; 169 char byte, *temp; 170 171 temp = (void *) (dev->mem_start + (addr & SDLA_ADDR_MASK)); 172 173 spin_lock_irqsave(&sdla_lock, flags); 174 SDLA_WINDOW(dev, addr); 175 byte = *temp; 176 spin_unlock_irqrestore(&sdla_lock, flags); 177 178 return byte; 179} 180 181static void sdla_stop(struct net_device *dev) 182{ 183 struct frad_local *flp; 184 185 flp = netdev_priv(dev); 186 switch(flp->type) 187 { 188 case SDLA_S502A: 189 outb(SDLA_S502A_HALT, dev->base_addr + SDLA_REG_CONTROL); 190 flp->state = SDLA_HALT; 191 break; 192 case SDLA_S502E: 193 outb(SDLA_HALT, dev->base_addr + SDLA_REG_Z80_CONTROL); 194 outb(SDLA_S502E_ENABLE, dev->base_addr + SDLA_REG_CONTROL); 195 flp->state = SDLA_S502E_ENABLE; 196 break; 197 case SDLA_S507: 198 flp->state &= ~SDLA_CPUEN; 199 outb(flp->state, dev->base_addr + SDLA_REG_CONTROL); 200 break; 201 case SDLA_S508: 202 flp->state &= ~SDLA_CPUEN; 203 outb(flp->state, dev->base_addr + SDLA_REG_CONTROL); 204 break; 205 } 206} 207 208static void sdla_start(struct net_device *dev) 209{ 210 struct frad_local *flp; 211 212 flp = netdev_priv(dev); 213 switch(flp->type) 214 { 215 case SDLA_S502A: 216 outb(SDLA_S502A_NMI, dev->base_addr + SDLA_REG_CONTROL); 217 outb(SDLA_S502A_START, dev->base_addr + SDLA_REG_CONTROL); 218 flp->state = SDLA_S502A_START; 219 break; 220 case SDLA_S502E: 221 outb(SDLA_S502E_CPUEN, dev->base_addr + SDLA_REG_Z80_CONTROL); 222 outb(0x00, dev->base_addr + SDLA_REG_CONTROL); 223 flp->state = 0; 224 break; 225 case SDLA_S507: 226 flp->state |= SDLA_CPUEN; 227 outb(flp->state, dev->base_addr + SDLA_REG_CONTROL); 228 break; 229 case SDLA_S508: 230 flp->state |= SDLA_CPUEN; 231 outb(flp->state, dev->base_addr + SDLA_REG_CONTROL); 232 break; 233 } 234} 235 236/**************************************************** 237 * 238 * this is used for the S502A/E cards to determine 239 * the speed of the onboard CPU. Calibration is 240 * necessary for the Frame Relay code uploaded 241 * later. Incorrect results cause timing problems 242 * with link checks & status messages 243 * 244 ***************************************************/ 245 246static int sdla_z80_poll(struct net_device *dev, int z80_addr, int jiffs, char resp1, char resp2) 247{ 248 unsigned long start, done, now; 249 char resp, *temp; 250 251 start = now = jiffies; 252 done = jiffies + jiffs; 253 254 temp = (void *)dev->mem_start; 255 temp += z80_addr & SDLA_ADDR_MASK; 256 257 resp = ~resp1; 258 while (time_before(jiffies, done) && (resp != resp1) && (!resp2 || (resp != resp2))) 259 { 260 if (jiffies != now) 261 { 262 SDLA_WINDOW(dev, z80_addr); 263 now = jiffies; 264 resp = *temp; 265 } 266 } 267 return time_before(jiffies, done) ? jiffies - start : -1; 268} 269 270/* constants for Z80 CPU speed */ 271#define Z80_READY '1' /* Z80 is ready to begin */ 272#define LOADER_READY '2' /* driver is ready to begin */ 273#define Z80_SCC_OK '3' /* SCC is on board */ 274#define Z80_SCC_BAD '4' /* SCC was not found */ 275 276static int sdla_cpuspeed(struct net_device *dev, struct ifreq *ifr) 277{ 278 int jiffs; 279 char data; 280 281 sdla_start(dev); 282 if (sdla_z80_poll(dev, 0, 3*HZ, Z80_READY, 0) < 0) 283 return -EIO; 284 285 data = LOADER_READY; 286 sdla_write(dev, 0, &data, 1); 287 288 if ((jiffs = sdla_z80_poll(dev, 0, 8*HZ, Z80_SCC_OK, Z80_SCC_BAD)) < 0) 289 return -EIO; 290 291 sdla_stop(dev); 292 sdla_read(dev, 0, &data, 1); 293 294 if (data == Z80_SCC_BAD) 295 { 296 printk("%s: SCC bad\n", dev->name); 297 return -EIO; 298 } 299 300 if (data != Z80_SCC_OK) 301 return -EINVAL; 302 303 if (jiffs < 165) 304 ifr->ifr_mtu = SDLA_CPU_16M; 305 else if (jiffs < 220) 306 ifr->ifr_mtu = SDLA_CPU_10M; 307 else if (jiffs < 258) 308 ifr->ifr_mtu = SDLA_CPU_8M; 309 else if (jiffs < 357) 310 ifr->ifr_mtu = SDLA_CPU_7M; 311 else if (jiffs < 467) 312 ifr->ifr_mtu = SDLA_CPU_5M; 313 else 314 ifr->ifr_mtu = SDLA_CPU_3M; 315 316 return 0; 317} 318 319/************************************************ 320 * 321 * Direct interaction with the Frame Relay code 322 * starts here. 323 * 324 ************************************************/ 325 326struct _dlci_stat 327{ 328 short dlci; 329 char flags; 330} __packed; 331 332struct _frad_stat 333{ 334 char flags; 335 struct _dlci_stat dlcis[SDLA_MAX_DLCI]; 336}; 337 338static void sdla_errors(struct net_device *dev, int cmd, int dlci, int ret, int len, void *data) 339{ 340 struct _dlci_stat *pstatus; 341 short *pdlci; 342 int i; 343 char *state, line[30]; 344 345 switch (ret) 346 { 347 case SDLA_RET_MODEM: 348 state = data; 349 if (*state & SDLA_MODEM_DCD_LOW) 350 netdev_info(dev, "Modem DCD unexpectedly low!\n"); 351 if (*state & SDLA_MODEM_CTS_LOW) 352 netdev_info(dev, "Modem CTS unexpectedly low!\n"); 353 /* I should probably do something about this! */ 354 break; 355 356 case SDLA_RET_CHANNEL_OFF: 357 netdev_info(dev, "Channel became inoperative!\n"); 358 /* same here */ 359 break; 360 361 case SDLA_RET_CHANNEL_ON: 362 netdev_info(dev, "Channel became operative!\n"); 363 /* same here */ 364 break; 365 366 case SDLA_RET_DLCI_STATUS: 367 netdev_info(dev, "Status change reported by Access Node\n"); 368 len /= sizeof(struct _dlci_stat); 369 for(pstatus = data, i=0;i < len;i++,pstatus++) 370 { 371 if (pstatus->flags & SDLA_DLCI_NEW) 372 state = "new"; 373 else if (pstatus->flags & SDLA_DLCI_DELETED) 374 state = "deleted"; 375 else if (pstatus->flags & SDLA_DLCI_ACTIVE) 376 state = "active"; 377 else 378 { 379 sprintf(line, "unknown status: %02X", pstatus->flags); 380 state = line; 381 } 382 netdev_info(dev, "DLCI %i: %s\n", 383 pstatus->dlci, state); 384 /* same here */ 385 } 386 break; 387 388 case SDLA_RET_DLCI_UNKNOWN: 389 netdev_info(dev, "Received unknown DLCIs:"); 390 len /= sizeof(short); 391 for(pdlci = data,i=0;i < len;i++,pdlci++) 392 pr_cont(" %i", *pdlci); 393 pr_cont("\n"); 394 break; 395 396 case SDLA_RET_TIMEOUT: 397 netdev_err(dev, "Command timed out!\n"); 398 break; 399 400 case SDLA_RET_BUF_OVERSIZE: 401 netdev_info(dev, "Bc/CIR overflow, acceptable size is %i\n", 402 len); 403 break; 404 405 case SDLA_RET_BUF_TOO_BIG: 406 netdev_info(dev, "Buffer size over specified max of %i\n", 407 len); 408 break; 409 410 case SDLA_RET_CHANNEL_INACTIVE: 411 case SDLA_RET_DLCI_INACTIVE: 412 case SDLA_RET_CIR_OVERFLOW: 413 case SDLA_RET_NO_BUFS: 414 if (cmd == SDLA_INFORMATION_WRITE) 415 break; 416 417 default: 418 netdev_dbg(dev, "Cmd 0x%02X generated return code 0x%02X\n", 419 cmd, ret); 420 /* Further processing could be done here */ 421 break; 422 } 423} 424 425static int sdla_cmd(struct net_device *dev, int cmd, short dlci, short flags, 426 void *inbuf, short inlen, void *outbuf, short *outlen) 427{ 428 static struct _frad_stat status; 429 struct frad_local *flp; 430 struct sdla_cmd *cmd_buf; 431 unsigned long pflags; 432 unsigned long jiffs; 433 int ret, waiting, len; 434 long window; 435 436 flp = netdev_priv(dev); 437 window = flp->type == SDLA_S508 ? SDLA_508_CMD_BUF : SDLA_502_CMD_BUF; 438 cmd_buf = (struct sdla_cmd *)(dev->mem_start + (window & SDLA_ADDR_MASK)); 439 ret = 0; 440 len = 0; 441 jiffs = jiffies + HZ; /* 1 second is plenty */ 442 443 spin_lock_irqsave(&sdla_lock, pflags); 444 SDLA_WINDOW(dev, window); 445 cmd_buf->cmd = cmd; 446 cmd_buf->dlci = dlci; 447 cmd_buf->flags = flags; 448 449 if (inbuf) 450 memcpy(cmd_buf->data, inbuf, inlen); 451 452 cmd_buf->length = inlen; 453 454 cmd_buf->opp_flag = 1; 455 spin_unlock_irqrestore(&sdla_lock, pflags); 456 457 waiting = 1; 458 len = 0; 459 while (waiting && time_before_eq(jiffies, jiffs)) 460 { 461 if (waiting++ % 3) 462 { 463 spin_lock_irqsave(&sdla_lock, pflags); 464 SDLA_WINDOW(dev, window); 465 waiting = ((volatile int)(cmd_buf->opp_flag)); 466 spin_unlock_irqrestore(&sdla_lock, pflags); 467 } 468 } 469 470 if (!waiting) 471 { 472 473 spin_lock_irqsave(&sdla_lock, pflags); 474 SDLA_WINDOW(dev, window); 475 ret = cmd_buf->retval; 476 len = cmd_buf->length; 477 if (outbuf && outlen) 478 { 479 *outlen = *outlen >= len ? len : *outlen; 480 481 if (*outlen) 482 memcpy(outbuf, cmd_buf->data, *outlen); 483 } 484 485 /* This is a local copy that's used for error handling */ 486 if (ret) 487 memcpy(&status, cmd_buf->data, len > sizeof(status) ? sizeof(status) : len); 488 489 spin_unlock_irqrestore(&sdla_lock, pflags); 490 } 491 else 492 ret = SDLA_RET_TIMEOUT; 493 494 if (ret != SDLA_RET_OK) 495 sdla_errors(dev, cmd, dlci, ret, len, &status); 496 497 return ret; 498} 499 500/*********************************************** 501 * 502 * these functions are called by the DLCI driver 503 * 504 ***********************************************/ 505 506static int sdla_reconfig(struct net_device *dev); 507 508static int sdla_activate(struct net_device *slave, struct net_device *master) 509{ 510 struct frad_local *flp; 511 int i; 512 513 flp = netdev_priv(slave); 514 515 for(i=0;i<CONFIG_DLCI_MAX;i++) 516 if (flp->master[i] == master) 517 break; 518 519 if (i == CONFIG_DLCI_MAX) 520 return -ENODEV; 521 522 flp->dlci[i] = abs(flp->dlci[i]); 523 524 if (netif_running(slave) && (flp->config.station == FRAD_STATION_NODE)) 525 sdla_cmd(slave, SDLA_ACTIVATE_DLCI, 0, 0, &flp->dlci[i], sizeof(short), NULL, NULL); 526 527 return 0; 528} 529 530static int sdla_deactivate(struct net_device *slave, struct net_device *master) 531{ 532 struct frad_local *flp; 533 int i; 534 535 flp = netdev_priv(slave); 536 537 for(i=0;i<CONFIG_DLCI_MAX;i++) 538 if (flp->master[i] == master) 539 break; 540 541 if (i == CONFIG_DLCI_MAX) 542 return -ENODEV; 543 544 flp->dlci[i] = -abs(flp->dlci[i]); 545 546 if (netif_running(slave) && (flp->config.station == FRAD_STATION_NODE)) 547 sdla_cmd(slave, SDLA_DEACTIVATE_DLCI, 0, 0, &flp->dlci[i], sizeof(short), NULL, NULL); 548 549 return 0; 550} 551 552static int sdla_assoc(struct net_device *slave, struct net_device *master) 553{ 554 struct frad_local *flp; 555 int i; 556 557 if (master->type != ARPHRD_DLCI) 558 return -EINVAL; 559 560 flp = netdev_priv(slave); 561 562 for(i=0;i<CONFIG_DLCI_MAX;i++) 563 { 564 if (!flp->master[i]) 565 break; 566 if (abs(flp->dlci[i]) == *(short *)(master->dev_addr)) 567 return -EADDRINUSE; 568 } 569 570 if (i == CONFIG_DLCI_MAX) 571 return -EMLINK; /* #### Alan: Comments on this ?? */ 572 573 574 flp->master[i] = master; 575 flp->dlci[i] = -*(short *)(master->dev_addr); 576 master->mtu = slave->mtu; 577 578 if (netif_running(slave)) { 579 if (flp->config.station == FRAD_STATION_CPE) 580 sdla_reconfig(slave); 581 else 582 sdla_cmd(slave, SDLA_ADD_DLCI, 0, 0, master->dev_addr, sizeof(short), NULL, NULL); 583 } 584 585 return 0; 586} 587 588static int sdla_deassoc(struct net_device *slave, struct net_device *master) 589{ 590 struct frad_local *flp; 591 int i; 592 593 flp = netdev_priv(slave); 594 595 for(i=0;i<CONFIG_DLCI_MAX;i++) 596 if (flp->master[i] == master) 597 break; 598 599 if (i == CONFIG_DLCI_MAX) 600 return -ENODEV; 601 602 flp->master[i] = NULL; 603 flp->dlci[i] = 0; 604 605 606 if (netif_running(slave)) { 607 if (flp->config.station == FRAD_STATION_CPE) 608 sdla_reconfig(slave); 609 else 610 sdla_cmd(slave, SDLA_DELETE_DLCI, 0, 0, master->dev_addr, sizeof(short), NULL, NULL); 611 } 612 613 return 0; 614} 615 616static int sdla_dlci_conf(struct net_device *slave, struct net_device *master, int get) 617{ 618 struct frad_local *flp; 619 struct dlci_local *dlp; 620 int i; 621 short len, ret; 622 623 flp = netdev_priv(slave); 624 625 for(i=0;i<CONFIG_DLCI_MAX;i++) 626 if (flp->master[i] == master) 627 break; 628 629 if (i == CONFIG_DLCI_MAX) 630 return -ENODEV; 631 632 dlp = netdev_priv(master); 633 634 ret = SDLA_RET_OK; 635 len = sizeof(struct dlci_conf); 636 if (netif_running(slave)) { 637 if (get) 638 ret = sdla_cmd(slave, SDLA_READ_DLCI_CONFIGURATION, abs(flp->dlci[i]), 0, 639 NULL, 0, &dlp->config, &len); 640 else 641 ret = sdla_cmd(slave, SDLA_SET_DLCI_CONFIGURATION, abs(flp->dlci[i]), 0, 642 &dlp->config, sizeof(struct dlci_conf) - 4 * sizeof(short), NULL, NULL); 643 } 644 645 return ret == SDLA_RET_OK ? 0 : -EIO; 646} 647 648/************************** 649 * 650 * now for the Linux driver 651 * 652 **************************/ 653 654/* NOTE: the DLCI driver deals with freeing the SKB!! */ 655static netdev_tx_t sdla_transmit(struct sk_buff *skb, 656 struct net_device *dev) 657{ 658 struct frad_local *flp; 659 int ret, addr, accept, i; 660 short size; 661 unsigned long flags; 662 struct buf_entry *pbuf; 663 664 flp = netdev_priv(dev); 665 ret = 0; 666 accept = 1; 667 668 netif_stop_queue(dev); 669 670 /* 671 * stupid GateD insists on setting up the multicast router thru us 672 * and we're ill equipped to handle a non Frame Relay packet at this 673 * time! 674 */ 675 676 accept = 1; 677 switch (dev->type) 678 { 679 case ARPHRD_FRAD: 680 if (skb->dev->type != ARPHRD_DLCI) 681 { 682 netdev_warn(dev, "Non DLCI device, type %i, tried to send on FRAD module\n", 683 skb->dev->type); 684 accept = 0; 685 } 686 break; 687 default: 688 netdev_warn(dev, "unknown firmware type 0x%04X\n", 689 dev->type); 690 accept = 0; 691 break; 692 } 693 if (accept) 694 { 695 /* this is frame specific, but till there's a PPP module, it's the default */ 696 switch (flp->type) 697 { 698 case SDLA_S502A: 699 case SDLA_S502E: 700 ret = sdla_cmd(dev, SDLA_INFORMATION_WRITE, *(short *)(skb->dev->dev_addr), 0, skb->data, skb->len, NULL, NULL); 701 break; 702 case SDLA_S508: 703 size = sizeof(addr); 704 ret = sdla_cmd(dev, SDLA_INFORMATION_WRITE, *(short *)(skb->dev->dev_addr), 0, NULL, skb->len, &addr, &size); 705 if (ret == SDLA_RET_OK) 706 { 707 708 spin_lock_irqsave(&sdla_lock, flags); 709 SDLA_WINDOW(dev, addr); 710 pbuf = (void *)(((int) dev->mem_start) + (addr & SDLA_ADDR_MASK)); 711 __sdla_write(dev, pbuf->buf_addr, skb->data, skb->len); 712 SDLA_WINDOW(dev, addr); 713 pbuf->opp_flag = 1; 714 spin_unlock_irqrestore(&sdla_lock, flags); 715 } 716 break; 717 } 718 719 switch (ret) 720 { 721 case SDLA_RET_OK: 722 dev->stats.tx_packets++; 723 break; 724 725 case SDLA_RET_CIR_OVERFLOW: 726 case SDLA_RET_BUF_OVERSIZE: 727 case SDLA_RET_NO_BUFS: 728 dev->stats.tx_dropped++; 729 break; 730 731 default: 732 dev->stats.tx_errors++; 733 break; 734 } 735 } 736 netif_wake_queue(dev); 737 for(i=0;i<CONFIG_DLCI_MAX;i++) 738 { 739 if(flp->master[i]!=NULL) 740 netif_wake_queue(flp->master[i]); 741 } 742 743 dev_kfree_skb(skb); 744 return NETDEV_TX_OK; 745} 746 747static void sdla_receive(struct net_device *dev) 748{ 749 struct net_device *master; 750 struct frad_local *flp; 751 struct dlci_local *dlp; 752 struct sk_buff *skb; 753 754 struct sdla_cmd *cmd; 755 struct buf_info *pbufi; 756 struct buf_entry *pbuf; 757 758 unsigned long flags; 759 int i=0, received, success, addr, buf_base, buf_top; 760 short dlci, len, len2, split; 761 762 flp = netdev_priv(dev); 763 success = 1; 764 received = addr = buf_top = buf_base = 0; 765 len = dlci = 0; 766 skb = NULL; 767 master = NULL; 768 cmd = NULL; 769 pbufi = NULL; 770 pbuf = NULL; 771 772 spin_lock_irqsave(&sdla_lock, flags); 773 774 switch (flp->type) 775 { 776 case SDLA_S502A: 777 case SDLA_S502E: 778 cmd = (void *) (dev->mem_start + (SDLA_502_RCV_BUF & SDLA_ADDR_MASK)); 779 SDLA_WINDOW(dev, SDLA_502_RCV_BUF); 780 success = cmd->opp_flag; 781 if (!success) 782 break; 783 784 dlci = cmd->dlci; 785 len = cmd->length; 786 break; 787 788 case SDLA_S508: 789 pbufi = (void *) (dev->mem_start + (SDLA_508_RXBUF_INFO & SDLA_ADDR_MASK)); 790 SDLA_WINDOW(dev, SDLA_508_RXBUF_INFO); 791 pbuf = (void *) (dev->mem_start + ((pbufi->rse_base + flp->buffer * sizeof(struct buf_entry)) & SDLA_ADDR_MASK)); 792 success = pbuf->opp_flag; 793 if (!success) 794 break; 795 796 buf_top = pbufi->buf_top; 797 buf_base = pbufi->buf_base; 798 dlci = pbuf->dlci; 799 len = pbuf->length; 800 addr = pbuf->buf_addr; 801 break; 802 } 803 804 /* common code, find the DLCI and get the SKB */ 805 if (success) 806 { 807 for (i=0;i<CONFIG_DLCI_MAX;i++) 808 if (flp->dlci[i] == dlci) 809 break; 810 811 if (i == CONFIG_DLCI_MAX) 812 { 813 netdev_notice(dev, "Received packet from invalid DLCI %i, ignoring\n", 814 dlci); 815 dev->stats.rx_errors++; 816 success = 0; 817 } 818 } 819 820 if (success) 821 { 822 master = flp->master[i]; 823 skb = dev_alloc_skb(len + sizeof(struct frhdr)); 824 if (skb == NULL) 825 { 826 netdev_notice(dev, "Memory squeeze, dropping packet\n"); 827 dev->stats.rx_dropped++; 828 success = 0; 829 } 830 else 831 skb_reserve(skb, sizeof(struct frhdr)); 832 } 833 834 /* pick up the data */ 835 switch (flp->type) 836 { 837 case SDLA_S502A: 838 case SDLA_S502E: 839 if (success) 840 __sdla_read(dev, SDLA_502_RCV_BUF + SDLA_502_DATA_OFS, skb_put(skb,len), len); 841 842 SDLA_WINDOW(dev, SDLA_502_RCV_BUF); 843 cmd->opp_flag = 0; 844 break; 845 846 case SDLA_S508: 847 if (success) 848 { 849 /* is this buffer split off the end of the internal ring buffer */ 850 split = addr + len > buf_top + 1 ? len - (buf_top - addr + 1) : 0; 851 len2 = len - split; 852 853 __sdla_read(dev, addr, skb_put(skb, len2), len2); 854 if (split) 855 __sdla_read(dev, buf_base, skb_put(skb, split), split); 856 } 857 858 /* increment the buffer we're looking at */ 859 SDLA_WINDOW(dev, SDLA_508_RXBUF_INFO); 860 flp->buffer = (flp->buffer + 1) % pbufi->rse_num; 861 pbuf->opp_flag = 0; 862 break; 863 } 864 865 if (success) 866 { 867 dev->stats.rx_packets++; 868 dlp = netdev_priv(master); 869 (*dlp->receive)(skb, master); 870 } 871 872 spin_unlock_irqrestore(&sdla_lock, flags); 873} 874 875static irqreturn_t sdla_isr(int dummy, void *dev_id) 876{ 877 struct net_device *dev; 878 struct frad_local *flp; 879 char byte; 880 881 dev = dev_id; 882 883 flp = netdev_priv(dev); 884 885 if (!flp->initialized) 886 { 887 netdev_warn(dev, "irq %d for uninitialized device\n", dev->irq); 888 return IRQ_NONE; 889 } 890 891 byte = sdla_byte(dev, flp->type == SDLA_S508 ? SDLA_508_IRQ_INTERFACE : SDLA_502_IRQ_INTERFACE); 892 switch (byte) 893 { 894 case SDLA_INTR_RX: 895 sdla_receive(dev); 896 break; 897 898 /* the command will get an error return, which is processed above */ 899 case SDLA_INTR_MODEM: 900 case SDLA_INTR_STATUS: 901 sdla_cmd(dev, SDLA_READ_DLC_STATUS, 0, 0, NULL, 0, NULL, NULL); 902 break; 903 904 case SDLA_INTR_TX: 905 case SDLA_INTR_COMPLETE: 906 case SDLA_INTR_TIMER: 907 netdev_warn(dev, "invalid irq flag 0x%02X\n", byte); 908 break; 909 } 910 911 /* the S502E requires a manual acknowledgement of the interrupt */ 912 if (flp->type == SDLA_S502E) 913 { 914 flp->state &= ~SDLA_S502E_INTACK; 915 outb(flp->state, dev->base_addr + SDLA_REG_CONTROL); 916 flp->state |= SDLA_S502E_INTACK; 917 outb(flp->state, dev->base_addr + SDLA_REG_CONTROL); 918 } 919 920 /* this clears the byte, informing the Z80 we're done */ 921 byte = 0; 922 sdla_write(dev, flp->type == SDLA_S508 ? SDLA_508_IRQ_INTERFACE : SDLA_502_IRQ_INTERFACE, &byte, sizeof(byte)); 923 return IRQ_HANDLED; 924} 925 926static void sdla_poll(struct timer_list *t) 927{ 928 struct frad_local *flp = from_timer(flp, t, timer); 929 struct net_device *dev = flp->dev; 930 931 if (sdla_byte(dev, SDLA_502_RCV_BUF)) 932 sdla_receive(dev); 933 934 flp->timer.expires = 1; 935 add_timer(&flp->timer); 936} 937 938static int sdla_close(struct net_device *dev) 939{ 940 struct frad_local *flp; 941 struct intr_info intr; 942 int len, i; 943 short dlcis[CONFIG_DLCI_MAX]; 944 945 flp = netdev_priv(dev); 946 947 len = 0; 948 for(i=0;i<CONFIG_DLCI_MAX;i++) 949 if (flp->dlci[i]) 950 dlcis[len++] = abs(flp->dlci[i]); 951 len *= 2; 952 953 if (flp->config.station == FRAD_STATION_NODE) 954 { 955 for(i=0;i<CONFIG_DLCI_MAX;i++) 956 if (flp->dlci[i] > 0) 957 sdla_cmd(dev, SDLA_DEACTIVATE_DLCI, 0, 0, dlcis, len, NULL, NULL); 958 sdla_cmd(dev, SDLA_DELETE_DLCI, 0, 0, &flp->dlci[i], sizeof(flp->dlci[i]), NULL, NULL); 959 } 960 961 memset(&intr, 0, sizeof(intr)); 962 /* let's start up the reception */ 963 switch(flp->type) 964 { 965 case SDLA_S502A: 966 del_timer(&flp->timer); 967 break; 968 969 case SDLA_S502E: 970 sdla_cmd(dev, SDLA_SET_IRQ_TRIGGER, 0, 0, &intr, sizeof(char) + sizeof(short), NULL, NULL); 971 flp->state &= ~SDLA_S502E_INTACK; 972 outb(flp->state, dev->base_addr + SDLA_REG_CONTROL); 973 break; 974 975 case SDLA_S507: 976 break; 977 978 case SDLA_S508: 979 sdla_cmd(dev, SDLA_SET_IRQ_TRIGGER, 0, 0, &intr, sizeof(struct intr_info), NULL, NULL); 980 flp->state &= ~SDLA_S508_INTEN; 981 outb(flp->state, dev->base_addr + SDLA_REG_CONTROL); 982 break; 983 } 984 985 sdla_cmd(dev, SDLA_DISABLE_COMMUNICATIONS, 0, 0, NULL, 0, NULL, NULL); 986 987 netif_stop_queue(dev); 988 989 return 0; 990} 991 992struct conf_data { 993 struct frad_conf config; 994 short dlci[CONFIG_DLCI_MAX]; 995}; 996 997static int sdla_open(struct net_device *dev) 998{ 999 struct frad_local *flp; 1000 struct dlci_local *dlp; 1001 struct conf_data data; 1002 struct intr_info intr; 1003 int len, i; 1004 char byte; 1005 1006 flp = netdev_priv(dev); 1007 1008 if (!flp->initialized) 1009 return -EPERM; 1010 1011 if (!flp->configured) 1012 return -EPERM; 1013 1014 /* time to send in the configuration */ 1015 len = 0; 1016 for(i=0;i<CONFIG_DLCI_MAX;i++) 1017 if (flp->dlci[i]) 1018 data.dlci[len++] = abs(flp->dlci[i]); 1019 len *= 2; 1020 1021 memcpy(&data.config, &flp->config, sizeof(struct frad_conf)); 1022 len += sizeof(struct frad_conf); 1023 1024 sdla_cmd(dev, SDLA_DISABLE_COMMUNICATIONS, 0, 0, NULL, 0, NULL, NULL); 1025 sdla_cmd(dev, SDLA_SET_DLCI_CONFIGURATION, 0, 0, &data, len, NULL, NULL); 1026 1027 if (flp->type == SDLA_S508) 1028 flp->buffer = 0; 1029 1030 sdla_cmd(dev, SDLA_ENABLE_COMMUNICATIONS, 0, 0, NULL, 0, NULL, NULL); 1031 1032 /* let's start up the reception */ 1033 memset(&intr, 0, sizeof(intr)); 1034 switch(flp->type) 1035 { 1036 case SDLA_S502A: 1037 flp->timer.expires = 1; 1038 add_timer(&flp->timer); 1039 break; 1040 1041 case SDLA_S502E: 1042 flp->state |= SDLA_S502E_ENABLE; 1043 outb(flp->state, dev->base_addr + SDLA_REG_CONTROL); 1044 flp->state |= SDLA_S502E_INTACK; 1045 outb(flp->state, dev->base_addr + SDLA_REG_CONTROL); 1046 byte = 0; 1047 sdla_write(dev, SDLA_502_IRQ_INTERFACE, &byte, sizeof(byte)); 1048 intr.flags = SDLA_INTR_RX | SDLA_INTR_STATUS | SDLA_INTR_MODEM; 1049 sdla_cmd(dev, SDLA_SET_IRQ_TRIGGER, 0, 0, &intr, sizeof(char) + sizeof(short), NULL, NULL); 1050 break; 1051 1052 case SDLA_S507: 1053 break; 1054 1055 case SDLA_S508: 1056 flp->state |= SDLA_S508_INTEN; 1057 outb(flp->state, dev->base_addr + SDLA_REG_CONTROL); 1058 byte = 0; 1059 sdla_write(dev, SDLA_508_IRQ_INTERFACE, &byte, sizeof(byte)); 1060 intr.flags = SDLA_INTR_RX | SDLA_INTR_STATUS | SDLA_INTR_MODEM; 1061 intr.irq = dev->irq; 1062 sdla_cmd(dev, SDLA_SET_IRQ_TRIGGER, 0, 0, &intr, sizeof(struct intr_info), NULL, NULL); 1063 break; 1064 } 1065 1066 if (flp->config.station == FRAD_STATION_CPE) 1067 { 1068 byte = SDLA_ICS_STATUS_ENQ; 1069 sdla_cmd(dev, SDLA_ISSUE_IN_CHANNEL_SIGNAL, 0, 0, &byte, sizeof(byte), NULL, NULL); 1070 } 1071 else 1072 { 1073 sdla_cmd(dev, SDLA_ADD_DLCI, 0, 0, data.dlci, len - sizeof(struct frad_conf), NULL, NULL); 1074 for(i=0;i<CONFIG_DLCI_MAX;i++) 1075 if (flp->dlci[i] > 0) 1076 sdla_cmd(dev, SDLA_ACTIVATE_DLCI, 0, 0, &flp->dlci[i], 2*sizeof(flp->dlci[i]), NULL, NULL); 1077 } 1078 1079 /* configure any specific DLCI settings */ 1080 for(i=0;i<CONFIG_DLCI_MAX;i++) 1081 if (flp->dlci[i]) 1082 { 1083 dlp = netdev_priv(flp->master[i]); 1084 if (dlp->configured) 1085 sdla_cmd(dev, SDLA_SET_DLCI_CONFIGURATION, abs(flp->dlci[i]), 0, &dlp->config, sizeof(struct dlci_conf), NULL, NULL); 1086 } 1087 1088 netif_start_queue(dev); 1089 1090 return 0; 1091} 1092 1093static int sdla_config(struct net_device *dev, struct frad_conf __user *conf, int get) 1094{ 1095 struct frad_local *flp; 1096 struct conf_data data; 1097 int i; 1098 short size; 1099 1100 if (dev->type == 0xFFFF) 1101 return -EUNATCH; 1102 1103 flp = netdev_priv(dev); 1104 1105 if (!get) 1106 { 1107 if (netif_running(dev)) 1108 return -EBUSY; 1109 1110 if(copy_from_user(&data.config, conf, sizeof(struct frad_conf))) 1111 return -EFAULT; 1112 1113 if (data.config.station & ~FRAD_STATION_NODE) 1114 return -EINVAL; 1115 1116 if (data.config.flags & ~FRAD_VALID_FLAGS) 1117 return -EINVAL; 1118 1119 if ((data.config.kbaud < 0) || 1120 ((data.config.kbaud > 128) && (flp->type != SDLA_S508))) 1121 return -EINVAL; 1122 1123 if (data.config.clocking & ~(FRAD_CLOCK_INT | SDLA_S508_PORT_RS232)) 1124 return -EINVAL; 1125 1126 if ((data.config.mtu < 0) || (data.config.mtu > SDLA_MAX_MTU)) 1127 return -EINVAL; 1128 1129 if ((data.config.T391 < 5) || (data.config.T391 > 30)) 1130 return -EINVAL; 1131 1132 if ((data.config.T392 < 5) || (data.config.T392 > 30)) 1133 return -EINVAL; 1134 1135 if ((data.config.N391 < 1) || (data.config.N391 > 255)) 1136 return -EINVAL; 1137 1138 if ((data.config.N392 < 1) || (data.config.N392 > 10)) 1139 return -EINVAL; 1140 1141 if ((data.config.N393 < 1) || (data.config.N393 > 10)) 1142 return -EINVAL; 1143 1144 memcpy(&flp->config, &data.config, sizeof(struct frad_conf)); 1145 flp->config.flags |= SDLA_DIRECT_RECV; 1146 1147 if (flp->type == SDLA_S508) 1148 flp->config.flags |= SDLA_TX70_RX30; 1149 1150 if (dev->mtu != flp->config.mtu) 1151 { 1152 /* this is required to change the MTU */ 1153 dev->mtu = flp->config.mtu; 1154 for(i=0;i<CONFIG_DLCI_MAX;i++) 1155 if (flp->master[i]) 1156 flp->master[i]->mtu = flp->config.mtu; 1157 } 1158 1159 flp->config.mtu += sizeof(struct frhdr); 1160 1161 /* off to the races! */ 1162 if (!flp->configured) 1163 sdla_start(dev); 1164 1165 flp->configured = 1; 1166 } 1167 else 1168 { 1169 /* no sense reading if the CPU isn't started */ 1170 if (netif_running(dev)) 1171 { 1172 size = sizeof(data); 1173 if (sdla_cmd(dev, SDLA_READ_DLCI_CONFIGURATION, 0, 0, NULL, 0, &data, &size) != SDLA_RET_OK) 1174 return -EIO; 1175 } 1176 else 1177 if (flp->configured) 1178 memcpy(&data.config, &flp->config, sizeof(struct frad_conf)); 1179 else 1180 memset(&data.config, 0, sizeof(struct frad_conf)); 1181 1182 memcpy(&flp->config, &data.config, sizeof(struct frad_conf)); 1183 data.config.flags &= FRAD_VALID_FLAGS; 1184 data.config.mtu -= data.config.mtu > sizeof(struct frhdr) ? sizeof(struct frhdr) : data.config.mtu; 1185 return copy_to_user(conf, &data.config, sizeof(struct frad_conf))?-EFAULT:0; 1186 } 1187 1188 return 0; 1189} 1190 1191static int sdla_xfer(struct net_device *dev, struct sdla_mem __user *info, int read) 1192{ 1193 struct sdla_mem mem; 1194 char *temp; 1195 1196 if(copy_from_user(&mem, info, sizeof(mem))) 1197 return -EFAULT; 1198 1199 if (read) 1200 { 1201 temp = kzalloc(mem.len, GFP_KERNEL); 1202 if (!temp) 1203 return -ENOMEM; 1204 sdla_read(dev, mem.addr, temp, mem.len); 1205 if(copy_to_user(mem.data, temp, mem.len)) 1206 { 1207 kfree(temp); 1208 return -EFAULT; 1209 } 1210 kfree(temp); 1211 } 1212 else 1213 { 1214 temp = memdup_user(mem.data, mem.len); 1215 if (IS_ERR(temp)) 1216 return PTR_ERR(temp); 1217 sdla_write(dev, mem.addr, temp, mem.len); 1218 kfree(temp); 1219 } 1220 return 0; 1221} 1222 1223static int sdla_reconfig(struct net_device *dev) 1224{ 1225 struct frad_local *flp; 1226 struct conf_data data; 1227 int i, len; 1228 1229 flp = netdev_priv(dev); 1230 1231 len = 0; 1232 for(i=0;i<CONFIG_DLCI_MAX;i++) 1233 if (flp->dlci[i]) 1234 data.dlci[len++] = flp->dlci[i]; 1235 len *= 2; 1236 1237 memcpy(&data, &flp->config, sizeof(struct frad_conf)); 1238 len += sizeof(struct frad_conf); 1239 1240 sdla_cmd(dev, SDLA_DISABLE_COMMUNICATIONS, 0, 0, NULL, 0, NULL, NULL); 1241 sdla_cmd(dev, SDLA_SET_DLCI_CONFIGURATION, 0, 0, &data, len, NULL, NULL); 1242 sdla_cmd(dev, SDLA_ENABLE_COMMUNICATIONS, 0, 0, NULL, 0, NULL, NULL); 1243 1244 return 0; 1245} 1246 1247static int sdla_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) 1248{ 1249 struct frad_local *flp; 1250 1251 if(!capable(CAP_NET_ADMIN)) 1252 return -EPERM; 1253 1254 flp = netdev_priv(dev); 1255 1256 if (!flp->initialized) 1257 return -EINVAL; 1258 1259 switch (cmd) 1260 { 1261 case FRAD_GET_CONF: 1262 case FRAD_SET_CONF: 1263 return sdla_config(dev, ifr->ifr_data, cmd == FRAD_GET_CONF); 1264 1265 case SDLA_IDENTIFY: 1266 ifr->ifr_flags = flp->type; 1267 break; 1268 1269 case SDLA_CPUSPEED: 1270 return sdla_cpuspeed(dev, ifr); 1271 1272/* ========================================================== 1273NOTE: This is rather a useless action right now, as the 1274 current driver does not support protocols other than 1275 FR. However, Sangoma has modules for a number of 1276 other protocols in the works. 1277============================================================*/ 1278 case SDLA_PROTOCOL: 1279 if (flp->configured) 1280 return -EALREADY; 1281 1282 switch (ifr->ifr_flags) 1283 { 1284 case ARPHRD_FRAD: 1285 dev->type = ifr->ifr_flags; 1286 break; 1287 default: 1288 return -ENOPROTOOPT; 1289 } 1290 break; 1291 1292 case SDLA_CLEARMEM: 1293 sdla_clear(dev); 1294 break; 1295 1296 case SDLA_WRITEMEM: 1297 case SDLA_READMEM: 1298 if(!capable(CAP_SYS_RAWIO)) 1299 return -EPERM; 1300 return sdla_xfer(dev, ifr->ifr_data, cmd == SDLA_READMEM); 1301 1302 case SDLA_START: 1303 sdla_start(dev); 1304 break; 1305 1306 case SDLA_STOP: 1307 sdla_stop(dev); 1308 break; 1309 1310 default: 1311 return -EOPNOTSUPP; 1312 } 1313 return 0; 1314} 1315 1316static int sdla_change_mtu(struct net_device *dev, int new_mtu) 1317{ 1318 if (netif_running(dev)) 1319 return -EBUSY; 1320 1321 /* for now, you can't change the MTU! */ 1322 return -EOPNOTSUPP; 1323} 1324 1325static int sdla_set_config(struct net_device *dev, struct ifmap *map) 1326{ 1327 struct frad_local *flp; 1328 int i; 1329 char byte; 1330 unsigned base; 1331 int err = -EINVAL; 1332 1333 flp = netdev_priv(dev); 1334 1335 if (flp->initialized) 1336 return -EINVAL; 1337 1338 for(i=0; i < ARRAY_SIZE(valid_port); i++) 1339 if (valid_port[i] == map->base_addr) 1340 break; 1341 1342 if (i == ARRAY_SIZE(valid_port)) 1343 return -EINVAL; 1344 1345 if (!request_region(map->base_addr, SDLA_IO_EXTENTS, dev->name)){ 1346 pr_warn("io-port 0x%04lx in use\n", dev->base_addr); 1347 return -EINVAL; 1348 } 1349 base = map->base_addr; 1350 1351 /* test for card types, S502A, S502E, S507, S508 */ 1352 /* these tests shut down the card completely, so clear the state */ 1353 flp->type = SDLA_UNKNOWN; 1354 flp->state = 0; 1355 1356 for(i=1;i<SDLA_IO_EXTENTS;i++) 1357 if (inb(base + i) != 0xFF) 1358 break; 1359 1360 if (i == SDLA_IO_EXTENTS) { 1361 outb(SDLA_HALT, base + SDLA_REG_Z80_CONTROL); 1362 if ((inb(base + SDLA_S502_STS) & 0x0F) == 0x08) { 1363 outb(SDLA_S502E_INTACK, base + SDLA_REG_CONTROL); 1364 if ((inb(base + SDLA_S502_STS) & 0x0F) == 0x0C) { 1365 outb(SDLA_HALT, base + SDLA_REG_CONTROL); 1366 flp->type = SDLA_S502E; 1367 goto got_type; 1368 } 1369 } 1370 } 1371 1372 for(byte=inb(base),i=0;i<SDLA_IO_EXTENTS;i++) 1373 if (inb(base + i) != byte) 1374 break; 1375 1376 if (i == SDLA_IO_EXTENTS) { 1377 outb(SDLA_HALT, base + SDLA_REG_CONTROL); 1378 if ((inb(base + SDLA_S502_STS) & 0x7E) == 0x30) { 1379 outb(SDLA_S507_ENABLE, base + SDLA_REG_CONTROL); 1380 if ((inb(base + SDLA_S502_STS) & 0x7E) == 0x32) { 1381 outb(SDLA_HALT, base + SDLA_REG_CONTROL); 1382 flp->type = SDLA_S507; 1383 goto got_type; 1384 } 1385 } 1386 } 1387 1388 outb(SDLA_HALT, base + SDLA_REG_CONTROL); 1389 if ((inb(base + SDLA_S508_STS) & 0x3F) == 0x00) { 1390 outb(SDLA_S508_INTEN, base + SDLA_REG_CONTROL); 1391 if ((inb(base + SDLA_S508_STS) & 0x3F) == 0x10) { 1392 outb(SDLA_HALT, base + SDLA_REG_CONTROL); 1393 flp->type = SDLA_S508; 1394 goto got_type; 1395 } 1396 } 1397 1398 outb(SDLA_S502A_HALT, base + SDLA_REG_CONTROL); 1399 if (inb(base + SDLA_S502_STS) == 0x40) { 1400 outb(SDLA_S502A_START, base + SDLA_REG_CONTROL); 1401 if (inb(base + SDLA_S502_STS) == 0x40) { 1402 outb(SDLA_S502A_INTEN, base + SDLA_REG_CONTROL); 1403 if (inb(base + SDLA_S502_STS) == 0x44) { 1404 outb(SDLA_S502A_START, base + SDLA_REG_CONTROL); 1405 flp->type = SDLA_S502A; 1406 goto got_type; 1407 } 1408 } 1409 } 1410 1411 netdev_notice(dev, "Unknown card type\n"); 1412 err = -ENODEV; 1413 goto fail; 1414 1415got_type: 1416 switch(base) { 1417 case 0x270: 1418 case 0x280: 1419 case 0x380: 1420 case 0x390: 1421 if (flp->type != SDLA_S508 && flp->type != SDLA_S507) 1422 goto fail; 1423 } 1424 1425 switch (map->irq) { 1426 case 2: 1427 if (flp->type != SDLA_S502E) 1428 goto fail; 1429 break; 1430 1431 case 10: 1432 case 11: 1433 case 12: 1434 case 15: 1435 case 4: 1436 if (flp->type != SDLA_S508 && flp->type != SDLA_S507) 1437 goto fail; 1438 break; 1439 case 3: 1440 case 5: 1441 case 7: 1442 if (flp->type == SDLA_S502A) 1443 goto fail; 1444 break; 1445 1446 default: 1447 goto fail; 1448 } 1449 1450 err = -EAGAIN; 1451 if (request_irq(dev->irq, sdla_isr, 0, dev->name, dev)) 1452 goto fail; 1453 1454 if (flp->type == SDLA_S507) { 1455 switch(dev->irq) { 1456 case 3: 1457 flp->state = SDLA_S507_IRQ3; 1458 break; 1459 case 4: 1460 flp->state = SDLA_S507_IRQ4; 1461 break; 1462 case 5: 1463 flp->state = SDLA_S507_IRQ5; 1464 break; 1465 case 7: 1466 flp->state = SDLA_S507_IRQ7; 1467 break; 1468 case 10: 1469 flp->state = SDLA_S507_IRQ10; 1470 break; 1471 case 11: 1472 flp->state = SDLA_S507_IRQ11; 1473 break; 1474 case 12: 1475 flp->state = SDLA_S507_IRQ12; 1476 break; 1477 case 15: 1478 flp->state = SDLA_S507_IRQ15; 1479 break; 1480 } 1481 } 1482 1483 for(i=0; i < ARRAY_SIZE(valid_mem); i++) 1484 if (valid_mem[i] == map->mem_start) 1485 break; 1486 1487 err = -EINVAL; 1488 if (i == ARRAY_SIZE(valid_mem)) 1489 goto fail2; 1490 1491 if (flp->type == SDLA_S502A && (map->mem_start & 0xF000) >> 12 == 0x0E) 1492 goto fail2; 1493 1494 if (flp->type != SDLA_S507 && map->mem_start >> 16 == 0x0B) 1495 goto fail2; 1496 1497 if (flp->type == SDLA_S507 && map->mem_start >> 16 == 0x0D) 1498 goto fail2; 1499 1500 byte = flp->type != SDLA_S508 ? SDLA_8K_WINDOW : 0; 1501 byte |= (map->mem_start & 0xF000) >> (12 + (flp->type == SDLA_S508 ? 1 : 0)); 1502 switch(flp->type) { 1503 case SDLA_S502A: 1504 case SDLA_S502E: 1505 switch (map->mem_start >> 16) { 1506 case 0x0A: 1507 byte |= SDLA_S502_SEG_A; 1508 break; 1509 case 0x0C: 1510 byte |= SDLA_S502_SEG_C; 1511 break; 1512 case 0x0D: 1513 byte |= SDLA_S502_SEG_D; 1514 break; 1515 case 0x0E: 1516 byte |= SDLA_S502_SEG_E; 1517 break; 1518 } 1519 break; 1520 case SDLA_S507: 1521 switch (map->mem_start >> 16) { 1522 case 0x0A: 1523 byte |= SDLA_S507_SEG_A; 1524 break; 1525 case 0x0B: 1526 byte |= SDLA_S507_SEG_B; 1527 break; 1528 case 0x0C: 1529 byte |= SDLA_S507_SEG_C; 1530 break; 1531 case 0x0E: 1532 byte |= SDLA_S507_SEG_E; 1533 break; 1534 } 1535 break; 1536 case SDLA_S508: 1537 switch (map->mem_start >> 16) { 1538 case 0x0A: 1539 byte |= SDLA_S508_SEG_A; 1540 break; 1541 case 0x0C: 1542 byte |= SDLA_S508_SEG_C; 1543 break; 1544 case 0x0D: 1545 byte |= SDLA_S508_SEG_D; 1546 break; 1547 case 0x0E: 1548 byte |= SDLA_S508_SEG_E; 1549 break; 1550 } 1551 break; 1552 } 1553 1554 /* set the memory bits, and enable access */ 1555 outb(byte, base + SDLA_REG_PC_WINDOW); 1556 1557 switch(flp->type) 1558 { 1559 case SDLA_S502E: 1560 flp->state = SDLA_S502E_ENABLE; 1561 break; 1562 case SDLA_S507: 1563 flp->state |= SDLA_MEMEN; 1564 break; 1565 case SDLA_S508: 1566 flp->state = SDLA_MEMEN; 1567 break; 1568 } 1569 outb(flp->state, base + SDLA_REG_CONTROL); 1570 1571 dev->irq = map->irq; 1572 dev->base_addr = base; 1573 dev->mem_start = map->mem_start; 1574 dev->mem_end = dev->mem_start + 0x2000; 1575 flp->initialized = 1; 1576 return 0; 1577 1578fail2: 1579 free_irq(map->irq, dev); 1580fail: 1581 release_region(base, SDLA_IO_EXTENTS); 1582 return err; 1583} 1584 1585static const struct net_device_ops sdla_netdev_ops = { 1586 .ndo_open = sdla_open, 1587 .ndo_stop = sdla_close, 1588 .ndo_do_ioctl = sdla_ioctl, 1589 .ndo_set_config = sdla_set_config, 1590 .ndo_start_xmit = sdla_transmit, 1591 .ndo_change_mtu = sdla_change_mtu, 1592}; 1593 1594static void setup_sdla(struct net_device *dev) 1595{ 1596 struct frad_local *flp = netdev_priv(dev); 1597 1598 netdev_boot_setup_check(dev); 1599 1600 dev->netdev_ops = &sdla_netdev_ops; 1601 dev->flags = 0; 1602 dev->type = 0xFFFF; 1603 dev->hard_header_len = 0; 1604 dev->addr_len = 0; 1605 dev->mtu = SDLA_MAX_MTU; 1606 1607 flp->activate = sdla_activate; 1608 flp->deactivate = sdla_deactivate; 1609 flp->assoc = sdla_assoc; 1610 flp->deassoc = sdla_deassoc; 1611 flp->dlci_conf = sdla_dlci_conf; 1612 flp->dev = dev; 1613 1614 timer_setup(&flp->timer, sdla_poll, 0); 1615 flp->timer.expires = 1; 1616} 1617 1618static struct net_device *sdla; 1619 1620static int __init init_sdla(void) 1621{ 1622 int err; 1623 1624 printk("%s.\n", version); 1625 1626 sdla = alloc_netdev(sizeof(struct frad_local), "sdla0", 1627 NET_NAME_UNKNOWN, setup_sdla); 1628 if (!sdla) 1629 return -ENOMEM; 1630 1631 err = register_netdev(sdla); 1632 if (err) 1633 free_netdev(sdla); 1634 1635 return err; 1636} 1637 1638static void __exit exit_sdla(void) 1639{ 1640 struct frad_local *flp = netdev_priv(sdla); 1641 1642 unregister_netdev(sdla); 1643 if (flp->initialized) { 1644 free_irq(sdla->irq, sdla); 1645 release_region(sdla->base_addr, SDLA_IO_EXTENTS); 1646 } 1647 del_timer_sync(&flp->timer); 1648 free_netdev(sdla); 1649} 1650 1651MODULE_LICENSE("GPL"); 1652 1653module_init(init_sdla); 1654module_exit(exit_sdla);