Merge branch 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[pandora-kernel.git] / drivers / scsi / lpfc / lpfc_mbox.c
index 72e6adb..e84dc33 100644 (file)
@@ -1216,7 +1216,7 @@ lpfc_config_port(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
        phba->pcb->feature = FEATURE_INITIAL_SLI2;
 
        /* Setup Mailbox pointers */
-       phba->pcb->mailBoxSize = sizeof(MAILBOX_t);
+       phba->pcb->mailBoxSize = sizeof(MAILBOX_t) + MAILBOX_EXT_SIZE;
        offset = (uint8_t *)phba->mbox - (uint8_t *)phba->slim2p.virt;
        pdma_addr = phba->slim2p.phys + offset;
        phba->pcb->mbAddrHigh = putPaddrHigh(pdma_addr);
@@ -1272,28 +1272,41 @@ lpfc_config_port(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
         *
         */
 
-       if (phba->sli_rev == 3) {
-               phba->host_gp = &mb_slim->us.s3.host[0];
-               phba->hbq_put = &mb_slim->us.s3.hbq_put[0];
-       } else {
-               phba->host_gp = &mb_slim->us.s2.host[0];
+       if (phba->cfg_hostmem_hgp && phba->sli_rev != 3) {
+               phba->host_gp = &phba->mbox->us.s2.host[0];
                phba->hbq_put = NULL;
-       }
+               offset = (uint8_t *)&phba->mbox->us.s2.host -
+                       (uint8_t *)phba->slim2p.virt;
+               pdma_addr = phba->slim2p.phys + offset;
+               phba->pcb->hgpAddrHigh = putPaddrHigh(pdma_addr);
+               phba->pcb->hgpAddrLow = putPaddrLow(pdma_addr);
+       } else {
+               /* Always Host Group Pointer is in SLIM */
+               mb->un.varCfgPort.hps = 1;
 
-       /* mask off BAR0's flag bits 0 - 3 */
-       phba->pcb->hgpAddrLow = (bar_low & PCI_BASE_ADDRESS_MEM_MASK) +
-               (void __iomem *)phba->host_gp -
-               (void __iomem *)phba->MBslimaddr;
-       if (bar_low & PCI_BASE_ADDRESS_MEM_TYPE_64)
-               phba->pcb->hgpAddrHigh = bar_high;
-       else
-               phba->pcb->hgpAddrHigh = 0;
-       /* write HGP data to SLIM at the required longword offset */
-       memset(&hgp, 0, sizeof(struct lpfc_hgp));
+               if (phba->sli_rev == 3) {
+                       phba->host_gp = &mb_slim->us.s3.host[0];
+                       phba->hbq_put = &mb_slim->us.s3.hbq_put[0];
+               } else {
+                       phba->host_gp = &mb_slim->us.s2.host[0];
+                       phba->hbq_put = NULL;
+               }
 
-       for (i=0; i < phba->sli.num_rings; i++) {
-               lpfc_memcpy_to_slim(phba->host_gp + i, &hgp,
+               /* mask off BAR0's flag bits 0 - 3 */
+               phba->pcb->hgpAddrLow = (bar_low & PCI_BASE_ADDRESS_MEM_MASK) +
+                       (void __iomem *)phba->host_gp -
+                       (void __iomem *)phba->MBslimaddr;
+               if (bar_low & PCI_BASE_ADDRESS_MEM_TYPE_64)
+                       phba->pcb->hgpAddrHigh = bar_high;
+               else
+                       phba->pcb->hgpAddrHigh = 0;
+               /* write HGP data to SLIM at the required longword offset */
+               memset(&hgp, 0, sizeof(struct lpfc_hgp));
+
+               for (i = 0; i < phba->sli.num_rings; i++) {
+                       lpfc_memcpy_to_slim(phba->host_gp + i, &hgp,
                                    sizeof(*phba->host_gp));
+               }
        }
 
        /* Setup Port Group offset */
@@ -1598,7 +1611,7 @@ lpfc_sli4_mbox_cmd_free(struct lpfc_hba *phba, struct lpfcMboxq *mbox)
        for (sgentry = 0; sgentry < sgecount; sgentry++) {
                lpfc_sli4_mbx_sge_get(mbox, sgentry, &sge);
                phyaddr = getPaddr(sge.pa_hi, sge.pa_lo);
-               dma_free_coherent(&phba->pcidev->dev, PAGE_SIZE,
+               dma_free_coherent(&phba->pcidev->dev, SLI4_PAGE_SIZE,
                                  mbox->sge_array->addr[sgentry], phyaddr);
        }
        /* Free the sge address array memory */
@@ -1656,7 +1669,7 @@ lpfc_sli4_config(struct lpfc_hba *phba, struct lpfcMboxq *mbox,
        }
 
        /* Setup for the none-embedded mbox command */
-       pcount = (PAGE_ALIGN(length))/PAGE_SIZE;
+       pcount = (PAGE_ALIGN(length))/SLI4_PAGE_SIZE;
        pcount = (pcount > LPFC_SLI4_MBX_SGE_MAX_PAGES) ?
                                LPFC_SLI4_MBX_SGE_MAX_PAGES : pcount;
        /* Allocate record for keeping SGE virtual addresses */
@@ -1671,24 +1684,24 @@ lpfc_sli4_config(struct lpfc_hba *phba, struct lpfcMboxq *mbox,
        for (pagen = 0, alloc_len = 0; pagen < pcount; pagen++) {
                /* The DMA memory is always allocated in the length of a
                 * page even though the last SGE might not fill up to a
-                * page, this is used as a priori size of PAGE_SIZE for
+                * page, this is used as a priori size of SLI4_PAGE_SIZE for
                 * the later DMA memory free.
                 */
-               viraddr = dma_alloc_coherent(&phba->pcidev->dev, PAGE_SIZE,
+               viraddr = dma_alloc_coherent(&phba->pcidev->dev, SLI4_PAGE_SIZE,
                                             &phyaddr, GFP_KERNEL);
                /* In case of malloc fails, proceed with whatever we have */
                if (!viraddr)
                        break;
-               memset(viraddr, 0, PAGE_SIZE);
+               memset(viraddr, 0, SLI4_PAGE_SIZE);
                mbox->sge_array->addr[pagen] = viraddr;
                /* Keep the first page for later sub-header construction */
                if (pagen == 0)
                        cfg_shdr = (union lpfc_sli4_cfg_shdr *)viraddr;
                resid_len = length - alloc_len;
-               if (resid_len > PAGE_SIZE) {
+               if (resid_len > SLI4_PAGE_SIZE) {
                        lpfc_sli4_mbx_sge_set(mbox, pagen, phyaddr,
-                                             PAGE_SIZE);
-                       alloc_len += PAGE_SIZE;
+                                             SLI4_PAGE_SIZE);
+                       alloc_len += SLI4_PAGE_SIZE;
                } else {
                        lpfc_sli4_mbx_sge_set(mbox, pagen, phyaddr,
                                              resid_len);
@@ -1886,6 +1899,8 @@ lpfc_reg_vfi(struct lpfcMboxq *mbox, struct lpfc_vport *vport, dma_addr_t phys)
        memcpy(reg_vfi->wwn, &vport->fc_portname, sizeof(struct lpfc_name));
        reg_vfi->wwn[0] = cpu_to_le32(reg_vfi->wwn[0]);
        reg_vfi->wwn[1] = cpu_to_le32(reg_vfi->wwn[1]);
+       reg_vfi->e_d_tov = vport->phba->fc_edtov;
+       reg_vfi->r_a_tov = vport->phba->fc_ratov;
        reg_vfi->bde.addrHigh = putPaddrHigh(phys);
        reg_vfi->bde.addrLow = putPaddrLow(phys);
        reg_vfi->bde.tus.f.bdeSize = sizeof(vport->fc_sparam);