gianfar: Use interface name in interrupt name to distinguish the source.
authorDai Haruki <dai.haruki@freescale.com>
Thu, 18 Dec 2008 00:51:32 +0000 (16:51 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 18 Dec 2008 00:51:32 +0000 (16:51 -0800)
Interface name (ex. eth0) is used as the prefix for the interrupt name,
with _rx, _tx, and _er appended to distinguish multiple interrupts on
the same interface.

Signed-off-by: Dai Haruki <dai.haruki@freescale.com>
Signed-off-by: Andy Fleming <afleming@freescale.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/gianfar.c
drivers/net/gianfar.h

index dbbeee372ef82109db98f467b849f4c6e3b1ca10..854f2ae3e56e9433a3ed145174f49f94f96ebf5c 100644 (file)
@@ -304,8 +304,9 @@ static int gfar_probe(struct of_device *ofdev,
        u32 tempval;
        struct net_device *dev = NULL;
        struct gfar_private *priv = NULL;
-       int err = 0;
        DECLARE_MAC_BUF(mac);
+       int err = 0;
+       int len_devname;
 
        /* Create an ethernet device instance */
        dev = alloc_etherdev(sizeof (*priv));
@@ -447,6 +448,23 @@ static int gfar_probe(struct of_device *ofdev,
                goto register_fail;
        }
 
+       /* fill out IRQ number and name fields */
+       len_devname = strlen(dev->name);
+       strncpy(&priv->int_name_tx[0], dev->name, len_devname);
+       if (priv->device_flags & FSL_GIANFAR_DEV_HAS_MULTI_INTR) {
+               strncpy(&priv->int_name_tx[len_devname],
+                       "_tx", sizeof("_tx") + 1);
+
+               strncpy(&priv->int_name_rx[0], dev->name, len_devname);
+               strncpy(&priv->int_name_rx[len_devname],
+                       "_rx", sizeof("_rx") + 1);
+
+               strncpy(&priv->int_name_er[0], dev->name, len_devname);
+               strncpy(&priv->int_name_er[len_devname],
+                       "_er", sizeof("_er") + 1);
+       } else
+               priv->int_name_tx[len_devname] = '\0';
+
        /* Create all the sysfs files */
        gfar_init_sysfs(dev);
 
@@ -1020,7 +1038,7 @@ int startup_gfar(struct net_device *dev)
                /* Install our interrupt handlers for Error,
                 * Transmit, and Receive */
                if (request_irq(priv->interruptError, gfar_error,
-                               0, "enet_error", dev) < 0) {
+                               0, priv->int_name_er, dev) < 0) {
                        if (netif_msg_intr(priv))
                                printk(KERN_ERR "%s: Can't get IRQ %d\n",
                                        dev->name, priv->interruptError);
@@ -1030,7 +1048,7 @@ int startup_gfar(struct net_device *dev)
                }
 
                if (request_irq(priv->interruptTransmit, gfar_transmit,
-                               0, "enet_tx", dev) < 0) {
+                               0, priv->int_name_tx, dev) < 0) {
                        if (netif_msg_intr(priv))
                                printk(KERN_ERR "%s: Can't get IRQ %d\n",
                                        dev->name, priv->interruptTransmit);
@@ -1041,7 +1059,7 @@ int startup_gfar(struct net_device *dev)
                }
 
                if (request_irq(priv->interruptReceive, gfar_receive,
-                               0, "enet_rx", dev) < 0) {
+                               0, priv->int_name_rx, dev) < 0) {
                        if (netif_msg_intr(priv))
                                printk(KERN_ERR "%s: Can't get IRQ %d (receive0)\n",
                                                dev->name, priv->interruptReceive);
@@ -1051,10 +1069,10 @@ int startup_gfar(struct net_device *dev)
                }
        } else {
                if (request_irq(priv->interruptTransmit, gfar_interrupt,
-                               0, "gfar_interrupt", dev) < 0) {
+                               0, priv->int_name_tx, dev) < 0) {
                        if (netif_msg_intr(priv))
                                printk(KERN_ERR "%s: Can't get IRQ %d\n",
-                                       dev->name, priv->interruptError);
+                                       dev->name, priv->interruptTransmit);
 
                        err = -1;
                        goto err_irq_fail;
index 7ef3cc5cabe9fc1ae94f7a92af23345478b94a3b..06bac34c3b52eaaa0d3e8cb0ea143c8177ee697e 100644 (file)
@@ -374,6 +374,8 @@ extern const char gfar_driver_version[];
 #define RXFCB_PERR_MASK                0x000c
 #define RXFCB_PERR_BADL3       0x0008
 
+#define GFAR_INT_NAME_MAX      IFNAMSIZ + 4
+
 struct txbd8
 {
        union {
@@ -796,6 +798,11 @@ struct gfar_private {
        uint32_t msg_enable;
 
        struct work_struct reset_task;
+
+       char int_name_tx[GFAR_INT_NAME_MAX];
+       char int_name_rx[GFAR_INT_NAME_MAX];
+       char int_name_er[GFAR_INT_NAME_MAX];
+
        /* Network Statistics */
        struct gfar_extra_stats extra_stats;
 };