1/* 2 * SGI IOC3 master driver and IRQ demuxer 3 * 4 * Copyright (c) 2005 Stanislaw Skowronek <skylark@linux-mips.org> 5 * Heavily based on similar work by: 6 * Brent Casavant <bcasavan@sgi.com> - IOC4 master driver 7 * Pat Gefre <pfg@sgi.com> - IOC3 serial port IRQ demuxer 8 */ 9 10#include <linux/errno.h> 11#include <linux/module.h> 12#include <linux/pci.h> 13#include <linux/dma-mapping.h> 14#include <linux/interrupt.h> 15#include <linux/spinlock.h> 16#include <linux/delay.h> 17#include <linux/ioc3.h> 18#include <linux/rwsem.h> 19#include <linux/slab.h> 20 21#define IOC3_PCI_SIZE 0x100000 22 23static LIST_HEAD(ioc3_devices); 24static int ioc3_counter; 25static DECLARE_RWSEM(ioc3_devices_rwsem); 26 27static struct ioc3_submodule *ioc3_submodules[IOC3_MAX_SUBMODULES]; 28static struct ioc3_submodule *ioc3_ethernet; 29static DEFINE_RWLOCK(ioc3_submodules_lock); 30 31/* NIC probing code */ 32 33#define GPCR_MLAN_EN 0x00200000 /* enable MCR to pin 8 */ 34 35static inline unsigned mcr_pack(unsigned pulse, unsigned sample) 36{ 37 return (pulse << 10) | (sample << 2); 38} 39 40static int nic_wait(struct ioc3_driver_data *idd) 41{ 42 unsigned mcr; 43 44 do { 45 mcr = readl(&idd->vma->mcr); 46 } while (!(mcr & 2)); 47 48 return mcr & 1; 49} 50 51static int nic_reset(struct ioc3_driver_data *idd) 52{ 53 int presence; 54 unsigned long flags; 55 56 local_irq_save(flags); 57 writel(mcr_pack(500, 65), &idd->vma->mcr); 58 presence = nic_wait(idd); 59 local_irq_restore(flags); 60 61 udelay(500); 62 63 return presence; 64} 65 66static int nic_read_bit(struct ioc3_driver_data *idd) 67{ 68 int result; 69 unsigned long flags; 70 71 local_irq_save(flags); 72 writel(mcr_pack(6, 13), &idd->vma->mcr); 73 result = nic_wait(idd); 74 local_irq_restore(flags); 75 76 udelay(500); 77 78 return result; 79} 80 81static void nic_write_bit(struct ioc3_driver_data *idd, int bit) 82{ 83 if (bit) 84 writel(mcr_pack(6, 110), &idd->vma->mcr); 85 else 86 writel(mcr_pack(80, 30), &idd->vma->mcr); 87 88 nic_wait(idd); 89} 90 91static unsigned nic_read_byte(struct ioc3_driver_data *idd) 92{ 93 unsigned result = 0; 94 int i; 95 96 for (i = 0; i < 8; i++) 97 result = (result >> 1) | (nic_read_bit(idd) << 7); 98 99 return result; 100} 101 102static void nic_write_byte(struct ioc3_driver_data *idd, int byte) 103{ 104 int i, bit; 105 106 for (i = 8; i; i--) { 107 bit = byte & 1; 108 byte >>= 1; 109 110 nic_write_bit(idd, bit); 111 } 112} 113 114static unsigned long 115nic_find(struct ioc3_driver_data *idd, int *last, unsigned long addr) 116{ 117 int a, b, index, disc; 118 119 nic_reset(idd); 120 121 /* Search ROM. */ 122 nic_write_byte(idd, 0xF0); 123 124 /* Algorithm from ``Book of iButton Standards''. */ 125 for (index = 0, disc = 0; index < 64; index++) { 126 a = nic_read_bit(idd); 127 b = nic_read_bit(idd); 128 129 if (a && b) { 130 printk(KERN_WARNING "IOC3 NIC search failed.\n"); 131 *last = 0; 132 return 0; 133 } 134 135 if (!a && !b) { 136 if (index == *last) { 137 addr |= 1UL << index; 138 } else if (index > *last) { 139 addr &= ~(1UL << index); 140 disc = index; 141 } else if ((addr & (1UL << index)) == 0) 142 disc = index; 143 nic_write_bit(idd, (addr>>index)&1); 144 continue; 145 } else { 146 if (a) 147 addr |= 1UL << index; 148 else 149 addr &= ~(1UL << index); 150 nic_write_bit(idd, a); 151 continue; 152 } 153 } 154 *last = disc; 155 return addr; 156} 157 158static void nic_addr(struct ioc3_driver_data *idd, unsigned long addr) 159{ 160 int index; 161 162 nic_reset(idd); 163 nic_write_byte(idd, 0xF0); 164 for (index = 0; index < 64; index++) { 165 nic_read_bit(idd); 166 nic_read_bit(idd); 167 nic_write_bit(idd, (addr>>index)&1); 168 } 169} 170 171static void crc16_byte(unsigned int *crc, unsigned char db) 172{ 173 int i; 174 175 for(i=0;i<8;i++) { 176 *crc <<= 1; 177 if((db^(*crc>>16)) & 1) 178 *crc ^= 0x8005; 179 db >>= 1; 180 } 181 *crc &= 0xFFFF; 182} 183 184static unsigned int crc16_area(unsigned char *dbs, int size, unsigned int crc) 185{ 186 while(size--) 187 crc16_byte(&crc, *(dbs++)); 188 return crc; 189} 190 191static void crc8_byte(unsigned int *crc, unsigned char db) 192{ 193 int i,f; 194 195 for(i=0;i<8;i++) { 196 f = (*crc ^ db) & 1; 197 *crc >>= 1; 198 db >>= 1; 199 if(f) 200 *crc ^= 0x8c; 201 } 202 *crc &= 0xff; 203} 204 205static unsigned int crc8_addr(unsigned long addr) 206{ 207 int i; 208 unsigned int crc = 0x00; 209 210 for(i=0;i<8;i++) 211 crc8_byte(&crc, addr>>(i<<3)); 212 return crc; 213} 214 215static void 216read_redir_page(struct ioc3_driver_data *idd, unsigned long addr, int page, 217 unsigned char *redir, unsigned char *data) 218{ 219 int loops = 16, i; 220 221 while(redir[page] != 0xFF) { 222 page = redir[page]^0xFF; 223 loops--; 224 if(loops<0) { 225 printk(KERN_ERR "IOC3: NIC circular redirection\n"); 226 return; 227 } 228 } 229 loops = 3; 230 while(loops>0) { 231 nic_addr(idd, addr); 232 nic_write_byte(idd, 0xF0); 233 nic_write_byte(idd, (page << 5) & 0xE0); 234 nic_write_byte(idd, (page >> 3) & 0x1F); 235 for(i=0;i<0x20;i++) 236 data[i] = nic_read_byte(idd); 237 if(crc16_area(data, 0x20, 0x0000) == 0x800d) 238 return; 239 loops--; 240 } 241 printk(KERN_ERR "IOC3: CRC error in data page\n"); 242 for(i=0;i<0x20;i++) 243 data[i] = 0x00; 244} 245 246static void 247read_redir_map(struct ioc3_driver_data *idd, unsigned long addr, 248 unsigned char *redir) 249{ 250 int i,j,loops = 3,crc_ok; 251 unsigned int crc; 252 253 while(loops>0) { 254 crc_ok = 1; 255 nic_addr(idd, addr); 256 nic_write_byte(idd, 0xAA); 257 nic_write_byte(idd, 0x00); 258 nic_write_byte(idd, 0x01); 259 for(i=0;i<64;i+=8) { 260 for(j=0;j<8;j++) 261 redir[i+j] = nic_read_byte(idd); 262 crc = crc16_area(redir+i, 8, (i==0)?0x8707:0x0000); 263 crc16_byte(&crc, nic_read_byte(idd)); 264 crc16_byte(&crc, nic_read_byte(idd)); 265 if(crc != 0x800d) 266 crc_ok = 0; 267 } 268 if(crc_ok) 269 return; 270 loops--; 271 } 272 printk(KERN_ERR "IOC3: CRC error in redirection page\n"); 273 for(i=0;i<64;i++) 274 redir[i] = 0xFF; 275} 276 277static void read_nic(struct ioc3_driver_data *idd, unsigned long addr) 278{ 279 unsigned char redir[64]; 280 unsigned char data[64],part[32]; 281 int i,j; 282 283 /* read redirections */ 284 read_redir_map(idd, addr, redir); 285 /* read data pages */ 286 read_redir_page(idd, addr, 0, redir, data); 287 read_redir_page(idd, addr, 1, redir, data+32); 288 /* assemble the part # */ 289 j=0; 290 for(i=0;i<19;i++) 291 if(data[i+11] != ' ') 292 part[j++] = data[i+11]; 293 for(i=0;i<6;i++) 294 if(data[i+32] != ' ') 295 part[j++] = data[i+32]; 296 part[j] = 0; 297 /* skip Octane power supplies */ 298 if(!strncmp(part, "060-0035-", 9)) 299 return; 300 if(!strncmp(part, "060-0038-", 9)) 301 return; 302 strcpy(idd->nic_part, part); 303 /* assemble the serial # */ 304 j=0; 305 for(i=0;i<10;i++) 306 if(data[i+1] != ' ') 307 idd->nic_serial[j++] = data[i+1]; 308 idd->nic_serial[j] = 0; 309} 310 311static void read_mac(struct ioc3_driver_data *idd, unsigned long addr) 312{ 313 int i, loops = 3; 314 unsigned char data[13]; 315 316 while(loops>0) { 317 nic_addr(idd, addr); 318 nic_write_byte(idd, 0xF0); 319 nic_write_byte(idd, 0x00); 320 nic_write_byte(idd, 0x00); 321 nic_read_byte(idd); 322 for(i=0;i<13;i++) 323 data[i] = nic_read_byte(idd); 324 if(crc16_area(data, 13, 0x0000) == 0x800d) { 325 for(i=10;i>4;i--) 326 idd->nic_mac[10-i] = data[i]; 327 return; 328 } 329 loops--; 330 } 331 printk(KERN_ERR "IOC3: CRC error in MAC address\n"); 332 for(i=0;i<6;i++) 333 idd->nic_mac[i] = 0x00; 334} 335 336static void probe_nic(struct ioc3_driver_data *idd) 337{ 338 int save = 0, loops = 3; 339 unsigned long first, addr; 340 341 writel(GPCR_MLAN_EN, &idd->vma->gpcr_s); 342 343 while(loops>0) { 344 idd->nic_part[0] = 0; 345 idd->nic_serial[0] = 0; 346 addr = first = nic_find(idd, &save, 0); 347 if(!first) 348 return; 349 while(1) { 350 if(crc8_addr(addr)) 351 break; 352 else { 353 switch(addr & 0xFF) { 354 case 0x0B: 355 read_nic(idd, addr); 356 break; 357 case 0x09: 358 case 0x89: 359 case 0x91: 360 read_mac(idd, addr); 361 break; 362 } 363 } 364 addr = nic_find(idd, &save, addr); 365 if(addr == first) 366 return; 367 } 368 loops--; 369 } 370 printk(KERN_ERR "IOC3: CRC error in NIC address\n"); 371} 372 373/* Interrupts */ 374 375static void write_ireg(struct ioc3_driver_data *idd, uint32_t val, int which) 376{ 377 unsigned long flags; 378 379 spin_lock_irqsave(&idd->ir_lock, flags); 380 switch (which) { 381 case IOC3_W_IES: 382 writel(val, &idd->vma->sio_ies); 383 break; 384 case IOC3_W_IEC: 385 writel(val, &idd->vma->sio_iec); 386 break; 387 } 388 spin_unlock_irqrestore(&idd->ir_lock, flags); 389} 390static inline uint32_t get_pending_intrs(struct ioc3_driver_data *idd) 391{ 392 unsigned long flag; 393 uint32_t intrs = 0; 394 395 spin_lock_irqsave(&idd->ir_lock, flag); 396 intrs = readl(&idd->vma->sio_ir); 397 intrs &= readl(&idd->vma->sio_ies); 398 spin_unlock_irqrestore(&idd->ir_lock, flag); 399 return intrs; 400} 401 402static irqreturn_t ioc3_intr_io(int irq, void *arg) 403{ 404 unsigned long flags; 405 struct ioc3_driver_data *idd = arg; 406 int handled = 1, id; 407 unsigned int pending; 408 409 read_lock_irqsave(&ioc3_submodules_lock, flags); 410 411 if(idd->dual_irq && readb(&idd->vma->eisr)) { 412 /* send Ethernet IRQ to the driver */ 413 if(ioc3_ethernet && idd->active[ioc3_ethernet->id] && 414 ioc3_ethernet->intr) { 415 handled = handled && !ioc3_ethernet->intr(ioc3_ethernet, 416 idd, 0); 417 } 418 } 419 pending = get_pending_intrs(idd); /* look at the IO IRQs */ 420 421 for(id=0;id<IOC3_MAX_SUBMODULES;id++) { 422 if(idd->active[id] && ioc3_submodules[id] 423 && (pending & ioc3_submodules[id]->irq_mask) 424 && ioc3_submodules[id]->intr) { 425 write_ireg(idd, ioc3_submodules[id]->irq_mask, 426 IOC3_W_IEC); 427 if(!ioc3_submodules[id]->intr(ioc3_submodules[id], 428 idd, pending & ioc3_submodules[id]->irq_mask)) 429 pending &= ~ioc3_submodules[id]->irq_mask; 430 if (ioc3_submodules[id]->reset_mask) 431 write_ireg(idd, ioc3_submodules[id]->irq_mask, 432 IOC3_W_IES); 433 } 434 } 435 read_unlock_irqrestore(&ioc3_submodules_lock, flags); 436 if(pending) { 437 printk(KERN_WARNING 438 "IOC3: Pending IRQs 0x%08x discarded and disabled\n",pending); 439 write_ireg(idd, pending, IOC3_W_IEC); 440 handled = 1; 441 } 442 return handled?IRQ_HANDLED:IRQ_NONE; 443} 444 445static irqreturn_t ioc3_intr_eth(int irq, void *arg) 446{ 447 unsigned long flags; 448 struct ioc3_driver_data *idd = (struct ioc3_driver_data *)arg; 449 int handled = 1; 450 451 if(!idd->dual_irq) 452 return IRQ_NONE; 453 read_lock_irqsave(&ioc3_submodules_lock, flags); 454 if(ioc3_ethernet && idd->active[ioc3_ethernet->id] 455 && ioc3_ethernet->intr) 456 handled = handled && !ioc3_ethernet->intr(ioc3_ethernet, idd, 0); 457 read_unlock_irqrestore(&ioc3_submodules_lock, flags); 458 return handled?IRQ_HANDLED:IRQ_NONE; 459} 460 461void ioc3_enable(struct ioc3_submodule *is, 462 struct ioc3_driver_data *idd, unsigned int irqs) 463{ 464 write_ireg(idd, irqs & is->irq_mask, IOC3_W_IES); 465} 466 467void ioc3_ack(struct ioc3_submodule *is, struct ioc3_driver_data *idd, 468 unsigned int irqs) 469{ 470 writel(irqs & is->irq_mask, &idd->vma->sio_ir); 471} 472 473void ioc3_disable(struct ioc3_submodule *is, 474 struct ioc3_driver_data *idd, unsigned int irqs) 475{ 476 write_ireg(idd, irqs & is->irq_mask, IOC3_W_IEC); 477} 478 479void ioc3_gpcr_set(struct ioc3_driver_data *idd, unsigned int val) 480{ 481 unsigned long flags; 482 spin_lock_irqsave(&idd->gpio_lock, flags); 483 writel(val, &idd->vma->gpcr_s); 484 spin_unlock_irqrestore(&idd->gpio_lock, flags); 485} 486 487/* Keep it simple, stupid! */ 488static int find_slot(void **tab, int max) 489{ 490 int i; 491 for(i=0;i<max;i++) 492 if(!(tab[i])) 493 return i; 494 return -1; 495} 496 497/* Register an IOC3 submodule */ 498int ioc3_register_submodule(struct ioc3_submodule *is) 499{ 500 struct ioc3_driver_data *idd; 501 int alloc_id; 502 unsigned long flags; 503 504 write_lock_irqsave(&ioc3_submodules_lock, flags); 505 alloc_id = find_slot((void **)ioc3_submodules, IOC3_MAX_SUBMODULES); 506 if(alloc_id != -1) { 507 ioc3_submodules[alloc_id] = is; 508 if(is->ethernet) { 509 if(ioc3_ethernet==NULL) 510 ioc3_ethernet=is; 511 else 512 printk(KERN_WARNING 513 "IOC3 Ethernet module already registered!\n"); 514 } 515 } 516 write_unlock_irqrestore(&ioc3_submodules_lock, flags); 517 518 if(alloc_id == -1) { 519 printk(KERN_WARNING "Increase IOC3_MAX_SUBMODULES!\n"); 520 return -ENOMEM; 521 } 522 523 is->id=alloc_id; 524 525 /* Initialize submodule for each IOC3 */ 526 if (!is->probe) 527 return 0; 528 529 down_read(&ioc3_devices_rwsem); 530 list_for_each_entry(idd, &ioc3_devices, list) { 531 /* set to 1 for IRQs in probe */ 532 idd->active[alloc_id] = 1; 533 idd->active[alloc_id] = !is->probe(is, idd); 534 } 535 up_read(&ioc3_devices_rwsem); 536 537 return 0; 538} 539 540/* Unregister an IOC3 submodule */ 541void ioc3_unregister_submodule(struct ioc3_submodule *is) 542{ 543 struct ioc3_driver_data *idd; 544 unsigned long flags; 545 546 write_lock_irqsave(&ioc3_submodules_lock, flags); 547 if(ioc3_submodules[is->id]==is) 548 ioc3_submodules[is->id]=NULL; 549 else 550 printk(KERN_WARNING 551 "IOC3 submodule %s has wrong ID.\n",is->name); 552 if(ioc3_ethernet==is) 553 ioc3_ethernet = NULL; 554 write_unlock_irqrestore(&ioc3_submodules_lock, flags); 555 556 /* Remove submodule for each IOC3 */ 557 down_read(&ioc3_devices_rwsem); 558 list_for_each_entry(idd, &ioc3_devices, list) 559 if(idd->active[is->id]) { 560 if(is->remove) 561 if(is->remove(is, idd)) 562 printk(KERN_WARNING 563 "%s: IOC3 submodule %s remove failed " 564 "for pci_dev %s.\n", 565 __func__, module_name(is->owner), 566 pci_name(idd->pdev)); 567 idd->active[is->id] = 0; 568 if(is->irq_mask) 569 write_ireg(idd, is->irq_mask, IOC3_W_IEC); 570 } 571 up_read(&ioc3_devices_rwsem); 572} 573 574/********************* 575 * Device management * 576 *********************/ 577 578static char * __devinitdata 579ioc3_class_names[]={"unknown", "IP27 BaseIO", "IP30 system", "MENET 1/2/3", 580 "MENET 4", "CADduo", "Altix Serial"}; 581 582static int __devinit ioc3_class(struct ioc3_driver_data *idd) 583{ 584 int res = IOC3_CLASS_NONE; 585 /* NIC-based logic */ 586 if(!strncmp(idd->nic_part, "030-0891-", 9)) 587 res = IOC3_CLASS_BASE_IP30; 588 if(!strncmp(idd->nic_part, "030-1155-", 9)) 589 res = IOC3_CLASS_CADDUO; 590 if(!strncmp(idd->nic_part, "030-1657-", 9)) 591 res = IOC3_CLASS_SERIAL; 592 if(!strncmp(idd->nic_part, "030-1664-", 9)) 593 res = IOC3_CLASS_SERIAL; 594 /* total random heuristics */ 595#ifdef CONFIG_SGI_IP27 596 if(!idd->nic_part[0]) 597 res = IOC3_CLASS_BASE_IP27; 598#endif 599 /* print educational message */ 600 printk(KERN_INFO "IOC3 part: [%s], serial: [%s] => class %s\n", 601 idd->nic_part, idd->nic_serial, ioc3_class_names[res]); 602 return res; 603} 604/* Adds a new instance of an IOC3 card */ 605static int __devinit 606ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id) 607{ 608 struct ioc3_driver_data *idd; 609 uint32_t pcmd; 610 int ret, id; 611 612 /* Enable IOC3 and take ownership of it */ 613 if ((ret = pci_enable_device(pdev))) { 614 printk(KERN_WARNING 615 "%s: Failed to enable IOC3 device for pci_dev %s.\n", 616 __func__, pci_name(pdev)); 617 goto out; 618 } 619 pci_set_master(pdev); 620 621#ifdef USE_64BIT_DMA 622 ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(64)); 623 if (!ret) { 624 ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)); 625 if (ret < 0) { 626 printk(KERN_WARNING "%s: Unable to obtain 64 bit DMA " 627 "for consistent allocations\n", 628 __func__); 629 } 630 } 631#endif 632 633 /* Set up per-IOC3 data */ 634 idd = kzalloc(sizeof(struct ioc3_driver_data), GFP_KERNEL); 635 if (!idd) { 636 printk(KERN_WARNING 637 "%s: Failed to allocate IOC3 data for pci_dev %s.\n", 638 __func__, pci_name(pdev)); 639 ret = -ENODEV; 640 goto out_idd; 641 } 642 spin_lock_init(&idd->ir_lock); 643 spin_lock_init(&idd->gpio_lock); 644 idd->pdev = pdev; 645 646 /* Map all IOC3 registers. These are shared between subdevices 647 * so the main IOC3 module manages them. 648 */ 649 idd->pma = pci_resource_start(pdev, 0); 650 if (!idd->pma) { 651 printk(KERN_WARNING 652 "%s: Unable to find IOC3 resource " 653 "for pci_dev %s.\n", 654 __func__, pci_name(pdev)); 655 ret = -ENODEV; 656 goto out_pci; 657 } 658 if (!request_mem_region(idd->pma, IOC3_PCI_SIZE, "ioc3")) { 659 printk(KERN_WARNING 660 "%s: Unable to request IOC3 region " 661 "for pci_dev %s.\n", 662 __func__, pci_name(pdev)); 663 ret = -ENODEV; 664 goto out_pci; 665 } 666 idd->vma = ioremap(idd->pma, IOC3_PCI_SIZE); 667 if (!idd->vma) { 668 printk(KERN_WARNING 669 "%s: Unable to remap IOC3 region " 670 "for pci_dev %s.\n", 671 __func__, pci_name(pdev)); 672 ret = -ENODEV; 673 goto out_misc_region; 674 } 675 676 /* Track PCI-device specific data */ 677 pci_set_drvdata(pdev, idd); 678 down_write(&ioc3_devices_rwsem); 679 list_add_tail(&idd->list, &ioc3_devices); 680 idd->id = ioc3_counter++; 681 up_write(&ioc3_devices_rwsem); 682 683 idd->gpdr_shadow = readl(&idd->vma->gpdr); 684 685 /* Read IOC3 NIC contents */ 686 probe_nic(idd); 687 688 /* Detect IOC3 class */ 689 idd->class = ioc3_class(idd); 690 691 /* Initialize IOC3 */ 692 pci_read_config_dword(pdev, PCI_COMMAND, &pcmd); 693 pci_write_config_dword(pdev, PCI_COMMAND, 694 pcmd | PCI_COMMAND_MEMORY | 695 PCI_COMMAND_PARITY | PCI_COMMAND_SERR | 696 PCI_SCR_DROP_MODE_EN); 697 698 write_ireg(idd, ~0, IOC3_W_IEC); 699 writel(~0, &idd->vma->sio_ir); 700 701 /* Set up IRQs */ 702 if(idd->class == IOC3_CLASS_BASE_IP30 703 || idd->class == IOC3_CLASS_BASE_IP27) { 704 writel(0, &idd->vma->eier); 705 writel(~0, &idd->vma->eisr); 706 707 idd->dual_irq = 1; 708 if (!request_irq(pdev->irq, ioc3_intr_eth, IRQF_SHARED, 709 "ioc3-eth", (void *)idd)) { 710 idd->irq_eth = pdev->irq; 711 } else { 712 printk(KERN_WARNING 713 "%s : request_irq fails for IRQ 0x%x\n ", 714 __func__, pdev->irq); 715 } 716 if (!request_irq(pdev->irq+2, ioc3_intr_io, IRQF_SHARED, 717 "ioc3-io", (void *)idd)) { 718 idd->irq_io = pdev->irq+2; 719 } else { 720 printk(KERN_WARNING 721 "%s : request_irq fails for IRQ 0x%x\n ", 722 __func__, pdev->irq+2); 723 } 724 } else { 725 if (!request_irq(pdev->irq, ioc3_intr_io, IRQF_SHARED, 726 "ioc3", (void *)idd)) { 727 idd->irq_io = pdev->irq; 728 } else { 729 printk(KERN_WARNING 730 "%s : request_irq fails for IRQ 0x%x\n ", 731 __func__, pdev->irq); 732 } 733 } 734 735 /* Add this IOC3 to all submodules */ 736 for(id=0;id<IOC3_MAX_SUBMODULES;id++) 737 if(ioc3_submodules[id] && ioc3_submodules[id]->probe) { 738 idd->active[id] = 1; 739 idd->active[id] = !ioc3_submodules[id]->probe 740 (ioc3_submodules[id], idd); 741 } 742 743 printk(KERN_INFO "IOC3 Master Driver loaded for %s\n", pci_name(pdev)); 744 745 return 0; 746 747out_misc_region: 748 release_mem_region(idd->pma, IOC3_PCI_SIZE); 749out_pci: 750 kfree(idd); 751out_idd: 752 pci_disable_device(pdev); 753out: 754 return ret; 755} 756 757/* Removes a particular instance of an IOC3 card. */ 758static void __devexit ioc3_remove(struct pci_dev *pdev) 759{ 760 int id; 761 struct ioc3_driver_data *idd; 762 763 idd = pci_get_drvdata(pdev); 764 765 /* Remove this IOC3 from all submodules */ 766 for(id=0;id<IOC3_MAX_SUBMODULES;id++) 767 if(idd->active[id]) { 768 if(ioc3_submodules[id] && ioc3_submodules[id]->remove) 769 if(ioc3_submodules[id]->remove(ioc3_submodules[id], 770 idd)) 771 printk(KERN_WARNING 772 "%s: IOC3 submodule 0x%s remove failed " 773 "for pci_dev %s.\n", 774 __func__, 775 module_name(ioc3_submodules[id]->owner), 776 pci_name(pdev)); 777 idd->active[id] = 0; 778 } 779 780 /* Clear and disable all IRQs */ 781 write_ireg(idd, ~0, IOC3_W_IEC); 782 writel(~0, &idd->vma->sio_ir); 783 784 /* Release resources */ 785 free_irq(idd->irq_io, (void *)idd); 786 if(idd->dual_irq) 787 free_irq(idd->irq_eth, (void *)idd); 788 iounmap(idd->vma); 789 release_mem_region(idd->pma, IOC3_PCI_SIZE); 790 791 /* Disable IOC3 and relinquish */ 792 pci_disable_device(pdev); 793 794 /* Remove and free driver data */ 795 down_write(&ioc3_devices_rwsem); 796 list_del(&idd->list); 797 up_write(&ioc3_devices_rwsem); 798 kfree(idd); 799} 800 801static struct pci_device_id ioc3_id_table[] = { 802 {PCI_VENDOR_ID_SGI, PCI_DEVICE_ID_SGI_IOC3, PCI_ANY_ID, PCI_ANY_ID}, 803 {0} 804}; 805 806static struct pci_driver ioc3_driver = { 807 .name = "IOC3", 808 .id_table = ioc3_id_table, 809 .probe = ioc3_probe, 810 .remove = __devexit_p(ioc3_remove), 811}; 812 813MODULE_DEVICE_TABLE(pci, ioc3_id_table); 814 815/********************* 816 * Module management * 817 *********************/ 818 819/* Module load */ 820static int __init ioc3_init(void) 821{ 822 if (ia64_platform_is("sn2")) 823 return pci_register_driver(&ioc3_driver); 824 return -ENODEV; 825} 826 827/* Module unload */ 828static void __exit ioc3_exit(void) 829{ 830 pci_unregister_driver(&ioc3_driver); 831} 832 833module_init(ioc3_init); 834module_exit(ioc3_exit); 835 836MODULE_AUTHOR("Stanislaw Skowronek <skylark@linux-mips.org>"); 837MODULE_DESCRIPTION("PCI driver for SGI IOC3"); 838MODULE_LICENSE("GPL"); 839 840EXPORT_SYMBOL_GPL(ioc3_register_submodule); 841EXPORT_SYMBOL_GPL(ioc3_unregister_submodule); 842EXPORT_SYMBOL_GPL(ioc3_ack); 843EXPORT_SYMBOL_GPL(ioc3_gpcr_set); 844EXPORT_SYMBOL_GPL(ioc3_disable); 845EXPORT_SYMBOL_GPL(ioc3_enable); 846