ptifddi.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:5k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: ptifddi.c,v 1.14 2001/04/14 01:12:04 davem Exp $
  2.  * ptifddi.c: Network driver for Performance Technologies single-attach
  3.  *            and dual-attach FDDI sbus cards.
  4.  *
  5.  * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
  6.  */
  7. static char *version =
  8.         "ptifddi.c:v1.0 10/Dec/96 David S. Miller (davem@caipfs.rutgers.edu)n";
  9. #include <linux/string.h>
  10. #include <linux/init.h>
  11. #include "ptifddi.h"
  12. #include "ptifddi_asm.h"
  13. #ifdef MODULE
  14. static struct ptifddi *root_pti_dev;
  15. #endif
  16. static inline void pti_reset(struct ptifddi *pp)
  17. {
  18. pp->reset = 1;
  19. }
  20. static inline void pti_unreset(struct ptifddi *pp)
  21. {
  22. pp->unreset = 1;
  23. }
  24. static inline void pti_load_code_base(struct dfddi_ram *rp, unsigned short addr)
  25. {
  26. rp->loader_addr = ((addr << 8) & 0xff00) | ((addr >> 8) & 0x00ff);
  27. }
  28. static inline void pti_clear_dpram(struct ptifddi *pp)
  29. {
  30. memset(pp->dpram, 0, DPRAM_SIZE);
  31. }
  32. #define CARD_TEST_TIMEOUT 100000
  33. static inline int pti_card_test(struct ptifddi *pp)
  34. {
  35. struct dfddi_ram *rp = pp->dpram;
  36. unsigned char *code = &rp->loader;
  37. unsigned char *status = (unsigned char *) rp;
  38. int clicks = CARD_TEST_TIMEOUT;
  39. /* Clear it out. */
  40. pti_clear_dpram(pp);
  41. /* Load test data. */
  42. for(i = 0; i < test_firmware_size; i++)
  43. code[i] = test_firmware[i];
  44. /* Tell card where to execute the code. */
  45. pti_load_code_base(pp, test_firmware_dev_addr);
  46. /* Clear test run status in dpram. */
  47. *status = 0;
  48. /* Reset single attach state machine before the test. */
  49. rp->reset = 1;
  50. /* Unreset, to get the test code running. */
  51. pti_unreset(pp);
  52. /* Wait for dpram status to become 5, else fail if we time out. */
  53. while(--clicks) {
  54. if(*status == 5) {
  55. pti_reset(pp);
  56. return 0;
  57. }
  58. udelay(20);
  59. }
  60. return 1;
  61. }
  62. static inline void pti_init_firmware_loader(struct ptifddi *pp)
  63. {
  64. struct dfddi_ram *rp = pp->dpram;
  65. int i;
  66. for(i = 0; i < firmware_loader_size; i++)
  67. rp->loader.loader_firmware[i] = firmware_loader[i];
  68. }
  69. static inline void pti_load_main_firmware(struct ptifddi *pp)
  70. {
  71. struct dfddi_ram *rp = pp->dpram;
  72. struct dpram_loader *lp = &rp.loader;
  73. int i;
  74. }
  75. static void pti_init_rings(struct ptifddi *pp, int from_irq)
  76. {
  77. }
  78. static int pti_init(struct ptifddi *pp, int from_irq)
  79. {
  80. }
  81. static void pti_is_not_so_happy(struct ptifddi *pp)
  82. {
  83. }
  84. static inline void pti_tx(struct ptifddi *pp, struct net_device *dev)
  85. {
  86. }
  87. static inline void myri_rx(struct ptifddi *pp, struct net_device *dev)
  88. {
  89. }
  90. static void pti_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  91. {
  92. struct net_device *dev = (struct net_device *) dev_id;
  93. struct ptifddi *pp = (struct ptifddi *) dev->priv;
  94. }
  95. static int pti_open(struct net_device *dev)
  96. {
  97. struct ptifddi *pp = (struct ptifddi *) dev->priv;
  98. return pti_init(pp, in_interrupt());
  99. }
  100. static int pti_close(struct net_device *dev)
  101. {
  102. struct ptifddi *pp = (struct ptifddi *) dev->priv;
  103. return 0;
  104. }
  105. static int pti_start_xmit(struct sk_buff *skb, struct net_device *dev)
  106. {
  107. struct ptifddi *pp = (struct ptifddi *) dev->priv;
  108. }
  109. static struct net_device_stats *pti_get_stats(struct net_device *dev)
  110. { return &(((struct ptifddi *)dev->priv)->enet_stats); }
  111. static void pti_set_multicast(struct net_device *dev)
  112. {
  113. }
  114. static inline int pti_fddi_init(struct net_device *dev, struct sbus_dev *sdev, int num)
  115. {
  116. static unsigned version_printed;
  117. struct ptifddi *pp;
  118. int i;
  119. dev = init_fddidev(0, sizeof(struct ptifddi));
  120. if(version_printed++ == 0)
  121. printk(version);
  122. /* Register 0 mapping contains DPRAM. */
  123. pp->dpram = (struct dfddi_ram *) sbus_ioremap(
  124.     &sdep->resource[0], 0, sizeof(sturct dfddi_ram), "PTI FDDI DPRAM");
  125. if(!pp->dpram) {
  126. printk("ptiFDDI: Cannot map DPRAM I/O area.n");
  127. return -ENODEV;
  128. }
  129. /* Next, register 1 contains reset byte. */
  130. pp->reset = (unsigned char *) sbus_ioremap(
  131.     &sdep->resource[1], 0, 1, "PTI FDDI RESET Byte");
  132. if(!pp->reset) {
  133. printk("ptiFDDI: Cannot map RESET byte.n");
  134. return -ENODEV;
  135. }
  136. /* Register 2 contains unreset byte. */
  137. pp->unreset = (unsigned char *) sbus_ioremap(
  138.     &sdep->resource[2], 0, 1, "PTI FDDI UNRESET Byte");
  139. if(!pp->unreset) {
  140. printk("ptiFDDI: Cannot map UNRESET byte.n");
  141. return -ENODEV;
  142. }
  143. /* Reset the card. */
  144. pti_reset(pp);
  145. /* Run boot-up card tests. */
  146. i = pti_card_test(pp);
  147. if(i) {
  148. printk("ptiFDDI: Bootup card test fails.n");
  149. return -ENODEV;
  150. }
  151. /* Clear DPRAM, start afresh. */
  152. pti_clear_dpram(pp);
  153. /* Init the firmware loader. */
  154. pti_init_firmware_loader(pp);
  155. /* Now load main card FDDI firmware, using the loader. */
  156. pti_load_main_firmware(pp);
  157. }
  158. int __init ptifddi_sbus_probe(struct net_device *dev)
  159. {
  160. struct sbus_bus *bus;
  161. struct sbus_dev *sdev = 0;
  162. static int called;
  163. int cards = 0, v;
  164. if(called)
  165. return -ENODEV;
  166. called++;
  167. for_each_sbus(bus) {
  168. for_each_sbusdev(sdev, bus) {
  169. if(cards) dev = NULL;
  170. if(!strcmp(sdev->prom_name, "PTI,sbs600") ||
  171.    !strcmp(sdev->prom_name, "DPV,fddid")) {
  172. cards++;
  173. DET(("Found PTI FDDI as %sn", sdev->prom_name));
  174. if((v = pti_fddi_init(dev, sdev, (cards - 1))))
  175. return v;
  176. }
  177. }
  178. }
  179. if(!cards)
  180. return -ENODEV;
  181. return 0;
  182. }
  183. #ifdef MODULE
  184. int
  185. init_module(void)
  186. {
  187. root_pti_dev = NULL;
  188. return ptifddi_sbus_probe(NULL);
  189. }
  190. void
  191. cleanup_module(void)
  192. {
  193. struct ptifddi *pp;
  194. /* No need to check MOD_IN_USE, as sys_delete_module() checks. */
  195. while (root_pti_dev) {
  196. pp = root_pti_dev->next_module;
  197. unregister_netdev(root_pti_dev->dev);
  198. kfree(root_pti_dev->dev);
  199. root_pti_dev = mp;
  200. }
  201. }
  202. #endif /* MODULE */