Commit 4cdc44a2 authored by Scott Feldman's avatar Scott Feldman Committed by David S. Miller

enic: Add api for link down count and to get firmware notification status.

Signed-off-by: default avatarScott Feldman <scofeldm@cisco.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 68f71708
...@@ -1866,7 +1866,6 @@ static int __devinit enic_probe(struct pci_dev *pdev, ...@@ -1866,7 +1866,6 @@ static int __devinit enic_probe(struct pci_dev *pdev,
if (using_dac) if (using_dac)
netdev->features |= NETIF_F_HIGHDMA; netdev->features |= NETIF_F_HIGHDMA;
enic->csum_rx_enabled = ENIC_SETTING(enic, RXCSUM); enic->csum_rx_enabled = ENIC_SETTING(enic, RXCSUM);
enic->lro_mgr.max_aggr = ENIC_LRO_MAX_AGGR; enic->lro_mgr.max_aggr = ENIC_LRO_MAX_AGGR;
...@@ -1878,7 +1877,6 @@ static int __devinit enic_probe(struct pci_dev *pdev, ...@@ -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 = CHECKSUM_COMPLETE;
enic->lro_mgr.ip_summed_aggr = CHECKSUM_UNNECESSARY; enic->lro_mgr.ip_summed_aggr = CHECKSUM_UNNECESSARY;
err = register_netdev(netdev); err = register_netdev(netdev);
if (err) { if (err) {
printk(KERN_ERR PFX printk(KERN_ERR PFX
......
...@@ -34,6 +34,9 @@ struct vnic_res { ...@@ -34,6 +34,9 @@ struct vnic_res {
unsigned int count; unsigned int count;
}; };
#define VNIC_DEV_CAP_INIT 0x0001
#define VNIC_DEV_CAP_PERBI 0x0002
struct vnic_dev { struct vnic_dev {
void *priv; void *priv;
struct pci_dev *pdev; struct pci_dev *pdev;
...@@ -50,6 +53,7 @@ struct vnic_dev { ...@@ -50,6 +53,7 @@ struct vnic_dev {
dma_addr_t stats_pa; dma_addr_t stats_pa;
struct vnic_devcmd_fw_info *fw_info; struct vnic_devcmd_fw_info *fw_info;
dma_addr_t fw_info_pa; dma_addr_t fw_info_pa;
u32 cap_flags;
}; };
#define VNIC_MAX_RES_HDR_SIZE \ #define VNIC_MAX_RES_HDR_SIZE \
...@@ -575,9 +579,9 @@ int vnic_dev_init(struct vnic_dev *vdev, int arg) ...@@ -575,9 +579,9 @@ int vnic_dev_init(struct vnic_dev *vdev, int arg)
{ {
u64 a0 = (u32)arg, a1 = 0; u64 a0 = (u32)arg, a1 = 0;
int wait = 1000; 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); r = vnic_dev_cmd(vdev, CMD_INIT, &a0, &a1, wait);
else { else {
vnic_dev_cmd(vdev, CMD_INIT_v1, &a0, &a1, wait); vnic_dev_cmd(vdev, CMD_INIT_v1, &a0, &a1, wait);
...@@ -587,8 +591,8 @@ int vnic_dev_init(struct vnic_dev *vdev, int arg) ...@@ -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_MAC_ADDR, &a0, &a1, wait);
vnic_dev_cmd(vdev, CMD_ADDR_ADD, &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) int vnic_dev_link_status(struct vnic_dev *vdev)
...@@ -626,6 +630,22 @@ u32 vnic_dev_mtu(struct vnic_dev *vdev) ...@@ -626,6 +630,22 @@ u32 vnic_dev_mtu(struct vnic_dev *vdev)
return vdev->notify_copy.mtu; 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, void vnic_dev_set_intr_mode(struct vnic_dev *vdev,
enum vnic_dev_intr_mode intr_mode) enum vnic_dev_intr_mode intr_mode)
{ {
...@@ -682,6 +702,11 @@ struct vnic_dev *vnic_dev_register(struct vnic_dev *vdev, ...@@ -682,6 +702,11 @@ struct vnic_dev *vnic_dev_register(struct vnic_dev *vdev,
if (!vdev->devcmd) if (!vdev->devcmd)
goto err_out; goto err_out;
vdev->cap_flags = 0;
if (vnic_dev_capable(vdev, CMD_INIT))
vdev->cap_flags |= VNIC_DEV_CAP_INIT;
return vdev; return vdev;
err_out: err_out:
......
...@@ -102,6 +102,8 @@ int vnic_dev_link_status(struct vnic_dev *vdev); ...@@ -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_port_speed(struct vnic_dev *vdev);
u32 vnic_dev_msg_lvl(struct vnic_dev *vdev); u32 vnic_dev_msg_lvl(struct vnic_dev *vdev);
u32 vnic_dev_mtu(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_close(struct vnic_dev *vdev);
int vnic_dev_enable(struct vnic_dev *vdev); int vnic_dev_enable(struct vnic_dev *vdev);
int vnic_dev_disable(struct vnic_dev *vdev); int vnic_dev_disable(struct vnic_dev *vdev);
......
...@@ -191,7 +191,7 @@ enum vnic_devcmd_cmd { ...@@ -191,7 +191,7 @@ enum vnic_devcmd_cmd {
CMD_INIT_STATUS = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 31), CMD_INIT_STATUS = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 31),
/* INT13 API: (u64)a0=paddr to vnic_int13_params struct /* 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), CMD_INT13 = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_FC, 32),
/* logical uplink enable/disable: (u64)a0: 0/1=disable/enable */ /* logical uplink enable/disable: (u64)a0: 0/1=disable/enable */
...@@ -207,6 +207,11 @@ enum vnic_devcmd_cmd { ...@@ -207,6 +207,11 @@ enum vnic_devcmd_cmd {
* in: (u32)a0=cmd * in: (u32)a0=cmd
* out: (u32)a0=errno, 0:valid cmd, a1=supported VNIC_STF_* bits */ * out: (u32)a0=errno, 0:valid cmd, a1=supported VNIC_STF_* bits */
CMD_CAPABILITY = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 36), 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 */ /* flags for CMD_OPEN */
...@@ -259,6 +264,7 @@ struct vnic_devcmd_notify { ...@@ -259,6 +264,7 @@ struct vnic_devcmd_notify {
u32 status; /* status bits (see VNIC_STF_*) */ u32 status; /* status bits (see VNIC_STF_*) */
u32 error; /* error code (see ERR_*) for first ERR */ u32 error; /* error code (see ERR_*) for first ERR */
u32 link_down_cnt; /* running count of link down transitions */ 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_FATAL_ERR 0x0001 /* fatal fw error */
#define VNIC_STF_STD_PAUSE 0x0002 /* standard link-level pause on */ #define VNIC_STF_STD_PAUSE 0x0002 /* standard link-level pause on */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment