964a884ef580be279e460ac7e2cdaa704ca7901f
[dpdk.git] / drivers / net / liquidio / lio_rxtx.h
1 /*
2  *   BSD LICENSE
3  *
4  *   Copyright(c) 2017 Cavium, Inc.. All rights reserved.
5  *   All rights reserved.
6  *
7  *   Redistribution and use in source and binary forms, with or without
8  *   modification, are permitted provided that the following conditions
9  *   are met:
10  *
11  *     * Redistributions of source code must retain the above copyright
12  *       notice, this list of conditions and the following disclaimer.
13  *     * Redistributions in binary form must reproduce the above copyright
14  *       notice, this list of conditions and the following disclaimer in
15  *       the documentation and/or other materials provided with the
16  *       distribution.
17  *     * Neither the name of Cavium, Inc. nor the names of its
18  *       contributors may be used to endorse or promote products derived
19  *       from this software without specific prior written permission.
20  *
21  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25  *   OWNER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  */
33
34 #ifndef _LIO_RXTX_H_
35 #define _LIO_RXTX_H_
36
37 #include <stdio.h>
38 #include <stdint.h>
39
40 #include <rte_spinlock.h>
41 #include <rte_memory.h>
42
43 #include "lio_struct.h"
44
45 #ifndef ROUNDUP4
46 #define ROUNDUP4(val) (((val) + 3) & 0xfffffffc)
47 #endif
48
49 #define LIO_STQUEUE_FIRST_ENTRY(ptr, type, elem)        \
50         (type *)((char *)((ptr)->stqh_first) - offsetof(type, elem))
51
52 #define lio_check_timeout(cur_time, chk_time) ((cur_time) > (chk_time))
53
54 #define lio_uptime              \
55         (size_t)(rte_get_timer_cycles() / rte_get_timer_hz())
56
57 /** Descriptor format.
58  *  The descriptor ring is made of descriptors which have 2 64-bit values:
59  *  -# Physical (bus) address of the data buffer.
60  *  -# Physical (bus) address of a lio_droq_info structure.
61  *  The device DMA's incoming packets and its information at the address
62  *  given by these descriptor fields.
63  */
64 struct lio_droq_desc {
65         /** The buffer pointer */
66         uint64_t buffer_ptr;
67
68         /** The Info pointer */
69         uint64_t info_ptr;
70 };
71
72 #define LIO_DROQ_DESC_SIZE      (sizeof(struct lio_droq_desc))
73
74 /** Information about packet DMA'ed by Octeon.
75  *  The format of the information available at Info Pointer after Octeon
76  *  has posted a packet. Not all descriptors have valid information. Only
77  *  the Info field of the first descriptor for a packet has information
78  *  about the packet.
79  */
80 struct lio_droq_info {
81         /** The Output Receive Header. */
82         union octeon_rh rh;
83
84         /** The Length of the packet. */
85         uint64_t length;
86 };
87
88 #define LIO_DROQ_INFO_SIZE      (sizeof(struct lio_droq_info))
89
90 /** Pointer to data buffer.
91  *  Driver keeps a pointer to the data buffer that it made available to
92  *  the Octeon device. Since the descriptor ring keeps physical (bus)
93  *  addresses, this field is required for the driver to keep track of
94  *  the virtual address pointers.
95  */
96 struct lio_recv_buffer {
97         /** Packet buffer, including meta data. */
98         void *buffer;
99
100         /** Data in the packet buffer. */
101         uint8_t *data;
102
103 };
104
105 #define LIO_DROQ_RECVBUF_SIZE   (sizeof(struct lio_recv_buffer))
106
107 #define LIO_DROQ_SIZE           (sizeof(struct lio_droq))
108
109 #define LIO_IQ_SEND_OK          0
110 #define LIO_IQ_SEND_STOP        1
111 #define LIO_IQ_SEND_FAILED      -1
112
113 /* conditions */
114 #define LIO_REQTYPE_NONE                0
115 #define LIO_REQTYPE_NORESP_NET          1
116 #define LIO_REQTYPE_NORESP_NET_SG       2
117 #define LIO_REQTYPE_SOFT_COMMAND        3
118
119 struct lio_request_list {
120         uint32_t reqtype;
121         void *buf;
122 };
123
124 /*----------------------  INSTRUCTION FORMAT ----------------------------*/
125
126 struct lio_instr3_64B {
127         /** Pointer where the input data is available. */
128         uint64_t dptr;
129
130         /** Instruction Header. */
131         uint64_t ih3;
132
133         /** Instruction Header. */
134         uint64_t pki_ih3;
135
136         /** Input Request Header. */
137         uint64_t irh;
138
139         /** opcode/subcode specific parameters */
140         uint64_t ossp[2];
141
142         /** Return Data Parameters */
143         uint64_t rdp;
144
145         /** Pointer where the response for a RAW mode packet will be written
146          *  by Octeon.
147          */
148         uint64_t rptr;
149
150 };
151
152 union lio_instr_64B {
153         struct lio_instr3_64B cmd3;
154 };
155
156 /** The size of each buffer in soft command buffer pool */
157 #define LIO_SOFT_COMMAND_BUFFER_SIZE    1536
158
159 /** Maximum number of buffers to allocate into soft command buffer pool */
160 #define LIO_MAX_SOFT_COMMAND_BUFFERS    255
161
162 struct lio_soft_command {
163         /** Soft command buffer info. */
164         struct lio_stailq_node node;
165         uint64_t dma_addr;
166         uint32_t size;
167
168         /** Command and return status */
169         union lio_instr_64B cmd;
170
171 #define LIO_COMPLETION_WORD_INIT        0xffffffffffffffffULL
172         uint64_t *status_word;
173
174         /** Data buffer info */
175         void *virtdptr;
176         uint64_t dmadptr;
177         uint32_t datasize;
178
179         /** Return buffer info */
180         void *virtrptr;
181         uint64_t dmarptr;
182         uint32_t rdatasize;
183
184         /** Context buffer info */
185         void *ctxptr;
186         uint32_t ctxsize;
187
188         /** Time out and callback */
189         size_t wait_time;
190         size_t timeout;
191         uint32_t iq_no;
192         void (*callback)(uint32_t, void *);
193         void *callback_arg;
194         struct rte_mbuf *mbuf;
195 };
196
197 struct lio_iq_post_status {
198         int status;
199         int index;
200 };
201
202 /*   wqe
203  *  ---------------  0
204  * |  wqe  word0-3 |
205  *  ---------------  32
206  * |    PCI IH     |
207  *  ---------------  40
208  * |     RPTR      |
209  *  ---------------  48
210  * |    PCI IRH    |
211  *  ---------------  56
212  * |    OCTEON_CMD |
213  *  ---------------  64
214  * | Addtl 8-BData |
215  * |               |
216  *  ---------------
217  */
218
219 union octeon_cmd {
220         uint64_t cmd64;
221
222         struct  {
223 #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
224                 uint64_t cmd : 5;
225
226                 uint64_t more : 6; /* How many udd words follow the command */
227
228                 uint64_t reserved : 29;
229
230                 uint64_t param1 : 16;
231
232                 uint64_t param2 : 8;
233
234 #elif RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
235
236                 uint64_t param2 : 8;
237
238                 uint64_t param1 : 16;
239
240                 uint64_t reserved : 29;
241
242                 uint64_t more : 6;
243
244                 uint64_t cmd : 5;
245
246 #endif
247         } s;
248 };
249
250 #define OCTEON_CMD_SIZE (sizeof(union octeon_cmd))
251
252 /** Structure of data information passed by driver to the BASE
253  *  layer when forwarding data to Octeon device software.
254  */
255 struct lio_data_pkt {
256         /** Pointer to information maintained by NIC module for this packet. The
257          *  BASE layer passes this as-is to the driver.
258          */
259         void *buf;
260
261         /** Type of buffer passed in "buf" above. */
262         uint32_t reqtype;
263
264         /** Total data bytes to be transferred in this command. */
265         uint32_t datasize;
266
267         /** Command to be passed to the Octeon device software. */
268         union lio_instr_64B cmd;
269
270         /** Input queue to use to send this command. */
271         uint32_t q_no;
272 };
273
274 /** Structure passed by driver to BASE layer to prepare a command to send
275  *  network data to Octeon.
276  */
277 union lio_cmd_setup {
278         struct {
279                 uint32_t iq_no : 8;
280                 uint32_t gather : 1;
281                 uint32_t timestamp : 1;
282                 uint32_t ip_csum : 1;
283                 uint32_t transport_csum : 1;
284                 uint32_t tnl_csum : 1;
285                 uint32_t rsvd : 19;
286
287                 union {
288                         uint32_t datasize;
289                         uint32_t gatherptrs;
290                 } u;
291         } s;
292
293         uint64_t cmd_setup64;
294 };
295
296 /* Instruction Header */
297 struct octeon_instr_ih3 {
298 #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
299
300         /** Reserved3 */
301         uint64_t reserved3 : 1;
302
303         /** Gather indicator 1=gather*/
304         uint64_t gather : 1;
305
306         /** Data length OR no. of entries in gather list */
307         uint64_t dlengsz : 14;
308
309         /** Front Data size */
310         uint64_t fsz : 6;
311
312         /** Reserved2 */
313         uint64_t reserved2 : 4;
314
315         /** PKI port kind - PKIND */
316         uint64_t pkind : 6;
317
318         /** Reserved1 */
319         uint64_t reserved1 : 32;
320
321 #elif RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
322         /** Reserved1 */
323         uint64_t reserved1 : 32;
324
325         /** PKI port kind - PKIND */
326         uint64_t pkind : 6;
327
328         /** Reserved2 */
329         uint64_t reserved2 : 4;
330
331         /** Front Data size */
332         uint64_t fsz : 6;
333
334         /** Data length OR no. of entries in gather list */
335         uint64_t dlengsz : 14;
336
337         /** Gather indicator 1=gather*/
338         uint64_t gather : 1;
339
340         /** Reserved3 */
341         uint64_t reserved3 : 1;
342
343 #endif
344 };
345
346 /* PKI Instruction Header(PKI IH) */
347 struct octeon_instr_pki_ih3 {
348 #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
349
350         /** Wider bit */
351         uint64_t w : 1;
352
353         /** Raw mode indicator 1 = RAW */
354         uint64_t raw : 1;
355
356         /** Use Tag */
357         uint64_t utag : 1;
358
359         /** Use QPG */
360         uint64_t uqpg : 1;
361
362         /** Reserved2 */
363         uint64_t reserved2 : 1;
364
365         /** Parse Mode */
366         uint64_t pm : 3;
367
368         /** Skip Length */
369         uint64_t sl : 8;
370
371         /** Use Tag Type */
372         uint64_t utt : 1;
373
374         /** Tag type */
375         uint64_t tagtype : 2;
376
377         /** Reserved1 */
378         uint64_t reserved1 : 2;
379
380         /** QPG Value */
381         uint64_t qpg : 11;
382
383         /** Tag Value */
384         uint64_t tag : 32;
385
386 #elif RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
387
388         /** Tag Value */
389         uint64_t tag : 32;
390
391         /** QPG Value */
392         uint64_t qpg : 11;
393
394         /** Reserved1 */
395         uint64_t reserved1 : 2;
396
397         /** Tag type */
398         uint64_t tagtype : 2;
399
400         /** Use Tag Type */
401         uint64_t utt : 1;
402
403         /** Skip Length */
404         uint64_t sl : 8;
405
406         /** Parse Mode */
407         uint64_t pm : 3;
408
409         /** Reserved2 */
410         uint64_t reserved2 : 1;
411
412         /** Use QPG */
413         uint64_t uqpg : 1;
414
415         /** Use Tag */
416         uint64_t utag : 1;
417
418         /** Raw mode indicator 1 = RAW */
419         uint64_t raw : 1;
420
421         /** Wider bit */
422         uint64_t w : 1;
423 #endif
424 };
425
426 /** Input Request Header */
427 struct octeon_instr_irh {
428 #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
429         uint64_t opcode : 4;
430         uint64_t rflag : 1;
431         uint64_t subcode : 7;
432         uint64_t vlan : 12;
433         uint64_t priority : 3;
434         uint64_t reserved : 5;
435         uint64_t ossp : 32; /* opcode/subcode specific parameters */
436 #elif RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
437         uint64_t ossp : 32; /* opcode/subcode specific parameters */
438         uint64_t reserved : 5;
439         uint64_t priority : 3;
440         uint64_t vlan : 12;
441         uint64_t subcode : 7;
442         uint64_t rflag : 1;
443         uint64_t opcode : 4;
444 #endif
445 };
446
447 /* pkiih3 + irh + ossp[0] + ossp[1] + rdp + rptr = 40 bytes */
448 #define OCTEON_SOFT_CMD_RESP_IH3        (40 + 8)
449 /* pki_h3 + irh + ossp[0] + ossp[1] = 32 bytes */
450 #define OCTEON_PCI_CMD_O3               (24 + 8)
451
452 /** Return Data Parameters */
453 struct octeon_instr_rdp {
454 #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
455         uint64_t reserved : 49;
456         uint64_t pcie_port : 3;
457         uint64_t rlen : 12;
458 #elif RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
459         uint64_t rlen : 12;
460         uint64_t pcie_port : 3;
461         uint64_t reserved : 49;
462 #endif
463 };
464
465 union octeon_packet_params {
466         uint32_t pkt_params32;
467         struct {
468 #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
469                 uint32_t reserved : 24;
470                 uint32_t ip_csum : 1; /* Perform IP header checksum(s) */
471                 /* Perform Outer transport header checksum */
472                 uint32_t transport_csum : 1;
473                 /* Find tunnel, and perform transport csum. */
474                 uint32_t tnl_csum : 1;
475                 uint32_t tsflag : 1;   /* Timestamp this packet */
476                 uint32_t ipsec_ops : 4; /* IPsec operation */
477 #else
478                 uint32_t ipsec_ops : 4;
479                 uint32_t tsflag : 1;
480                 uint32_t tnl_csum : 1;
481                 uint32_t transport_csum : 1;
482                 uint32_t ip_csum : 1;
483                 uint32_t reserved : 7;
484 #endif
485         } s;
486 };
487
488 /** Utility function to prepare a 64B NIC instruction based on a setup command
489  * @param cmd - pointer to instruction to be filled in.
490  * @param setup - pointer to the setup structure
491  * @param q_no - which queue for back pressure
492  *
493  * Assumes the cmd instruction is pre-allocated, but no fields are filled in.
494  */
495 static inline void
496 lio_prepare_pci_cmd(struct lio_device *lio_dev,
497                     union lio_instr_64B *cmd,
498                     union lio_cmd_setup *setup,
499                     uint32_t tag)
500 {
501         union octeon_packet_params packet_params;
502         struct octeon_instr_pki_ih3 *pki_ih3;
503         struct octeon_instr_irh *irh;
504         struct octeon_instr_ih3 *ih3;
505         int port;
506
507         memset(cmd, 0, sizeof(union lio_instr_64B));
508
509         ih3 = (struct octeon_instr_ih3 *)&cmd->cmd3.ih3;
510         pki_ih3 = (struct octeon_instr_pki_ih3 *)&cmd->cmd3.pki_ih3;
511
512         /* assume that rflag is cleared so therefore front data will only have
513          * irh and ossp[1] and ossp[2] for a total of 24 bytes
514          */
515         ih3->pkind = lio_dev->instr_queue[setup->s.iq_no]->txpciq.s.pkind;
516         /* PKI IH */
517         ih3->fsz = OCTEON_PCI_CMD_O3;
518
519         if (!setup->s.gather) {
520                 ih3->dlengsz = setup->s.u.datasize;
521         } else {
522                 ih3->gather = 1;
523                 ih3->dlengsz = setup->s.u.gatherptrs;
524         }
525
526         pki_ih3->w = 1;
527         pki_ih3->raw = 0;
528         pki_ih3->utag = 0;
529         pki_ih3->utt = 1;
530         pki_ih3->uqpg = lio_dev->instr_queue[setup->s.iq_no]->txpciq.s.use_qpg;
531
532         port = (int)lio_dev->instr_queue[setup->s.iq_no]->txpciq.s.port;
533
534         if (tag)
535                 pki_ih3->tag = tag;
536         else
537                 pki_ih3->tag = LIO_DATA(port);
538
539         pki_ih3->tagtype = OCTEON_ORDERED_TAG;
540         pki_ih3->qpg = lio_dev->instr_queue[setup->s.iq_no]->txpciq.s.qpg;
541         pki_ih3->pm = 0x0; /* parse from L2 */
542         pki_ih3->sl = 32;  /* sl will be sizeof(pki_ih3) + irh + ossp0 + ossp1*/
543
544         irh = (struct octeon_instr_irh *)&cmd->cmd3.irh;
545
546         irh->opcode = LIO_OPCODE;
547         irh->subcode = LIO_OPCODE_NW_DATA;
548
549         packet_params.pkt_params32 = 0;
550         packet_params.s.ip_csum = setup->s.ip_csum;
551         packet_params.s.transport_csum = setup->s.transport_csum;
552         packet_params.s.tsflag = setup->s.timestamp;
553
554         irh->ossp = packet_params.pkt_params32;
555 }
556
557 int lio_setup_sc_buffer_pool(struct lio_device *lio_dev);
558 void lio_free_sc_buffer_pool(struct lio_device *lio_dev);
559
560 struct lio_soft_command *
561 lio_alloc_soft_command(struct lio_device *lio_dev,
562                        uint32_t datasize, uint32_t rdatasize,
563                        uint32_t ctxsize);
564 void lio_prepare_soft_command(struct lio_device *lio_dev,
565                               struct lio_soft_command *sc,
566                               uint8_t opcode, uint8_t subcode,
567                               uint32_t irh_ossp, uint64_t ossp0,
568                               uint64_t ossp1);
569 int lio_send_soft_command(struct lio_device *lio_dev,
570                           struct lio_soft_command *sc);
571 void lio_free_soft_command(struct lio_soft_command *sc);
572
573 /** Maximum ordered requests to process in every invocation of
574  *  lio_process_ordered_list(). The function will continue to process requests
575  *  as long as it can find one that has finished processing. If it keeps
576  *  finding requests that have completed, the function can run for ever. The
577  *  value defined here sets an upper limit on the number of requests it can
578  *  process before it returns control to the poll thread.
579  */
580 #define LIO_MAX_ORD_REQS_TO_PROCESS     4096
581
582 /** Error codes used in Octeon Host-Core communication.
583  *
584  *   31         16 15           0
585  *   ----------------------------
586  * |            |               |
587  *   ----------------------------
588  *   Error codes are 32-bit wide. The upper 16-bits, called Major Error Number,
589  *   are reserved to identify the group to which the error code belongs. The
590  *   lower 16-bits, called Minor Error Number, carry the actual code.
591  *
592  *   So error codes are (MAJOR NUMBER << 16)| MINOR_NUMBER.
593  */
594 /** Status for a request.
595  *  If the request is successfully queued, the driver will return
596  *  a LIO_REQUEST_PENDING status. LIO_REQUEST_TIMEOUT is only returned by
597  *  the driver if the response for request failed to arrive before a
598  *  time-out period or if the request processing * got interrupted due to
599  *  a signal respectively.
600  */
601 enum {
602         /** A value of 0x00000000 indicates no error i.e. success */
603         LIO_REQUEST_DONE        = 0x00000000,
604         /** (Major number: 0x0000; Minor Number: 0x0001) */
605         LIO_REQUEST_PENDING     = 0x00000001,
606         LIO_REQUEST_TIMEOUT     = 0x00000003,
607
608 };
609
610 /*------ Error codes used by firmware (bits 15..0 set by firmware */
611 #define LIO_FIRMWARE_MAJOR_ERROR_CODE    0x0001
612 #define LIO_FIRMWARE_STATUS_CODE(status) \
613         ((LIO_FIRMWARE_MAJOR_ERROR_CODE << 16) | (status))
614
615 /** Initialize the response lists. The number of response lists to create is
616  *  given by count.
617  *  @param lio_dev - the lio device structure.
618  */
619 void lio_setup_response_list(struct lio_device *lio_dev);
620
621 /** Check the status of first entry in the ordered list. If the instruction at
622  *  that entry finished processing or has timed-out, the entry is cleaned.
623  *  @param lio_dev - the lio device structure.
624  *  @return 1 if the ordered list is empty, 0 otherwise.
625  */
626 int lio_process_ordered_list(struct lio_device *lio_dev);
627
628 static inline void
629 lio_swap_8B_data(uint64_t *data, uint32_t blocks)
630 {
631         while (blocks) {
632                 *data = rte_cpu_to_be_64(*data);
633                 blocks--;
634                 data++;
635         }
636 }
637
638 static inline uint64_t
639 lio_map_ring(void *buf)
640 {
641         phys_addr_t dma_addr;
642
643         dma_addr = rte_mbuf_data_dma_addr_default(((struct rte_mbuf *)buf));
644
645         return (uint64_t)dma_addr;
646 }
647
648 static inline uint64_t
649 lio_map_ring_info(struct lio_droq *droq, uint32_t i)
650 {
651         phys_addr_t dma_addr;
652
653         dma_addr = droq->info_list_dma + (i * LIO_DROQ_INFO_SIZE);
654
655         return (uint64_t)dma_addr;
656 }
657
658 static inline int
659 lio_opcode_slow_path(union octeon_rh *rh)
660 {
661         uint16_t subcode1, subcode2;
662
663         subcode1 = LIO_OPCODE_SUBCODE(rh->r.opcode, rh->r.subcode);
664         subcode2 = LIO_OPCODE_SUBCODE(LIO_OPCODE, LIO_OPCODE_NW_DATA);
665
666         return subcode2 != subcode1;
667 }
668
669 static inline void
670 lio_add_sg_size(struct lio_sg_entry *sg_entry,
671                 uint16_t size, uint32_t pos)
672 {
673 #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
674         sg_entry->u.size[pos] = size;
675 #elif RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
676         sg_entry->u.size[3 - pos] = size;
677 #endif
678 }
679
680 /* Macro to increment index.
681  * Index is incremented by count; if the sum exceeds
682  * max, index is wrapped-around to the start.
683  */
684 static inline uint32_t
685 lio_incr_index(uint32_t index, uint32_t count, uint32_t max)
686 {
687         if ((index + count) >= max)
688                 index = index + count - max;
689         else
690                 index += count;
691
692         return index;
693 }
694
695 int lio_setup_droq(struct lio_device *lio_dev, int q_no, int num_descs,
696                    int desc_size, struct rte_mempool *mpool,
697                    unsigned int socket_id);
698 uint16_t lio_dev_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
699                            uint16_t budget);
700 void lio_delete_droq_queue(struct lio_device *lio_dev, int oq_no);
701
702 void lio_delete_sglist(struct lio_instr_queue *txq);
703 int lio_setup_sglists(struct lio_device *lio_dev, int iq_no,
704                       int fw_mapped_iq, int num_descs, unsigned int socket_id);
705 uint16_t lio_dev_xmit_pkts(void *tx_queue, struct rte_mbuf **pkts,
706                            uint16_t nb_pkts);
707 int lio_setup_iq(struct lio_device *lio_dev, int q_index,
708                  union octeon_txpciq iq_no, uint32_t num_descs, void *app_ctx,
709                  unsigned int socket_id);
710 int lio_flush_iq(struct lio_device *lio_dev, struct lio_instr_queue *iq);
711 void lio_delete_instruction_queue(struct lio_device *lio_dev, int iq_no);
712 /** Setup instruction queue zero for the device
713  *  @param lio_dev which lio device to setup
714  *
715  *  @return 0 if success. -1 if fails
716  */
717 int lio_setup_instr_queue0(struct lio_device *lio_dev);
718 void lio_free_instr_queue0(struct lio_device *lio_dev);
719 #endif  /* _LIO_RXTX_H_ */