You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

skeleton.c 7.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. /*
  2. * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
  3. *
  4. * This program is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public License as
  6. * published by the Free Software Foundation; either version 2 of the
  7. * License, or (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful, but
  10. * WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. * General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program; if not, write to the Free Software
  16. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  17. * 02110-1301, USA.
  18. */
  19. FILE_LICENCE ( GPL2_OR_LATER );
  20. #include <stdint.h>
  21. #include <string.h>
  22. #include <unistd.h>
  23. #include <errno.h>
  24. #include <byteswap.h>
  25. #include <ipxe/netdevice.h>
  26. #include <ipxe/ethernet.h>
  27. #include <ipxe/if_ether.h>
  28. #include <ipxe/iobuf.h>
  29. #include <ipxe/malloc.h>
  30. #include <ipxe/pci.h>
  31. #include <ipxe/mii.h>
  32. #include "skeleton.h"
  33. /** @file
  34. *
  35. * Skeleton network driver
  36. *
  37. */
  38. /******************************************************************************
  39. *
  40. * MII interface
  41. *
  42. ******************************************************************************
  43. */
  44. /**
  45. * Read from MII register
  46. *
  47. * @v mii MII interface
  48. * @v reg Register address
  49. * @ret value Data read, or negative error
  50. */
  51. static int skeleton_mii_read ( struct mii_interface *mii, unsigned int reg ) {
  52. struct skeleton_nic *skel =
  53. container_of ( mii, struct skeleton_nic, mii );
  54. DBGC ( skel, "SKELETON %p does not yet support MII read\n", skel );
  55. ( void ) reg;
  56. return -ENOTSUP;
  57. }
  58. /**
  59. * Write to MII register
  60. *
  61. * @v mii MII interface
  62. * @v reg Register address
  63. * @v data Data to write
  64. * @ret rc Return status code
  65. */
  66. static int skeleton_mii_write ( struct mii_interface *mii, unsigned int reg,
  67. unsigned int data) {
  68. struct skeleton_nic *skel =
  69. container_of ( mii, struct skeleton_nic, mii );
  70. DBGC ( skel, "SKELETON %p does not yet support MII write\n", skel );
  71. ( void ) reg;
  72. ( void ) data;
  73. return -ENOTSUP;
  74. }
  75. /** Skeleton MII operations */
  76. static struct mii_operations skeleton_mii_operations = {
  77. .read = skeleton_mii_read,
  78. .write = skeleton_mii_write,
  79. };
  80. /******************************************************************************
  81. *
  82. * Device reset
  83. *
  84. ******************************************************************************
  85. */
  86. /**
  87. * Reset hardware
  88. *
  89. * @v skel Skeleton device
  90. * @ret rc Return status code
  91. */
  92. static int skeleton_reset ( struct skeleton_nic *skel ) {
  93. DBGC ( skel, "SKELETON %p does not yet support reset\n", skel );
  94. return -ENOTSUP;
  95. }
  96. /******************************************************************************
  97. *
  98. * Link state
  99. *
  100. ******************************************************************************
  101. */
  102. /**
  103. * Check link state
  104. *
  105. * @v netdev Network device
  106. */
  107. static void skeleton_check_link ( struct net_device *netdev ) {
  108. struct skeleton_nic *skel = netdev->priv;
  109. DBGC ( skel, "SKELETON %p does not yet support link state\n", skel );
  110. netdev_link_err ( netdev, -ENOTSUP );
  111. }
  112. /******************************************************************************
  113. *
  114. * Network device interface
  115. *
  116. ******************************************************************************
  117. */
  118. /**
  119. * Open network device
  120. *
  121. * @v netdev Network device
  122. * @ret rc Return status code
  123. */
  124. static int skeleton_open ( struct net_device *netdev ) {
  125. struct skeleton_nic *skel = netdev->priv;
  126. DBGC ( skel, "SKELETON %p does not yet support open\n", skel );
  127. return -ENOTSUP;
  128. }
  129. /**
  130. * Close network device
  131. *
  132. * @v netdev Network device
  133. */
  134. static void skeleton_close ( struct net_device *netdev ) {
  135. struct skeleton_nic *skel = netdev->priv;
  136. DBGC ( skel, "SKELETON %p does not yet support close\n", skel );
  137. }
  138. /**
  139. * Transmit packet
  140. *
  141. * @v netdev Network device
  142. * @v iobuf I/O buffer
  143. * @ret rc Return status code
  144. */
  145. static int skeleton_transmit ( struct net_device *netdev,
  146. struct io_buffer *iobuf ) {
  147. struct skeleton_nic *skel = netdev->priv;
  148. DBGC ( skel, "SKELETON %p does not yet support transmit\n", skel );
  149. ( void ) iobuf;
  150. return -ENOTSUP;
  151. }
  152. /**
  153. * Poll for completed and received packets
  154. *
  155. * @v netdev Network device
  156. */
  157. static void skeleton_poll ( struct net_device *netdev ) {
  158. struct skeleton_nic *skel = netdev->priv;
  159. /* Not yet implemented */
  160. ( void ) skel;
  161. }
  162. /**
  163. * Enable or disable interrupts
  164. *
  165. * @v netdev Network device
  166. * @v enable Interrupts should be enabled
  167. */
  168. static void skeleton_irq ( struct net_device *netdev, int enable ) {
  169. struct skeleton_nic *skel = netdev->priv;
  170. DBGC ( skel, "SKELETON %p does not yet support interrupts\n", skel );
  171. ( void ) enable;
  172. }
  173. /** Skeleton network device operations */
  174. static struct net_device_operations skeleton_operations = {
  175. .open = skeleton_open,
  176. .close = skeleton_close,
  177. .transmit = skeleton_transmit,
  178. .poll = skeleton_poll,
  179. .irq = skeleton_irq,
  180. };
  181. /******************************************************************************
  182. *
  183. * PCI interface
  184. *
  185. ******************************************************************************
  186. */
  187. /**
  188. * Probe PCI device
  189. *
  190. * @v pci PCI device
  191. * @ret rc Return status code
  192. */
  193. static int skeleton_probe ( struct pci_device *pci ) {
  194. struct net_device *netdev;
  195. struct skeleton_nic *skel;
  196. int rc;
  197. /* Allocate and initialise net device */
  198. netdev = alloc_etherdev ( sizeof ( *skel ) );
  199. if ( ! netdev ) {
  200. rc = -ENOMEM;
  201. goto err_alloc;
  202. }
  203. netdev_init ( netdev, &skeleton_operations );
  204. skel = netdev->priv;
  205. pci_set_drvdata ( pci, netdev );
  206. netdev->dev = &pci->dev;
  207. memset ( skel, 0, sizeof ( *skel ) );
  208. /* Fix up PCI device */
  209. adjust_pci_device ( pci );
  210. /* Map registers */
  211. skel->regs = ioremap ( pci->membase, SKELETON_BAR_SIZE );
  212. /* Reset the NIC */
  213. if ( ( rc = skeleton_reset ( skel ) ) != 0 )
  214. goto err_reset;
  215. /* Initialise and reset MII interface */
  216. mii_init ( &skel->mii, &skeleton_mii_operations );
  217. if ( ( rc = mii_reset ( &skel->mii ) ) != 0 ) {
  218. DBGC ( skel, "SKELETON %p could not reset MII: %s\n",
  219. skel, strerror ( rc ) );
  220. goto err_mii_reset;
  221. }
  222. /* Register network device */
  223. if ( ( rc = register_netdev ( netdev ) ) != 0 )
  224. goto err_register_netdev;
  225. /* Set initial link state */
  226. skeleton_check_link ( netdev );
  227. return 0;
  228. unregister_netdev ( netdev );
  229. err_register_netdev:
  230. err_mii_reset:
  231. skeleton_reset ( skel );
  232. err_reset:
  233. iounmap ( skel->regs );
  234. netdev_nullify ( netdev );
  235. netdev_put ( netdev );
  236. err_alloc:
  237. return rc;
  238. }
  239. /**
  240. * Remove PCI device
  241. *
  242. * @v pci PCI device
  243. */
  244. static void skeleton_remove ( struct pci_device *pci ) {
  245. struct net_device *netdev = pci_get_drvdata ( pci );
  246. struct skeleton_nic *skel = netdev->priv;
  247. /* Unregister network device */
  248. unregister_netdev ( netdev );
  249. /* Reset card */
  250. skeleton_reset ( skel );
  251. /* Free network device */
  252. iounmap ( skel->regs );
  253. netdev_nullify ( netdev );
  254. netdev_put ( netdev );
  255. }
  256. /** Skeleton PCI device IDs */
  257. static struct pci_device_id skeleton_nics[] = {
  258. PCI_ROM ( 0x5ce1, 0x5ce1, "skel", "Skeleton", 0 ),
  259. };
  260. /** Skeleton PCI driver */
  261. struct pci_driver skeleton_driver __pci_driver = {
  262. .ids = skeleton_nics,
  263. .id_count = ( sizeof ( skeleton_nics ) / sizeof ( skeleton_nics[0] ) ),
  264. .probe = skeleton_probe,
  265. .remove = skeleton_remove,
  266. };