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

Reply via email to