|
|
|
@ -14,7 +14,7 @@ |
|
|
|
|
* (at your option) any later version. |
|
|
|
|
* |
|
|
|
|
* Additional credits: |
|
|
|
|
* This code is taken from John Taylor's Sibyte driver and then
|
|
|
|
|
* This code is taken from John Taylor's Sibyte driver and then |
|
|
|
|
* modified for the AR2313. |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
@ -134,7 +134,7 @@ |
|
|
|
|
#define CRC_LEN 4 |
|
|
|
|
#define RX_OFFSET 2 |
|
|
|
|
|
|
|
|
|
#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) |
|
|
|
|
#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) |
|
|
|
|
#define VLAN_HDR 4 |
|
|
|
|
#else |
|
|
|
|
#define VLAN_HDR 0 |
|
|
|
@ -232,8 +232,8 @@ int __init ar2313_probe(struct platform_device *pdev) |
|
|
|
|
return (-ENXIO); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* When there's only one MAC, PHY regs are typically on ENET0,
|
|
|
|
|
/*
|
|
|
|
|
* When there's only one MAC, PHY regs are typically on ENET0, |
|
|
|
|
* even though the MAC might be on ENET1. |
|
|
|
|
* Needto remap PHY regs separately in this case |
|
|
|
|
*/ |
|
|
|
@ -270,7 +270,7 @@ int __init ar2313_probe(struct platform_device *pdev) |
|
|
|
|
sp->board_idx = BOARD_IDX_STATIC; |
|
|
|
|
|
|
|
|
|
if (ar2313_init(dev)) { |
|
|
|
|
/*
|
|
|
|
|
/*
|
|
|
|
|
* ar2313_init() calls ar2313_init_cleanup() on error. |
|
|
|
|
*/ |
|
|
|
|
kfree(dev); |
|
|
|
@ -295,7 +295,7 @@ int __init ar2313_probe(struct platform_device *pdev) |
|
|
|
|
sp->mii_bus.id = 0; |
|
|
|
|
sp->mii_bus.irq = kmalloc(sizeof(int), GFP_KERNEL); |
|
|
|
|
*sp->mii_bus.irq = PHY_POLL; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mdiobus_register(&sp->mii_bus); |
|
|
|
|
|
|
|
|
|
if (mdiobus_probe(dev) != 0) { |
|
|
|
@ -308,7 +308,7 @@ int __init ar2313_probe(struct platform_device *pdev) |
|
|
|
|
/* start link poll timer */ |
|
|
|
|
ar2313_setup_timer(dev); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -379,9 +379,9 @@ static void printMcList(struct net_device *dev) |
|
|
|
|
*/ |
|
|
|
|
static void ar2313_multicast_list(struct net_device *dev) |
|
|
|
|
{ |
|
|
|
|
/*
|
|
|
|
|
* Always listen to broadcasts and
|
|
|
|
|
* treat IFF bits independently
|
|
|
|
|
/*
|
|
|
|
|
* Always listen to broadcasts and |
|
|
|
|
* treat IFF bits independently |
|
|
|
|
*/ |
|
|
|
|
struct ar2313_private *sp = (struct ar2313_private *) dev->priv; |
|
|
|
|
unsigned int recognise; |
|
|
|
@ -420,7 +420,7 @@ static void rx_tasklet_cleanup(struct net_device *dev) |
|
|
|
|
{ |
|
|
|
|
struct ar2313_private *sp = dev->priv; |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
/*
|
|
|
|
|
* Tasklet may be scheduled. Need to get it removed from the list |
|
|
|
|
* since we're about to free the struct. |
|
|
|
|
*/ |
|
|
|
@ -442,7 +442,7 @@ static int __exit ar2313_remove(struct platform_device *pdev) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Restart the AR2313 ethernet controller.
|
|
|
|
|
* Restart the AR2313 ethernet controller. |
|
|
|
|
*/ |
|
|
|
|
static int ar2313_restart(struct net_device *dev) |
|
|
|
|
{ |
|
|
|
@ -606,7 +606,7 @@ static void ar2313_link_timer_fn(unsigned long data) |
|
|
|
|
// autonegotiated value of half or full duplex.
|
|
|
|
|
ar2313_check_link(dev); |
|
|
|
|
|
|
|
|
|
// Loop faster when we don't have link.
|
|
|
|
|
// Loop faster when we don't have link.
|
|
|
|
|
// This was needed to speed up the AP bootstrap time.
|
|
|
|
|
if (sp->link == 0) { |
|
|
|
|
mod_timer(&sp->link_timer, jiffies + HZ / 2); |
|
|
|
@ -728,7 +728,7 @@ static int ar2313_init(struct net_device *dev) |
|
|
|
|
struct ar2313_private *sp = dev->priv; |
|
|
|
|
int ecode = 0; |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
/*
|
|
|
|
|
* Allocate descriptors |
|
|
|
|
*/ |
|
|
|
|
if (ar2313_allocate_descriptors(dev)) { |
|
|
|
@ -738,7 +738,7 @@ static int ar2313_init(struct net_device *dev) |
|
|
|
|
goto init_error; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
/*
|
|
|
|
|
* Get the memory for the skb rings. |
|
|
|
|
*/ |
|
|
|
|
if (sp->rx_skb == NULL) { |
|
|
|
@ -767,7 +767,7 @@ static int ar2313_init(struct net_device *dev) |
|
|
|
|
} |
|
|
|
|
memset(sp->tx_skb, 0, sizeof(struct sk_buff *) * AR2313_DESCR_ENTRIES); |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
/*
|
|
|
|
|
* Set tx_csm before we start receiving interrupts, otherwise |
|
|
|
|
* the interrupt handler might think it is supposed to process |
|
|
|
|
* tx ints before we are up and running, which may cause a null |
|
|
|
@ -778,23 +778,23 @@ static int ar2313_init(struct net_device *dev) |
|
|
|
|
sp->tx_prd = 0; |
|
|
|
|
sp->tx_csm = 0; |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
/*
|
|
|
|
|
* Zero the stats before starting the interface |
|
|
|
|
*/ |
|
|
|
|
memset(&sp->stats, 0, sizeof(sp->stats)); |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
/*
|
|
|
|
|
* We load the ring here as there seem to be no way to tell the |
|
|
|
|
* firmware to wipe the ring without re-initializing it. |
|
|
|
|
*/ |
|
|
|
|
ar2313_load_rx_ring(dev, RX_RING_SIZE); |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
/*
|
|
|
|
|
* Init hardware |
|
|
|
|
*/ |
|
|
|
|
ar2313_reset_reg(dev); |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
/*
|
|
|
|
|
* Get the IRQ |
|
|
|
|
*/ |
|
|
|
|
ecode = |
|
|
|
@ -852,7 +852,7 @@ static void ar2313_load_rx_ring(struct net_device *dev, int nr_bufs) |
|
|
|
|
// partha: create additional room in the front for tx pkt capture
|
|
|
|
|
skb_reserve(skb, 32); |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
/*
|
|
|
|
|
* Make sure IP header starts on a fresh cache line. |
|
|
|
|
*/ |
|
|
|
|
skb->dev = dev; |
|
|
|
@ -899,7 +899,7 @@ static int ar2313_rx_int(struct net_device *dev) |
|
|
|
|
|
|
|
|
|
idx = sp->cur_rx; |
|
|
|
|
|
|
|
|
|
/* process at most the entire ring and then wait for another interrupt
|
|
|
|
|
/* process at most the entire ring and then wait for another interrupt
|
|
|
|
|
*/ |
|
|
|
|
while (1) { |
|
|
|
|
|
|
|
|
@ -1081,7 +1081,7 @@ static irqreturn_t ar2313_interrupt(int irq, void *dev_id) |
|
|
|
|
unsigned int status, enabled; |
|
|
|
|
|
|
|
|
|
/* clear interrupt */ |
|
|
|
|
/*
|
|
|
|
|
/*
|
|
|
|
|
* Don't clear RI bit if currently disabled. |
|
|
|
|
*/ |
|
|
|
|
status = sp->dma_regs->status; |
|
|
|
@ -1090,7 +1090,7 @@ static irqreturn_t ar2313_interrupt(int irq, void *dev_id) |
|
|
|
|
|
|
|
|
|
if (status & DMA_STATUS_NIS) { |
|
|
|
|
/* normal status */ |
|
|
|
|
/*
|
|
|
|
|
/*
|
|
|
|
|
* Don't schedule rx processing if interrupt |
|
|
|
|
* is already disabled. |
|
|
|
|
*/ |
|
|
|
@ -1178,12 +1178,12 @@ static void ar2313_halt(struct net_device *dev) |
|
|
|
|
static int ar2313_close(struct net_device *dev) |
|
|
|
|
{ |
|
|
|
|
#if 0 |
|
|
|
|
/*
|
|
|
|
|
/*
|
|
|
|
|
* Disable interrupts |
|
|
|
|
*/ |
|
|
|
|
disable_irq(dev->irq); |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
/*
|
|
|
|
|
* Without (or before) releasing irq and stopping hardware, this |
|
|
|
|
* is an absolute non-sense, by the way. It will be reset instantly |
|
|
|
|
* by the first irq. |
|
|
|
@ -1251,7 +1251,7 @@ static int ar2313_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) |
|
|
|
|
struct mii_ioctl_data *data = (struct mii_ioctl_data *) &ifr->ifr_data; |
|
|
|
|
struct ar2313_private *sp = dev->priv; |
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
switch (cmd) { |
|
|
|
|
|
|
|
|
|
case SIOCETHTOOL: |
|
|
|
@ -1271,12 +1271,12 @@ static int ar2313_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) |
|
|
|
|
(ifr->ifr_data, dev->dev_addr, sizeof(dev->dev_addr))) |
|
|
|
|
return -EFAULT; |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case SIOCGMIIPHY: |
|
|
|
|
case SIOCGMIIREG: |
|
|
|
|
case SIOCSMIIREG: |
|
|
|
|
return phy_mii_ioctl(sp->phy_dev, data, cmd); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
default: |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
@ -1314,7 +1314,7 @@ static void ar2313_adjust_link(struct net_device *dev) |
|
|
|
|
#define MII_ADDR(phy, reg) \ |
|
|
|
|
((reg << MII_ADDR_REG_SHIFT) | (phy << MII_ADDR_PHY_SHIFT)) |
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
static int |
|
|
|
|
mdiobus_read(struct mii_bus *bus, int phy_addr, int regnum) |
|
|
|
|
{ |
|
|
|
|
struct net_device *const dev = bus->priv; |
|
|
|
@ -1326,7 +1326,7 @@ mdiobus_read(struct mii_bus *bus, int phy_addr, int regnum) |
|
|
|
|
return (ethernet->mii_data >> MII_DATA_SHIFT); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
static int |
|
|
|
|
mdiobus_write(struct mii_bus *bus, int phy_addr, int regnum, |
|
|
|
|
u16 value) |
|
|
|
|
{ |
|
|
|
|