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

嵌入式Linux

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  *
  3.  * (C)Copyright 1998,1999 SysKonnect,
  4.  * a business unit of Schneider & Koch & Co. Datensysteme GmbH.
  5.  *
  6.  * See the file "skfddi.c" for further information.
  7.  *
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License as published by
  10.  * the Free Software Foundation; either version 2 of the License, or
  11.  * (at your option) any later version.
  12.  *
  13.  * The information in this file is provided "AS IS" without warranty.
  14.  *
  15.  ******************************************************************************/
  16. /*
  17.  * FBI board dependent Driver for SMT and LLC
  18.  */
  19. #include "h/types.h"
  20. #include "h/fddi.h"
  21. #include "h/smc.h"
  22. #include "h/supern_2.h"
  23. #include "h/skfbiinc.h"
  24. #ifndef lint
  25. static const char ID_sccs[] = "@(#)drvfbi.c 1.63 99/02/11 (C) SK " ;
  26. #endif
  27. /*
  28.  * PCM active state
  29.  */
  30. #define PC8_ACTIVE 8
  31. #define LED_Y_ON 0x11 /* Used for ring up/down indication */
  32. #define LED_Y_OFF 0x10
  33. #define MS2BCLK(x) ((x)*12500L)
  34. /*
  35.  * valid configuration values are:
  36.  */
  37. #ifdef ISA
  38. const int opt_ints[] = {8, 3, 4, 5, 9, 10, 11, 12, 15} ;
  39. const int opt_iops[] = {8,
  40. 0x100, 0x120, 0x180, 0x1a0, 0x220, 0x240, 0x320, 0x340};
  41. const int opt_dmas[] = {4, 3, 5, 6, 7} ;
  42. const int opt_eproms[] = {15, 0xc0, 0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce,
  43. 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc} ;
  44. #endif
  45. #ifdef EISA
  46. const int opt_ints[] = {5, 9, 10, 11} ;
  47. const int opt_dmas[] = {0, 5, 6, 7} ;
  48. const int opt_eproms[] = {0xc0, 0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce,
  49. 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc} ;
  50. #endif
  51. #ifdef MCA
  52. int opt_ints[] = {3, 11, 10, 9} ; /* FM1 */
  53. int opt_eproms[] = {0, 0xc4, 0xc8, 0xcc, 0xd0, 0xd4, 0xd8, 0xdc} ;
  54. #endif /* MCA */
  55. /*
  56.  * xPOS_ID:xxxx
  57.  * |   /
  58.  * |  /
  59.  * |   --------------------- the patched POS_ID of the Adapter
  60.  * | xxxx = (Vendor ID low byte,
  61.  * | Vendor ID high byte,
  62.  * | Device ID low byte,
  63.  * | Device ID high byte)
  64.  * +------------------------------ the patched oem_id must be
  65.  * 'S' for SK or 'I' for IBM
  66.  * this is a short id for the driver.
  67.  */
  68. #ifndef MULT_OEM
  69. #ifndef OEM_CONCEPT
  70. #ifndef MCA
  71. const u_char oem_id[] = "xPOS_ID:xxxx" ;
  72. #else
  73. const u_char oem_id[] = "xPOSID1:xxxx" ; /* FM1 card id. */
  74. #endif
  75. #else /* OEM_CONCEPT */
  76. #ifndef MCA
  77. const u_char oem_id[] = OEM_ID ;
  78. #else
  79. const u_char oem_id[] = OEM_ID1 ; /* FM1 card id. */
  80. #endif /* MCA */
  81. #endif /* OEM_CONCEPT */
  82. #define ID_BYTE0 8
  83. #define OEMID(smc,i) oem_id[ID_BYTE0 + i]
  84. #else /* MULT_OEM */
  85. const struct s_oem_ids oem_ids[] = {
  86. #include "oemids.h"
  87. {0}
  88. };
  89. #define OEMID(smc,i) smc->hw.oem_id->oi_id[i]
  90. #endif /* MULT_OEM */
  91. /* Prototypes of external functions */
  92. extern void hwt_restart() ;
  93. #ifdef AIX
  94. extern int AIX_vpdReadByte() ;
  95. #endif
  96. /* Prototypes of local functions. */
  97. void smt_stop_watchdog() ;
  98. #ifdef MCA
  99. static int read_card_id() ;
  100. static void DisableSlotAccess() ;
  101. static void EnableSlotAccess() ;
  102. #ifdef AIX
  103. extern int attach_POS_addr() ;
  104. extern int detach_POS_addr() ;
  105. extern u_char read_POS() ;
  106. extern void write_POS() ;
  107. extern int AIX_vpdReadByte() ;
  108. #else
  109. #define read_POS(smc,a1,a2) ((u_char) inp(a1))
  110. #define write_POS(smc,a1,a2,a3) outp((a1),(a3))
  111. #endif
  112. #endif /* MCA */
  113. /*
  114.  * FDDI card reset
  115.  */
  116. static void card_start(smc)
  117. struct s_smc *smc ;
  118. {
  119. int i ;
  120. #ifdef PCI
  121. u_char rev_id ;
  122. u_short word;
  123. #endif
  124. smt_stop_watchdog(smc) ;
  125. #ifdef ISA
  126. outpw(CSR_A,0) ; /* reset for all chips */
  127. for (i = 10 ; i ; i--) /* delay for PLC's */
  128. (void)inpw(ISR_A) ;
  129. OUT_82c54_TIMER(3,COUNT(2) | RW_OP(3) | TMODE(2)) ;
  130. /* counter 2, mode 2 */
  131. OUT_82c54_TIMER(2,97) ; /* LSB */
  132. OUT_82c54_TIMER(2,0) ; /* MSB ( 15.6 us ) */
  133. outpw(CSR_A,CS_CRESET) ;
  134. #endif
  135. #ifdef EISA
  136. outpw(CSR_A,0) ; /* reset for all chips */
  137. for (i = 10 ; i ; i--) /* delay for PLC's */
  138. (void)inpw(ISR_A) ;
  139. outpw(CSR_A,CS_CRESET) ;
  140. smc->hw.led = (2<<6) ;
  141. outpw(CSR_A,CS_CRESET | smc->hw.led) ;
  142. #endif
  143. #ifdef MCA
  144. outp(ADDR(CARD_DIS),0) ; /* reset for all chips */
  145. for (i = 10 ; i ; i--) /* delay for PLC's */
  146. (void)inpw(ISR_A) ;
  147. outp(ADDR(CARD_EN),0) ;
  148. /* first I/O after reset must not be a access to FORMAC or PLC */
  149. /*
  150.  * bus timeout (MCA)
  151.  */
  152. OUT_82c54_TIMER(3,COUNT(2) | RW_OP(3) | TMODE(3)) ;
  153. /* counter 2, mode 3 */
  154. OUT_82c54_TIMER(2,(2*24)) ; /* 3.9 us * 2 square wave */
  155. OUT_82c54_TIMER(2,0) ; /* MSB */
  156. /* POS 102 indicated an activ Check Line or Buss Error monitoring */
  157. if (inpw(CSA_A) & (POS_EN_CHKINT | POS_EN_BUS_ERR)) {
  158. outp(ADDR(IRQ_CHCK_EN),0) ;
  159. }
  160. if (!((i = inpw(CSR_A)) & CS_SAS)) {
  161. if (!(i & CS_BYSTAT)) {
  162. outp(ADDR(BYPASS(STAT_INS)),0) ;/* insert station */
  163. }
  164. }
  165. outpw(LEDR_A,LED_1) ; /* yellow */
  166. #endif /* MCA */
  167. #ifdef PCI
  168. /*
  169.  * make sure no transfer activity is pending
  170.  */
  171. outpw(FM_A(FM_MDREG1),FM_MINIT) ;
  172. outp(ADDR(B0_CTRL), CTRL_HPI_SET) ;
  173. hwt_wait_time(smc,hwt_quick_read(smc),MS2BCLK(10)) ;
  174. /*
  175.  * now reset everything
  176.  */
  177. outp(ADDR(B0_CTRL),CTRL_RST_SET) ; /* reset for all chips */
  178. i = (int) inp(ADDR(B0_CTRL)) ; /* do dummy read */
  179. SK_UNUSED(i) ; /* Make LINT happy. */
  180. outp(ADDR(B0_CTRL), CTRL_RST_CLR) ;
  181. /*
  182.  * Reset all bits in the PCI STATUS register
  183.  */
  184. outp(ADDR(B0_TST_CTRL), TST_CFG_WRITE_ON) ; /* enable for writes */
  185. word = inpw(PCI_C(PCI_STATUS)) ;
  186. outpw(PCI_C(PCI_STATUS), word | PCI_ERRBITS) ;
  187. outp(ADDR(B0_TST_CTRL), TST_CFG_WRITE_OFF) ; /* disable writes */
  188. /*
  189.  * Release the reset of all the State machines
  190.  * Release Master_Reset
  191.  * Release HPI_SM_Reset
  192.  */
  193. outp(ADDR(B0_CTRL), CTRL_MRST_CLR|CTRL_HPI_CLR) ;
  194. /*
  195.  * determine the adapter type
  196.  * Note: Do it here, because some drivers may call card_start() once
  197.  *  at very first before any other initialization functions is
  198.  *  executed.
  199.  */
  200. rev_id = inp(PCI_C(PCI_REV_ID)) ;
  201. if ((rev_id & 0xf0) == SK_ML_ID_1 || (rev_id & 0xf0) == SK_ML_ID_2) {
  202. smc->hw.hw_is_64bit = TRUE ;
  203. } else {
  204. smc->hw.hw_is_64bit = FALSE ;
  205. }
  206. /*
  207.  * Watermark initialization
  208.  */
  209. if (!smc->hw.hw_is_64bit) {
  210. outpd(ADDR(B4_R1_F), RX_WATERMARK) ;
  211. outpd(ADDR(B5_XA_F), TX_WATERMARK) ;
  212. outpd(ADDR(B5_XS_F), TX_WATERMARK) ;
  213. }
  214. outp(ADDR(B0_CTRL),CTRL_RST_CLR) ; /* clear the reset chips */
  215. outp(ADDR(B0_LED),LED_GA_OFF|LED_MY_ON|LED_GB_OFF) ; /* ye LED on */
  216. /* init the timer value for the watch dog 2,5 minutes */
  217. outpd(ADDR(B2_WDOG_INI),0x6FC23AC0) ;
  218. /* initialize the ISR mask */
  219. smc->hw.is_imask = ISR_MASK ;
  220. smc->hw.hw_state = STOPPED ;
  221. #endif
  222. GET_PAGE(0) ; /* necessary for BOOT */
  223. }
  224. void card_stop(smc)
  225. struct s_smc *smc ;
  226. {
  227. smt_stop_watchdog(smc) ;
  228. smc->hw.mac_ring_is_up = 0 ; /* ring down */
  229. #ifdef ISA
  230. outpw(CSR_A,0) ; /* reset for all chips */
  231. #endif
  232. #ifdef EISA
  233. outpw(CSR_A,0) ; /* reset for all chips */
  234. #endif
  235. #ifdef MCA
  236. outp(ADDR(CARD_DIS),0) ; /* reset for all chips */
  237. #endif
  238. #ifdef PCI
  239. /*
  240.  * make sure no transfer activity is pending
  241.  */
  242. outpw(FM_A(FM_MDREG1),FM_MINIT) ;
  243. outp(ADDR(B0_CTRL), CTRL_HPI_SET) ;
  244. hwt_wait_time(smc,hwt_quick_read(smc),MS2BCLK(10)) ;
  245. /*
  246.  * now reset everything
  247.  */
  248. outp(ADDR(B0_CTRL),CTRL_RST_SET) ; /* reset for all chips */
  249. outp(ADDR(B0_CTRL),CTRL_RST_CLR) ; /* reset for all chips */
  250. outp(ADDR(B0_LED),LED_GA_OFF|LED_MY_OFF|LED_GB_OFF) ; /* all LEDs off */
  251. smc->hw.hw_state = STOPPED ;
  252. #endif
  253. }
  254. /*--------------------------- ISR handling ----------------------------------*/
  255. #ifndef PCI
  256. void mac1_irq(smc,stu, stl)
  257. struct s_smc *smc ;
  258. u_short stu;
  259. u_short stl;
  260. {
  261. int restart_tx = 0 ;
  262. again:
  263. #ifndef ISA
  264. /*
  265.  * FORMAC+ bug modified the queue pointer if many read/write accesses happens!?
  266.  */
  267. if (stl & (FM_SPCEPDS  | /* parit/coding err. syn.q.*/
  268.    FM_SPCEPDA0 | /* parit/coding err. a.q.0 */
  269.    FM_SPCEPDA1 | /* parit/coding err. a.q.1 */
  270.    FM_SPCEPDA2)) { /* parit/coding err. a.q.2 */
  271. SMT_PANIC(smc,SMT_E0132, SMT_E0132_MSG) ;
  272. }
  273. if (stl & (FM_STBURS  | /* tx buffer underrun syn.q.*/
  274.    FM_STBURA0 | /* tx buffer underrun a.q.0 */
  275.    FM_STBURA1 | /* tx buffer underrun a.q.1 */
  276.    FM_STBURA2)) { /* tx buffer underrun a.q.2 */
  277. SMT_PANIC(smc,SMT_E0133, SMT_E0133_MSG) ;
  278. }
  279. #endif
  280. if ( (stu & (FM_SXMTABT | /* transmit abort */
  281. #ifdef SYNC
  282.      FM_STXABRS | /* syn. tx abort */
  283. #endif /* SYNC */
  284.      FM_STXABRA0)) || /* asyn. tx abort */
  285.      (stl & (FM_SQLCKS | /* lock for syn. q. */
  286.      FM_SQLCKA0)) ) { /* lock for asyn. q. */
  287. formac_tx_restart(smc) ; /* init tx */
  288. restart_tx = 1 ;
  289. stu = inpw(FM_A(FM_ST1U)) ;
  290. stl = inpw(FM_A(FM_ST1L)) ;
  291. stu &= ~ (FM_STECFRMA0 | FM_STEFRMA0 | FM_STEFRMS) ;
  292. if (stu || stl)
  293. goto again ;
  294. }
  295. #ifndef SYNC
  296. if (stu & (FM_STECFRMA0 | /* end of chain asyn tx */
  297.    FM_STEFRMA0)) { /* end of frame asyn tx */
  298. /* free tx_queue */
  299. smc->hw.n_a_send = 0 ;
  300. if (++smc->hw.fp.tx_free < smc->hw.fp.tx_max) {
  301. start_next_send(smc);
  302. }
  303. restart_tx = 1 ;
  304. }
  305. #else /* SYNC */
  306. if (stu & (FM_STEFRMA0 | /* end of asyn tx */
  307.     FM_STEFRMS)) { /* end of sync tx */
  308. restart_tx = 1 ;
  309. }
  310. #endif /* SYNC */
  311. if (restart_tx)
  312. llc_restart_tx(smc) ;
  313. }
  314. #else /* PCI */
  315. void mac1_irq(smc,stu, stl)
  316. struct s_smc *smc ;
  317. u_short stu;
  318. u_short stl;
  319. {
  320. int restart_tx = 0 ;
  321. again:
  322. /*
  323.  * parity error: note encoding error is not possible in tag mode
  324.  */
  325. if (stl & (FM_SPCEPDS  | /* parity err. syn.q.*/
  326.    FM_SPCEPDA0 | /* parity err. a.q.0 */
  327.    FM_SPCEPDA1)) { /* parity err. a.q.1 */
  328. SMT_PANIC(smc,SMT_E0134, SMT_E0134_MSG) ;
  329. }
  330. /*
  331.  * buffer underrun: can only occur if a tx threshold is specified
  332.  */
  333. if (stl & (FM_STBURS  | /* tx buffer underrun syn.q.*/
  334.    FM_STBURA0 | /* tx buffer underrun a.q.0 */
  335.    FM_STBURA1)) { /* tx buffer underrun a.q.2 */
  336. SMT_PANIC(smc,SMT_E0133, SMT_E0133_MSG) ;
  337. }
  338. if ( (stu & (FM_SXMTABT | /* transmit abort */
  339.      FM_STXABRS | /* syn. tx abort */
  340.      FM_STXABRA0)) || /* asyn. tx abort */
  341.      (stl & (FM_SQLCKS | /* lock for syn. q. */
  342.      FM_SQLCKA0)) ) { /* lock for asyn. q. */
  343. formac_tx_restart(smc) ; /* init tx */
  344. restart_tx = 1 ;
  345. stu = inpw(FM_A(FM_ST1U)) ;
  346. stl = inpw(FM_A(FM_ST1L)) ;
  347. stu &= ~ (FM_STECFRMA0 | FM_STEFRMA0 | FM_STEFRMS) ;
  348. if (stu || stl)
  349. goto again ;
  350. }
  351. if (stu & (FM_STEFRMA0 | /* end of asyn tx */
  352.     FM_STEFRMS)) { /* end of sync tx */
  353. restart_tx = 1 ;
  354. }
  355. if (restart_tx)
  356. llc_restart_tx(smc) ;
  357. }
  358. #endif /* PCI */
  359. /*
  360.  * interrupt source= plc1
  361.  * this function is called in nwfbisr.asm
  362.  */
  363. void plc1_irq(smc)
  364. struct s_smc *smc ;
  365. {
  366. u_short st = inpw(PLC(PB,PL_INTR_EVENT)) ;
  367. #if (defined(ISA) || defined(EISA))
  368. /* reset PLC Int. bits */
  369. outpw(PLC1_I,inpw(PLC1_I)) ;
  370. #endif
  371. plc_irq(smc,PB,st) ;
  372. }
  373. /*
  374.  * interrupt source= plc2
  375.  * this function is called in nwfbisr.asm
  376.  */
  377. void plc2_irq(smc)
  378. struct s_smc *smc ;
  379. {
  380. u_short st = inpw(PLC(PA,PL_INTR_EVENT)) ;
  381. #if (defined(ISA) || defined(EISA))
  382. /* reset PLC Int. bits */
  383. outpw(PLC2_I,inpw(PLC2_I)) ;
  384. #endif
  385. plc_irq(smc,PA,st) ;
  386. }
  387. /*
  388.  * interrupt source= timer
  389.  */
  390. void timer_irq(smc)
  391. struct s_smc *smc ;
  392. {
  393. hwt_restart(smc);
  394. smc->hw.t_stop = smc->hw.t_start;
  395. smt_timer_done(smc) ;
  396. }
  397. /*
  398.  * return S-port (PA or PB)
  399.  */
  400. int pcm_get_s_port(smc)
  401. struct s_smc *smc ;
  402. {
  403. SK_UNUSED(smc) ;
  404. return(PS) ;
  405. }
  406. /*
  407.  * Station Label = "FDDI-XYZ" where
  408.  *
  409.  * X = connector type
  410.  * Y = PMD type
  411.  * Z = port type
  412.  */
  413. #define STATION_LABEL_CONNECTOR_OFFSET 5
  414. #define STATION_LABEL_PMD_OFFSET 6
  415. #define STATION_LABEL_PORT_OFFSET 7
  416. void read_address(smc,mac_addr)
  417. struct s_smc *smc ;
  418. u_char *mac_addr ;
  419. {
  420. char ConnectorType ;
  421. char PmdType ;
  422. int i ;
  423. extern const u_char canonical[256] ;
  424. #if (defined(ISA) || defined(MCA))
  425. for (i = 0; i < 4 ;i++) { /* read mac address from board */
  426. smc->hw.fddi_phys_addr.a[i] =
  427. canonical[(inpw(PR_A(i+SA_MAC))&0xff)] ;
  428. }
  429. for (i = 4; i < 6; i++) {
  430. smc->hw.fddi_phys_addr.a[i] =
  431. canonical[(inpw(PR_A(i+SA_MAC+PRA_OFF))&0xff)] ;
  432. }
  433. #endif
  434. #ifdef EISA
  435. /*
  436.  * Note: We get trouble on an Alpha machine if we make a inpw()
  437.  * instead of inp()
  438.  */
  439. for (i = 0; i < 4 ;i++) { /* read mac address from board */
  440. smc->hw.fddi_phys_addr.a[i] =
  441. canonical[inp(PR_A(i+SA_MAC))] ;
  442. }
  443. for (i = 4; i < 6; i++) {
  444. smc->hw.fddi_phys_addr.a[i] =
  445. canonical[inp(PR_A(i+SA_MAC+PRA_OFF))] ;
  446. }
  447. #endif
  448. #ifdef PCI
  449. for (i = 0; i < 6; i++) { /* read mac address from board */
  450. smc->hw.fddi_phys_addr.a[i] =
  451. canonical[inp(ADDR(B2_MAC_0+i))] ;
  452. }
  453. #endif
  454. #ifndef PCI
  455. ConnectorType = inpw(PR_A(SA_PMD_TYPE)) & 0xff ;
  456. PmdType = inpw(PR_A(SA_PMD_TYPE+1)) & 0xff ;
  457. #else
  458. ConnectorType = inp(ADDR(B2_CONN_TYP)) ;
  459. PmdType = inp(ADDR(B2_PMD_TYP)) ;
  460. #endif
  461. smc->y[PA].pmd_type[PMD_SK_CONN] =
  462. smc->y[PB].pmd_type[PMD_SK_CONN] = ConnectorType ;
  463. smc->y[PA].pmd_type[PMD_SK_PMD ] =
  464. smc->y[PB].pmd_type[PMD_SK_PMD ] = PmdType ;
  465. if (mac_addr) {
  466. for (i = 0; i < 6 ;i++) {
  467. smc->hw.fddi_canon_addr.a[i] = mac_addr[i] ;
  468. smc->hw.fddi_home_addr.a[i] = canonical[mac_addr[i]] ;
  469. }
  470. return ;
  471. }
  472. smc->hw.fddi_home_addr = smc->hw.fddi_phys_addr ;
  473. for (i = 0; i < 6 ;i++) {
  474. smc->hw.fddi_canon_addr.a[i] =
  475. canonical[smc->hw.fddi_phys_addr.a[i]] ;
  476. }
  477. }
  478. /*
  479.  * FDDI card soft reset
  480.  */
  481. void init_board(smc,mac_addr)
  482. struct s_smc *smc ;
  483. u_char *mac_addr ;
  484. {
  485. card_start(smc) ;
  486. read_address(smc,mac_addr) ;
  487. #ifndef PCI
  488. if (inpw(CSR_A) & CS_SAS)
  489. #else
  490. if (!(inp(ADDR(B0_DAS)) & DAS_AVAIL))
  491. #endif
  492. smc->s.sas = SMT_SAS ; /* Single att. station */
  493. else
  494. smc->s.sas = SMT_DAS ; /* Dual att. station */
  495. #ifndef PCI
  496. if (inpw(CSR_A) & CS_BYSTAT)
  497. #else
  498. if (!(inp(ADDR(B0_DAS)) & DAS_BYP_ST))
  499. #endif
  500. smc->mib.fddiSMTBypassPresent = 0 ;
  501. /* without opt. bypass */
  502. else
  503. smc->mib.fddiSMTBypassPresent = 1 ;
  504. /* with opt. bypass */
  505. }
  506. /*
  507.  * insert or deinsert optical bypass (called by ECM)
  508.  */
  509. void sm_pm_bypass_req(smc,mode)
  510. struct s_smc *smc ;
  511. int mode;
  512. {
  513. #if (defined(ISA) || defined(EISA))
  514. int csra_v ;
  515. #endif
  516. DB_ECMN(1,"ECM : sm_pm_bypass_req(%s)n",(mode == BP_INSERT) ?
  517. "BP_INSERT" : "BP_DEINSERT",0) ;
  518. if (smc->s.sas != SMT_DAS)
  519. return ;
  520. #if (defined(ISA) || defined(EISA))
  521. csra_v = inpw(CSR_A) & ~CS_BYPASS ;
  522. #ifdef EISA
  523. csra_v |= smc->hw.led ;
  524. #endif
  525. switch(mode) {
  526. case BP_INSERT :
  527. outpw(CSR_A,csra_v | CS_BYPASS) ;
  528. break ;
  529. case BP_DEINSERT :
  530. outpw(CSR_A,csra_v) ;
  531. break ;
  532. }
  533. #endif /* ISA / EISA */
  534. #ifdef MCA
  535. switch(mode) {
  536. case BP_INSERT :
  537. outp(ADDR(BYPASS(STAT_INS)),0) ;/* insert station */
  538. break ;
  539. case BP_DEINSERT :
  540. outp(ADDR(BYPASS(STAT_BYP)),0) ; /* bypass station */
  541. break ;
  542. }
  543. #endif
  544. #ifdef PCI
  545. switch(mode) {
  546. case BP_INSERT :
  547. outp(ADDR(B0_DAS),DAS_BYP_INS) ; /* insert station */
  548. break ;
  549. case BP_DEINSERT :
  550. outp(ADDR(B0_DAS),DAS_BYP_RMV) ; /* bypass station */
  551. break ;
  552. }
  553. #endif
  554. }
  555. /*
  556.  * check if bypass connected
  557.  */
  558. int sm_pm_bypass_present(smc)
  559. struct s_smc *smc ;
  560. {
  561. #ifndef PCI
  562. return( (inpw(CSR_A) & CS_BYSTAT) ? FALSE : TRUE ) ;
  563. #else
  564. return( (inp(ADDR(B0_DAS)) & DAS_BYP_ST) ? TRUE: FALSE) ;
  565. #endif
  566. }
  567. void plc_clear_irq(smc,p)
  568. struct s_smc *smc ;
  569. int p ;
  570. {
  571. SK_UNUSED(p) ;
  572. #if (defined(ISA) || defined(EISA))
  573. switch (p) {
  574. case PA :
  575. /* reset PLC Int. bits */
  576. outpw(PLC2_I,inpw(PLC2_I)) ;
  577. break ;
  578. case PB :
  579. /* reset PLC Int. bits */
  580. outpw(PLC1_I,inpw(PLC1_I)) ;
  581. break ;
  582. }
  583. #else
  584. SK_UNUSED(smc) ;
  585. #endif
  586. }
  587. /*
  588.  * led_indication called by rmt_indication() and
  589.  * pcm_state_change()
  590.  *
  591.  * Input:
  592.  * smc: SMT context
  593.  * led_event:
  594.  * 0 Only switch green LEDs according to their respective PCM state
  595.  * LED_Y_OFF just switch yellow LED off
  596.  * LED_Y_ON just switch yello LED on
  597.  */
  598. void led_indication(smc,led_event)
  599. struct s_smc *smc ;
  600. int led_event;
  601. {
  602. /* use smc->hw.mac_ring_is_up == TRUE 
  603.  * as indication for Ring Operational
  604.  */
  605. u_short led_state ;
  606. struct s_phy *phy ;
  607. struct fddi_mib_p *mib_a ;
  608. struct fddi_mib_p *mib_b ;
  609. phy = &smc->y[PA] ;
  610. mib_a = phy->mib ;
  611. phy = &smc->y[PB] ;
  612. mib_b = phy->mib ;
  613. #ifdef EISA
  614. /* Ring up = yellow led OFF*/
  615. if (led_event == LED_Y_ON) {
  616. smc->hw.led |= CS_LED_1 ;
  617. }
  618. else if (led_event == LED_Y_OFF) {
  619. smc->hw.led &= ~CS_LED_1 ;
  620. }
  621. else {
  622. /* Link at Port A or B = green led ON */
  623. if (mib_a->fddiPORTPCMState == PC8_ACTIVE ||
  624.     mib_b->fddiPORTPCMState == PC8_ACTIVE) {
  625. smc->hw.led |= CS_LED_0 ;
  626. }
  627. else {
  628. smc->hw.led &= ~CS_LED_0 ;
  629. }
  630. }
  631. #endif
  632. #ifdef MCA
  633. led_state = inpw(LEDR_A) ;
  634. /* Ring up = yellow led OFF*/
  635. if (led_event == LED_Y_ON) {
  636. led_state |= LED_1 ;
  637. }
  638. else if (led_event == LED_Y_OFF) {
  639. led_state &= ~LED_1 ;
  640. }
  641. else {
  642.                 led_state &= ~(LED_2|LED_0) ;
  643. /* Link at Port A = green led A ON */
  644. if (mib_a->fddiPORTPCMState == PC8_ACTIVE) {
  645. led_state |= LED_2 ;
  646. }
  647. /* Link at Port B/S = green led B ON */
  648. if (mib_b->fddiPORTPCMState == PC8_ACTIVE) {
  649. led_state |= LED_0 ;
  650. }
  651. }
  652.         outpw(LEDR_A, led_state) ;
  653. #endif /* MCA */
  654. #ifdef PCI
  655.         led_state = 0 ;
  656. /* Ring up = yellow led OFF*/
  657. if (led_event == LED_Y_ON) {
  658. led_state |= LED_MY_ON ;
  659. }
  660. else if (led_event == LED_Y_OFF) {
  661. led_state |= LED_MY_OFF ;
  662. }
  663. else { /* PCM state changed */
  664. /* Link at Port A/S = green led A ON */
  665. if (mib_a->fddiPORTPCMState == PC8_ACTIVE) {
  666. led_state |= LED_GA_ON ;
  667. }
  668. else {
  669. led_state |= LED_GA_OFF ;
  670. }
  671. /* Link at Port B = green led B ON */
  672. if (mib_b->fddiPORTPCMState == PC8_ACTIVE) {
  673. led_state |= LED_GB_ON ;
  674. }
  675. else {
  676. led_state |= LED_GB_OFF ;
  677. }
  678. }
  679.         outp(ADDR(B0_LED), led_state) ;
  680. #endif /* PCI */
  681. }
  682. void pcm_state_change(smc,plc,p_state)
  683. struct s_smc *smc;
  684. int plc;
  685. int p_state;
  686. {
  687. /*
  688.  * the current implementation of pcm_state_change() in the driver
  689.  * parts must be renamed to drv_pcm_state_change() which will be called
  690.  * now after led_indication.
  691.  */
  692. DRV_PCM_STATE_CHANGE(smc,plc,p_state) ;
  693. led_indication(smc,0) ;
  694. }
  695. void rmt_indication(smc,i)
  696. struct s_smc *smc ;
  697. int i;
  698. {
  699. /* Call a driver special function if defined */
  700. DRV_RMT_INDICATION(smc,i) ;
  701.         led_indication(smc, i ? LED_Y_OFF : LED_Y_ON) ;
  702. }
  703. /*
  704.  * llc_recover_tx called by init_tx (fplus.c)
  705.  */
  706. void llc_recover_tx(smc)
  707. struct s_smc *smc ;
  708. {
  709. #ifdef LOAD_GEN
  710. extern int load_gen_flag ;
  711. load_gen_flag = 0 ;
  712. #endif
  713. #ifndef SYNC
  714. smc->hw.n_a_send= 0 ;
  715. #else
  716. SK_UNUSED(smc) ;
  717. #endif
  718. }
  719. /*--------------------------- DMA init ----------------------------*/
  720. #ifdef ISA
  721. /*
  722.  * init DMA
  723.  */
  724. void init_dma(smc,dma)
  725. struct s_smc *smc;
  726. int dma;
  727. {
  728. SK_UNUSED(smc) ;
  729. /*
  730.  * set cascade mode,
  731.  * clear mask bit (enable DMA cannal)
  732.  */
  733. if (dma > 3) {
  734. outp(0xd6,(dma & 0x03) | 0xc0) ;
  735. outp(0xd4, dma & 0x03) ;
  736. }
  737. else {
  738. outp(0x0b,(dma & 0x03) | 0xc0) ;
  739. outp(0x0a,dma & 0x03) ;
  740. }
  741. }
  742. /*
  743.  * disable DMA
  744.  */
  745. void dis_dma(smc,dma)
  746. struct s_smc *smc ;
  747. int dma;
  748. {
  749. SK_UNUSED(smc) ;
  750. /*
  751.  * set mask bit (disable DMA cannal)
  752.  */
  753. if (dma > 3) {
  754. outp(0xd4,(dma & 0x03) | 0x04) ;
  755. }
  756. else {
  757. outp(0x0a,(dma & 0x03) | 0x04) ;
  758. }
  759. }
  760. #endif /* ISA */
  761. #ifdef EISA
  762. /*arrays with io addresses of dma controller length and address registers*/
  763. static const int cntr[8] = { 0x001,0x003,0x005,0x007,0,0x0c6,0x0ca,0x0ce } ;
  764. static const int base[8] = { 0x000,0x002,0x004,0x006,0,0x0c4,0x0c8,0x0cc } ;
  765. static const int page[8] = { 0x087,0x083,0x081,0x082,0,0x08b,0x089,0x08a } ;
  766. void init_dma(smc,dma)
  767. struct s_smc *smc ;
  768. int dma;
  769. {
  770. /*
  771.  * extended mode register
  772.  * 32 bit IO
  773.  * type c
  774.  * TC output
  775.  * disable stop
  776.  */
  777. /* mode read (write) demand */
  778. smc->hw.dma_rmode = (dma & 3) | 0x08 | 0x0 ;
  779. smc->hw.dma_wmode = (dma & 3) | 0x04 | 0x0 ;
  780. /* 32 bit IO's, burst DMA mode (type "C") */
  781. smc->hw.dma_emode = (dma & 3) | 0x08 | 0x30 ;
  782. outp((dma < 4) ? 0x40b : 0x4d6,smc->hw.dma_emode) ;
  783. /* disable chaining */
  784. outp((dma < 4) ? 0x40a : 0x4d4,(dma&3)) ;
  785. /*load dma controller addresses for fast access during set dma*/
  786. smc->hw.dma_base_word_count = cntr[smc->hw.dma];
  787. smc->hw.dma_base_address = base[smc->hw.dma];
  788. smc->hw.dma_base_address_page = page[smc->hw.dma];
  789. }
  790. void dis_dma(smc,dma)
  791. struct s_smc *smc ;
  792. int dma;
  793. {
  794. SK_UNUSED(smc) ;
  795. outp((dma < 4) ? 0x0a : 0xd4,(dma&3)|4) ;/* mask bit */
  796. }
  797. #endif /* EISA */
  798. #ifdef MCA
  799. void init_dma(smc,dma)
  800. struct s_smc *smc;
  801. int dma;
  802. {
  803. SK_UNUSED(smc) ;
  804. SK_UNUSED(dma) ;
  805. }
  806. void dis_dma(smc,dma)
  807. struct s_smc *smc;
  808. int dma;
  809. {
  810. SK_UNUSED(smc) ;
  811. SK_UNUSED(dma) ;
  812. }
  813. #endif
  814. #ifdef PCI
  815. void init_dma(smc,dma)
  816. struct s_smc *smc;
  817. int dma;
  818. {
  819. SK_UNUSED(smc) ;
  820. SK_UNUSED(dma) ;
  821. }
  822. void dis_dma(smc,dma)
  823. struct s_smc *smc;
  824. int dma;
  825. {
  826. SK_UNUSED(smc) ;
  827. SK_UNUSED(dma) ;
  828. }
  829. #endif
  830. #ifdef MULT_OEM
  831. static int is_equal_num(comp1,comp2,num)
  832. char comp1[] ;
  833. char comp2[] ;
  834. int num ;
  835. {
  836. int i ;
  837. for (i = 0 ; i < num ; i++) {
  838. if (comp1[i] != comp2[i])
  839. return (0) ;
  840. }
  841. return (1) ;
  842. } /* is_equal_num */
  843. /*
  844.  * set the OEM ID defaults, and test the contents of the OEM data base
  845.  * The default OEM is the first ACTIVE entry in the OEM data base 
  846.  *
  847.  * returns: 0 success
  848.  * 1 error in data base
  849.  * 2 data base empty
  850.  * 3 no active entry
  851.  */
  852. int set_oi_id_def(smc)
  853. struct s_smc *smc ;
  854. {
  855. int sel_id ;
  856. int i ;
  857. int act_entries ;
  858. i = 0 ;
  859. sel_id = -1 ;
  860. act_entries = FALSE ;
  861. smc->hw.oem_id = 0 ;
  862. smc->hw.oem_min_status = OI_STAT_ACTIVE ;
  863. /* check OEM data base */
  864. while (oem_ids[i].oi_status) {
  865. switch (oem_ids[i].oi_status) {
  866. case OI_STAT_ACTIVE:
  867. act_entries = TRUE ; /* we have active IDs */
  868. if (sel_id == -1)
  869. sel_id = i ; /* save the first active ID */
  870. case OI_STAT_VALID:
  871. case OI_STAT_PRESENT:
  872. i++ ;
  873. break ; /* entry ok */
  874. default:
  875. return (1) ; /* invalid oi_status */
  876. }
  877. }
  878. if (i == 0)
  879. return (2) ;
  880. if (!act_entries)
  881. return (3) ;
  882. /* ok, we have a valid OEM data base with an active entry */
  883. smc->hw.oem_id = (struct s_oem_ids *)  &oem_ids[sel_id] ;
  884. return (0) ;
  885. }
  886. #endif /* MULT_OEM */
  887. #ifdef MCA
  888. /************************
  889.  *
  890.  * BEGIN_MANUAL_ENTRY()
  891.  *
  892.  * exist_board
  893.  *
  894.  * Check if an MCA board is present in the specified slot.
  895.  *
  896.  * int exist_board(
  897.  * struct s_smc *smc,
  898.  * int slot) ;
  899.  * In
  900.  * smc - A pointer to the SMT Context struct.
  901.  *
  902.  * slot - The number of the slot to inspect.
  903.  * Out
  904.  * 0 = No adapter present.
  905.  * 1 = Found FM1 adapter.
  906.  *
  907.  * Pseudo
  908.  *      Read MCA ID
  909.  * for all valid OEM_IDs
  910.  * compare with ID read
  911.  * if equal, return 1
  912.  * return(0
  913.  *
  914.  * Note
  915.  * The smc pointer must be valid now.
  916.  *
  917.  * END_MANUAL_ENTRY()
  918.  *
  919.  ************************/
  920. #define LONG_CARD_ID(lo, hi) ((((hi) & 0xff) << 8) | ((lo) & 0xff))
  921. int exist_board(smc,slot)
  922. struct s_smc *smc ;
  923. int slot ;
  924. {
  925. #ifdef MULT_OEM
  926. SK_LOC_DECL(u_char,id[2]) ;
  927. int idi ;
  928. #endif /* MULT_OEM */
  929. /* No longer valid. */
  930. if (smc == NULL)
  931. return(0) ;
  932. #ifndef MULT_OEM
  933. if (read_card_id(smc, slot)
  934. == LONG_CARD_ID(OEMID(smc,0), OEMID(smc,1)))
  935. return (1) ; /* Found FM adapter. */
  936. #else /* MULT_OEM */
  937. idi = read_card_id(smc, slot) ;
  938. id[0] = idi & 0xff ;
  939. id[1] = idi >> 8 ;
  940.         smc->hw.oem_id = (struct s_oem_ids *) &oem_ids[0] ;
  941. for (; smc->hw.oem_id->oi_status != OI_STAT_LAST; smc->hw.oem_id++) {
  942. if (smc->hw.oem_id->oi_status < smc->hw.oem_min_status)
  943. continue ;
  944. if (is_equal_num(&id[0],&OEMID(smc,0),2))
  945. return (1) ;
  946. }
  947. #endif /* MULT_OEM */
  948. return (0) ; /* No adapter found. */
  949. }
  950. /************************
  951.  *
  952.  * read_card_id
  953.  *
  954.  * Read the MCA card id from the specified slot.
  955.  * In
  956.  * smc - A pointer to the SMT Context struct.
  957.  * CAVEAT: This pointer may be NULL and *must not* be used within this
  958.  * function. It's only purpose is for drivers that need some information
  959.  * for the inp() and outp() macros.
  960.  *
  961.  * slot - The number of the slot for which the card id is returned.
  962.  * Out
  963.  * Returns the card id read from the specified slot. If an illegal slot
  964.  * number is specified, the function returns zero.
  965.  *
  966.  ************************/
  967. static int read_card_id(smc,slot)
  968. struct s_smc *smc ; /* Do not use. */
  969. int slot ;
  970. {
  971. int card_id ;
  972. SK_UNUSED(smc) ; /* Make LINT happy. */
  973. if ((slot < 1) || (slot > 15)) /* max 16 slots, 0 = motherboard */
  974. return (0) ; /* Illegal slot number specified. */
  975. EnableSlotAccess(smc, slot) ;
  976. card_id = ((read_POS(smc,POS_ID_HIGH,slot - 1) & 0xff) << 8) |
  977. (read_POS(smc,POS_ID_LOW,slot - 1) & 0xff) ;
  978. DisableSlotAccess(smc) ;
  979. return (card_id) ;
  980. }
  981. /************************
  982.  *
  983.  * BEGIN_MANUAL_ENTRY()
  984.  *
  985.  * get_board_para
  986.  *
  987.  * Get adapter configuration information. Fill all board specific
  988.  * parameters within the 'smc' structure.
  989.  *
  990.  * int get_board_para(
  991.  * struct s_smc *smc,
  992.  * int slot) ;
  993.  * In
  994.  * smc - A pointer to the SMT Context struct, to which this function will
  995.  * write some adapter configuration data.
  996.  *
  997.  * slot - The number of the slot, in which the adapter is installed.
  998.  * Out
  999.  * 0 = No adapter present.
  1000.  * 1 = Ok.
  1001.  * 2 = Adapter present, but card enable bit not set.
  1002.  *
  1003.  * END_MANUAL_ENTRY()
  1004.  *
  1005.  ************************/
  1006. int get_board_para(smc,slot)
  1007. struct s_smc *smc ;
  1008. int slot ;
  1009. {
  1010. int val ;
  1011. int i ;
  1012. /* Check if adapter present & get type of adapter. */
  1013. switch (exist_board(smc, slot)) {
  1014. case 0: /* Adapter not present. */
  1015. return (0) ;
  1016. case 1: /* FM Rev. 1 */
  1017. smc->hw.rev = FM1_REV ;
  1018. smc->hw.VFullRead = 0x0a ;
  1019. smc->hw.VFullWrite = 0x05 ;
  1020. smc->hw.DmaWriteExtraBytes = 8 ; /* 2 extra words. */
  1021. break ;
  1022. }
  1023. smc->hw.slot = slot ;
  1024. EnableSlotAccess(smc, slot) ;
  1025. if (!(read_POS(smc,POS_102, slot - 1) & POS_CARD_EN)) {
  1026. DisableSlotAccess(smc) ;
  1027. return (2) ; /* Card enable bit not set. */
  1028. }
  1029. val = read_POS(smc,POS_104, slot - 1) ; /* I/O, IRQ */
  1030. #ifndef MEM_MAPPED_IO /* is defined by the operating system */
  1031. i = val & POS_IOSEL ; /* I/O base addr. (0x0200 .. 0xfe00) */
  1032. smc->hw.iop = (i + 1) * 0x0400 - 0x200 ;
  1033. #endif
  1034. i = ((val & POS_IRQSEL) >> 6) & 0x03 ; /* IRQ <0, 1> */
  1035. smc->hw.irq = opt_ints[i] ;
  1036. /* FPROM base addr. */
  1037. i = ((read_POS(smc,POS_103, slot - 1) & POS_MSEL) >> 4) & 0x07 ;
  1038. smc->hw.eprom = opt_eproms[i] ;
  1039. DisableSlotAccess(smc) ;
  1040. /* before this, the smc->hw.iop must be set !!! */
  1041. smc->hw.slot_32 = inpw(CSF_A) & SLOT_32 ;
  1042. return (1) ;
  1043. }
  1044. /* Enable access to specified MCA slot. */
  1045. static void EnableSlotAccess(smc,slot)
  1046. struct s_smc *smc ;
  1047. int slot ;
  1048. {
  1049. SK_UNUSED(slot) ;
  1050. #ifndef AIX
  1051. SK_UNUSED(smc) ;
  1052. /* System mode. */
  1053. outp(POS_SYS_SETUP, POS_SYSTEM) ;
  1054. /* Select slot. */
  1055. outp(POS_CHANNEL_POS, POS_CHANNEL_BIT | (slot-1)) ;
  1056. #else
  1057. attach_POS_addr (smc) ;
  1058. #endif
  1059. }
  1060. /* Disable access to MCA slot formerly enabled via EnableSlotAccess(). */
  1061. static void DisableSlotAccess(smc)
  1062. struct s_smc *smc ;
  1063. {
  1064. #ifndef AIX
  1065. SK_UNUSED(smc) ;
  1066. outp(POS_CHANNEL_POS, 0) ;
  1067. #else
  1068. detach_POS_addr (smc) ;
  1069. #endif
  1070. }
  1071. #endif /* MCA */
  1072. #ifdef EISA
  1073. #ifndef MEM_MAPPED_IO
  1074. #define SADDR(slot) (((slot)<<12)&0xf000)
  1075. #else /* MEM_MAPPED_IO */
  1076. #define SADDR(slot) (smc->hw.iop)
  1077. #endif /* MEM_MAPPED_IO */
  1078. /************************
  1079.  *
  1080.  * BEGIN_MANUAL_ENTRY()
  1081.  *
  1082.  * exist_board
  1083.  *
  1084.  * Check if an EISA board is present in the specified slot.
  1085.  *
  1086.  * int exist_board(
  1087.  * struct s_smc *smc,
  1088.  * int slot) ;
  1089.  * In
  1090.  * smc - A pointer to the SMT Context struct.
  1091.  *
  1092.  * slot - The number of the slot to inspect.
  1093.  * Out
  1094.  * 0 = No adapter present.
  1095.  * 1 = Found adapter.
  1096.  *
  1097.  * Pseudo
  1098.  *      Read EISA ID
  1099.  * for all valid OEM_IDs
  1100.  * compare with ID read
  1101.  * if equal, return 1
  1102.  * return(0
  1103.  *
  1104.  * Note
  1105.  * The smc pointer must be valid now.
  1106.  *
  1107.  ************************/
  1108. int exist_board(smc,slot)
  1109. struct s_smc *smc ;
  1110. int slot ;
  1111. {
  1112. int i ;
  1113. #ifdef MULT_OEM
  1114. SK_LOC_DECL(u_char,id[4]) ;
  1115. #endif /* MULT_OEM */
  1116. /* No longer valid. */
  1117. if (smc == NULL)
  1118. return(0);
  1119. SK_UNUSED(slot) ;
  1120. #ifndef MULT_OEM
  1121. for (i = 0 ; i < 4 ; i++) {
  1122. if (inp(SADDR(slot)+PRA(i)) != OEMID(smc,i))
  1123. return(0) ;
  1124. }
  1125. return(1) ;
  1126. #else /* MULT_OEM */
  1127. for (i = 0 ; i < 4 ; i++)
  1128. id[i] = inp(SADDR(slot)+PRA(i)) ;
  1129. smc->hw.oem_id = (struct s_oem_ids *) &oem_ids[0] ;
  1130. for (; smc->hw.oem_id->oi_status != OI_STAT_LAST; smc->hw.oem_id++) {
  1131. if (smc->hw.oem_id->oi_status < smc->hw.oem_min_status)
  1132. continue ;
  1133. if (is_equal_num(&id[0],&OEMID(smc,0),4))
  1134. return (1) ;
  1135. }
  1136. return (0) ; /* No adapter found. */
  1137. #endif /* MULT_OEM */
  1138. }
  1139. int get_board_para(smc,slot)
  1140. struct s_smc *smc ;
  1141. int slot ;
  1142. {
  1143. int i ;
  1144. if (!exist_board(smc,slot))
  1145. return(0) ;
  1146. smc->hw.slot = slot ;
  1147. #ifndef MEM_MAPPED_IO /* if defined by the operating system */
  1148. smc->hw.iop = SADDR(slot) ;
  1149. #endif
  1150. if (!(inp(C0_A(0))&CFG_CARD_EN)) {
  1151. return(2) ; /* CFG_CARD_EN bit not set! */
  1152. }
  1153. smc->hw.irq = opt_ints[(inp(C1_A(0)) & CFG_IRQ_SEL)] ;
  1154. smc->hw.dma = opt_dmas[((inp(C1_A(0)) & CFG_DRQ_SEL)>>3)] ;
  1155. if ((i = inp(C2_A(0)) & CFG_EPROM_SEL) != 0x0f)
  1156. smc->hw.eprom = opt_eproms[i] ;
  1157. else
  1158. smc->hw.eprom = 0 ;
  1159. smc->hw.DmaWriteExtraBytes = 8 ;
  1160. return(1) ;
  1161. }
  1162. #endif /* EISA */
  1163. #ifdef ISA
  1164. #ifndef MULT_OEM
  1165. const u_char sklogo[6] = SKLOGO_STR ;
  1166. #define SIZE_SKLOGO(smc) sizeof(sklogo)
  1167. #define SKLOGO(smc,i) sklogo[i]
  1168. #else /* MULT_OEM */
  1169. #define SIZE_SKLOGO(smc) smc->hw.oem_id->oi_logo_len
  1170. #define SKLOGO(smc,i) smc->hw.oem_id->oi_logo[i]
  1171. #endif /* MULT_OEM */
  1172. int exist_board(smc,port)
  1173. struct s_smc *smc ;
  1174. HW_PTR port ;
  1175. {
  1176. int i ;
  1177. #ifdef MULT_OEM
  1178. int bytes_read ;
  1179. u_char board_logo[15] ;
  1180. SK_LOC_DECL(u_char,id[4]) ;
  1181. #endif /* MULT_OEM */
  1182. /* No longer valid. */
  1183. if (smc == NULL)
  1184. return(0);
  1185. SK_UNUSED(smc) ;
  1186. #ifndef MULT_OEM
  1187. for (i = SADDRL ; i < (signed) (SADDRL+SIZE_SKLOGO(smc)) ; i++) {
  1188. if ((u_char)inpw((PRA(i)+port)) != SKLOGO(smc,i-SADDRL)) {
  1189. return(0) ;
  1190. }
  1191. }
  1192. /* check MAC address (S&K or other) */
  1193. for (i = 0 ; i < 3 ; i++) {
  1194. if ((u_char)inpw((PRA(i)+port)) != OEMID(smc,i))
  1195. return(0) ;
  1196. }
  1197. return(1) ;
  1198. #else /* MULT_OEM */
  1199.         smc->hw.oem_id = (struct s_oem_ids *)  &oem_ids[0] ;
  1200. board_logo[0] = (u_char)inpw((PRA(SADDRL)+port)) ;
  1201. bytes_read = 1 ;
  1202. for (; smc->hw.oem_id->oi_status != OI_STAT_LAST; smc->hw.oem_id++) {
  1203. if (smc->hw.oem_id->oi_status < smc->hw.oem_min_status)
  1204. continue ;
  1205. /* Test all read bytes with current OEM_entry */
  1206. /* for (i=0; (i<bytes_read) && (i < SIZE_SKLOGO(smc)); i++) { */
  1207. for (i = 0; i < bytes_read; i++) {
  1208. if (board_logo[i] != SKLOGO(smc,i))
  1209. break ;
  1210. }
  1211. /* If mismatch, switch to next OEM entry */
  1212. if ((board_logo[i] != SKLOGO(smc,i)) && (i < bytes_read))
  1213. continue ;
  1214. --i ;
  1215. while (bytes_read < SIZE_SKLOGO(smc)) {
  1216. //   inpw next byte SK_Logo
  1217. i++ ;
  1218. board_logo[i] = (u_char)inpw((PRA(SADDRL+i)+port)) ;
  1219. bytes_read++ ;
  1220. if (board_logo[i] != SKLOGO(smc,i))
  1221. break ;
  1222. }
  1223. for (i = 0 ; i < 3 ; i++)
  1224. id[i] = (u_char)inpw((PRA(i)+port)) ;
  1225. if ((board_logo[i] == SKLOGO(smc,i))
  1226. && (bytes_read == SIZE_SKLOGO(smc))) {
  1227. if (is_equal_num(&id[0],&OEMID(smc,0),3))
  1228. return(1);
  1229. }
  1230. } /* for */
  1231. return(0) ;
  1232. #endif /* MULT_OEM */
  1233. }
  1234. int get_board_para(smc,slot)
  1235. struct s_smc *smc ;
  1236. int slot ;
  1237. {
  1238. SK_UNUSED(smc) ;
  1239. SK_UNUSED(slot) ;
  1240. return(0) ; /* for ISA not supported */
  1241. }
  1242. #endif /* ISA */
  1243. #ifdef PCI
  1244. #ifdef USE_BIOS_FUN
  1245. int exist_board(smc,slot)
  1246. struct s_smc *smc ;
  1247. int slot ;
  1248. {
  1249. u_short dev_id ;
  1250. u_short ven_id ;
  1251. int found ; 
  1252. int i ;
  1253. found = FALSE ; /* make sure we returned with adatper not found*/
  1254. /* if an empty oemids.h was included */
  1255. #ifdef MULT_OEM
  1256.         smc->hw.oem_id = (struct s_oem_ids *) &oem_ids[0] ;
  1257. for (; smc->hw.oem_id->oi_status != OI_STAT_LAST; smc->hw.oem_id++) {
  1258. if (smc->hw.oem_id->oi_status < smc->hw.oem_min_status)
  1259. continue ;
  1260. #endif
  1261. ven_id = OEMID(smc,0) + (OEMID(smc,1) << 8) ; 
  1262. dev_id = OEMID(smc,2) + (OEMID(smc,3) << 8) ; 
  1263. for (i = 0; i < slot; i++) {
  1264. if (pci_find_device(i,&smc->hw.pci_handle,
  1265. dev_id,ven_id) != 0) {
  1266. found = FALSE ;
  1267. } else {
  1268. found = TRUE ;
  1269. }
  1270. }
  1271. if (found) {
  1272. return(1) ; /* adapter was found */
  1273. }
  1274. #ifdef MULT_OEM
  1275. }
  1276. #endif
  1277. return(0) ; /* adapter was not found */
  1278. }
  1279. #endif /* PCI */
  1280. #endif /* USE_BIOS_FUNC */
  1281. void driver_get_bia(smc, bia_addr)
  1282. struct s_smc *smc ;
  1283. struct fddi_addr *bia_addr ;
  1284. {
  1285. int i ;
  1286. extern const u_char canonical[256] ;
  1287. for (i = 0 ; i < 6 ; i++) {
  1288. bia_addr->a[i] = canonical[smc->hw.fddi_phys_addr.a[i]] ;
  1289. }
  1290. }
  1291. void smt_start_watchdog(smc)
  1292. struct s_smc *smc ;
  1293. {
  1294. SK_UNUSED(smc) ; /* Make LINT happy. */
  1295. #ifndef DEBUG
  1296. #ifdef PCI
  1297. if (smc->hw.wdog_used) {
  1298. outpw(ADDR(B2_WDOG_CRTL),TIM_START) ; /* Start timer. */
  1299. }
  1300. #endif
  1301. #endif /* DEBUG */
  1302. }
  1303. void smt_stop_watchdog(smc)
  1304. struct s_smc *smc ;
  1305. {
  1306. SK_UNUSED(smc) ; /* Make LINT happy. */
  1307. #ifndef DEBUG
  1308. #ifdef PCI
  1309. if (smc->hw.wdog_used) {
  1310. outpw(ADDR(B2_WDOG_CRTL),TIM_STOP) ; /* Stop timer. */
  1311. }
  1312. #endif
  1313. #endif /* DEBUG */
  1314. }
  1315. #ifdef PCI
  1316. static char get_rom_byte(smc,addr)
  1317. struct s_smc *smc ;
  1318. u_short addr ;
  1319. {
  1320. GET_PAGE(addr) ;
  1321. return (READ_PROM(ADDR(B2_FDP))) ;
  1322. }
  1323. /*
  1324.  * ROM image defines
  1325.  */
  1326. #define ROM_SIG_1 0
  1327. #define ROM_SIG_2 1
  1328. #define PCI_DATA_1 0x18
  1329. #define PCI_DATA_2 0x19
  1330. /*
  1331.  * PCI data structure defines
  1332.  */
  1333. #define VPD_DATA_1 0x08
  1334. #define VPD_DATA_2 0x09
  1335. #define IMAGE_LEN_1 0x10
  1336. #define IMAGE_LEN_2 0x11
  1337. #define CODE_TYPE 0x14
  1338. #define INDICATOR 0x15
  1339. /*
  1340.  * BEGIN_MANUAL_ENTRY(mac_drv_vpd_read)
  1341.  * mac_drv_vpd_read(smc,buf,size,image)
  1342.  *
  1343.  * function DOWNCALL (FDDIWARE)
  1344.  * reads the VPD data of the FPROM and writes it into the
  1345.  * buffer
  1346.  *
  1347.  * para buf points to the buffer for the VPD data
  1348.  * size size of the VPD data buffer
  1349.  * image boot image; code type of the boot image
  1350.  * image = 0 Intel x86, PC-AT compatible
  1351.  * 1 OPENBOOT standard for PCI
  1352.  * 2-FF reserved
  1353.  *
  1354.  * returns len number of VPD data bytes read form the FPROM
  1355.  * <0 number of read bytes
  1356.  * >0 error: data invalid
  1357.  *
  1358.  * END_MANUAL_ENTRY
  1359.  */
  1360. int mac_drv_vpd_read(smc,buf,size,image)
  1361. struct s_smc *smc ;
  1362. char *buf ;
  1363. int size ;
  1364. char image ;
  1365. {
  1366. u_short ibase ;
  1367. u_short pci_base ;
  1368. u_short vpd ;
  1369. int len ;
  1370. len = 0 ;
  1371. ibase = 0 ;
  1372. /*
  1373.  * as long images defined
  1374.  */
  1375. while (get_rom_byte(smc,ibase+ROM_SIG_1) == 0x55 &&
  1376. (u_char) get_rom_byte(smc,ibase+ROM_SIG_2) == 0xaa) {
  1377. /*
  1378.  * get the pointer to the PCI data structure
  1379.  */
  1380. pci_base = ibase + get_rom_byte(smc,ibase+PCI_DATA_1) +
  1381. (get_rom_byte(smc,ibase+PCI_DATA_2) << 8) ;
  1382. if (image == get_rom_byte(smc,pci_base+CODE_TYPE)) {
  1383. /*
  1384.  * we have the right image, read the VPD data
  1385.  */
  1386. vpd = ibase + get_rom_byte(smc,pci_base+VPD_DATA_1) +
  1387. (get_rom_byte(smc,pci_base+VPD_DATA_2) << 8) ;
  1388. if (vpd == ibase) {
  1389. break ; /* no VPD data */
  1390. }
  1391. for (len = 0; len < size; len++,buf++,vpd++) {
  1392. *buf = get_rom_byte(smc,vpd) ;
  1393. }
  1394. break ;
  1395. }
  1396. else {
  1397. /*
  1398.  * try the next image
  1399.  */
  1400. if (get_rom_byte(smc,pci_base+INDICATOR) & 0x80) {
  1401. break ; /* this was the last image */
  1402. }
  1403. ibase = ibase + get_rom_byte(smc,ibase+IMAGE_LEN_1) +
  1404. (get_rom_byte(smc,ibase+IMAGE_LEN_2) << 8) ;
  1405. }
  1406. }
  1407. return(len) ;
  1408. }
  1409. void mac_drv_pci_fix(smc,fix_value)
  1410. struct s_smc *smc ;
  1411. u_long fix_value ;
  1412. {
  1413. smc->hw.pci_fix_value = fix_value ;
  1414. }
  1415. void mac_do_pci_fix(smc)
  1416. struct s_smc *smc ;
  1417. {
  1418. SK_UNUSED(smc) ;
  1419. }
  1420. #endif /* PCI */