* 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();
|
Removed();
|
||||||
|
|
||||||
if (fDoneRead >= B_OK)
|
if (fDoneRead >= 0)
|
||||||
delete_sem(fDoneRead);
|
delete_sem(fDoneRead);
|
||||||
if (fDoneWrite >= B_OK)
|
if (fDoneWrite >= 0)
|
||||||
delete_sem(fDoneWrite);
|
delete_sem(fDoneWrite);
|
||||||
|
|
||||||
if (fBufferArea >= B_OK)
|
if (fBufferArea >= 0)
|
||||||
delete_area(fBufferArea);
|
delete_area(fBufferArea);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,13 +68,20 @@ status_t
|
|||||||
SerialDevice::Init()
|
SerialDevice::Init()
|
||||||
{
|
{
|
||||||
fDoneRead = create_sem(0, "usb_serial:done_read");
|
fDoneRead = create_sem(0, "usb_serial:done_read");
|
||||||
|
if (fDoneRead < 0)
|
||||||
|
return fDoneRead;
|
||||||
|
|
||||||
fDoneWrite = create_sem(0, "usb_serial:done_write");
|
fDoneWrite = create_sem(0, "usb_serial:done_write");
|
||||||
|
if (fDoneWrite < 0)
|
||||||
|
return fDoneWrite;
|
||||||
|
|
||||||
size_t totalBuffers = fReadBufferSize + fOutputBufferSize + fWriteBufferSize
|
size_t totalBuffers = fReadBufferSize + fOutputBufferSize + fWriteBufferSize
|
||||||
+ fInterruptBufferSize;
|
+ fInterruptBufferSize;
|
||||||
fBufferArea = create_area("usb_serial:buffers_area", (void **)&fReadBuffer,
|
fBufferArea = create_area("usb_serial:buffers_area", (void **)&fReadBuffer,
|
||||||
B_ANY_KERNEL_ADDRESS, ROUNDUP(totalBuffers, B_PAGE_SIZE), B_CONTIGUOUS,
|
B_ANY_KERNEL_ADDRESS, ROUNDUP(totalBuffers, B_PAGE_SIZE), B_CONTIGUOUS,
|
||||||
B_READ_AREA | B_WRITE_AREA);
|
B_READ_AREA | B_WRITE_AREA);
|
||||||
|
if (fBufferArea < 0)
|
||||||
|
return fBufferArea;
|
||||||
|
|
||||||
fOutputBuffer = fReadBuffer + fReadBufferSize;
|
fOutputBuffer = fReadBuffer + fReadBufferSize;
|
||||||
fWriteBuffer = fOutputBuffer + fOutputBufferSize;
|
fWriteBuffer = fOutputBuffer + fOutputBufferSize;
|
||||||
@@ -230,7 +237,7 @@ SerialDevice::Service(struct tty *tty, uint32 op, void *buffer, size_t length)
|
|||||||
case TTYSETRTS:
|
case TTYSETRTS:
|
||||||
{
|
{
|
||||||
bool set = *(bool *)buffer;
|
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;
|
: USB_CDC_CONTROL_SIGNAL_STATE_RTS;
|
||||||
if (set)
|
if (set)
|
||||||
fControlOut |= bit;
|
fControlOut |= bit;
|
||||||
|
|||||||
Reference in New Issue
Block a user