xref: /haiku/src/add-ons/kernel/bus_managers/usb/Object.cpp (revision 02354704729d38c3b078c696adc1bbbd33cbcf72)
1 /*
2  * Copyright 2006-2020, Haiku, Inc. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Michael Lotz <mmlr@mlotz.ch>
7  */
8 
9 #include "usb_private.h"
10 
11 
12 Object::Object(Stack *stack, BusManager *bus)
13 	:	fParent(NULL),
14 		fBusManager(bus),
15 		fStack(stack),
16 		fUSBID(fStack->GetUSBID(this)),
17 		fBusy(0)
18 {
19 }
20 
21 
22 Object::Object(Object *parent)
23 	:	fParent(parent),
24 		fBusManager(parent->GetBusManager()),
25 		fStack(parent->GetStack()),
26 		fUSBID(fStack->GetUSBID(this)),
27 		fBusy(0)
28 {
29 }
30 
31 
32 Object::~Object()
33 {
34 	PutUSBID();
35 }
36 
37 
38 void
39 Object::PutUSBID(bool waitForUnbusy)
40 {
41 	if (fUSBID != UINT32_MAX) {
42 		fStack->PutUSBID(this);
43 		fUSBID = UINT32_MAX;
44 	}
45 
46 	if (waitForUnbusy)
47 		WaitForUnbusy();
48 }
49 
50 
51 void
52 Object::WaitForUnbusy()
53 {
54 	int32 retries = 20;
55 	while (atomic_get(&fBusy) != 0 && retries--)
56 		snooze(100);
57 	if (retries <= 0)
58 		panic("USB object did not become unbusy!");
59 }
60 
61 
62 status_t
63 Object::SetFeature(uint16 selector)
64 {
65 	// to be implemented in subclasses
66 	TRACE_ERROR("set feature called\n");
67 	return B_ERROR;
68 }
69 
70 
71 status_t
72 Object::ClearFeature(uint16 selector)
73 {
74 	// to be implemented in subclasses
75 	TRACE_ERROR("clear feature called\n");
76 	return B_ERROR;
77 }
78 
79 
80 status_t
81 Object::GetStatus(uint16 *status)
82 {
83 	// to be implemented in subclasses
84 	TRACE_ERROR("get status called\n");
85 	return B_ERROR;
86 }
87