be2net: Bug fix to support newer generation of BE ASIC
authorAjit Khaparde <ajitk@serverengines.com>
Wed, 27 Jan 2010 21:56:44 +0000 (21:56 +0000)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 9 Feb 2010 12:50:59 +0000 (04:50 -0800)
commit 7b139c83c590d4965259aad8889cbb08104b2891 upstream.

Bug fix in be2net for newer generation of BladeEngine ASIC.

Signed-off-by: Ajit Khaparde <ajitk@serverengines.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/net/benet/be.h
drivers/net/benet/be_cmds.h
drivers/net/benet/be_main.c

index a84f1c55378da8ff08171c990a5c7f6c4943f3b2..511b92237ad09f27b9cc0b2d8775f331a3dfc4b0 100644 (file)
@@ -272,8 +272,13 @@ struct be_adapter {
        u32 cap;
        u32 rx_fc;              /* Rx flow control */
        u32 tx_fc;              /* Tx flow control */
+       u8 generation;          /* BladeEngine ASIC generation */
 };
 
+/* BladeEngine Generation numbers */
+#define BE_GEN2 2
+#define BE_GEN3 3
+
 extern const struct ethtool_ops be_ethtool_ops;
 
 #define drvr_stats(adapter)            (&adapter->stats.drvr_stats)
index e5f9676cf1bcfdd06ba797e3e32d47ec65c7aa10..ad33d5508f54145f75d4bdb4486b1da1deecb27f 100644 (file)
@@ -154,7 +154,8 @@ struct be_cmd_req_hdr {
        u8 domain;              /* dword 0 */
        u32 timeout;            /* dword 1 */
        u32 request_length;     /* dword 2 */
-       u32 rsvd;               /* dword 3 */
+       u8 version;             /* dword 3 */
+       u8 rsvd[3];             /* dword 3 */
 };
 
 #define RESP_HDR_INFO_OPCODE_SHIFT     0       /* bits 0 - 7 */
index 3749bb1e8ba5d67624552f42cbbc4fa3cb55a273..a25da9aeedaac0c9abf345c1c4bf95ad47e218fb 100644 (file)
@@ -1944,6 +1944,7 @@ static void be_unmap_pci_bars(struct be_adapter *adapter)
 static int be_map_pci_bars(struct be_adapter *adapter)
 {
        u8 __iomem *addr;
+       int pcicfg_reg;
 
        addr = ioremap_nocache(pci_resource_start(adapter->pdev, 2),
                        pci_resource_len(adapter->pdev, 2));
@@ -1957,8 +1958,13 @@ static int be_map_pci_bars(struct be_adapter *adapter)
                goto pci_map_err;
        adapter->db = addr;
 
-       addr = ioremap_nocache(pci_resource_start(adapter->pdev, 1),
-                       pci_resource_len(adapter->pdev, 1));
+       if (adapter->generation == BE_GEN2)
+               pcicfg_reg = 1;
+       else
+               pcicfg_reg = 0;
+
+       addr = ioremap_nocache(pci_resource_start(adapter->pdev, pcicfg_reg),
+                       pci_resource_len(adapter->pdev, pcicfg_reg));
        if (addr == NULL)
                goto pci_map_err;
        adapter->pcicfg = addr;
@@ -2028,6 +2034,7 @@ static int be_stats_init(struct be_adapter *adapter)
        cmd->va = pci_alloc_consistent(adapter->pdev, cmd->size, &cmd->dma);
        if (cmd->va == NULL)
                return -1;
+       memset(cmd->va, cmd->size, 0);
        return 0;
 }
 
@@ -2101,6 +2108,20 @@ static int __devinit be_probe(struct pci_dev *pdev,
                goto rel_reg;
        }
        adapter = netdev_priv(netdev);
+
+       switch (pdev->device) {
+       case BE_DEVICE_ID1:
+       case OC_DEVICE_ID1:
+               adapter->generation = BE_GEN2;
+               break;
+       case BE_DEVICE_ID2:
+       case OC_DEVICE_ID2:
+               adapter->generation = BE_GEN3;
+               break;
+       default:
+               adapter->generation = 0;
+       }
+
        adapter->pdev = pdev;
        pci_set_drvdata(pdev, adapter);
        adapter->netdev = netdev;