From 8ad47a57bc7d6f9a553c4e4fef8ef13742f1c054 Mon Sep 17 00:00:00 2001
From: Anders Blomdell <anders.blomdell@control.lth.se>
Date: Sat, 11 Jun 2016 15:15:01 +0200
Subject: [PATCH] Added non-functional code for driver unload.

---
 mc/hijacknet_fei.mc.c | 79 +++++++++++++++++++++++++++----------------
 1 file changed, 49 insertions(+), 30 deletions(-)

diff --git a/mc/hijacknet_fei.mc.c b/mc/hijacknet_fei.mc.c
index 4f49bed..a0f6b9f 100644
--- a/mc/hijacknet_fei.mc.c
+++ b/mc/hijacknet_fei.mc.c
@@ -392,7 +392,6 @@ static void hijackedInt(DRV_CTRL *pDrvCtrl)
 	   tag = &pDrvCtrl->rbdTags[hijack[unit].irqRbdIndex]) {
       unsigned char *data;
       int length, newlength, ether_type;
-//      struct hijacknet_hook *hook;
 
       data = (unsigned char*)tag->pMblk->mBlkHdr.mData;
       length = status & 0x3fff;
@@ -577,54 +576,67 @@ static int fei_hijacknet_send(HIJACKNET_DRIVER *driver,
 }
 
 static int fei_hijacknet_close(HIJACKNET_DRIVER *driver)
-{
-  printf("IMPLEMENT %s\n", __FUNCTION__);
-#if 0
-int hijacknet_uninstall(int unit)
 {
   int result = 0;
-  END_OBJ *interface;
+  int old_level;
+  struct hijack *hijack;
   DRV_CTRL *drv;
   VOIDFUNCPTR *vector;
-  int old_level;
+
+  printf("NOT USING new %s (driver still stuck in memory)\n", __FUNCTION__);
+  goto out;
   
-  if (unit < 0 || unit >= NUM_INTERFACES) {
-    printf("Index out of bounds %d\n", unit);
+  hijack = driver_to_hijack(driver);
+  if (hijack == NULL) {
     result = 1;
     goto out;
   }
-  interface = endFindByName("fei", unit);
-  if (interface == NULL) {
-    printf("Failed to find fei%d\n", unit);
+  drv = hijack->drv;  
+  vector = INUM_TO_IVEC (drv->board.vector);
+
+  old_level  = intLock();
+  hijack->active--;
+  if (hijack->active > 0) {
+    /* Somebody else has driver open */
     result = 2;
-    goto out;
+    goto out_unlock;
   }
-  drv = (DRV_CTRL*)interface;
-  vector = INUM_TO_IVEC (drv->board.vector);
-  if (pciIntDisconnect2(vector, hijack_irq_handler, (int)drv) != 0) {
-    printf("Failed to disconnect hijack_irq_handler from fei%d\n", unit);
+  if (pciIntDisconnect2(vector, hijackedInt, (int)drv) != 0) {
     result = 3;
-    goto out;
+    goto out_unlock;
   }
-  old_level  = intLock();
-  hijack[unit].active = 0;
-  hijack[unit].receive_hook = NULL;
-  hijack[unit].send_hook = NULL;
-  intUnlock(old_level);
+  drv->endObj.pFuncTable = hijack->origNetFuncs;
   pciIntConnect(vector, fei82557Int, (int)drv);
-  printf("fei%d connected to fei82557Int\n", unit);
+  result = 4;
+  
+out_unlock:
+  intUnlock(old_level);
+out:
+  switch (result) {
+    case 1: {
+      printf("No corresponding hijack for driver %p\n", driver);
+    } break;
+    case 2: {
+      printf("More processes using hijack driver\n");
+    } break;
+    case 3: {
+      printf("Failed to disconnect hijack_irq_handler from fei\n");
+    } break;
+    case 4: {
+      printf("fei reconnected to fei82557Int\n");
+    } break;
+    default: {
+      printf("Unknown result %d\n", result);
+    } break;
+  }
 
- out:
   return result;
 }
-#endif
-  return 0;
-}
 
 HIJACKNET_DRIVER *fei_hijacknet_open(int unit)
 {
   HIJACKNET_DRIVER *result = NULL;
-  int error = 0;
+  int error = 0, info = 0;
   END_OBJ *interface;
   DRV_CTRL *drv;
   VOIDFUNCPTR *vector;
@@ -639,6 +651,11 @@ HIJACKNET_DRIVER *fei_hijacknet_open(int unit)
     goto out;
   }
   result = &hijack[unit].driver;
+  if (hijack[unit].active >= 1) {
+    snprintf(msg, sizeof(msg), "Locking hijack driver fei%d in memory\n", unit);
+    info = 1;
+    goto out;
+  }
   hijack[unit].active++;
   if (hijack[unit].active > 1) {
     /* device has already been successfully opened */
@@ -691,7 +708,9 @@ error_out:
   hijack[unit].active--;
 out:
   intUnlock(old_level);
-  if (error) {
+  if (info) {
+    printf("%s", msg);
+  } else if (error) {
     printf("%s", msg);
     result = NULL;
   }
-- 
GitLab