@@ -50,27 +50,19 @@ abort_all_pending_urbrs(pctx_vusb_t vusb)
50
50
WdfSpinLockRelease (vusb -> spin_lock );
51
51
}
52
52
53
- static NTSTATUS
53
+ static void
54
54
vusb_plugout (pctx_vusb_t vusb )
55
55
{
56
- NTSTATUS status ;
57
-
58
56
/*
59
57
* invalidate first to prevent requests from an upper layer.
60
58
* If requests are consistently fed into a vusb about to be plugged out,
61
- * a live deadlock may occur where vusb aborts pending urbs indefinately.
59
+ * a live deadlock may occur where vusb aborts pending urbs indefinately.
62
60
*/
63
61
vusb -> invalid = TRUE;
64
62
abort_pending_req_read (vusb );
65
63
abort_all_pending_urbrs (vusb );
66
64
67
- status = UdecxUsbDevicePlugOutAndDelete (vusb -> ude_usbdev );
68
- if (NT_ERROR (status )) {
69
- vusb -> invalid = FALSE;
70
- TRD (PLUGIN , "failed to plug out: %!STATUS!" , status );
71
- return status ;
72
- }
73
- return STATUS_SUCCESS ;
65
+ TRD (PLUGIN , "plugged out: port: %d" , vusb -> port );
74
66
}
75
67
76
68
static NTSTATUS
@@ -80,27 +72,16 @@ plugout_all_vusbs(pctx_vhci_t vhci)
80
72
81
73
TRD (PLUGIN , "plugging out all the devices!" );
82
74
83
- WdfSpinLockAcquire (vhci -> spin_lock );
84
75
for (i = 0 ; i < vhci -> n_max_ports ; i ++ ) {
85
- NTSTATUS status ;
86
- pctx_vusb_t vusb = vhci -> vusbs [i ];
76
+ pctx_vusb_t vusb ;
77
+
78
+ vusb = get_vusb (vhci , i );
87
79
if (vusb == NULL )
88
80
continue ;
89
81
90
- vhci -> vusbs [i ] = VUSB_DELETING ;
91
- WdfSpinLockRelease (vhci -> spin_lock );
92
-
93
- status = vusb_plugout (vusb );
94
-
95
- WdfSpinLockAcquire (vhci -> spin_lock );
96
- if (NT_ERROR (status )) {
97
- vhci -> vusbs [i ] = vusb ;
98
- WdfSpinLockRelease (vhci -> spin_lock );
99
- return STATUS_UNSUCCESSFUL ;
100
- }
101
- vhci -> vusbs [i ] = NULL ;
82
+ vusb_plugout (vusb );
83
+ put_vusb (vusb );
102
84
}
103
- WdfSpinLockRelease (vhci -> spin_lock );
104
85
105
86
return STATUS_SUCCESS ;
106
87
}
@@ -109,36 +90,20 @@ NTSTATUS
109
90
plugout_vusb (pctx_vhci_t vhci , CHAR port )
110
91
{
111
92
pctx_vusb_t vusb ;
112
- NTSTATUS status ;
113
93
114
94
if (port < 0 )
115
95
return plugout_all_vusbs (vhci );
116
96
117
97
TRD (IOCTL , "plugging out device: port: %u" , port );
118
98
119
- WdfSpinLockAcquire (vhci -> spin_lock );
120
-
121
- vusb = vhci -> vusbs [port ];
99
+ vusb = get_vusb (vhci , port );
122
100
if (vusb == NULL ) {
123
101
TRD (PLUGIN , "no matching vusb: port: %u" , port );
124
- WdfSpinLockRelease (vhci -> spin_lock );
125
102
return STATUS_NO_SUCH_DEVICE ;
126
103
}
127
104
128
- vhci -> vusbs [port ] = VUSB_DELETING ;
129
- WdfSpinLockRelease (vhci -> spin_lock );
130
-
131
- status = vusb_plugout (vusb );
132
-
133
- WdfSpinLockAcquire (vhci -> spin_lock );
134
- if (NT_ERROR (status )) {
135
- vhci -> vusbs [port ] = vusb ;
136
- WdfSpinLockRelease (vhci -> spin_lock );
137
- return STATUS_UNSUCCESSFUL ;
138
- }
139
- vhci -> vusbs [port ] = NULL ;
140
-
141
- WdfSpinLockRelease (vhci -> spin_lock );
105
+ vusb_plugout (vusb );
106
+ put_vusb (vusb );
142
107
143
108
TRD (IOCTL , "completed to plug out: port: %u" , port );
144
109
0 commit comments