skgeinit.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:55k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  *
  3.  * Name: skgeinit.c
  4.  * Project: GEnesis, PCI Gigabit Ethernet Adapter
  5.  * Version: $Revision: 1.63 $
  6.  * Date: $Date: 2001/04/05 11:02:09 $
  7.  * Purpose: Contains functions to initialize the GE HW
  8.  *
  9.  ******************************************************************************/
  10. /******************************************************************************
  11.  *
  12.  * (C)Copyright 1998-2001 SysKonnect GmbH.
  13.  *
  14.  * This program is free software; you can redistribute it and/or modify
  15.  * it under the terms of the GNU General Public License as published by
  16.  * the Free Software Foundation; either version 2 of the License, or
  17.  * (at your option) any later version.
  18.  *
  19.  * The information in this file is provided "AS IS" without warranty.
  20.  *
  21.  ******************************************************************************/
  22. /******************************************************************************
  23.  *
  24.  * History:
  25.  *
  26.  * $Log: skgeinit.c,v $
  27.  * Revision 1.63  2001/04/05 11:02:09  rassmann
  28.  * Stop Port check of the STOP bit did not take 2/18 sec as wanted.
  29.  *
  30.  * Revision 1.62  2001/02/07 07:54:21  rassmann
  31.  * Corrected copyright.
  32.  *
  33.  * Revision 1.61  2001/01/31 15:31:40  gklug
  34.  * fix: problem with autosensing an SR8800 switch
  35.  *
  36.  * Revision 1.60  2000/10/18 12:22:21  cgoos
  37.  * Added workaround for half duplex hangup.
  38.  *
  39.  * Revision 1.59  2000/10/10 11:22:06  gklug
  40.  * add: in manual half duplex mode ignore carrier extension errors
  41.  *
  42.  * Revision 1.58  2000/10/02 14:10:27  rassmann
  43.  * Reading BCOM PHY after releasing reset until it returns a valid value.
  44.  *
  45.  * Revision 1.57  2000/08/03 14:55:28  rassmann
  46.  * Waiting for I2C to be ready before de-initializing adapter
  47.  * (prevents sensors from hanging up).
  48.  *
  49.  * Revision 1.56  2000/07/27 12:16:48  gklug
  50.  * fix: Stop Port check of the STOP bit does now take 2/18 sec as wanted
  51.  *
  52.  * Revision 1.55  1999/11/22 13:32:26  cgoos
  53.  * Changed license header to GPL.
  54.  *
  55.  * Revision 1.54  1999/10/26 07:32:54  malthoff
  56.  * Initialize PHWLinkUp with SK_FALSE. Required for Diagnostics.
  57.  *
  58.  * Revision 1.53  1999/08/12 19:13:50  malthoff
  59.  * Fix for 1000BT. Do not owerwrite XM_MMU_CMD when
  60.  * disabling receiver and transmitter. Other bits
  61.  * may be lost.
  62.  *
  63.  * Revision 1.52  1999/07/01 09:29:54  gklug
  64.  * fix: DoInitRamQueue needs pAC
  65.  *
  66.  * Revision 1.51  1999/07/01 08:42:21  gklug
  67.  * chg: use Store & forward for RAM buffer when Jumbos are used
  68.  *
  69.  * Revision 1.50  1999/05/27 13:19:38  cgoos
  70.  * Added Tx PCI watermark initialization.
  71.  * Removed Tx RAM queue Store & Forward setting.
  72.  *
  73.  * Revision 1.49  1999/05/20 14:32:45  malthoff
  74.  * SkGeLinkLED() is completly removed now.
  75.  *
  76.  * Revision 1.48  1999/05/19 07:28:24  cgoos
  77.  * SkGeLinkLED no more available for drivers.
  78.  * Changes for 1000Base-T.
  79.  *
  80.  * Revision 1.47  1999/04/08 13:57:45  gklug
  81.  * add: Init of new port struct fiels PLinkResCt
  82.  * chg: StopPort Timer check
  83.  *
  84.  * Revision 1.46  1999/03/25 07:42:15  malthoff
  85.  * SkGeStopPort(): Add workaround for cache incoherency.
  86.  * Create error log entry, disable port, and
  87.  * exit loop if it does not terminate.
  88.  * Add XM_RX_LENERR_OK to the default value for the
  89.  * XMAC receive command register.
  90.  *
  91.  * Revision 1.45  1999/03/12 16:24:47  malthoff
  92.  * Remove PPollRxD and PPollTxD.
  93.  * Add check for GIPollTimerVal.
  94.  *
  95.  * Revision 1.44  1999/03/12 13:40:23  malthoff
  96.  * Fix: SkGeXmitLED(), SK_LED_TST mode does not work.
  97.  * Add: Jumbo frame support.
  98.  * Chg: Resolution of parameter IntTime in SkGeCfgSync().
  99.  *
  100.  * Revision 1.43  1999/02/09 10:29:46  malthoff
  101.  * Bugfix: The previous modification again also for the second location.
  102.  *
  103.  * Revision 1.42  1999/02/09 09:35:16  malthoff
  104.  * Bugfix: The bits '66 MHz Capable' and 'NEWCAP are reset while
  105.  * clearing the error bits in the PCI status register.
  106.  *
  107.  * Revision 1.41  1999/01/18 13:07:02  malthoff
  108.  * Bugfix: Do not use CFG cycles after during Init- or Runtime, because
  109.  * they may not be available after Boottime.
  110.  *
  111.  * Revision 1.40  1999/01/11 12:40:49  malthoff
  112.  * Bug fix: PCI_STATUS: clearing error bits sets the UDF bit.
  113.  *
  114.  * Revision 1.39  1998/12/11 15:17:33  gklug
  115.  * chg: Init LipaAutoNeg with Unknown
  116.  *
  117.  * Revision 1.38  1998/12/10 11:02:57  malthoff
  118.  * Disable Error Log Message when calling SkGeInit(level 2)
  119.  * more than once.
  120.  *
  121.  * Revision 1.37  1998/12/07 12:18:25  gklug
  122.  * add: refinement of autosense mode: take into account the autoneg cap of LiPa
  123.  *
  124.  * Revision 1.36  1998/12/07 07:10:39  gklug
  125.  * fix: init values of LinkBroken/ Capabilities for management
  126.  *
  127.  * Revision 1.35  1998/12/02 10:56:20  gklug
  128.  * fix: do NOT init LoinkSync Counter.
  129.  *
  130.  * Revision 1.34  1998/12/01 10:53:21  gklug
  131.  * add: init of additional Counters for workaround
  132.  *
  133.  * Revision 1.33  1998/12/01 10:00:49  gklug
  134.  * add: init PIsave var in Port struct
  135.  *
  136.  * Revision 1.32  1998/11/26 14:50:40  gklug
  137.  * chg: Default is autosensing with AUTOFULL mode
  138.  *
  139.  * Revision 1.31  1998/11/25 15:36:16  gklug
  140.  * fix: do NOT stop LED Timer when port should be stoped
  141.  *
  142.  * Revision 1.30  1998/11/24 13:15:28  gklug
  143.  * add: Init PCkeckPar struct member
  144.  *
  145.  * Revision 1.29  1998/11/18 13:19:27  malthoff
  146.  * Disable packet arbiter timeouts on receive side.
  147.  * Use maximum timeout value for packet arbiter
  148.  * transmit timeouts.
  149.  * Add TestStopBit() function to handle stop RX/TX
  150.  * problem with active descriptor poll timers.
  151.  * Bug Fix: Descriptor Poll Timer not started, beacuse
  152.  * GIPollTimerVal was initilaized with 0.
  153.  *
  154.  * Revision 1.28  1998/11/13 14:24:26  malthoff
  155.  * Bug Fix: SkGeStopPort() may hang if a Packet Arbiter Timout
  156.  * is pending or occurs while waiting for TX_STOP and RX_STOP.
  157.  * The PA timeout is cleared now while waiting for TX- or RX_STOP.
  158.  *
  159.  * Revision 1.27  1998/11/02 11:04:36  malthoff
  160.  * fix the last fix
  161.  *
  162.  * Revision 1.26  1998/11/02 10:37:03  malthoff
  163.  * Fix: SkGePollTxD() enables always the synchronounous poll timer.
  164.  *
  165.  * Revision 1.25  1998/10/28 07:12:43  cgoos
  166.  * Fixed "LED_STOP" in SkGeLnkSyncCnt, "== SK_INIT_IO" in SkGeInit.
  167.  * Removed: Reset of RAM Interface in SkGeStopPort.
  168.  *
  169.  * Revision 1.24  1998/10/27 08:13:12  malthoff
  170.  * Remove temporary code.
  171.  *
  172.  * Revision 1.23  1998/10/26 07:45:03  malthoff
  173.  * Add Address Calculation Workaround: If the EPROM byte
  174.  * Id is 3, the address offset is 512 kB.
  175.  * Initialize default values for PLinkMode and PFlowCtrlMode.
  176.  *
  177.  * Revision 1.22  1998/10/22 09:46:47  gklug
  178.  * fix SysKonnectFileId typo
  179.  *
  180.  * Revision 1.21  1998/10/20 12:11:56  malthoff
  181.  * Don't dendy the Queue config if the size of the unused
  182.  * rx qeueu is zero.
  183.  *
  184.  * Revision 1.20  1998/10/19 07:27:58  malthoff
  185.  * SkGeInitRamIface() is public to be called by diagnostics.
  186.  *
  187.  * Revision 1.19  1998/10/16 13:33:45  malthoff
  188.  * Fix: enabling descriptor polling is not allowed until
  189.  * the descriptor addresses are set. Descriptor polling
  190.  * must be handled by the driver.
  191.  *
  192.  * Revision 1.18  1998/10/16 10:58:27  malthoff
  193.  * Remove temp. code for Diag prototype.
  194.  * Remove lint warning for dummy reads.
  195.  * Call SkGeLoadLnkSyncCnt() during SkGeInitPort().
  196.  *
  197.  * Revision 1.17  1998/10/14 09:16:06  malthoff
  198.  * Change parameter LimCount and programming of
  199.  * the limit counter in SkGeCfgSync().
  200.  *
  201.  * Revision 1.16  1998/10/13 09:21:16  malthoff
  202.  * Don't set XM_RX_SELF_RX in RxCmd Reg, because it's
  203.  * like a Loopback Mode in half duplex.
  204.  *
  205.  * Revision 1.15  1998/10/09 06:47:40  malthoff
  206.  * SkGeInitMacArb(): set recovery counters init value
  207.  * to zero although this counters are not uesd.
  208.  * Bug fix in Rx Upper/Lower Pause Threshold calculation.
  209.  * Add XM_RX_SELF_RX to RxCmd.
  210.  *
  211.  * Revision 1.14  1998/10/06 15:15:53  malthoff
  212.  * Make sure no pending IRQ is cleared in SkGeLoadLnkSyncCnt().
  213.  *
  214.  * Revision 1.13  1998/10/06 14:09:36  malthoff
  215.  * Add SkGeLoadLnkSyncCnt(). Modify
  216.  * the 'port stopped' condition according
  217.  * to the current problem report.
  218.  *
  219.  * Revision 1.12  1998/10/05 08:17:21  malthoff
  220.  * Add functions: SkGePollRxD(), SkGePollTxD(),
  221.  * DoCalcAddr(), SkGeCheckQSize(),
  222.  * DoInitRamQueue(), and SkGeCfgSync().
  223.  * Add coding for SkGeInitMacArb(), SkGeInitPktArb(),
  224.  * SkGeInitMacFifo(), SkGeInitRamBufs(),
  225.  * SkGeInitRamIface(), and SkGeInitBmu().
  226.  *
  227.  * Revision 1.11  1998/09/29 08:26:29  malthoff
  228.  * bug fix: SkGeInit0() 'i' should be increment.
  229.  *
  230.  * Revision 1.10  1998/09/28 13:19:01  malthoff
  231.  * Coding time: Save the done work.
  232.  * Modify SkGeLinkLED(), add SkGeXmitLED(),
  233.  * define SkGeCheckQSize(), SkGeInitMacArb(),
  234.  * SkGeInitPktArb(), SkGeInitMacFifo(),
  235.  * SkGeInitRamBufs(), SkGeInitRamIface(),
  236.  * and SkGeInitBmu(). Do coding for SkGeStopPort(),
  237.  * SkGeInit1(), SkGeInit2(), and SkGeInit3().
  238.  * Do coding for SkGeDinit() and SkGeInitPort().
  239.  *
  240.  * Revision 1.9  1998/09/16 14:29:05  malthoff
  241.  * Some minor changes.
  242.  *
  243.  * Revision 1.8  1998/09/11 05:29:14  gklug
  244.  * add: init state of a port
  245.  *
  246.  * Revision 1.7  1998/09/04 09:26:25  malthoff
  247.  * Short temporary modification.
  248.  *
  249.  * Revision 1.6  1998/09/04 08:27:59  malthoff
  250.  * Remark the do-while in StopPort() because it never ends
  251.  * without a GE adapter.
  252.  *
  253.  * Revision 1.5  1998/09/03 14:05:45  malthoff
  254.  * Change comment for SkGeInitPort(). Do not
  255.  * repair the queue sizes if invalid.
  256.  *
  257.  * Revision 1.4  1998/09/03 10:03:19  malthoff
  258.  * Implement the new interface according to the
  259.  * reviewed interface specification.
  260.  *
  261.  * Revision 1.3  1998/08/19 09:11:25  gklug
  262.  * fix: struct are removed from c-source (see CCC)
  263.  *
  264.  * Revision 1.2  1998/07/28 12:33:58  malthoff
  265.  * Add 'IoC' parameter in function declaration and SK IO macros.
  266.  *
  267.  * Revision 1.1  1998/07/23 09:48:57  malthoff
  268.  * Creation. First dummy 'C' file.
  269.  * SkGeInit(Level 0) is card_start for ML.
  270.  * SkGeDeInit() is card_stop for ML.
  271.  *
  272.  *
  273.  ******************************************************************************/
  274. #include "h/skdrv1st.h"
  275. #include "h/xmac_ii.h"
  276. #include "h/skdrv2nd.h"
  277. /* defines ********************************************************************/
  278. /* defines for SkGeXmitLed() */
  279. #define XMIT_LED_INI 0
  280. #define XMIT_LED_CNT (RX_LED_VAL - RX_LED_INI)
  281. #define XMIT_LED_CTRL (RX_LED_CTRL- RX_LED_INI)
  282. #define XMIT_LED_TST (RX_LED_TST - RX_LED_INI)
  283. /* Queue Size units */
  284. #define QZ_UNITS 0x7
  285. /* Types of RAM Buffer Queues */
  286. #define SK_RX_SRAM_Q 1 /* small receive queue */
  287. #define SK_RX_BRAM_Q 2 /* big receive queue */
  288. #define SK_TX_RAM_Q 3 /* small or big transmit queue */
  289. /* typedefs *******************************************************************/
  290. /* global variables ***********************************************************/
  291. /* local variables ************************************************************/
  292. static const char SysKonnectFileId[] =
  293. "@(#)$Id: skgeinit.c,v 1.63 2001/04/05 11:02:09 rassmann Exp $ (C) SK ";
  294. struct s_QOffTab {
  295. int RxQOff; /* Receive Queue Address Offset */
  296. int XsQOff; /* Sync Tx Queue Address Offset */
  297. int XaQOff; /* Async Tx Queue Address Offset */
  298. };
  299. static struct s_QOffTab QOffTab[] = {
  300. {Q_R1, Q_XS1, Q_XA1}, {Q_R2, Q_XS2, Q_XA2}
  301. };
  302. /******************************************************************************
  303.  *
  304.  * SkGePollRxD() - Enable/Disable Descriptor Polling of RxD Ring
  305.  *
  306.  * Description:
  307.  * Enable or disable the descriptor polling the receive descriptor
  308.  * ring (RxD) of port 'port'.
  309.  * The new configuration is *not* saved over any SkGeStopPort() and
  310.  * SkGeInitPort() calls.
  311.  *
  312.  * Returns:
  313.  * nothing
  314.  */
  315. void SkGePollRxD(
  316. SK_AC *pAC, /* adapter context */
  317. SK_IOC IoC, /* IO context */
  318. int Port, /* Port Index (MAC_1 + n) */
  319. SK_BOOL PollRxD) /* SK_TRUE (enable pol.), SK_FALSE (disable pol.) */
  320. {
  321. SK_GEPORT *pPrt;
  322. pPrt = &pAC->GIni.GP[Port];
  323. if (PollRxD) {
  324. SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), CSR_ENA_POL);
  325. }
  326. else {
  327. SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), CSR_DIS_POL);
  328. }
  329. } /* SkGePollRxD */
  330. /******************************************************************************
  331.  *
  332.  * SkGePollTxD() - Enable/Disable Descriptor Polling of TxD Rings
  333.  *
  334.  * Description:
  335.  * Enable or disable the descriptor polling the transmit descriptor
  336.  * ring(s) (RxD) of port 'port'.
  337.  * The new configuration is *not* saved over any SkGeStopPort() and
  338.  * SkGeInitPort() calls.
  339.  *
  340.  * Returns:
  341.  * nothing
  342.  */
  343. void SkGePollTxD(
  344. SK_AC *pAC, /* adapter context */
  345. SK_IOC IoC, /* IO context */
  346. int Port, /* Port Index (MAC_1 + n) */
  347. SK_BOOL PollTxD) /* SK_TRUE (enable pol.), SK_FALSE (disable pol.) */
  348. {
  349. SK_GEPORT *pPrt;
  350. SK_U32 DWord;
  351. pPrt = &pAC->GIni.GP[Port];
  352. if (PollTxD) {
  353. DWord = CSR_ENA_POL;
  354. }
  355. else {
  356. DWord = CSR_DIS_POL;
  357. }
  358. if (pPrt->PXSQSize != 0) {
  359. SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), DWord);
  360. }
  361. if (pPrt->PXAQSize != 0) {
  362. SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), DWord);
  363. }
  364. } /* SkGePollTxD */
  365. /******************************************************************************
  366.  *
  367.  * SkGeYellowLED() - Switch the yellow LED on or off.
  368.  *
  369.  * Description:
  370.  * Switch the yellow LED on or off.
  371.  *
  372.  * Note:
  373.  * This function may be called any time after SkGeInit(Level 1).
  374.  *
  375.  * Returns:
  376.  * nothing
  377.  */
  378. void SkGeYellowLED(
  379. SK_AC *pAC, /* adapter context */
  380. SK_IOC IoC, /* IO context */
  381. int State) /* yellow LED state, 0 = OFF, 0 != ON */
  382. {
  383. if (State == 0) {
  384. /* Switch yellow LED OFF */
  385. SK_OUT8(IoC, B0_LED, LED_STAT_OFF);
  386. }
  387. else {
  388. /* Switch yellow LED ON */
  389. SK_OUT8(IoC, B0_LED, LED_STAT_ON);
  390. }
  391. } /* SkGeYellowLED */
  392. /******************************************************************************
  393.  *
  394.  * SkGeXmitLED() - Modify the Operational Mode of a transmission LED.
  395.  *
  396.  * Description:
  397.  * The Rx or Tx LED which is specified by 'Led' will be
  398.  * enabled, disabled or switched on in test mode.
  399.  *
  400.  * Note:
  401.  * 'Led' must contain the address offset of the LEDs INI register.
  402.  *
  403.  * Usage:
  404.  * SkGeXmitLED(pAC, IoC, MR_ADDR(Port, TX_LED_INI), SK_LED_ENA);
  405.  *
  406.  * Returns:
  407.  * nothing
  408.  */
  409. void SkGeXmitLED(
  410. SK_AC *pAC, /* adapter context */
  411. SK_IOC IoC, /* IO context */
  412. int Led, /* offset to the LED Init Value register */
  413. int Mode) /* Mode may be SK_LED_DIS, SK_LED_ENA, SK_LED_TST */
  414. {
  415. SK_U32 LedIni;
  416. switch (Mode) {
  417. case SK_LED_ENA:
  418. LedIni = SK_XMIT_DUR * (SK_U32)pAC->GIni.GIHstClkFact / 100;
  419. SK_OUT32(IoC, Led + XMIT_LED_INI, LedIni);
  420. SK_OUT8(IoC, Led + XMIT_LED_CTRL, LED_START);
  421. break;
  422. case SK_LED_TST:
  423. SK_OUT8(IoC, Led + XMIT_LED_TST, LED_T_ON);
  424. SK_OUT32(IoC, Led + XMIT_LED_CNT, 100);
  425. SK_OUT8(IoC, Led + XMIT_LED_CTRL, LED_START);
  426. break;
  427. case SK_LED_DIS:
  428. default:
  429. /*
  430.  * Do NOT stop the LED Timer here. The LED might be
  431.  * in on state. But it needs to go off.
  432.  */
  433. SK_OUT32(IoC, Led + XMIT_LED_CNT, 0);
  434. SK_OUT8(IoC, Led + XMIT_LED_TST, LED_T_OFF);
  435. break;
  436. }
  437. /*
  438.  * 1000BT: The Transmit LED is driven by the PHY.
  439.  * But the default LED configuration is used for
  440.  * Level One and Broadcom PHYs.
  441.  * (Broadcom: It may be that PHY_B_PEC_EN_LTR has to be set.)
  442.  * (In this case it has to be added here. But we will see. XXX)
  443.  */
  444. } /* SkGeXmitLED */
  445. /******************************************************************************
  446.  *
  447.  * DoCalcAddr() - Calculates the start and the end address of a queue.
  448.  *
  449.  * Description:
  450.  * This function calculates the start- end the end address
  451.  * of a queue. Afterwards the 'StartVal' is incremented to the
  452.  * next start position.
  453.  * If the port is already initialized the calculated values
  454.  * will be checked against the configured values and an
  455.  * error will be returned, if they are not equal.
  456.  * If the port is not initialized the values will be written to
  457.  * *StartAdr and *EndAddr.
  458.  *
  459.  * Returns:
  460.  * 0: success
  461.  * 1: configuration error
  462.  */
  463. static int DoCalcAddr(
  464. SK_AC *pAC,  /* adapter context */
  465. SK_GEPORT *pPrt, /* port index */
  466. int QuSize, /* size of the queue to configure in kB */
  467. SK_U32 *StartVal, /* start value for address calculation */
  468. SK_U32 *QuStartAddr, /* start addr to calculate */
  469. SK_U32 *QuEndAddr) /* end address to calculate */
  470. {
  471. SK_U32 EndVal;
  472. SK_U32 NextStart;
  473. int Rtv;
  474. Rtv = 0;
  475. if (QuSize == 0) {
  476. EndVal = *StartVal;
  477. NextStart = EndVal;
  478. }
  479. else {
  480. EndVal = *StartVal + ((SK_U32)QuSize * 1024) - 1;
  481. NextStart = EndVal + 1;
  482. }
  483. if (pPrt->PState >= SK_PRT_INIT) {
  484. if (*StartVal != *QuStartAddr || EndVal != *QuEndAddr) {
  485. Rtv = 1;
  486. }
  487. }
  488. else {
  489. *QuStartAddr = *StartVal;
  490. *QuEndAddr = EndVal;
  491. }
  492. *StartVal = NextStart;
  493. return (Rtv);
  494. } /* DoCalcAddr */
  495. /******************************************************************************
  496.  *
  497.  * SkGeCheckQSize() - Checks the Adapters Queue Size Configuration
  498.  *
  499.  * Description:
  500.  * This function verifies the Queue Size Configuration specified
  501.  * in the variabels PRxQSize, PXSQSize, and PXAQSize of all
  502.  * used ports.
  503.  * This requirements must be fullfilled to have a valid configuration:
  504.  * - The size of all queues must not exceed GIRamSize.
  505.  * - The queue sizes must be specified in units of 8 kB.
  506.  * - The size of rx queues of available ports must not be
  507.  *   smaller than 16kB.
  508.  * - The RAM start and end addresses must not be changed
  509.  *   for ports which are already initialized.
  510.  * Furthermore SkGeCheckQSize() defines the Start and End
  511.  * Addresses of all ports and stores them into the HWAC port
  512.  * structure.
  513.  *
  514.  * Returns:
  515.  * 0: Queue Size Configuration valid
  516.  * 1: Queue Size Configuration invalid
  517.  */
  518. static int SkGeCheckQSize(
  519. SK_AC  *pAC, /* adapter context */
  520. int  Port) /* port index */
  521. {
  522. SK_GEPORT *pPrt;
  523. int UsedMem;
  524. int i;
  525. int Rtv;
  526. int Rtv2;
  527. SK_U32 StartAddr;
  528. UsedMem = 0;
  529. Rtv = 0;
  530. for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
  531. pPrt = &pAC->GIni.GP[i];
  532. if (( pPrt->PRxQSize & QZ_UNITS) ||
  533. (pPrt->PXSQSize & QZ_UNITS) ||
  534. (pPrt->PXAQSize & QZ_UNITS)) {
  535. SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E012, SKERR_HWI_E012MSG);
  536. Rtv = 1;
  537. goto CheckQSizeEnd;
  538. }
  539. UsedMem += pPrt->PRxQSize + pPrt->PXSQSize + pPrt->PXAQSize;
  540. if (i == Port && pPrt->PRxQSize < SK_MIN_RXQ_SIZE) {
  541. SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E011, SKERR_HWI_E011MSG);
  542. Rtv = 1;
  543. goto CheckQSizeEnd;
  544. }
  545. }
  546. if (UsedMem > pAC->GIni.GIRamSize) {
  547. SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E012, SKERR_HWI_E012MSG);
  548. Rtv = 1;
  549. goto CheckQSizeEnd;
  550. }
  551. /* Now start address calculation */
  552. StartAddr = pAC->GIni.GIRamOffs;
  553. for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
  554. pPrt = &pAC->GIni.GP[i];
  555. /* Calculate/Check values for the receive queue */
  556. Rtv2 = DoCalcAddr(pAC, pPrt, pPrt->PRxQSize, &StartAddr,
  557. &pPrt->PRxQRamStart, &pPrt->PRxQRamEnd);
  558. Rtv |= Rtv2;
  559. /* Calculate/Check values for the synchronous tx queue */
  560. Rtv2 = DoCalcAddr(pAC, pPrt, pPrt->PXSQSize, &StartAddr,
  561. &pPrt->PXsQRamStart, &pPrt->PXsQRamEnd);
  562. Rtv |= Rtv2;
  563. /* Calculate/Check values for the asynchronous tx queue */
  564. Rtv2 = DoCalcAddr(pAC, pPrt, pPrt->PXAQSize, &StartAddr,
  565. &pPrt->PXaQRamStart, &pPrt->PXaQRamEnd);
  566. Rtv |= Rtv2;
  567. if (Rtv) {
  568. SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E013, SKERR_HWI_E013MSG);
  569. break;
  570. }
  571. }
  572. CheckQSizeEnd:
  573. return (Rtv);
  574. } /* SkGeCheckQSize */
  575. /******************************************************************************
  576.  *
  577.  * SkGeInitMacArb() - Initialize the MAC Arbiter
  578.  *
  579.  * Description:
  580.  * This function initializes the MAC Arbiter.
  581.  * It must not be called if there is still an
  582.  * initilaized or active port.
  583.  *
  584.  * Returns:
  585.  * nothing:
  586.  */
  587. static void SkGeInitMacArb(
  588. SK_AC *pAC, /* adapter context */
  589. SK_IOC IoC) /* IO context */
  590. {
  591. /* release local reset */
  592. SK_OUT16(IoC, B3_MA_TO_CTRL, MA_RST_CLR);
  593. /* configure timeout values */
  594. SK_OUT8(IoC, B3_MA_TOINI_RX1, SK_MAC_TO_53);
  595. SK_OUT8(IoC, B3_MA_TOINI_RX2, SK_MAC_TO_53);
  596. SK_OUT8(IoC, B3_MA_TOINI_TX1, SK_MAC_TO_53);
  597. SK_OUT8(IoC, B3_MA_TOINI_TX2, SK_MAC_TO_53);
  598. SK_OUT8(IoC, B3_MA_RCINI_RX1, 0);
  599. SK_OUT8(IoC, B3_MA_RCINI_RX2, 0);
  600. SK_OUT8(IoC, B3_MA_RCINI_TX1, 0);
  601. SK_OUT8(IoC, B3_MA_RCINI_TX2, 0);
  602. /* recovery values are needed for XMAC II Rev. B2 only */
  603. /* Fast Output Enable Mode was intended to use with Rev. B2, but now? */
  604. /*
  605.  * There is not start or enable buttom to push, therefore
  606.  * the MAC arbiter is configured and enabled now.
  607.  */
  608. } /* SkGeInitMacArb */
  609. /******************************************************************************
  610.  *
  611.  * SkGeInitPktArb() - Initialize the Packet Arbiter
  612.  *
  613.  * Description:
  614.  * This function initializes the Packet Arbiter.
  615.  * It must not be called if there is still an
  616.  * initilaized or active port.
  617.  *
  618.  * Returns:
  619.  * nothing:
  620.  */
  621. static void SkGeInitPktArb(
  622. SK_AC *pAC, /* adapter context */
  623. SK_IOC IoC) /* IO context */
  624. {
  625. /* release local reset */
  626. SK_OUT16(IoC, B3_PA_CTRL, PA_RST_CLR);
  627. /* configure timeout values */
  628. SK_OUT16(IoC, B3_PA_TOINI_RX1, SK_PKT_TO_MAX);
  629. SK_OUT16(IoC, B3_PA_TOINI_RX2, SK_PKT_TO_MAX);
  630. SK_OUT16(IoC, B3_PA_TOINI_TX1, SK_PKT_TO_MAX);
  631. SK_OUT16(IoC, B3_PA_TOINI_TX2, SK_PKT_TO_MAX);
  632. /*
  633.  * enable timeout timers if jumbo frames not used
  634.  * NOTE: the packet arbiter timeout interrupt is needed for
  635.  * half duplex hangup workaround
  636.  */
  637. if (pAC->GIni.GIPortUsage != SK_JUMBO_LINK) {
  638. if (pAC->GIni.GIMacsFound == 1) {
  639. SK_OUT16(IoC, B3_PA_CTRL, PA_ENA_TO_TX1);
  640. }
  641. else {
  642. SK_OUT16(IoC, B3_PA_CTRL,(PA_ENA_TO_TX1 | PA_ENA_TO_TX2));
  643. }
  644. }
  645. } /* SkGeInitPktArb */
  646. /******************************************************************************
  647.  *
  648.  * SkGeInitMacFifo() - Initialize the MAC FIFOs
  649.  *
  650.  * Description:
  651.  * Initialize all MAC FIFOs of the specified port
  652.  *
  653.  * Returns:
  654.  * nothing
  655.  */
  656. static void SkGeInitMacFifo(
  657. SK_AC *pAC, /* adapter context */
  658. SK_IOC IoC, /* IO context */
  659. int Port) /* Port Index (MAC_1 + n) */
  660. {
  661. /*
  662.  * For each FIFO:
  663.  * - release local reset
  664.  * - use default value for MAC FIFO size
  665.  * - setup defaults for the control register
  666.  * - enable the FIFO
  667.  */
  668. /* Configure RX MAC FIFO */
  669. SK_OUT8(IoC, MR_ADDR(Port, RX_MFF_CTRL2), MFF_RST_CLR);
  670. SK_OUT16(IoC, MR_ADDR(Port, RX_MFF_CTRL1), MFF_RX_CTRL_DEF);
  671. SK_OUT8(IoC, MR_ADDR(Port, RX_MFF_CTRL2), MFF_ENA_OP_MD);
  672. /* Configure TX MAC FIFO */
  673. SK_OUT8(IoC, MR_ADDR(Port, TX_MFF_CTRL2), MFF_RST_CLR);
  674. SK_OUT16(IoC, MR_ADDR(Port, TX_MFF_CTRL1), MFF_TX_CTRL_DEF);
  675. SK_OUT8(IoC, MR_ADDR(Port, TX_MFF_CTRL2), MFF_ENA_OP_MD);
  676. /* Enable frame flushing if jumbo frames used */
  677. if (pAC->GIni.GIPortUsage == SK_JUMBO_LINK) {
  678. SK_OUT16(IoC, MR_ADDR(Port, RX_MFF_CTRL1), MFF_ENA_FLUSH);
  679. }
  680. } /* SkGeInitMacFifo */
  681. /******************************************************************************
  682.  *
  683.  * SkGeLoadLnkSyncCnt() - Load the Link Sync Counter and starts counting
  684.  *
  685.  * Description:
  686.  * This function starts the Link Sync Counter of the specified
  687.  * port and enables the generation of an Link Sync IRQ.
  688.  * The Link Sync Counter may be used to detect an active link,
  689.  * if autonegotiation is not used.
  690.  *
  691.  * Note:
  692.  * o To ensure receiving the Link Sync Event the LinkSyncCounter
  693.  *   should be initialized BEFORE clearing the XMACs reset!
  694.  * o Enable IS_LNK_SYNC_M1 and IS_LNK_SYNC_M2 after calling this
  695.  *   function.
  696.  *
  697.  * Retruns:
  698.  * nothing
  699.  */
  700. void SkGeLoadLnkSyncCnt(
  701. SK_AC *pAC, /* adapter context */
  702. SK_IOC IoC, /* IO context */
  703. int Port, /* Port Index (MAC_1 + n) */
  704. SK_U32 CntVal) /* Counter value */
  705. {
  706. SK_U32 OrgIMsk;
  707. SK_U32 NewIMsk;
  708. SK_U32 ISrc;
  709. SK_BOOL IrqPend;
  710. /* stop counter */
  711. SK_OUT8(IoC, MR_ADDR(Port, LNK_SYNC_CTRL), LED_STOP);
  712. /*
  713.  * ASIC problem:
  714.  * Each time starting the Link Sync Counter an IRQ is generated
  715.  * by the adapter. See problem report entry from 21.07.98
  716.  *
  717.  * Workaround: Disable Link Sync IRQ and clear the unexpeced IRQ
  718.  * if no IRQ is already pending.
  719.  */
  720. IrqPend = SK_FALSE;
  721. SK_IN32(IoC, B0_ISRC, &ISrc);
  722. SK_IN32(IoC, B0_IMSK, &OrgIMsk);
  723. if (Port == MAC_1) {
  724. NewIMsk = OrgIMsk & ~IS_LNK_SYNC_M1;
  725. if (ISrc & IS_LNK_SYNC_M1) {
  726. IrqPend = SK_TRUE;
  727. }
  728. }
  729. else {
  730. NewIMsk = OrgIMsk & ~IS_LNK_SYNC_M2;
  731. if (ISrc & IS_LNK_SYNC_M2) {
  732. IrqPend = SK_TRUE;
  733. }
  734. }
  735. if (!IrqPend) {
  736. SK_OUT32(IoC, B0_IMSK, NewIMsk);
  737. }
  738. /* load counter */
  739. SK_OUT32(IoC, MR_ADDR(Port, LNK_SYNC_INI), CntVal);
  740. /* start counter */
  741. SK_OUT8(IoC, MR_ADDR(Port, LNK_SYNC_CTRL), LED_START);
  742. if (!IrqPend) {
  743. /* clear the unexpected IRQ, and restore the interrupt mask */
  744. SK_OUT8(IoC, MR_ADDR(Port, LNK_SYNC_CTRL), LED_CLR_IRQ);
  745. SK_OUT32(IoC, B0_IMSK, OrgIMsk);
  746. }
  747. } /* SkGeLoadLnkSyncCnt*/
  748. /******************************************************************************
  749.  *
  750.  * SkGeCfgSync() - Configure synchronous bandwidth for this port.
  751.  *
  752.  * Description:
  753.  * This function may be used to configure synchronous bandwidth
  754.  * to the specified port. This may be done any time after
  755.  * initializing the port. The configuration values are NOT saved
  756.  * in the HWAC port structure and will be overwritten any
  757.  * time when stopping and starting the port.
  758.  * Any values for the synchronous configuration will be ignored
  759.  * if the size of the synchronous queue is zero!
  760.  *
  761.  * The default configuration for the synchronous service is
  762.  * TXA_ENA_FSYNC. This means if the size of
  763.  * the synchronous queue is unequal zero but no specific
  764.  * synchronous bandwidth is configured, the synchronous queue
  765.  * will always have the 'unlimitted' transmit priority!
  766.  *
  767.  * This mode will be restored if the synchronous bandwidth is
  768.  * deallocated ('IntTime' = 0 and 'LimCount' = 0).
  769.  *
  770.  * Returns:
  771.  * 0: success
  772.  * 1: paramter configuration error
  773.  * 2: try to configure quality of service although no
  774.  * synchronous queue is configured
  775.  */
  776. int SkGeCfgSync(
  777. SK_AC *pAC, /* adapter context */
  778. SK_IOC IoC, /* IO context */
  779. int Port, /* Port Index (MAC_1 + n) */
  780. SK_U32 IntTime, /* Interval Timer Value in units of 8ns */
  781. SK_U32 LimCount, /* Number of bytes to transfer during IntTime */
  782. int SyncMode) /* Sync Mode: TXA_ENA_ALLOC | TXA_DIS_ALLOC | 0 */
  783. {
  784. int Rtv;
  785. Rtv = 0;
  786. /* check the parameters */
  787. if (LimCount > IntTime ||
  788. (LimCount == 0 && IntTime != 0) ||
  789. (LimCount !=0 && IntTime == 0)) {
  790. SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E010, SKERR_HWI_E010MSG);
  791. Rtv = 1;
  792. goto CfgSyncEnd;
  793. }
  794. if (pAC->GIni.GP[Port].PXSQSize != 0) {
  795. /* calculate register values */
  796. IntTime = (IntTime / 2) * pAC->GIni.GIHstClkFact / 100;
  797. LimCount = LimCount / 8;
  798. if (IntTime > TXA_MAX_VAL || LimCount > TXA_MAX_VAL) {
  799. SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E010, SKERR_HWI_E010MSG);
  800. Rtv = 1;
  801. goto CfgSyncEnd;
  802. }
  803. /*
  804.  * - Enable 'Force Sync' to ensure the synchronous queue
  805.  *   has the priority while configuring the new values.
  806.  * - Also 'disable alloc' to ensure the settings complies
  807.  *   to the SyncMode parameter.
  808.  * - Disable 'Rate Control' to configure the new values.
  809.  * - write IntTime and Limcount
  810.  * - start 'Rate Control' and disable 'Force Sync'
  811.  *   if Interval Timer or Limit Counter not zero.
  812.  */
  813. SK_OUT8(IoC, MR_ADDR(Port, TXA_CTRL),
  814. TXA_ENA_FSYNC | TXA_DIS_ALLOC | TXA_STOP_RC);
  815. SK_OUT32(IoC, MR_ADDR(Port, TXA_ITI_INI), IntTime);
  816. SK_OUT32(IoC, MR_ADDR(Port, TXA_LIM_INI), LimCount);
  817. SK_OUT8(IoC, MR_ADDR(Port, TXA_CTRL),
  818. (SyncMode & (TXA_ENA_ALLOC|TXA_DIS_ALLOC)));
  819. if (IntTime != 0 || LimCount != 0) {
  820. SK_OUT8(IoC, MR_ADDR(Port, TXA_CTRL),
  821. TXA_DIS_FSYNC|TXA_START_RC);
  822. }
  823. }
  824. else {
  825. SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E009, SKERR_HWI_E009MSG);
  826. Rtv = 2;
  827. }
  828. CfgSyncEnd:
  829. return (Rtv);
  830. } /* SkGeCfgSync */
  831. /******************************************************************************
  832.  *
  833.  * DoInitRamQueue() - Initilaize the RAM Buffer Address of a single Queue
  834.  *
  835.  * Desccription:
  836.  * If the queue is used, enable and initilaize it.
  837.  * Make sure the queue is still reset, if it is not used.
  838.  *
  839.  * Returns:
  840.  * nothing
  841.  */
  842. static void DoInitRamQueue(
  843. SK_AC *pAC, /* adapter context */
  844. SK_IOC IoC, /* IO context */
  845. int QuIoOffs, /* Queue IO Address Offset */
  846. SK_U32 QuStartAddr, /* Queue Start Address */
  847. SK_U32 QuEndAddr, /* Queue End Address */
  848. int QuType) /* Queue Type (SK_RX_SRAM_Q|SK_RX_BRAM_Q|SK_TX_RAM_Q) */
  849. {
  850. SK_U32 RxUpThresVal;
  851. SK_U32 RxLoThresVal;
  852. if (QuStartAddr != QuEndAddr) {
  853. /* calculate thresholds, assume we have a big Rx queue */
  854. RxUpThresVal = (QuEndAddr + 1 - QuStartAddr - SK_RB_ULPP) / 8;
  855. RxLoThresVal = (QuEndAddr + 1 - QuStartAddr - SK_RB_LLPP_B)/8;
  856. /* build HW address format */
  857. QuStartAddr = QuStartAddr / 8;
  858. QuEndAddr = QuEndAddr / 8;
  859. /* release local reset */
  860. SK_OUT8(IoC, RB_ADDR(QuIoOffs, RB_CTRL), RB_RST_CLR);
  861. /* configure addresses */
  862. SK_OUT32(IoC, RB_ADDR(QuIoOffs, RB_START), QuStartAddr);
  863. SK_OUT32(IoC, RB_ADDR(QuIoOffs, RB_END), QuEndAddr);
  864. SK_OUT32(IoC, RB_ADDR(QuIoOffs, RB_WP), QuStartAddr);
  865. SK_OUT32(IoC, RB_ADDR(QuIoOffs, RB_RP), QuStartAddr);
  866. switch (QuType) {
  867. case SK_RX_SRAM_Q:
  868. /* configure threshold for small Rx Queue */
  869. RxLoThresVal += (SK_RB_LLPP_B - SK_RB_LLPP_S) / 8;
  870. /* continue with SK_RX_BRAM_Q */
  871. case SK_RX_BRAM_Q:
  872. /* write threshold for Rx Queue */
  873. SK_OUT32(IoC, RB_ADDR(QuIoOffs, RB_RX_UTPP), RxUpThresVal);
  874. SK_OUT32(IoC, RB_ADDR(QuIoOffs,RB_RX_LTPP), RxLoThresVal);
  875. /* the high priority threshold not used */
  876. break;
  877. case SK_TX_RAM_Q:
  878. /*
  879.  * Do NOT use Store and forward under normal
  880.  * operation due to performance optimization.
  881.  * But if Jumbo frames are configured we NEED
  882.  * the store and forward of the RAM buffer.
  883.  */
  884. if (pAC->GIni.GIPortUsage == SK_JUMBO_LINK) {
  885. /*
  886.  * enable Store & Forward Mode for the
  887.  * Tx Side
  888.  */
  889. SK_OUT8(IoC, RB_ADDR(QuIoOffs, RB_CTRL), RB_ENA_STFWD);
  890. }
  891. break;
  892. }
  893. /* set queue operational */
  894. SK_OUT8(IoC, RB_ADDR(QuIoOffs, RB_CTRL), RB_ENA_OP_MD);
  895. }
  896. else {
  897. /* ensure the queue is still disabled */
  898. SK_OUT8(IoC, RB_ADDR(QuIoOffs, RB_CTRL), RB_RST_SET);
  899. }
  900. } /* DoInitRamQueue*/
  901. /******************************************************************************
  902.  *
  903.  * SkGeInitRamBufs() - Initialize the RAM Buffer Queues
  904.  *
  905.  * Description:
  906.  * Initialize all RAM Buffer Queues of the specified port
  907.  *
  908.  * Returns:
  909.  * nothing
  910.  */
  911. static void SkGeInitRamBufs(
  912. SK_AC *pAC, /* adapter context */
  913. SK_IOC IoC, /* IO context */
  914. int Port) /* Port Index (MAC_1 + n) */
  915. {
  916. SK_GEPORT *pPrt;
  917. int RxQType;
  918. pPrt = &pAC->GIni.GP[Port];
  919. if (pPrt->PRxQSize == SK_MIN_RXQ_SIZE) {
  920. RxQType = SK_RX_SRAM_Q;  /* small Rx Queue */
  921. }
  922. else {
  923. RxQType = SK_RX_BRAM_Q; /* big Rx Queue */
  924. }
  925. DoInitRamQueue(pAC, IoC, pPrt->PRxQOff, pPrt->PRxQRamStart,
  926. pPrt->PRxQRamEnd, RxQType);
  927. DoInitRamQueue(pAC, IoC, pPrt->PXsQOff, pPrt->PXsQRamStart,
  928. pPrt->PXsQRamEnd, SK_TX_RAM_Q);
  929. DoInitRamQueue(pAC, IoC, pPrt->PXaQOff, pPrt->PXaQRamStart,
  930. pPrt->PXaQRamEnd, SK_TX_RAM_Q);
  931. } /* SkGeInitRamBufs */
  932. /******************************************************************************
  933.  *
  934.  * SkGeInitRamIface() - Initialize the RAM Interface
  935.  *
  936.  * Description:
  937.  * This function initializes the Adapbers RAM Interface.
  938.  *
  939.  * Note:
  940.  * This function is used in the diagnostics.
  941.  *
  942.  * Returns:
  943.  * nothing
  944.  */
  945. void SkGeInitRamIface(
  946. SK_AC *pAC, /* adapter context */
  947. SK_IOC IoC) /* IO context */
  948. {
  949. /* release local reset */
  950. SK_OUT16(IoC, B3_RI_CTRL, RI_RST_CLR);
  951. /* configure timeout values */
  952. SK_OUT8(IoC, B3_RI_WTO_R1, SK_RI_TO_53);
  953. SK_OUT8(IoC, B3_RI_WTO_XA1, SK_RI_TO_53);
  954. SK_OUT8(IoC, B3_RI_WTO_XS1, SK_RI_TO_53);
  955. SK_OUT8(IoC, B3_RI_RTO_R1, SK_RI_TO_53);
  956. SK_OUT8(IoC, B3_RI_RTO_XA1, SK_RI_TO_53);
  957. SK_OUT8(IoC, B3_RI_RTO_XS1, SK_RI_TO_53);
  958. SK_OUT8(IoC, B3_RI_WTO_R2, SK_RI_TO_53);
  959. SK_OUT8(IoC, B3_RI_WTO_XA2, SK_RI_TO_53);
  960. SK_OUT8(IoC, B3_RI_WTO_XS2, SK_RI_TO_53);
  961. SK_OUT8(IoC, B3_RI_RTO_R2, SK_RI_TO_53);
  962. SK_OUT8(IoC, B3_RI_RTO_XA2, SK_RI_TO_53);
  963. SK_OUT8(IoC, B3_RI_RTO_XS2, SK_RI_TO_53);
  964. } /* SkGeInitRamIface */
  965. /******************************************************************************
  966.  *
  967.  * SkGeInitBmu() - Initialize the BMU state machines
  968.  *
  969.  * Description:
  970.  * Initialize all BMU state machines of the specified port
  971.  *
  972.  * Returns:
  973.  * nothing
  974.  */
  975. static void SkGeInitBmu(
  976. SK_AC *pAC, /* adapter context */
  977. SK_IOC IoC, /* IO context */
  978. int Port) /* Port Index (MAC_1 + n) */
  979. {
  980. SK_GEPORT *pPrt;
  981. pPrt = &pAC->GIni.GP[Port];
  982. /* Rx Queue: Release all local resets and set the watermark */
  983. SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), CSR_CLR_RESET);
  984. SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_F), SK_BMU_RX_WM);
  985. /*
  986.  * Tx Queue: Release all local resets if the queue is used!
  987.  *  set watermark
  988.  */
  989. if (pPrt->PXSQSize != 0) {
  990. SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), CSR_CLR_RESET);
  991. SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_F), SK_BMU_TX_WM);
  992. }
  993. if (pPrt->PXAQSize != 0) {
  994. SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), CSR_CLR_RESET);
  995. SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_F), SK_BMU_TX_WM);
  996. }
  997. /*
  998.  * Do NOT enable the descriptor poll timers here, because
  999.  * the descriptor addresses are not specified yet.
  1000.  */
  1001. } /* SkGeInitBmu */
  1002. /******************************************************************************
  1003.  *
  1004.  * TestStopBit() - Test the stop bit of the queue
  1005.  *
  1006.  * Description:
  1007.  * Stopping a queue is not as simple as it seems to be.
  1008.  * If descriptor polling is enabled, it may happen
  1009.  * that RX/TX stop is done and SV idle is NOT set.
  1010.  * In this case we have to issue another stop command.
  1011.  *
  1012.  * Retruns:
  1013.  * The queues control status register
  1014.  */
  1015. static SK_U32 TestStopBit(
  1016. SK_AC *pAC, /* Adapter Context */
  1017. SK_IOC IoC, /* IO Context */
  1018. int QuIoOffs) /* Queue IO Address Offset */
  1019. {
  1020. SK_U32 QuCsr; /* CSR contents */
  1021. SK_IN32(IoC, Q_ADDR(QuIoOffs, Q_CSR), &QuCsr);
  1022. if ((QuCsr & (CSR_STOP|CSR_SV_IDLE)) == 0) {
  1023. SK_OUT32(IoC, Q_ADDR(QuIoOffs, Q_CSR), CSR_STOP);
  1024. SK_IN32(IoC, Q_ADDR(QuIoOffs, Q_CSR), &QuCsr);
  1025. }
  1026. return (QuCsr);
  1027. } /* TestStopBit*/
  1028. /******************************************************************************
  1029.  *
  1030.  * SkGeStopPort() - Stop the Rx/Tx activity of the port 'Port'.
  1031.  *
  1032.  * Description:
  1033.  * After calling this function the descriptor rings and rx and tx
  1034.  * queues of this port may be reconfigured.
  1035.  *
  1036.  * It is possible to stop the receive and transmit path seperate or
  1037.  * both together.
  1038.  *
  1039.  * Dir = SK_STOP_TX  Stops the transmit path only and resets
  1040.  * the XMAC. The receive queue is still and
  1041.  * the pending rx frames may still transfered
  1042.  * into the RxD.
  1043.  * SK_STOP_RX Stop the receive path. The tansmit path
  1044.  * has to be stoped once before.
  1045.  * SK_STOP_ALL SK_STOP_TX + SK_STOP_RX
  1046.  *
  1047.  * RstMode=SK_SOFT_RST Resets the XMAC. The PHY is still alive.
  1048.  * SK_HARD_RST Resets the XMAC and the PHY.
  1049.  *
  1050.  * Example:
  1051.  * 1) A Link Down event was signaled for a port. Therefore the activity
  1052.  * of this port should be stoped and a hardware reset should be issued
  1053.  * to enable the workaround of XMAC errata #2. But the received frames
  1054.  * should not be discarded.
  1055.  * ...
  1056.  * SkGeStopPort(pAC, IoC, Port, SK_STOP_TX, SK_HARD_RST);
  1057.  * (transfer all pending rx frames)
  1058.  * SkGeStopPort(pAC, IoC, Port, SK_STOP_RX, SK_HARD_RST);
  1059.  * ...
  1060.  *
  1061.  * 2) An event was issued which request the driver to switch
  1062.  * the 'virtual active' link to an other already active port
  1063.  * as soon as possible. The frames in the receive queue of this
  1064.  * port may be lost. But the PHY must not be reset during this
  1065.  * event.
  1066.  * ...
  1067.  * SkGeStopPort(pAC, IoC, Port, SK_STOP_ALL, SK_SOFT_RST);
  1068.  * ...
  1069.  *
  1070.  * Extended Description:
  1071.  * If SK_STOP_TX is set,
  1072.  * o disable the XMACs receive and transmiter to prevent
  1073.  *   from sending incomplete frames
  1074.  * o stop the port's transmit queues before terminating the
  1075.  *   BMUs to prevent from performing incomplete PCI cycles
  1076.  *   on the PCI bus
  1077.  * - The network rx and tx activity and PCI tx transfer is
  1078.  *   disabled now.
  1079.  * o reset the XMAC depending on the RstMode
  1080.  * o Stop Interval Timer and Limit Counter of Tx Arbiter,
  1081.  *   also disable Force Sync bit and Enable Alloc bit.
  1082.  * o perform a local reset of the port's tx path
  1083.  * - reset the PCI FIFO of the async tx queue
  1084.  * - reset the PCI FIFO of the sync tx queue
  1085.  * - reset the RAM Buffer async tx queue
  1086.  * - reset the RAM Butter sync tx queue
  1087.  * - reset the MAC Tx FIFO
  1088.  * o switch Link and Tx LED off, stop the LED counters
  1089.  *
  1090.  * If SK_STOP_RX is set,
  1091.  * o stop the port's receive queue
  1092.  * - The path data transfer activity is fully stopped now.
  1093.  * o perform a local reset of the port's rx path
  1094.  * - reset the PCI FIFO of the rx queue
  1095.  * - reset the RAM Buffer receive queue
  1096.  * - reset the MAC Rx FIFO
  1097.  * o switch Rx LED off, stop the LED counter
  1098.  *
  1099.  * If all ports are stopped,
  1100.  * o reset the RAM Interface.
  1101.  *
  1102.  * Notes:
  1103.  * o This function may be called during the driver states RESET_PORT and
  1104.  *   SWITCH_PORT.
  1105.  */
  1106. void SkGeStopPort(
  1107. SK_AC *pAC, /* adapter context */
  1108. SK_IOC IoC, /* I/O context */
  1109. int Port, /* port to stop (MAC_1 + n) */
  1110. int Dir, /* Direction to Stop (SK_STOP_RX, SK_STOP_TX, SK_STOP_ALL) */
  1111. int RstMode)/* Reset Mode (SK_SOFT_RST, SK_HARD_RST) */
  1112. {
  1113. #ifndef SK_DIAG
  1114. SK_EVPARA Para;
  1115. #endif /* !SK_DIAG */
  1116. SK_GEPORT *pPrt;
  1117. SK_U32 DWord;
  1118. SK_U16 Word;
  1119. SK_U32 XsCsr;
  1120. SK_U32 XaCsr;
  1121. int i;
  1122. SK_BOOL AllPortsDis;
  1123. SK_U64 ToutStart;
  1124. int ToutCnt;
  1125. pPrt = &pAC->GIni.GP[Port];
  1126. if (Dir & SK_STOP_TX) {
  1127. /* disable the XMACs receiver and transmitter */
  1128. XM_IN16(IoC, Port, XM_MMU_CMD, &Word);
  1129. XM_OUT16(IoC, Port, XM_MMU_CMD, Word & ~(XM_MMU_ENA_RX | XM_MMU_ENA_TX));
  1130. /* dummy read to ensure writing */
  1131. XM_IN16(IoC, Port, XM_MMU_CMD, &Word);
  1132. /* stop both transmit queues */
  1133. /*
  1134.  * If the BMU is in the reset state CSR_STOP will terminate
  1135.  * immediately.
  1136.  */
  1137. SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), CSR_STOP);
  1138. SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), CSR_STOP);
  1139. ToutStart = SkOsGetTime(pAC);
  1140. ToutCnt = 0;
  1141. do {
  1142. /*
  1143.  * Clear packet arbiter timeout to make sure
  1144.  * this loop will terminate.
  1145.  */
  1146. if (Port == MAC_1) {
  1147. Word = PA_CLR_TO_TX1;
  1148. }
  1149. else {
  1150. Word = PA_CLR_TO_TX2;
  1151. }
  1152. SK_OUT16(IoC, B3_PA_CTRL, Word);
  1153. /*
  1154.  * If the transfer stucks at the XMAC the STOP command will not
  1155.  * terminate if we don't flush the XMAC's transmit FIFO!
  1156.  */
  1157. XM_IN32(IoC, Port, XM_MODE, &DWord);
  1158. DWord |= XM_MD_FTF;
  1159. XM_OUT32(IoC, Port, XM_MODE, DWord);
  1160. XsCsr = TestStopBit(pAC, IoC, pPrt->PXsQOff);
  1161. XaCsr = TestStopBit(pAC, IoC, pPrt->PXaQOff);
  1162. if (SkOsGetTime(pAC) - ToutStart > (SK_TICKS_PER_SEC / 18)) {
  1163. /*
  1164.  * Timeout of 1/18 second reached.
  1165.  * This needs to be checked at 1/18 sec only.
  1166.  */
  1167. ToutCnt++;
  1168. switch (ToutCnt) {
  1169. case 1:
  1170. /*
  1171.  * Cache Incoherency workaround: Assume a start command
  1172.  * has been lost while sending the frame. 
  1173.  */
  1174. ToutStart = SkOsGetTime(pAC);
  1175. if (XsCsr & CSR_STOP) {
  1176. SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), CSR_START);
  1177. }
  1178. if (XaCsr & CSR_STOP) {
  1179. SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), CSR_START);
  1180. }
  1181. break;
  1182. case 2:
  1183. default:
  1184. /* Might be a problem when the driver event handler
  1185.  * calls StopPort again.
  1186.  * XXX.
  1187.  */
  1188. /* Fatal Error, Loop aborted */
  1189. /* Create an Error Log Entry */
  1190. SK_ERR_LOG(
  1191. pAC,
  1192. SK_ERRCL_HW,
  1193. SKERR_HWI_E018,
  1194. SKERR_HWI_E018MSG);
  1195. #ifndef SK_DIAG
  1196. Para.Para64 = Port;
  1197. SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_FAIL, Para);
  1198. #endif /* !SK_DIAG */
  1199. return;
  1200. }
  1201. }
  1202. /*
  1203.  * Because of the ASIC problem report entry from 21.08.1998 it is
  1204.  * required to wait until CSR_STOP is reset and CSR_SV_IDLE is set.
  1205.  */
  1206. } while ((XsCsr & (CSR_STOP | CSR_SV_IDLE)) != CSR_SV_IDLE ||
  1207.  (XaCsr & (CSR_STOP | CSR_SV_IDLE)) != CSR_SV_IDLE);
  1208. /* reset the XMAC depending on the RstMode */
  1209. if (RstMode == SK_SOFT_RST) {
  1210. SkXmSoftRst(pAC, IoC, Port);
  1211. }
  1212. else {
  1213. SkXmHardRst(pAC, IoC, Port);
  1214. }
  1215.   /*
  1216.  * Stop Interval Timer and Limit Counter of Tx Arbiter,
  1217.    * also disable Force Sync bit and Enable Alloc bit.
  1218.  */
  1219. SK_OUT8(IoC, MR_ADDR(Port, TXA_CTRL),
  1220. TXA_DIS_FSYNC | TXA_DIS_ALLOC | TXA_STOP_RC);
  1221. SK_OUT32(IoC, MR_ADDR(Port, TXA_ITI_INI), 0x00000000L);
  1222. SK_OUT32(IoC, MR_ADDR(Port, TXA_LIM_INI), 0x00000000L);
  1223. /*
  1224.  * perform a local reset of the port's tx path
  1225.  * - reset the PCI FIFO of the async tx queue
  1226.  * - reset the PCI FIFO of the sync tx queue
  1227.  * - reset the RAM Buffer async tx queue
  1228.  * - reset the RAM Butter sync tx queue
  1229.  * - reset the MAC Tx FIFO
  1230.  */
  1231. SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), CSR_SET_RESET);
  1232. SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), CSR_SET_RESET);
  1233. SK_OUT8(IoC, RB_ADDR(pPrt->PXaQOff, RB_CTRL), RB_RST_SET);
  1234. SK_OUT8(IoC, RB_ADDR(pPrt->PXsQOff, RB_CTRL), RB_RST_SET);
  1235. /* Note: MFF_RST_SET does NOT reset the XMAC! */
  1236. SK_OUT8(IoC, MR_ADDR(Port, TX_MFF_CTRL2), MFF_RST_SET);
  1237. /* switch Link and Tx LED off, stop the LED counters */
  1238. /* Link LED is switched off by the RLMT and the Diag itself */
  1239. SkGeXmitLED(pAC, IoC, MR_ADDR(Port, TX_LED_INI), SK_LED_DIS);
  1240. }
  1241. if (Dir & SK_STOP_RX) {
  1242. /*
  1243.  * The RX Stop Command will not terminate if no buffers
  1244.  * are queued in the RxD ring. But it will always reach
  1245.  * the Idle state. Therefore we can use this feature to
  1246.  * stop the transfer of received packets.
  1247.  */
  1248. /* stop the port's receive queue */
  1249. SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), CSR_STOP);
  1250. i = 100;
  1251. do {
  1252. /*
  1253.  * Clear packet arbiter timeout to make sure
  1254.  * this loop will terminate
  1255.  */
  1256. if (Port == MAC_1) {
  1257. Word = PA_CLR_TO_RX1;
  1258. }
  1259. else {
  1260. Word = PA_CLR_TO_RX2;
  1261. }
  1262. SK_OUT16(IoC, B3_PA_CTRL, Word);
  1263. DWord = TestStopBit(pAC, IoC, pPrt->PRxQOff);
  1264. if (i != 0) {
  1265. i--;
  1266. }
  1267. /* finish if CSR_STOP is done or CSR_SV_IDLE is true and i==0 */
  1268. /*
  1269.  * because of the ASIC problem report entry from 21.08.98
  1270.  * it is required to wait until CSR_STOP is reset and
  1271.  * CSR_SV_IDLE is set.
  1272.  */
  1273. } while ((DWord & (CSR_STOP | CSR_SV_IDLE)) != CSR_SV_IDLE &&
  1274. ((DWord & CSR_SV_IDLE) == 0 || i != 0));
  1275. /* The path data transfer activity is fully stopped now. */
  1276. /*
  1277.  * perform a local reset of the port's rx path
  1278.  * - reset the PCI FIFO of the rx queue
  1279.  * - reset the RAM Buffer receive queue
  1280.  * - reset the MAC Rx FIFO
  1281.  */
  1282. SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), CSR_SET_RESET);
  1283. SK_OUT8(IoC, RB_ADDR(pPrt->PRxQOff, RB_CTRL), RB_RST_SET);
  1284. SK_OUT8(IoC, MR_ADDR(Port, RX_MFF_CTRL2), MFF_RST_SET);
  1285. /* switch Rx LED off, stop the LED counter */
  1286. SkGeXmitLED(pAC, IoC, MR_ADDR(Port, RX_LED_INI), SK_LED_DIS);
  1287. }
  1288.   /*
  1289.  * If all ports are stopped reset the RAM Interface.
  1290.  */
  1291. for (i = 0, AllPortsDis = SK_TRUE; i < pAC->GIni.GIMacsFound; i++) {
  1292. if (pAC->GIni.GP[i].PState != SK_PRT_RESET &&
  1293. pAC->GIni.GP[i].PState != SK_PRT_STOP) {
  1294. AllPortsDis = SK_FALSE;
  1295. break;
  1296. }
  1297. }
  1298. if (AllPortsDis) {
  1299. pAC->GIni.GIAnyPortAct = SK_FALSE;
  1300. }
  1301. } /* SkGeStopPort */
  1302. /******************************************************************************
  1303.  *
  1304.  * SkGeInit0() - Level 0 Initialization
  1305.  *
  1306.  * Description:
  1307.  * - Initialize the BMU address offsets
  1308.  *
  1309.  * Returns:
  1310.  * nothing
  1311.  */
  1312. static void SkGeInit0(
  1313. SK_AC *pAC, /* adapter context */
  1314. SK_IOC IoC) /* IO context */
  1315. {
  1316. int i;
  1317. SK_GEPORT *pPrt;
  1318. for (i = 0; i < SK_MAX_MACS; i++) {
  1319. pPrt = &pAC->GIni.GP[i];
  1320. pPrt->PState = SK_PRT_RESET;
  1321. pPrt->PRxQOff = QOffTab[i].RxQOff;
  1322. pPrt->PXsQOff = QOffTab[i].XsQOff;
  1323. pPrt->PXaQOff = QOffTab[i].XaQOff;
  1324. pPrt->PCheckPar = SK_FALSE;
  1325. pPrt->PRxCmd = XM_RX_STRIP_FCS | XM_RX_LENERR_OK;
  1326. pPrt->PIsave = 0;
  1327. pPrt->PPrevShorts = 0;
  1328. pPrt->PLinkResCt = 0;
  1329. pPrt->PAutoNegTOCt = 0;
  1330. pPrt->PPrevRx = 0;
  1331. pPrt->PPrevFcs = 0;
  1332. pPrt->PRxLim = SK_DEF_RX_WA_LIM;
  1333. pPrt->PLinkMode = SK_LMODE_AUTOFULL;
  1334. pPrt->PLinkModeConf = SK_LMODE_AUTOSENSE;
  1335. pPrt->PFlowCtrlMode = SK_FLOW_MODE_SYM_OR_REM;
  1336. pPrt->PLinkBroken = SK_TRUE; /* See WA code */
  1337. pPrt->PLinkCap = (SK_LMODE_CAP_HALF | SK_LMODE_CAP_FULL |
  1338. SK_LMODE_CAP_AUTOHALF | SK_LMODE_CAP_AUTOFULL);
  1339. pPrt->PLinkModeStatus = SK_LMODE_STAT_UNKNOWN;
  1340. pPrt->PFlowCtrlCap = SK_FLOW_MODE_SYM_OR_REM;
  1341. pPrt->PFlowCtrlStatus = SK_FLOW_STAT_NONE;
  1342. pPrt->PMSCap = (SK_MS_CAP_AUTO | SK_MS_CAP_MASTER | 
  1343. SK_MS_CAP_SLAVE);
  1344. pPrt->PMSMode = SK_MS_MODE_AUTO;
  1345. pPrt->PMSStatus = SK_MS_STAT_UNSET;
  1346. pPrt->PAutoNegFail = SK_FALSE;
  1347. pPrt->PLipaAutoNeg = SK_LIPA_UNKNOWN;
  1348. pPrt->PHWLinkUp = SK_FALSE;
  1349. }
  1350. pAC->GIni.GIPortUsage = SK_RED_LINK;
  1351. pAC->GIni.GIAnyPortAct = SK_FALSE;
  1352. } /* SkGeInit0*/
  1353. #ifdef SK_PCI_RESET
  1354. /******************************************************************************
  1355.  *
  1356.  * SkGePciReset() - Reset PCI interface
  1357.  *
  1358.  * Description:
  1359.  * o Read PCI configuration.
  1360.  * o Change power state to 3.
  1361.  * o Change power state to 0.
  1362.  * o Restore PCI configuration.
  1363.  *
  1364.  * Returns:
  1365.  * 0: Success.
  1366.  * 1: Power state could not be changed to 3.
  1367.  */
  1368. static int SkGePciReset(
  1369. SK_AC *pAC, /* adapter context */
  1370. SK_IOC IoC) /* IO context */
  1371. {
  1372. int i;
  1373. SK_U16 PmCtlSts;
  1374. SK_U32 Bp1;
  1375. SK_U32 Bp2;
  1376. SK_U16 PciCmd;
  1377. SK_U8 Cls;
  1378. SK_U8 Lat;
  1379. SK_U8 ConfigSpace[PCI_CFG_SIZE];
  1380. /*
  1381.  * Note: Switching to D3 state is like a software reset.
  1382.  *  Switching from D3 to D0 is a hardware reset.
  1383.  *  We have to save and restore the configuration space.
  1384.  */
  1385. for (i = 0; i < PCI_CFG_SIZE; i++) {
  1386. SkPciReadCfgDWord(pAC, i*4, &ConfigSpace[i]);
  1387. }
  1388. /* We know the RAM Interface Arbiter is enabled. */
  1389. SkPciWriteCfgWord(pAC, PCI_PM_CTL_STS, PCI_PM_STATE_D3);
  1390. SkPciReadCfgWord(pAC, PCI_PM_CTL_STS, &PmCtlSts);
  1391. if ((PmCtlSts & PCI_PM_STATE) != PCI_PM_STATE_D3) {
  1392. return (1);
  1393. }
  1394. /*
  1395.  * Return to D0 state.
  1396.  */
  1397. SkPciWriteCfgWord(pAC, PCI_PM_CTL_STS, PCI_PM_STATE_D0);
  1398. /* Check for D0 state. */
  1399. SkPciReadCfgWord(pAC, PCI_PM_CTL_STS, &PmCtlSts);
  1400. if ((PmCtlSts & PCI_PM_STATE) != PCI_PM_STATE_D0) {
  1401. return (1);
  1402. }
  1403. /*
  1404.  * Check PCI Config Registers.
  1405.  */
  1406. SkPciReadCfgWord(pAC, PCI_COMMAND, &PciCmd);
  1407. SkPciReadCfgByte(pAC, PCI_CACHE_LSZ, &Cls);
  1408. SkPciReadCfgDWord(pAC, PCI_BASE_1ST, &Bp1);
  1409. SkPciReadCfgDWord(pAC, PCI_BASE_2ND, &Bp2);
  1410. SkPciReadCfgByte(pAC, PCI_LAT_TIM, &lat);
  1411. if (PciCmd != 0 || Cls != 0 || (Bp1 & 0xfffffff0L) != 0 || Bp2 != 1 ||
  1412. Lat != 0 ) {
  1413. return (0);
  1414. }
  1415. /*
  1416.  * Restore Config Space.
  1417.  */
  1418. for (i = 0; i < PCI_CFG_SIZE; i++) {
  1419. SkPciWriteCfgDWord(pAC, i*4, ConfigSpace[i]);
  1420. }
  1421. return (0);
  1422. } /* SkGePciReset */
  1423. #endif /* SK_PCI_RESET */
  1424. /******************************************************************************
  1425.  *
  1426.  * SkGeInit1() - Level 1 Initialization
  1427.  *
  1428.  * Description:
  1429.  * o Do a software reset.
  1430.  * o Clear all reset bits.
  1431.  * o Verify that the detected hardware is present.
  1432.  *   Return an error if not.
  1433.  * o Get the hardware configuration
  1434.  * + Read the number of MACs/Ports.
  1435.  * + Read the RAM size.
  1436.  * + Read the PCI Revision ID.
  1437.  * + Find out the adapters host clock speed
  1438.  * + Read and check the PHY type
  1439.  *
  1440.  * Returns:
  1441.  * 0: success
  1442.  * 5: Unexpected PHY type detected
  1443.  */
  1444. static int SkGeInit1(
  1445. SK_AC *pAC, /* adapter context */
  1446. SK_IOC IoC) /* IO context */
  1447. {
  1448. SK_U8 Byte;
  1449. SK_U16 Word;
  1450. int RetVal;
  1451. int i;
  1452. RetVal = 0;
  1453. #ifdef SK_PCI_RESET
  1454. (void)SkGePciReset(pAC, IoC);
  1455. #endif /* SK_PCI_RESET */
  1456. /* Do the reset */
  1457. SK_OUT8(IoC, B0_CTST, CS_RST_SET);
  1458. /* Release the reset */
  1459. SK_OUT8(IoC, B0_CTST, CS_RST_CLR);
  1460. /* Reset all error bits in the PCI STATUS register */
  1461. /*
  1462.  * Note: Cfg cycles cannot be used, because they are not
  1463.  *  available on some platforms after 'boot time'.
  1464.  */
  1465. SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON);
  1466. SK_IN16(IoC, PCI_C(PCI_STATUS), &Word);
  1467. SK_OUT16(IoC, PCI_C(PCI_STATUS), Word | PCI_ERRBITS);
  1468. SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
  1469. /* Release Master_Reset */
  1470. SK_OUT8(IoC, B0_CTST, CS_MRST_CLR);
  1471. /* Read number of MACs */
  1472. SK_IN8(IoC, B2_MAC_CFG, &Byte);
  1473. if (Byte & CFG_SNG_MAC) {
  1474. pAC->GIni.GIMacsFound = 1;
  1475. }
  1476. else {
  1477. pAC->GIni.GIMacsFound = 2;
  1478. }
  1479. SK_IN8(IoC, PCI_C(PCI_REV_ID), &Byte);
  1480. pAC->GIni.GIPciHwRev = (int) Byte;
  1481. /* Read the adapters RAM size */
  1482. SK_IN8(IoC, B2_E_0, &Byte);
  1483. if (Byte == 3) {
  1484. pAC->GIni.GIRamSize = (int)(Byte-1) * 512;
  1485. pAC->GIni.GIRamOffs = (SK_U32)512 * 1024;
  1486. }
  1487. else {
  1488. pAC->GIni.GIRamSize = (int)Byte * 512;
  1489. pAC->GIni.GIRamOffs = 0;
  1490. }
  1491. /* All known GE Adapters works with 53.125 MHz host clock */
  1492. pAC->GIni.GIHstClkFact = SK_FACT_53;
  1493. pAC->GIni.GIPollTimerVal =
  1494. SK_DPOLL_DEF * (SK_U32)pAC->GIni.GIHstClkFact / 100;
  1495. /* Read the PHY type */
  1496. SK_IN8(IoC, B2_E_1, &Byte);
  1497. Byte &= 0x0f; /* the PHY type is stored in the lower nibble */
  1498. for (i=0; i<pAC->GIni.GIMacsFound; i++) {
  1499. pAC->GIni.GP[i].PhyType = Byte;
  1500. switch (Byte) {
  1501. case SK_PHY_XMAC:
  1502. pAC->GIni.GP[i].PhyAddr = PHY_ADDR_XMAC;
  1503. break;
  1504. case SK_PHY_BCOM:
  1505. pAC->GIni.GP[i].PhyAddr = PHY_ADDR_BCOM;
  1506. break;
  1507. case SK_PHY_LONE:
  1508. pAC->GIni.GP[i].PhyAddr = PHY_ADDR_LONE;
  1509. break;
  1510. case SK_PHY_NAT:
  1511. pAC->GIni.GP[i].PhyAddr = PHY_ADDR_NAT;
  1512. break;
  1513. default:
  1514. /* ERROR: unexpected PHY typ detected */
  1515. RetVal = 5;
  1516. break;
  1517. }
  1518. }
  1519. SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
  1520. ("PHY type: %d  PHY addr: %xn", pAC->GIni.GP[i].PhyType,
  1521. pAC->GIni.GP[i].PhyAddr));
  1522. return (RetVal);
  1523. } /* SkGeInit1*/
  1524. /******************************************************************************
  1525.  *
  1526.  * SkGeInit2() - Level 2 Initialization
  1527.  *
  1528.  * Description:
  1529.  * - start the Blink Source Counter
  1530.  * - start the Descriptor Poll Timer
  1531.  * - configure the MAC-Arbiter
  1532.  * - configure the Packet-Arbiter
  1533.  * - enable the Tx Arbiters
  1534.  * - enable the RAM Interface Arbiter
  1535.  *
  1536.  * Returns:
  1537.  * nothing
  1538.  */
  1539. static void SkGeInit2(
  1540. SK_AC *pAC, /* adapter context */
  1541. SK_IOC IoC) /* IO context */
  1542. {
  1543. SK_GEPORT *pPrt;
  1544. SK_U32 DWord;
  1545. int i;
  1546. /* start the Blink Source Counter */
  1547. DWord = SK_BLK_DUR * (SK_U32)pAC->GIni.GIHstClkFact / 100;
  1548. SK_OUT32(IoC, B2_BSC_INI, DWord);
  1549. SK_OUT8(IoC, B2_BSC_CTRL, BSC_START);
  1550. /* start the Descriptor Poll Timer */
  1551. if (pAC->GIni.GIPollTimerVal != 0) {
  1552. if (pAC->GIni.GIPollTimerVal > SK_DPOLL_MAX) {
  1553. pAC->GIni.GIPollTimerVal = SK_DPOLL_MAX;
  1554. /* Create an Error Log Entry */
  1555. SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E017, SKERR_HWI_E017MSG);
  1556. }
  1557. SK_OUT32(IoC, B28_DPT_INI, pAC->GIni.GIPollTimerVal);
  1558. SK_OUT8(IoC, B28_DPT_CTRL, DPT_START);
  1559. }
  1560. /*
  1561.  * Configure
  1562.  * - the MAC-Arbiter and
  1563.  * - the Paket Arbiter
  1564.  *
  1565.  * The MAC and the packet arbiter will be started once
  1566.  * and never be stopped.
  1567.  */
  1568. SkGeInitMacArb(pAC, IoC);
  1569. SkGeInitPktArb(pAC, IoC);
  1570. /* enable the Tx Arbiters */
  1571. SK_OUT8(IoC, MR_ADDR(MAC_1, TXA_CTRL), TXA_ENA_ARB);
  1572. if (pAC->GIni.GIMacsFound > 1) {
  1573. SK_OUT8(IoC, MR_ADDR(MAC_2, TXA_CTRL), TXA_ENA_ARB);
  1574. }
  1575. /* enable the RAM Interface Arbiter */
  1576. SkGeInitRamIface(pAC, IoC);
  1577. for (i = 0; i < SK_MAX_MACS; i++) {
  1578. pPrt = &pAC->GIni.GP[i];
  1579. if (pAC->GIni.GIPortUsage == SK_JUMBO_LINK) {
  1580. pPrt->PRxCmd |= XM_RX_BIG_PK_OK;
  1581. }
  1582. if (pPrt->PLinkModeConf == SK_LMODE_HALF) {
  1583. /*
  1584.  * If in manual half duplex mode
  1585.  * the other side might be in full duplex mode
  1586.  * so ignore if a carrier extension is not seen on
  1587.  * frames received
  1588.  */
  1589. pPrt->PRxCmd |= XM_RX_DIS_CEXT;
  1590. }
  1591. }
  1592. } /* SkGeInit2 */
  1593. /******************************************************************************
  1594.  *
  1595.  * SkGeInit() - Initialize the GE Adapter with the specified level.
  1596.  *
  1597.  * Description:
  1598.  * Level 0: Initialize the Module structures.
  1599.  * Level 1: Generic Hardware Initialization. The
  1600.  * IOP/MemBase pointer has to be set before
  1601.  * calling this level.
  1602.  *
  1603.  * o Do a software reset.
  1604.  * o Clear all reset bits.
  1605.  * o Verify that the detected hardware is present.
  1606.  *   Return an error if not.
  1607.  * o Get the hardware configuration
  1608.  * + Set GIMacsFound with the number of MACs.
  1609.  * + Store the RAM size in GIRamSize.
  1610.  * + Save the PCI Revision ID in GIPciHwRev.
  1611.  * o return an error
  1612.  * if Number of MACs > SK_MAX_MACS
  1613.  *
  1614.  * After returning from Level 0 the adapter
  1615.  * may be accessed with IO operations.
  1616.  *
  1617.  * Level 2: start the Blink Source Counter
  1618.  *
  1619.  * Returns:
  1620.  * 0: success
  1621.  * 1: Number of MACs exceeds SK_MAX_MACS ( after level 1)
  1622.  * 2: Adapter not present or not accessable
  1623.  * 3: Illegal initialization level
  1624.  * 4: Initialization Level 1 Call missing
  1625.  * 5: Unexpected PHY type detected
  1626.  */
  1627. int SkGeInit(
  1628. SK_AC *pAC, /* adapter context */
  1629. SK_IOC IoC, /* IO context */
  1630. int Level) /* initialization level */
  1631. {
  1632. int RetVal; /* return value */
  1633. SK_U32 DWord;
  1634. RetVal = 0;
  1635. SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
  1636. ("SkGeInit(Level %d)n", Level));
  1637. switch (Level) {
  1638. case SK_INIT_DATA:
  1639. /* Initialization Level 0 */
  1640. SkGeInit0(pAC, IoC);
  1641. pAC->GIni.GILevel = SK_INIT_DATA;
  1642. break;
  1643. case SK_INIT_IO:
  1644. /* Initialization Level 1 */
  1645. RetVal = SkGeInit1(pAC, IoC);
  1646. /* Check if the adapter seems to be accessable */
  1647. SK_OUT32(IoC, B2_IRQM_INI, 0x11335577L);
  1648. SK_IN32(IoC, B2_IRQM_INI, &DWord);
  1649. SK_OUT32(IoC, B2_IRQM_INI, 0x00000000L);
  1650. if (DWord != 0x11335577L) {
  1651. RetVal = 2;
  1652. break;
  1653. }
  1654. /* Check if the number of GIMacsFound matches SK_MAX_MACS */
  1655. if (pAC->GIni.GIMacsFound > SK_MAX_MACS) {
  1656. RetVal = 1;
  1657. break;
  1658. }
  1659. /* Level 1 successfully passed */
  1660. pAC->GIni.GILevel = SK_INIT_IO;
  1661. break;
  1662. case SK_INIT_RUN:
  1663. /* Initialization Level 2 */
  1664. if (pAC->GIni.GILevel != SK_INIT_IO) {
  1665. #ifndef SK_DIAG
  1666. SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E002, SKERR_HWI_E002MSG);
  1667. #endif
  1668. RetVal = 4;
  1669. break;
  1670. }
  1671. SkGeInit2(pAC, IoC);
  1672. /* Level 2 successfully passed */
  1673. pAC->GIni.GILevel = SK_INIT_RUN;
  1674. break;
  1675. default:
  1676. /* Create an Error Log Entry */
  1677. SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E003, SKERR_HWI_E003MSG);
  1678. RetVal = 3;
  1679. break;
  1680. }
  1681. return (RetVal);
  1682. } /* SkGeInit*/
  1683. /******************************************************************************
  1684.  *
  1685.  * SkGeDeInit() - Deinitialize the adapter.
  1686.  *
  1687.  * Description:
  1688.  * All ports of the adapter will be stopped if not already done.
  1689.  * Do a software reset and switch off all LEDs.
  1690.  *
  1691.  * Returns:
  1692.  * nothing
  1693.  */
  1694. void SkGeDeInit(
  1695. SK_AC *pAC, /* adapter context */
  1696. SK_IOC IoC) /* IO context */
  1697. {
  1698. int i;
  1699. SK_U16 Word;
  1700. /* Ensure I2C is ready. */
  1701. SkI2cWaitIrq(pAC, IoC);
  1702. /* Stop all current transfer activity */
  1703. for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
  1704. if (pAC->GIni.GP[i].PState != SK_PRT_STOP &&
  1705. pAC->GIni.GP[i].PState != SK_PRT_RESET) {
  1706. SkGeStopPort(pAC, IoC, i, SK_STOP_ALL, SK_HARD_RST);
  1707. }
  1708. }
  1709. /* Reset all bits in the PCI STATUS register */
  1710. /*
  1711.  * Note: Cfg cycles cannot be used, because they are not
  1712.  *  available on some platforms after 'boot time'.
  1713.  */
  1714. SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON);
  1715. SK_IN16(IoC, PCI_C(PCI_STATUS), &Word);
  1716. SK_OUT16(IoC, PCI_C(PCI_STATUS), Word | PCI_ERRBITS);
  1717. SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
  1718. /* Do the reset, all LEDs are switched off now */
  1719. SK_OUT8(IoC, B0_CTST, CS_RST_SET);
  1720. } /* SkGeDeInit*/
  1721. /******************************************************************************
  1722.  *
  1723.  * SkGeInitPort() Initialize the specified prot.
  1724.  *
  1725.  * Description:
  1726.  * PRxQSize, PXSQSize, and PXAQSize has to be
  1727.  * configured for the specified port before calling this
  1728.  * function. The descriptor rings has to be initialized, too.
  1729.  *
  1730.  * o (Re)configure queues of the specified port.
  1731.  * o configure the XMAC of the specified port.
  1732.  * o put ASIC and XMAC(s) in operational mode.
  1733.  * o initialize Rx/Tx and Sync LED
  1734.  * o initialize RAM Buffers and MAC FIFOs
  1735.  *
  1736.  * The port is ready to connect when returning.
  1737.  *
  1738.  * Note:
  1739.  * The XMACs Rx and Tx state machine is still disabled when
  1740.  * returning.
  1741.  *
  1742.  * Returns:
  1743.  * 0: success
  1744.  * 1: Queue size initialization error. The configured values
  1745.  * for PRxQSize, PXSQSize, or PXAQSize are invalid for one
  1746.  * or more queues. The specified port was NOT initialized.
  1747.  * An error log entry was generated.
  1748.  * 2: The port has to be stopped before it can be initialized again.
  1749.  */
  1750. int SkGeInitPort(
  1751. SK_AC *pAC, /* adapter context */
  1752. SK_IOC IoC, /* IO context */
  1753. int Port) /* Port to configure */
  1754. {
  1755. SK_GEPORT *pPrt;
  1756. pPrt = &pAC->GIni.GP[Port];
  1757. if (SkGeCheckQSize(pAC, Port) != 0) {
  1758. SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E004, SKERR_HWI_E004MSG);
  1759. return (1);
  1760. }
  1761. if (pPrt->PState == SK_PRT_INIT || pPrt->PState == SK_PRT_RUN) {
  1762. SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E005, SKERR_HWI_E005MSG);
  1763. return (2);
  1764. }
  1765. /* Configuration ok, initialize the Port now */
  1766. /* Initialize Rx, Tx and Link LED */
  1767. /*
  1768.  * If 1000BT Phy needs LED initialization than swap
  1769.  * LED and XMAC initialization order
  1770.  */
  1771.   SkGeXmitLED(pAC, IoC, MR_ADDR(Port, TX_LED_INI), SK_LED_ENA);
  1772.   SkGeXmitLED(pAC, IoC, MR_ADDR(Port, RX_LED_INI), SK_LED_ENA);
  1773. /* The Link LED is initialized by RLMT or Diagnostics itself */ 
  1774. /* Do NOT initialize the Link Sync Counter */
  1775. /*
  1776.  * Configure
  1777.  * - XMAC
  1778.  * - MAC FIFOs
  1779.  * - RAM Buffers
  1780.  * - enable Force Sync bit if synchronous queue available
  1781.  * - BMUs
  1782.  */
  1783. SkXmInitMac(pAC, IoC, Port);
  1784. SkGeInitMacFifo(pAC, IoC, Port);
  1785. SkGeInitRamBufs(pAC, IoC, Port);
  1786. if (pPrt->PXSQSize != 0) {
  1787. SK_OUT8(IoC, MR_ADDR(Port, TXA_CTRL), TXA_ENA_FSYNC);
  1788. }
  1789. SkGeInitBmu(pAC, IoC, Port);
  1790. /* Mark port as initialized. */
  1791. pPrt->PState = SK_PRT_INIT;
  1792. pAC->GIni.GIAnyPortAct = SK_TRUE;
  1793. return (0);
  1794. } /* SkGeInitPort */