Commit 383ab92f authored by Vasanthy Kolluri's avatar Vasanthy Kolluri Committed by David S. Miller

enic: Clean up: Add wrapper routines for firmware devcmd calls

Add wrapper routines that issue devcmds to firmware and ensure that a
devcmd lock is held for each devcmd call.
Signed-off-by: default avatarScott Feldman <scofeldm@cisco.com>
Signed-off-by: default avatarVasanthy Kolluri <vkolluri@cisco.com>
Signed-off-by: default avatarRoopa Prabhu <roprabhu@cisco.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 99ef5639
...@@ -145,15 +145,25 @@ static int enic_get_settings(struct net_device *netdev, ...@@ -145,15 +145,25 @@ static int enic_get_settings(struct net_device *netdev,
return 0; return 0;
} }
static int enic_dev_fw_info(struct enic *enic,
struct vnic_devcmd_fw_info **fw_info)
{
int err;
spin_lock(&enic->devcmd_lock);
err = vnic_dev_fw_info(enic->vdev, fw_info);
spin_unlock(&enic->devcmd_lock);
return err;
}
static void enic_get_drvinfo(struct net_device *netdev, static void enic_get_drvinfo(struct net_device *netdev,
struct ethtool_drvinfo *drvinfo) struct ethtool_drvinfo *drvinfo)
{ {
struct enic *enic = netdev_priv(netdev); struct enic *enic = netdev_priv(netdev);
struct vnic_devcmd_fw_info *fw_info; struct vnic_devcmd_fw_info *fw_info;
spin_lock(&enic->devcmd_lock); enic_dev_fw_info(enic, &fw_info);
vnic_dev_fw_info(enic->vdev, &fw_info);
spin_unlock(&enic->devcmd_lock);
strncpy(drvinfo->driver, DRV_NAME, sizeof(drvinfo->driver)); strncpy(drvinfo->driver, DRV_NAME, sizeof(drvinfo->driver));
strncpy(drvinfo->version, DRV_VERSION, sizeof(drvinfo->version)); strncpy(drvinfo->version, DRV_VERSION, sizeof(drvinfo->version));
...@@ -191,6 +201,17 @@ static int enic_get_sset_count(struct net_device *netdev, int sset) ...@@ -191,6 +201,17 @@ static int enic_get_sset_count(struct net_device *netdev, int sset)
} }
} }
static int enic_dev_stats_dump(struct enic *enic, struct vnic_stats **vstats)
{
int err;
spin_lock(&enic->devcmd_lock);
err = vnic_dev_stats_dump(enic->vdev, vstats);
spin_unlock(&enic->devcmd_lock);
return err;
}
static void enic_get_ethtool_stats(struct net_device *netdev, static void enic_get_ethtool_stats(struct net_device *netdev,
struct ethtool_stats *stats, u64 *data) struct ethtool_stats *stats, u64 *data)
{ {
...@@ -198,9 +219,7 @@ static void enic_get_ethtool_stats(struct net_device *netdev, ...@@ -198,9 +219,7 @@ static void enic_get_ethtool_stats(struct net_device *netdev,
struct vnic_stats *vstats; struct vnic_stats *vstats;
unsigned int i; unsigned int i;
spin_lock(&enic->devcmd_lock); enic_dev_stats_dump(enic, &vstats);
vnic_dev_stats_dump(enic->vdev, &vstats);
spin_unlock(&enic->devcmd_lock);
for (i = 0; i < enic_n_tx_stats; i++) for (i = 0; i < enic_n_tx_stats; i++)
*(data++) = ((u64 *)&vstats->tx)[enic_tx_stats[i].offset]; *(data++) = ((u64 *)&vstats->tx)[enic_tx_stats[i].offset];
...@@ -411,17 +430,14 @@ static void enic_log_q_error(struct enic *enic) ...@@ -411,17 +430,14 @@ static void enic_log_q_error(struct enic *enic)
} }
} }
static void enic_link_check(struct enic *enic) static void enic_msglvl_check(struct enic *enic)
{ {
int link_status = vnic_dev_link_status(enic->vdev); u32 msg_enable = vnic_dev_msg_lvl(enic->vdev);
int carrier_ok = netif_carrier_ok(enic->netdev);
if (link_status && !carrier_ok) { if (msg_enable != enic->msg_enable) {
printk(KERN_INFO PFX "%s: Link UP\n", enic->netdev->name); printk(KERN_INFO PFX "%s: msg lvl changed from 0x%x to 0x%x\n",
netif_carrier_on(enic->netdev); enic->netdev->name, enic->msg_enable, msg_enable);
} else if (!link_status && carrier_ok) { enic->msg_enable = msg_enable;
printk(KERN_INFO PFX "%s: Link DOWN\n", enic->netdev->name);
netif_carrier_off(enic->netdev);
} }
} }
...@@ -439,14 +455,17 @@ static void enic_mtu_check(struct enic *enic) ...@@ -439,14 +455,17 @@ static void enic_mtu_check(struct enic *enic)
} }
} }
static void enic_msglvl_check(struct enic *enic) static void enic_link_check(struct enic *enic)
{ {
u32 msg_enable = vnic_dev_msg_lvl(enic->vdev); int link_status = vnic_dev_link_status(enic->vdev);
int carrier_ok = netif_carrier_ok(enic->netdev);
if (msg_enable != enic->msg_enable) { if (link_status && !carrier_ok) {
printk(KERN_INFO PFX "%s: msg lvl changed from 0x%x to 0x%x\n", printk(KERN_INFO PFX "%s: Link UP\n", enic->netdev->name);
enic->netdev->name, enic->msg_enable, msg_enable); netif_carrier_on(enic->netdev);
enic->msg_enable = msg_enable; } else if (!link_status && carrier_ok) {
printk(KERN_INFO PFX "%s: Link DOWN\n", enic->netdev->name);
netif_carrier_off(enic->netdev);
} }
} }
...@@ -792,9 +811,7 @@ static struct net_device_stats *enic_get_stats(struct net_device *netdev) ...@@ -792,9 +811,7 @@ static struct net_device_stats *enic_get_stats(struct net_device *netdev)
struct net_device_stats *net_stats = &netdev->stats; struct net_device_stats *net_stats = &netdev->stats;
struct vnic_stats *stats; struct vnic_stats *stats;
spin_lock(&enic->devcmd_lock); enic_dev_stats_dump(enic, &stats);
vnic_dev_stats_dump(enic->vdev, &stats);
spin_unlock(&enic->devcmd_lock);
net_stats->tx_packets = stats->tx.tx_frames_ok; net_stats->tx_packets = stats->tx.tx_frames_ok;
net_stats->tx_bytes = stats->tx.tx_bytes_ok; net_stats->tx_bytes = stats->tx.tx_bytes_ok;
...@@ -892,6 +909,41 @@ static int enic_set_mac_address(struct net_device *netdev, void *p) ...@@ -892,6 +909,41 @@ static int enic_set_mac_address(struct net_device *netdev, void *p)
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
static int enic_dev_packet_filter(struct enic *enic, int directed,
int multicast, int broadcast, int promisc, int allmulti)
{
int err;
spin_lock(&enic->devcmd_lock);
err = vnic_dev_packet_filter(enic->vdev, directed,
multicast, broadcast, promisc, allmulti);
spin_unlock(&enic->devcmd_lock);
return err;
}
static int enic_dev_add_multicast_addr(struct enic *enic, u8 *addr)
{
int err;
spin_lock(&enic->devcmd_lock);
err = vnic_dev_add_addr(enic->vdev, addr);
spin_unlock(&enic->devcmd_lock);
return err;
}
static int enic_dev_del_multicast_addr(struct enic *enic, u8 *addr)
{
int err;
spin_lock(&enic->devcmd_lock);
err = vnic_dev_del_addr(enic->vdev, addr);
spin_unlock(&enic->devcmd_lock);
return err;
}
/* netif_tx_lock held, BHs disabled */ /* netif_tx_lock held, BHs disabled */
static void enic_set_multicast_list(struct net_device *netdev) static void enic_set_multicast_list(struct net_device *netdev)
{ {
...@@ -911,11 +963,9 @@ static void enic_set_multicast_list(struct net_device *netdev) ...@@ -911,11 +963,9 @@ static void enic_set_multicast_list(struct net_device *netdev)
if (mc_count > ENIC_MULTICAST_PERFECT_FILTERS) if (mc_count > ENIC_MULTICAST_PERFECT_FILTERS)
mc_count = ENIC_MULTICAST_PERFECT_FILTERS; mc_count = ENIC_MULTICAST_PERFECT_FILTERS;
spin_lock(&enic->devcmd_lock);
if (enic->flags != flags) { if (enic->flags != flags) {
enic->flags = flags; enic->flags = flags;
vnic_dev_packet_filter(enic->vdev, directed, enic_dev_packet_filter(enic, directed,
multicast, broadcast, promisc, allmulti); multicast, broadcast, promisc, allmulti);
} }
...@@ -938,7 +988,7 @@ static void enic_set_multicast_list(struct net_device *netdev) ...@@ -938,7 +988,7 @@ static void enic_set_multicast_list(struct net_device *netdev)
mc_addr[j]) == 0) mc_addr[j]) == 0)
break; break;
if (j == mc_count) if (j == mc_count)
enic_del_multicast_addr(enic, enic->mc_addr[i]); enic_dev_del_multicast_addr(enic, enic->mc_addr[i]);
} }
for (i = 0; i < mc_count; i++) { for (i = 0; i < mc_count; i++) {
...@@ -947,7 +997,7 @@ static void enic_set_multicast_list(struct net_device *netdev) ...@@ -947,7 +997,7 @@ static void enic_set_multicast_list(struct net_device *netdev)
enic->mc_addr[j]) == 0) enic->mc_addr[j]) == 0)
break; break;
if (j == enic->mc_count) if (j == enic->mc_count)
enic_add_multicast_addr(enic, mc_addr[i]); enic_dev_add_multicast_addr(enic, mc_addr[i]);
} }
/* Save the list to compare against next time /* Save the list to compare against next time
...@@ -957,8 +1007,6 @@ static void enic_set_multicast_list(struct net_device *netdev) ...@@ -957,8 +1007,6 @@ static void enic_set_multicast_list(struct net_device *netdev)
memcpy(enic->mc_addr[i], mc_addr[i], ETH_ALEN); memcpy(enic->mc_addr[i], mc_addr[i], ETH_ALEN);
enic->mc_count = mc_count; enic->mc_count = mc_count;
spin_unlock(&enic->devcmd_lock);
} }
/* rtnl lock is held */ /* rtnl lock is held */
...@@ -1264,12 +1312,24 @@ static int enic_rq_alloc_buf_a1(struct vnic_rq *rq) ...@@ -1264,12 +1312,24 @@ static int enic_rq_alloc_buf_a1(struct vnic_rq *rq)
return 0; return 0;
} }
static int enic_dev_hw_version(struct enic *enic,
enum vnic_dev_hw_version *hw_ver)
{
int err;
spin_lock(&enic->devcmd_lock);
err = vnic_dev_hw_version(enic->vdev, hw_ver);
spin_unlock(&enic->devcmd_lock);
return err;
}
static int enic_set_rq_alloc_buf(struct enic *enic) static int enic_set_rq_alloc_buf(struct enic *enic)
{ {
enum vnic_dev_hw_version hw_ver; enum vnic_dev_hw_version hw_ver;
int err; int err;
err = vnic_dev_hw_version(enic->vdev, &hw_ver); err = enic_dev_hw_version(enic, &hw_ver);
if (err) if (err)
return err; return err;
...@@ -1603,7 +1663,7 @@ static void enic_synchronize_irqs(struct enic *enic) ...@@ -1603,7 +1663,7 @@ static void enic_synchronize_irqs(struct enic *enic)
} }
} }
static int enic_notify_set(struct enic *enic) static int enic_dev_notify_set(struct enic *enic)
{ {
int err; int err;
...@@ -1624,6 +1684,39 @@ static int enic_notify_set(struct enic *enic) ...@@ -1624,6 +1684,39 @@ static int enic_notify_set(struct enic *enic)
return err; return err;
} }
static int enic_dev_notify_unset(struct enic *enic)
{
int err;
spin_lock(&enic->devcmd_lock);
err = vnic_dev_notify_unset(enic->vdev);
spin_unlock(&enic->devcmd_lock);
return err;
}
static int enic_dev_enable(struct enic *enic)
{
int err;
spin_lock(&enic->devcmd_lock);
err = vnic_dev_enable(enic->vdev);
spin_unlock(&enic->devcmd_lock);
return err;
}
static int enic_dev_disable(struct enic *enic)
{
int err;
spin_lock(&enic->devcmd_lock);
err = vnic_dev_disable(enic->vdev);
spin_unlock(&enic->devcmd_lock);
return err;
}
static void enic_notify_timer_start(struct enic *enic) static void enic_notify_timer_start(struct enic *enic)
{ {
switch (vnic_dev_get_intr_mode(enic->vdev)) { switch (vnic_dev_get_intr_mode(enic->vdev)) {
...@@ -1650,7 +1743,7 @@ static int enic_open(struct net_device *netdev) ...@@ -1650,7 +1743,7 @@ static int enic_open(struct net_device *netdev)
return err; return err;
} }
err = enic_notify_set(enic); err = enic_dev_notify_set(enic);
if (err) { if (err) {
printk(KERN_ERR PFX printk(KERN_ERR PFX
"%s: Failed to alloc notify buffer, aborting.\n", "%s: Failed to alloc notify buffer, aborting.\n",
...@@ -1680,9 +1773,7 @@ static int enic_open(struct net_device *netdev) ...@@ -1680,9 +1773,7 @@ static int enic_open(struct net_device *netdev)
netif_wake_queue(netdev); netif_wake_queue(netdev);
napi_enable(&enic->napi); napi_enable(&enic->napi);
spin_lock(&enic->devcmd_lock); enic_dev_enable(enic);
vnic_dev_enable(enic->vdev);
spin_unlock(&enic->devcmd_lock);
for (i = 0; i < enic->intr_count; i++) for (i = 0; i < enic->intr_count; i++)
vnic_intr_unmask(&enic->intr[i]); vnic_intr_unmask(&enic->intr[i]);
...@@ -1692,9 +1783,7 @@ static int enic_open(struct net_device *netdev) ...@@ -1692,9 +1783,7 @@ static int enic_open(struct net_device *netdev)
return 0; return 0;
err_out_notify_unset: err_out_notify_unset:
spin_lock(&enic->devcmd_lock); enic_dev_notify_unset(enic);
vnic_dev_notify_unset(enic->vdev);
spin_unlock(&enic->devcmd_lock);
err_out_free_intr: err_out_free_intr:
enic_free_intr(enic); enic_free_intr(enic);
...@@ -1715,9 +1804,7 @@ static int enic_stop(struct net_device *netdev) ...@@ -1715,9 +1804,7 @@ static int enic_stop(struct net_device *netdev)
del_timer_sync(&enic->notify_timer); del_timer_sync(&enic->notify_timer);
spin_lock(&enic->devcmd_lock); enic_dev_disable(enic);
vnic_dev_disable(enic->vdev);
spin_unlock(&enic->devcmd_lock);
napi_disable(&enic->napi); napi_disable(&enic->napi);
netif_carrier_off(netdev); netif_carrier_off(netdev);
netif_tx_disable(netdev); netif_tx_disable(netdev);
...@@ -1735,9 +1822,7 @@ static int enic_stop(struct net_device *netdev) ...@@ -1735,9 +1822,7 @@ static int enic_stop(struct net_device *netdev)
return err; return err;
} }
spin_lock(&enic->devcmd_lock); enic_dev_notify_unset(enic);
vnic_dev_notify_unset(enic->vdev);
spin_unlock(&enic->devcmd_lock);
enic_free_intr(enic); enic_free_intr(enic);
for (i = 0; i < enic->wq_count; i++) for (i = 0; i < enic->wq_count; i++)
...@@ -1870,15 +1955,31 @@ static int enic_set_niccfg(struct enic *enic) ...@@ -1870,15 +1955,31 @@ static int enic_set_niccfg(struct enic *enic)
const u8 rss_enable = 0; const u8 rss_enable = 0;
const u8 tso_ipid_split_en = 0; const u8 tso_ipid_split_en = 0;
const u8 ig_vlan_strip_en = 1; const u8 ig_vlan_strip_en = 1;
int err;
/* Enable VLAN tag stripping. RSS not enabled (yet). /* Enable VLAN tag stripping. RSS not enabled (yet).
*/ */
return enic_set_nic_cfg(enic, spin_lock(&enic->devcmd_lock);
err = enic_set_nic_cfg(enic,
rss_default_cpu, rss_hash_type, rss_default_cpu, rss_hash_type,
rss_hash_bits, rss_base_cpu, rss_hash_bits, rss_base_cpu,
rss_enable, tso_ipid_split_en, rss_enable, tso_ipid_split_en,
ig_vlan_strip_en); ig_vlan_strip_en);
spin_unlock(&enic->devcmd_lock);
return err;
}
static int enic_dev_hang_notify(struct enic *enic)
{
int err;
spin_lock(&enic->devcmd_lock);
err = vnic_dev_hang_notify(enic->vdev);
spin_unlock(&enic->devcmd_lock);
return err;
} }
int enic_dev_set_ig_vlan_rewrite_mode(struct enic *enic) int enic_dev_set_ig_vlan_rewrite_mode(struct enic *enic)
...@@ -1902,10 +2003,7 @@ static void enic_reset(struct work_struct *work) ...@@ -1902,10 +2003,7 @@ static void enic_reset(struct work_struct *work)
rtnl_lock(); rtnl_lock();
spin_lock(&enic->devcmd_lock); enic_dev_hang_notify(enic);
vnic_dev_hang_notify(enic->vdev);
spin_unlock(&enic->devcmd_lock);
enic_stop(enic->netdev); enic_stop(enic->netdev);
enic_dev_hang_reset(enic); enic_dev_hang_reset(enic);
enic_reset_multicast_list(enic); enic_reset_multicast_list(enic);
...@@ -2047,8 +2145,8 @@ static const struct net_device_ops enic_netdev_ops = { ...@@ -2047,8 +2145,8 @@ static const struct net_device_ops enic_netdev_ops = {
.ndo_start_xmit = enic_hard_start_xmit, .ndo_start_xmit = enic_hard_start_xmit,
.ndo_get_stats = enic_get_stats, .ndo_get_stats = enic_get_stats,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_set_multicast_list = enic_set_multicast_list,
.ndo_set_mac_address = enic_set_mac_address, .ndo_set_mac_address = enic_set_mac_address,
.ndo_set_multicast_list = enic_set_multicast_list,
.ndo_change_mtu = enic_change_mtu, .ndo_change_mtu = enic_change_mtu,
.ndo_vlan_rx_register = enic_vlan_rx_register, .ndo_vlan_rx_register = enic_vlan_rx_register,
.ndo_vlan_rx_add_vid = enic_vlan_rx_add_vid, .ndo_vlan_rx_add_vid = enic_vlan_rx_add_vid,
...@@ -2066,6 +2164,17 @@ void enic_dev_deinit(struct enic *enic) ...@@ -2066,6 +2164,17 @@ void enic_dev_deinit(struct enic *enic)
enic_clear_intr_mode(enic); enic_clear_intr_mode(enic);
} }
static int enic_dev_stats_clear(struct enic *enic)
{
int err;
spin_lock(&enic->devcmd_lock);
err = vnic_dev_stats_clear(enic->vdev);
spin_unlock(&enic->devcmd_lock);
return err;
}
int enic_dev_init(struct enic *enic) int enic_dev_init(struct enic *enic)
{ {
struct net_device *netdev = enic->netdev; struct net_device *netdev = enic->netdev;
...@@ -2110,6 +2219,10 @@ int enic_dev_init(struct enic *enic) ...@@ -2110,6 +2219,10 @@ int enic_dev_init(struct enic *enic)
enic_init_vnic_resources(enic); enic_init_vnic_resources(enic);
/* Clear LIF stats
*/
enic_dev_stats_clear(enic);
err = enic_set_rq_alloc_buf(enic); err = enic_set_rq_alloc_buf(enic);
if (err) { if (err) {
printk(KERN_ERR PFX printk(KERN_ERR PFX
...@@ -2293,6 +2406,11 @@ static int __devinit enic_probe(struct pci_dev *pdev, ...@@ -2293,6 +2406,11 @@ static int __devinit enic_probe(struct pci_dev *pdev,
} }
} }
/* Setup devcmd lock
*/
spin_lock_init(&enic->devcmd_lock);
err = enic_dev_init(enic); err = enic_dev_init(enic);
if (err) { if (err) {
printk(KERN_ERR PFX printk(KERN_ERR PFX
...@@ -2300,7 +2418,7 @@ static int __devinit enic_probe(struct pci_dev *pdev, ...@@ -2300,7 +2418,7 @@ static int __devinit enic_probe(struct pci_dev *pdev,
goto err_out_dev_close; goto err_out_dev_close;
} }
/* Setup notification timer, HW reset task, and locks /* Setup notification timer, HW reset task, and wq locks
*/ */
init_timer(&enic->notify_timer); init_timer(&enic->notify_timer);
...@@ -2312,8 +2430,6 @@ static int __devinit enic_probe(struct pci_dev *pdev, ...@@ -2312,8 +2430,6 @@ static int __devinit enic_probe(struct pci_dev *pdev,
for (i = 0; i < enic->wq_count; i++) for (i = 0; i < enic->wq_count; i++)
spin_lock_init(&enic->wq_lock[i]); spin_lock_init(&enic->wq_lock[i]);
spin_lock_init(&enic->devcmd_lock);
/* Register net device /* Register net device
*/ */
......
...@@ -103,17 +103,7 @@ int enic_get_vnic_config(struct enic *enic) ...@@ -103,17 +103,7 @@ int enic_get_vnic_config(struct enic *enic)
return 0; return 0;
} }
void enic_add_multicast_addr(struct enic *enic, u8 *addr) int enic_add_vlan(struct enic *enic, u16 vlanid)
{
vnic_dev_add_addr(enic->vdev, addr);
}
void enic_del_multicast_addr(struct enic *enic, u8 *addr)
{
vnic_dev_del_addr(enic->vdev, addr);
}
void enic_add_vlan(struct enic *enic, u16 vlanid)
{ {
u64 a0 = vlanid, a1 = 0; u64 a0 = vlanid, a1 = 0;
int wait = 1000; int wait = 1000;
...@@ -122,9 +112,11 @@ void enic_add_vlan(struct enic *enic, u16 vlanid) ...@@ -122,9 +112,11 @@ void enic_add_vlan(struct enic *enic, u16 vlanid)
err = vnic_dev_cmd(enic->vdev, CMD_VLAN_ADD, &a0, &a1, wait); err = vnic_dev_cmd(enic->vdev, CMD_VLAN_ADD, &a0, &a1, wait);
if (err) if (err)
printk(KERN_ERR PFX "Can't add vlan id, %d\n", err); printk(KERN_ERR PFX "Can't add vlan id, %d\n", err);
return err;
} }
void enic_del_vlan(struct enic *enic, u16 vlanid) int enic_del_vlan(struct enic *enic, u16 vlanid)
{ {
u64 a0 = vlanid, a1 = 0; u64 a0 = vlanid, a1 = 0;
int wait = 1000; int wait = 1000;
...@@ -133,6 +125,8 @@ void enic_del_vlan(struct enic *enic, u16 vlanid) ...@@ -133,6 +125,8 @@ void enic_del_vlan(struct enic *enic, u16 vlanid)
err = vnic_dev_cmd(enic->vdev, CMD_VLAN_DEL, &a0, &a1, wait); err = vnic_dev_cmd(enic->vdev, CMD_VLAN_DEL, &a0, &a1, wait);
if (err) if (err)
printk(KERN_ERR PFX "Can't delete vlan id, %d\n", err); printk(KERN_ERR PFX "Can't delete vlan id, %d\n", err);
return err;
} }
int enic_set_nic_cfg(struct enic *enic, u8 rss_default_cpu, u8 rss_hash_type, int enic_set_nic_cfg(struct enic *enic, u8 rss_default_cpu, u8 rss_hash_type,
...@@ -304,11 +298,6 @@ void enic_init_vnic_resources(struct enic *enic) ...@@ -304,11 +298,6 @@ void enic_init_vnic_resources(struct enic *enic)
enic->config.intr_timer_type, enic->config.intr_timer_type,
mask_on_assertion); mask_on_assertion);
} }
/* Clear LIF stats
*/
vnic_dev_stats_clear(enic->vdev);
} }
int enic_alloc_vnic_resources(struct enic *enic) int enic_alloc_vnic_resources(struct enic *enic)
......
...@@ -131,10 +131,8 @@ static inline void enic_queue_rq_desc(struct vnic_rq *rq, ...@@ -131,10 +131,8 @@ static inline void enic_queue_rq_desc(struct vnic_rq *rq,
struct enic; struct enic;
int enic_get_vnic_config(struct enic *); int enic_get_vnic_config(struct enic *);
void enic_add_multicast_addr(struct enic *enic, u8 *addr); int enic_add_vlan(struct enic *enic, u16 vlanid);
void enic_del_multicast_addr(struct enic *enic, u8 *addr); int enic_del_vlan(struct enic *enic, u16 vlanid);
void enic_add_vlan(struct enic *enic, u16 vlanid);
void enic_del_vlan(struct enic *enic, u16 vlanid);
int enic_set_nic_cfg(struct enic *enic, u8 rss_default_cpu, u8 rss_hash_type, int enic_set_nic_cfg(struct enic *enic, u8 rss_default_cpu, u8 rss_hash_type,
u8 rss_hash_bits, u8 rss_base_cpu, u8 rss_enable, u8 tso_ipid_split_en, u8 rss_hash_bits, u8 rss_base_cpu, u8 rss_enable, u8 tso_ipid_split_en,
u8 ig_vlan_strip_en); u8 ig_vlan_strip_en);
......
...@@ -550,7 +550,7 @@ int vnic_dev_mac_addr(struct vnic_dev *vdev, u8 *mac_addr) ...@@ -550,7 +550,7 @@ int vnic_dev_mac_addr(struct vnic_dev *vdev, u8 *mac_addr)
return 0; return 0;
} }
void vnic_dev_packet_filter(struct vnic_dev *vdev, int directed, int multicast, int vnic_dev_packet_filter(struct vnic_dev *vdev, int directed, int multicast,
int broadcast, int promisc, int allmulti) int broadcast, int promisc, int allmulti)
{ {
u64 a0, a1 = 0; u64 a0, a1 = 0;
...@@ -566,6 +566,8 @@ void vnic_dev_packet_filter(struct vnic_dev *vdev, int directed, int multicast, ...@@ -566,6 +566,8 @@ void vnic_dev_packet_filter(struct vnic_dev *vdev, int directed, int multicast,
err = vnic_dev_cmd(vdev, CMD_PACKET_FILTER, &a0, &a1, wait); err = vnic_dev_cmd(vdev, CMD_PACKET_FILTER, &a0, &a1, wait);
if (err) if (err)
printk(KERN_ERR "Can't set packet filter\n"); printk(KERN_ERR "Can't set packet filter\n");
return err;
} }
int vnic_dev_add_addr(struct vnic_dev *vdev, u8 *addr) int vnic_dev_add_addr(struct vnic_dev *vdev, u8 *addr)
...@@ -670,22 +672,25 @@ int vnic_dev_notify_set(struct vnic_dev *vdev, u16 intr) ...@@ -670,22 +672,25 @@ int vnic_dev_notify_set(struct vnic_dev *vdev, u16 intr)
return vnic_dev_notify_setcmd(vdev, notify_addr, notify_pa, intr); return vnic_dev_notify_setcmd(vdev, notify_addr, notify_pa, intr);
} }
void vnic_dev_notify_unsetcmd(struct vnic_dev *vdev) int vnic_dev_notify_unsetcmd(struct vnic_dev *vdev)
{ {
u64 a0, a1; u64 a0, a1;
int wait = 1000; int wait = 1000;
int err;
a0 = 0; /* paddr = 0 to unset notify buffer */ a0 = 0; /* paddr = 0 to unset notify buffer */
a1 = 0x0000ffff00000000ULL; /* intr num = -1 to unreg for intr */ a1 = 0x0000ffff00000000ULL; /* intr num = -1 to unreg for intr */
a1 += sizeof(struct vnic_devcmd_notify); a1 += sizeof(struct vnic_devcmd_notify);
vnic_dev_cmd(vdev, CMD_NOTIFY, &a0, &a1, wait); err = vnic_dev_cmd(vdev, CMD_NOTIFY, &a0, &a1, wait);
vdev->notify = NULL; vdev->notify = NULL;
vdev->notify_pa = 0; vdev->notify_pa = 0;
vdev->notify_sz = 0; vdev->notify_sz = 0;
return err;
} }
void vnic_dev_notify_unset(struct vnic_dev *vdev) int vnic_dev_notify_unset(struct vnic_dev *vdev)
{ {
if (vdev->notify) { if (vdev->notify) {
pci_free_consistent(vdev->pdev, pci_free_consistent(vdev->pdev,
...@@ -694,7 +699,7 @@ void vnic_dev_notify_unset(struct vnic_dev *vdev) ...@@ -694,7 +699,7 @@ void vnic_dev_notify_unset(struct vnic_dev *vdev)
vdev->notify_pa); vdev->notify_pa);
} }
vnic_dev_notify_unsetcmd(vdev); return vnic_dev_notify_unsetcmd(vdev);
} }
static int vnic_dev_notify_ready(struct vnic_dev *vdev) static int vnic_dev_notify_ready(struct vnic_dev *vdev)
...@@ -839,6 +844,14 @@ u32 vnic_dev_notify_status(struct vnic_dev *vdev) ...@@ -839,6 +844,14 @@ u32 vnic_dev_notify_status(struct vnic_dev *vdev)
return vdev->notify_copy.status; return vdev->notify_copy.status;
} }
u32 vnic_dev_uif(struct vnic_dev *vdev)
{
if (!vnic_dev_notify_ready(vdev))
return 0;
return vdev->notify_copy.uif;
}
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)
{ {
......
...@@ -101,7 +101,7 @@ int vnic_dev_spec(struct vnic_dev *vdev, unsigned int offset, unsigned int size, ...@@ -101,7 +101,7 @@ int vnic_dev_spec(struct vnic_dev *vdev, unsigned int offset, unsigned int size,
int vnic_dev_stats_clear(struct vnic_dev *vdev); int vnic_dev_stats_clear(struct vnic_dev *vdev);
int vnic_dev_stats_dump(struct vnic_dev *vdev, struct vnic_stats **stats); int vnic_dev_stats_dump(struct vnic_dev *vdev, struct vnic_stats **stats);
int vnic_dev_hang_notify(struct vnic_dev *vdev); int vnic_dev_hang_notify(struct vnic_dev *vdev);
void vnic_dev_packet_filter(struct vnic_dev *vdev, int directed, int multicast, int vnic_dev_packet_filter(struct vnic_dev *vdev, int directed, int multicast,
int broadcast, int promisc, int allmulti); int broadcast, int promisc, int allmulti);
int vnic_dev_add_addr(struct vnic_dev *vdev, u8 *addr); int vnic_dev_add_addr(struct vnic_dev *vdev, u8 *addr);
int vnic_dev_del_addr(struct vnic_dev *vdev, u8 *addr); int vnic_dev_del_addr(struct vnic_dev *vdev, u8 *addr);
...@@ -110,14 +110,15 @@ int vnic_dev_raise_intr(struct vnic_dev *vdev, u16 intr); ...@@ -110,14 +110,15 @@ int vnic_dev_raise_intr(struct vnic_dev *vdev, u16 intr);
int vnic_dev_notify_setcmd(struct vnic_dev *vdev, int vnic_dev_notify_setcmd(struct vnic_dev *vdev,
void *notify_addr, dma_addr_t notify_pa, u16 intr); void *notify_addr, dma_addr_t notify_pa, u16 intr);
int vnic_dev_notify_set(struct vnic_dev *vdev, u16 intr); int vnic_dev_notify_set(struct vnic_dev *vdev, u16 intr);
void vnic_dev_notify_unsetcmd(struct vnic_dev *vdev); int vnic_dev_notify_unsetcmd(struct vnic_dev *vdev);
void vnic_dev_notify_unset(struct vnic_dev *vdev); int vnic_dev_notify_unset(struct vnic_dev *vdev);
int vnic_dev_link_status(struct vnic_dev *vdev); 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_link_down_cnt(struct vnic_dev *vdev);
u32 vnic_dev_notify_status(struct vnic_dev *vdev); u32 vnic_dev_notify_status(struct vnic_dev *vdev);
u32 vnic_dev_uif(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);
......
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