home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / lxapi32.zip / Dev32 / lxrm.c < prev    next >
C/C++ Source or Header  |  2002-04-26  |  14KB  |  469 lines

  1. /* $Id: lxrm.c,v 1.2 2002/04/26 23:08:56 smilcke Exp $ */
  2.  
  3. /*
  4.  * lxrm.c
  5.  * Autor:               Stefan Milcke
  6.  * Erstellt am:         20.02.2002
  7.  * Letzte Aenderung am: 08.04.2002
  8.  *
  9. */
  10.  
  11. extern "C"
  12. {
  13. #define INCL_NOPMAPI
  14. #define INCL_DOSINFOSEG
  15. #include <os2.h>
  16. #include <lxrmcall.h>
  17. #include <kee.h>
  18. }
  19.  
  20. #include <devhelp.h>
  21. #include <devtype.h>
  22. #include <devrp.h>
  23. #include <ldefos2.h>
  24.  
  25. #include "ver_32.h"
  26.  
  27. #include <linux/kernel.h>
  28. #include <linux/init.h>
  29. #include <linux/poll.h>
  30. #include <asm/uaccess.h>
  31. #include <asm/hardirq.h>
  32. #include <asm/io.h>
  33. #include <asm/delay.h>
  34. #include <linux/pci.h>
  35. #include <linux/slab.h>
  36. #include <linux/i2c.h>
  37.  
  38. static HDRIVER hDriver=NULL;
  39. static HADAPTER hPCIAdap=NULL;
  40. static HDEVICE hPCIDev=NULL;
  41. static HADAPTER hI2CAdap=NULL;
  42. static HADAPTER hIRQAdap=NULL;
  43. static HADAPTER hMEMAdap=NULL;
  44. static char LXDRIVER_NAME[]="LXAPI32.SYS";
  45. static char LXVENDOR_NAME[]="Stefan Milcke";
  46.  
  47. extern int getBuildDay(void);
  48. extern int getBuildMonth(void);
  49. extern int getBuildYear(void);
  50.  
  51. //--------------------------- OS2_init_driver_struct ---------------------------
  52. extern "C"
  53. void OS2_init_driver_struct(PDRIVERSTRUCT pDriver)
  54. {
  55.  pDriver->DrvrName=(PSZ)LXDRIVER_NAME;
  56.  pDriver->DrvrDescript=(PSZ)"Linux driver";
  57.  pDriver->VendorName=(PSZ)LXVENDOR_NAME;
  58.  pDriver->MajorVer=LX32_DRV_MAJOR_VERSION;
  59.  pDriver->MinorVer=LX32_DRV_MINOR_VERSION;
  60.  pDriver->Date.Year=getBuildYear();
  61.  pDriver->Date.Month=getBuildMonth();
  62.  pDriver->Date.Day=getBuildDay();
  63.  pDriver->DrvrFlags=0;
  64.  pDriver->DrvrType=0;
  65.  pDriver->DrvrSubType=0;
  66.  pDriver->DrvrCallback=NULL;
  67. }
  68.  
  69. //--------------------------- OS2_create_pci_adapter ---------------------------
  70. extern "C"
  71. unsigned long OS2_create_pci_adapter(void)
  72. {
  73.  unsigned long rc=0;
  74.  if(!hPCIAdap)
  75.  {
  76.   ADAPTERSTRUCT AdapterStruct;
  77.   ADJUNCT AdapNum;
  78.   AdapterStruct.AdaptDescriptName=(PSZ)"Linux PCI bus";
  79.   AdapterStruct.AdaptFlags=AS_NO16MB_ADDRESS_LIMIT;
  80.   AdapterStruct.BaseType=AS_BASE_RESERVED;
  81.   AdapterStruct.SubType=AS_SUB_OTHER;
  82.   AdapterStruct.InterfaceType=AS_INTF_GENERIC;
  83.   AdapterStruct.HostBusType=AS_HOSTBUS_PCI;
  84.   AdapterStruct.HostBusWidth=AS_BUSWIDTH_32BIT;
  85.   AdapterStruct.pAdjunctList=&AdapNum;
  86.   AdapNum.pNextAdj=NULL;
  87.   AdapNum.AdjLength=sizeof(ADJUNCT);
  88.   AdapNum.AdjType=ADJ_ADAPTER_NUMBER;
  89.   AdapNum.Adapter_Number=0;
  90.   rc=RM32CreateAdapter(hDriver,&hPCIAdap,&AdapterStruct,0,NULL);
  91.  }
  92.  if(!rc && !hPCIDev)
  93.  {
  94.   DEVICESTRUCT DevStruct;
  95.   DevStruct.DevDescriptName=(PSZ)"Linux PCI device tree";
  96.   DevStruct.DevFlags=DS_FIXED_LOGICALNAME;
  97.   DevStruct.DevType=DS_TYPE_UNKNOWN;
  98.   DevStruct.pAdjunctList=NULL;
  99.   rc=RM32CreateDevice(hDriver,&hPCIDev,&DevStruct,hPCIAdap,NULL);
  100.  }
  101.  return rc;
  102. }
  103.  
  104. //---------------------------- initResourceManager -----------------------------
  105. extern "C"
  106. unsigned long initResourceManager(void)
  107. {
  108.  unsigned long rc;
  109.  DRIVERSTRUCT DriverStruct;
  110. // TestContextHook();
  111.  OS2_init_driver_struct(&DriverStruct);
  112.  DriverStruct.DrvrDescript=(PSZ)"Linux API support layer";
  113.  DriverStruct.DrvrType=DRT_SERVICE;
  114.  DriverStruct.DrvrSubType=DRS_CONFIG;
  115.  rc=RM32CreateDriver(&DriverStruct,&hDriver);
  116.  return rc;
  117. }
  118.  
  119. //--------------------------- OS2_pci_convert_class ----------------------------
  120. static void OS2_pci_convert_class(struct pci_dev *dev,PULONG pCl,PULONG pScl)
  121. {
  122.  ULONG cv=128;
  123.  ULONG cl=(dev->pciclass>>16)&0x0f;
  124.  ULONG scl=(dev->pciclass>>8)&0x0f;
  125.  ULONG pi=(dev->pciclass)&0x0f;
  126.  if(cl<=0x0d)
  127.  {
  128.   if(scl<128)
  129.   {
  130.    scl++;
  131.    switch(cl)
  132.    {
  133.     case AS_BASE_MSD:
  134.     case AS_BASE_PERIPH:
  135.      cv=4;
  136.      break;
  137.     case AS_BASE_NETWORK:
  138.     case AS_BASE_COMM:
  139.     case AS_BASE_INPUT:
  140.      cv=3;
  141.      break;
  142.     case AS_BASE_DISPLAY:
  143.     case AS_BASE_MMEDIA:
  144.      cv=2;
  145.      break;
  146.     case AS_BASE_MEMORY:
  147.     case AS_BASE_PCMCIA:
  148.      cv=1;
  149.      break;
  150.     case AS_BASE_BRIDGE:
  151.     case AS_BASE_DOCK:
  152.     case AS_BASE_CPU:
  153.     case AS_BASE_BIOS_ROM:
  154.      cv=0;
  155.      break;
  156.     default:
  157.      cv=0;
  158.      break;
  159.    }
  160.    if(scl>cv)
  161.     scl=AS_SUB_OTHER;
  162.   }
  163.  }
  164.  else
  165.  {
  166.   cl=AS_BASE_RESERVED;
  167.   scl=AS_SUB_OTHER;
  168.  }
  169.  *pCl=cl;
  170.  *pScl=scl;
  171. }
  172.  
  173. //---------------------------- OS2_pci_name_device -----------------------------
  174. extern "C"
  175. unsigned long OS2_pci_name_device(struct pci_dev *dev,char *vname,char *dname,char *sname)
  176. {
  177.  unsigned long rc=0;
  178.  struct lxrm_subadapter *rm_adap=dev->rm_subadapter;
  179.  ULONG cl=AS_BASE_RESERVED,scl=AS_SUB_OTHER;
  180.  if(rm_adap && !rm_adap->hAdapter)
  181.  {
  182.   ADAPTERSTRUCT AdapStruct;
  183.   PADAPTERSTRUCT pAdap=rm_adap->pAdapter;
  184.   static int devno=0;
  185.   ADJUNCT AdapNumber;
  186.   ADJUNCT AdapDeviceNr;
  187.   ADJUNCT AdapPCI_DevFunc;
  188.   AdapNumber.pNextAdj=&AdapDeviceNr;
  189.   AdapDeviceNr.pNextAdj=&AdapPCI_DevFunc;
  190.   AdapPCI_DevFunc.pNextAdj=NULL;
  191.   AdapNumber.AdjLength=sizeof(ADJUNCT);
  192.   AdapDeviceNr.AdjLength=sizeof(ADJUNCT);
  193.   AdapPCI_DevFunc.AdjLength=sizeof(ADJUNCT);
  194.   AdapNumber.AdjType=ADJ_ADAPTER_NUMBER;
  195.   AdapDeviceNr.AdjType=ADJ_DEVICE_NUMBER;
  196.   AdapPCI_DevFunc.AdjType=ADJ_PCI_DEVFUNC;
  197.   if(dev->bus)
  198.    AdapNumber.Adapter_Number=dev->bus->number;
  199.   else
  200.    AdapNumber.Adapter_Number=0;
  201.   AdapDeviceNr.Device_Number=devno;
  202.   AdapPCI_DevFunc.PCI_DevFunc=(USHORT)dev->devfn;
  203.   if(NULL==rm_adap->hDriver)
  204.    rm_adap->hDriver=hDriver;
  205.   if(NULL==rm_adap->hParentDevice)
  206.   {
  207.    rc=OS2_create_pci_adapter();
  208.    if(rc)
  209.     return rc;
  210.    rm_adap->hParentDevice=hPCIDev;
  211.   }
  212.   if(NULL==pAdap)
  213.   {
  214.    pAdap=&AdapStruct;
  215.    OS2_pci_convert_class(dev,&cl,&scl);
  216.    AdapStruct.AdaptDescriptName=(PSZ)dev->name;
  217.    AdapStruct.AdaptFlags=AS_NO16MB_ADDRESS_LIMIT;
  218.    AdapStruct.BaseType=(USHORT)cl;
  219.    AdapStruct.SubType=(USHORT)scl;
  220.    AdapStruct.InterfaceType=AS_INTF_GENERIC;
  221.    AdapStruct.HostBusType=AS_HOSTBUS_PCI;
  222.    AdapStruct.HostBusWidth=AS_BUSWIDTH_32BIT;
  223.    AdapStruct.pAdjunctList=&AdapNumber;
  224.    AdapDeviceNr.Device_Number=devno++;
  225.    AdapPCI_DevFunc.PCI_DevFunc=(unsigned short)dev->devfn;
  226.   }
  227.   rc=RM32CreateAdapter(rm_adap->hDriver
  228.                        ,&(rm_adap->hAdapter)
  229.                        ,pAdap
  230.                        ,rm_adap->hParentDevice
  231.                        ,NULL);
  232.   if(0==rc && 0!=dev->subsystem_vendor)
  233.   {
  234.    struct lxrm_subdevice *rm_dev=dev->rm_subdevice;
  235.    if(rm_dev && !rm_dev->hDevice)
  236.    {
  237.     DEVICESTRUCT DevStruct;
  238.     PDEVICESTRUCT pDev=rm_dev->pDevice;
  239.     if(NULL==rm_dev->hParentAdapter)
  240.      rm_dev->hParentAdapter=rm_adap->hAdapter;
  241.     if(NULL==pDev)
  242.     {
  243.      pDev=&DevStruct;
  244.      DevStruct.DevDescriptName=(PSZ)sname;
  245.      DevStruct.DevFlags=DS_FIXED_LOGICALNAME;
  246.      DevStruct.DevType=DS_TYPE_UNKNOWN;
  247.      DevStruct.pAdjunctList=NULL;
  248.     }
  249.     if(NULL==rm_dev->hDriver)
  250.      rm_dev->hDriver=hDriver;
  251.     rc=RM32CreateDevice(rm_dev->hDriver
  252.                         ,&(dev->rm_subdevice->hDevice)
  253.                         ,pDev
  254.                         ,rm_dev->hParentAdapter
  255.                         ,NULL);
  256.    }
  257.   }
  258.  }
  259.  return rc;
  260. }
  261.  
  262. //-------------------------- OS2_pci_register_driver ---------------------------
  263. extern "C"
  264. unsigned long OS2_pci_register_driver(struct pci_driver *drv)
  265. {
  266.  unsigned long rc=0;
  267.  if((NULL!=drv->rm_driver) && (0==drv->rm_driver->hDriver))
  268.  {
  269.   DRIVERSTRUCT DrvStruct;
  270.   PDRIVERSTRUCT pDrv=drv->rm_driver->pDriver;
  271.   if(NULL==pDrv)
  272.   {
  273.    pDrv=&DrvStruct;
  274.    OS2_init_driver_struct(pDrv);
  275.    DrvStruct.DrvrDescript=(PSZ)"Linux PCI support layer";
  276.    DrvStruct.DrvrType=DRT_SERVICE;
  277.   }
  278.   rc=RM32CreateDriver(pDrv,&(drv->rm_driver->hDriver));
  279.  }
  280.  return rc;
  281. }
  282.  
  283. //------------------------- OS2_pci_unregister_driver --------------------------
  284. extern "C"
  285. unsigned long OS2_pci_unregister_driver(struct pci_driver *drv)
  286. {
  287.  unsigned long rc=0;
  288.  if((NULL!=drv->rm_driver) && (0!=drv->rm_driver->hDriver))
  289.  {
  290.   rc=RM32DestroyDriver(drv->rm_driver->hDriver);
  291.   drv->rm_driver->hDriver=0;
  292.  }
  293.  return rc;
  294. }
  295.  
  296. //-------------------------- OS2_pci_announce_device ---------------------------
  297. extern "C"
  298. unsigned long OS2_pci_announce_device(struct pci_driver *drv,struct pci_dev *dev)
  299. {
  300.  unsigned long rc=0;
  301.  if((NULL!=dev->rm_device) && (0==dev->rm_device->hDevice))
  302.  {
  303.   DEVICESTRUCT DevStruct;
  304.   PDEVICESTRUCT pDev=dev->rm_device->pDevice;
  305.   HDRIVER hDrvr=dev->rm_device->hDriver;
  306.   HADAPTER hAdap=dev->rm_device->hAdapter;
  307.   if(NULL==hDrvr)
  308.    hDrvr=hDriver;
  309.   if(NULL==pDev)
  310.   {
  311.    pDev=&DevStruct;
  312.    DevStruct.DevDescriptName=(PSZ)dev->name;
  313.    DevStruct.DevFlags=DS_FIXED_LOGICALNAME;
  314.    DevStruct.DevType=DS_TYPE_UNKNOWN;
  315.    DevStruct.pAdjunctList=NULL;
  316.   }
  317.   rc=RM32CreateDevice(hDrvr,&(dev->rm_device->hDevice),pDev,hAdap,NULL);
  318.  }
  319.  return rc;
  320. }
  321.  
  322. //----------------------------- OS2_i2c_add_driver -----------------------------
  323. extern "C"
  324. unsigned long OS2_i2c_add_driver(struct i2c_driver *driver)
  325. {
  326.  unsigned long rc=0;
  327.  if((NULL!=driver->rm_device) && (0==driver->rm_device->hDevice))
  328.  {
  329.   DEVICESTRUCT DevStruct;
  330.   PDEVICESTRUCT pDev=driver->rm_device->pDevice;
  331.   HDRIVER hDrvr=driver->rm_device->hDriver;
  332.   HADAPTER hAdap=driver->rm_device->hAdapter;
  333.   if(NULL==hDrvr)
  334.    hDrvr=hDriver;
  335.   if(NULL==pDev)
  336.   {
  337.    pDev=&DevStruct;
  338.    DevStruct.DevDescriptName=(PSZ)driver->name;
  339.    DevStruct.DevFlags=DS_FIXED_LOGICALNAME;
  340.    DevStruct.DevType=DS_TYPE_UNKNOWN;
  341.    DevStruct.pAdjunctList=NULL;
  342.   }
  343.   rc=RM32CreateDevice(hDrvr,&(driver->rm_device->hDevice),pDev,hAdap,NULL);
  344.  }
  345.  return rc;
  346. }
  347.  
  348. //----------------------------- OS2_i2c_del_driver -----------------------------
  349. extern "C"
  350. unsigned long OS2_i2c_del_driver(struct i2c_driver *driver)
  351. {
  352.  unsigned long rc=0;
  353.  if((NULL!=driver->rm_device) && (0==driver->rm_device->hDevice))
  354.  {
  355.   HDRIVER hDrvr=driver->rm_device->hDriver;
  356.   HADAPTER hAdap=driver->rm_device->hAdapter;
  357.   if(NULL==hDrvr)
  358.    hDrvr=hDriver;
  359.   rc=RM32DestroyDevice(hDrvr,driver->rm_device->hDevice);
  360.   driver->rm_device->hDevice=0;
  361.  }
  362.  return rc;
  363. }
  364.  
  365. //------------------------------ OS2_request_irq -------------------------------
  366. extern "C"
  367. unsigned long OS2_request_irq(struct lxrm_resource *rm_resource
  368.                               ,unsigned int irq,unsigned long flags)
  369. {
  370.  unsigned long rc=0;
  371.  if(rm_resource && (0==rm_resource->hResource))
  372.  {
  373.   RESOURCESTRUCT IRQResStruct;
  374.   PRESOURCESTRUCT pIRQResStruct=rm_resource->pResource;
  375.   if(0==rm_resource->hDriver)
  376.    rm_resource->hDriver=hDriver;
  377.   if(0==rm_resource->hAdapterOrDevice)
  378.    rm_resource->hAdapterOrDevice=hIRQAdap;
  379.   if(NULL==pIRQResStruct)
  380.   {
  381.    pIRQResStruct=&IRQResStruct;
  382.    pIRQResStruct->ResourceType=RS_TYPE_IRQ;
  383.    pIRQResStruct->IRQResource.IRQLevel=(unsigned short)irq;
  384.    pIRQResStruct->IRQResource.PCIIrqPin=RS_PCI_INT_NONE;
  385.    if(flags&SA_SHIRQ)
  386.     pIRQResStruct->IRQResource.IRQFlags=RS_IRQ_SHARED;
  387.    else
  388.     pIRQResStruct->IRQResource.IRQFlags=0;
  389.    pIRQResStruct->IRQResource.pfnIntHandler=0;
  390.   }
  391.   rc=RM32AllocResource(rm_resource->hDriver,&(rm_resource->hResource),pIRQResStruct);
  392.   if(0==rc)
  393.    rc=RM32ModifyResources(rm_resource->hDriver,rm_resource->hAdapterOrDevice
  394.                           ,RM_MODIFY_ADD,rm_resource->hResource);
  395.  }
  396.  return rc;
  397. }
  398.  
  399. //-------------------------------- OS2_free_irq --------------------------------
  400. extern "C"
  401. unsigned long OS2_free_irq(struct lxrm_resource *rm_resource,unsigned int irq)
  402. {
  403.  unsigned long rc=0;
  404.  if(rm_resource && (0!=rm_resource->hResource))
  405.  {
  406.   rc=RM32ModifyResources(rm_resource->hDriver,rm_resource->hAdapterOrDevice
  407.                          ,RM_MODIFY_DELETE,rm_resource->hResource);
  408.   if(0==rc)
  409.   {
  410.    rc=RM32DeallocResource(rm_resource->hDriver,rm_resource->hResource);
  411.    if(0==rc)
  412.     rm_resource->hAdapterOrDevice=0;
  413.   }
  414.  }
  415.  return rc;
  416. }
  417.  
  418. //----------------------------- OS2_request_region -----------------------------
  419. extern "C"
  420. unsigned long OS2_request_region(struct lxrm_resource *rm_resource
  421.                                  ,struct resource *a
  422.                                  ,unsigned long start,unsigned long n)
  423. {
  424.  unsigned long rc=0;
  425.  if(rm_resource && (0==rm_resource->hResource))
  426.  {
  427.   RESOURCESTRUCT MEMResStruct;
  428.   PRESOURCESTRUCT pMEMResStruct=rm_resource->pResource;
  429.   if(0==rm_resource->hDriver)
  430.    rm_resource->hDriver=hDriver;
  431.   if(0==rm_resource->hAdapterOrDevice)
  432.    rm_resource->hAdapterOrDevice=hMEMAdap;
  433.   if(NULL==pMEMResStruct)
  434.   {
  435.    pMEMResStruct=&MEMResStruct;
  436.    pMEMResStruct->ResourceType=RS_TYPE_MEM;
  437.    pMEMResStruct->MEMResource.MemBase=start;
  438.    pMEMResStruct->MEMResource.MemSize=n;
  439.    pMEMResStruct->MEMResource.MemFlags=RS_MEM_EXCLUSIVE;
  440.    pMEMResStruct->MEMResource.ReservedAlign=0;
  441.   }
  442.   rc=RM32AllocResource(rm_resource->hDriver,&(rm_resource->hResource),pMEMResStruct);
  443.   if(0==rc)
  444.    rc=RM32ModifyResources(rm_resource->hDriver,rm_resource->hAdapterOrDevice
  445.                           ,RM_MODIFY_ADD,rm_resource->hResource);
  446.  }
  447.  return rc;
  448. }
  449. //----------------------------- OS2_release_region -----------------------------
  450. extern "C"
  451. unsigned long OS2_release_region(struct lxrm_resource *rm_resource
  452.                                  ,struct resource *a
  453.                                  ,unsigned long start,unsigned long n)
  454. {
  455.  unsigned long rc=0;
  456.  if(rm_resource && (0!=rm_resource->hResource))
  457.  {
  458.   rc=RM32ModifyResources(rm_resource->hDriver,rm_resource->hAdapterOrDevice
  459.                          ,RM_MODIFY_DELETE,rm_resource->hResource);
  460.   if(0==rc)
  461.   {
  462.    rc=RM32DeallocResource(rm_resource->hDriver,rm_resource->hResource);
  463.    if(0==rc)
  464.     rm_resource->hAdapterOrDevice=0;
  465.   }
  466.  }
  467.  return rc;
  468. }
  469.