* When determining the bit to be set for RTS/DTR there was a missing comparison

to op which would've caused a wrong line state to be set.
* Add some more allocation checks.
* Some cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42151 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Michael Lotz
2011-06-13 17:54:59 +00:00
parent e823d4a6be
commit 224d969b1d
@@ -54,12 +54,12 @@ SerialDevice::~SerialDevice()
{
Removed();
if (fDoneRead >= B_OK)
if (fDoneRead >= 0)
delete_sem(fDoneRead);
if (fDoneWrite >= B_OK)
if (fDoneWrite >= 0)
delete_sem(fDoneWrite);
if (fBufferArea >= B_OK)
if (fBufferArea >= 0)
delete_area(fBufferArea);
}
@@ -68,13 +68,20 @@ status_t
SerialDevice::Init()
{
fDoneRead = create_sem(0, "usb_serial:done_read");
if (fDoneRead < 0)
return fDoneRead;
fDoneWrite = create_sem(0, "usb_serial:done_write");
if (fDoneWrite < 0)
return fDoneWrite;
size_t totalBuffers = fReadBufferSize + fOutputBufferSize + fWriteBufferSize
+ fInterruptBufferSize;
fBufferArea = create_area("usb_serial:buffers_area", (void **)&fReadBuffer,
B_ANY_KERNEL_ADDRESS, ROUNDUP(totalBuffers, B_PAGE_SIZE), B_CONTIGUOUS,
B_READ_AREA | B_WRITE_AREA);
if (fBufferArea < 0)
return fBufferArea;
fOutputBuffer = fReadBuffer + fReadBufferSize;
fWriteBuffer = fOutputBuffer + fOutputBufferSize;
@@ -230,7 +237,7 @@ SerialDevice::Service(struct tty *tty, uint32 op, void *buffer, size_t length)
case TTYSETRTS:
{
bool set = *(bool *)buffer;
uint8 bit = TTYSETDTR ? USB_CDC_CONTROL_SIGNAL_STATE_DTR
uint8 bit = op == TTYSETDTR ? USB_CDC_CONTROL_SIGNAL_STATE_DTR
: USB_CDC_CONTROL_SIGNAL_STATE_RTS;
if (set)
fControlOut |= bit;