Skip to content

Commit 65119ff

Browse files
committed
refactor(usb-reset): use UsbResetMode enum instead of bool
1 parent a2eb32b commit 65119ff

File tree

3 files changed

+35
-19
lines changed

3 files changed

+35
-19
lines changed

internal/usbgadget/config.go

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@ type gadgetConfigItemWithKey struct {
2424

2525
type orderedGadgetConfigItems []gadgetConfigItemWithKey
2626

27+
type UsbResetMode uint8
28+
29+
const (
30+
UsbResetNever UsbResetMode = 0 // never reset the usb gadget
31+
UsbResetAlways UsbResetMode = 1 // always reset the usb gadget
32+
UsbResetOnDemand UsbResetMode = 2 // reset the usb gadget when needed
33+
)
34+
2735
var defaultGadgetConfig = map[string]gadgetConfigItem{
2836
"base": {
2937
order: 0,
@@ -177,34 +185,31 @@ func (u *UsbGadget) Init() error {
177185

178186
u.udc = udcs[0]
179187

180-
err := u.configureUsbGadget(false, true)
188+
err := u.configureUsbGadget(UsbResetAlways)
181189
if err != nil {
182190
return u.logError("unable to initialize USB stack", err)
183191
}
184192

185193
return nil
186194
}
187195

188-
func (u *UsbGadget) UpdateGadgetConfig(resetUsbIfNeeded bool) error {
196+
func (u *UsbGadget) UpdateGadgetConfig(resetUsbMode UsbResetMode) error {
189197
u.configLock.Lock()
190198
defer u.configLock.Unlock()
191199

192200
u.loadGadgetConfig()
193201

194-
err := u.configureUsbGadget(true, resetUsbIfNeeded)
202+
err := u.configureUsbGadget(resetUsbMode)
195203
if err != nil {
196204
return u.logError("unable to update gadget config", err)
197205
}
198206

199207
return nil
200208
}
201209

202-
func (u *UsbGadget) configureUsbGadget(resetUsb bool, resetUsbIfNeeded bool) error {
203-
f := func(resetUsbBefore bool, resetUsbAfter bool) func() error {
210+
func (u *UsbGadget) configureUsbGadget(resetUsbMode UsbResetMode) error {
211+
f := func(resetUsbAfter bool) func() error {
204212
return func() error {
205-
if resetUsbBefore {
206-
u.tx.RebindUsb(true)
207-
}
208213
u.tx.MountConfigFS()
209214
u.tx.CreateConfigPath()
210215
u.tx.WriteGadgetConfig()
@@ -216,11 +221,21 @@ func (u *UsbGadget) configureUsbGadget(resetUsb bool, resetUsbIfNeeded bool) err
216221
}
217222

218223
// initial attempt to configure the gadget
219-
err := u.WithTransaction(f(false, resetUsb))
220-
if err != nil && !resetUsbIfNeeded {
221-
return err
224+
err := u.WithTransaction(f(resetUsbMode == UsbResetAlways))
225+
if err == nil {
226+
return nil
222227
}
223228

224229
// if the initial attempt failed, try to configure the gadget again with the resetUsb flag
225-
return u.WithTransaction(f(true, resetUsb))
230+
if resetUsbMode == UsbResetOnDemand {
231+
u.log.Warn().Err(err).Msg("initial attempt to configure the gadget failed, resetting USB gadget then trying again")
232+
// NOTES: do not use the RebindUsb method here because it will block the transaction
233+
if err := u.rebindUsb(true); err != nil {
234+
u.log.Warn().Err(err).Msg("failed to reset USB gadget, skipping second attempt")
235+
return err
236+
}
237+
return u.WithTransaction(f(true))
238+
}
239+
240+
return err
226241
}

jsonrpc.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -678,7 +678,7 @@ func rpcSetUsbConfig(usbConfig usbgadget.Config) error {
678678
LoadConfig()
679679
config.UsbConfig = &usbConfig
680680
gadget.SetGadgetConfig(config.UsbConfig)
681-
return updateUsbRelatedConfig(false)
681+
return updateUsbRelatedConfig(usbgadget.UsbResetAlways)
682682
}
683683

684684
func rpcGetWakeOnLanDevices() ([]WakeOnLanDevice, error) {
@@ -890,8 +890,8 @@ func rpcGetUsbDevices() (usbgadget.Devices, error) {
890890
return *config.UsbDevices, nil
891891
}
892892

893-
func updateUsbRelatedConfig(resetUsbIfNeeded bool) error {
894-
if err := gadget.UpdateGadgetConfig(resetUsbIfNeeded); err != nil {
893+
func updateUsbRelatedConfig(resetUsbMode usbgadget.UsbResetMode) error {
894+
if err := gadget.UpdateGadgetConfig(resetUsbMode); err != nil {
895895
return fmt.Errorf("failed to write gadget config: %w", err)
896896
}
897897
if err := SaveConfig(); err != nil {
@@ -903,7 +903,7 @@ func updateUsbRelatedConfig(resetUsbIfNeeded bool) error {
903903
func rpcSetUsbDevices(usbDevices usbgadget.Devices) error {
904904
config.UsbDevices = &usbDevices
905905
gadget.SetGadgetDevices(config.UsbDevices)
906-
return updateUsbRelatedConfig(false)
906+
return updateUsbRelatedConfig(usbgadget.UsbResetOnDemand)
907907
}
908908

909909
func rpcSetUsbDeviceState(device string, enabled bool) error {
@@ -920,7 +920,7 @@ func rpcSetUsbDeviceState(device string, enabled bool) error {
920920
return fmt.Errorf("invalid device: %s", device)
921921
}
922922
gadget.SetGadgetDevices(config.UsbDevices)
923-
return updateUsbRelatedConfig(false)
923+
return updateUsbRelatedConfig(usbgadget.UsbResetAlways)
924924
}
925925

926926
func rpcSetCloudUrl(apiUrl string, appUrl string) error {

usb_mass_storage.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"github.com/pion/webrtc/v4"
2020
"github.com/psanford/httpreadat"
2121

22+
"github.com/jetkvm/kvm/internal/usbgadget"
2223
"github.com/jetkvm/kvm/resource"
2324
)
2425

@@ -40,7 +41,7 @@ func setMassStorageImage(imagePath string) error {
4041
return fmt.Errorf("failed to set mass storage path: %w", err)
4142
}
4243

43-
if err := gadget.UpdateGadgetConfig(true); err != nil {
44+
if err := gadget.UpdateGadgetConfig(usbgadget.UsbResetOnDemand); err != nil {
4445
return fmt.Errorf("failed to update gadget config: %w", err)
4546
}
4647

@@ -62,7 +63,7 @@ func setMassStorageMode(cdrom bool) error {
6263
return nil
6364
}
6465

65-
return gadget.UpdateGadgetConfig(true)
66+
return gadget.UpdateGadgetConfig(usbgadget.UsbResetOnDemand)
6667
}
6768

6869
func mountImage(imagePath string) error {

0 commit comments

Comments
 (0)