ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/Windows/b2ether/nt5/b2ether_openclose.c
Revision: 1.1
Committed: 2012-04-22T03:13:32Z (12 years, 6 months ago) by asvitkine
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Log Message:
Import nt5 version of the ethernet driver from 2001 sources.

File Contents

# User Rev Content
1 asvitkine 1.1 /*
2     * b2ether driver -- derived from DDK packet driver sample
3     *
4     * Basilisk II (C) 1997-1999 Christian Bauer
5     *
6     * Windows platform specific code copyright (C) Lauri Pesonen
7     *
8     * This program is free software; you can redistribute it and/or modify
9     * it under the terms of the GNU General Public License as published by
10     * the Free Software Foundation; either version 2 of the License, or
11     * (at your option) any later version.
12     *
13     * This program is distributed in the hope that it will be useful,
14     * but WITHOUT ANY WARRANTY; without even the implied warranty of
15     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16     * GNU General Public License for more details.
17     *
18     * You should have received a copy of the GNU General Public License
19     * along with this program; if not, write to the Free Software
20     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21     */
22    
23     #include "ntddk.h"
24     #include "ndis.h"
25     #include "b2ether.h"
26    
27     NTSTATUS PacketOpen( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
28     {
29     POPEN_INSTANCE open;
30     NTSTATUS status = STATUS_SUCCESS;
31    
32     // DebugPrint(("OpenAdapter\n"));
33    
34     if(DeviceObject == Globals.ControlDeviceObject) {
35     Irp->IoStatus.Status = status;
36     IoCompleteRequest(Irp, IO_NO_INCREMENT);
37     return status;
38     }
39    
40     open = DeviceObject->DeviceExtension;
41    
42     // DebugPrint(("AdapterName :%ws\n", open->AdapterName.Buffer));
43    
44     IoIncrement(open);
45    
46     if(!open->Bound) {
47     status = STATUS_DEVICE_NOT_READY;
48     }
49    
50     Irp->IoStatus.Information = 0;
51     Irp->IoStatus.Status = status;
52     IoCompleteRequest (Irp, IO_NO_INCREMENT);
53     IoDecrement(open);
54     return status;
55     }
56    
57    
58     NTSTATUS PacketClose( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
59     {
60     POPEN_INSTANCE open;
61     NTSTATUS status = STATUS_SUCCESS;
62    
63     // DebugPrint(("CloseAdapter \n"));
64    
65     if(DeviceObject == Globals.ControlDeviceObject) {
66     Irp->IoStatus.Status = status;
67     IoCompleteRequest(Irp, IO_NO_INCREMENT);
68     return status;
69     }
70    
71     open = DeviceObject->DeviceExtension;
72     IoIncrement(open);
73     Irp->IoStatus.Information = 0;
74     Irp->IoStatus.Status = status;
75     IoCompleteRequest (Irp, IO_NO_INCREMENT);
76     IoDecrement(open);
77     return status;
78     }
79    
80    
81     NTSTATUS PacketCleanup( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
82     {
83     POPEN_INSTANCE open;
84     NTSTATUS status = STATUS_SUCCESS;
85    
86     // DebugPrint(("Packet: Cleanup\n"));
87    
88     if(DeviceObject == Globals.ControlDeviceObject) {
89     Irp->IoStatus.Status = status;
90     IoCompleteRequest(Irp, IO_NO_INCREMENT);
91     return status;
92     }
93    
94     open = DeviceObject->DeviceExtension;
95    
96     IoIncrement(open);
97    
98     PacketCancelReadIrps(DeviceObject);
99    
100     // Since the current implementation of NDIS doesn't
101     // allow us to cancel requests pending at the
102     // minport, we must wait here until they complete.
103    
104     IoDecrement(open);
105    
106     NdisWaitEvent(&open->CleanupEvent, 0);
107    
108     Irp->IoStatus.Information = 0;
109     Irp->IoStatus.Status = status;
110     IoCompleteRequest (Irp, IO_NO_INCREMENT);
111     return status;
112     }
113    
114    
115     VOID
116     PacketResetComplete(
117     IN NDIS_HANDLE ProtocolBindingContext,
118     IN NDIS_STATUS Status
119     )
120     {
121     POPEN_INSTANCE open;
122     PIRP irp;
123    
124     PLIST_ENTRY resetListEntry;
125    
126     // DebugPrint(("PacketResetComplte\n"));
127    
128     open= (POPEN_INSTANCE)ProtocolBindingContext;
129    
130     resetListEntry=ExInterlockedRemoveHeadList(
131     &open->ResetIrpList,
132     &open->ResetQueueLock
133     );
134    
135     #if DBG
136     if (resetListEntry == NULL) {
137     DbgBreakPoint();
138     return;
139     }
140     #endif
141    
142     irp=CONTAINING_RECORD(resetListEntry,IRP,Tail.Overlay.ListEntry);
143    
144     if(Status == NDIS_STATUS_SUCCESS) {
145     irp->IoStatus.Status = STATUS_SUCCESS;
146     } else {
147     irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
148     }
149    
150     irp->IoStatus.Information = 0;
151     IoCompleteRequest(irp, IO_NO_INCREMENT);
152     IoDecrement(open);
153    
154     // DebugPrint(("PacketResetComplte exit\n"));
155     }