If the net_device has no ethtool ops and it is a VLAN,
find the underlying physical device using the VLAN driver's macro, and
use it's ethtool ops.
Signed-off-by: Vasu Dev <[EMAIL PROTECTED]>
---
drivers/scsi/ofc/fcoe/fcoe_def.h | 1 +
drivers/scsi/ofc/fcoe/fcoe_if.c | 10 ++++++++--
2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/drivers/scsi/ofc/fcoe/fcoe_def.h b/drivers/scsi/ofc/fcoe/fcoe_def.h
index 6550c73..22c5934 100644
--- a/drivers/scsi/ofc/fcoe/fcoe_def.h
+++ b/drivers/scsi/ofc/fcoe/fcoe_def.h
@@ -67,6 +67,7 @@ struct fcoe_softc {
struct list_head list;
struct fcdev *fd;
struct net_device *real_dev;
+ struct net_device *phys_dev; /* device with ethtool_ops */
struct packet_type fcoe_packet_type;
struct sk_buff_head fcoe_pending_queue;
diff --git a/drivers/scsi/ofc/fcoe/fcoe_if.c b/drivers/scsi/ofc/fcoe/fcoe_if.c
index 74e5ffc..9963593 100644
--- a/drivers/scsi/ofc/fcoe/fcoe_if.c
+++ b/drivers/scsi/ofc/fcoe/fcoe_if.c
@@ -34,6 +34,7 @@
#include <linux/etherdevice.h>
#include <linux/ethtool.h>
#include <linux/if_ether.h>
+#include <linux/if_vlan.h>
#include <net/rtnetlink.h>
/*
@@ -174,6 +175,7 @@ int fcoe_link_ok(struct fcdev *fdev)
int rc = 0;
if ((dev->flags & IFF_UP) && netif_carrier_ok(dev)) {
+ dev = fc->phys_dev;
dev->ethtool_ops->get_pauseparam(dev, &pause);
if (dev->ethtool_ops->get_settings) {
dev->ethtool_ops->get_settings(dev, &ecmd);
@@ -213,6 +215,7 @@ int fcoe_create_interface(struct fcoe_info *fci, void *ptr)
struct fcoe_cfg *cfg = ptr;
struct fcoe_softc *fc;
struct fcoe_dev_stats *p;
+ struct net_device *net_dev;
int rc = 0;
int i;
#ifdef HAVE_SET_RX_MODE
@@ -260,11 +263,14 @@ int fcoe_create_interface(struct fcoe_info *fci, void
*ptr)
/*
* Require support for get_pauseparam ethtool op.
*/
- if (!fc->real_dev->ethtool_ops ||
- !fc->real_dev->ethtool_ops->get_pauseparam) {
+ net_dev = fc->real_dev;
+ if (!net_dev->ethtool_ops && (net_dev->priv_flags & IFF_802_1Q_VLAN))
+ net_dev = VLAN_DEV_INFO(net_dev)->real_dev;
+ if (!net_dev->ethtool_ops || !net_dev->ethtool_ops->get_pauseparam) {
rc = -EOPNOTSUPP;
goto out;
}
+ fc->phys_dev = net_dev;
fdev->fd_link_status = TRANS_LINK_DOWN;
if (fcoe_link_ok(fdev))
fdev->fd_link_status = TRANS_LINK_UP;
-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html