Structure of the SIS1100 driver
This part of the documentation will describe the basic structure of the driver. For an in-depth view I recommend reading the Apple documentation about the IOKit and device drivers. You will find these documents at the Apple Developer Connection.
The SIS1100 PCI card driver is divided into two parts. One that is doing the hardware related stuff and one that is responsible for routing function calls from an application to the right function of part one. The second part is called user client, because it is responsible for crossing the kernel-user boundary (to learn more about this, refer to the Apple documentation mentioned above).
An application that wants to communicate with the driver first needs to open a communication channel with the user client. It then tells the user client which function it wants to be executed and provides the necessary data. Then the user client will call the right function of the driver. After this task has been completed the application will close the communication channel, so that another application can access the driver. The user client has been implemented in a way that only on communication channel at a time can be open. So multiple connections are not allowed preventing the driver from managing and synchronizing many different connections. It is not intended to change this behavior because it is unlikely that multiple applications need access to the driver at the same time.