ioc3.c 20 KB

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