Loading drivers/soc/qcom/smd.c +36 −15 Original line number Diff line number Diff line Loading @@ -1134,22 +1134,34 @@ void smd_channel_reset(uint32_t restart_pid) /* how many bytes are available for reading */ static int smd_stream_read_avail(struct smd_channel *ch) { return (ch->half_ch->get_head(ch->recv) - ch->half_ch->get_tail(ch->recv)) & ch->fifo_mask; unsigned head = ch->half_ch->get_head(ch->recv); unsigned tail = ch->half_ch->get_tail(ch->recv); unsigned fifo_size = ch->fifo_size; unsigned bytes_avail = head - tail; if (head < tail) bytes_avail += fifo_size; BUG_ON(bytes_avail >= fifo_size); return bytes_avail; } /* how many bytes we are free to write */ static int smd_stream_write_avail(struct smd_channel *ch) { int bytes_avail; bytes_avail = ch->fifo_mask - ((ch->half_ch->get_head(ch->send) - ch->half_ch->get_tail(ch->send)) & ch->fifo_mask) + 1; unsigned head = ch->half_ch->get_head(ch->send); unsigned tail = ch->half_ch->get_tail(ch->send); unsigned fifo_size = ch->fifo_size; unsigned bytes_avail = tail - head; if (tail <= head) bytes_avail += fifo_size; if (bytes_avail < SMD_FIFO_FULL_RESERVE) bytes_avail = 0; else bytes_avail -= SMD_FIFO_FULL_RESERVE; BUG_ON(bytes_avail >= fifo_size); return bytes_avail; } Loading Loading @@ -1205,9 +1217,15 @@ static int read_intr_blocked(struct smd_channel *ch) /* advance the fifo read pointer after data from ch_read_buffer is consumed */ static void ch_read_done(struct smd_channel *ch, unsigned count) { unsigned tail = ch->half_ch->get_tail(ch->recv); unsigned fifo_size = ch->fifo_size; BUG_ON(count > smd_stream_read_avail(ch)); ch->half_ch->set_tail(ch->recv, (ch->half_ch->get_tail(ch->recv) + count) & ch->fifo_mask); tail += count; if (tail >= fifo_size) tail -= fifo_size; ch->half_ch->set_tail(ch->recv, tail); wmb(); ch->half_ch->set_fTAIL(ch->send, 1); } Loading Loading @@ -1321,9 +1339,14 @@ static unsigned ch_write_buffer(struct smd_channel *ch, void **ptr) */ static void ch_write_done(struct smd_channel *ch, unsigned count) { unsigned head = ch->half_ch->get_head(ch->send); unsigned fifo_size = ch->fifo_size; BUG_ON(count > smd_stream_write_avail(ch)); ch->half_ch->set_head(ch->send, (ch->half_ch->get_head(ch->send) + count) & ch->fifo_mask); head += count; if (head >= fifo_size) head -= fifo_size; ch->half_ch->set_head(ch->send, head); wmb(); ch->half_ch->set_fHEAD(ch->send, 1); } Loading Loading @@ -1796,9 +1819,9 @@ static int smd_alloc(struct smd_channel *ch, int table_id, return -EINVAL; } /* buffer must be a power-of-two size */ if (buffer_sz & (buffer_sz - 1)) { SMD_INFO("Buffer size: %u not power of two\n", buffer_sz); /* buffer must be a multiple of 32 size */ if ((buffer_sz & (SZ_32 - 1)) != 0) { SMD_INFO("Buffer size: %u not multiple of 32\n", buffer_sz); return -EINVAL; } buffer_sz /= 2; Loading Loading @@ -1837,8 +1860,6 @@ static int smd_alloc_channel(struct smd_alloc_elm *alloc_elm, int table_id, return -ENODEV; } ch->fifo_mask = ch->fifo_size - 1; /* probe_worker guarentees ch->type will be a valid type */ if (ch->type == SMD_APPS_MODEM) ch->notify_other_cpu = notify_modem_smd; Loading drivers/soc/qcom/smd_private.h +0 −1 Original line number Diff line number Diff line Loading @@ -134,7 +134,6 @@ struct smd_channel { unsigned char *send_data; unsigned char *recv_data; unsigned fifo_size; unsigned fifo_mask; struct list_head ch_list; unsigned current_packet; Loading Loading
drivers/soc/qcom/smd.c +36 −15 Original line number Diff line number Diff line Loading @@ -1134,22 +1134,34 @@ void smd_channel_reset(uint32_t restart_pid) /* how many bytes are available for reading */ static int smd_stream_read_avail(struct smd_channel *ch) { return (ch->half_ch->get_head(ch->recv) - ch->half_ch->get_tail(ch->recv)) & ch->fifo_mask; unsigned head = ch->half_ch->get_head(ch->recv); unsigned tail = ch->half_ch->get_tail(ch->recv); unsigned fifo_size = ch->fifo_size; unsigned bytes_avail = head - tail; if (head < tail) bytes_avail += fifo_size; BUG_ON(bytes_avail >= fifo_size); return bytes_avail; } /* how many bytes we are free to write */ static int smd_stream_write_avail(struct smd_channel *ch) { int bytes_avail; bytes_avail = ch->fifo_mask - ((ch->half_ch->get_head(ch->send) - ch->half_ch->get_tail(ch->send)) & ch->fifo_mask) + 1; unsigned head = ch->half_ch->get_head(ch->send); unsigned tail = ch->half_ch->get_tail(ch->send); unsigned fifo_size = ch->fifo_size; unsigned bytes_avail = tail - head; if (tail <= head) bytes_avail += fifo_size; if (bytes_avail < SMD_FIFO_FULL_RESERVE) bytes_avail = 0; else bytes_avail -= SMD_FIFO_FULL_RESERVE; BUG_ON(bytes_avail >= fifo_size); return bytes_avail; } Loading Loading @@ -1205,9 +1217,15 @@ static int read_intr_blocked(struct smd_channel *ch) /* advance the fifo read pointer after data from ch_read_buffer is consumed */ static void ch_read_done(struct smd_channel *ch, unsigned count) { unsigned tail = ch->half_ch->get_tail(ch->recv); unsigned fifo_size = ch->fifo_size; BUG_ON(count > smd_stream_read_avail(ch)); ch->half_ch->set_tail(ch->recv, (ch->half_ch->get_tail(ch->recv) + count) & ch->fifo_mask); tail += count; if (tail >= fifo_size) tail -= fifo_size; ch->half_ch->set_tail(ch->recv, tail); wmb(); ch->half_ch->set_fTAIL(ch->send, 1); } Loading Loading @@ -1321,9 +1339,14 @@ static unsigned ch_write_buffer(struct smd_channel *ch, void **ptr) */ static void ch_write_done(struct smd_channel *ch, unsigned count) { unsigned head = ch->half_ch->get_head(ch->send); unsigned fifo_size = ch->fifo_size; BUG_ON(count > smd_stream_write_avail(ch)); ch->half_ch->set_head(ch->send, (ch->half_ch->get_head(ch->send) + count) & ch->fifo_mask); head += count; if (head >= fifo_size) head -= fifo_size; ch->half_ch->set_head(ch->send, head); wmb(); ch->half_ch->set_fHEAD(ch->send, 1); } Loading Loading @@ -1796,9 +1819,9 @@ static int smd_alloc(struct smd_channel *ch, int table_id, return -EINVAL; } /* buffer must be a power-of-two size */ if (buffer_sz & (buffer_sz - 1)) { SMD_INFO("Buffer size: %u not power of two\n", buffer_sz); /* buffer must be a multiple of 32 size */ if ((buffer_sz & (SZ_32 - 1)) != 0) { SMD_INFO("Buffer size: %u not multiple of 32\n", buffer_sz); return -EINVAL; } buffer_sz /= 2; Loading Loading @@ -1837,8 +1860,6 @@ static int smd_alloc_channel(struct smd_alloc_elm *alloc_elm, int table_id, return -ENODEV; } ch->fifo_mask = ch->fifo_size - 1; /* probe_worker guarentees ch->type will be a valid type */ if (ch->type == SMD_APPS_MODEM) ch->notify_other_cpu = notify_modem_smd; Loading
drivers/soc/qcom/smd_private.h +0 −1 Original line number Diff line number Diff line Loading @@ -134,7 +134,6 @@ struct smd_channel { unsigned char *send_data; unsigned char *recv_data; unsigned fifo_size; unsigned fifo_mask; struct list_head ch_list; unsigned current_packet; Loading