Skip to content

Commit

Permalink
gianfar: Use interface name in interrupt name to distinguish the source.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Dai Haruki authored and David S. Miller committed Dec 18, 2008
1 parent 4669bc9 commit c50a5d9
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 6 deletions.
30 changes: 24 additions & 6 deletions drivers/net/gianfar.c
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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;
Expand Down
7 changes: 7 additions & 0 deletions drivers/net/gianfar.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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;
};
Expand Down

0 comments on commit c50a5d9

Please sign in to comment.