#include <linux/ioport.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
-#include <linux/gpio.h>
#include "w5100.h"
u16 s0_rx_buf_size;
int irq;
- int link_irq;
- int link_gpio;
struct napi_struct napi;
struct net_device *ndev;
sizeof(info->bus_info));
}
-static u32 w5100_get_link(struct net_device *ndev)
-{
- struct w5100_priv *priv = netdev_priv(ndev);
-
- if (gpio_is_valid(priv->link_gpio))
- return !!gpio_get_value(priv->link_gpio);
-
- return 1;
-}
-
static u32 w5100_get_msglevel(struct net_device *ndev)
{
struct w5100_priv *priv = netdev_priv(ndev);
return IRQ_HANDLED;
}
-static irqreturn_t w5100_detect_link(int irq, void *ndev_instance)
-{
- struct net_device *ndev = ndev_instance;
- struct w5100_priv *priv = netdev_priv(ndev);
-
- if (netif_running(ndev)) {
- if (gpio_get_value(priv->link_gpio) != 0) {
- netif_info(priv, link, ndev, "link is up\n");
- netif_carrier_on(ndev);
- } else {
- netif_info(priv, link, ndev, "link is down\n");
- netif_carrier_off(ndev);
- }
- }
-
- return IRQ_HANDLED;
-}
-
static void w5100_setrx_work(struct work_struct *work)
{
struct w5100_priv *priv = container_of(work, struct w5100_priv,
w5100_hw_start(priv);
napi_enable(&priv->napi);
netif_start_queue(ndev);
- if (!gpio_is_valid(priv->link_gpio) ||
- gpio_get_value(priv->link_gpio) != 0)
- netif_carrier_on(ndev);
return 0;
}
.get_drvinfo = w5100_get_drvinfo,
.get_msglevel = w5100_get_msglevel,
.set_msglevel = w5100_set_msglevel,
- .get_link = w5100_get_link,
.get_regs_len = w5100_get_regs_len,
.get_regs = w5100_get_regs,
};
EXPORT_SYMBOL_GPL(w5100_ops_priv);
int w5100_probe(struct device *dev, const struct w5100_ops *ops,
- int sizeof_ops_priv, const void *mac_addr, int irq,
- int link_gpio)
+ int sizeof_ops_priv, const void *mac_addr, int irq)
{
struct w5100_priv *priv;
struct net_device *ndev;
priv->ndev = ndev;
priv->ops = ops;
priv->irq = irq;
- priv->link_gpio = link_gpio;
ndev->netdev_ops = &w5100_netdev_ops;
ndev->ethtool_ops = &w5100_ethtool_ops;
if (err)
goto err_hw;
- if (gpio_is_valid(priv->link_gpio)) {
- char *link_name = devm_kzalloc(dev, 16, GFP_KERNEL);
-
- if (!link_name) {
- err = -ENOMEM;
- goto err_gpio;
- }
- snprintf(link_name, 16, "%s-link", netdev_name(ndev));
- priv->link_irq = gpio_to_irq(priv->link_gpio);
- if (request_any_context_irq(priv->link_irq, w5100_detect_link,
- IRQF_TRIGGER_RISING |
- IRQF_TRIGGER_FALLING,
- link_name, priv->ndev) < 0)
- priv->link_gpio = -EINVAL;
- }
-
return 0;
-err_gpio:
- free_irq(priv->irq, ndev);
err_hw:
destroy_workqueue(priv->xfer_wq);
err_wq:
w5100_hw_reset(priv);
free_irq(priv->irq, ndev);
- if (gpio_is_valid(priv->link_gpio))
- free_irq(priv->link_irq, ndev);
flush_work(&priv->setrx_work);
flush_work(&priv->restart_work);
w5100_hw_start(priv);
netif_device_attach(ndev);
- if (!gpio_is_valid(priv->link_gpio) ||
- gpio_get_value(priv->link_gpio) != 0)
- netif_carrier_on(ndev);
}
return 0;
}