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