mirror of
https://github.com/torvalds/linux.git
synced 2026-04-26 18:42:25 -04:00
ionic: support sr-iov operations
Add the netdev ops for managing VFs. Since most of the management work happens in the NIC firmware, the driver becomes mostly a pass-through for the network stack commands that want to control and configure the VFs. We also tweak ionic_station_set() a little to allow for the VFs that start off with a zero'd mac address. Signed-off-by: Shannon Nelson <snelson@pensando.io> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
3d462ce2a1
commit
fbb39807e9
@@ -286,6 +286,64 @@ void ionic_dev_cmd_port_pause(struct ionic_dev *idev, u8 pause_type)
|
||||
ionic_dev_cmd_go(idev, &cmd);
|
||||
}
|
||||
|
||||
/* VF commands */
|
||||
int ionic_set_vf_config(struct ionic *ionic, int vf, u8 attr, u8 *data)
|
||||
{
|
||||
union ionic_dev_cmd cmd = {
|
||||
.vf_setattr.opcode = IONIC_CMD_VF_SETATTR,
|
||||
.vf_setattr.attr = attr,
|
||||
.vf_setattr.vf_index = vf,
|
||||
};
|
||||
int err;
|
||||
|
||||
switch (attr) {
|
||||
case IONIC_VF_ATTR_SPOOFCHK:
|
||||
cmd.vf_setattr.spoofchk = *data;
|
||||
dev_dbg(ionic->dev, "%s: vf %d spoof %d\n",
|
||||
__func__, vf, *data);
|
||||
break;
|
||||
case IONIC_VF_ATTR_TRUST:
|
||||
cmd.vf_setattr.trust = *data;
|
||||
dev_dbg(ionic->dev, "%s: vf %d trust %d\n",
|
||||
__func__, vf, *data);
|
||||
break;
|
||||
case IONIC_VF_ATTR_LINKSTATE:
|
||||
cmd.vf_setattr.linkstate = *data;
|
||||
dev_dbg(ionic->dev, "%s: vf %d linkstate %d\n",
|
||||
__func__, vf, *data);
|
||||
break;
|
||||
case IONIC_VF_ATTR_MAC:
|
||||
ether_addr_copy(cmd.vf_setattr.macaddr, data);
|
||||
dev_dbg(ionic->dev, "%s: vf %d macaddr %pM\n",
|
||||
__func__, vf, data);
|
||||
break;
|
||||
case IONIC_VF_ATTR_VLAN:
|
||||
cmd.vf_setattr.vlanid = cpu_to_le16(*(u16 *)data);
|
||||
dev_dbg(ionic->dev, "%s: vf %d vlan %d\n",
|
||||
__func__, vf, *(u16 *)data);
|
||||
break;
|
||||
case IONIC_VF_ATTR_RATE:
|
||||
cmd.vf_setattr.maxrate = cpu_to_le32(*(u32 *)data);
|
||||
dev_dbg(ionic->dev, "%s: vf %d maxrate %d\n",
|
||||
__func__, vf, *(u32 *)data);
|
||||
break;
|
||||
case IONIC_VF_ATTR_STATSADDR:
|
||||
cmd.vf_setattr.stats_pa = cpu_to_le64(*(u64 *)data);
|
||||
dev_dbg(ionic->dev, "%s: vf %d stats_pa 0x%08llx\n",
|
||||
__func__, vf, *(u64 *)data);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
mutex_lock(&ionic->dev_cmd_lock);
|
||||
ionic_dev_cmd_go(&ionic->idev, &cmd);
|
||||
err = ionic_dev_cmd_wait(ionic, DEVCMD_TIMEOUT);
|
||||
mutex_unlock(&ionic->dev_cmd_lock);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
/* LIF commands */
|
||||
void ionic_dev_cmd_lif_identify(struct ionic_dev *idev, u8 type, u8 ver)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user