enic: Add api for link down count and to get firmware notification status.
authorScott Feldman <scofeldm@cisco.com>
Tue, 10 Feb 2009 07:25:33 +0000 (23:25 -0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 10 Feb 2009 07:25:33 +0000 (23:25 -0800)
Signed-off-by: Scott Feldman <scofeldm@cisco.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/enic/enic_main.c
drivers/net/enic/vnic_dev.c
drivers/net/enic/vnic_dev.h
drivers/net/enic/vnic_devcmd.h

index 83a7168deee463f310cb63127a38d267c11a94cc..03403a51f7eae0f95cb26a3517c2b4d22536a149 100644 (file)
@@ -1866,7 +1866,6 @@ static int __devinit enic_probe(struct pci_dev *pdev,
        if (using_dac)
                netdev->features |= NETIF_F_HIGHDMA;
 
-
        enic->csum_rx_enabled = ENIC_SETTING(enic, RXCSUM);
 
        enic->lro_mgr.max_aggr = ENIC_LRO_MAX_AGGR;
@@ -1878,7 +1877,6 @@ static int __devinit enic_probe(struct pci_dev *pdev,
        enic->lro_mgr.ip_summed = CHECKSUM_COMPLETE;
        enic->lro_mgr.ip_summed_aggr = CHECKSUM_UNNECESSARY;
 
-
        err = register_netdev(netdev);
        if (err) {
                printk(KERN_ERR PFX
index 11708579b6ce7c5bfd8143234bea6c1122cb1748..e21b9d636aecf9782a31545068529091b7212650 100644 (file)
@@ -34,6 +34,9 @@ struct vnic_res {
        unsigned int count;
 };
 
+#define VNIC_DEV_CAP_INIT      0x0001
+#define VNIC_DEV_CAP_PERBI     0x0002
+
 struct vnic_dev {
        void *priv;
        struct pci_dev *pdev;
@@ -50,6 +53,7 @@ struct vnic_dev {
        dma_addr_t stats_pa;
        struct vnic_devcmd_fw_info *fw_info;
        dma_addr_t fw_info_pa;
+       u32 cap_flags;
 };
 
 #define VNIC_MAX_RES_HDR_SIZE \
@@ -575,9 +579,9 @@ int vnic_dev_init(struct vnic_dev *vdev, int arg)
 {
        u64 a0 = (u32)arg, a1 = 0;
        int wait = 1000;
-        int r = 0;
+       int r = 0;
 
-       if (vnic_dev_capable(vdev, CMD_INIT))
+       if (vdev->cap_flags & VNIC_DEV_CAP_INIT)
                r = vnic_dev_cmd(vdev, CMD_INIT, &a0, &a1, wait);
        else {
                vnic_dev_cmd(vdev, CMD_INIT_v1, &a0, &a1, wait);
@@ -587,8 +591,8 @@ int vnic_dev_init(struct vnic_dev *vdev, int arg)
                        vnic_dev_cmd(vdev, CMD_MAC_ADDR, &a0, &a1, wait);
                        vnic_dev_cmd(vdev, CMD_ADDR_ADD, &a0, &a1, wait);
                }
-        }
-        return r;
+       }
+       return r;
 }
 
 int vnic_dev_link_status(struct vnic_dev *vdev)
@@ -626,6 +630,22 @@ u32 vnic_dev_mtu(struct vnic_dev *vdev)
        return vdev->notify_copy.mtu;
 }
 
+u32 vnic_dev_link_down_cnt(struct vnic_dev *vdev)
+{
+       if (!vnic_dev_notify_ready(vdev))
+               return 0;
+
+       return vdev->notify_copy.link_down_cnt;
+}
+
+u32 vnic_dev_notify_status(struct vnic_dev *vdev)
+{
+       if (!vnic_dev_notify_ready(vdev))
+               return 0;
+
+       return vdev->notify_copy.status;
+}
+
 void vnic_dev_set_intr_mode(struct vnic_dev *vdev,
        enum vnic_dev_intr_mode intr_mode)
 {
@@ -682,6 +702,11 @@ struct vnic_dev *vnic_dev_register(struct vnic_dev *vdev,
        if (!vdev->devcmd)
                goto err_out;
 
+       vdev->cap_flags = 0;
+
+       if (vnic_dev_capable(vdev, CMD_INIT))
+               vdev->cap_flags |= VNIC_DEV_CAP_INIT;
+
        return vdev;
 
 err_out:
index b9dc1821c8050dbbe13157a02518c6fcab0face7..8aa8db2fd03fbc6f49334861d89374f074d3f930 100644 (file)
@@ -102,6 +102,8 @@ int vnic_dev_link_status(struct vnic_dev *vdev);
 u32 vnic_dev_port_speed(struct vnic_dev *vdev);
 u32 vnic_dev_msg_lvl(struct vnic_dev *vdev);
 u32 vnic_dev_mtu(struct vnic_dev *vdev);
+u32 vnic_dev_link_down_cnt(struct vnic_dev *vdev);
+u32 vnic_dev_notify_status(struct vnic_dev *vdev);
 int vnic_dev_close(struct vnic_dev *vdev);
 int vnic_dev_enable(struct vnic_dev *vdev);
 int vnic_dev_disable(struct vnic_dev *vdev);
index 8062c75154e60d83098aa61293ec338931b7614f..2587f34fbfbdc7c1be26bc9cd5e1ea008a5d68dc 100644 (file)
@@ -191,7 +191,7 @@ enum vnic_devcmd_cmd {
        CMD_INIT_STATUS         = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 31),
 
        /* INT13 API: (u64)a0=paddr to vnic_int13_params struct
-        *            (u8)a1=INT13_CMD_xxx */
+        *            (u32)a1=INT13_CMD_xxx */
        CMD_INT13               = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_FC, 32),
 
        /* logical uplink enable/disable: (u64)a0: 0/1=disable/enable */
@@ -207,6 +207,11 @@ enum vnic_devcmd_cmd {
         * in:  (u32)a0=cmd
         * out: (u32)a0=errno, 0:valid cmd, a1=supported VNIC_STF_* bits */
        CMD_CAPABILITY          = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 36),
+
+       /* persistent binding info
+        * in:  (u64)a0=paddr of arg
+        *      (u32)a1=CMD_PERBI_XXX */
+       CMD_PERBI               = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_FC, 37),
 };
 
 /* flags for CMD_OPEN */
@@ -259,6 +264,7 @@ struct vnic_devcmd_notify {
        u32 status;             /* status bits (see VNIC_STF_*) */
        u32 error;              /* error code (see ERR_*) for first ERR */
        u32 link_down_cnt;      /* running count of link down transitions */
+       u32 perbi_rebuild_cnt;  /* running count of perbi rebuilds */
 };
 #define VNIC_STF_FATAL_ERR     0x0001  /* fatal fw error */
 #define VNIC_STF_STD_PAUSE     0x0002  /* standard link-level pause on */