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

嵌入式Linux

开发平台:

Unix_Linux

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