pccardLib.c
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:32k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* pccardLib.c - PC CARD enabler library */
  2. /* Copyright 1984-1996 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01k,21jun00,rsh  upgrade to dosFs 2.0
  8. 01o,31aug99,jkf  changed from cbio.h to cbioLib.h
  9. 01n,03nov98,lrn  cleanup warnings
  10. 01m,06oct98,lrn  merge DosFs 2.0 changes into T2.0, DosFs 2.0 API for TFFS
  11. 01l,17sep98,lrn  reworked DosFs 2.0 support and memory leak issues
  12. 01k,13jul98,lrn  DosFs 2.0 - can not delete a DOS device
  13. 01j,19jan98,hdn  added a check to see if the socket is registered.
  14. 01i,11dec97,hdn  added TFFS support for flash PC card.
  15. 01h,19mar97,hdn  deleted a line that writes 0 to the ELT's address config reg.
  16. 01g,16jan97,hdn  initialized pcmciaCtrl.
  17. 01f,17nov96,jdi  doc: tweaks.
  18. 01e,08nov96,dgp  doc: final formatting
  19. 01d,28mar96,jdi  doc: cleaned up language and format.
  20. 01c,08mar96,hdn  added more descriptions.
  21. 01b,22feb96,hdn  cleaned up
  22. 01a,19oct95,hdn  written.
  23. */
  24. /*
  25. DESCRIPTION
  26. This library provides generic facilities for enabling PC CARD.
  27. Each PC card device driver needs to provide an enabler routine and
  28. a CSC interrupt handler.  The enabler routine must be in the
  29. `pccardEnabler' structure.
  30. Each PC card driver has its own resource structure, `xxResources'.  The
  31. ATA PC card driver resource structure is `ataResources' in
  32. sysLib, which also supports a local IDE disk.
  33. The resource structure has a PC card common resource structure in
  34. the first member.  Other members are device-driver dependent resources.
  35. The PCMCIA chip initialization routines tcicInit() and pcicInit() are
  36. included in the PCMCIA chip table `pcmciaAdapter'.
  37. This table is scanned when the PCMCIA library is initialized.  If the
  38. initialization routine finds the PCMCIA chip, it registers all function
  39. pointers of the PCMCIA_CHIP structure.
  40. A memory window defined in `pcmciaMemwin' is used to access
  41. the CIS of a PC card through the routines in cisLib.
  42. SEE ALSO
  43. pcmciaLib, cisLib, tcic, pcic
  44. */
  45. /* LINTLIBRARY */
  46. #include "private/funcBindP.h"
  47. #include "drv/pcmcia/pcmciaLib.h"
  48. #include "drv/pcmcia/cisLib.h"
  49. #include "drv/pcmcia/pcic.h"
  50. #include "drv/pcmcia/tcic.h"
  51. #include "drv/pcmcia/sramDrv.h"
  52. #include "drv/hdisk/ataDrv.h"
  53. #include "cbioLib.h"
  54. #include "dcacheCbio.h"
  55. #include "dpartCbio.h"
  56. #ifdef INCLUDE_ELT
  57. #include "net/if.h"
  58. #include "netinet/if_ether.h"
  59. #include "drv/netif/if_elt.h"
  60. #endif /* INCLUDE_ELT */
  61. #ifdef INCLUDE_TFFS
  62. #include "tffs/tffsDrv.h"
  63. #endif /* INCLUDE_TFFS */
  64. /* defines */
  65. #define ELT_PCMCIA_ID0 0x0101 /* manufacturer code */
  66. #define ELT_PCMCIA_ID1_562 0x0562 /* manufacturer info for 3C562 */
  67. #define ELT_PCMCIA_ID1_589 0x0589 /* manufacturer info for 3C589B */
  68. /* XXX it should go in pc386/pc.h */
  69. #define TFFS0_MEM_START 0xd8000 /* mem start addr for TFFS in sock 0 */
  70. #define TFFS0_MEM_STOP 0xd9fff /* mem stop addr for TFFS in sock 0 */
  71. #define TFFS1_MEM_START 0xda000 /* mem start addr for TFFS in sock 1 */
  72. #define TFFS1_MEM_STOP 0xdbfff /* mem stop addr for TFFS in sock 1 */
  73. /* externs */
  74. IMPORT BOOL pcmciaDebug;
  75. /* dont use partition table decoder unless ATA is included */
  76. #define USE_PARTITIONS FALSE
  77. #ifdef INCLUDE_ELT
  78. IMPORT ELT_CTRL *pEltCtrl [];
  79. LOCAL STATUS pccardEltCscIntr  (int sock, int csc);
  80. #endif /* INCLUDE_ELT */
  81. #ifdef INCLUDE_ATA
  82. IMPORT ATA_CTRL ataCtrl [ATA_MAX_CTRLS];
  83. LOCAL STATUS pccardAtaCscIntr  (int sock, int csc);
  84. #undef USE_PARTITIONS
  85. #define USE_PARTITIONS TRUE
  86. #endif /* INCLUDE_ATA */
  87. #ifdef INCLUDE_SRAM
  88. IMPORT SRAM_CTRL sramCtrl;
  89. IMPORT int sramResourceNumEnt;
  90. LOCAL STATUS pccardSramCscIntr (int sock, int csc);
  91. #endif /* INCLUDE_SRAM */
  92. #ifdef INCLUDE_TFFS
  93. IMPORT char pcDriveNo [];
  94. LOCAL STATUS pccardTffsCscIntr (int sock, int csc);
  95. #endif /* INCLUDE_TFFS */
  96. /* globals */
  97. PCMCIA_CTRL pcmciaCtrl = {PCMCIA_SOCKS, PCMCIA_MEMBASE} ;
  98. PCMCIA_MEMWIN pcmciaMemwin [] =
  99.     {
  100.     {0, 0, 0, CIS_MEM_START, CIS_MEM_STOP, 0}, /* CIS extraction */
  101.     {0, 0, 0, CIS_REG_START, CIS_REG_STOP, 0}, /* config registers */
  102.     };
  103. PCMCIA_ADAPTER pcmciaAdapter [] =
  104.     {
  105.     {PCMCIA_PCIC, PCIC_BASE_ADR, PCIC_INT_VEC, PCIC_INT_LVL, pcicInit, NULL},
  106.     {PCMCIA_TCIC, TCIC_BASE_ADR, TCIC_INT_VEC, TCIC_INT_LVL, tcicInit, NULL}
  107.     };
  108. #ifdef INCLUDE_ELT
  109. ELT_RESOURCE eltResources[] =
  110.     {
  111.     {
  112.      {
  113.      5, 0,
  114.      {ELT0_IO_START, 0}, {ELT0_IO_STOP, 0}, 0,
  115.      0, 0, 0, 0, 0
  116.      },
  117.      ELT0_INT_VEC, ELT0_INT_LVL, ELT0_NRF, ELT0_CONFIG
  118.     },
  119.     {
  120.      {
  121.      5, 0,
  122.      {ELT1_IO_START, 0}, {ELT1_IO_STOP, 0}, 0,
  123.      0, 0, 0, 0, 0
  124.      },
  125.      ELT1_INT_VEC, ELT1_INT_LVL, ELT1_NRF, ELT1_CONFIG
  126.     }
  127.     };
  128. #endif /* INCLUDE_ELT */
  129. #ifdef INCLUDE_SRAM
  130. SRAM_RESOURCE sramResources[] =
  131.     {
  132.     {
  133.      {
  134.      5, 0,
  135.      {0, 0}, {0, 0}, 0,
  136.      SRAM0_MEM_START, SRAM0_MEM_STOP, 1, 0x0, SRAM0_MEM_LENGTH
  137.      }
  138.     },
  139.     {
  140.      {
  141.      5, 0,
  142.      {0, 0}, {0, 0}, 0,
  143.      SRAM1_MEM_START, SRAM1_MEM_STOP, 1, 0x0, SRAM1_MEM_LENGTH
  144.      }
  145.     },
  146.     {
  147.      {
  148.      5, 0,
  149.      {0, 0}, {0, 0}, 0,
  150.      SRAM2_MEM_START, SRAM2_MEM_STOP, 1, 0x0, SRAM2_MEM_LENGTH
  151.      }
  152.     },
  153.     {
  154.      {
  155.      5, 0,
  156.      {0, 0}, {0, 0}, 0,
  157.      SRAM3_MEM_START, SRAM3_MEM_STOP, 1, 0x0, SRAM3_MEM_LENGTH
  158.      }
  159.     }
  160.     };
  161. #endif /* INCLUDE_SRAM */
  162. #ifdef INCLUDE_TFFS
  163. TFFS_RESOURCE tffsResources[] =
  164.     {
  165.     {
  166.      {
  167.      5 /* vcc */, 0 /* vpp */,
  168.      {0, 0}, {0, 0}, 0,
  169.      TFFS0_MEM_START, TFFS0_MEM_STOP, 2 /* extra wait state */,
  170.      0x0 /* offset card address */, 0x0 /* size of the memory */
  171.      }
  172.     },
  173.     {
  174.      {
  175.      5 /* vcc */, 0 /* vpp */,
  176.      {0, 0}, {0, 0}, 0,
  177.      TFFS1_MEM_START, TFFS1_MEM_STOP, 2 /* extra wait state */,
  178.      0x0 /* offset card address */, 0x0 /* size of the memory */
  179.      }
  180.     }
  181.     };
  182. #endif /* INCLUDE_TFFS */
  183. PCCARD_ENABLER pccardEnabler [] =
  184.     {
  185. #ifdef INCLUDE_ELT
  186.     {
  187.      PCCARD_LAN_ELT, (void *)eltResources, NELEMENTS(eltResources),
  188.      (FUNCPTR)pccardEltEnabler, NULL
  189.     },
  190. #endif /* INCLUDE_ELT */
  191. #ifdef INCLUDE_ATA
  192.     {
  193.      PCCARD_ATA, (void *)ataResources, NELEMENTS(ataResources),
  194.      (FUNCPTR)pccardAtaEnabler, NULL
  195.     },
  196. #endif /* INCLUDE_ATA */
  197. #ifdef INCLUDE_TFFS
  198.     {
  199.      PCCARD_FLASH, (void *)tffsResources, NELEMENTS(tffsResources),
  200.      (FUNCPTR)pccardTffsEnabler, NULL
  201.     },
  202. #endif /* INCLUDE_TFFS */
  203. #ifdef INCLUDE_SRAM
  204.     {
  205.      PCCARD_SRAM, (void *)sramResources, NELEMENTS(sramResources),
  206.      (FUNCPTR)pccardSramEnabler, NULL
  207.     }
  208. #endif /* INCLUDE_SRAM */
  209.     };
  210. int pcmciaAdapterNumEnt = NELEMENTS (pcmciaAdapter);
  211. int pccardEnablerNumEnt = NELEMENTS (pccardEnabler);
  212. /* locals */
  213. #ifdef INCLUDE_SRAM
  214. LOCAL int sramSizeTable [] = {512, 2000, 8000, 32000,
  215.       128000, 512000, 2000000, 0};
  216. #endif /* INCLUDE_SRAM */
  217. #ifdef INCLUDE_DOSFS
  218. #define ATA_CACHE_SIZE (128*1024)
  219. #define SRAM_CACHE_SIZE (2*1024)
  220. #define TFFS_CACHE_SIZE (32*1024)
  221. CBIO_DEV_ID sockCbioDevs[ PCIC_MAX_SOCKS * NELEMENTS (pcmciaAdapter) ];
  222. char * sockDevNames[ PCIC_MAX_SOCKS * NELEMENTS (pcmciaAdapter) ] =
  223.  { "/card0", "/card1", "/card2", "/card3",
  224.               "/card4", "/card5", "/card6", "/card7", NULL };
  225. #endif /* INCLUDE_DOSFS */
  226. #ifdef INCLUDE_ATA
  227. #endif
  228. #ifdef INCLUDE_SRAM
  229. #endif
  230. #ifdef INCLUDE_ELT
  231. #endif
  232. #ifdef INCLUDE_TFFS
  233. #endif
  234. /*******************************************************************************
  235. *
  236. * pccardMount - mount a DOS file system
  237. *
  238. * This routine mounts a DOS file system.
  239. *
  240. * RETURNS: OK or ERROR.
  241. */
  242. STATUS pccardMount
  243.     (
  244.     int  sock, /* socket number */
  245.     char *pName /* name of a device */
  246.     )
  247.     {
  248.     printErr( "This function is discontinuedn" );
  249.     return ERROR;
  250. #if FALSE
  251.     PCMCIA_CTRL *pCtrl = &pcmciaCtrl;
  252.     PCMCIA_CHIP *pChip = &pCtrl->chip;
  253.     PCMCIA_CARD *pCard = &pCtrl->card[sock];
  254.     DOS_VOL_DESC *pDos = pCard->pDos;
  255.     if ((!pChip->installed) || (!pCard->installed) || (sock >= pChip->socks))
  256.         return (ERROR);
  257.     if (pDos != NULL)
  258. {
  259. iosDevDelete (&pDos->dosvd_devHdr);
  260. free ((char *)pDos);
  261. return (ERROR);
  262. }
  263.     pCard->pDos = dosFsDevInit (pName, pCard->pBlkDev, NULL);
  264.     if (pCard->pDos == NULL)
  265. return (ERROR);
  266.     return (OK);
  267. #endif /* FALSE */
  268.     }
  269. /*******************************************************************************
  270. *
  271. * pccardMkfs - initialize a device and mount a DOS file system
  272. *
  273. * This routine initializes a device and mounts a DOS file system.
  274. *
  275. * RETURNS: OK or ERROR.
  276. */
  277. STATUS pccardMkfs
  278.     (
  279.     int  sock, /* socket number */
  280.     char *pName /* name of a device */
  281.     )
  282.     {
  283.     printErr( "This function is discontinued. Use dosFsVolFormat()n" );
  284.     return ERROR;
  285. #if FALSE
  286.     PCMCIA_CTRL *pCtrl = &pcmciaCtrl;
  287.     PCMCIA_CHIP *pChip = &pCtrl->chip;
  288.     PCMCIA_CARD *pCard = &pCtrl->card[sock];
  289.     DOS_VOL_DESC *pDos = pCard->pDos;
  290.     if ((!pChip->installed) || (!pCard->installed) || (sock >= pChip->socks))
  291.         return (ERROR);
  292.     if (pDos != NULL)
  293. {
  294. iosDevDelete (&pDos->dosvd_devHdr);
  295. free ((char *)pDos);
  296. return (ERROR);
  297. }
  298.     pCard->pDos = dosFsMkfs (pName, pCard->pBlkDev);
  299.     if (pCard->pDos == NULL)
  300. return (ERROR);
  301.     return (OK);
  302. #endif /* FALSE */
  303.     }
  304. #ifdef INCLUDE_DOSFS
  305. /*******************************************************************************
  306. *
  307. * pccardDosDevCreate - create DOSFS device for on PCMCIA socket.
  308. *
  309. * This routine creates a DOS FS device for PCMCIA socket # <sock>
  310. * with predefined name based on socket number.  The device will use
  311. * device driver pointed by <pBlkDev> to access device on the low level.
  312. *
  313. * If DOS device already exists, only low level driver is changed to
  314. * reflect the new devices physical parameters.
  315. *
  316. * RETURNS: STATUS.
  317. */
  318. LOCAL STATUS pccardDosDevCreate
  319.     (
  320.     int sock,
  321.     void * pBlkDev,
  322.     int cacheSize,
  323.     BOOL partitions
  324.     )
  325.     {
  326.     void * subDev = NULL ;
  327.     void * masterCbio ;
  328.     IMPORT STATUS usrFdiskPartRead();
  329.     STATUS stat;
  330.     /* create cache of appropriate size and DOS device on top of it */
  331.     if ( sockCbioDevs[ sock ] == NULL )
  332.      {
  333.      sockCbioDevs[ sock ] =
  334.           dcacheDevCreate(pBlkDev, 0, cacheSize,
  335.                      sockDevNames[ sock ] );
  336.      if( sockCbioDevs[ sock ] == NULL )
  337.          {
  338.          printErr ("Error during dcacheDevCreate: %pn",
  339.                 (void *)errno );
  340.          return (ERROR);
  341.          }
  342.     if ( partitions )
  343.     {
  344.          masterCbio = dpartDevCreate(sockCbioDevs[ sock ] ,
  345.  1, (FUNCPTR) usrFdiskPartRead );
  346.          if( masterCbio == NULL)
  347.              {
  348.      printErr ("Error creating partition manager: %xn", errno);
  349.              return (ERROR);
  350.              }
  351.     subDev = (void *) dpartPartGet(masterCbio,0);
  352.     }
  353. else
  354.     {
  355.     subDev = sockCbioDevs[ sock ];
  356.     }
  357.      return dosFsDevCreate( sockDevNames[ sock ],
  358.                       subDev, 0,0 );
  359.      }
  360.     /* resize cache and RESET device */
  361.     dcacheDevMemResize (sockCbioDevs[ sock ], cacheSize);
  362.     stat = cbioIoctl (sockCbioDevs[ sock ], CBIO_RESET, pBlkDev );
  363.     if( stat != OK )
  364. {
  365. printErr("pccardDosDevCreate: error substituting block driver, "
  366. "errno=%#xn", errno);
  367. }
  368.     return stat;
  369.     } /* pccardDosDevCreate() */
  370. #endif /* INCLUDE_DOSFS */
  371. #ifdef INCLUDE_ATA
  372. /*******************************************************************************
  373. *
  374. * pccardAtaEnabler - enable the PCMCIA-ATA device
  375. *
  376. * This routine enables the PCMCIA-ATA device.
  377. *
  378. * RETURNS:
  379. * OK, ERROR_FIND if there is no ATA card, or ERROR if another error occurs.
  380. */
  381. STATUS pccardAtaEnabler
  382.     (
  383.     int  sock, /* socket no. */
  384.     ATA_RESOURCE *pAtaResource, /* pointer to ATA resources */
  385.     int  numEnt, /* number of ATA resource entries */
  386.     FUNCPTR  showRtn  /* ATA show routine */
  387.     )
  388.     {
  389.     PCMCIA_CTRL *pCtrl = &pcmciaCtrl;
  390.     PCMCIA_CHIP *pChip = &pCtrl->chip;
  391.     PCMCIA_CARD *pCard = &pCtrl->card[sock];
  392.     CIS_CONFIG  *pConfig = (CIS_CONFIG *)&pCard->cisConfigList;
  393.     PCCARD_RESOURCE *pResource = &pAtaResource->resource;
  394.     int drive = 0;
  395.     int functionCode = 0;
  396.     int diskInterface = 0;
  397.     PCMCIA_IOWIN pcmciaIowin;
  398.     DL_LIST *pList;
  399.     DL_NODE *pNode;
  400.     CIS_TUPLE *pTuple;
  401.     ATA_CTRL *pAtaCtrl;
  402.     int flag;
  403.     int ctrl;
  404.     int sock0;
  405.     char *pChar;
  406.     if (!pChip->installed)
  407. return (ERROR);
  408.     pList = &pCard->cisTupleList;
  409.     for (pNode = DLL_FIRST (pList); pNode != NULL; pNode = DLL_NEXT(pNode))
  410. {
  411. pTuple = (CIS_TUPLE *)((char *)pNode + sizeof (DL_NODE));
  412. pChar = (char *)pTuple + sizeof (CIS_TUPLE);
  413. switch (pTuple->code)
  414.     {
  415.     case CISTPL_FUNCID:
  416. functionCode = *pChar;
  417. break;
  418.     case CISTPL_FUNCE:
  419. if (*pChar++ == FUNCE_TYPE_DISK)
  420.     diskInterface = *pChar;
  421. break;
  422.     }
  423. }
  424.     if ((pcmciaDebug) && (_func_logMsg != NULL))
  425. (* _func_logMsg) ("ATA sock=%d functionCode=%x diskInterface=%xn",
  426.       sock, functionCode, diskInterface, 0, 0, 0);
  427.     /* return if we didn't recognize the card */
  428.     if ((functionCode != FUNC_FIXEDDISK) || (diskInterface != FUNCE_DATA_ATA))
  429. return (ERROR_FIND);
  430.     if ((pcmciaDebug) && (_func_logMsg != NULL))
  431. (* _func_logMsg) ("ATA sock=%d detectedn",
  432.       sock, 0, 0, 0, 0, 0);
  433.     /* get un-used resource */
  434.     for (ctrl = 0; ctrl < numEnt; ctrl++)
  435. {
  436.         pResource = &pAtaResource->resource;
  437. if (pAtaResource->ctrlType == ATA_PCMCIA)
  438.     {
  439.     for (sock0 = 0; sock0 < pChip->socks; sock0++)
  440. {
  441.      PCMCIA_CARD *pCard0 = &pCtrl->card[sock0];
  442. if (pCard0->pResource == pResource) /* used resource */
  443.     break;
  444. }
  445.     if (sock0 == pChip->socks) /* un-used resource */
  446. break;
  447.     }
  448. pAtaResource++;
  449. }
  450.     if (ctrl == numEnt)
  451. {
  452. if (_func_logMsg != NULL)
  453.     (* _func_logMsg) ("pccardAtaEnabler: sock=%d out of resourcen",
  454.       sock, 0, 0, 0, 0, 0);
  455. return (ERROR);
  456. }
  457.     /* configure the card with the resource */
  458.     pList = &pCard->cisConfigList;
  459.     for (pNode = DLL_FIRST(pList); pNode != NULL; pNode = DLL_NEXT(pNode))
  460. {
  461. pConfig = (CIS_CONFIG *)pNode;
  462. if ((pConfig->ioRanges == 2) &&
  463.     (pConfig->io[0].start == pResource->ioStart[0]) &&
  464.     (pConfig->io[1].start == pResource->ioStart[1]))
  465.     {
  466.     pAtaCtrl = &ataCtrl[ctrl];
  467.     pAtaCtrl->ctrlType = ATA_PCMCIA;
  468.     pCard->type = PCCARD_ATA;
  469.     pCard->sock = sock;
  470.     pCard->ctrl = ctrl;
  471.     pCard->detected = TRUE;
  472.     pCard->pResource = pResource;
  473.             pCard->cardStatus = (* pChip->status)(sock);
  474.     pCard->cscIntr = (FUNCPTR)pccardAtaCscIntr;
  475.     pCard->showRtn = (FUNCPTR)showRtn;
  476.     flag = PC_PWR_AUTO | PC_IOCARD;
  477.     if (pResource->vcc == PCCARD_5V)
  478.         flag |= PC_VCC_5V;
  479.     else if (pResource->vcc == PCCARD_3V)
  480.         flag |= PC_VCC_3V;
  481.     if (pResource->vpp == PCCARD_5V)
  482.         flag |= PC_VPP_5V;
  483.     else if (pResource->vpp == PCCARD_12V)
  484.         flag |= PC_VPP_12V;
  485.     if ((* pChip->flagSet)(sock, flag) != OK)
  486.         return (ERROR);
  487.     cisConfigregSet (sock, CONFIG_STATUS_REG, 0x00);
  488.     cisConfigregSet (sock, PIN_REPLACEMENT_REG,
  489.      PRR_RBVD1 | PRR_RBVD2 | PRR_RRDY | PRR_RWPROT);
  490.     cisConfigregSet (sock, SOCKET_COPY_REG, 0x00 | (sock & 0x0f));
  491.     cisConfigregSet (sock, CONFIG_OPTION_REG,
  492.      COR_LEVIREQ | pConfig->index);
  493.     pcmciaIowin.window = PCCARD_IOWIN0;
  494.     pcmciaIowin.flags = MAP_ACTIVE | MAP_16BIT;
  495.     pcmciaIowin.extraws = pResource->ioExtraws;
  496.     pcmciaIowin.start = pResource->ioStart[0];
  497.     pcmciaIowin.stop = pResource->ioStop[0];
  498.     if ((* pChip->iowinSet)(sock, &pcmciaIowin) != OK)
  499.         return (ERROR);
  500.     pcmciaIowin.window = PCCARD_IOWIN1;
  501.     pcmciaIowin.flags = MAP_ACTIVE | MAP_16BIT;
  502.     pcmciaIowin.extraws = pResource->ioExtraws;
  503.     pcmciaIowin.start = pResource->ioStart[1];
  504.     pcmciaIowin.stop = pResource->ioStop[1];
  505.     if ((* pChip->iowinSet)(sock, &pcmciaIowin) != OK)
  506.         return (ERROR);
  507.     if ((* pChip->irqSet)(sock, pAtaResource->intLevel) != OK)
  508.         return (ERROR);
  509.     if ((pCard->initStatus = ataDrv (ctrl,
  510.      pAtaResource->drives,
  511.      pAtaResource->intVector,
  512.      pAtaResource->intLevel,
  513.      pAtaResource->configType,
  514.      pAtaResource->semTimeout,
  515.      pAtaResource->wdgTimeout
  516.      )) != OK)
  517. {
  518.      if (_func_logMsg != NULL)
  519. (* _func_logMsg) ("ATA sock=%d ataDrv failed %xn",
  520.       sock, errno, 0, 0, 0, 0);
  521.         return (ERROR);
  522. }
  523.     pCard->installed = TRUE;
  524.          taskDelay (sysClkRateGet()); /* 1 sec */
  525.     break;
  526.     }
  527. }
  528.     /* return if we didn't install the driver */
  529.     if (!pCard->installed)
  530. return (ERROR);
  531.     if (pCard->pBlkDev != NULL)
  532. free ((char *)pCard->pBlkDev);
  533.     if ((pCard->pBlkDev = ataDevCreate(ctrl, drive, 0, 0)) ==
  534. (BLK_DEV *)NULL)
  535.         {
  536.         printErr ("Error during ataDevCreate: %xn", errno);
  537. return (ERROR);
  538.         }
  539. #ifdef INCLUDE_DOSFS
  540.     {
  541.     return pccardDosDevCreate( sock, pCard->pBlkDev,
  542. ATA_CACHE_SIZE, USE_PARTITIONS );
  543.     }
  544. #else
  545.     printErr ("DosFs not included, card in socket %d ignoredn", sock);
  546.     return (OK);
  547. #endif /* INCLUDE_DOSFS */
  548.     }
  549. /*******************************************************************************
  550. *
  551. * pccardAtaCscIntr - ATA controller PCMCIA card status change interrupt handler.
  552. *
  553. * RETURNS: OK (always).
  554. */
  555. LOCAL STATUS pccardAtaCscIntr
  556.     (
  557.     int sock, /* socket no. */
  558.     int csc /* CSC bits */
  559.     )
  560.     {
  561.     PCMCIA_CTRL *pCtrl = &pcmciaCtrl;
  562.     PCMCIA_CARD *pCard = &pCtrl->card[sock];
  563.     ATA_RESOURCE *pAtaResource = (ATA_RESOURCE *)pCard->pResource;
  564.     ATA_CTRL *pAtaCtrl = &ataCtrl[pCard->ctrl];
  565.     /* hot insertion */
  566.     /* hot removal */
  567.     if ((csc & PC_DETECT) && ((pCard->cardStatus & PC_DETECT) == 0x0))
  568. {
  569.         if (pAtaResource != NULL)
  570.             sysIntDisablePIC (pAtaResource->intLevel);
  571. pAtaCtrl->installed = FALSE;
  572. pAtaCtrl->changed = FALSE;
  573. semFlush (&pAtaCtrl->syncSem);
  574. pcmciaJobAdd ((VOIDFUNCPTR)semTerminate, (int)&pAtaCtrl->muteSem,
  575.       0,0,0,0,0);
  576. }
  577.     return (OK);
  578.     }
  579. #endif /* INCLUDE_ATA */
  580. #ifdef INCLUDE_SRAM
  581. /*******************************************************************************
  582. *
  583. * pccardSramEnabler - enable the PCMCIA-SRAM driver
  584. *
  585. * This routine enables the PCMCIA-SRAM driver.
  586. *
  587. * RETURNS:
  588. * OK, ERROR_FIND if there is no SRAM card, or ERROR if another error occurs.
  589. */
  590. STATUS pccardSramEnabler
  591.     (
  592.     int   sock,   /* socket no. */
  593.     SRAM_RESOURCE *pSramResource, /* pointer to SRAM resources */
  594.     int   numEnt,   /* number of SRAM resource entries */
  595.     FUNCPTR   showRtn    /* SRAM show routine */
  596.     )
  597.     {
  598.     PCMCIA_CTRL *pCtrl = &pcmciaCtrl;
  599.     PCMCIA_CHIP *pChip = &pCtrl->chip;
  600.     PCMCIA_CARD *pCard = &pCtrl->card[sock];
  601.     BOOL typeExtended = FALSE;
  602.     BOOL speedExtended = FALSE;
  603.     int formatOffset = 0;
  604.     int formatNbytes = 0;
  605.     int deviceType = 0;
  606.     int deviceSize = 0;
  607.     int functionCode = NONE;
  608.     PCCARD_RESOURCE *pResource;
  609.     DL_NODE *pNode;
  610.     CIS_TUPLE *pTuple;
  611.     CIS_BYTE4 offset;
  612.     CIS_BYTE4 nbytes;
  613.     int unit;
  614.     int size;
  615.     int flag;
  616.     char *pChar;
  617.     if ((!pChip->installed) || (sock >= numEnt))
  618. return (ERROR);
  619.     for (pNode = DLL_FIRST (&pCard->cisTupleList);
  620.  pNode != NULL;
  621.  pNode = DLL_NEXT(pNode))
  622. {
  623. pTuple = (CIS_TUPLE *)((char *)pNode + sizeof (DL_NODE));
  624. pChar = (char *)pTuple + sizeof (CIS_TUPLE);
  625. switch (pTuple->code)
  626.     {
  627.     case CISTPL_FUNCID:
  628. functionCode = *pChar;
  629. break;
  630.     case CISTPL_DEVICE:
  631. deviceType = *pChar & 0xf0;
  632. if (deviceType == DTYPE_EXTEND)
  633.     typeExtended = TRUE;
  634. if ((*pChar & 0x0f) == DSPEED_EXT)
  635.     speedExtended = TRUE;
  636. pChar++;
  637. while (speedExtended)
  638.     if ((*pChar++ & 0x80) == 0)
  639. speedExtended = FALSE;
  640. while (typeExtended)
  641.     if ((*pChar++ & 0x80) == 0)
  642. typeExtended = FALSE;
  643. unit = ((*pChar & 0xf8) >> 3) + 1;
  644. size = sramSizeTable [*pChar & 0x07];
  645. deviceSize = unit * size;
  646. break;
  647.     case CISTPL_FORMAT:
  648. pChar += 2;
  649. offset.c[0] = *pChar++;
  650. offset.c[1] = *pChar++;
  651. offset.c[2] = *pChar++;
  652. offset.c[3] = *pChar++;
  653. nbytes.c[0] = *pChar++;
  654. nbytes.c[1] = *pChar++;
  655. nbytes.c[2] = *pChar++;
  656. nbytes.c[3] = *pChar++;
  657. formatOffset = offset.l;
  658. formatNbytes = nbytes.l;
  659. break;
  660.     }
  661. }
  662.     /* configure the card with a resource which is assigned for the socket */
  663.     if (((functionCode == NONE) || (functionCode == FUNC_MEMORY)) &&
  664.         ((deviceType == DTYPE_SRAM) || (formatNbytes != 0)))
  665. {
  666.         sramResourceNumEnt = numEnt;
  667.         pSramResource += sock;
  668.         pResource = &pSramResource->resource;
  669.         pCard->type = PCCARD_SRAM;
  670.         pCard->sock = sock;
  671.         pCard->detected = TRUE;
  672.         pCard->pResource = pResource;
  673.         pCard->cardStatus = (* pChip->status)(sock);
  674.         pCard->cscIntr = (FUNCPTR)pccardSramCscIntr;
  675.         pCard->showRtn = (FUNCPTR)showRtn;
  676.         pResource->memStart &= 0xfffff000;
  677.         pResource->memStop |= 0x00000fff;
  678.         pResource->memOffset = formatOffset;
  679.         if (deviceSize != 0)
  680.     pResource->memLength = deviceSize;
  681.         else if (formatNbytes != 0)
  682.     pResource->memLength = formatNbytes;
  683. else
  684.     return (ERROR);
  685.         flag = PC_PWR_AUTO;
  686.         if (pResource->vcc == PCCARD_5V)
  687.     flag |= PC_VCC_5V;
  688.         else if (pResource->vcc == PCCARD_3V)
  689.     flag |= PC_VCC_3V;
  690.         if (pResource->vpp == PCCARD_5V)
  691.     flag |= PC_VPP_5V;
  692.         else if (pResource->vpp == PCCARD_12V)
  693.     flag |= PC_VPP_12V;
  694.         if ((* pChip->flagSet)(sock, flag) != OK)
  695.     return (ERROR);
  696.         if ((pCard->initStatus = sramDrv (sock)) != OK)
  697.     return (ERROR);
  698.         pCard->installed = TRUE;
  699. }
  700.     else
  701. return (ERROR_FIND);
  702.     /* return if we didn't recognize the card or didn't install the driver */
  703.     if (!pCard->installed)
  704. return (ERROR);
  705.     if (pCard->pBlkDev != NULL)
  706. free ((char *)pCard->pBlkDev);
  707.     size = pResource->memLength / DEFAULT_SEC_SIZE - 1; /* number of blocks */
  708.     pCard->pBlkDev = sramDevCreate (sock, DEFAULT_SEC_SIZE, size, size, 0);
  709.     if (pCard->pBlkDev == (BLK_DEV *)NULL)
  710. {
  711. printErr ("Error during sramDevCreate: %xn", errno);
  712. return (ERROR);
  713. }
  714. #ifdef INCLUDE_DOSFS
  715.     /*
  716.      * init DOS device with new block device driver and
  717.      * valid disk cache size
  718.      */
  719.     return pccardDosDevCreate( sock, pCard->pBlkDev,
  720. SRAM_CACHE_SIZE, USE_PARTITIONS );
  721. #else
  722.     return (OK);
  723. #endif /* INCLUDE_DOSFS */
  724.     }
  725. /*******************************************************************************
  726. *
  727. * pccardSramCscIntr - PCMCIA memory card status change interrupt handler
  728. *
  729. * RETURNS: OK, or ERROR if the CSC event is Ready.
  730. */
  731. LOCAL STATUS pccardSramCscIntr
  732.     (
  733.     int sock, /* socket no. */
  734.     int csc /* CSC bits */
  735.     )
  736.     {
  737.     PCMCIA_CTRL *pCtrl = &pcmciaCtrl;
  738.     PCMCIA_CARD *pCard = &pCtrl->card[sock];
  739.     SEM_ID muteSemID = &sramCtrl.muteSem[sock];
  740.     SEM_ID syncSemID = &sramCtrl.syncSem[sock];
  741.     /* hot insertion */
  742.     /* hot removal */
  743.     if ((csc & PC_DETECT) && ((pCard->cardStatus & PC_DETECT) == 0x0))
  744. {
  745. semFlush (syncSemID);
  746. pcmciaJobAdd ((VOIDFUNCPTR)semTerminate, (int)muteSemID, 0, 0, 0, 0, 0);
  747. }
  748.     /* card is ready */
  749.     if (csc & PC_READY)
  750. {
  751. semGive (syncSemID);
  752. return (ERROR);
  753. }
  754.     /* other card status changes */
  755.     if ((csc & PC_BATDEAD) && (_func_logMsg != NULL))
  756. (* _func_logMsg) ("sramDrv: socket=%d Battery deadn",
  757.   sock, 0, 0, 0, 0, 0);
  758.     if ((csc & PC_BATWARN) && (_func_logMsg != NULL))
  759. (* _func_logMsg) ("sramDrv: socket=%d Battery warnn",
  760.   sock, 0, 0, 0, 0, 0);
  761.     if ((csc & PC_WRPROT) && (_func_logMsg != NULL))
  762. (* _func_logMsg) ("sramDrv: socket=%d Write protectn",
  763.   sock, 0, 0, 0, 0, 0);
  764.     return (OK);
  765.     }
  766. #endif /* INCLUDE_SRAM */
  767. #ifdef INCLUDE_ELT
  768. /*******************************************************************************
  769. *
  770. * pccardEltEnabler - enable the PCMCIA Etherlink III card
  771. *
  772. * This routine enables the PCMCIA Etherlink III (ELT) card.
  773. *
  774. * RETURNS:
  775. *
  776. * OK, ERROR_FIND if there is no ELT card, or ERROR if another error occurs.
  777. */
  778. STATUS pccardEltEnabler
  779.     (
  780.     int  sock, /* socket no. */
  781.     ELT_RESOURCE *pEltResource, /* pointer to ELT resources */
  782.     int  numEnt, /* number of ELT resource entries */
  783.     FUNCPTR  showRtn  /* show routine */
  784.     )
  785.     {
  786.     PCMCIA_CTRL *pCtrl = &pcmciaCtrl;
  787.     PCMCIA_CHIP *pChip = &pCtrl->chip;
  788.     PCMCIA_CARD *pCard = &pCtrl->card[sock];
  789.     DL_LIST *pList = &pCard->cisTupleList;
  790.     PCCARD_RESOURCE *pResource = &pEltResource->resource;
  791.     short manufacturerID0 = 0;
  792.     short manufacturerID1 = 0;
  793.     int functionCode = 0;
  794.     DL_NODE *pNode;
  795.     PCMCIA_IOWIN pcmciaIowin;
  796.     CIS_TUPLE *pTuple;
  797.     char *pChar;
  798.     int flag;
  799.     int ctrl;
  800.     int sock0;
  801.     if (!pChip->installed)
  802. return (ERROR);
  803.     for (pNode = DLL_FIRST (pList); pNode != NULL; pNode = DLL_NEXT(pNode))
  804. {
  805. pTuple = (CIS_TUPLE *)((char *)pNode + sizeof (DL_NODE));
  806. pChar = (char *)pTuple + sizeof (CIS_TUPLE);
  807. switch (pTuple->code)
  808.     {
  809.     case CISTPL_FUNCID:
  810. functionCode = *pChar;
  811. break;
  812.     case CISTPL_MANFID:
  813. manufacturerID0 = *(short *)pChar;
  814. manufacturerID1 = *(short *)(pChar+2);
  815. break;
  816.     }
  817. }
  818.     /* return if we didn't recognize the card */
  819.     if ((functionCode != FUNC_LAN) ||
  820.         (manufacturerID0 != ELT_PCMCIA_ID0) ||
  821.         ((manufacturerID1 != ELT_PCMCIA_ID1_589) &&
  822.  (manufacturerID1 != ELT_PCMCIA_ID1_562)))
  823. return (ERROR_FIND);
  824.     /* get un-used resource */
  825.     for (ctrl = 0; ctrl < numEnt; ctrl++)
  826. {
  827.         pResource = &pEltResource->resource;
  828. for (sock0 = 0; sock0 < pChip->socks; sock0++)
  829.     {
  830.          PCMCIA_CARD *pCard0 = &pCtrl->card[sock0];
  831.     if (pCard0->pResource == pResource)
  832. break;
  833.     }
  834. if (sock0 == pChip->socks)
  835.     break;
  836. pEltResource++;
  837. }
  838.     if (ctrl == numEnt)
  839. {
  840. if (_func_logMsg != NULL)
  841.     (* _func_logMsg) ("pccardEltEnabler: sock=%d out of resourcen",
  842.       sock, 0, 0, 0, 0, 0);
  843. return (ERROR);
  844. }
  845.     /* configure the card with the resource */
  846.     pCard->type = PCCARD_LAN_ELT;
  847.     pCard->sock = sock;
  848.     pCard->ctrl = ctrl;
  849.     pCard->detected = TRUE;
  850.     pCard->pResource = pResource;
  851.     pCard->cardStatus = (* pChip->status)(sock);
  852.     pCard->cscIntr = (FUNCPTR)pccardEltCscIntr;
  853.     pCard->showRtn = (FUNCPTR)showRtn;
  854.     flag = PC_PWR_AUTO | PC_IOCARD;
  855.     if (pResource->vcc == PCCARD_5V)
  856.         flag |= PC_VCC_5V;
  857.     else if (pResource->vcc == PCCARD_3V)
  858.         flag |= PC_VCC_3V;
  859.     if (pResource->vpp == PCCARD_5V)
  860.         flag |= PC_VPP_5V;
  861.     else if (pResource->vpp == PCCARD_12V)
  862.         flag |= PC_VPP_12V;
  863.     if ((* pChip->flagSet)(sock, flag) != OK)
  864.         return (ERROR);
  865.     cisConfigregSet (sock, CONFIG_STATUS_REG, 0x00);
  866.     cisConfigregSet (sock, CONFIG_OPTION_REG, COR_LEVIREQ | 0x03);
  867.     pcmciaIowin.window = PCCARD_IOWIN0;
  868.     pcmciaIowin.flags = MAP_ACTIVE | MAP_16BIT;
  869.     pcmciaIowin.extraws = pResource->ioExtraws;
  870.     pcmciaIowin.start = pResource->ioStart[0];
  871.     pcmciaIowin.stop = pResource->ioStop[0];
  872.     if ((* pChip->iowinSet)(sock, &pcmciaIowin) != OK)
  873.         return (ERROR);
  874.     if ((* pChip->irqSet)(sock, pEltResource->intLevel) != OK)
  875.         return (ERROR);
  876.     sysOutWord (pResource->ioStart[0] + ELT_COMMAND, SELECT_WINDOW|WIN_CONFIG);
  877.     sysOutWord (pResource->ioStart[0] + RESOURCE_CONFIG, 0x3f00);
  878.     if (pCard->pNetIf != NULL)
  879. free (pCard->pNetIf);
  880.     if ((pCard->pNetIf = malloc (sizeof(NETIF))) == NULL)
  881. return (ERROR);
  882.     pCard->pNetIf->ifName = "pcmcia";
  883.     pCard->pNetIf->attachRtn = eltattach;
  884.     pCard->pNetIf->arg1 = (char *)pResource->ioStart[0];
  885.     pCard->pNetIf->arg2 = pEltResource->intVector;
  886.     pCard->pNetIf->arg3 = pEltResource->intLevel;
  887.     pCard->pNetIf->arg4 = pEltResource->rxFrames;
  888.     pCard->pNetIf->arg5 = pEltResource->connector;
  889.     pCard->pNetIf->arg6 = (int)pCard->pNetIf->ifName;
  890.     pCard->pNetIf->arg7 = 0;
  891.     pCard->pNetIf->arg8 = 0;
  892.     pCard->installed = TRUE;
  893.     return (OK);
  894.     }
  895. /*******************************************************************************
  896. *
  897. * pccardEltCscIntr - ELT controller PCMCIA card status change interrupt handler.
  898. *
  899. * RETURNS: OK (always).
  900. */
  901. LOCAL STATUS pccardEltCscIntr
  902.     (
  903.     int sock, /* socket no. */
  904.     int csc /* CSC bits */
  905.     )
  906.     {
  907.     PCMCIA_CTRL *pCtrl = &pcmciaCtrl;
  908.     PCMCIA_CARD *pCard = &pCtrl->card[sock];
  909.     ELT_RESOURCE *pEltResource = (ELT_RESOURCE *)pCard->pResource;
  910.     ELT_CTRL *pDrvCtrl = pEltCtrl [pCard->ctrl];
  911.     /* card is inserted */
  912.     /* card is removed */
  913.     if ((csc & PC_DETECT) && ((pCard->cardStatus & PC_DETECT) == 0x0))
  914. {
  915.         if (pCard->pResource != 0)
  916.             sysIntDisablePIC (pEltResource->intLevel);
  917.         pDrvCtrl->idr.ac_if.if_flags = 0;
  918.         pDrvCtrl->attached = FALSE;
  919. }
  920.     return (OK);
  921.     }
  922. #endif /* INCLUDE_ELT */
  923. #ifdef INCLUDE_TFFS
  924. /*******************************************************************************
  925. *
  926. * pccardTffsEnabler - enable the PCMCIA-TFFS driver
  927. *
  928. * This routine enables the PCMCIA-TFFS driver.
  929. *
  930. * RETURNS:
  931. * OK, ERROR_FIND if there is no TFFS(Flash) card, or ERROR if another error occurs.
  932. */
  933. STATUS pccardTffsEnabler
  934.     (
  935.     int   sock,   /* socket no. */
  936.     TFFS_RESOURCE *pTffsResource, /* pointer to TFFS resources */
  937.     int   numEnt,   /* number of SRAM resource entries */
  938.     FUNCPTR   showRtn    /* TFFS show routine */
  939.     )
  940.     {
  941.     PCMCIA_CTRL *pCtrl = &pcmciaCtrl;
  942.     PCMCIA_CHIP *pChip = &pCtrl->chip;
  943.     PCMCIA_CARD *pCard = &pCtrl->card[sock];
  944.     int deviceType = 0;
  945.     PCCARD_RESOURCE *pResource;
  946.     DL_NODE *pNode;
  947.     CIS_TUPLE *pTuple;
  948.     int flag;
  949.     char *pChar;
  950.     if ((!pChip->installed) || (sock >= numEnt))
  951. return (ERROR);
  952.     for (pNode = DLL_FIRST (&pCard->cisTupleList);
  953.  pNode != NULL;
  954.  pNode = DLL_NEXT(pNode))
  955. {
  956. pTuple = (CIS_TUPLE *)((char *)pNode + sizeof (DL_NODE));
  957. pChar = (char *)pTuple + sizeof (CIS_TUPLE);
  958. switch (pTuple->code)
  959.     {
  960.     case CISTPL_DEVICE:
  961. deviceType = *pChar & 0xf0;
  962. break;
  963.     }
  964. }
  965.     /* configure the card with a resource which is assigned for the socket */
  966.     if (deviceType == DTYPE_FLASH)
  967. {
  968.         pTffsResource += sock;
  969.         pResource = &pTffsResource->resource;
  970.         pCard->type = PCCARD_FLASH;
  971.         pCard->sock = sock;
  972.         pCard->detected = TRUE;
  973.         pCard->pResource = pResource;
  974.         pCard->cardStatus = (* pChip->status)(sock);
  975.         pCard->cscIntr = (FUNCPTR)pccardTffsCscIntr;
  976.         pCard->showRtn = (FUNCPTR)showRtn;
  977.         pResource->memStart &= 0xfffff000;
  978.         pResource->memStop |= 0x00000fff;
  979.         flag = PC_PWR_AUTO;
  980.         if (pResource->vcc == PCCARD_5V)
  981.     flag |= PC_VCC_5V;
  982.         else if (pResource->vcc == PCCARD_3V)
  983.     flag |= PC_VCC_3V;
  984.         if ((* pChip->flagSet)(sock, flag) != OK)
  985.     return (ERROR);
  986.         if ((pCard->initStatus = tffsDrv ()) != OK) /* just in case */
  987.     return (ERROR);
  988.         pCard->installed = TRUE;
  989. }
  990.     else
  991. return (ERROR_FIND);
  992.     /* return if we didn't recognize the card or didn't install the driver */
  993.     if (!pCard->installed)
  994. return (ERROR);
  995.     /* we assume that a media on the socket is formated by tffsDevFormat() */
  996.     if (pcDriveNo[sock] == NONE)
  997. {
  998. printErr ("pccardTffs:pcDriveNo[%d] == NONEn", sock);
  999. return ERROR ;
  1000. }
  1001.     if (pCard->pBlkDev != NULL)
  1002. free ((char *)pCard->pBlkDev);
  1003.     pCard->pBlkDev = tffsDevCreate (pcDriveNo[sock], TRUE);
  1004.     if (pCard->pBlkDev == (BLK_DEV *)NULL)
  1005.     {
  1006.     printErr ("Error during tffsDevCreate: %xn", errno);
  1007.     return (ERROR);
  1008.     }
  1009.     if ((pcmciaDebug) && (_func_logMsg != NULL))
  1010. (* _func_logMsg) ("TFFS sock=%d blkDev=%xn",
  1011.       sock,pCard->pBlkDev , 0, 0, 0, 0);
  1012. #ifdef INCLUDE_DOSFS
  1013.     /*
  1014.      * init DOS device with new block device driver and
  1015.      * valid disk cache size
  1016.      */
  1017.     return pccardDosDevCreate( sock, pCard->pBlkDev,
  1018. TFFS_CACHE_SIZE, USE_PARTITIONS );
  1019. #else
  1020.     printErr ("DosFs not included, card in socket %d ignoredn", sock);
  1021. #endif /* INCLUDE_DOSFS */
  1022.     return (OK);
  1023.     }
  1024. /*******************************************************************************
  1025. *
  1026. * pccardTffsCscIntr - PCMCIA flash card status change interrupt handler
  1027. *
  1028. * RETURNS: OK, or ERROR if the CSC event is Ready.
  1029. */
  1030. LOCAL STATUS pccardTffsCscIntr
  1031.     (
  1032.     int sock, /* socket no. */
  1033.     int csc /* CSC bits */
  1034.     )
  1035.     {
  1036.     PCMCIA_CTRL *pCtrl = &pcmciaCtrl;
  1037.     PCMCIA_CARD *pCard = &pCtrl->card[sock];
  1038.     /* hot insertion */
  1039.     /* hot removal */
  1040.     if ((csc & PC_DETECT) && ((pCard->cardStatus & PC_DETECT) == 0x0))
  1041. {
  1042. }
  1043.     /* card is ready */
  1044.     if (csc & PC_READY)
  1045. {
  1046. return (ERROR);
  1047. }
  1048.     /* other card status changes */
  1049.     if ((csc & PC_WRPROT) && (_func_logMsg != NULL))
  1050. (* _func_logMsg) ("TFFS: socket=%d Write protectn",
  1051.   sock, 0, 0, 0, 0, 0);
  1052.     return (OK);
  1053.     }
  1054. #endif /* INCLUDE_TFFS */