|
@@ -181,10 +181,7 @@ octeon_droq_setup_ring_buffers(struct octeon_device *oct,
|
|
|
|
|
|
droq->recv_buf_list[i].buffer = buf;
|
|
|
droq->recv_buf_list[i].data = get_rbd(buf);
|
|
|
- droq->info_list[i].length = 0;
|
|
|
-
|
|
|
- /* map ring buffers into memory */
|
|
|
- desc_ring[i].info_ptr = lio_map_ring_info(droq, i);
|
|
|
+ desc_ring[i].info_ptr = 0;
|
|
|
desc_ring[i].buffer_ptr =
|
|
|
lio_map_ring(droq->recv_buf_list[i].buffer);
|
|
|
}
|
|
@@ -205,9 +202,6 @@ int octeon_delete_droq(struct octeon_device *oct, u32 q_no)
|
|
|
octeon_droq_destroy_ring_buffers(oct, droq);
|
|
|
vfree(droq->recv_buf_list);
|
|
|
|
|
|
- if (droq->info_base_addr)
|
|
|
- lio_free_info_buffer(oct, droq);
|
|
|
-
|
|
|
if (droq->desc_ring)
|
|
|
lio_dma_free(oct, (droq->max_count * OCT_DROQ_DESC_SIZE),
|
|
|
droq->desc_ring, droq->desc_ring_dma);
|
|
@@ -280,14 +274,6 @@ int octeon_init_droq(struct octeon_device *oct,
|
|
|
dev_dbg(&oct->pci_dev->dev, "droq[%d]: num_desc: %d\n", q_no,
|
|
|
droq->max_count);
|
|
|
|
|
|
- droq->info_list = lio_alloc_info_buffer(oct, droq);
|
|
|
- if (!droq->info_list) {
|
|
|
- dev_err(&oct->pci_dev->dev, "Cannot allocate memory for info list.\n");
|
|
|
- lio_dma_free(oct, (droq->max_count * OCT_DROQ_DESC_SIZE),
|
|
|
- droq->desc_ring, droq->desc_ring_dma);
|
|
|
- return 1;
|
|
|
- }
|
|
|
-
|
|
|
droq->recv_buf_list = (struct octeon_recv_buffer *)
|
|
|
vmalloc_node(droq->max_count *
|
|
|
OCT_DROQ_RECVBUF_SIZE,
|
|
@@ -357,7 +343,7 @@ static inline struct octeon_recv_info *octeon_create_recv_info(
|
|
|
u32 i, bytes_left;
|
|
|
struct octeon_skb_page_info *pg_info;
|
|
|
|
|
|
- info = &droq->info_list[idx];
|
|
|
+ info = (struct octeon_droq_info *)droq->recv_buf_list[idx].data;
|
|
|
|
|
|
recv_info = octeon_alloc_recv_info(sizeof(struct __dispatch));
|
|
|
if (!recv_info)
|
|
@@ -491,8 +477,6 @@ octeon_droq_refill(struct octeon_device *octeon_dev, struct octeon_droq *droq)
|
|
|
desc_ring[droq->refill_idx].buffer_ptr =
|
|
|
lio_map_ring(droq->recv_buf_list[
|
|
|
droq->refill_idx].buffer);
|
|
|
- /* Reset any previous values in the length field. */
|
|
|
- droq->info_list[droq->refill_idx].length = 0;
|
|
|
|
|
|
droq->refill_idx = incr_index(droq->refill_idx, 1,
|
|
|
droq->max_count);
|
|
@@ -541,11 +525,7 @@ void octeon_droq_check_oom(struct octeon_droq *droq)
|
|
|
static inline u32
|
|
|
octeon_droq_get_bufcount(u32 buf_size, u32 total_len)
|
|
|
{
|
|
|
- u32 buf_cnt = 0;
|
|
|
-
|
|
|
- while (total_len > (buf_size * buf_cnt))
|
|
|
- buf_cnt++;
|
|
|
- return buf_cnt;
|
|
|
+ return ((total_len + buf_size - 1) / buf_size);
|
|
|
}
|
|
|
|
|
|
static int
|
|
@@ -593,11 +573,12 @@ static inline void octeon_droq_drop_packets(struct octeon_device *oct,
|
|
|
struct octeon_droq_info *info;
|
|
|
|
|
|
for (i = 0; i < cnt; i++) {
|
|
|
- info = &droq->info_list[droq->read_idx];
|
|
|
+ info = (struct octeon_droq_info *)
|
|
|
+ droq->recv_buf_list[droq->read_idx].data;
|
|
|
octeon_swap_8B_data((u64 *)info, 2);
|
|
|
|
|
|
if (info->length) {
|
|
|
- info->length -= OCT_RH_SIZE;
|
|
|
+ info->length += OCTNET_FRM_LENGTH_SIZE;
|
|
|
droq->stats.bytes_received += info->length;
|
|
|
buf_cnt = octeon_droq_get_bufcount(droq->buffer_size,
|
|
|
(u32)info->length);
|
|
@@ -629,7 +610,8 @@ octeon_droq_fast_process_packets(struct octeon_device *oct,
|
|
|
struct octeon_skb_page_info *pg_info;
|
|
|
void *buf;
|
|
|
|
|
|
- info = &droq->info_list[droq->read_idx];
|
|
|
+ info = (struct octeon_droq_info *)
|
|
|
+ droq->recv_buf_list[droq->read_idx].data;
|
|
|
octeon_swap_8B_data((u64 *)info, 2);
|
|
|
|
|
|
if (!info->length) {
|
|
@@ -643,9 +625,10 @@ octeon_droq_fast_process_packets(struct octeon_device *oct,
|
|
|
}
|
|
|
|
|
|
/* Len of resp hdr in included in the received data len. */
|
|
|
- info->length -= OCT_RH_SIZE;
|
|
|
rh = &info->rh;
|
|
|
|
|
|
+ info->length += OCTNET_FRM_LENGTH_SIZE;
|
|
|
+ rh->r_dh.len += (ROUNDUP8(OCT_DROQ_INFO_SIZE) / sizeof(u64));
|
|
|
total_len += (u32)info->length;
|
|
|
if (opcode_slow_path(rh)) {
|
|
|
u32 buf_cnt;
|