ioc3.c 20 KB

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