Merge remote-tracking branch 'omap_dss2/for-next'
[deliverable/linux.git] / drivers / net / ethernet / cavium / liquidio / request_manager.c
index d32492f185ffc984be3abbcb5de1d81e53878348..90866bb5003321163138ba9a200694998f613942 100644 (file)
@@ -30,6 +30,7 @@
 #include "octeon_main.h"
 #include "octeon_network.h"
 #include "cn66xx_device.h"
+#include "cn23xx_pf_device.h"
 
 #define INCR_INSTRQUEUE_PKT_COUNT(octeon_dev_ptr, iq_no, field, count)  \
        (octeon_dev_ptr->instr_queue[iq_no]->stats.field += count)
@@ -71,7 +72,8 @@ int octeon_init_instr_queue(struct octeon_device *oct,
 
        if (OCTEON_CN6XXX(oct))
                conf = &(CFG_GET_IQ_CFG(CHIP_FIELD(oct, cn6xxx, conf)));
-
+       else if (OCTEON_CN23XX_PF(oct))
+               conf = &(CFG_GET_IQ_CFG(CHIP_FIELD(oct, cn23xx_pf, conf)));
        if (!conf) {
                dev_err(&oct->pci_dev->dev, "Unsupported Chip %x\n",
                        oct->chip_id);
@@ -88,6 +90,7 @@ int octeon_init_instr_queue(struct octeon_device *oct,
        q_size = (u32)conf->instr_type * num_descs;
 
        iq = oct->instr_queue[iq_no];
+
        iq->oct_dev = oct;
 
        set_dev_node(&oct->pci_dev->dev, numa_node);
@@ -181,6 +184,9 @@ int octeon_delete_instr_queue(struct octeon_device *oct, u32 iq_no)
        if (OCTEON_CN6XXX(oct))
                desc_size =
                    CFG_GET_IQ_INSTR_TYPE(CHIP_FIELD(oct, cn6xxx, conf));
+       else if (OCTEON_CN23XX_PF(oct))
+               desc_size =
+                   CFG_GET_IQ_INSTR_TYPE(CHIP_FIELD(oct, cn23xx_pf, conf));
 
        vfree(iq->request_list);
 
@@ -383,7 +389,12 @@ lio_process_iq_request_list(struct octeon_device *oct,
                case REQTYPE_SOFT_COMMAND:
                        sc = buf;
 
-                       irh = (struct octeon_instr_irh *)&sc->cmd.cmd2.irh;
+                       if (OCTEON_CN23XX_PF(oct))
+                               irh = (struct octeon_instr_irh *)
+                                       &sc->cmd.cmd3.irh;
+                       else
+                               irh = (struct octeon_instr_irh *)
+                                       &sc->cmd.cmd2.irh;
                        if (irh->rflag) {
                                /* We're expecting a response from Octeon.
                                 * It's up to lio_process_ordered_list() to
@@ -499,6 +510,7 @@ static void __check_db_timeout(struct octeon_device *oct, u64 iq_no)
 
        if (!oct)
                return;
+
        iq = oct->instr_queue[iq_no];
        if (!iq)
                return;
@@ -514,6 +526,8 @@ static void __check_db_timeout(struct octeon_device *oct, u64 iq_no)
 
        /* Flush the instruction queue */
        octeon_flush_iq(oct, iq, 1, 0);
+
+       lio_enable_irq(NULL, iq);
 }
 
 /* Called by the Poll thread at regular intervals to check the instruction
@@ -580,6 +594,8 @@ octeon_prepare_soft_command(struct octeon_device *oct,
 {
        struct octeon_config *oct_cfg;
        struct octeon_instr_ih2 *ih2;
+       struct octeon_instr_ih3 *ih3;
+       struct octeon_instr_pki_ih3 *pki_ih3;
        struct octeon_instr_irh *irh;
        struct octeon_instr_rdp *rdp;
 
@@ -588,36 +604,88 @@ octeon_prepare_soft_command(struct octeon_device *oct,
 
        oct_cfg = octeon_get_conf(oct);
 
-       ih2          = (struct octeon_instr_ih2 *)&sc->cmd.cmd2.ih2;
-       ih2->tagtype = ATOMIC_TAG;
-       ih2->tag     = LIO_CONTROL;
-       ih2->raw     = 1;
-       ih2->grp     = CFG_GET_CTRL_Q_GRP(oct_cfg);
-
-       if (sc->datasize) {
-               ih2->dlengsz = sc->datasize;
-               ih2->rs = 1;
-       }
-
-       irh            = (struct octeon_instr_irh *)&sc->cmd.cmd2.irh;
-       irh->opcode    = opcode;
-       irh->subcode   = subcode;
-
-       /* opcode/subcode specific parameters (ossp) */
-       irh->ossp       = irh_ossp;
-       sc->cmd.cmd2.ossp[0] = ossp0;
-       sc->cmd.cmd2.ossp[1] = ossp1;
-
-       if (sc->rdatasize) {
-               rdp = (struct octeon_instr_rdp *)&sc->cmd.cmd2.rdp;
-               rdp->pcie_port = oct->pcie_port;
-               rdp->rlen      = sc->rdatasize;
+       if (OCTEON_CN23XX_PF(oct)) {
+               ih3 = (struct octeon_instr_ih3 *)&sc->cmd.cmd3.ih3;
+
+               ih3->pkind = oct->instr_queue[sc->iq_no]->txpciq.s.pkind;
+
+               pki_ih3 = (struct octeon_instr_pki_ih3 *)&sc->cmd.cmd3.pki_ih3;
+
+               pki_ih3->w           = 1;
+               pki_ih3->raw         = 1;
+               pki_ih3->utag        = 1;
+               pki_ih3->uqpg        =
+                       oct->instr_queue[sc->iq_no]->txpciq.s.use_qpg;
+               pki_ih3->utt         = 1;
+               pki_ih3->tag     = LIO_CONTROL;
+               pki_ih3->tagtype = ATOMIC_TAG;
+               pki_ih3->qpg         =
+                       oct->instr_queue[sc->iq_no]->txpciq.s.qpg;
+               pki_ih3->pm          = 0x7;
+               pki_ih3->sl          = 8;
+
+               if (sc->datasize)
+                       ih3->dlengsz = sc->datasize;
+
+               irh            = (struct octeon_instr_irh *)&sc->cmd.cmd3.irh;
+               irh->opcode    = opcode;
+               irh->subcode   = subcode;
+
+               /* opcode/subcode specific parameters (ossp) */
+               irh->ossp       = irh_ossp;
+               sc->cmd.cmd3.ossp[0] = ossp0;
+               sc->cmd.cmd3.ossp[1] = ossp1;
+
+               if (sc->rdatasize) {
+                       rdp = (struct octeon_instr_rdp *)&sc->cmd.cmd3.rdp;
+                       rdp->pcie_port = oct->pcie_port;
+                       rdp->rlen      = sc->rdatasize;
+
+                       irh->rflag =  1;
+                       /*PKI IH3*/
+                       /* pki_ih3 irh+ossp[0]+ossp[1]+rdp+rptr = 48 bytes */
+                       ih3->fsz    = LIO_SOFTCMDRESP_IH3;
+               } else {
+                       irh->rflag =  0;
+                       /*PKI IH3*/
+                       /* pki_h3 + irh + ossp[0] + ossp[1] = 32 bytes */
+                       ih3->fsz    = LIO_PCICMD_O3;
+               }
 
-               irh->rflag =  1;
-               ih2->fsz   = 40; /* irh+ossp[0]+ossp[1]+rdp+rptr = 40 bytes */
        } else {
-               irh->rflag =  0;
-               ih2->fsz   = 24; /* irh + ossp[0] + ossp[1] = 24 bytes */
+               ih2          = (struct octeon_instr_ih2 *)&sc->cmd.cmd2.ih2;
+               ih2->tagtype = ATOMIC_TAG;
+               ih2->tag     = LIO_CONTROL;
+               ih2->raw     = 1;
+               ih2->grp     = CFG_GET_CTRL_Q_GRP(oct_cfg);
+
+               if (sc->datasize) {
+                       ih2->dlengsz = sc->datasize;
+                       ih2->rs = 1;
+               }
+
+               irh            = (struct octeon_instr_irh *)&sc->cmd.cmd2.irh;
+               irh->opcode    = opcode;
+               irh->subcode   = subcode;
+
+               /* opcode/subcode specific parameters (ossp) */
+               irh->ossp       = irh_ossp;
+               sc->cmd.cmd2.ossp[0] = ossp0;
+               sc->cmd.cmd2.ossp[1] = ossp1;
+
+               if (sc->rdatasize) {
+                       rdp = (struct octeon_instr_rdp *)&sc->cmd.cmd2.rdp;
+                       rdp->pcie_port = oct->pcie_port;
+                       rdp->rlen      = sc->rdatasize;
+
+                       irh->rflag =  1;
+                       /* irh+ossp[0]+ossp[1]+rdp+rptr = 40 bytes */
+                       ih2->fsz   = LIO_SOFTCMDRESP_IH2;
+               } else {
+                       irh->rflag =  0;
+                       /* irh + ossp[0] + ossp[1] = 24 bytes */
+                       ih2->fsz   = LIO_PCICMD_O2;
+               }
        }
 }
 
@@ -625,23 +693,39 @@ int octeon_send_soft_command(struct octeon_device *oct,
                             struct octeon_soft_command *sc)
 {
        struct octeon_instr_ih2 *ih2;
+       struct octeon_instr_ih3 *ih3;
        struct octeon_instr_irh *irh;
        u32 len;
 
-       ih2 = (struct octeon_instr_ih2 *)&sc->cmd.cmd2.ih2;
-       if (ih2->dlengsz) {
-               WARN_ON(!sc->dmadptr);
-               sc->cmd.cmd2.dptr = sc->dmadptr;
-       }
-       irh = (struct octeon_instr_irh *)&sc->cmd.cmd2.irh;
-       if (irh->rflag) {
-               WARN_ON(!sc->dmarptr);
-               WARN_ON(!sc->status_word);
-               *sc->status_word = COMPLETION_WORD_INIT;
-
-               sc->cmd.cmd2.rptr = sc->dmarptr;
+       if (OCTEON_CN23XX_PF(oct)) {
+               ih3 =  (struct octeon_instr_ih3 *)&sc->cmd.cmd3.ih3;
+               if (ih3->dlengsz) {
+                       WARN_ON(!sc->dmadptr);
+                       sc->cmd.cmd3.dptr = sc->dmadptr;
+               }
+               irh = (struct octeon_instr_irh *)&sc->cmd.cmd3.irh;
+               if (irh->rflag) {
+                       WARN_ON(!sc->dmarptr);
+                       WARN_ON(!sc->status_word);
+                       *sc->status_word = COMPLETION_WORD_INIT;
+                       sc->cmd.cmd3.rptr = sc->dmarptr;
+               }
+               len = (u32)ih3->dlengsz;
+       } else {
+               ih2 = (struct octeon_instr_ih2 *)&sc->cmd.cmd2.ih2;
+               if (ih2->dlengsz) {
+                       WARN_ON(!sc->dmadptr);
+                       sc->cmd.cmd2.dptr = sc->dmadptr;
+               }
+               irh = (struct octeon_instr_irh *)&sc->cmd.cmd2.irh;
+               if (irh->rflag) {
+                       WARN_ON(!sc->dmarptr);
+                       WARN_ON(!sc->status_word);
+                       *sc->status_word = COMPLETION_WORD_INIT;
+                       sc->cmd.cmd2.rptr = sc->dmarptr;
+               }
+               len = (u32)ih2->dlengsz;
        }
-       len = (u32)ih2->dlengsz;
 
        if (sc->wait_time)
                sc->timeout = jiffies + sc->wait_time;
This page took 0.028651 seconds and 5 git commands to generate.