ioc3.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846
  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, struct pt_regs *regs)
  345. {
  346. unsigned long flags;
  347. struct ioc3_driver_data *idd = (struct ioc3_driver_data *)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, regs);
  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. regs))
  369. pending &= ~ioc3_submodules[id]->irq_mask;
  370. if (ioc3_submodules[id]->reset_mask)
  371. write_ireg(idd, ioc3_submodules[id]->irq_mask,
  372. IOC3_W_IES);
  373. }
  374. }
  375. read_unlock_irqrestore(&ioc3_submodules_lock, flags);
  376. if(pending) {
  377. printk(KERN_WARNING
  378. "IOC3: Pending IRQs 0x%08x discarded and disabled\n",pending);
  379. write_ireg(idd, pending, IOC3_W_IEC);
  380. handled = 1;
  381. }
  382. return handled?IRQ_HANDLED:IRQ_NONE;
  383. }
  384. static irqreturn_t ioc3_intr_eth(int irq, void *arg, struct pt_regs *regs)
  385. {
  386. unsigned long flags;
  387. struct ioc3_driver_data *idd = (struct ioc3_driver_data *)arg;
  388. int handled = 1;
  389. if(!idd->dual_irq)
  390. return IRQ_NONE;
  391. read_lock_irqsave(&ioc3_submodules_lock, flags);
  392. if(ioc3_ethernet && idd->active[ioc3_ethernet->id]
  393. && ioc3_ethernet->intr)
  394. handled = handled && !ioc3_ethernet->intr(ioc3_ethernet, idd, 0,
  395. regs);
  396. read_unlock_irqrestore(&ioc3_submodules_lock, flags);
  397. return handled?IRQ_HANDLED:IRQ_NONE;
  398. }
  399. void ioc3_enable(struct ioc3_submodule *is,
  400. struct ioc3_driver_data *idd, unsigned int irqs)
  401. {
  402. write_ireg(idd, irqs & is->irq_mask, IOC3_W_IES);
  403. }
  404. void ioc3_ack(struct ioc3_submodule *is, struct ioc3_driver_data *idd,
  405. unsigned int irqs)
  406. {
  407. writel(irqs & is->irq_mask, &idd->vma->sio_ir);
  408. }
  409. void ioc3_disable(struct ioc3_submodule *is,
  410. struct ioc3_driver_data *idd, unsigned int irqs)
  411. {
  412. write_ireg(idd, irqs & is->irq_mask, IOC3_W_IEC);
  413. }
  414. void ioc3_gpcr_set(struct ioc3_driver_data *idd, unsigned int val)
  415. {
  416. unsigned long flags;
  417. spin_lock_irqsave(&idd->gpio_lock, flags);
  418. writel(val, &idd->vma->gpcr_s);
  419. spin_unlock_irqrestore(&idd->gpio_lock, flags);
  420. }
  421. /* Keep it simple, stupid! */
  422. static int find_slot(void **tab, int max)
  423. {
  424. int i;
  425. for(i=0;i<max;i++)
  426. if(!(tab[i]))
  427. return i;
  428. return -1;
  429. }
  430. /* Register an IOC3 submodule */
  431. int ioc3_register_submodule(struct ioc3_submodule *is)
  432. {
  433. struct ioc3_driver_data *idd;
  434. int alloc_id;
  435. unsigned long flags;
  436. write_lock_irqsave(&ioc3_submodules_lock, flags);
  437. alloc_id = find_slot((void **)ioc3_submodules, IOC3_MAX_SUBMODULES);
  438. if(alloc_id != -1) {
  439. ioc3_submodules[alloc_id] = is;
  440. if(is->ethernet) {
  441. if(ioc3_ethernet==NULL)
  442. ioc3_ethernet=is;
  443. else
  444. printk(KERN_WARNING
  445. "IOC3 Ethernet module already registered!\n");
  446. }
  447. }
  448. write_unlock_irqrestore(&ioc3_submodules_lock, flags);
  449. if(alloc_id == -1) {
  450. printk(KERN_WARNING "Increase IOC3_MAX_SUBMODULES!\n");
  451. return -ENOMEM;
  452. }
  453. is->id=alloc_id;
  454. /* Initialize submodule for each IOC3 */
  455. if (!is->probe)
  456. return 0;
  457. down_read(&ioc3_devices_rwsem);
  458. list_for_each_entry(idd, &ioc3_devices, list) {
  459. /* set to 1 for IRQs in probe */
  460. idd->active[alloc_id] = 1;
  461. idd->active[alloc_id] = !is->probe(is, idd);
  462. }
  463. up_read(&ioc3_devices_rwsem);
  464. return 0;
  465. }
  466. /* Unregister an IOC3 submodule */
  467. void ioc3_unregister_submodule(struct ioc3_submodule *is)
  468. {
  469. struct ioc3_driver_data *idd;
  470. unsigned long flags;
  471. write_lock_irqsave(&ioc3_submodules_lock, flags);
  472. if(ioc3_submodules[is->id]==is)
  473. ioc3_submodules[is->id]=NULL;
  474. else
  475. printk(KERN_WARNING
  476. "IOC3 submodule %s has wrong ID.\n",is->name);
  477. if(ioc3_ethernet==is)
  478. ioc3_ethernet = NULL;
  479. write_unlock_irqrestore(&ioc3_submodules_lock, flags);
  480. /* Remove submodule for each IOC3 */
  481. down_read(&ioc3_devices_rwsem);
  482. list_for_each_entry(idd, &ioc3_devices, list)
  483. if(idd->active[is->id]) {
  484. if(is->remove)
  485. if(is->remove(is, idd))
  486. printk(KERN_WARNING
  487. "%s: IOC3 submodule %s remove failed "
  488. "for pci_dev %s.\n",
  489. __FUNCTION__, module_name(is->owner),
  490. pci_name(idd->pdev));
  491. idd->active[is->id] = 0;
  492. if(is->irq_mask)
  493. write_ireg(idd, is->irq_mask, IOC3_W_IEC);
  494. }
  495. up_read(&ioc3_devices_rwsem);
  496. }
  497. /*********************
  498. * Device management *
  499. *********************/
  500. static char *
  501. ioc3_class_names[]={"unknown", "IP27 BaseIO", "IP30 system", "MENET 1/2/3",
  502. "MENET 4", "CADduo", "Altix Serial"};
  503. static int ioc3_class(struct ioc3_driver_data *idd)
  504. {
  505. int res = IOC3_CLASS_NONE;
  506. /* NIC-based logic */
  507. if(!strncmp(idd->nic_part, "030-0891-", 9))
  508. res = IOC3_CLASS_BASE_IP30;
  509. if(!strncmp(idd->nic_part, "030-1155-", 9))
  510. res = IOC3_CLASS_CADDUO;
  511. if(!strncmp(idd->nic_part, "030-1657-", 9))
  512. res = IOC3_CLASS_SERIAL;
  513. if(!strncmp(idd->nic_part, "030-1664-", 9))
  514. res = IOC3_CLASS_SERIAL;
  515. /* total random heuristics */
  516. #ifdef CONFIG_SGI_IP27
  517. if(!idd->nic_part[0])
  518. res = IOC3_CLASS_BASE_IP27;
  519. #endif
  520. /* print educational message */
  521. printk(KERN_INFO "IOC3 part: [%s], serial: [%s] => class %s\n",
  522. idd->nic_part, idd->nic_serial, ioc3_class_names[res]);
  523. return res;
  524. }
  525. /* Adds a new instance of an IOC3 card */
  526. static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id)
  527. {
  528. struct ioc3_driver_data *idd;
  529. uint32_t pcmd;
  530. int ret, id;
  531. /* Enable IOC3 and take ownership of it */
  532. if ((ret = pci_enable_device(pdev))) {
  533. printk(KERN_WARNING
  534. "%s: Failed to enable IOC3 device for pci_dev %s.\n",
  535. __FUNCTION__, pci_name(pdev));
  536. goto out;
  537. }
  538. pci_set_master(pdev);
  539. #ifdef USE_64BIT_DMA
  540. ret = pci_set_dma_mask(pdev, DMA_64BIT_MASK);
  541. if (!ret) {
  542. ret = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
  543. if (ret < 0) {
  544. printk(KERN_WARNING "%s: Unable to obtain 64 bit DMA "
  545. "for consistent allocations\n",
  546. __FUNCTION__);
  547. }
  548. }
  549. #endif
  550. /* Set up per-IOC3 data */
  551. idd = kmalloc(sizeof(struct ioc3_driver_data), GFP_KERNEL);
  552. if (!idd) {
  553. printk(KERN_WARNING
  554. "%s: Failed to allocate IOC3 data for pci_dev %s.\n",
  555. __FUNCTION__, pci_name(pdev));
  556. ret = -ENODEV;
  557. goto out_idd;
  558. }
  559. memset(idd, 0, sizeof(struct ioc3_driver_data));
  560. spin_lock_init(&idd->ir_lock);
  561. spin_lock_init(&idd->gpio_lock);
  562. idd->pdev = pdev;
  563. /* Map all IOC3 registers. These are shared between subdevices
  564. * so the main IOC3 module manages them.
  565. */
  566. idd->pma = pci_resource_start(pdev, 0);
  567. if (!idd->pma) {
  568. printk(KERN_WARNING
  569. "%s: Unable to find IOC3 resource "
  570. "for pci_dev %s.\n",
  571. __FUNCTION__, pci_name(pdev));
  572. ret = -ENODEV;
  573. goto out_pci;
  574. }
  575. if (!request_region(idd->pma, IOC3_PCI_SIZE, "ioc3")) {
  576. printk(KERN_WARNING
  577. "%s: Unable to request IOC3 region "
  578. "for pci_dev %s.\n",
  579. __FUNCTION__, pci_name(pdev));
  580. ret = -ENODEV;
  581. goto out_pci;
  582. }
  583. idd->vma = ioremap(idd->pma, IOC3_PCI_SIZE);
  584. if (!idd->vma) {
  585. printk(KERN_WARNING
  586. "%s: Unable to remap IOC3 region "
  587. "for pci_dev %s.\n",
  588. __FUNCTION__, pci_name(pdev));
  589. ret = -ENODEV;
  590. goto out_misc_region;
  591. }
  592. /* Track PCI-device specific data */
  593. pci_set_drvdata(pdev, idd);
  594. down_write(&ioc3_devices_rwsem);
  595. list_add_tail(&idd->list, &ioc3_devices);
  596. idd->id = ioc3_counter++;
  597. up_write(&ioc3_devices_rwsem);
  598. idd->gpdr_shadow = readl(&idd->vma->gpdr);
  599. /* Read IOC3 NIC contents */
  600. probe_nic(idd);
  601. /* Detect IOC3 class */
  602. idd->class = ioc3_class(idd);
  603. /* Initialize IOC3 */
  604. pci_read_config_dword(pdev, PCI_COMMAND, &pcmd);
  605. pci_write_config_dword(pdev, PCI_COMMAND,
  606. pcmd | PCI_COMMAND_MEMORY |
  607. PCI_COMMAND_PARITY | PCI_COMMAND_SERR |
  608. PCI_SCR_DROP_MODE_EN);
  609. write_ireg(idd, ~0, IOC3_W_IEC);
  610. writel(~0, &idd->vma->sio_ir);
  611. /* Set up IRQs */
  612. if(idd->class == IOC3_CLASS_BASE_IP30
  613. || idd->class == IOC3_CLASS_BASE_IP27) {
  614. writel(0, &idd->vma->eier);
  615. writel(~0, &idd->vma->eisr);
  616. idd->dual_irq = 1;
  617. if (!request_irq(pdev->irq, ioc3_intr_eth, IRQF_SHARED,
  618. "ioc3-eth", (void *)idd)) {
  619. idd->irq_eth = pdev->irq;
  620. } else {
  621. printk(KERN_WARNING
  622. "%s : request_irq fails for IRQ 0x%x\n ",
  623. __FUNCTION__, pdev->irq);
  624. }
  625. if (!request_irq(pdev->irq+2, ioc3_intr_io, IRQF_SHARED,
  626. "ioc3-io", (void *)idd)) {
  627. idd->irq_io = pdev->irq+2;
  628. } else {
  629. printk(KERN_WARNING
  630. "%s : request_irq fails for IRQ 0x%x\n ",
  631. __FUNCTION__, pdev->irq+2);
  632. }
  633. } else {
  634. if (!request_irq(pdev->irq, ioc3_intr_io, IRQF_SHARED,
  635. "ioc3", (void *)idd)) {
  636. idd->irq_io = pdev->irq;
  637. } else {
  638. printk(KERN_WARNING
  639. "%s : request_irq fails for IRQ 0x%x\n ",
  640. __FUNCTION__, pdev->irq);
  641. }
  642. }
  643. /* Add this IOC3 to all submodules */
  644. for(id=0;id<IOC3_MAX_SUBMODULES;id++)
  645. if(ioc3_submodules[id] && ioc3_submodules[id]->probe) {
  646. idd->active[id] = 1;
  647. idd->active[id] = !ioc3_submodules[id]->probe
  648. (ioc3_submodules[id], idd);
  649. }
  650. printk(KERN_INFO "IOC3 Master Driver loaded for %s\n", pci_name(pdev));
  651. return 0;
  652. out_misc_region:
  653. release_region(idd->pma, IOC3_PCI_SIZE);
  654. out_pci:
  655. kfree(idd);
  656. out_idd:
  657. pci_disable_device(pdev);
  658. out:
  659. return ret;
  660. }
  661. /* Removes a particular instance of an IOC3 card. */
  662. static void ioc3_remove(struct pci_dev *pdev)
  663. {
  664. int id;
  665. struct ioc3_driver_data *idd;
  666. idd = pci_get_drvdata(pdev);
  667. /* Remove this IOC3 from all submodules */
  668. for(id=0;id<IOC3_MAX_SUBMODULES;id++)
  669. if(idd->active[id]) {
  670. if(ioc3_submodules[id] && ioc3_submodules[id]->remove)
  671. if(ioc3_submodules[id]->remove(ioc3_submodules[id],
  672. idd))
  673. printk(KERN_WARNING
  674. "%s: IOC3 submodule 0x%s remove failed "
  675. "for pci_dev %s.\n",
  676. __FUNCTION__,
  677. module_name(ioc3_submodules[id]->owner),
  678. pci_name(pdev));
  679. idd->active[id] = 0;
  680. }
  681. /* Clear and disable all IRQs */
  682. write_ireg(idd, ~0, IOC3_W_IEC);
  683. writel(~0, &idd->vma->sio_ir);
  684. /* Release resources */
  685. free_irq(idd->irq_io, (void *)idd);
  686. if(idd->dual_irq)
  687. free_irq(idd->irq_eth, (void *)idd);
  688. iounmap(idd->vma);
  689. release_region(idd->pma, IOC3_PCI_SIZE);
  690. /* Disable IOC3 and relinquish */
  691. pci_disable_device(pdev);
  692. /* Remove and free driver data */
  693. down_write(&ioc3_devices_rwsem);
  694. list_del(&idd->list);
  695. up_write(&ioc3_devices_rwsem);
  696. kfree(idd);
  697. }
  698. static struct pci_device_id ioc3_id_table[] = {
  699. {PCI_VENDOR_ID_SGI, PCI_DEVICE_ID_SGI_IOC3, PCI_ANY_ID, PCI_ANY_ID},
  700. {0}
  701. };
  702. static struct pci_driver ioc3_driver = {
  703. .name = "IOC3",
  704. .id_table = ioc3_id_table,
  705. .probe = ioc3_probe,
  706. .remove = ioc3_remove,
  707. };
  708. MODULE_DEVICE_TABLE(pci, ioc3_id_table);
  709. /*********************
  710. * Module management *
  711. *********************/
  712. /* Module load */
  713. static int __devinit ioc3_init(void)
  714. {
  715. if (ia64_platform_is("sn2"))
  716. return pci_register_driver(&ioc3_driver);
  717. return 0;
  718. }
  719. /* Module unload */
  720. static void __devexit ioc3_exit(void)
  721. {
  722. pci_unregister_driver(&ioc3_driver);
  723. }
  724. module_init(ioc3_init);
  725. module_exit(ioc3_exit);
  726. MODULE_AUTHOR("Stanislaw Skowronek <skylark@linux-mips.org>");
  727. MODULE_DESCRIPTION("PCI driver for SGI IOC3");
  728. MODULE_LICENSE("GPL");
  729. EXPORT_SYMBOL_GPL(ioc3_register_submodule);
  730. EXPORT_SYMBOL_GPL(ioc3_unregister_submodule);
  731. EXPORT_SYMBOL_GPL(ioc3_ack);
  732. EXPORT_SYMBOL_GPL(ioc3_gpcr_set);
  733. EXPORT_SYMBOL_GPL(ioc3_disable);
  734. EXPORT_SYMBOL_GPL(ioc3_enable);