Commit 90cf0b53 authored by Roopa Prabhu's avatar Roopa Prabhu Committed by David S. Miller

enic: Add support for firmware management device

This patch adds support for firmware management device in enic driver.
A management device is a virtual PCIe device that firmware can present
to the host as its management endpoint. It provides the interface between
the host and adapter firmware for all management operations.
Signed-off-by: default avatarScott Feldman <scofeldm@cisco.com>
Signed-off-by: default avatarRoopa Prabhu <roprabhu@cisco.com>
Signed-off-by: default avatarVasanthy Kolluri <vkolluri@cisco.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 294dab25
...@@ -74,6 +74,7 @@ static int vnic_dev_discover_res(struct vnic_dev *vdev, ...@@ -74,6 +74,7 @@ static int vnic_dev_discover_res(struct vnic_dev *vdev,
struct vnic_dev_bar *bar, unsigned int num_bars) struct vnic_dev_bar *bar, unsigned int num_bars)
{ {
struct vnic_resource_header __iomem *rh; struct vnic_resource_header __iomem *rh;
struct mgmt_barmap_hdr __iomem *mrh;
struct vnic_resource __iomem *r; struct vnic_resource __iomem *r;
u8 type; u8 type;
...@@ -86,22 +87,32 @@ static int vnic_dev_discover_res(struct vnic_dev *vdev, ...@@ -86,22 +87,32 @@ static int vnic_dev_discover_res(struct vnic_dev *vdev,
} }
rh = bar->vaddr; rh = bar->vaddr;
mrh = bar->vaddr;
if (!rh) { if (!rh) {
pr_err("vNIC BAR0 res hdr not mem-mapped\n"); pr_err("vNIC BAR0 res hdr not mem-mapped\n");
return -EINVAL; return -EINVAL;
} }
if (ioread32(&rh->magic) != VNIC_RES_MAGIC || /* Check for mgmt vnic in addition to normal vnic */
ioread32(&rh->version) != VNIC_RES_VERSION) { if ((ioread32(&rh->magic) != VNIC_RES_MAGIC) ||
(ioread32(&rh->version) != VNIC_RES_VERSION)) {
if ((ioread32(&mrh->magic) != MGMTVNIC_MAGIC) ||
(ioread32(&mrh->version) != MGMTVNIC_VERSION)) {
pr_err("vNIC BAR0 res magic/version error " pr_err("vNIC BAR0 res magic/version error "
"exp (%lx/%lx) curr (%x/%x)\n", "exp (%lx/%lx) or (%lx/%lx), curr (%x/%x)\n",
VNIC_RES_MAGIC, VNIC_RES_VERSION, VNIC_RES_MAGIC, VNIC_RES_VERSION,
MGMTVNIC_MAGIC, MGMTVNIC_VERSION,
ioread32(&rh->magic), ioread32(&rh->version)); ioread32(&rh->magic), ioread32(&rh->version));
return -EINVAL; return -EINVAL;
} }
}
if (ioread32(&mrh->magic) == MGMTVNIC_MAGIC)
r = (struct vnic_resource __iomem *)(mrh + 1);
else
r = (struct vnic_resource __iomem *)(rh + 1); r = (struct vnic_resource __iomem *)(rh + 1);
while ((type = ioread8(&r->type)) != RES_TYPE_EOL) { while ((type = ioread8(&r->type)) != RES_TYPE_EOL) {
u8 bar_num = ioread8(&r->bar); u8 bar_num = ioread8(&r->bar);
......
...@@ -22,6 +22,11 @@ ...@@ -22,6 +22,11 @@
#define VNIC_RES_MAGIC 0x766E6963L /* 'vnic' */ #define VNIC_RES_MAGIC 0x766E6963L /* 'vnic' */
#define VNIC_RES_VERSION 0x00000000L #define VNIC_RES_VERSION 0x00000000L
#define MGMTVNIC_MAGIC 0x544d474dL /* 'MGMT' */
#define MGMTVNIC_VERSION 0x00000000L
/* The MAC address assigned to the CFG vNIC is fixed. */
#define MGMTVNIC_MAC { 0x02, 0x00, 0x54, 0x4d, 0x47, 0x4d }
/* vNIC resource types */ /* vNIC resource types */
enum vnic_res_type { enum vnic_res_type {
...@@ -52,6 +57,14 @@ struct vnic_resource_header { ...@@ -52,6 +57,14 @@ struct vnic_resource_header {
u32 version; u32 version;
}; };
struct mgmt_barmap_hdr {
u32 magic; /* magic number */
u32 version; /* header format version */
u16 lif; /* loopback lif for mgmt frames */
u16 pci_slot; /* installed pci slot */
char serial[16]; /* card serial number */
};
struct vnic_resource { struct vnic_resource {
u8 type; u8 type;
u8 bar; u8 bar;
......
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