* 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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user