saa9730.c 31 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144
  1. /*
  2. * Copyright (C) 2000, 2005 MIPS Technologies, Inc. All rights reserved.
  3. * Authors: Carsten Langgaard <carstenl@mips.com>
  4. * Maciej W. Rozycki <macro@mips.com>
  5. * Copyright (C) 2004 Ralf Baechle <ralf@linux-mips.org>
  6. *
  7. * This program is free software; you can distribute it and/or modify it
  8. * under the terms of the GNU General Public License (Version 2) as
  9. * published by the Free Software Foundation.
  10. *
  11. * This program is distributed in the hope it will be useful, but WITHOUT
  12. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  14. * for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License along
  17. * with this program; if not, write to the Free Software Foundation, Inc.,
  18. * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
  19. *
  20. * SAA9730 ethernet driver.
  21. *
  22. * Changes:
  23. * Angelo Dell'Aera <buffer@antifork.org> : Conversion to the new PCI API
  24. * (pci_driver).
  25. * Conversion to spinlocks.
  26. * Error handling fixes.
  27. */
  28. #include <linux/init.h>
  29. #include <linux/netdevice.h>
  30. #include <linux/delay.h>
  31. #include <linux/etherdevice.h>
  32. #include <linux/module.h>
  33. #include <linux/skbuff.h>
  34. #include <linux/pci.h>
  35. #include <linux/spinlock.h>
  36. #include <linux/types.h>
  37. #include <asm/addrspace.h>
  38. #include <asm/io.h>
  39. #include <asm/mips-boards/prom.h>
  40. #include "saa9730.h"
  41. #ifdef LAN_SAA9730_DEBUG
  42. int lan_saa9730_debug = LAN_SAA9730_DEBUG;
  43. #else
  44. int lan_saa9730_debug;
  45. #endif
  46. #define DRV_MODULE_NAME "saa9730"
  47. static struct pci_device_id saa9730_pci_tbl[] = {
  48. { PCI_VENDOR_ID_PHILIPS, PCI_DEVICE_ID_PHILIPS_SAA9730,
  49. PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
  50. { 0, }
  51. };
  52. MODULE_DEVICE_TABLE(pci, saa9730_pci_tbl);
  53. /* Non-zero only if the current card is a PCI with BIOS-set IRQ. */
  54. static unsigned int pci_irq_line;
  55. static void evm_saa9730_enable_lan_int(struct lan_saa9730_private *lp)
  56. {
  57. writel(readl(&lp->evm_saa9730_regs->InterruptBlock1) | EVM_LAN_INT,
  58. &lp->evm_saa9730_regs->InterruptBlock1);
  59. writel(readl(&lp->evm_saa9730_regs->InterruptStatus1) | EVM_LAN_INT,
  60. &lp->evm_saa9730_regs->InterruptStatus1);
  61. writel(readl(&lp->evm_saa9730_regs->InterruptEnable1) | EVM_LAN_INT |
  62. EVM_MASTER_EN, &lp->evm_saa9730_regs->InterruptEnable1);
  63. }
  64. static void evm_saa9730_disable_lan_int(struct lan_saa9730_private *lp)
  65. {
  66. writel(readl(&lp->evm_saa9730_regs->InterruptBlock1) & ~EVM_LAN_INT,
  67. &lp->evm_saa9730_regs->InterruptBlock1);
  68. writel(readl(&lp->evm_saa9730_regs->InterruptEnable1) & ~EVM_LAN_INT,
  69. &lp->evm_saa9730_regs->InterruptEnable1);
  70. }
  71. static void evm_saa9730_clear_lan_int(struct lan_saa9730_private *lp)
  72. {
  73. writel(EVM_LAN_INT, &lp->evm_saa9730_regs->InterruptStatus1);
  74. }
  75. static void evm_saa9730_block_lan_int(struct lan_saa9730_private *lp)
  76. {
  77. writel(readl(&lp->evm_saa9730_regs->InterruptBlock1) & ~EVM_LAN_INT,
  78. &lp->evm_saa9730_regs->InterruptBlock1);
  79. }
  80. static void evm_saa9730_unblock_lan_int(struct lan_saa9730_private *lp)
  81. {
  82. writel(readl(&lp->evm_saa9730_regs->InterruptBlock1) | EVM_LAN_INT,
  83. &lp->evm_saa9730_regs->InterruptBlock1);
  84. }
  85. static void __attribute_used__ show_saa9730_regs(struct lan_saa9730_private *lp)
  86. {
  87. int i, j;
  88. printk("TxmBufferA = %p\n", lp->TxmBuffer[0][0]);
  89. printk("TxmBufferB = %p\n", lp->TxmBuffer[1][0]);
  90. printk("RcvBufferA = %p\n", lp->RcvBuffer[0][0]);
  91. printk("RcvBufferB = %p\n", lp->RcvBuffer[1][0]);
  92. for (i = 0; i < LAN_SAA9730_BUFFERS; i++) {
  93. for (j = 0; j < LAN_SAA9730_TXM_Q_SIZE; j++) {
  94. printk("TxmBuffer[%d][%d] = %x\n", i, j,
  95. le32_to_cpu(*(unsigned int *)
  96. lp->TxmBuffer[i][j]));
  97. }
  98. }
  99. for (i = 0; i < LAN_SAA9730_BUFFERS; i++) {
  100. for (j = 0; j < LAN_SAA9730_RCV_Q_SIZE; j++) {
  101. printk("RcvBuffer[%d][%d] = %x\n", i, j,
  102. le32_to_cpu(*(unsigned int *)
  103. lp->RcvBuffer[i][j]));
  104. }
  105. }
  106. printk("lp->evm_saa9730_regs->InterruptBlock1 = %x\n",
  107. readl(&lp->evm_saa9730_regs->InterruptBlock1));
  108. printk("lp->evm_saa9730_regs->InterruptStatus1 = %x\n",
  109. readl(&lp->evm_saa9730_regs->InterruptStatus1));
  110. printk("lp->evm_saa9730_regs->InterruptEnable1 = %x\n",
  111. readl(&lp->evm_saa9730_regs->InterruptEnable1));
  112. printk("lp->lan_saa9730_regs->Ok2Use = %x\n",
  113. readl(&lp->lan_saa9730_regs->Ok2Use));
  114. printk("lp->NextTxmBufferIndex = %x\n", lp->NextTxmBufferIndex);
  115. printk("lp->NextTxmPacketIndex = %x\n", lp->NextTxmPacketIndex);
  116. printk("lp->PendingTxmBufferIndex = %x\n",
  117. lp->PendingTxmBufferIndex);
  118. printk("lp->PendingTxmPacketIndex = %x\n",
  119. lp->PendingTxmPacketIndex);
  120. printk("lp->lan_saa9730_regs->LanDmaCtl = %x\n",
  121. readl(&lp->lan_saa9730_regs->LanDmaCtl));
  122. printk("lp->lan_saa9730_regs->DmaStatus = %x\n",
  123. readl(&lp->lan_saa9730_regs->DmaStatus));
  124. printk("lp->lan_saa9730_regs->CamCtl = %x\n",
  125. readl(&lp->lan_saa9730_regs->CamCtl));
  126. printk("lp->lan_saa9730_regs->TxCtl = %x\n",
  127. readl(&lp->lan_saa9730_regs->TxCtl));
  128. printk("lp->lan_saa9730_regs->TxStatus = %x\n",
  129. readl(&lp->lan_saa9730_regs->TxStatus));
  130. printk("lp->lan_saa9730_regs->RxCtl = %x\n",
  131. readl(&lp->lan_saa9730_regs->RxCtl));
  132. printk("lp->lan_saa9730_regs->RxStatus = %x\n",
  133. readl(&lp->lan_saa9730_regs->RxStatus));
  134. for (i = 0; i < LAN_SAA9730_CAM_DWORDS; i++) {
  135. writel(i, &lp->lan_saa9730_regs->CamAddress);
  136. printk("lp->lan_saa9730_regs->CamData = %x\n",
  137. readl(&lp->lan_saa9730_regs->CamData));
  138. }
  139. printk("lp->stats.tx_packets = %lx\n", lp->stats.tx_packets);
  140. printk("lp->stats.tx_errors = %lx\n", lp->stats.tx_errors);
  141. printk("lp->stats.tx_aborted_errors = %lx\n",
  142. lp->stats.tx_aborted_errors);
  143. printk("lp->stats.tx_window_errors = %lx\n",
  144. lp->stats.tx_window_errors);
  145. printk("lp->stats.tx_carrier_errors = %lx\n",
  146. lp->stats.tx_carrier_errors);
  147. printk("lp->stats.tx_fifo_errors = %lx\n",
  148. lp->stats.tx_fifo_errors);
  149. printk("lp->stats.tx_heartbeat_errors = %lx\n",
  150. lp->stats.tx_heartbeat_errors);
  151. printk("lp->stats.collisions = %lx\n", lp->stats.collisions);
  152. printk("lp->stats.rx_packets = %lx\n", lp->stats.rx_packets);
  153. printk("lp->stats.rx_errors = %lx\n", lp->stats.rx_errors);
  154. printk("lp->stats.rx_dropped = %lx\n", lp->stats.rx_dropped);
  155. printk("lp->stats.rx_crc_errors = %lx\n", lp->stats.rx_crc_errors);
  156. printk("lp->stats.rx_frame_errors = %lx\n",
  157. lp->stats.rx_frame_errors);
  158. printk("lp->stats.rx_fifo_errors = %lx\n",
  159. lp->stats.rx_fifo_errors);
  160. printk("lp->stats.rx_length_errors = %lx\n",
  161. lp->stats.rx_length_errors);
  162. printk("lp->lan_saa9730_regs->DebugPCIMasterAddr = %x\n",
  163. readl(&lp->lan_saa9730_regs->DebugPCIMasterAddr));
  164. printk("lp->lan_saa9730_regs->DebugLanTxStateMachine = %x\n",
  165. readl(&lp->lan_saa9730_regs->DebugLanTxStateMachine));
  166. printk("lp->lan_saa9730_regs->DebugLanRxStateMachine = %x\n",
  167. readl(&lp->lan_saa9730_regs->DebugLanRxStateMachine));
  168. printk("lp->lan_saa9730_regs->DebugLanTxFifoPointers = %x\n",
  169. readl(&lp->lan_saa9730_regs->DebugLanTxFifoPointers));
  170. printk("lp->lan_saa9730_regs->DebugLanRxFifoPointers = %x\n",
  171. readl(&lp->lan_saa9730_regs->DebugLanRxFifoPointers));
  172. printk("lp->lan_saa9730_regs->DebugLanCtlStateMachine = %x\n",
  173. readl(&lp->lan_saa9730_regs->DebugLanCtlStateMachine));
  174. }
  175. static void lan_saa9730_buffer_init(struct lan_saa9730_private *lp)
  176. {
  177. int i, j;
  178. /* Init RX buffers */
  179. for (i = 0; i < LAN_SAA9730_BUFFERS; i++) {
  180. for (j = 0; j < LAN_SAA9730_RCV_Q_SIZE; j++) {
  181. *(unsigned int *) lp->RcvBuffer[i][j] =
  182. cpu_to_le32(RXSF_READY <<
  183. RX_STAT_CTL_OWNER_SHF);
  184. }
  185. }
  186. /* Init TX buffers */
  187. for (i = 0; i < LAN_SAA9730_BUFFERS; i++) {
  188. for (j = 0; j < LAN_SAA9730_TXM_Q_SIZE; j++) {
  189. *(unsigned int *) lp->TxmBuffer[i][j] =
  190. cpu_to_le32(TXSF_EMPTY <<
  191. TX_STAT_CTL_OWNER_SHF);
  192. }
  193. }
  194. }
  195. static void lan_saa9730_free_buffers(struct pci_dev *pdev,
  196. struct lan_saa9730_private *lp)
  197. {
  198. pci_free_consistent(pdev, lp->buffer_size, lp->buffer_start,
  199. lp->dma_addr);
  200. }
  201. static int lan_saa9730_allocate_buffers(struct pci_dev *pdev,
  202. struct lan_saa9730_private *lp)
  203. {
  204. void *Pa;
  205. unsigned int i, j, rxoffset, txoffset;
  206. int ret;
  207. /* Initialize buffer space */
  208. lp->DmaRcvPackets = LAN_SAA9730_RCV_Q_SIZE;
  209. lp->DmaTxmPackets = LAN_SAA9730_TXM_Q_SIZE;
  210. /* Initialize Rx Buffer Index */
  211. lp->NextRcvPacketIndex = 0;
  212. lp->NextRcvBufferIndex = 0;
  213. /* Set current buffer index & next available packet index */
  214. lp->NextTxmPacketIndex = 0;
  215. lp->NextTxmBufferIndex = 0;
  216. lp->PendingTxmPacketIndex = 0;
  217. lp->PendingTxmBufferIndex = 0;
  218. /*
  219. * Allocate all RX and TX packets in one chunk.
  220. * The Rx and Tx packets must be PACKET_SIZE aligned.
  221. */
  222. lp->buffer_size = ((LAN_SAA9730_RCV_Q_SIZE + LAN_SAA9730_TXM_Q_SIZE) *
  223. LAN_SAA9730_PACKET_SIZE * LAN_SAA9730_BUFFERS) +
  224. LAN_SAA9730_PACKET_SIZE;
  225. lp->buffer_start = pci_alloc_consistent(pdev, lp->buffer_size,
  226. &lp->dma_addr);
  227. if (!lp->buffer_start) {
  228. ret = -ENOMEM;
  229. goto out;
  230. }
  231. Pa = (void *)ALIGN((unsigned long)lp->buffer_start,
  232. LAN_SAA9730_PACKET_SIZE);
  233. rxoffset = Pa - lp->buffer_start;
  234. /* Init RX buffers */
  235. for (i = 0; i < LAN_SAA9730_BUFFERS; i++) {
  236. for (j = 0; j < LAN_SAA9730_RCV_Q_SIZE; j++) {
  237. *(unsigned int *) Pa =
  238. cpu_to_le32(RXSF_READY <<
  239. RX_STAT_CTL_OWNER_SHF);
  240. lp->RcvBuffer[i][j] = Pa;
  241. Pa += LAN_SAA9730_PACKET_SIZE;
  242. }
  243. }
  244. txoffset = Pa - lp->buffer_start;
  245. /* Init TX buffers */
  246. for (i = 0; i < LAN_SAA9730_BUFFERS; i++) {
  247. for (j = 0; j < LAN_SAA9730_TXM_Q_SIZE; j++) {
  248. *(unsigned int *) Pa =
  249. cpu_to_le32(TXSF_EMPTY <<
  250. TX_STAT_CTL_OWNER_SHF);
  251. lp->TxmBuffer[i][j] = Pa;
  252. Pa += LAN_SAA9730_PACKET_SIZE;
  253. }
  254. }
  255. /*
  256. * Set rx buffer A and rx buffer B to point to the first two buffer
  257. * spaces.
  258. */
  259. writel(lp->dma_addr + rxoffset, &lp->lan_saa9730_regs->RxBuffA);
  260. writel(lp->dma_addr + rxoffset +
  261. LAN_SAA9730_PACKET_SIZE * LAN_SAA9730_RCV_Q_SIZE,
  262. &lp->lan_saa9730_regs->RxBuffB);
  263. /*
  264. * Set txm_buf_a and txm_buf_b to point to the first two buffer
  265. * space
  266. */
  267. writel(lp->dma_addr + txoffset,
  268. &lp->lan_saa9730_regs->TxBuffA);
  269. writel(lp->dma_addr + txoffset +
  270. LAN_SAA9730_PACKET_SIZE * LAN_SAA9730_TXM_Q_SIZE,
  271. &lp->lan_saa9730_regs->TxBuffB);
  272. /* Set packet number */
  273. writel((lp->DmaRcvPackets << PK_COUNT_RX_A_SHF) |
  274. (lp->DmaRcvPackets << PK_COUNT_RX_B_SHF) |
  275. (lp->DmaTxmPackets << PK_COUNT_TX_A_SHF) |
  276. (lp->DmaTxmPackets << PK_COUNT_TX_B_SHF),
  277. &lp->lan_saa9730_regs->PacketCount);
  278. return 0;
  279. out:
  280. return ret;
  281. }
  282. static int lan_saa9730_cam_load(struct lan_saa9730_private *lp)
  283. {
  284. unsigned int i;
  285. unsigned char *NetworkAddress;
  286. NetworkAddress = (unsigned char *) &lp->PhysicalAddress[0][0];
  287. for (i = 0; i < LAN_SAA9730_CAM_DWORDS; i++) {
  288. /* First set address to where data is written */
  289. writel(i, &lp->lan_saa9730_regs->CamAddress);
  290. writel((NetworkAddress[0] << 24) | (NetworkAddress[1] << 16) |
  291. (NetworkAddress[2] << 8) | NetworkAddress[3],
  292. &lp->lan_saa9730_regs->CamData);
  293. NetworkAddress += 4;
  294. }
  295. return 0;
  296. }
  297. static int lan_saa9730_cam_init(struct net_device *dev)
  298. {
  299. struct lan_saa9730_private *lp = netdev_priv(dev);
  300. unsigned int i;
  301. /* Copy MAC-address into all entries. */
  302. for (i = 0; i < LAN_SAA9730_CAM_ENTRIES; i++) {
  303. memcpy((unsigned char *) lp->PhysicalAddress[i],
  304. (unsigned char *) dev->dev_addr, 6);
  305. }
  306. return 0;
  307. }
  308. static int lan_saa9730_mii_init(struct lan_saa9730_private *lp)
  309. {
  310. int i, l;
  311. /* Check link status, spin here till station is not busy. */
  312. i = 0;
  313. while (readl(&lp->lan_saa9730_regs->StationMgmtCtl) & MD_CA_BUSY) {
  314. i++;
  315. if (i > 100) {
  316. printk("Error: lan_saa9730_mii_init: timeout\n");
  317. return -1;
  318. }
  319. mdelay(1); /* wait 1 ms. */
  320. }
  321. /* Now set the control and address register. */
  322. writel(MD_CA_BUSY | PHY_STATUS | PHY_ADDRESS << MD_CA_PHY_SHF,
  323. &lp->lan_saa9730_regs->StationMgmtCtl);
  324. /* check link status, spin here till station is not busy */
  325. i = 0;
  326. while (readl(&lp->lan_saa9730_regs->StationMgmtCtl) & MD_CA_BUSY) {
  327. i++;
  328. if (i > 100) {
  329. printk("Error: lan_saa9730_mii_init: timeout\n");
  330. return -1;
  331. }
  332. mdelay(1); /* wait 1 ms. */
  333. }
  334. /* Wait for 1 ms. */
  335. mdelay(1);
  336. /* Check the link status. */
  337. if (readl(&lp->lan_saa9730_regs->StationMgmtData) &
  338. PHY_STATUS_LINK_UP) {
  339. /* Link is up. */
  340. return 0;
  341. } else {
  342. /* Link is down, reset the PHY first. */
  343. /* set PHY address = 'CONTROL' */
  344. writel(PHY_ADDRESS << MD_CA_PHY_SHF | MD_CA_WR | PHY_CONTROL,
  345. &lp->lan_saa9730_regs->StationMgmtCtl);
  346. /* Wait for 1 ms. */
  347. mdelay(1);
  348. /* set 'CONTROL' = force reset and renegotiate */
  349. writel(PHY_CONTROL_RESET | PHY_CONTROL_AUTO_NEG |
  350. PHY_CONTROL_RESTART_AUTO_NEG,
  351. &lp->lan_saa9730_regs->StationMgmtData);
  352. /* Wait for 50 ms. */
  353. mdelay(50);
  354. /* set 'BUSY' to start operation */
  355. writel(MD_CA_BUSY | PHY_ADDRESS << MD_CA_PHY_SHF | MD_CA_WR |
  356. PHY_CONTROL, &lp->lan_saa9730_regs->StationMgmtCtl);
  357. /* await completion */
  358. i = 0;
  359. while (readl(&lp->lan_saa9730_regs->StationMgmtCtl) &
  360. MD_CA_BUSY) {
  361. i++;
  362. if (i > 100) {
  363. printk
  364. ("Error: lan_saa9730_mii_init: timeout\n");
  365. return -1;
  366. }
  367. mdelay(1); /* wait 1 ms. */
  368. }
  369. /* Wait for 1 ms. */
  370. mdelay(1);
  371. for (l = 0; l < 2; l++) {
  372. /* set PHY address = 'STATUS' */
  373. writel(MD_CA_BUSY | PHY_ADDRESS << MD_CA_PHY_SHF |
  374. PHY_STATUS,
  375. &lp->lan_saa9730_regs->StationMgmtCtl);
  376. /* await completion */
  377. i = 0;
  378. while (readl(&lp->lan_saa9730_regs->StationMgmtCtl) &
  379. MD_CA_BUSY) {
  380. i++;
  381. if (i > 100) {
  382. printk
  383. ("Error: lan_saa9730_mii_init: timeout\n");
  384. return -1;
  385. }
  386. mdelay(1); /* wait 1 ms. */
  387. }
  388. /* wait for 3 sec. */
  389. mdelay(3000);
  390. /* check the link status */
  391. if (readl(&lp->lan_saa9730_regs->StationMgmtData) &
  392. PHY_STATUS_LINK_UP) {
  393. /* link is up */
  394. break;
  395. }
  396. }
  397. }
  398. return 0;
  399. }
  400. static int lan_saa9730_control_init(struct lan_saa9730_private *lp)
  401. {
  402. /* Initialize DMA control register. */
  403. writel((LANMB_ANY << DMA_CTL_MAX_XFER_SHF) |
  404. (LANEND_LITTLE << DMA_CTL_ENDIAN_SHF) |
  405. (LAN_SAA9730_RCV_Q_INT_THRESHOLD << DMA_CTL_RX_INT_COUNT_SHF)
  406. | DMA_CTL_RX_INT_TO_EN | DMA_CTL_RX_INT_EN |
  407. DMA_CTL_MAC_RX_INT_EN | DMA_CTL_MAC_TX_INT_EN,
  408. &lp->lan_saa9730_regs->LanDmaCtl);
  409. /* Initial MAC control register. */
  410. writel((MACCM_MII << MAC_CONTROL_CONN_SHF) | MAC_CONTROL_FULL_DUP,
  411. &lp->lan_saa9730_regs->MacCtl);
  412. /* Initialize CAM control register. */
  413. writel(CAM_CONTROL_COMP_EN | CAM_CONTROL_BROAD_ACC,
  414. &lp->lan_saa9730_regs->CamCtl);
  415. /*
  416. * Initialize CAM enable register, only turn on first entry, should
  417. * contain own addr.
  418. */
  419. writel(0x0001, &lp->lan_saa9730_regs->CamEnable);
  420. /* Initialize Tx control register */
  421. writel(TX_CTL_EN_COMP, &lp->lan_saa9730_regs->TxCtl);
  422. /* Initialize Rcv control register */
  423. writel(RX_CTL_STRIP_CRC, &lp->lan_saa9730_regs->RxCtl);
  424. /* Reset DMA engine */
  425. writel(DMA_TEST_SW_RESET, &lp->lan_saa9730_regs->DmaTest);
  426. return 0;
  427. }
  428. static int lan_saa9730_stop(struct lan_saa9730_private *lp)
  429. {
  430. int i;
  431. /* Stop DMA first */
  432. writel(readl(&lp->lan_saa9730_regs->LanDmaCtl) &
  433. ~(DMA_CTL_EN_TX_DMA | DMA_CTL_EN_RX_DMA),
  434. &lp->lan_saa9730_regs->LanDmaCtl);
  435. /* Set the SW Reset bits in DMA and MAC control registers */
  436. writel(DMA_TEST_SW_RESET, &lp->lan_saa9730_regs->DmaTest);
  437. writel(readl(&lp->lan_saa9730_regs->MacCtl) | MAC_CONTROL_RESET,
  438. &lp->lan_saa9730_regs->MacCtl);
  439. /*
  440. * Wait for MAC reset to have finished. The reset bit is auto cleared
  441. * when the reset is done.
  442. */
  443. i = 0;
  444. while (readl(&lp->lan_saa9730_regs->MacCtl) & MAC_CONTROL_RESET) {
  445. i++;
  446. if (i > 100) {
  447. printk
  448. ("Error: lan_sa9730_stop: MAC reset timeout\n");
  449. return -1;
  450. }
  451. mdelay(1); /* wait 1 ms. */
  452. }
  453. return 0;
  454. }
  455. static int lan_saa9730_dma_init(struct lan_saa9730_private *lp)
  456. {
  457. /* Stop lan controller. */
  458. lan_saa9730_stop(lp);
  459. writel(LAN_SAA9730_DEFAULT_TIME_OUT_CNT,
  460. &lp->lan_saa9730_regs->Timeout);
  461. return 0;
  462. }
  463. static int lan_saa9730_start(struct lan_saa9730_private *lp)
  464. {
  465. lan_saa9730_buffer_init(lp);
  466. /* Initialize Rx Buffer Index */
  467. lp->NextRcvPacketIndex = 0;
  468. lp->NextRcvBufferIndex = 0;
  469. /* Set current buffer index & next available packet index */
  470. lp->NextTxmPacketIndex = 0;
  471. lp->NextTxmBufferIndex = 0;
  472. lp->PendingTxmPacketIndex = 0;
  473. lp->PendingTxmBufferIndex = 0;
  474. writel(readl(&lp->lan_saa9730_regs->LanDmaCtl) | DMA_CTL_EN_TX_DMA |
  475. DMA_CTL_EN_RX_DMA, &lp->lan_saa9730_regs->LanDmaCtl);
  476. /* For Tx, turn on MAC then DMA */
  477. writel(readl(&lp->lan_saa9730_regs->TxCtl) | TX_CTL_TX_EN,
  478. &lp->lan_saa9730_regs->TxCtl);
  479. /* For Rx, turn on DMA then MAC */
  480. writel(readl(&lp->lan_saa9730_regs->RxCtl) | RX_CTL_RX_EN,
  481. &lp->lan_saa9730_regs->RxCtl);
  482. /* Set Ok2Use to let hardware own the buffers. */
  483. writel(OK2USE_RX_A | OK2USE_RX_B, &lp->lan_saa9730_regs->Ok2Use);
  484. return 0;
  485. }
  486. static int lan_saa9730_restart(struct lan_saa9730_private *lp)
  487. {
  488. lan_saa9730_stop(lp);
  489. lan_saa9730_start(lp);
  490. return 0;
  491. }
  492. static int lan_saa9730_tx(struct net_device *dev)
  493. {
  494. struct lan_saa9730_private *lp = netdev_priv(dev);
  495. unsigned int *pPacket;
  496. unsigned int tx_status;
  497. if (lan_saa9730_debug > 5)
  498. printk("lan_saa9730_tx interrupt\n");
  499. /* Clear interrupt. */
  500. writel(DMA_STATUS_MAC_TX_INT, &lp->lan_saa9730_regs->DmaStatus);
  501. while (1) {
  502. pPacket = lp->TxmBuffer[lp->PendingTxmBufferIndex]
  503. [lp->PendingTxmPacketIndex];
  504. /* Get status of first packet transmitted. */
  505. tx_status = le32_to_cpu(*pPacket);
  506. /* Check ownership. */
  507. if ((tx_status & TX_STAT_CTL_OWNER_MSK) !=
  508. (TXSF_HWDONE << TX_STAT_CTL_OWNER_SHF)) break;
  509. /* Check for error. */
  510. if (tx_status & TX_STAT_CTL_ERROR_MSK) {
  511. if (lan_saa9730_debug > 1)
  512. printk("lan_saa9730_tx: tx error = %x\n",
  513. tx_status);
  514. lp->stats.tx_errors++;
  515. if (tx_status &
  516. (TX_STATUS_EX_COLL << TX_STAT_CTL_STATUS_SHF))
  517. lp->stats.tx_aborted_errors++;
  518. if (tx_status &
  519. (TX_STATUS_LATE_COLL << TX_STAT_CTL_STATUS_SHF))
  520. lp->stats.tx_window_errors++;
  521. if (tx_status &
  522. (TX_STATUS_L_CARR << TX_STAT_CTL_STATUS_SHF))
  523. lp->stats.tx_carrier_errors++;
  524. if (tx_status &
  525. (TX_STATUS_UNDER << TX_STAT_CTL_STATUS_SHF))
  526. lp->stats.tx_fifo_errors++;
  527. if (tx_status &
  528. (TX_STATUS_SQ_ERR << TX_STAT_CTL_STATUS_SHF))
  529. lp->stats.tx_heartbeat_errors++;
  530. lp->stats.collisions +=
  531. tx_status & TX_STATUS_TX_COLL_MSK;
  532. }
  533. /* Free buffer. */
  534. *pPacket =
  535. cpu_to_le32(TXSF_EMPTY << TX_STAT_CTL_OWNER_SHF);
  536. /* Update pending index pointer. */
  537. lp->PendingTxmPacketIndex++;
  538. if (lp->PendingTxmPacketIndex >= LAN_SAA9730_TXM_Q_SIZE) {
  539. lp->PendingTxmPacketIndex = 0;
  540. lp->PendingTxmBufferIndex ^= 1;
  541. }
  542. }
  543. /* The tx buffer is no longer full. */
  544. netif_wake_queue(dev);
  545. return 0;
  546. }
  547. static int lan_saa9730_rx(struct net_device *dev)
  548. {
  549. struct lan_saa9730_private *lp = netdev_priv(dev);
  550. int len = 0;
  551. struct sk_buff *skb = 0;
  552. unsigned int rx_status;
  553. int BufferIndex;
  554. int PacketIndex;
  555. unsigned int *pPacket;
  556. unsigned char *pData;
  557. if (lan_saa9730_debug > 5)
  558. printk("lan_saa9730_rx interrupt\n");
  559. /* Clear receive interrupts. */
  560. writel(DMA_STATUS_MAC_RX_INT | DMA_STATUS_RX_INT |
  561. DMA_STATUS_RX_TO_INT, &lp->lan_saa9730_regs->DmaStatus);
  562. /* Address next packet */
  563. BufferIndex = lp->NextRcvBufferIndex;
  564. PacketIndex = lp->NextRcvPacketIndex;
  565. pPacket = lp->RcvBuffer[BufferIndex][PacketIndex];
  566. rx_status = le32_to_cpu(*pPacket);
  567. /* Process each packet. */
  568. while ((rx_status & RX_STAT_CTL_OWNER_MSK) ==
  569. (RXSF_HWDONE << RX_STAT_CTL_OWNER_SHF)) {
  570. /* Check the rx status. */
  571. if (rx_status & (RX_STATUS_GOOD << RX_STAT_CTL_STATUS_SHF)) {
  572. /* Received packet is good. */
  573. len = (rx_status & RX_STAT_CTL_LENGTH_MSK) >>
  574. RX_STAT_CTL_LENGTH_SHF;
  575. pData = (unsigned char *) pPacket;
  576. pData += 4;
  577. skb = dev_alloc_skb(len + 2);
  578. if (skb == 0) {
  579. printk
  580. ("%s: Memory squeeze, deferring packet.\n",
  581. dev->name);
  582. lp->stats.rx_dropped++;
  583. } else {
  584. lp->stats.rx_bytes += len;
  585. lp->stats.rx_packets++;
  586. skb_reserve(skb, 2); /* 16 byte align */
  587. skb_put(skb, len); /* make room */
  588. eth_copy_and_sum(skb,
  589. (unsigned char *) pData,
  590. len, 0);
  591. skb->protocol = eth_type_trans(skb, dev);
  592. netif_rx(skb);
  593. dev->last_rx = jiffies;
  594. }
  595. } else {
  596. /* We got an error packet. */
  597. if (lan_saa9730_debug > 2)
  598. printk
  599. ("lan_saa9730_rx: We got an error packet = %x\n",
  600. rx_status);
  601. lp->stats.rx_errors++;
  602. if (rx_status &
  603. (RX_STATUS_CRC_ERR << RX_STAT_CTL_STATUS_SHF))
  604. lp->stats.rx_crc_errors++;
  605. if (rx_status &
  606. (RX_STATUS_ALIGN_ERR << RX_STAT_CTL_STATUS_SHF))
  607. lp->stats.rx_frame_errors++;
  608. if (rx_status &
  609. (RX_STATUS_OVERFLOW << RX_STAT_CTL_STATUS_SHF))
  610. lp->stats.rx_fifo_errors++;
  611. if (rx_status &
  612. (RX_STATUS_LONG_ERR << RX_STAT_CTL_STATUS_SHF))
  613. lp->stats.rx_length_errors++;
  614. }
  615. /* Indicate we have processed the buffer. */
  616. *pPacket = cpu_to_le32(RXSF_READY << RX_STAT_CTL_OWNER_SHF);
  617. /* Make sure A or B is available to hardware as appropriate. */
  618. writel(BufferIndex ? OK2USE_RX_B : OK2USE_RX_A,
  619. &lp->lan_saa9730_regs->Ok2Use);
  620. /* Go to next packet in sequence. */
  621. lp->NextRcvPacketIndex++;
  622. if (lp->NextRcvPacketIndex >= LAN_SAA9730_RCV_Q_SIZE) {
  623. lp->NextRcvPacketIndex = 0;
  624. lp->NextRcvBufferIndex ^= 1;
  625. }
  626. /* Address next packet */
  627. BufferIndex = lp->NextRcvBufferIndex;
  628. PacketIndex = lp->NextRcvPacketIndex;
  629. pPacket = lp->RcvBuffer[BufferIndex][PacketIndex];
  630. rx_status = le32_to_cpu(*pPacket);
  631. }
  632. return 0;
  633. }
  634. static irqreturn_t lan_saa9730_interrupt(const int irq, void *dev_id)
  635. {
  636. struct net_device *dev = dev_id;
  637. struct lan_saa9730_private *lp = netdev_priv(dev);
  638. if (lan_saa9730_debug > 5)
  639. printk("lan_saa9730_interrupt\n");
  640. /* Disable the EVM LAN interrupt. */
  641. evm_saa9730_block_lan_int(lp);
  642. /* Clear the EVM LAN interrupt. */
  643. evm_saa9730_clear_lan_int(lp);
  644. /* Service pending transmit interrupts. */
  645. if (readl(&lp->lan_saa9730_regs->DmaStatus) & DMA_STATUS_MAC_TX_INT)
  646. lan_saa9730_tx(dev);
  647. /* Service pending receive interrupts. */
  648. if (readl(&lp->lan_saa9730_regs->DmaStatus) &
  649. (DMA_STATUS_MAC_RX_INT | DMA_STATUS_RX_INT |
  650. DMA_STATUS_RX_TO_INT)) lan_saa9730_rx(dev);
  651. /* Enable the EVM LAN interrupt. */
  652. evm_saa9730_unblock_lan_int(lp);
  653. return IRQ_HANDLED;
  654. }
  655. static int lan_saa9730_open(struct net_device *dev)
  656. {
  657. struct lan_saa9730_private *lp = netdev_priv(dev);
  658. /* Associate IRQ with lan_saa9730_interrupt */
  659. if (request_irq(dev->irq, &lan_saa9730_interrupt, 0, "SAA9730 Eth",
  660. dev)) {
  661. printk("lan_saa9730_open: Can't get irq %d\n", dev->irq);
  662. return -EAGAIN;
  663. }
  664. /* Enable the Lan interrupt in the event manager. */
  665. evm_saa9730_enable_lan_int(lp);
  666. /* Start the LAN controller */
  667. if (lan_saa9730_start(lp))
  668. return -1;
  669. netif_start_queue(dev);
  670. return 0;
  671. }
  672. static int lan_saa9730_write(struct lan_saa9730_private *lp,
  673. struct sk_buff *skb, int skblen)
  674. {
  675. unsigned char *pbData = skb->data;
  676. unsigned int len = skblen;
  677. unsigned char *pbPacketData;
  678. unsigned int tx_status;
  679. int BufferIndex;
  680. int PacketIndex;
  681. if (lan_saa9730_debug > 5)
  682. printk("lan_saa9730_write: skb=%p\n", skb);
  683. BufferIndex = lp->NextTxmBufferIndex;
  684. PacketIndex = lp->NextTxmPacketIndex;
  685. tx_status = le32_to_cpu(*(unsigned int *)lp->TxmBuffer[BufferIndex]
  686. [PacketIndex]);
  687. if ((tx_status & TX_STAT_CTL_OWNER_MSK) !=
  688. (TXSF_EMPTY << TX_STAT_CTL_OWNER_SHF)) {
  689. if (lan_saa9730_debug > 4)
  690. printk
  691. ("lan_saa9730_write: Tx buffer not available: tx_status = %x\n",
  692. tx_status);
  693. return -1;
  694. }
  695. lp->NextTxmPacketIndex++;
  696. if (lp->NextTxmPacketIndex >= LAN_SAA9730_TXM_Q_SIZE) {
  697. lp->NextTxmPacketIndex = 0;
  698. lp->NextTxmBufferIndex ^= 1;
  699. }
  700. pbPacketData = lp->TxmBuffer[BufferIndex][PacketIndex];
  701. pbPacketData += 4;
  702. /* copy the bits */
  703. memcpy(pbPacketData, pbData, len);
  704. /* Set transmit status for hardware */
  705. *(unsigned int *)lp->TxmBuffer[BufferIndex][PacketIndex] =
  706. cpu_to_le32((TXSF_READY << TX_STAT_CTL_OWNER_SHF) |
  707. (TX_STAT_CTL_INT_AFTER_TX <<
  708. TX_STAT_CTL_FRAME_SHF) |
  709. (len << TX_STAT_CTL_LENGTH_SHF));
  710. /* Make sure A or B is available to hardware as appropriate. */
  711. writel(BufferIndex ? OK2USE_TX_B : OK2USE_TX_A,
  712. &lp->lan_saa9730_regs->Ok2Use);
  713. return 0;
  714. }
  715. static void lan_saa9730_tx_timeout(struct net_device *dev)
  716. {
  717. struct lan_saa9730_private *lp = netdev_priv(dev);
  718. /* Transmitter timeout, serious problems */
  719. lp->stats.tx_errors++;
  720. printk("%s: transmit timed out, reset\n", dev->name);
  721. /*show_saa9730_regs(lp); */
  722. lan_saa9730_restart(lp);
  723. dev->trans_start = jiffies;
  724. netif_wake_queue(dev);
  725. }
  726. static int lan_saa9730_start_xmit(struct sk_buff *skb,
  727. struct net_device *dev)
  728. {
  729. struct lan_saa9730_private *lp = netdev_priv(dev);
  730. unsigned long flags;
  731. int skblen;
  732. int len;
  733. if (lan_saa9730_debug > 4)
  734. printk("Send packet: skb=%p\n", skb);
  735. skblen = skb->len;
  736. spin_lock_irqsave(&lp->lock, flags);
  737. len = (skblen <= ETH_ZLEN) ? ETH_ZLEN : skblen;
  738. if (lan_saa9730_write(lp, skb, skblen)) {
  739. spin_unlock_irqrestore(&lp->lock, flags);
  740. printk("Error when writing packet to controller: skb=%p\n", skb);
  741. netif_stop_queue(dev);
  742. return -1;
  743. }
  744. lp->stats.tx_bytes += len;
  745. lp->stats.tx_packets++;
  746. dev->trans_start = jiffies;
  747. netif_wake_queue(dev);
  748. dev_kfree_skb(skb);
  749. spin_unlock_irqrestore(&lp->lock, flags);
  750. return 0;
  751. }
  752. static int lan_saa9730_close(struct net_device *dev)
  753. {
  754. struct lan_saa9730_private *lp = netdev_priv(dev);
  755. if (lan_saa9730_debug > 1)
  756. printk("lan_saa9730_close:\n");
  757. netif_stop_queue(dev);
  758. /* Disable the Lan interrupt in the event manager. */
  759. evm_saa9730_disable_lan_int(lp);
  760. /* Stop the controller */
  761. if (lan_saa9730_stop(lp))
  762. return -1;
  763. free_irq(dev->irq, (void *) dev);
  764. return 0;
  765. }
  766. static struct net_device_stats *lan_saa9730_get_stats(struct net_device
  767. *dev)
  768. {
  769. struct lan_saa9730_private *lp = netdev_priv(dev);
  770. return &lp->stats;
  771. }
  772. static void lan_saa9730_set_multicast(struct net_device *dev)
  773. {
  774. struct lan_saa9730_private *lp = netdev_priv(dev);
  775. /* Stop the controller */
  776. lan_saa9730_stop(lp);
  777. if (dev->flags & IFF_PROMISC) {
  778. /* accept all packets */
  779. writel(CAM_CONTROL_COMP_EN | CAM_CONTROL_STATION_ACC |
  780. CAM_CONTROL_GROUP_ACC | CAM_CONTROL_BROAD_ACC,
  781. &lp->lan_saa9730_regs->CamCtl);
  782. } else {
  783. if (dev->flags & IFF_ALLMULTI) {
  784. /* accept all multicast packets */
  785. writel(CAM_CONTROL_COMP_EN | CAM_CONTROL_GROUP_ACC |
  786. CAM_CONTROL_BROAD_ACC,
  787. &lp->lan_saa9730_regs->CamCtl);
  788. } else {
  789. /*
  790. * Will handle the multicast stuff later. -carstenl
  791. */
  792. }
  793. }
  794. lan_saa9730_restart(lp);
  795. }
  796. static void __devexit saa9730_remove_one(struct pci_dev *pdev)
  797. {
  798. struct net_device *dev = pci_get_drvdata(pdev);
  799. struct lan_saa9730_private *lp = netdev_priv(dev);
  800. if (dev) {
  801. unregister_netdev(dev);
  802. lan_saa9730_free_buffers(pdev, lp);
  803. iounmap(lp->lan_saa9730_regs);
  804. iounmap(lp->evm_saa9730_regs);
  805. free_netdev(dev);
  806. pci_release_regions(pdev);
  807. pci_disable_device(pdev);
  808. pci_set_drvdata(pdev, NULL);
  809. }
  810. }
  811. static int lan_saa9730_init(struct net_device *dev, struct pci_dev *pdev,
  812. unsigned long ioaddr, int irq)
  813. {
  814. struct lan_saa9730_private *lp = netdev_priv(dev);
  815. unsigned char ethernet_addr[6];
  816. int ret;
  817. if (get_ethernet_addr(ethernet_addr)) {
  818. ret = -ENODEV;
  819. goto out;
  820. }
  821. memcpy(dev->dev_addr, ethernet_addr, 6);
  822. dev->base_addr = ioaddr;
  823. dev->irq = irq;
  824. lp->pci_dev = pdev;
  825. /* Set SAA9730 LAN base address. */
  826. lp->lan_saa9730_regs = ioremap(ioaddr + SAA9730_LAN_REGS_ADDR,
  827. SAA9730_LAN_REGS_SIZE);
  828. if (!lp->lan_saa9730_regs) {
  829. ret = -ENOMEM;
  830. goto out;
  831. }
  832. /* Set SAA9730 EVM base address. */
  833. lp->evm_saa9730_regs = ioremap(ioaddr + SAA9730_EVM_REGS_ADDR,
  834. SAA9730_EVM_REGS_SIZE);
  835. if (!lp->evm_saa9730_regs) {
  836. ret = -ENOMEM;
  837. goto out_iounmap_lan;
  838. }
  839. /* Allocate LAN RX/TX frame buffer space. */
  840. if ((ret = lan_saa9730_allocate_buffers(pdev, lp)))
  841. goto out_iounmap;
  842. /* Stop LAN controller. */
  843. if ((ret = lan_saa9730_stop(lp)))
  844. goto out_free_consistent;
  845. /* Initialize CAM registers. */
  846. if ((ret = lan_saa9730_cam_init(dev)))
  847. goto out_free_consistent;
  848. /* Initialize MII registers. */
  849. if ((ret = lan_saa9730_mii_init(lp)))
  850. goto out_free_consistent;
  851. /* Initialize control registers. */
  852. if ((ret = lan_saa9730_control_init(lp)))
  853. goto out_free_consistent;
  854. /* Load CAM registers. */
  855. if ((ret = lan_saa9730_cam_load(lp)))
  856. goto out_free_consistent;
  857. /* Initialize DMA context registers. */
  858. if ((ret = lan_saa9730_dma_init(lp)))
  859. goto out_free_consistent;
  860. spin_lock_init(&lp->lock);
  861. dev->open = lan_saa9730_open;
  862. dev->hard_start_xmit = lan_saa9730_start_xmit;
  863. dev->stop = lan_saa9730_close;
  864. dev->get_stats = lan_saa9730_get_stats;
  865. dev->set_multicast_list = lan_saa9730_set_multicast;
  866. dev->tx_timeout = lan_saa9730_tx_timeout;
  867. dev->watchdog_timeo = (HZ >> 1);
  868. dev->dma = 0;
  869. ret = register_netdev (dev);
  870. if (ret)
  871. goto out_free_consistent;
  872. return 0;
  873. out_free_consistent:
  874. lan_saa9730_free_buffers(pdev, lp);
  875. out_iounmap:
  876. iounmap(lp->evm_saa9730_regs);
  877. out_iounmap_lan:
  878. iounmap(lp->lan_saa9730_regs);
  879. out:
  880. return ret;
  881. }
  882. static int __devinit saa9730_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
  883. {
  884. struct net_device *dev = NULL;
  885. unsigned long pci_ioaddr;
  886. int err;
  887. if (lan_saa9730_debug > 1)
  888. printk("saa9730.c: PCI bios is present, checking for devices...\n");
  889. err = pci_enable_device(pdev);
  890. if (err) {
  891. printk(KERN_ERR "Cannot enable PCI device, aborting.\n");
  892. goto out;
  893. }
  894. err = pci_request_regions(pdev, DRV_MODULE_NAME);
  895. if (err) {
  896. printk(KERN_ERR "Cannot obtain PCI resources, aborting.\n");
  897. goto out_disable_pdev;
  898. }
  899. pci_irq_line = pdev->irq;
  900. /* LAN base address in located at BAR 1. */
  901. pci_ioaddr = pci_resource_start(pdev, 1);
  902. pci_set_master(pdev);
  903. printk("Found SAA9730 (PCI) at %lx, irq %d.\n",
  904. pci_ioaddr, pci_irq_line);
  905. dev = alloc_etherdev(sizeof(struct lan_saa9730_private));
  906. if (!dev)
  907. goto out_disable_pdev;
  908. err = lan_saa9730_init(dev, pdev, pci_ioaddr, pci_irq_line);
  909. if (err) {
  910. printk("LAN init failed");
  911. goto out_free_netdev;
  912. }
  913. pci_set_drvdata(pdev, dev);
  914. SET_NETDEV_DEV(dev, &pdev->dev);
  915. return 0;
  916. out_free_netdev:
  917. free_netdev(dev);
  918. out_disable_pdev:
  919. pci_disable_device(pdev);
  920. out:
  921. pci_set_drvdata(pdev, NULL);
  922. return err;
  923. }
  924. static struct pci_driver saa9730_driver = {
  925. .name = DRV_MODULE_NAME,
  926. .id_table = saa9730_pci_tbl,
  927. .probe = saa9730_init_one,
  928. .remove = __devexit_p(saa9730_remove_one),
  929. };
  930. static int __init saa9730_init(void)
  931. {
  932. return pci_register_driver(&saa9730_driver);
  933. }
  934. static void __exit saa9730_cleanup(void)
  935. {
  936. pci_unregister_driver(&saa9730_driver);
  937. }
  938. module_init(saa9730_init);
  939. module_exit(saa9730_cleanup);
  940. MODULE_AUTHOR("Ralf Baechle <ralf@linux-mips.org>");
  941. MODULE_DESCRIPTION("Philips SAA9730 ethernet driver");
  942. MODULE_LICENSE("GPL");