net/ethtool: Add support for the ethtool feature to flash firmware image from a speci...
authorAjit Khaparde <ajitk@serverengines.com>
Wed, 2 Sep 2009 17:02:55 +0000 (17:02 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 3 Sep 2009 06:07:39 +0000 (23:07 -0700)
This patch adds support to flash a firmware image to a device using ethtool.
The driver gets the filename of the firmware image and flashes the image
using the request firmware path.

The region "on the chip" to be flashed can be specified by an option.
It is upto the device driver to enumerate the region number passed by ethtool,
to the region to be flashed.

The default behavior is to flash all the regions on the chip.

Signed-off-by: Ajit Khaparde <ajitk@serverengines.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/ethtool.h
net/core/ethtool.c

index 90c4a3616d94eb90c961f3af696193d45d4d5c85..15e4eb713694442a1ed77d5972667ac69543fd8a 100644 (file)
@@ -362,6 +362,18 @@ struct ethtool_rxnfc {
        __u32                           rule_locs[0];
 };
 
+#define ETHTOOL_FLASH_MAX_FILENAME     128
+enum ethtool_flash_op_type {
+       ETHTOOL_FLASH_ALL_REGIONS       = 0,
+};
+
+/* for passing firmware flashing related parameters */
+struct ethtool_flash {
+       __u32   cmd;
+       __u32   region;
+       char    data[ETHTOOL_FLASH_MAX_FILENAME];
+};
+
 #ifdef __KERNEL__
 
 struct net_device;
@@ -489,6 +501,7 @@ struct ethtool_ops {
        int     (*get_stats_count)(struct net_device *);/* use get_sset_count */
        int     (*get_rxnfc)(struct net_device *, struct ethtool_rxnfc *, void *);
        int     (*set_rxnfc)(struct net_device *, struct ethtool_rxnfc *);
+       int     (*flash_device)(struct net_device *, struct ethtool_flash *);
 };
 #endif /* __KERNEL__ */
 
@@ -545,6 +558,7 @@ struct ethtool_ops {
 #define        ETHTOOL_GRXCLSRLALL     0x00000030 /* Get all RX classification rule */
 #define        ETHTOOL_SRXCLSRLDEL     0x00000031 /* Delete RX classification rule */
 #define        ETHTOOL_SRXCLSRLINS     0x00000032 /* Insert RX classification rule */
+#define        ETHTOOL_FLASHDEV        0x00000033 /* Flash firmware to device */
 
 /* compatibility with older code */
 #define SPARC_ETH_GSET         ETHTOOL_GSET
index 44e571111d3a617809a5aa7c51231bcaadbf1008..4c12ddb5f5ee43ab546278ba5527c2e10939824b 100644 (file)
@@ -898,6 +898,19 @@ static int ethtool_set_value(struct net_device *dev, char __user *useraddr,
        return actor(dev, edata.data);
 }
 
+static int ethtool_flash_device(struct net_device *dev, char __user *useraddr)
+{
+       struct ethtool_flash efl;
+
+       if (copy_from_user(&efl, useraddr, sizeof(efl)))
+               return -EFAULT;
+
+       if (!dev->ethtool_ops->flash_device)
+               return -EOPNOTSUPP;
+
+       return dev->ethtool_ops->flash_device(dev, &efl);
+}
+
 /* The main entry point in this file.  Called from net/core/dev.c */
 
 int dev_ethtool(struct net *net, struct ifreq *ifr)
@@ -1111,6 +1124,9 @@ int dev_ethtool(struct net *net, struct ifreq *ifr)
        case ETHTOOL_SGRO:
                rc = ethtool_set_gro(dev, useraddr);
                break;
+       case ETHTOOL_FLASHDEV:
+               rc = ethtool_flash_device(dev, useraddr);
+               break;
        default:
                rc = -EOPNOTSUPP;
        }