home *** CD-ROM | disk | FTP | other *** search
/ ftp.sustworks.com 2018 / ftp.sustworks.com.zip / ftp.sustworks.com / USBAx8817x_101.dmg / src / Source / USBAx8817xEthernetInterface.cpp < prev    next >
C/C++ Source or Header  |  2005-10-08  |  2KB  |  91 lines

  1. extern "C" {
  2.   #include <sys/param.h>
  3.   #include <sys/systm.h>
  4. }
  5.  
  6. #include "USBAx8817xEthernetInterface.h"
  7.  
  8. #define super IOEthernetInterface
  9.  
  10. OSDefineMetaClassAndStructors(USBAx8817xEthernetInterface, 
  11.                   IOEthernetInterface);
  12.  
  13. void USBAx8817xEthernetInterface::detachFromDataLinkLayer(IOOptionBits options,
  14.                               void *parameter ) {
  15.  
  16. #if TIGER
  17.   super::detachFromDataLinkLayer(options, parameter);
  18. #else
  19.   /* There appears to be an issue with detaching network interfaces in
  20.      Mac OS 1.3.9. (and probably earlier).  The following code
  21.      detaches the bsd network interface, and then blocks until all
  22.      clients of the network interface have released it. */
  23.   int ret;
  24.   boolean_t funnel_state;
  25.   int (*oldFree)(struct ifnet *);
  26.  
  27.   detachLock = IOLockAlloc();
  28.   if(!detachLock) {
  29.     IOLog("USBAx8817xEthernetInterface: failed to create detach detach lock.\n");
  30.     dlil_if_detach( getIfnet() );
  31.     return;
  32.   }
  33.  
  34.   ifFinished = false;
  35.   funnel_state = thread_funnel_set( network_flock, TRUE );
  36.  
  37.   /* Install our "free" handler routine. */
  38.   oldFree = (getIfnet())->if_free;
  39.   (getIfnet())->if_free = bsdInterfaceFinished;
  40.  
  41.   /* Attempt to attach interface. */
  42.   ret = dlil_if_detach( getIfnet() );
  43.  
  44.   switch(ret) {
  45.   case DLIL_WAIT_FOR_FREE:
  46.     /* Wait for network interface clients to close. */
  47.     thread_funnel_set( network_flock, FALSE );
  48.     IOLockLock(detachLock);
  49.     while(ifFinished == false) {
  50.       IOLockSleep(detachLock, NO_EVENT, THREAD_ABORTSAFE);    
  51.     }
  52.     thread_funnel_set( network_flock, TRUE );
  53.     break;
  54.   case 0:
  55.     /* Network interface detached. */
  56.     break;
  57.   default:
  58.     IOLog("USBAx8817xEthernetInterface: dlil_if_detach: 0x%x.\n",
  59.       ret);
  60.     break;
  61.   }
  62.  
  63.   /* Restore old handler routine */  
  64.   (getIfnet())->if_free = oldFree;
  65.   thread_funnel_set( network_flock, funnel_state );
  66.   IOLockFree(detachLock);
  67. #endif
  68. }
  69.  
  70. #if !TIGER
  71. int USBAx8817xEthernetInterface::bsdInterfaceFinished( struct ifnet * ifp ) {
  72.   USBAx8817xEthernetInterface *me;
  73.  
  74.   if(!ifp || !ifp->if_private) {
  75.     IOLog("USBAx8817xEthernetInterface: No interface.\n");
  76.     return 0;
  77.   }
  78.  
  79.   me = OSDynamicCast(USBAx8817xEthernetInterface, (OSObject *)ifp->if_private);
  80.   if(!me) {
  81.     IOLog("USBAx8817xEthernetInterface: Dynamic cast failed.\n");
  82.   } else {
  83.     IOLockLock(me->detachLock);
  84.     me->ifFinished = true;
  85.     IOLockWakeup(me->detachLock, NO_EVENT, true);
  86.     IOLockUnlock(me->detachLock);
  87.   }
  88.   return 0;
  89. }
  90. #endif
  91.