saa9730.c 31 KB

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