It could be that your serial terminal is sending some extra bits (CR, etc) which might be screwing things up.. When I've used a similar method I tend to put UART_SpiUartClearRxBuffer() after UART_UartGetChar() just to clean up the received data.
It may also be useful to put if( UART_SpiUartGetRxBufferSize()) in front.
You might write instead:
I would also check to see if the state is advertising (with CyBle_GetState() ) before sending stop advertising command because the stack might just keep throwing HCI status errors back at you.
There's probably a bteer solution but I hope this helps.
Issue was not related to UART itself, but to the approach I used. I was reading data from UART constantly in the loop, while BLE sub-system allows to send advertisement with minimum interval of 100 ms. So it was just unable to send any packet before I send stop signal.
Anyway your answer gave me some clue and feeling that I am not alone with my problem :)